aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2015-06-22 16:07:20 -0700
committerGuy Harris <guy@alum.mit.edu>2015-06-22 23:07:50 +0000
commiteaf62bbf86638625cc9794f635b7ab7c70fba4bb (patch)
tree84fd0912e3d76d716cb1553a6a656ebcf3f85821
parent5ab45709d6137175e1f16651f7474876d6d3e758 (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.c25
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,