diff options
author | Anders Broman <anders.broman@ericsson.com> | 2012-01-28 17:10:50 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2012-01-28 17:10:50 +0000 |
commit | 997b768069228be3f81eedf76ada8c2dba5551d5 (patch) | |
tree | a05bc68182cc31a9f0ec7a72916b53df6fab803c /wiretap/network_instruments.c | |
parent | 20881c49bb607b6ab053f18f2748fcac7ac6d24b (diff) |
From Tom Brezinski:
includes radio data from the capture.
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6746
svn path=/trunk/; revision=40754
Diffstat (limited to 'wiretap/network_instruments.c')
-rw-r--r-- | wiretap/network_instruments.c | 52 |
1 files changed, 39 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; } |