summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2015-06-28 12:43:33 -0700
committerGuy Harris <guy@alum.mit.edu>2015-06-28 19:44:07 +0000
commitb9145bc836daafd6cad960b95e9d2144781e7317 (patch)
treeda80f67670fce4a90aca67ddc28272a4d620f0d8
parent8aaf42d2b11b993d54283a5944841813a06881d5 (diff)
downloadwireshark-b9145bc836daafd6cad960b95e9d2144781e7317.tar.gz
"Short preamble" is 802.11[bg]-only, so put it in the PHY-specifc info.
We're already only setting it for 11b and 11g; this makes it a bit cleaner, e.g. we don't need to say "oh, wait, we *don't* have short preamble" for 11n and 11ac. Change-Id: Idcf3e8c93d6a417f0319e4bd33247b98f07b6052 Reviewed-on: https://code.wireshark.org/review/9209 Reviewed-by: Guy Harris <guy@alum.mit.edu>
-rw-r--r--epan/dissectors/packet-ieee80211-radio.c16
-rw-r--r--epan/dissectors/packet-ieee80211-radiotap.c63
-rw-r--r--epan/dissectors/packet-ieee80211-wlancap.c30
-rw-r--r--wiretap/wtap.h82
4 files changed, 125 insertions, 66 deletions
diff --git a/epan/dissectors/packet-ieee80211-radio.c b/epan/dissectors/packet-ieee80211-radio.c
index 94ba5d69f7..0b9f404abf 100644
--- a/epan/dissectors/packet-ieee80211-radio.c
+++ b/epan/dissectors/packet-ieee80211-radio.c
@@ -704,6 +704,13 @@ dissect_wlan_radio (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void
}
break;
+ case PHDR_802_11_PHY_11B:
+ if (phdr->phy_info.info_11b.presence_flags & PHDR_802_11B_HAS_SHORT_PREAMBLE) {
+ proto_tree_add_boolean(radio_tree, hf_wlan_radio_short_preamble, tvb, 0, 0,
+ phdr->phy_info.info_11b.short_preamble);
+ }
+ break;
+
case PHDR_802_11_PHY_11A:
if (phdr->phy_info.info_11a.presence_flags & PHDR_802_11A_HAS_CHANNEL_TYPE) {
proto_tree_add_uint(radio_tree, hf_wlan_radio_11a_channel_type, tvb, 0, 0,
@@ -716,6 +723,10 @@ dissect_wlan_radio (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void
break;
case PHDR_802_11_PHY_11G:
+ if (phdr->phy_info.info_11g.presence_flags & PHDR_802_11G_HAS_SHORT_PREAMBLE) {
+ proto_tree_add_boolean(radio_tree, hf_wlan_radio_short_preamble, tvb, 0, 0,
+ phdr->phy_info.info_11g.short_preamble);
+ }
if (phdr->phy_info.info_11g.presence_flags & PHDR_802_11G_HAS_MODE) {
proto_tree_add_uint(radio_tree, hf_wlan_radio_11g_mode, tvb, 0, 0,
phdr->phy_info.info_11g.mode);
@@ -922,11 +933,6 @@ dissect_wlan_radio (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void
phdr->frequency);
}
- if (phdr->presence_flags & PHDR_802_11_HAS_SHORT_PREAMBLE) {
- proto_tree_add_boolean(radio_tree, hf_wlan_radio_short_preamble, tvb, 0, 0,
- phdr->short_preamble);
- }
-
if (phdr->presence_flags & PHDR_802_11_HAS_SIGNAL_PERCENT) {
col_add_fstr(pinfo->cinfo, COL_RSSI, "%u%%", phdr->signal_percent);
proto_tree_add_uint_format_value(radio_tree, hf_wlan_radio_signal_percent, tvb, 0, 0,
diff --git a/epan/dissectors/packet-ieee80211-radiotap.c b/epan/dissectors/packet-ieee80211-radiotap.c
index 58452aae13..0629cab41d 100644
--- a/epan/dissectors/packet-ieee80211-radiotap.c
+++ b/epan/dissectors/packet-ieee80211-radiotap.c
@@ -963,30 +963,31 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
case IEEE80211_CHAN_B:
phdr.phy = PHDR_802_11_PHY_11B;
+ phdr.phy_info.info_11b.presence_flags = 0;
if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ phdr.phy_info.info_11b.presence_flags |= PHDR_802_11B_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11b.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
}
break;
case IEEE80211_CHAN_PUREG:
phdr.phy = PHDR_802_11_PHY_11G;
- if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
- }
phdr.phy_info.info_11g.presence_flags = PHDR_802_11G_HAS_MODE;
phdr.phy_info.info_11g.mode = PHDR_802_11G_MODE_NORMAL;
+ if (have_rflags) {
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ }
break;
case IEEE80211_CHAN_G:
phdr.phy = PHDR_802_11_PHY_11G;
- if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
- }
phdr.phy_info.info_11g.presence_flags = PHDR_802_11G_HAS_MODE;
phdr.phy_info.info_11g.mode = PHDR_802_11G_MODE_NORMAL;
+ if (have_rflags) {
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ }
break;
case IEEE80211_CHAN_108A:
@@ -998,12 +999,12 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
case IEEE80211_CHAN_108PUREG:
phdr.phy = PHDR_802_11_PHY_11G;
- if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
- }
phdr.phy_info.info_11g.presence_flags = PHDR_802_11G_HAS_MODE;
phdr.phy_info.info_11g.mode = PHDR_802_11G_MODE_SUPER_G;
+ if (have_rflags) {
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ }
break;
}
if (tree) {
@@ -1200,30 +1201,31 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
case IEEE80211_CHAN_B:
phdr.phy = PHDR_802_11_PHY_11B;
+ phdr.phy_info.info_11b.presence_flags = 0;
if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ phdr.phy_info.info_11b.presence_flags |= PHDR_802_11B_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11b.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
}
break;
case IEEE80211_CHAN_PUREG:
phdr.phy = PHDR_802_11_PHY_11G;
- if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
- }
phdr.phy_info.info_11g.presence_flags = PHDR_802_11G_HAS_MODE;
phdr.phy_info.info_11g.mode = PHDR_802_11G_MODE_NORMAL;
+ if (have_rflags) {
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ }
break;
case IEEE80211_CHAN_G:
phdr.phy = PHDR_802_11_PHY_11G;
- if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
- }
phdr.phy_info.info_11g.presence_flags = PHDR_802_11G_HAS_MODE;
phdr.phy_info.info_11g.mode = PHDR_802_11G_MODE_NORMAL;
+ if (have_rflags) {
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ }
break;
case IEEE80211_CHAN_108A:
@@ -1235,12 +1237,12 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
case IEEE80211_CHAN_108PUREG:
phdr.phy = PHDR_802_11_PHY_11G;
- if (have_rflags) {
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
- }
phdr.phy_info.info_11g.presence_flags = PHDR_802_11G_HAS_MODE;
phdr.phy_info.info_11g.mode = PHDR_802_11G_MODE_SUPER_G;
+ if (have_rflags) {
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = (rflags & IEEE80211_RADIOTAP_F_SHORTPRE) != 0;
+ }
break;
case IEEE80211_CHAN_ST:
@@ -1256,8 +1258,6 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
case IEEE80211_CHAN_G|IEEE80211_CHAN_HT40U:
case IEEE80211_CHAN_G|IEEE80211_CHAN_HT40D:
phdr.phy = PHDR_802_11_PHY_11N;
- /* 11n only has "short preamble" in 11b/11g mode */
- phdr.presence_flags &= ~PHDR_802_11_HAS_SHORT_PREAMBLE;
phdr.phy_info.info_11n.presence_flags = 0;
/*
@@ -1348,8 +1348,6 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
*/
if (mcs_known != 0) {
phdr.phy = PHDR_802_11_PHY_11N;
- /* 11n only has "short preamble" in 11b/11g mode */
- phdr.presence_flags &= ~PHDR_802_11_HAS_SHORT_PREAMBLE;
phdr.phy_info.info_11n.presence_flags = 0;
}
@@ -1548,7 +1546,6 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
*/
if (known != 0) {
phdr.phy = PHDR_802_11_PHY_11AC;
- phdr.presence_flags &= ~PHDR_802_11_HAS_SHORT_PREAMBLE;
phdr.phy_info.info_11ac.presence_flags = 0;
}
vht_flags = tvb_get_guint8(tvb, offset + 2);
diff --git a/epan/dissectors/packet-ieee80211-wlancap.c b/epan/dissectors/packet-ieee80211-wlancap.c
index 3004c0fdac..fc348b46f3 100644
--- a/epan/dissectors/packet-ieee80211-wlancap.c
+++ b/epan/dissectors/packet-ieee80211-wlancap.c
@@ -614,11 +614,19 @@ dissect_wlancap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
case 1:
/*
* Short preamble.
- * We assume this is present only for PHYs that support variable
- * preamble lengths.
*/
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = TRUE;
+ switch (phdr.phy) {
+
+ case PHDR_802_11_PHY_11B:
+ phdr.phy_info.info_11b.presence_flags |= PHDR_802_11B_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11b.short_preamble = TRUE;
+ break;
+
+ case PHDR_802_11_PHY_11G:
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = TRUE;
+ break;
+ }
break;
case 2:
@@ -627,8 +635,18 @@ dissect_wlancap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* We assume this is present only for PHYs that support variable
* preamble lengths.
*/
- phdr.presence_flags |= PHDR_802_11_HAS_SHORT_PREAMBLE;
- phdr.short_preamble = FALSE;
+ switch (phdr.phy) {
+
+ case PHDR_802_11_PHY_11B:
+ phdr.phy_info.info_11b.presence_flags |= PHDR_802_11B_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11b.short_preamble = FALSE;
+ break;
+
+ case PHDR_802_11_PHY_11G:
+ phdr.phy_info.info_11g.presence_flags |= PHDR_802_11G_HAS_SHORT_PREAMBLE;
+ phdr.phy_info.info_11g.short_preamble = FALSE;
+ break;
+ }
break;
default:
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index a8402d8a05..76a3921256 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -571,7 +571,11 @@ struct p2p_phdr {
/*
* PHY-specific information.
*/
-struct ieee_802_11_fhss { /* 802.11 legacy FHSS */
+
+/*
+ * 802.11 legacy FHSS.
+ */
+struct ieee_802_11_fhss {
guint32 presence_flags; /* Which of this information is present? */
guint8 hop_set; /* Hop set */
guint8 hop_pattern; /* Hop pattern */
@@ -579,24 +583,43 @@ struct ieee_802_11_fhss { /* 802.11 legacy FHSS */
};
/*
- * Presence flags for legacy FHSS.
+ * Presence flags.
*/
#define PHDR_802_11_FHSS_HAS_HOP_SET 0x0000001
#define PHDR_802_11_FHSS_HAS_HOP_PATTERN 0x0000002
#define PHDR_802_11_FHSS_HAS_HOP_INDEX 0x0000004
/*
- * Presence flags for 802.11a.
+ * 802.11b.
*/
-#define PHDR_802_11A_HAS_CHANNEL_TYPE 0x0000001 /* Normal, half-clocked, quarter-clocked */
-#define PHDR_802_11A_HAS_TURBO_TYPE 0x0000002 /* Normal, turbo, "static turbo" */
+struct ieee_802_11b {
+ guint32 presence_flags; /* Which of this information is present? */
+ gboolean short_preamble; /* Short preamble */
+};
-struct ieee_802_11a { /* 802.11a */
+/*
+ * Presence flags.
+ */
+#define PHDR_802_11B_HAS_SHORT_PREAMBLE 0x0000001 /* Short preamble */
+
+/*
+ * 802.11a.
+ */
+struct ieee_802_11a {
guint32 presence_flags; /* Which of this information is present? */
guint channel_type:2;
guint turbo_type:2;
};
+/*
+ * Presence flags.
+ */
+#define PHDR_802_11A_HAS_CHANNEL_TYPE 0x0000001 /* Normal, half-clocked, quarter-clocked */
+#define PHDR_802_11A_HAS_TURBO_TYPE 0x0000002 /* Normal, turbo, "static turbo" */
+
+/*
+ * Channel type values.
+ */
#define PHDR_802_11A_CHANNEL_TYPE_NORMAL 0
#define PHDR_802_11A_CHANNEL_TYPE_HALF_CLOCKED 1
#define PHDR_802_11A_CHANNEL_TYPE_QUARTER_CLOCKED 2
@@ -614,20 +637,31 @@ struct ieee_802_11a { /* 802.11a */
#define PHDR_802_11A_TURBO_TYPE_DYNAMIC_TURBO 2
#define PHDR_802_11A_TURBO_TYPE_STATIC_TURBO 3
-struct ieee_802_11g { /* 802.11g */
+/*
+ * 802.11g.
+ */
+struct ieee_802_11g {
guint32 presence_flags; /* Which of this information is present? */
+ gboolean short_preamble; /* Short preamble */
guint32 mode; /* Various proprietary extensions */
};
/*
- * Presence flags for 802.11g.
+ * Presence flags.
*/
-#define PHDR_802_11G_HAS_MODE 0x0000001 /* Proprietary extensions */
+#define PHDR_802_11G_HAS_SHORT_PREAMBLE 0x0000001 /* Short preamble */
+#define PHDR_802_11G_HAS_MODE 0x0000002 /* Proprietary extensions */
+/*
+ * Mode values.
+ */
#define PHDR_802_11G_MODE_NORMAL 0
#define PHDR_802_11G_MODE_SUPER_G 1 /* Atheros Super G */
-struct ieee_802_11n { /* 802.11n */
+/*
+ * 802.11n.
+ */
+struct ieee_802_11n {
guint32 presence_flags; /* Which of this information is present? */
guint16 mcs_index; /* MCS index */
guint bandwidth; /* Bandwidth = 20 MHz, 40 MHz, etc. */
@@ -639,7 +673,7 @@ struct ieee_802_11n { /* 802.11n */
};
/*
- * Presence flags for 802.11n.
+ * Presence flags.
*/
#define PHDR_802_11N_HAS_MCS_INDEX 0x00000001 /* mcs */
#define PHDR_802_11N_HAS_BANDWIDTH 0x00000002 /* bandwidth */
@@ -649,7 +683,9 @@ struct ieee_802_11n { /* 802.11n */
#define PHDR_802_11N_HAS_STBC_STREAMS 0x00000020 /* stbc_streams */
#define PHDR_802_11N_HAS_NESS 0x00000040 /* ness */
-/* Used for both 11n and 11ac */
+/*
+ * Bandwidth values; used for both 11n and 11ac.
+ */
#define PHDR_802_11_BANDWIDTH_20_MHZ 0 /* 20 MHz */
#define PHDR_802_11_BANDWIDTH_40_MHZ 1 /* 40 MHz */
#define PHDR_802_11_BANDWIDTH_20_20L 2 /* 20 + 20L, 40 MHz */
@@ -677,7 +713,10 @@ struct ieee_802_11n { /* 802.11n */
#define PHDR_802_11_BANDWIDTH_20UUL 24 /* ???, 160 MHz */
#define PHDR_802_11_BANDWIDTH_20UUU 25 /* ???, 160 MHz */
-struct ieee_802_11ac { /* 802.11ac */
+/*
+ * 802.11ac.
+ */
+struct ieee_802_11ac {
guint32 presence_flags; /* Which of this information is present? */
guint stbc:1; /* 1 if all spatial streams have STBC */
guint txop_ps_not_allowed:1;
@@ -694,7 +733,7 @@ struct ieee_802_11ac { /* 802.11ac */
};
/*
- * Presence flags for 802.11ac.
+ * Presence flags.
*/
#define PHDR_802_11AC_HAS_STBC 0x00000001 /* stbc */
#define PHDR_802_11AC_HAS_TXOP_PS_NOT_ALLOWED 0x00000002 /* txop_ps_not_allowed */
@@ -713,6 +752,7 @@ struct ieee_802_11_phdr {
guint phy; /* PHY type */
union {
struct ieee_802_11_fhss info_11_fhss;
+ struct ieee_802_11b info_11b;
struct ieee_802_11a info_11a;
struct ieee_802_11g info_11g;
struct ieee_802_11n info_11n;
@@ -721,7 +761,6 @@ struct ieee_802_11_phdr {
guint32 presence_flags; /* Flags indicating presence of fields below */
guint16 channel; /* Channel number */
guint32 frequency; /* Channel center frequency */
- gboolean short_preamble; /* Short preamble */
guint16 data_rate; /* Data rate, in .5 Mb/s units */
guint8 signal_percent; /* Signal level, as a percentage */
guint8 noise_percent; /* Noise level, as a percentage */
@@ -735,13 +774,12 @@ struct ieee_802_11_phdr {
*/
#define PHDR_802_11_HAS_CHANNEL 0x00000001 /* channel */
#define PHDR_802_11_HAS_FREQUENCY 0x00000002 /* frequency */
-#define PHDR_802_11_HAS_SHORT_PREAMBLE 0x00000004 /* short_preamble */
-#define PHDR_802_11_HAS_DATA_RATE 0x00000008 /* data_rate */
-#define PHDR_802_11_HAS_SIGNAL_PERCENT 0x00000010 /* signal_percent */
-#define PHDR_802_11_HAS_NOISE_PERCENT 0x00000020 /* noise_percent */
-#define PHDR_802_11_HAS_SIGNAL_DBM 0x00000040 /* signal_dbm */
-#define PHDR_802_11_HAS_NOISE_DBM 0x00000080 /* noise_dbm */
-#define PHDR_802_11_HAS_TSF_TIMESTAMP 0x00000100 /* tsf_timestamp */
+#define PHDR_802_11_HAS_DATA_RATE 0x00000004 /* data_rate */
+#define PHDR_802_11_HAS_SIGNAL_PERCENT 0x00000008 /* signal_percent */
+#define PHDR_802_11_HAS_NOISE_PERCENT 0x00000010 /* noise_percent */
+#define PHDR_802_11_HAS_SIGNAL_DBM 0x00000020 /* signal_dbm */
+#define PHDR_802_11_HAS_NOISE_DBM 0x00000040 /* noise_dbm */
+#define PHDR_802_11_HAS_TSF_TIMESTAMP 0x00000080 /* tsf_timestamp */
/* Packet "pseudo-header" for the output from CoSine L2 debug output. */