diff options
author | Guy Harris <guy@alum.mit.edu> | 2015-06-20 15:57:57 -0700 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2015-06-20 23:02:21 +0000 |
commit | 2895d58dc38321a72c82e1bf77d165ef4acbc73a (patch) | |
tree | 1091e87a52bf3c266edeb282f7baa7deea13fbd6 /wiretap/network_instruments.c | |
parent | 77ed0387c6e03d9667a56ab5effca755bac78df2 (diff) |
Call the "802.11 radio information" dissector for radio headers.
Have dissectors of various forms of radio information headers in the
packets fill in a struct ieee_802_11_phdr with radio information as
appropriate, and call the "802.11 radio information" dissector rather
than the raw 802.11 dissector.
This means that the radio information can be found in a
protocol-independent and encapsulation-independent form when you're
looking at the packet; that information can be presented in a form
somewhat easier to read than the raw metadata header format.
It also enables having a single "radio information" tap that allows
statistics to handle all different sorts of radio information
encapsulation.
In addition, it lets us clean up some of the arguments passed to the
common 802.11 dissector routine, by having it pull that information from
the struct ieee_802_11_phdr.
Ensure that the right structure gets passed to that routine, and that
all the appropriate parts of that structure are filled in.
Rename the 802.11 radio protocol to "wlan_radio", rather than just
"radio", as it's 802.11-specific. Give all its fields "wlan_radio."
names rather than "wlan." names.
Change-Id: I78d79afece0ce0cf5fc17293c1e29596413b31c8
Reviewed-on: https://code.wireshark.org/review/8992
Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'wiretap/network_instruments.c')
-rw-r--r-- | wiretap/network_instruments.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/wiretap/network_instruments.c b/wiretap/network_instruments.c index 3d929cd4df..cbfbeb49a6 100644 --- a/wiretap/network_instruments.c +++ b/wiretap/network_instruments.c @@ -97,7 +97,7 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info, gint64 *data_offset); static gboolean observer_seek_read(wtap *wth, gint64 seek_off, struct wtap_pkthdr *phdr, Buffer *buf, int *err, gchar **err_info); -static int read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header, +static int read_packet_header(wtap *wth, FILE_T fh, union wtap_pseudo_header *pseudo_header, packet_entry_header *packet_header, int *err, gchar **err_info); static gboolean process_packet_header(wtap *wth, packet_entry_header *packet_header, struct wtap_pkthdr *phdr, int *err, @@ -254,7 +254,7 @@ static gboolean observer_read(wtap *wth, int *err, gchar **err_info, *data_offset = file_tell(wth->fh); /* process the packet header, including TLVs */ - header_bytes_consumed = read_packet_header(wth->fh, &wth->phdr.pseudo_header, &packet_header, err, + header_bytes_consumed = read_packet_header(wth, wth->fh, &wth->phdr.pseudo_header, &packet_header, err, err_info); if (header_bytes_consumed <= 0) return FALSE; /* EOF or error */ @@ -302,7 +302,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, pseudo_header, &packet_header, err, + offset = read_packet_header(wth, wth->random_fh, pseudo_header, &packet_header, err, err_info); if (offset <= 0) return FALSE; /* EOF or error */ @@ -321,7 +321,7 @@ static gboolean observer_seek_read(wtap *wth, gint64 seek_off, } static int -read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header, +read_packet_header(wtap *wth, FILE_T fh, union wtap_pseudo_header *pseudo_header, packet_entry_header *packet_header, int *err, gchar **err_info) { int offset; @@ -367,6 +367,21 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header, return -1; } + /* initialize the pseudo header */ + switch (wth->file_encap) { + case WTAP_ENCAP_ETHERNET: + /* There is no FCS in the frame */ + pseudo_header->eth.fcs_len = 0; + break; + case WTAP_ENCAP_IEEE_802_11_WITH_RADIO: + pseudo_header->ieee_802_11.fcs_len = 0; + pseudo_header->ieee_802_11.decrypted = FALSE; + pseudo_header->ieee_802_11.datapad = FALSE; + pseudo_header->ieee_802_11.presence_flags = 0; + /* Updated below */ + break; + } + /* process extra information */ for (i = 0; i < packet_header->number_of_information_elements; i++) { /* read the TLV header */ @@ -389,11 +404,10 @@ read_packet_header(FILE_T fh, union wtap_pseudo_header *pseudo_header, err, err_info)) return -1; /* update the pseudo header */ - pseudo_header->ieee_802_11.presence_flags = + pseudo_header->ieee_802_11.presence_flags |= PHDR_802_11_HAS_CHANNEL | PHDR_802_11_HAS_DATA_RATE | PHDR_802_11_HAS_SIGNAL_PERCENT; - pseudo_header->ieee_802_11.fcs_len = 0; /* set decryption status */ pseudo_header->ieee_802_11.decrypted = (wireless_header.conditions & WIRELESS_WEP_SUCCESS) != 0; pseudo_header->ieee_802_11.channel = wireless_header.frequency; @@ -484,17 +498,6 @@ process_packet_header(wtap *wth, packet_entry_header *packet_header, } } - /* update the pseudo header */ - switch (wth->file_encap) { - case WTAP_ENCAP_ETHERNET: - /* There is no FCS in the frame */ - phdr->pseudo_header.eth.fcs_len = 0; - break; - case WTAP_ENCAP_IEEE_802_11_WITH_RADIO: - /* Updated in read_packet_header */ - break; - } - return TRUE; } |