forked from osmocom/wireshark
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:
parent
9bcedc21a8
commit
5efe9146d0
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }},
|
||||
|
|
Loading…
Reference in New Issue