radiotap: Add support for the HE-MU header.

This adds support for the HE-MU header as recently modified. It also
handles the unknown fields correctly, and has been subjected to some
captures as well.

Change-Id: Id0c6c3b4dd0f0a91722d0a1a2c1706270862d97e
Reviewed-on: https://code.wireshark.org/review/25479
Petri-Dish: Richard Sharpe <realrichardsharpe@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Richard Sharpe <realrichardsharpe@gmail.com>
This commit is contained in:
Richard Sharpe 2018-03-29 19:19:48 -07:00 committed by Anders Broman
parent 9bcedc21a8
commit 5efe9146d0
3 changed files with 380 additions and 3 deletions

View File

@ -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

View File

@ -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

View File

@ -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 }},