aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--wiretap/network_instruments.c52
-rw-r--r--wiretap/network_instruments.h12
2 files changed, 51 insertions, 13 deletions
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c
index 794ceec5c3..c6b4f9e780 100644
--- a/wiretap/network_instruments.c
+++ b/wiretap/network_instruments.c
@@ -105,8 +105,8 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info,
static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
union wtap_pseudo_header *pseudo_header, guint8 *pd, int length,
int *err, gchar **err_info);
-static int read_packet_header(FILE_T fh, packet_entry_header *packet_header,
- int *err, gchar **err_info);
+static int read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
+ packet_entry_header *packet_header, int *err, gchar **err_info);
static int read_packet_data(FILE_T fh, int offset_to_frame, int current_offset_from_packet_header,
guint8 *pd, int length, int *err, char **err_info);
static gboolean skip_to_next_packet(wtap *wth, int offset_to_next_packet,
@@ -276,7 +276,7 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info,
*data_offset = wth->data_offset;
/* process the packet header, including TLVs */
- bytes_consumed = read_packet_header(wth->fh, &packet_header, err,
+ bytes_consumed = read_packet_header(wth->fh, &wth->pseudo_header, &packet_header, err,
err_info);
if (bytes_consumed <= 0)
return FALSE; /* EOF or error */
@@ -344,6 +344,9 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info,
/* There is no FCS in the frame */
wth->pseudo_header.eth.fcs_len = 0;
break;
+ case WTAP_ENCAP_IEEE_802_11_WITH_RADIO:
+ /* Updated in read_packet_header */
+ break;
}
/* set-up the packet buffer */
@@ -381,7 +384,7 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
return FALSE;
/* process the packet header, including TLVs */
- offset = read_packet_header(wth->random_fh, &packet_header, err,
+ offset = read_packet_header(wth->random_fh, pseudo_header, &packet_header, err,
err_info);
if (offset <= 0)
return FALSE; /* EOF or error */
@@ -393,6 +396,9 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
/* There is no FCS in the frame */
pseudo_header->eth.fcs_len = 0;
break;
+ case WTAP_ENCAP_IEEE_802_11_WITH_RADIO:
+ /* Updated in read_packet_header */
+ break;
}
/* read the frame data */
@@ -404,14 +410,15 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off,
}
static int
-read_packet_header(FILE_T fh, packet_entry_header *packet_header, int *err,
- gchar **err_info)
+read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header,
+ packet_entry_header *packet_header, int *err, gchar **err_info)
{
int offset;
int bytes_read;
guint i;
tlv_header tlvh;
int seek_increment;
+ tlv_wireless_info wireless_header;
offset = 0;
@@ -471,13 +478,32 @@ read_packet_header(FILE_T fh, packet_entry_header *packet_header, int *err,
return -1;
}
- /* skip the TLV data */
- seek_increment = tlvh.length - (int)sizeof tlvh;
- if (seek_increment > 0) {
- if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1)
+ /* process (or skip over) the current TLV */
+ switch (tlvh.type) {
+ case INFORMATION_TYPE_WIRELESS:
+ bytes_read = file_read(&wireless_header, sizeof wireless_header, fh);
+ if (bytes_read != sizeof wireless_header) {
+ *err = file_error(fh, err_info);
+ if(*err == 0)
+ *err = WTAP_ERR_SHORT_READ;
return -1;
- }
- offset += seek_increment;
+ }
+ /* update the pseudo header */
+ pseudo_header->ieee_802_11.fcs_len = 0;
+ pseudo_header->ieee_802_11.channel = wireless_header.frequency;
+ pseudo_header->ieee_802_11.data_rate = wireless_header.rate;
+ pseudo_header->ieee_802_11.signal_level = wireless_header.strengthPercent;
+ offset += bytes_read;
+ break;
+ default:
+ /* skip the TLV data */
+ seek_increment = tlvh.length - (int)sizeof tlvh;
+ if (seek_increment > 0) {
+ if (file_seek(fh, seek_increment, SEEK_CUR, err) == -1)
+ return -1;
+ }
+ offset += seek_increment;
+ }
}
return offset;
@@ -714,7 +740,7 @@ static gint observer_to_wtap_encap(int observer_encap)
case OBSERVER_FIBRE_CHANNEL:
return WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS;
case OBSERVER_WIRELESS_802_11:
- return WTAP_ENCAP_IEEE_802_11;
+ return WTAP_ENCAP_IEEE_802_11_WITH_RADIO;
case OBSERVER_UNDEFINED:
return WTAP_ENCAP_UNKNOWN;
}
diff --git a/wiretap/network_instruments.h b/wiretap/network_instruments.h
index 6abb6d30f3..d3266ffb13 100644
--- a/wiretap/network_instruments.h
+++ b/wiretap/network_instruments.h
@@ -79,12 +79,24 @@ typedef struct tlv_time_info {
(_tlv_time_info).length = GUINT16_TO_LE((_tlv_time_info).length); \
(_tlv_time_info).time_format = GUINT32_FROM_LE((_tlv_time_info).time_format)
+typedef struct tlv_wireless_info {
+ guint8 quality;
+ guint8 signalStrength;
+ guint8 rate;
+ guint8 frequency;
+ guint8 qualityPercent;
+ guint8 strengthPercent;
+ guint8 conditions;
+ guint8 reserved;
+} tlv_wireless_info;
+
/*
* TLV type values.
*/
#define INFORMATION_TYPE_ALIAS_LIST 0x01
#define INFORMATION_TYPE_COMMENT 0x02 /* ASCII text */
#define INFORMATION_TYPE_TIME_INFO 0x04
+#define INFORMATION_TYPE_WIRELESS 0x101
/*
* TVL TIME_INFO values.