diff options
author | Guy Harris <guy@alum.mit.edu> | 2015-06-22 16:07:20 -0700 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2015-06-22 23:07:50 +0000 |
commit | eaf62bbf86638625cc9794f635b7ab7c70fba4bb (patch) | |
tree | 84fd0912e3d76d716cb1553a6a656ebcf3f85821 | |
parent | 5ab45709d6137175e1f16651f7474876d6d3e758 (diff) |
Fix handling of XChannel radiotap field.
Fetch the flags before using them; thanks to Peter Wu for catching that
one.
Fetch and use the frequency and channel.
Have cflags be the variable for the flags in Channel and xcflags be the
variable for the flags in XChannel.
Change-Id: If82f7adb448eef04b769186a90a8722d03a702a3
Reviewed-on: https://code.wireshark.org/review/9038
Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r-- | epan/dissectors/packet-ieee80211-radiotap.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/epan/dissectors/packet-ieee80211-radiotap.c b/epan/dissectors/packet-ieee80211-radiotap.c index 1c9f712220..16af6a0544 100644 --- a/epan/dissectors/packet-ieee80211-radiotap.c +++ b/epan/dissectors/packet-ieee80211-radiotap.c @@ -574,12 +574,13 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) tvbuff_t *next_tvb; guint8 version; guint length; - guint32 flags; + guint16 cflags; guint32 freq; proto_item *rate_ti; gint8 dbm, db; gboolean have_rflags = FALSE; guint8 rflags = 0; + guint32 xcflags; /* backward compat with bit 14 == fcs in header */ proto_item *hdr_fcs_ti = NULL; int hdr_fcs_offset = 0; @@ -952,8 +953,7 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) } case IEEE80211_RADIOTAP_CHANNEL: { - freq = tvb_get_letohs(tvb, offset); - flags = tvb_get_letohs(tvb, offset + 2); + freq = tvb_get_letohs(tvb, offset); if (freq != 0) { /* * XXX - some captures have 0, which is @@ -962,7 +962,8 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) phdr.presence_flags |= PHDR_802_11_HAS_FREQUENCY; phdr.frequency = freq; } - switch (flags & IEEE80211_CHAN_ALLTURBO) { + cflags = tvb_get_letohs(tvb, offset + 2); + switch (cflags & IEEE80211_CHAN_ALLTURBO) { case IEEE80211_CHAN_FHSS: phdr.presence_flags |= PHDR_802_11_HAS_PHY_BAND; @@ -1030,7 +1031,7 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) /* We're already 2-byte aligned. */ proto_tree_add_bitmask(radiotap_tree, tvb, offset + 2, hf_radiotap_channel_flags, ett_radiotap_channel_flags, channel_flags, ENC_LITTLE_ENDIAN); radiotap_info->freq = freq; - radiotap_info->flags = flags; + radiotap_info->flags = cflags; } break; } @@ -1152,7 +1153,8 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) } case IEEE80211_RADIOTAP_XCHANNEL: { - switch (flags & IEEE80211_CHAN_ALLTURBO) { + xcflags = tvb_get_letohl(tvb, offset); + switch (xcflags & IEEE80211_CHAN_ALLTURBO) { case IEEE80211_CHAN_FHSS: phdr.presence_flags |= PHDR_802_11_HAS_PHY_BAND; @@ -1234,6 +1236,17 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) phdr.short_gi = 0; break; } + freq = tvb_get_letohs(tvb, offset + 4); + if (freq != 0) { + /* + * XXX - some captures have 0, which is + * obviously bogus. + */ + phdr.presence_flags |= PHDR_802_11_HAS_FREQUENCY; + phdr.frequency = freq; + } + phdr.presence_flags |= PHDR_802_11_HAS_CHANNEL; + phdr.channel = tvb_get_guint8(tvb, offset + 6); if (tree) { static const int * xchannel_flags[] = { &hf_radiotap_xchannel_flags_turbo, |