aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ieee80211-radiotap.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-ieee80211-radiotap.c')
-rw-r--r--epan/dissectors/packet-ieee80211-radiotap.c608
1 files changed, 607 insertions, 1 deletions
diff --git a/epan/dissectors/packet-ieee80211-radiotap.c b/epan/dissectors/packet-ieee80211-radiotap.c
index 47b34bb191..932102a4fe 100644
--- a/epan/dissectors/packet-ieee80211-radiotap.c
+++ b/epan/dissectors/packet-ieee80211-radiotap.c
@@ -187,6 +187,7 @@ static int hf_radiotap_present_mcs = -1;
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_reserved = -1;
static int hf_radiotap_present_rtap_ns = -1;
static int hf_radiotap_present_vendor_ns = -1;
@@ -207,6 +208,67 @@ static int hf_radiotap_quality = -1;
static int hf_radiotap_fcs = -1;
static int hf_radiotap_fcs_bad = -1;
+/* HE Info fields */
+static int hf_radiotap_he_ppdu_format = -1;
+static int hf_radiotap_he_bss_color_known = -1;
+static int hf_radiotap_he_beam_change_known = -1;
+static int hf_radiotap_he_ul_dl_known = -1;
+static int hf_radiotap_he_data_mcs_known = -1;
+static int hf_radiotap_he_data_dcm_known = -1;
+static int hf_radiotap_he_coding_known = -1;
+static int hf_radiotap_he_ldpc_extra_symbol_segment_known = -1;
+static int hf_radiotap_he_stbc_known = -1;
+static int hf_radiotap_he_spatial_reuse_1_known = -1;
+static int hf_radiotap_he_spatial_reuse_2_known = -1;
+static int hf_radiotap_he_spatial_reuse_3_known = -1;
+static int hf_radiotap_he_spatial_reuse_4_known = -1;
+static int hf_radiotap_he_data_bw_ru_allocation_known = -1;
+static int hf_radiotap_he_dopler_known = -1;
+static int hf_radiotap_he_d2_reserved_b1 = -1;
+static int hf_radiotap_he_gi_known = -1;
+static int hf_radiotap_he_ltf_symbols_known = -1;
+static int hf_radiotap_he_pre_fec_padding_factor_known = -1;
+static int hf_radiotap_he_txbf_known = -1;
+static int hf_radiotap_he_pe_disambiguity_known = -1;
+static int hf_radiotap_he_txop_known = -1;
+static int hf_radiotap_he_midamble_periodicity_known = -1;
+static int hf_radiotap_he_d2_reserved_ff00 = -1;
+static int he_radiotap_he_bss_color = -1;
+static int he_radiotap_he_beam_change = -1;
+static int he_radiotap_he_ul_dl = -1;
+static int he_radiotap_he_data_mcs = -1;
+static int he_radiotap_he_data_dcm = -1;
+static int he_radiotap_he_coding = -1;
+static int he_radiotap_he_ldpc_extra_symbol_segment = -1;
+static int he_radiotap_he_stbc = -1;
+static int he_radiotap_spatial_reuse = -1;
+static int he_radiotap_he_su_reserved = -1;
+static int he_radiotap_spatial_reuse_1 = -1;
+static int he_radiotap_spatial_reuse_2 = -1;
+static int he_radiotap_spatial_reuse_3 = -1;
+static int he_radiotap_spatial_reuse_4 = -1;
+static int he_radiotap_sta_id_user_captured = -1;
+static int he_radiotap_he_mu_reserved = -1;
+static int he_radiotap_data_bandwidth_ru_allocation = -1;
+static int he_radiotap_gi = -1;
+static int he_radiotap_d5_reserved_00c0 = -1;
+static int he_radiotap_ltf_symbols = -1;
+static int he_radiotap_d5_reserved_b11 = -1;
+static int he_radiotap_pre_fec_padding_factor = -1;
+static int he_radiotap_txbf = -1;
+static int he_radiotap_pe_disambiguity = -1;
+static int hf_radiotap_he_nsts = -1;
+static int hf_radiotap_he_dopler_value = -1;
+static int hf_radiotap_he_d6_reserved_00e0 = -1;
+static int hf_radiotap_he_txop_value = -1;
+static int hf_radiotap_midamble_periodicity = -1;
+static int hf_radiotap_he_info_data_1 = -1;
+static int hf_radiotap_he_info_data_2 = -1;
+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 gint ett_radiotap = -1;
static gint ett_radiotap_present = -1;
static gint ett_radiotap_present_word = -1;
@@ -224,6 +286,13 @@ static gint ett_radiotap_vht_known = -1;
static gint ett_radiotap_vht_user = -1;
static gint ett_radiotap_timestamp = -1;
static gint ett_radiotap_timestamp_flags = -1;
+static gint ett_radiotap_he_info = -1;
+static gint ett_radiotap_he_info_data_1 = -1;
+static gint ett_radiotap_he_info_data_2 = -1;
+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 expert_field ei_radiotap_data_past_header = EI_INIT;
static expert_field ei_radiotap_present_reserved = EI_INIT;
@@ -662,6 +731,230 @@ capture_radiotap(const guchar * pd, int offset, int len, capture_packet_info_t *
return call_capture_dissector(ieee80211_cap_handle, pd, offset + it_len, len, cpinfo, pseudo_header);
}
+static const true_false_string tfs_known_unknown = {
+ "Known",
+ "Unknown"
+};
+
+static const int *data1_headers[] = {
+ &hf_radiotap_he_ppdu_format,
+ &hf_radiotap_he_bss_color_known,
+ &hf_radiotap_he_beam_change_known,
+ &hf_radiotap_he_ul_dl_known,
+ &hf_radiotap_he_data_mcs_known,
+ &hf_radiotap_he_data_dcm_known,
+ &hf_radiotap_he_coding_known,
+ &hf_radiotap_he_ldpc_extra_symbol_segment_known,
+ &hf_radiotap_he_stbc_known,
+ &hf_radiotap_he_spatial_reuse_1_known,
+ &hf_radiotap_he_spatial_reuse_2_known,
+ &hf_radiotap_he_spatial_reuse_3_known,
+ &hf_radiotap_he_spatial_reuse_4_known,
+ &hf_radiotap_he_data_bw_ru_allocation_known,
+ &hf_radiotap_he_dopler_known,
+ NULL
+};
+
+static const value_string he_pdu_format_vals[] = {
+ { IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_SU, "HE_SU" },
+ { IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_EXT_SU, "HE_EXT_SU" },
+ { IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_MU, "HE_MU" },
+ { IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_TRIG, "HE_TRIG" },
+ { 0, NULL }
+};
+
+static const int *data2_headers[] = {
+ &hf_radiotap_he_d2_reserved_b1,
+ &hf_radiotap_he_gi_known,
+ &hf_radiotap_he_ltf_symbols_known,
+ &hf_radiotap_he_pre_fec_padding_factor_known,
+ &hf_radiotap_he_txbf_known,
+ &hf_radiotap_he_pe_disambiguity_known,
+ &hf_radiotap_he_txop_known,
+ &hf_radiotap_he_midamble_periodicity_known,
+ &hf_radiotap_he_d2_reserved_ff00,
+ NULL
+};
+
+static const int *data3_headers[] = {
+ &he_radiotap_he_bss_color,
+ &he_radiotap_he_beam_change,
+ &he_radiotap_he_ul_dl,
+ &he_radiotap_he_data_mcs,
+ &he_radiotap_he_data_dcm,
+ &he_radiotap_he_coding,
+ &he_radiotap_he_ldpc_extra_symbol_segment,
+ &he_radiotap_he_stbc,
+ NULL
+};
+
+static const value_string he_coding_vals[] = {
+ { 0, "BCC" },
+ { 1, "LDPC" },
+ { 0, NULL }
+};
+
+static const int *data4_he_su_and_he_ext_su_headers[] = {
+ &he_radiotap_spatial_reuse,
+ &he_radiotap_he_su_reserved,
+ NULL
+};
+
+static const int *data4_he_trig_headers[] = {
+ &he_radiotap_spatial_reuse_1,
+ &he_radiotap_spatial_reuse_2,
+ &he_radiotap_spatial_reuse_3,
+ &he_radiotap_spatial_reuse_4,
+ NULL
+};
+
+static const int *data4_he_mu_headers[] = {
+ &he_radiotap_spatial_reuse,
+ &he_radiotap_sta_id_user_captured,
+ &he_radiotap_he_mu_reserved,
+ NULL
+};
+
+static const int *data5_headers[] = {
+ &he_radiotap_data_bandwidth_ru_allocation,
+ &he_radiotap_gi,
+ &he_radiotap_d5_reserved_00c0,
+ &he_radiotap_ltf_symbols,
+ &he_radiotap_d5_reserved_b11,
+ &he_radiotap_pre_fec_padding_factor,
+ &he_radiotap_txbf,
+ &he_radiotap_pe_disambiguity,
+ NULL
+};
+
+static const value_string he_data_bw_ru_alloc_vals[] = {
+ { 0, "20" },
+ { 1, "40" },
+ { 2, "80" },
+ { 3, "160/80+80" },
+ { 4, "26-tone RU" },
+ { 5, "52-tone RU" },
+ { 6, "106-tone RU" },
+ { 7, "242-tone RU" },
+ { 8, "484-tone RU" },
+ { 9, "996-tone RU" },
+ { 10, "2x996-tone RU" },
+ { 11, "reserved" },
+ { 12, "reserved" },
+ { 13, "reserved" },
+ { 14, "reserved" },
+ { 15, "reserved" },
+ { 0, NULL }
+};
+
+static const value_string he_gi_vals[] = {
+ { 0, "0.8us" },
+ { 1, "1.6us" },
+ { 2, "3.2us" },
+ { 3, "reserved" },
+ { 0, NULL }
+};
+
+static const value_string he_ltf_symbols_vals[] = {
+ { 0, "1x" },
+ { 1, "2x" },
+ { 2, "4x" },
+ { 3, "6x" },
+ { 4, "8x" },
+ { 5, "reserved" },
+ { 6, "reserved" },
+ { 7, "reserved" },
+ { 0, NULL }
+};
+
+static const int *data6_headers[] = {
+ &hf_radiotap_he_nsts,
+ &hf_radiotap_he_dopler_value,
+ &hf_radiotap_he_d6_reserved_00e0,
+ &hf_radiotap_he_txop_value,
+ &hf_radiotap_midamble_periodicity,
+ NULL
+};
+
+static const value_string he_nsts_vals[] = {
+ { 0, "Unknown" },
+ { 1, "1 space-time stream" },
+ { 2, "2 space-time streams" },
+ { 3, "3 space-time streams" },
+ { 4, "4 space-time streams" },
+ { 5, "5 space-time streams" },
+ { 6, "6 space-time streams" },
+ { 7, "7 space-time streams" },
+ { 8, "8 space-time streams" },
+ { 9, "9 space-time streams" },
+ { 10, "10 space-time streams" },
+ { 11, "11 space-time streams" },
+ { 12, "12 space-time streams" },
+ { 13, "13 space-time streams" },
+ { 14, "14 space-time streams" },
+ { 15, "15 space-time streams" },
+ { 0, NULL }
+};
+
+static const value_string he_midamble_periodicity_vals[] = {
+ { 0, "10" },
+ { 1, "20" },
+ { 0, NULL }
+};
+
+static void
+dissect_radiotap_he_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset)
+{
+ guint16 ppdu_format = tvb_get_letohs(tvb, offset) &
+ IEEE80211_RADIOTAP_HE_PPDU_FORMAT_MASK;
+ proto_tree *he_info_tree = NULL;
+
+ he_info_tree = proto_tree_add_subtree(tree, tvb, offset, 12,
+ ett_radiotap_he_info, NULL, "HE information");
+
+ /* Add the bitmasks for each of D1 through D6 */
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_1, ett_radiotap_he_info_data_1,
+ data1_headers, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_2, ett_radiotap_he_info_data_2,
+ data2_headers, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_3, ett_radiotap_he_info_data_3,
+ data3_headers, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ if (ppdu_format == IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_SU ||
+ ppdu_format == IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_EXT_SU)
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_4, ett_radiotap_he_info_data_4,
+ data4_he_su_and_he_ext_su_headers, ENC_LITTLE_ENDIAN);
+ else if (ppdu_format == IEEE80211_RADIOTAP_HE_PPDU_FORMAT_HE_MU)
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_4, ett_radiotap_he_info_data_4,
+ data4_he_mu_headers, ENC_LITTLE_ENDIAN);
+ else
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_4, ett_radiotap_he_info_data_4,
+ data4_he_trig_headers, ENC_LITTLE_ENDIAN);
+
+ offset += 2;
+
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_5, ett_radiotap_he_info_data_5,
+ data5_headers, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_bitmask(he_info_tree, tvb, offset,
+ hf_radiotap_he_info_data_6, ett_radiotap_he_info_data_6,
+ data6_headers, ENC_LITTLE_ENDIAN);
+}
+
static int
dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* unused_data _U_)
{
@@ -881,6 +1174,9 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* u
proto_tree_add_item(present_word_tree,
hf_radiotap_present_timestamp, tvb,
offset + 4, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(present_word_tree,
+ hf_radiotap_present_he, tvb,
+ offset + 4, 4, ENC_LITTLE_ENDIAN);
ti = proto_tree_add_item(present_word_tree,
hf_radiotap_present_reserved, tvb,
@@ -1874,6 +2170,9 @@ dissect_radiotap(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* u
offset + 11, 1, ENC_LITTLE_ENDIAN);
break;
}
+ case IEEE80211_RADIOTAP_HE:
+ dissect_radiotap_he_info(tvb, pinfo, radiotap_tree, offset);
+ break;
}
}
@@ -2073,6 +2372,11 @@ void proto_register_radiotap(void)
FT_BOOLEAN, 32, TFS(&tfs_present_absent), RADIOTAP_MASK(TIMESTAMP),
"Specifies if the timestamp field is present", HFILL}},
+ {&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}},
+
{&hf_radiotap_present_reserved,
{"Reserved", "radiotap.present.reserved",
FT_UINT32, BASE_HEX, NULL, IEEE80211_RADIOTAP_NOTDEFINED,
@@ -2800,6 +3104,301 @@ void proto_register_radiotap(void)
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"Specifies if this frame has a bad frame check sequence", HFILL}},
+ {&hf_radiotap_he_info_data_1,
+ {"HE Data 1", "radiotap.he.data_1",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Data 1 of the HE Info field", HFILL}},
+
+ {&hf_radiotap_he_ppdu_format,
+ {"PPDU Format", "radiotap.he.data_1.ppdu_format",
+ FT_UINT16, BASE_HEX, VALS(he_pdu_format_vals),
+ IEEE80211_RADIOTAP_HE_PPDU_FORMAT_MASK, NULL, HFILL}},
+
+ {&hf_radiotap_he_bss_color_known,
+ {"BSS Color known", "radiotap.he.data_1.bss_color_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_BSS_COLOR_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_beam_change_known,
+ {"Beam Change known", "radiotap.he.data_1.beam_change_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_BEAM_CHANGE_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_ul_dl_known,
+ {"UL/DL known", "radiotap.he.data_1.ul_dl_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_UL_DL_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_data_mcs_known,
+ {"data MCS known", "radiotap.he.data_1.data_mcs_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_DATA_MCS_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_data_dcm_known,
+ {"data DCM known", "radiotap.he.data_1.data_dcm_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_DATA_DCM_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_coding_known,
+ {"Coding known", "radiotap.he.data_1.coding_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_CODING_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_ldpc_extra_symbol_segment_known,
+ {"LDPC extra symbol segment known", "radiotap.he.data_1.ldpc_extra_symbol_segment_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_LDPC_EXTRA_SYMBOL_SEGMENT_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_stbc_known,
+ {"STBC known", "radiotap.he.data_1.stbc_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_STBC_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_spatial_reuse_1_known,
+ {"Spatial Reuse 1 known", "radiotap.he.data_1.spatial_reuse_1_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_spatial_reuse_2_known,
+ {"Spatial Reuse 2 known", "radiotap.he.data_1.spatial_reuse_2_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_2_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_spatial_reuse_3_known,
+ {"Spatial Reuse 3 known", "radiotap.he.data_1.spatial_reuse_3_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_3_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_spatial_reuse_4_known,
+ {"Spatial Reuse 4 known", "radiotap.he.data_1.spatial_reuse_4_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_4_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_data_bw_ru_allocation_known,
+ {"dat BW/RU allocation known", "radiotap.he.data_1.data_bw_ru_allocation_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_DATA_BW_RU_ALLOCATION_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_dopler_known,
+ {"Dopler known", "radiotap.he.data_1.dopler_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown),
+ IEEE80211_RADIOTAP_HE_DOPLER_KNOWN, NULL, HFILL}},
+
+ {&hf_radiotap_he_info_data_2,
+ {"HE Data 2", "radiotap.he.data_2",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Data 1 of the HE Info field", HFILL}},
+
+ {&hf_radiotap_he_d2_reserved_b1,
+ {"Reserved", "radiotap.he.data_2.reserved_ff00",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_RESERVED_D2_B1,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_gi_known,
+ {"GI known", "radiotap.he.data_2.gi_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_GI_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_ltf_symbols_known,
+ {"LTF symbols known", "radiotap.he.data_2.ltf_symbols_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_LTF_SYMBOLS_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_pre_fec_padding_factor_known,
+ {"Pre-FEC Padding Factor known", "radiotap.he.data_2.pre_fec_padding_factor_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_PRE_FEC_PADDING_FACTOR_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_txbf_known,
+ {"TxBF known", "radiotap.he.data_2.txbf_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_TXBF_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_pe_disambiguity_known,
+ {"PE Disambiguity known", "radiotap.he.data_2.pe_disambiguity_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_PE_DISAMBIGUITY_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_txop_known,
+ {"TXOP known", "radiotap.he.data_2.txop_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_TXOP_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_midamble_periodicity_known,
+ {"midamble periodicity known", "radiotap.he.data_2.midamble_periodicity_known",
+ FT_BOOLEAN, 16, TFS(&tfs_known_unknown), IEEE80211_RADIOTAP_HE_MIDAMBLE_PERIODICITY_KNOWN,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_d2_reserved_ff00,
+ {"Reserved", "radiotap.he.data_2.reserved_ff00",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_RESERVED_D2_FF00,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_bss_color,
+ {"BSS Color", "radiotap.he.data_3.bss_color",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_BSS_COLOR_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_beam_change,
+ {"Beam Change", "radiotap.he.data_3.beam_change",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_BEAM_CHANGE,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_ul_dl,
+ {"UL/DL", "radiotap.he.data_3.ul_dl",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_UL_DL,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_data_mcs,
+ {"data MCS", "radiotap.he.data_3.data_mcs",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_DATA_MCS_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_data_dcm,
+ {"data DCM", "radiotap.he.data_3.data_dcm",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_DATA_DCM,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_coding,
+ {"Coding", "radiotap.he.data_3.coding",
+ FT_UINT16, BASE_HEX, VALS(he_coding_vals),
+ IEEE80211_RADIOTAP_HE_CODING, NULL, HFILL}},
+
+ {&he_radiotap_he_ldpc_extra_symbol_segment,
+ {"LDPC extra symbol segment", "radiotap.he.data_3.ldpc_extra_symbol_segment",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_LDPC_EXTRA_SYMBOL_SEGMENT,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_stbc,
+ {"STBC", "radiotap.he.data_3.stbc",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_STBC,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_info_data_3,
+ {"HE Data 3", "radiotap.he.data_3",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Data 1 of the HE Info field", HFILL}},
+
+ {&he_radiotap_spatial_reuse,
+ {"Spatial Reuse", "radiotap.he.data_4.spatial_reuse",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_su_reserved,
+ {"Reserved", "radiotap.he.data_4.reserved_d4_fff0",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_D4_FFF0,
+ NULL, HFILL}},
+
+ {&he_radiotap_spatial_reuse_1,
+ {"Spatial Reuse 1", "radiotap.he.data_4.spatial_reuse_1",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_1_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_spatial_reuse_2,
+ {"Spatial Reuse 2", "radiotap.he.data_4.spatial_reuse_2",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_2_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_spatial_reuse_3,
+ {"Spatial Reuse 3", "radiotap.he.data_4.spatial_reuse_3",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_3_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_spatial_reuse_4,
+ {"Spatial Reuse 4", "radiotap.he.data_4.spatial_reuse_4",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_SPATIAL_REUSE_4_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_sta_id_user_captured,
+ {"STA-ID of user data captured for", "radiotap.he.data_4.sta_id_user",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_STA_ID_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_he_mu_reserved,
+ {"Reserved", "radiotap.he.data_4.reserved_d4_b15",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_RESERVED_D4_B15,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_info_data_4,
+ {"HE Data 4", "radiotap.he.data_4",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Data 1 of the HE Info field", HFILL}},
+
+ {&he_radiotap_data_bandwidth_ru_allocation,
+ {"data Bandwidth/RU allocation", "radiotap.he.data_5.data_bw_ru_allocation",
+ FT_UINT16, BASE_HEX, VALS(he_data_bw_ru_alloc_vals),
+ IEEE80211_RADIOTAP_HE_DATA_BANDWIDTH_RU_ALLOC_MASK, NULL, HFILL}},
+
+ {&he_radiotap_gi,
+ {"GI", "radiotap.he.data_5.gi",
+ FT_UINT16, BASE_HEX, VALS(he_gi_vals), IEEE80211_RADIOTAP_HE_GI_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_d5_reserved_00c0,
+ {"reserved", "radiotap.he.data_5.reserved_d5_00c0",
+ FT_UINT16, BASE_HEX, NULL,
+ IEEE80211_RADIOTAP_HE_RESERVED_D5_00C0, NULL, HFILL}},
+
+ {&he_radiotap_ltf_symbols,
+ {"LTF symbols", "radiotap.he.ltf_symbols",
+ FT_UINT16, BASE_HEX, VALS(he_ltf_symbols_vals),
+ IEEE80211_RADIOTAP_HE_LTF_SYMBOLS_MASK, NULL, HFILL}},
+
+ {&he_radiotap_d5_reserved_b11,
+ {"reserved", "radiotap.he.data_5.reserved_d5_b11",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_RESERVED_D5_B11,
+ NULL, HFILL}},
+
+ {&he_radiotap_pre_fec_padding_factor,
+ {"Pre-FEC Padding Factor", "radiotap.he.pre_fec_padding_factor",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_PRE_FEC_PADDING_FACTOR_MASK,
+ NULL, HFILL}},
+
+ {&he_radiotap_txbf,
+ {"TxBF", "radiotap.he.txbf",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_TXBF,
+ NULL, HFILL}},
+
+ {&he_radiotap_pe_disambiguity,
+ {"PE Disambiguity", "radiotap.he.pe_disambiguity",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_PE_DISAMBIGUITY,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_info_data_5,
+ {"HE Data 5", "radiotap.he.data_5",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Data 1 of the HE Info field", HFILL}},
+
+ {&hf_radiotap_he_nsts,
+ {"NSTS", "radiotap.he.data_6.nsts",
+ FT_UINT16, BASE_HEX, VALS(he_nsts_vals),IEEE80211_RADIOTAP_HE_NSTS_MASK,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_dopler_value,
+ {"Dopler value", "radiotap.he.data_6.dopler_value",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_DOPLER_VALUE,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_d6_reserved_00e0,
+ {"Reserved", "radiotap.he.data_6.reserved_d6_00e0",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_RESERVED_D6_00E0,
+ NULL, HFILL}},
+
+ {&hf_radiotap_he_txop_value,
+ {"TXOP value", "radiotap.he.data_6.txop_value",
+ FT_UINT16, BASE_HEX, NULL, IEEE80211_RADIOTAP_HE_TXOP_VALUE_MASK,
+ NULL, HFILL}},
+
+ {&hf_radiotap_midamble_periodicity,
+ {"midamble periodicty", "radiotap.he.data_6.midamble_periodicity",
+ FT_UINT16, BASE_HEX, VALS(he_midamble_periodicity_vals),
+ IEEE80211_RADIOTAP_HE_MIDAMBLE_PERIODICITY, NULL, HFILL}},
+
+ {&hf_radiotap_he_info_data_6,
+ {"HE Data 6", "radiotap.he.data_6",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Data 1 of the HE Info field", HFILL}},
+
};
static gint *ett[] = {
&ett_radiotap,
@@ -2818,7 +3417,14 @@ void proto_register_radiotap(void)
&ett_radiotap_vht_known,
&ett_radiotap_vht_user,
&ett_radiotap_timestamp,
- &ett_radiotap_timestamp_flags
+ &ett_radiotap_timestamp_flags,
+ &ett_radiotap_he_info,
+ &ett_radiotap_he_info_data_1,
+ &ett_radiotap_he_info_data_2,
+ &ett_radiotap_he_info_data_3,
+ &ett_radiotap_he_info_data_4,
+ &ett_radiotap_he_info_data_5,
+ &ett_radiotap_he_info_data_6,
};
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 }},