aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-ieee80211-radiotap-defs.h27
-rw-r--r--epan/dissectors/packet-ieee80211-radiotap-iter.c3
-rw-r--r--epan/dissectors/packet-ieee80211-radiotap.c353
3 files changed, 380 insertions, 3 deletions
diff --git a/epan/dissectors/packet-ieee80211-radiotap-defs.h b/epan/dissectors/packet-ieee80211-radiotap-defs.h
index 0145d259a3..54ac761767 100644
--- a/epan/dissectors/packet-ieee80211-radiotap-defs.h
+++ b/epan/dissectors/packet-ieee80211-radiotap-defs.h
@@ -163,6 +163,8 @@ struct ieee80211_radiotap_header {
*
* IEEE80211_RADIOTAP_HE u16, u16, u16, u16, u16, u16 unitless
*
+ * IEEE80211_RADIOTAP_HE_MU U16, U16, u8[4] unitless
+ *
* Contains some information for HE frames.
* NOTE: this is a suggested field, not an assigned field, so
* the type value and format of this field is subject to change,
@@ -194,6 +196,7 @@ enum ieee80211_radiotap_type {
IEEE80211_RADIOTAP_VHT = 21,
IEEE80211_RADIOTAP_TIMESTAMP = 22,
IEEE80211_RADIOTAP_HE = 23,
+ IEEE80211_RADIOTAP_HE_MU = 24,
/* valid in every it_present bitmap, even vendor namespaces */
IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29,
@@ -203,7 +206,7 @@ enum ieee80211_radiotap_type {
/* not (yet) defined Radiotap present flag */
/* Bit 24 to 28 are not defined (in binary : 0001 1111 0000 0000 0000 0000 0000 0000 */
-#define IEEE80211_RADIOTAP_NOTDEFINED 0x1F000000
+#define IEEE80211_RADIOTAP_NOTDEFINED 0x1E000000
/* Channel flags. */
/* 0x00000001 through 0x00000008 undefined (reserved?) */
@@ -431,6 +434,28 @@ enum ieee80211_radiotap_type {
#define IEEE80211_RADIOTAP_HE_TXOP_VALUE_MASK 0x7F00
#define IEEE80211_RADIOTAP_HE_MIDAMBLE_PERIODICITY 0x8000
+/* For IEEE80211_RADIOTAP_HE_MU */
+#define IEEE80211_RADIOTAP_HE_MU_SIG_B_MCS_MASK 0x000F
+#define IEEE80211_RADIOTAP_HE_MU_SIG_B_MCS_KNOWN 0x0010
+#define IEEE80211_RADIOTAP_HE_MU_SIG_B_DCM 0x0020
+#define IEEE80211_RADIOTAP_HE_MU_SIG_B_DCM_KNOWN 0x0040
+#define IEEE80211_RADIOTAP_HE_MU_RESERVED_F1_B7 0x0080
+#define IEEE80211_RADIOTAP_HE_MU_RU_0_KNOWN 0x0100
+#define IEEE80211_RADIOTAP_HE_MU_RU_1_KNOWN 0x0200
+#define IEEE80211_RADIOTAP_HE_MU_RU_2_KNOWN 0x0400
+#define IEEE80211_RADIOTAP_HE_MU_RU_3_KNOWN 0x0800
+#define IEEE80211_RADIOTAP_HE_MU_CENTER_26_TONE_RU_BIT_KNOWN 0x1000
+#define IEEE80211_RADIOTAP_HE_MU_CENTER_26_TONE_RU_VALUE 0x2000
+#define IEEE80211_RADIOTAP_HE_MU_SIG_B_COMPRESSION_KNOWN 0x4000
+#define IEEE80211_RADIOTAP_HE_MU_SYMBOL_CNT_OR_USER_CNT_KNOWN 0x8000
+#define IEEE80211_RADIOTAP_HE_MU_BW_FROM_BW_IN_SIG_A_MASK 0x0003
+#define IEEE80211_RADIOTAP_HE_MU_BW_FROM_BW_IN_SIG_A_KNOWN 0x0004
+#define IEEE80211_RADIOTAP_HE_MU_SIG_B_COMPRESSION_FROM_SIG_A 0x0008
+#define IEEE80211_RADIOTAP_HE_MU_SYMBOL_CNT_OR_USER_CNT 0x00F0
+#define IEEE80211_RADIOTAP_HE_MU_PREAMBLE_PUNCTURING_MASK 0x0300
+#define IEEE80211_RADIOTAP_HE_MU_PREAMBLE_PUNCTURING_KNOWN 0x0400
+#define IEEE80211_RADIOTAP_HE_MU_RESERVED_F2_B11_B15 0xF800
+
#define IEEE80211_RADIOTAP_TS_FLG_32BIT 0x01
#define IEEE80211_RADIOTAP_TS_FLG_ACCURACY 0x02
diff --git a/epan/dissectors/packet-ieee80211-radiotap-iter.c b/epan/dissectors/packet-ieee80211-radiotap-iter.c
index 3652ece39a..56ca297434 100644
--- a/epan/dissectors/packet-ieee80211-radiotap-iter.c
+++ b/epan/dissectors/packet-ieee80211-radiotap-iter.c
@@ -47,7 +47,8 @@ static const struct radiotap_align_size rtap_namespace_sizes[] = {
/* [IEEE80211_RADIOTAP_AMPDU_STATUS] = 20 */ { 4, 8 },
/* [IEEE80211_RADIOTAP_VHT] = 21 */ { 2, 12 },
/* [IEEE80211_RADIOTAP_TIMESTAMP] = 22 */ { 8, 12 },
- /* [IEEE80211_RADIOTAP_HE] = 23 */ { 2, 12 }
+ /* [IEEE80211_RADIOTAP_HE] = 23 */ { 2, 12 },
+ /* [IEEE80211_RADIOTAP_HE_MU] = 24 */ { 2, 8 },
/*
* add more here as they are defined in
diff --git a/epan/dissectors/packet-ieee80211-radiotap.c b/epan/dissectors/packet-ieee80211-radiotap.c
index 3a979e238b..716e9cdb92 100644
--- a/epan/dissectors/packet-ieee80211-radiotap.c
+++ b/epan/dissectors/packet-ieee80211-radiotap.c
@@ -178,6 +178,7 @@ static int hf_radiotap_present_ampdu = -1;
static int hf_radiotap_present_vht = -1;
static int hf_radiotap_present_timestamp = -1;
static int hf_radiotap_present_he = -1;
+static int hf_radiotap_present_he_mu = -1;
static int hf_radiotap_present_reserved = -1;
static int hf_radiotap_present_rtap_ns = -1;
static int hf_radiotap_present_vendor_ns = -1;
@@ -282,6 +283,40 @@ static int hf_radiotap_he_info_data_3 = -1;
static int hf_radiotap_he_info_data_4 = -1;
static int hf_radiotap_he_info_data_5 = -1;
static int hf_radiotap_he_info_data_6 = -1;
+static int hf_radiotap_he_mu_sig_b_mcs = -1;
+static int hf_radiotap_he_mu_sig_b_mcs_unknown = -1;
+static int hf_radiotap_he_mu_sig_b_mcs_known = -1;
+static int hf_radiotap_he_mu_sig_b_dcm = -1;
+static int hf_radiotap_he_mu_sig_b_dcm_unknown = -1;
+static int hf_radiotap_he_mu_sig_b_dcm_known = -1;
+static int hf_radiotap_he_mu_reserved_f1_b7 = -1;
+static int hf_radiotap_he_mu_ru_0_known = -1;
+static int hf_radiotap_he_mu_ru_1_known = -1;
+static int hf_radiotap_he_mu_ru_2_known = -1;
+static int hf_radiotap_he_mu_ru_3_known = -1;
+static int hf_radiotap_he_mu_center_26_tone_ru_bit_known = -1;
+static int hf_radiotap_he_mu_center_26_tone_ru_value = -1;
+static int hf_radiotap_he_mu_sig_b_compression_known = -1;
+static int hf_radiotap_he_mu_sig_b_syms_mu_mimo_users_known = -1;
+static int hf_radiotap_he_mu_sig_b_syms_mu_mimo_users_unknown = -1;
+static int hf_radiotap_he_mu_info_flags_1 = -1;
+static int hf_radiotap_he_mu_bw_from_bw_in_sig_a = -1;
+static int hf_radiotap_he_mu_bw_from_bw_in_sig_a_unknown = -1;
+static int hf_radiotap_he_mu_bw_from_bw_in_sig_a_known = -1;
+static int hf_radiotap_he_mu_sig_b_compression_from_sig_a = -1;
+static int hf_radiotap_he_mu_sig_b_syms_mu_mimo_users = -1;
+static int hf_radiotap_he_mu_preamble_puncturing = -1;
+static int hf_radiotap_he_mu_preamble_puncturing_known = -1;
+static int hf_radiotap_he_mu_reserved_f2_b11_b15 = -1;
+static int hf_radiotap_he_mu_info_flags_2 = -1;
+static int hf_radiotap_he_mu_ru_0 = -1;
+static int hf_radiotap_he_mu_ru_0_unknown = -1;
+static int hf_radiotap_he_mu_ru_1 = -1;
+static int hf_radiotap_he_mu_ru_1_unknown = -1;
+static int hf_radiotap_he_mu_ru_2 = -1;
+static int hf_radiotap_he_mu_ru_2_unknown = -1;
+static int hf_radiotap_he_mu_ru_3 = -1;
+static int hf_radiotap_he_mu_ru_3_unknown = -1;
static gint ett_radiotap = -1;
static gint ett_radiotap_present = -1;
@@ -307,6 +342,9 @@ static gint ett_radiotap_he_info_data_3 = -1;
static gint ett_radiotap_he_info_data_4 = -1;
static gint ett_radiotap_he_info_data_5 = -1;
static gint ett_radiotap_he_info_data_6 = -1;
+static gint ett_radiotap_he_mu_info = -1;
+static gint ett_radiotap_he_mu_info_flags_1 = -1;
+static gint ett_radiotap_he_mu_info_flags_2 = -1;
static expert_field ei_radiotap_data_past_header = EI_INIT;
static expert_field ei_radiotap_present_reserved = EI_INIT;
@@ -1112,6 +1150,128 @@ dissect_radiotap_he_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree
data6_headers, ENC_LITTLE_ENDIAN);
}
+static const int *flags1_headers[] = {
+ &hf_radiotap_he_mu_sig_b_mcs,
+ &hf_radiotap_he_mu_sig_b_mcs_known,
+ &hf_radiotap_he_mu_sig_b_dcm,
+ &hf_radiotap_he_mu_sig_b_dcm_known,
+ &hf_radiotap_he_mu_reserved_f1_b7,
+ &hf_radiotap_he_mu_ru_0_known,
+ &hf_radiotap_he_mu_ru_1_known,
+ &hf_radiotap_he_mu_ru_2_known,
+ &hf_radiotap_he_mu_ru_3_known,
+ &hf_radiotap_he_mu_center_26_tone_ru_bit_known,
+ &hf_radiotap_he_mu_center_26_tone_ru_value,
+ &hf_radiotap_he_mu_sig_b_compression_known,
+ &hf_radiotap_he_mu_sig_b_syms_mu_mimo_users_known,
+ NULL
+};
+
+static const int *flags2_headers[] = {
+ &hf_radiotap_he_mu_bw_from_bw_in_sig_a,
+ &hf_radiotap_he_mu_bw_from_bw_in_sig_a_known,
+ &hf_radiotap_he_mu_sig_b_compression_from_sig_a,
+ &hf_radiotap_he_mu_sig_b_syms_mu_mimo_users,
+ &hf_radiotap_he_mu_preamble_puncturing,
+ &hf_radiotap_he_mu_preamble_puncturing_known,
+ &hf_radiotap_he_mu_reserved_f2_b11_b15,
+ NULL
+};
+
+/*
+ * NOTE: this is a suggested field, not a defined field, and its bit
+ * assignment and format are subject to change, although an experimental
+ * Linux patch may use bit 24 and the current format on radiotap.org.
+ */
+static void
+he_sig_b_symbols_custom(gchar *result, guint32 value)
+{
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%d", value+1);
+}
+
+static void
+dissect_radiotap_he_mu_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset)
+{
+ proto_tree *he_mu_info_tree = NULL;
+ guint16 flags1 = tvb_get_letohs(tvb, offset);
+ gboolean sig_b_mcs_known = FALSE;
+ gboolean sig_b_dcm_known = FALSE;
+ gboolean mu_ru_0_known = FALSE;
+ gboolean mu_ru_1_known = FALSE;
+ gboolean mu_ru_2_known = FALSE;
+ gboolean mu_ru_3_known = FALSE;
+ gboolean mu_symbol_cnt_or_user_cnt_known = FALSE;
+ guint16 flags2;
+ gboolean bw_from_bw_sig_a_known = FALSE;
+
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_SIG_B_MCS_KNOWN)
+ sig_b_mcs_known = TRUE;
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_SIG_B_DCM_KNOWN)
+ sig_b_dcm_known = TRUE;
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_RU_0_KNOWN)
+ mu_ru_0_known = TRUE;
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_RU_1_KNOWN)
+ mu_ru_1_known = TRUE;
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_RU_2_KNOWN)
+ mu_ru_2_known = TRUE;
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_RU_3_KNOWN)
+ mu_ru_3_known = TRUE;
+ if (flags1 & IEEE80211_RADIOTAP_HE_MU_SYMBOL_CNT_OR_USER_CNT_KNOWN)
+ mu_symbol_cnt_or_user_cnt_known = TRUE;
+
+ if (!sig_b_mcs_known)
+ flags1_headers[0] = &hf_radiotap_he_mu_sig_b_mcs_unknown;
+ if (!sig_b_dcm_known)
+ flags1_headers[2] = &hf_radiotap_he_mu_sig_b_dcm_unknown;
+
+ he_mu_info_tree = proto_tree_add_subtree(tree, tvb, offset, 8,
+ ett_radiotap_he_mu_info, NULL, "HE-MU information");
+
+ proto_tree_add_bitmask(he_mu_info_tree, tvb, offset,
+ hf_radiotap_he_mu_info_flags_1, ett_radiotap_he_mu_info_flags_1,
+ flags1_headers, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ flags2 = tvb_get_letohs(tvb, offset);
+ if (flags2 & IEEE80211_RADIOTAP_HE_MU_BW_FROM_BW_IN_SIG_A_KNOWN)
+ bw_from_bw_sig_a_known = TRUE;
+
+ if (!bw_from_bw_sig_a_known)
+ flags2_headers[0] = &hf_radiotap_he_mu_bw_from_bw_in_sig_a_unknown;
+ if (!mu_symbol_cnt_or_user_cnt_known)
+ flags2_headers[3] = &hf_radiotap_he_mu_sig_b_syms_mu_mimo_users_unknown;
+
+ proto_tree_add_bitmask(he_mu_info_tree, tvb, offset,
+ hf_radiotap_he_mu_info_flags_2, ett_radiotap_he_mu_info_flags_2,
+ flags2_headers, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(he_mu_info_tree,
+ mu_ru_0_known ? hf_radiotap_he_mu_ru_0 :
+ hf_radiotap_he_mu_ru_0_unknown,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(he_mu_info_tree,
+ mu_ru_1_known ? hf_radiotap_he_mu_ru_1 :
+ hf_radiotap_he_mu_ru_1_unknown,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(he_mu_info_tree,
+ mu_ru_2_known ? hf_radiotap_he_mu_ru_2 :
+ hf_radiotap_he_mu_ru_2_unknown,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(he_mu_info_tree,
+ mu_ru_3_known ? hf_radiotap_he_mu_ru_3 :
+ hf_radiotap_he_mu_ru_3_unknown,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+}
+
static void
dissect_radiotap_tsft(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
int offset, struct _radiotap_info *radiotap_info,
@@ -1814,6 +1974,9 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* u
proto_tree_add_item(present_word_tree,
hf_radiotap_present_he, tvb,
offset + 4, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(present_word_tree,
+ hf_radiotap_present_he_mu, tvb,
+ offset + 4, 4, ENC_LITTLE_ENDIAN);
ti = proto_tree_add_item(present_word_tree,
hf_radiotap_present_reserved, tvb,
@@ -2406,6 +2569,9 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* u
case IEEE80211_RADIOTAP_HE:
dissect_radiotap_he_info(tvb, pinfo, radiotap_tree, offset);
break;
+ case IEEE80211_RADIOTAP_HE_MU:
+ dissect_radiotap_he_mu_info(tvb, pinfo, radiotap_tree, offset);
+ break;
}
}
@@ -2608,7 +2774,12 @@ void proto_register_radiotap(void)
{&hf_radiotap_present_he,
{"HE information", "radiotap.present.he",
FT_BOOLEAN, 32, TFS(&tfs_present_absent), RADIOTAP_MASK(HE),
- "Specifies is the HE field is present", HFILL}},
+ "Specifies if the HE field is present", HFILL}},
+
+ {&hf_radiotap_present_he_mu,
+ {"HE-MU information", "radiotap.present.he_mu",
+ FT_BOOLEAN, 32, TFS(&tfs_present_absent), RADIOTAP_MASK(HE_MU),
+ "Specifies if the HE field is present", HFILL}},
{&hf_radiotap_present_reserved,
{"Reserved", "radiotap.present.reserved",
@@ -3769,6 +3940,183 @@ void proto_register_radiotap(void)
FT_UINT16, BASE_HEX, NULL, 0x0,
"Data 1 of the HE Info field", HFILL}},
+ {&hf_radiotap_he_mu_sig_b_mcs,
+ {"SIG-B MCS (from SIG-A)", "radiotap.he_mu.sig_b_mcs",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_MU_SIG_B_MCS_MASK, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_mcs_unknown,
+ {"SIG-B MCS (from SIG-A) unknown",
+ "radiotap.he_mu.sig_b_mcs_unknown",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_MU_SIG_B_MCS_MASK, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_mcs_known,
+ {"SIG-B MCS known", "radiotap.he_mu.sig_b_mcs_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_SIG_B_MCS_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_dcm,
+ {"SIG-B DCM (from SIG-A)", "radiotap.he_mu.sig_b_dcm",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_MU_SIG_B_DCM,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_dcm_unknown,
+ {"SIG-B DCM (from SIG-A) unknown",
+ "radiotap.he_mu.sig_b_dcm_unknown",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_MU_SIG_B_DCM,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_dcm_known,
+ {"SIG-B DCM known", "radiotap.he_mu.sig_b_dmc_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_SIG_B_DCM_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_reserved_f1_b7,
+ {"Reserved", "radiotap.he_mu.reserved_f1_b7",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_MU_RESERVED_F1_B7, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_0_known,
+ {"RU[0] known", "radiotap.he_mu.ru_0_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_RU_0_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_1_known,
+ {"RU[1] known", "radiotap.he_mu.ru_1_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_RU_1_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_2_known,
+ {"RU[2] known", "radiotap.he_mu.ru_2_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_RU_2_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_3_known,
+ {"RU[3] known", "radiotap.he_mu.ru_3_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_RU_3_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_center_26_tone_ru_bit_known,
+ {"Center 26-tone RU bit known", "radiotap.he_mu.center_26_tone_ru_bit_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_CENTER_26_TONE_RU_BIT_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_center_26_tone_ru_value,
+ {"Center 26-tone RU value", "radiotap.he_mu.center_26_tone_ru_value",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_MU_CENTER_26_TONE_RU_VALUE, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_compression_known,
+ {"SIG-B Compression known", "radiotap.he_mu.sig_b_compression_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_SIG_B_COMPRESSION_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_syms_mu_mimo_users_known,
+ {"# of HE-SIG-B Symbols/MU-MINO users known",
+ "radiotap.he_mu.symbol_cnt_or_user_cnt_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_SYMBOL_CNT_OR_USER_CNT_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_info_flags_1,
+ {"HE-MU Flags 1", "radiotap.he_mu.flags_1",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Flags 1 of the HE-MU Info field", HFILL}},
+
+ {&hf_radiotap_he_mu_bw_from_bw_in_sig_a,
+ {"bandwidth from Bandwidth field in SIG-A",
+ "radiotap.he_mu.bw_from_sig_a",
+ FT_UINT16, BASE_DEC, NULL,
+ IEEE80211_RADIOTAP_HE_MU_BW_FROM_BW_IN_SIG_A_MASK, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_bw_from_bw_in_sig_a_unknown,
+ {"bandwidth from Bandwidth field in SIG-A unknown",
+ "radiotap.he_mu.bw_from_sig_a_unknown",
+ FT_UINT16, BASE_DEC, NULL,
+ IEEE80211_RADIOTAP_HE_MU_BW_FROM_BW_IN_SIG_A_MASK, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_bw_from_bw_in_sig_a_known,
+ {"bandwidth from Bandwidth field in SIG-A known",
+ "radiotap.he_mu.bw_from_sig_a_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_BW_FROM_BW_IN_SIG_A_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_compression_from_sig_a,
+ {"SIG-B compression from SIG-A", "radiotap.he_mu.sig_b_compression",
+ FT_BOOLEAN, 16, NULL,
+ IEEE80211_RADIOTAP_HE_MU_SIG_B_COMPRESSION_FROM_SIG_A,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_syms_mu_mimo_users,
+ {"# of HE-SIG-B Symbols or # of MU-MIMO Users",
+ "radiotap.he_mu.sig_b_syms_or_mu_mimo_users",
+ FT_UINT16, BASE_CUSTOM, CF_FUNC(he_sig_b_symbols_custom),
+ IEEE80211_RADIOTAP_HE_MU_SYMBOL_CNT_OR_USER_CNT, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_sig_b_syms_mu_mimo_users_unknown,
+ {"# of HE-SIG-B Symbols or # of MU-MIMO Users unknown",
+ "radiotap.he_mu.sig_b_syms_or_mu_mimo_users_unknown",
+ FT_UINT16, BASE_DEC, NULL,
+ IEEE80211_RADIOTAP_HE_MU_SYMBOL_CNT_OR_USER_CNT, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_preamble_puncturing,
+ {"preamble puncturing from Bandwidth field in HE-SIG-A",
+ "radiotap.he_mu.preamble_puncturing",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_MU_PREAMBLE_PUNCTURING_MASK, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_preamble_puncturing_known,
+ {"preamble puncturing from Bandwidth field in HE-SIG-A known",
+ "radiotap.he_mu.preamble_puncturing_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_MU_PREAMBLE_PUNCTURING_KNOWN, NULL, HFILL}},
+ {&hf_radiotap_he_mu_reserved_f2_b11_b15,
+ {"Reserved", "radiotap.he_mu.reserved_f2_b11_b15",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_MU_RESERVED_F2_B11_B15, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_info_flags_2,
+ {"HE-MU Flags 2", "radiotap.he_mu.flags_2",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Flags 2 of the HE-MU Info field", HFILL}},
+
+ {&hf_radiotap_he_mu_ru_0,
+ {"RU[0] assignment index", "radiotap.he_mu.ru_0_index",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_0_unknown,
+ {"RU[0] assignment index unknown",
+ "radiotap.he_mu.ru_0_index_unknown",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_1,
+ {"RU[2] assignment index", "radiotap.he_mu.ru_1_index",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_1_unknown,
+ {"RU[2] assignment index unknown",
+ "radiotap.he_mu.ru_1_index_unknown",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_2,
+ {"RU[2] assignment index", "radiotap.he_mu.ru_2_index",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_2_unknown,
+ {"RU[2] assignment index unknown",
+ "radiotap.he_mu.ru_2_index_unknown",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_3,
+ {"RU[3] assignment index", "radiotap.he_mu.ru_3_index",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
+ {&hf_radiotap_he_mu_ru_3_unknown,
+ {"RU[3] assignment index unknown",
+ "radiotap.he_mu.ru_3_index_unknown",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
+
};
static gint *ett[] = {
&ett_radiotap,
@@ -3795,6 +4143,9 @@ void proto_register_radiotap(void)
&ett_radiotap_he_info_data_4,
&ett_radiotap_he_info_data_5,
&ett_radiotap_he_info_data_6,
+ &ett_radiotap_he_mu_info,
+ &ett_radiotap_he_mu_info_flags_1,
+ &ett_radiotap_he_mu_info_flags_2,
};
static ei_register_info ei[] = {
{ &ei_radiotap_present, { "radiotap.present.radiotap_and_vendor", PI_MALFORMED, PI_ERROR, "Both radiotap and vendor namespace specified in bitmask word", EXPFILL }},