diff options
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-ieee80211-radiotap-defs.h | 27 | ||||
-rw-r--r-- | epan/dissectors/packet-ieee80211-radiotap-iter.c | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-ieee80211-radiotap.c | 353 |
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 }}, |