aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Sharpe <realrichardsharpe@gmail.com>2018-01-18 09:40:24 -0800
committerAnders Broman <a.broman58@gmail.com>2018-01-22 05:18:19 +0000
commit6358aadfd62ffe24e3b8ba5b8b6b6ac50d633f80 (patch)
treea639a614b60f67bd549b4572255f26968cd71732
parent4d639b6f0e78602678c59a0d6270d89835f3980e (diff)
ieee80211: 802.11ax support.
This is based on Draft 2 of the standard. Draft 2 did not get approved, but is close to what the final version will be and support is needed now by the teams working on this. Change-Id: I837df05a288b815e1e455883f4f165721104d51f Reviewed-on: https://code.wireshark.org/review/24861 Petri-Dish: Richard Sharpe <realrichardsharpe@gmail.com> Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/packet-ieee80211.c2202
-rw-r--r--epan/dissectors/packet-ieee80211.h1
2 files changed, 2166 insertions, 37 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c
index 11c90184a3..502d8a6970 100644
--- a/epan/dissectors/packet-ieee80211.c
+++ b/epan/dissectors/packet-ieee80211.c
@@ -243,6 +243,7 @@ typedef struct mimo_control
/* ************************************************************************* */
#define SHORT_STR 256
#define IS_DMG_KEY 1
+#define IS_AP_KEY 2
#define IS_CTRL_GRANT_OR_GRANT_ACK_KEY 2
/* ************************************************************************* */
/* Define some very useful macros that are used to analyze frame types etc. */
@@ -288,6 +289,7 @@ typedef struct mimo_control
* 802.11-2012 and 802.11ac-2013 8.2.4.6, 32 bits.
*/
#define HTC_VHT 0x00000001
+#define HTC_HE 0x00000002
#define HTC_MRQ 0x00000004
#define HTC_UNSOLICITED_MFB 0x20000000
@@ -700,6 +702,17 @@ static value_string_ext tag_num_vals_ext = VALUE_STRING_EXT_INIT(tag_num_vals);
#define ETAG_FILS_NONCE 13
#define ETAG_FUTURE_CHANNEL_GUIDANCE 14
+/* 802.11AX defined tags */
+#define ETAG_HE_CAPABILITIES 35
+#define ETAG_HE_OPERATION 36
+#define ETAG_UORA_PARAMETER_SET 37
+#define ETAG_MU_EDCA_PARAMETER_SET 38
+#define ETAG_SPATIAL_REUSE_PARAMETER_SET 39
+#define ETAG_NDP_FEEDBACK_REPORT_PARAMETER_SET 41
+#define ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT 42
+#define ETAG_QUIET_TIME_PERIOD_SETUP 43
+#define ETAG_ESS_REPORT 44
+
static const value_string tag_num_vals_eid_ext[] = {
{ ETAG_ASSOC_DELAY_INFO, "Association Delay Info" },
{ ETAG_FILS_REQ_PARAMS, "FILS Request Parameters" },
@@ -715,6 +728,15 @@ static const value_string tag_num_vals_eid_ext[] = {
{ ETAG_FILS_PUBLIC_KEY, "FILS Public Key" },
{ ETAG_FILS_NONCE, "FILS Nonce" },
{ ETAG_FUTURE_CHANNEL_GUIDANCE, "Future Channel Guidance" },
+ { ETAG_HE_CAPABILITIES, "HE Capabilities (IEEE Std 802.11ax/D2.0" },
+ { ETAG_HE_OPERATION, "HE Operation (IEEE Std 802.11ax/D2.0" },
+ { ETAG_UORA_PARAMETER_SET, "UORA Parameter Set" },
+ { ETAG_MU_EDCA_PARAMETER_SET, "MU EDCA Parameter Set" },
+ { ETAG_SPATIAL_REUSE_PARAMETER_SET, "Spatial Reuse Parameter Set" },
+ { ETAG_NDP_FEEDBACK_REPORT_PARAMETER_SET, "NDP Feedback Report Parameter Set" },
+ { ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT, "BSS Color Change Announcement" },
+ { ETAG_QUIET_TIME_PERIOD_SETUP, "Quiet Time Period Setup" },
+ { ETAG_ESS_REPORT, "ESS Report" },
{ 0, NULL }
};
static value_string_ext tag_num_vals_eid_ext_ext = VALUE_STRING_EXT_INIT(tag_num_vals_eid_ext);
@@ -960,6 +982,10 @@ static const value_string ieee80211_status_code[] = {
{ 101, "The request failed due to exceeded MAF limit" },
{ 102, "The request failed due to exceeded MCCA track limit" },
{ 103, "Association denied because the information in the Spectrum Management field is unacceptable" },
+ { 104, "Association denied because the requesting STA does not support VHT features" },
+ { 105, "Enablement denied" },
+ { 106, "Enablement denied due to restriction from an authorized GDB" },
+ { 107, "Authorization deenabled" },
{ 0, NULL}
};
static value_string_ext ieee80211_status_code_ext = VALUE_STRING_EXT_INIT(ieee80211_status_code);
@@ -1008,6 +1034,7 @@ static const value_string frame_type_subtype_vals[] = {
{MGT_ACTION_NO_ACK, "Action No Ack"},
{MGT_ARUBA_WLAN, "Aruba Management"},
+ {CTRL_TRIGGER, "Trigger"},
{CTRL_BEAMFORM_RPT_POLL, "Beamforming Report Poll"},
{CTRL_VHT_NDP_ANNC, "VHT NDP Announcement"},
{CTRL_CONTROL_WRAPPER, "Control Wrapper"},
@@ -2036,6 +2063,8 @@ static value_string_ext category_codes_ext = VALUE_STRING_EXT_INIT(category_code
#define NR_SUB_ID_HT_MULTIPLE_BSSID 71
#define NR_SUB_ID_VHT_CAPABILITIES 191
#define NR_SUB_ID_VHT_OPERATION 192
+#define NR_SUB_ID_HE_CAPABILITIES 193
+#define NR_SUB_ID_HE_OPERATION 194
#define NR_SUB_ID_VENDOR_SPECIFIC 221
@@ -2055,6 +2084,8 @@ static const value_string ieee80211_neighbor_report_subelement_id_vals[] = {
{NR_SUB_ID_HT_MULTIPLE_BSSID, "Multiple BSSID"},
{NR_SUB_ID_VHT_CAPABILITIES, "VHT Capabilities"},
{NR_SUB_ID_VHT_OPERATION, "VHT Operation"},
+ {NR_SUB_ID_HE_CAPABILITIES, "HE Capabilities"},
+ {NR_SUB_ID_HE_OPERATION, "HE Operation"},
{NR_SUB_ID_VENDOR_SPECIFIC, "Vendor Specific"},
{0, NULL}
};
@@ -3012,7 +3043,40 @@ static int hf_ieee80211_qos_queue_size = -1;
/* 802.11-2012 and 802.11ac-2013 8.2.4.6 */
static int hf_ieee80211_htc = -1;
static int hf_ieee80211_htc_vht = -1;
-static int hf_ieee80211_htc_lac = -1;
+static int hf_ieee80211_htc_he = -1;
+static int hf_ieee80211_htc_he_ctrl_id = -1;
+static int hf_ieee80211_he_umrs_he_tb_ppdu_len = -1;
+static int hf_ieee80211_he_umrs_ru_allocation = -1;
+static int hf_ieee80211_he_dl_tx_power = -1;
+static int hf_ieee80211_he_ul_target_rssi = -1;
+static int hf_ieee80211_he_ul_mcs = -1;
+static int hf_ieee80211_he_om_rx_nss = -1;
+static int hf_ieee80211_he_om_channel_width = -1;
+static int hf_ieee80211_he_om_ul_mu_disable = -1;
+static int hf_ieee80211_he_om_tx_nsts = -1;
+static int hf_ieee80211_he_hla_unsolicited_mfb = -1;
+static int hf_ieee80211_he_hla_mrq = -1;
+static int hf_ieee80211_he_hla_nss = -1;
+static int hf_ieee80211_he_hla_he_mcs = -1;
+static int hf_ieee80211_he_hla_dcm = -1;
+static int hf_ieee80211_he_hla_ru = -1;
+static int hf_ieee80211_he_hla_bw = -1;
+static int hf_ieee80211_he_hla_msi_ppdu_type = -1;
+static int hf_ieee80211_he_hla_tx_bf = -1;
+static int hf_ieee80211_he_bsr_aci_bitmap = -1;
+static int hf_ieee80211_he_bsr_delta_tid = -1;
+static int hf_ieee80211_he_bsr_aci_high = -1;
+static int hf_ieee80211_he_bsr_scaling_factor = -1;
+static int hf_ieee80211_he_bsr_queue_size_high = -1;
+static int hf_ieee80211_he_bsr_queue_size_all = -1;
+static int hf_ieee80211_he_uph_ul_power_headroom = -1;
+static int hf_ieee80211_he_uph_ul_min_transmit_power_flag = -1;
+static int hf_ieee80211_he_cci_ac_constraint = -1;
+static int hf_ieee80211_he_cci_rdg_more_ppdu = -1;
+static int hf_ieee80211_he_cci_sr_ppdu_indic = -1;
+static int hf_ieee80211_he_btc_avail_chan = -1;
+static int hf_ieee80211_he_btc_reserved = -1;
+static int hf_ieee80211_htc_ht_lac = -1;
static int hf_ieee80211_htc_lac_trq = -1;
static int hf_ieee80211_htc_lac_mai_aseli = -1;
static int hf_ieee80211_htc_lac_mai_mrq = -1;
@@ -4001,6 +4065,15 @@ static int hf_ieee80211_tag_extended_capabilities_b69_2 = -1;
static int hf_ieee80211_tag_extended_capabilities_b70_2 = -1;
static int hf_ieee80211_tag_extended_capabilities_b71_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b72 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b73 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b74 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b75 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b76 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b77 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b78 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b79 = -1;
+
static int hf_ieee80211_tag_cisco_ccx1_unknown = -1;
static int hf_ieee80211_tag_cisco_ccx1_name = -1;
static int hf_ieee80211_tag_cisco_ccx1_clients = -1;
@@ -4146,6 +4219,8 @@ static int hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain = -1;
static int hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput = -1;
static int hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput = -1;
static int hf_ieee80211_tag_neighbor_report_bssid_info_ftm = -1;
+static int hf_ieee80211_tag_neighbor_report_bssid_info_high_efficiency = -1;
+static int hf_ieee80211_tag_neighbor_report_bssid_info_er_bss = -1;
static int hf_ieee80211_tag_neighbor_report_bssid_info_reserved = -1;
static int hf_ieee80211_tag_neighbor_report_ope_class = -1;
static int hf_ieee80211_tag_neighbor_report_channel_number = -1;
@@ -4939,6 +5014,7 @@ static int hf_ieee80211_tag_channel_measurement_feedback_sector_id = -1;
static int hf_ieee80211_tag_channel_measurement_feedback_antenna_id = -1;
static int hf_ieee80211_tag_awake_window = -1;
static int hf_ieee80211_tag_addba_ext_no_frag = -1;
+static int hf_ieee80211_tag_addba_ext_he_fragmentation_operation = -1;
static int hf_ieee80211_tag_multi_band_ctrl_sta_role = -1;
static int hf_ieee80211_tag_multi_band_ctrl_addr_present = -1;
static int hf_ieee80211_tag_multi_band_ctrl_cipher_present = -1;
@@ -4975,6 +5051,180 @@ static int hf_ieee80211_fils_wrapped_data = -1;
static int hf_ieee80211_fils_nonce = -1;
/* ************************************************************************* */
+/* 802.11AX fields */
+/* ************************************************************************* */
+static int hf_he_mac_capabilities = -1;
+static int hf_he_htc_he_support = -1;
+static int hf_he_twt_requester_support = -1;
+static int hf_he_twt_responder_support = -1;
+static int hf_he_fragmentation_support = -1;
+static int hf_he_max_number_fragmented_msdus = -1;
+static int hf_he_min_fragment_size = -1;
+static int hf_he_trigger_frame_mac_padding_dur = -1;
+static int hf_he_multi_tid_aggregation_support = -1;
+static int hf_he_he_link_adaptation_support = -1;
+static int hf_he_all_ack_support = -1;
+static int hf_he_umrs_support = -1;
+static int hf_he_bsr_support = -1;
+static int hf_he_broadcast_twt_support = -1;
+static int hf_he_32_bit_ba_bitmap_support = -1;
+static int hf_he_mu_cascading_support = -1;
+static int hf_he_ack_enabled_aggregation_support = -1;
+static int hf_he_group_addressed_multi_sta_blkack_support = -1;
+static int hf_he_om_control_support = -1;
+static int hf_he_ofdma_ra_support = -1;
+static int hf_he_max_a_mpdu_length_exponent = -1;
+static int hf_he_a_msdu_fragmentation_support = -1;
+static int hf_he_flexible_twt_schedule_support = -1;
+static int hf_he_rx_control_frame_to_multibss = -1;
+static int hf_he_bsrp_bqrp_a_mpdu_aggregation = -1;
+static int hf_he_qtp_support = -1;
+static int hf_he_bqr_support = -1;
+static int hf_he_sr_responder = -1;
+static int hf_he_ndp_feedback_report_support = -1;
+static int hf_he_ops_support = -1;
+static int hf_he_a_msdu_in_a_mpdu_support = -1;
+static int hf_he_reserved = -1;
+static int hf_he_reserved_bit_8 = -1;
+static int hf_he_reserved_bit_10 = -1;
+static int hf_he_reserved_bit_11 = -1;
+static int hf_he_reserved_bit_17 = -1;
+static int hf_he_reserved_bits_5_7 = -1;
+static int hf_he_reserved_bits_8_9 = -1;
+static int hf_he_phy_chan_width_set = -1;
+static int hf_he_40mhz_channel_2_4ghz = -1;
+static int hf_he_40_and_80_mhz_5ghz = -1;
+static int hf_he_160_mhz_5ghz = -1;
+static int hf_he_160_80_plus_80_mhz_5ghz = -1;
+static int hf_he_242_tone_rus_in_2_4ghz = -1;
+static int hf_he_242_tone_rus_in_5ghz = -1;
+static int hf_he_chan_width_reserved = -1;
+static int hf_he_mcs_max_he_mcs_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_8_ss = -1;
+static int hf_he_rx_he_mcs_map_lte_80 = -1;
+static int hf_he_tx_he_mcs_map_lte_80 = -1;
+static int hf_he_rx_he_mcs_map_160 = -1;
+static int hf_he_tx_he_mcs_map_160 = -1;
+static int hf_he_rx_he_mcs_map_80_80 = -1;
+static int hf_he_tx_he_mcs_map_80_80 = -1;
+static int hf_he_ppe_thresholds_nss = -1;
+static int hf_he_ppe_thresholds_ru_index_bitmask = -1;
+static int hf_he_ppe_ppet16 = -1;
+static int hf_he_ppe_ppet8 = -1;
+static int hf_he_phy_dual_band_support = -1;
+static int hf_he_phy_cap_dual_band_support = -1;
+static int hf_he_phy_b8_to_b23 = -1;
+static int hf_he_phy_cap_punctured_preamble_rx = -1;
+static int hf_he_phy_cap_device_class = -1;
+static int hf_he_phy_cap_ldpc_coding_in_payload = -1;
+static int hf_he_phy_cap_he_su_ppdu_1x_he_ltf_08us = -1;
+static int hf_he_phy_cap_midamble_rx_max_nsts = -1;
+static int hf_he_phy_cap_ndp_with_4x_he_ltf_32us = -1;
+static int hf_he_phy_cap_stbc_tx_lt_80mhz = -1;
+static int hf_he_phy_cap_stbc_rx_lt_80mhz = -1;
+static int hf_he_phy_cap_dopler_tx = -1;
+static int hf_he_phy_cap_dopler_rx = -1;
+static int hf_he_phy_cap_full_bw_ul_mu_mimo = -1;
+static int hf_he_phy_cap_partial_bw_ul_mu_mimo = -1;
+static int hf_he_phy_b24_to_b39 = -1;
+static int hf_he_phy_cap_dcm_max_constellation_tx = -1;
+static int hf_he_phy_cap_dcm_max_nss_tx = -1;
+static int hf_he_phy_cap_dcm_max_constellation_rx = -1;
+static int hf_he_phy_cap_dcm_max_nss_rx = -1;
+static int hf_he_phy_cap_rx_he_muppdu_from_non_ap = -1;
+static int hf_he_phy_cap_su_beamformer = -1;
+static int hf_he_phy_cap_su_beamformee = -1;
+static int hf_he_phy_cap_mu_beamformer = -1;
+static int hf_he_phy_cap_beamformer_sts_lte_80mhz = -1;
+static int hf_he_phy_cap_beamformer_sts_gt_80mhz = -1;
+static int hf_he_phy_b40_to_b55 = -1;
+static int hf_he_phy_cap_number_of_sounding_dims_lte_80 = -1;
+static int hf_he_phy_cap_number_of_sounding_dims_gt_80 = -1;
+static int hf_he_phy_cap_ng_eq_16_su_fb = -1;
+static int hf_he_phy_cap_ng_eq_16_mu_fb = -1;
+static int hf_he_phy_cap_codebook_size_eq_4_2_fb = -1;
+static int hf_he_phy_cap_codebook_size_eq_7_5_fb = -1;
+static int hf_he_phy_cap_triggered_su_beamforming_fb = -1;
+static int hf_he_phy_cap_triggered_mu_beamforming_fb = -1;
+static int hf_he_phy_cap_triggered_cqi_fb = -1;
+static int hf_he_phy_cap_partial_bw_extended_range = -1;
+static int hf_he_phy_cap_partial_bw_dl_mu_mimo = -1;
+static int hf_he_phy_cap_ppe_threshold_present = -1;
+static int hf_he_phy_b56_to_b71 = -1;
+static int hf_he_phy_cap_srp_based_sr_support = -1;
+static int hf_he_phy_cap_power_boost_factor_ar_support = -1;
+static int hf_he_phy_cap_he_su_ppdu_etc_gi = -1;
+static int hf_he_phy_cap_max_nc = -1;
+static int hf_he_phy_cap_stbc_tx_gt_80_mhz = -1;
+static int hf_he_phy_cap_stbc_rx_gt_80_mhz = -1;
+static int hf_he_phy_cap_he_er_su_ppdu_4xxx_gi = -1;
+static int hf_he_phy_cap_20mhz_in_40mgz_24ghz_band = -1;
+static int hf_he_phy_cap_20mhz_in_160_80p80_ppdu = -1;
+static int hf_he_phy_cap_80mgz_in_160_80p80_ppdu = -1;
+static int hf_he_phy_cap_he_er_su_ppdu_1xxx_gi = -1;
+static int hf_he_phy_cap_midamble_rx_2x_xxx_ltf = -1;
+static int hf_he_phy_cap_b70_b71_reserved = -1;
+static int hf_he_operation_parameter = -1;
+static int hf_he_operation_bss_color = -1;
+static int hf_he_operation_default_pe_duration = -1;
+static int hf_he_operation_twt_required = -1;
+static int hf_he_operation_txop_duration_rts_threshold = -1;
+static int hf_he_operation_partial_bss_color = -1;
+static int hf_he_operation_vht_operation_information_present = -1;
+static int hf_he_operation_reserved_b22_b27 = -1;
+static int hf_he_operation_multiple_bssid_ap = -1;
+static int hf_he_operation_txbssid_indicator = -1;
+static int hf_he_operation_bss_color_disabled = -1;
+static int hf_he_operation_reserved_b31 = -1;
+static int hf_he_operation_basic_mcs = -1;
+static int hf_he_oper_max_he_mcs_for_1_ss = -1;
+static int hf_he_oper_max_he_mcs_for_2_ss = -1;
+static int hf_he_oper_max_he_mcs_for_3_ss = -1;
+static int hf_he_oper_max_he_mcs_for_4_ss = -1;
+static int hf_he_oper_max_he_mcs_for_5_ss = -1;
+static int hf_he_oper_max_he_mcs_for_6_ss = -1;
+static int hf_he_oper_max_he_mcs_for_7_ss = -1;
+static int hf_he_oper_max_he_mcs_for_8_ss = -1;
+static int hf_he_operation_channel_width = -1;
+static int hf_he_operation_channel_center_freq_0 = -1;
+static int hf_he_operation_channel_center_freq_1 = -1;
+static int hf_he_operation_max_bssid_indicator = -1;
+static int hf_he_muac_aci_aifsn = -1;
+static int hf_he_mu_edca_timer = -1;
+static int hf_he_muac_ecwmin_ecwmax = -1;
+static int hf_he_srp_disallowed = -1;
+static int hf_he_non_srg_obss_pd_sr_disallowed = -1;
+static int hf_he_non_srg_offset_present = -1;
+static int hf_he_srg_information_present = -1;
+static int hf_he_hesiga_spatial_reuse_value15_allowed = -1;
+static int hf_he_sr_control_reserved = -1;
+static int hf_he_spatial_reuse_sr_control = -1;
+static int hf_he_spatial_non_srg_obss_pd_max_offset = -1;
+static int hf_he_spatial_srg_obss_pd_min_offset = -1;
+static int hf_he_spatial_srg_obss_pd_max_offset = -1;
+static int hf_he_spatial_srg_bss_color_bitmap = -1;
+static int hf_he_spatial_srg_partial_bssid_bitmap = -1;
+static int hf_he_ess_report_planned_ess = -1;
+static int hf_he_ess_report_edge_of_ess = -1;
+static int hf_he_resource_request_buffer_thresh = -1;
+static int hf_he_bss_color_change_new_color_info = -1;
+static int hf_he_new_bss_color_info_color = -1;
+static int hf_he_new_bss_color_info_reserved = -1;
+static int hf_he_bss_color_change_switch_countdown = -1;
+static int hf_he_ess_report_info_field = -1;
+static int hf_he_ess_report_recommend_transition_thresh = -1;
+static int hf_he_uora_field = -1;
+static int hf_he_uora_eocwmin = -1;
+static int hf_he_uora_owcwmax = -1;
+static int hf_he_uora_reserved = -1;
+
+/* ************************************************************************* */
/* Protocol trees */
/* ************************************************************************* */
static gint ett_80211 = -1;
@@ -5035,6 +5285,7 @@ static gint ett_hta_cap1_tree = -1;
static gint ett_hta_cap2_tree = -1;
static gint ett_htc_tree = -1;
+static gint ett_htc_he_a_control = -1;
static gint ett_mfb_subtree = -1;
static gint ett_lac_subtree = -1;
@@ -5084,6 +5335,7 @@ static gint ett_tag_ex_cap6 = -1;
static gint ett_tag_ex_cap7 = -1;
static gint ett_tag_ex_cap8 = -1;
static gint ett_tag_ex_cap89 = -1;
+static gint ett_tag_ex_cap10 = -1;
static gint ett_tag_rm_cap1 = -1;
static gint ett_tag_rm_cap2 = -1;
@@ -5207,6 +5459,37 @@ static gint ett_80211_ext = -1;
static gint ett_allocation_tree = -1;
static gint ett_sta_info = -1;
+/* 802.11ax trees */
+static gint ett_he_mac_capabilities = -1;
+static gint ett_he_phy_capabilities = -1;
+static gint ett_he_phy_cap_first_byte = -1;
+static gint ett_he_phy_cap_chan_width_set = -1;
+static gint ett_he_phy_cap_b8_to_b23 = -1;
+static gint ett_he_phy_cap_b24_to_b39 = -1;
+static gint ett_he_phy_cap_b40_to_b55 = -1;
+static gint ett_he_phy_cap_b56_to_b71 = -1;
+static gint ett_he_mcs_and_nss_set = -1;
+static gint ett_he_rx_tx_he_mcs_map_lte_80 = -1;
+static gint ett_he_rx_mcs_map_lte_80 = -1;
+static gint ett_he_tx_mcs_map_lte_80 = -1;
+static gint ett_he_rx_tx_he_mcs_map_160 = -1;
+static gint ett_he_rx_mcs_map_160 = -1;
+static gint ett_he_tx_mcs_map_160 = -1;
+static gint ett_he_rx_tx_he_mcs_map_80_80 = -1;
+static gint ett_he_rx_mcs_map_80_80 = -1;
+static gint ett_he_tx_mcs_map_80_80 = -1;
+static gint ett_he_ppe_threshold = -1;
+static gint ett_he_ppe_nss = -1;
+static gint ett_he_ppe_ru_alloc = -1;
+static gint ett_he_uora_tree = -1;
+static gint ett_he_spatial_reuse_control = -1;
+static gint ett_he_bss_new_color_info = -1;
+static gint ett_he_ess_report_info_field = -1;
+static gint ett_he_operation_params = -1;
+static gint ett_he_oper_basic_mcs = -1;
+static gint ett_he_operation_vht_op_info = -1;
+static gint ett_he_mu_edca_param = -1;
+
static const fragment_items frag_items = {
&ett_fragment,
&ett_fragments,
@@ -7199,6 +7482,7 @@ add_ff_cap_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int off
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_capture,
ett_cap_tree, ieee80211_ap_fields,
ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_AP_KEY, GINT_TO_POINTER(TRUE));
} else {
/* This is a STA */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_capture,
@@ -11791,6 +12075,18 @@ dissect_extended_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
NULL
};
+ static const int *ieee80211_tag_extended_capabilities_byte10[] = {
+ &hf_ieee80211_tag_extended_capabilities_b72,
+ &hf_ieee80211_tag_extended_capabilities_b73,
+ &hf_ieee80211_tag_extended_capabilities_b74,
+ &hf_ieee80211_tag_extended_capabilities_b75,
+ &hf_ieee80211_tag_extended_capabilities_b76,
+ &hf_ieee80211_tag_extended_capabilities_b77,
+ &hf_ieee80211_tag_extended_capabilities_b78,
+ &hf_ieee80211_tag_extended_capabilities_b79,
+ NULL
+ };
+
if (tag_len < 1)
{
expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be greater than 0", tag_len);
@@ -11887,6 +12183,17 @@ dissect_extended_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
offset += 2;
}
+ if (offset >= tag_len) {
+ return offset;
+ }
+
+ /* Extended Capability octet 10 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap10, ieee80211_tag_extended_capabilities_byte10,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 10)");
+ offset += 1;
+
return offset;
}
static int
@@ -13940,6 +14247,12 @@ dissect_ht_info_ie_1_0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
* and that everything except for "AC Constraint" and "RDG/More Cowbell^W
* PPDU" is different for the VHT version.
*
+ * 802.11ax changes the meaning of the first two bits:
+ *
+ * B0 = 0 means High Throughput
+ * B0 = 1, B1 = 0 means Very High Throughput
+ * B0 = 1, B1 = 1 means High Efficiency
+ *
* I read the second clause of 8.2.4.1.10 "Order field", as modified by
* 802.11ac, as meaning that, for QoS data and management frames, the
* Order field will *only* be set to 1 for HT or VHT frames, and therefore
@@ -13952,7 +14265,144 @@ dissect_ht_info_ie_1_0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
* the packet. Omnipeek, which also appeared to have no clue that it was
* an HT or VHT field - it called it an 802.11b frame - *did* dissect the
* HT Control field.)
+ *
+ * 802.11ax changes the reserved bit to differentiate between the HE version
+ * and the VHT version, and adds different types of Aggregate Control info.
*/
+#define A_CONTROL_UMRS 0
+#define A_CONTROL_OM 1
+#define A_CONTROL_HLA 2
+#define A_CONTROL_BSR 3
+#define A_CONTROL_UPH 4
+#define A_CONTROL_BQR 5
+#define A_CONTROL_CCI 6
+#define A_CONTROL_BQR_REV 0x0A
+
+static const value_string a_control_control_id_vals[] = {
+ { A_CONTROL_UMRS, "UL MU response scheduling" },
+ { A_CONTROL_OM, "Operating mode" },
+ { A_CONTROL_HLA, "HE link adaptation" },
+ { A_CONTROL_BSR, "Buffer status report" },
+ { A_CONTROL_UPH, "UL power headroom" },
+ { A_CONTROL_BQR, "Bandwidth query report" },
+ { A_CONTROL_CCI, "Command Control Indication" },
+ { A_CONTROL_BQR_REV, "Bandwidth Query Report (reversed bits)" },
+ { 0, NULL }
+};
+
+static void
+dissect_a_control_umrs(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_umrs_he_tb_ppdu_len, tvb,
+ start_bit, 5, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_umrs_ru_allocation, tvb,
+ start_bit + 5, 8, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_dl_tx_power, tvb,
+ start_bit + 13, 5, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_ul_target_rssi, tvb,
+ start_bit + 18, 5, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_ul_mcs, tvb,
+ start_bit + 23, 2, ENC_LITTLE_ENDIAN);
+}
+
+static void
+dissect_a_control_om(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_om_rx_nss, tvb, start_bit, 3,
+ ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_om_channel_width, tvb,
+ start_bit + 3, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_om_ul_mu_disable, tvb,
+ start_bit + 5, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_om_tx_nsts, tvb, start_bit + 6,
+ 3, ENC_LITTLE_ENDIAN);
+}
+
+static void
+dissect_a_control_hla(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_unsolicited_mfb, tvb,
+ start_bit, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_mrq, tvb,
+ start_bit + 1, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_nss, tvb,
+ start_bit + 2, 3, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_he_mcs, tvb,
+ start_bit + 5, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_dcm, tvb,
+ start_bit +9, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_ru, tvb,
+ start_bit + 10, 8, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_bw, tvb,
+ start_bit + 18, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_msi_ppdu_type, tvb,
+ start_bit + 20, 3, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_hla_tx_bf, tvb,
+ start_bit + 23, 1, ENC_LITTLE_ENDIAN);
+}
+
+static void
+dissect_a_control_bsr(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_bsr_aci_bitmap, tvb,
+ start_bit, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_bsr_delta_tid, tvb,
+ start_bit + 4, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_bsr_aci_high, tvb,
+ start_bit + 6, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_bsr_scaling_factor, tvb,
+ start_bit + 8, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_bsr_queue_size_high, tvb,
+ start_bit + 10, 8, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_bsr_queue_size_all, tvb,
+ start_bit + 26, 8, ENC_LITTLE_ENDIAN);
+
+}
+
+static void
+dissect_a_control_uph(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_uph_ul_power_headroom, tvb,
+ start_bit, 5, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_uph_ul_min_transmit_power_flag,
+ tvb, start_bit + 5, 1, ENC_LITTLE_ENDIAN);
+
+}
+
+static void
+dissect_a_control_bqr(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_btc_avail_chan, tvb, start_bit,
+ 8, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_btc_reserved, tvb,
+ start_bit + 8, 2, ENC_LITTLE_ENDIAN);
+}
+
+static void
+dissect_a_control_cci(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
+{
+ start_bit += offset * 8;
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_cci_ac_constraint, tvb,
+ start_bit, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_cci_rdg_more_ppdu, tvb,
+ start_bit + 1, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bits_item(tree, hf_ieee80211_he_cci_sr_ppdu_indic, tvb,
+ start_bit + 2, 1, ENC_LITTLE_ENDIAN);
+
+}
static void
dissect_ht_control(proto_tree *tree, tvbuff_t *tvb, int offset)
@@ -13969,42 +14419,100 @@ dissect_ht_control(proto_tree *tree, tvbuff_t *tvb, int offset)
/* Check the HT vs. VHT bit. */
proto_tree_add_item(htc_tree, hf_ieee80211_htc_vht, tvb, offset, 4, ENC_LITTLE_ENDIAN);
if (htc & HTC_VHT) {
- /* VHT */
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_mrq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!(htc & HTC_UNSOLICITED_MFB)) {
- if (htc & HTC_MRQ) {
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi_stbc_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ /* VHT or HE */
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_he, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ if (htc & HTC_HE) {
+ /*
+ * We have a 30-bit field, of which the first is a 4-bit Control ID which
+ * determines how the rest is handled. There can be multiple fields.
+ */
+ proto_tree *a_control_tree = NULL;
+ proto_item *pi = NULL;
+ guint8 start_bit_offset = 2;
+
+ a_control_tree = proto_tree_add_subtree(htc_tree, tvb, offset, 4,
+ ett_htc_he_a_control, NULL, "Aggregate Control");
+ while (start_bit_offset < 32) {
+ guint8 control_id = (htc >> start_bit_offset) & 0x0F;
+ start_bit_offset += 4;
+ pi = proto_tree_add_uint(a_control_tree, hf_ieee80211_htc_he_ctrl_id,
+ tvb, offset, 4, control_id);
+ proto_item_append_text(pi, ": %s",
+ val_to_str(control_id, a_control_control_id_vals,
+ "Reserved (%u)"));
+ switch (control_id) {
+ case A_CONTROL_UMRS:
+ dissect_a_control_umrs(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 26;
+ break;
+ case A_CONTROL_OM:
+ dissect_a_control_om(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 12;
+ break;
+ case A_CONTROL_HLA:
+ dissect_a_control_hla(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 26;
+ break;
+ case A_CONTROL_BSR:
+ dissect_a_control_bsr(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 26;
+ break;
+ case A_CONTROL_UPH:
+ dissect_a_control_uph(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 8;
+ break;
+ case A_CONTROL_BQR:
+ case A_CONTROL_BQR_REV:
+ dissect_a_control_bqr(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 10;
+ break;
+ case A_CONTROL_CCI:
+ dissect_a_control_cci(a_control_tree, tvb, offset, htc, start_bit_offset);
+ start_bit_offset += 8;
+ break;
+ default:
+ /* Add an expert info ... */
+ start_bit_offset += 32; /* Abandon */
+ break;
+ }
}
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_mfsi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
} else {
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_mrq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ if (!(htc & HTC_UNSOLICITED_MFB)) {
+ if (htc & HTC_MRQ) {
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi_stbc_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ }
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_mfsi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ } else {
+ if (!HTC_NO_FEEDBACK_PRESENT(HTC_MFB(htc))) {
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_compressed_msi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_ppdu_stbc_encoded, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi_stbc_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ }
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_gid_l, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ }
+ ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_mfb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ mfb_subtree = proto_item_add_subtree(ti, ett_mfb_subtree);
+ proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_num_sts, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_vht_mcs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_bw, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ /* This should be converted to dB by adding 22 */
+ proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_snr, tvb, offset, 4, ENC_LITTLE_ENDIAN);
if (!HTC_NO_FEEDBACK_PRESENT(HTC_MFB(htc))) {
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_compressed_msi, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_ppdu_stbc_encoded, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_gid_h, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_coding_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_fb_tx_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
} else {
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_msi_stbc_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved3, tvb, offset, 4, ENC_LITTLE_ENDIAN);
}
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_gid_l, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- }
- ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_mfb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- mfb_subtree = proto_item_add_subtree(ti, ett_mfb_subtree);
- proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_num_sts, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_vht_mcs, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_bw, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- /* This should be converted to dB by adding 22 */
- proto_tree_add_item(mfb_subtree, hf_ieee80211_htc_snr, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- if (!HTC_NO_FEEDBACK_PRESENT(HTC_MFB(htc))) {
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_gid_h, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_coding_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_fb_tx_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved3, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_unsolicited_mfb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
}
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_unsolicited_mfb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
} else {
/* Start: Link Adaptation Control */
- ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_lac, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_ht_lac, tvb, offset, 4, ENC_LITTLE_ENDIAN);
lac_subtree = proto_item_add_subtree(ti, ett_lac_subtree);
proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_trq, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -14037,8 +14545,14 @@ dissect_ht_control(proto_tree *tree, tvbuff_t *tvb, int offset)
proto_tree_add_item(htc_tree, hf_ieee80211_htc_ndp_announcement, tvb, offset, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved2, tvb, offset, 4, ENC_LITTLE_ENDIAN);
}
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_ac_constraint, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_rdg_more_ppdu, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+
+ /*
+ * These bits are part of the Aggregate Control field for 802.11ax
+ */
+ if (!(htc & HTC_HE)) {
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_ac_constraint, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_rdg_more_ppdu, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ }
/* offset += 2; */
}
@@ -14463,6 +14977,14 @@ ieee80211_tag_ssid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
return offset + tag_len;
}
+static void
+dissect_he_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset, int len);
+
+static void
+dissect_he_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset, int len _U_);
+
static int
dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
@@ -14504,6 +15026,8 @@ dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput, tvb, offset, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput, tvb, offset, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_ftm, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_high_efficiency, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_er_bss, tvb, offset, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
@@ -14565,6 +15089,16 @@ dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
ett_tag_neighbor_report_sub_tag_tree, NULL, "Secondary Channel Offset");
dissect_secondary_channel_offset_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
break;
+ case NR_SUB_ID_HE_CAPABILITIES:
+ sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
+ ett_tag_neighbor_report_sub_tag_tree, NULL, "HE Capabilities");
+ dissect_he_capabilities(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_length);
+ break;
+ case NR_SUB_ID_HE_OPERATION:
+ sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
+ ett_tag_neighbor_report_sub_tag_tree, NULL, "HE Operation");
+ dissect_he_operation(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_length);
+ break;
case NR_SUB_ID_VENDOR_SPECIFIC:
default:
break;
@@ -16356,13 +16890,643 @@ ieee80211_tag_vendor_specific_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
return tvb_captured_length(tvb);
}
+#define HE_HTC_HE_SUPPORT 0x00000001
+#define HE_FRAGMENTATION_SUPPORT 0x00000018
+#define HE_ALL_ACK_SUPPORT 0x00000200
+#define HE_UMRS_SUPPORT 0x00000400
+#define HE_BSR_SUPPORT 0x00000800
+
+static const val64_string he_fragmentation_support_vals[] = {
+ { 0, "No support for dynamic fragmentation" },
+ { 1, "Support for dynamic fragments in MPDUs or S-MPDUs" },
+ { 2, "Support for dynamic fragments in MPDUs and S-MPDUs and up to 1 dyn frag in MSDUs..." },
+ { 3, "Support for all types of dynamic fragments" },
+ { 0, NULL }
+};
+
+static const val64_string he_minimum_fragmentation_size_vals[] = {
+ { 0, "No restriction on minimum payload size" },
+ { 1, "Minimum payload size of 128 bytes" },
+ { 2, "Minimum payload size of 256 bytes" },
+ { 3, "Minimum payload size of 512 bytes" },
+ { 0, NULL }
+};
+
+static const val64_string he_link_adaptation_support_vals[] = {
+ { 0, "No feedback if the STA does not provide HE MFB" },
+ { 1, "Reserved" },
+ { 2, "Unsolicited if the STA can receive and provide only unsolicited HE MFB" },
+ { 3, "Both" },
+ { 0, NULL }
+};
+
+static const int *he_mac_headers[] = {
+ &hf_he_htc_he_support, /* 0 */
+ &hf_he_twt_requester_support, /* 1 */
+ &hf_he_twt_responder_support, /* 2 */
+ &hf_he_fragmentation_support, /* 3 */
+ &hf_he_max_number_fragmented_msdus, /* 4 */
+ &hf_he_min_fragment_size, /* 5 */
+ &hf_he_trigger_frame_mac_padding_dur, /* 6 */
+ &hf_he_multi_tid_aggregation_support, /* 7 */
+ &hf_he_he_link_adaptation_support, /* 8 */
+ &hf_he_all_ack_support, /* 9 */
+ &hf_he_umrs_support, /* 10 */
+ &hf_he_bsr_support, /* 11 */
+ &hf_he_broadcast_twt_support, /* 12 */
+ &hf_he_32_bit_ba_bitmap_support, /* 13 */
+ &hf_he_mu_cascading_support, /* 14 */
+ &hf_he_ack_enabled_aggregation_support, /* 15 */
+ &hf_he_group_addressed_multi_sta_blkack_support, /* 16 */
+ &hf_he_om_control_support, /* 17 */
+ &hf_he_ofdma_ra_support, /* 18 */
+ &hf_he_max_a_mpdu_length_exponent, /* 19 */
+ &hf_he_a_msdu_fragmentation_support, /* 20 */
+ &hf_he_flexible_twt_schedule_support, /* 21 */
+ &hf_he_rx_control_frame_to_multibss, /* 22 */
+ &hf_he_bsrp_bqrp_a_mpdu_aggregation, /* 23 */
+ &hf_he_qtp_support, /* 24 */
+ &hf_he_bqr_support, /* 25 */
+ &hf_he_sr_responder, /* 26 */
+ &hf_he_ndp_feedback_report_support, /* 27 */
+ &hf_he_ops_support, /* 28 */
+ &hf_he_a_msdu_in_a_mpdu_support, /* 29 */
+ &hf_he_reserved, /* 30 */
+ NULL
+};
+
+static const int *he_phy_first_byte_headers[] = {
+ &hf_he_phy_cap_dual_band_support,
+ NULL,
+};
+
+static const int *he_phy_channel_width_set_headers[] _U_ = {
+ &hf_he_40mhz_channel_2_4ghz,
+ &hf_he_40_and_80_mhz_5ghz,
+ &hf_he_160_mhz_5ghz,
+ &hf_he_160_80_plus_80_mhz_5ghz,
+ &hf_he_242_tone_rus_in_2_4ghz,
+ &hf_he_242_tone_rus_in_5ghz,
+ &hf_he_chan_width_reserved,
+ NULL
+};
+
+static const int *he_phy_b8_to_b23_headers[] = {
+ &hf_he_phy_cap_punctured_preamble_rx,
+ &hf_he_phy_cap_device_class,
+ &hf_he_phy_cap_ldpc_coding_in_payload,
+ &hf_he_phy_cap_he_su_ppdu_1x_he_ltf_08us,
+ &hf_he_phy_cap_midamble_rx_max_nsts,
+ &hf_he_phy_cap_ndp_with_4x_he_ltf_32us,
+ &hf_he_phy_cap_stbc_tx_lt_80mhz,
+ &hf_he_phy_cap_stbc_rx_lt_80mhz,
+ &hf_he_phy_cap_dopler_tx,
+ &hf_he_phy_cap_dopler_rx,
+ &hf_he_phy_cap_full_bw_ul_mu_mimo,
+ &hf_he_phy_cap_partial_bw_ul_mu_mimo,
+ NULL
+};
+
+static const int *he_phy_b24_to_b39_headers[] = {
+ &hf_he_phy_cap_dcm_max_constellation_tx,
+ &hf_he_phy_cap_dcm_max_nss_tx,
+ &hf_he_phy_cap_dcm_max_constellation_rx,
+ &hf_he_phy_cap_dcm_max_nss_rx,
+ &hf_he_phy_cap_rx_he_muppdu_from_non_ap,
+ &hf_he_phy_cap_su_beamformer,
+ &hf_he_phy_cap_su_beamformee,
+ &hf_he_phy_cap_mu_beamformer,
+ &hf_he_phy_cap_beamformer_sts_lte_80mhz,
+ &hf_he_phy_cap_beamformer_sts_gt_80mhz,
+ NULL
+};
+
+static const int *he_phy_b40_to_b55_headers[] = {
+ &hf_he_phy_cap_number_of_sounding_dims_lte_80,
+ &hf_he_phy_cap_number_of_sounding_dims_gt_80,
+ &hf_he_phy_cap_ng_eq_16_su_fb,
+ &hf_he_phy_cap_ng_eq_16_mu_fb,
+ &hf_he_phy_cap_codebook_size_eq_4_2_fb,
+ &hf_he_phy_cap_codebook_size_eq_7_5_fb,
+ &hf_he_phy_cap_triggered_su_beamforming_fb,
+ &hf_he_phy_cap_triggered_mu_beamforming_fb,
+ &hf_he_phy_cap_triggered_cqi_fb,
+ &hf_he_phy_cap_partial_bw_extended_range,
+ &hf_he_phy_cap_partial_bw_dl_mu_mimo,
+ &hf_he_phy_cap_ppe_threshold_present,
+ NULL
+};
+
+static const int *he_phy_b56_to_b71_headers[] = {
+ &hf_he_phy_cap_srp_based_sr_support,
+ &hf_he_phy_cap_power_boost_factor_ar_support,
+ &hf_he_phy_cap_he_su_ppdu_etc_gi,
+ &hf_he_phy_cap_max_nc,
+ &hf_he_phy_cap_stbc_tx_gt_80_mhz,
+ &hf_he_phy_cap_stbc_rx_gt_80_mhz,
+ &hf_he_phy_cap_he_er_su_ppdu_4xxx_gi,
+ &hf_he_phy_cap_20mhz_in_40mgz_24ghz_band,
+ &hf_he_phy_cap_20mhz_in_160_80p80_ppdu,
+ &hf_he_phy_cap_80mgz_in_160_80p80_ppdu,
+ &hf_he_phy_cap_he_er_su_ppdu_1xxx_gi,
+ &hf_he_phy_cap_midamble_rx_2x_xxx_ltf,
+ &hf_he_phy_cap_b70_b71_reserved,
+ NULL
+};
+
+static const int *he_mcs_map_headers [] = {
+ &hf_he_mcs_max_he_mcs_1_ss,
+ &hf_he_mcs_max_he_mcs_2_ss,
+ &hf_he_mcs_max_he_mcs_3_ss,
+ &hf_he_mcs_max_he_mcs_4_ss,
+ &hf_he_mcs_max_he_mcs_5_ss,
+ &hf_he_mcs_max_he_mcs_6_ss,
+ &hf_he_mcs_max_he_mcs_7_ss,
+ &hf_he_mcs_max_he_mcs_8_ss,
+ NULL
+};
+
+static const value_string ru_alloc_vals[] = {
+ { 0, "242" },
+ { 1, "484" },
+ { 2, "996" },
+ { 3, "2x996" },
+ { 0, NULL }
+};
+
+static const value_string constellation_vals[] = {
+ { 0, "BPSK" },
+ { 1, "QPSK" },
+ { 2, "16-QAM" },
+ { 3, "64-QAM" },
+ { 4, "256-QAM" },
+ { 5, "1024-QAM" },
+ { 6, "Reserved" },
+ { 7, "None" },
+ { 0, NULL }
+};
+
+#define HE_CHANNEL_WIDTH_SET_B2 0x04
+#define HE_CHANNEL_WIDTH_SET_B3 0x08
+
+static void
+dissect_he_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset, int len)
+{
+ guint64 he_mac_caps = tvb_get_letoh40(tvb, offset);
+ guint8 phy_channel_width_set = 0;
+ proto_tree *phy_cap_tree = NULL;
+ guint he_mcs_and_nss_len = 4;
+ proto_tree *sup_he_mcs_and_nss_tree = NULL;
+ proto_tree *rx_tx_he_mcs_map_80 = NULL;
+ proto_tree *rx_tx_he_mcs_map_160 = NULL;
+ proto_tree *rx_tx_he_mcs_map_80_80 = NULL;
+
+ /* Change some header fields depending on HE_HTC_HE_SUPPORT and FRAGMENTATION */
+ if (!(he_mac_caps & HE_HTC_HE_SUPPORT)) {
+ he_mac_headers[8] = &hf_he_reserved_bit_8;
+ he_mac_headers[10] = &hf_he_reserved_bit_10;
+ he_mac_headers[11] = &hf_he_reserved_bit_11;
+ he_mac_headers[17] = &hf_he_reserved_bit_17;
+ }
+ if (!(he_mac_caps & HE_FRAGMENTATION_SUPPORT)) {
+ he_mac_headers[4] = &hf_he_reserved_bits_5_7;
+ he_mac_headers[5] = &hf_he_reserved_bits_8_9;
+ }
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_he_mac_capabilities,
+ ett_he_mac_capabilities, he_mac_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 5;
+
+ /* Get and isolate the phy channel witdth set */
+ phy_channel_width_set = tvb_get_guint8(tvb, offset) >> 1;
+ phy_cap_tree = proto_tree_add_subtree(tree, tvb, offset, 9, ett_he_phy_capabilities,
+ NULL,
+ "HE Phy Capabilities Information");
+ proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
+ hf_he_phy_dual_band_support, ett_he_phy_cap_first_byte,
+ he_phy_first_byte_headers, ENC_NA, BMT_NO_APPEND);
+ proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
+ hf_he_phy_chan_width_set, ett_he_phy_cap_chan_width_set,
+ he_phy_channel_width_set_headers, ENC_NA, BMT_NO_APPEND);
+ offset++;
+ proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
+ hf_he_phy_b8_to_b23, ett_he_phy_cap_b8_to_b23,
+ he_phy_b8_to_b23_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
+ hf_he_phy_b24_to_b39, ett_he_phy_cap_b24_to_b39,
+ he_phy_b24_to_b39_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
+ hf_he_phy_b40_to_b55, ett_he_phy_cap_b40_to_b55,
+ he_phy_b40_to_b55_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ proto_tree_add_bitmask_with_flags(phy_cap_tree, tvb, offset,
+ hf_he_phy_b56_to_b71, ett_he_phy_cap_b56_to_b71,
+ he_phy_b56_to_b71_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ /* Need the length first */
+ if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B2)
+ he_mcs_and_nss_len += 4;
+
+ if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B3)
+ he_mcs_and_nss_len += 4;
+
+ sup_he_mcs_and_nss_tree = proto_tree_add_subtree(tree, tvb, offset,
+ he_mcs_and_nss_len, ett_he_mcs_and_nss_set, NULL,
+ "Tx Rx HE-MCS NSS Support");
+ rx_tx_he_mcs_map_80 = proto_tree_add_subtree(sup_he_mcs_and_nss_tree, tvb,
+ offset, 4, ett_he_rx_tx_he_mcs_map_lte_80, NULL,
+ "Rx and Tx MCS Maps <= 80 Mhz");
+ proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80, tvb, offset,
+ hf_he_rx_he_mcs_map_lte_80,
+ ett_he_rx_mcs_map_lte_80, he_mcs_map_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80, tvb, offset,
+ hf_he_tx_he_mcs_map_lte_80,
+ ett_he_tx_mcs_map_lte_80, he_mcs_map_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B2) {
+ rx_tx_he_mcs_map_160 = proto_tree_add_subtree(sup_he_mcs_and_nss_tree,
+ tvb, offset, 4, ett_he_rx_tx_he_mcs_map_160, NULL,
+ "Rx and Tx MCS Maps 160 Mhz");
+ proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_160, tvb, offset,
+ hf_he_rx_he_mcs_map_160,
+ ett_he_rx_mcs_map_160, he_mcs_map_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_160, tvb, offset,
+ hf_he_tx_he_mcs_map_160,
+ ett_he_tx_mcs_map_160, he_mcs_map_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_tree_add_item(rx_tx_he_mcs_map_160, hf_he_tx_he_mcs_map_160, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+
+ if (phy_channel_width_set & HE_CHANNEL_WIDTH_SET_B3) {
+ rx_tx_he_mcs_map_80_80 = proto_tree_add_subtree(sup_he_mcs_and_nss_tree,
+ tvb, offset, 4, ett_he_rx_tx_he_mcs_map_80_80, NULL,
+ "Rx and Tx MCS Maps 80+80 Mhz");
+ proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80_80, tvb, offset,
+ hf_he_rx_he_mcs_map_80_80,
+ ett_he_rx_mcs_map_80_80, he_mcs_map_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ proto_tree_add_bitmask_with_flags(rx_tx_he_mcs_map_80_80, tvb, offset,
+ hf_he_tx_he_mcs_map_80_80,
+ ett_he_tx_mcs_map_80_80, he_mcs_map_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ }
+
+ if (offset < len) {
+ guint8 ppe_thresholds_field = tvb_get_guint8(tvb, offset);
+ guint8 nss_count = ppe_thresholds_field & 0x07, nss_index = 0;
+ guint8 ru_index_bitmask = (ppe_thresholds_field >> 3) & 0x0F;
+ proto_tree *ppe_tree = NULL;
+ int i = 0;
+ int bit_offset = 7; /* How many bits we are into the bytes */
+
+ ppe_tree = proto_tree_add_subtree(tree, tvb, offset, len - offset + 1,
+ ett_he_ppe_threshold, NULL,
+ "PPE Thresholds");
+ proto_tree_add_item(ppe_tree, hf_he_ppe_thresholds_nss, tvb, offset,
+ 1, ENC_NA);
+ proto_tree_add_item(ppe_tree, hf_he_ppe_thresholds_ru_index_bitmask, tvb,
+ offset, 1, ENC_NA);
+
+ /* Now, for each of the nss values, add a sub-tree with its thresholds */
+ while (nss_index < nss_count) {
+ int start_offset = 0;
+ proto_tree *nss_tree = NULL;
+ proto_item *nssti = NULL;
+ guint8 l_ru_bitmask = ru_index_bitmask;
+
+ nss_tree = proto_tree_add_subtree_format(ppe_tree, tvb, offset, -1,
+ ett_he_ppe_nss, &nssti, "NSS %d", nss_index);
+ start_offset = offset;
+
+ for (i = 0; i < 4; i++) {
+ if (l_ru_bitmask & 0x01) {
+ int bits_avail = 8 - bit_offset, bits_needed = 6 - bits_avail;
+ guint8 the_bits = 0;
+ int ru_start_offset = offset;
+ proto_tree *ru_alloc_tree = NULL;
+ proto_item *rualti = NULL;
+
+ ru_alloc_tree = proto_tree_add_subtree_format(nss_tree, tvb, offset,
+ -1, ett_he_ppe_ru_alloc, &rualti,
+ "RU allocation: %s",
+ val_to_str(i, ru_alloc_vals, "Unk"));
+
+ /*
+ * Assemble the bits we require ... we need 6, or 2x3
+ */
+ if (bits_avail >= 6) { /* We can use the current byte */
+ the_bits = (tvb_get_guint8(tvb, offset) >> bit_offset) & 0x3F;
+ } else { /* We need two adjacent bytes */
+ the_bits = (tvb_get_guint8(tvb, offset) >> bit_offset);
+ offset++;
+ the_bits = the_bits >> bit_offset |
+ ((tvb_get_guint8(tvb, offset) &
+ ((1 << bits_needed) - 1)) << (6 - bits_needed));
+ }
+ /*
+ * Now we have two three bit fields, use them.
+ */
+ proto_tree_add_uint(ru_alloc_tree, hf_he_ppe_ppet16, tvb, ru_start_offset,
+ offset - ru_start_offset + 1, the_bits & 0x07);
+ proto_tree_add_uint(ru_alloc_tree, hf_he_ppe_ppet8, tvb, ru_start_offset,
+ offset - ru_start_offset + 1, the_bits >> 3);
+
+ bit_offset = (bit_offset + 6) % 8;
+ proto_item_set_len(rualti, offset - ru_start_offset + 1);
+ }
+ l_ru_bitmask = l_ru_bitmask >> 1;
+ }
+
+
+ proto_item_set_len(nssti, offset - start_offset);
+ nss_index++;
+ }
+ }
+
+ /* Add an Expert Info about extra bytes ... */
+
+}
+
+static const int *he_operation_headers[] = {
+ &hf_he_operation_bss_color,
+ &hf_he_operation_default_pe_duration,
+ &hf_he_operation_twt_required,
+ &hf_he_operation_txop_duration_rts_threshold,
+ &hf_he_operation_partial_bss_color,
+ &hf_he_operation_vht_operation_information_present,
+ &hf_he_operation_reserved_b22_b27,
+ &hf_he_operation_multiple_bssid_ap,
+ &hf_he_operation_txbssid_indicator,
+ &hf_he_operation_bss_color_disabled,
+ &hf_he_operation_reserved_b31,
+ NULL
+};
+
+static const value_string he_mcs_map_vals[] = {
+ { 0, "Support for HE-MCS 0-7" },
+ { 1, "Support for HE-MCS 0-9" },
+ { 2, "Support for HE-MCS 0-11" },
+ { 3, "Not supported for HE PPDUs" },
+ { 0, NULL }
+};
+
+static const int *he_basic_he_mcs_header[] = {
+ &hf_he_oper_max_he_mcs_for_1_ss,
+ &hf_he_oper_max_he_mcs_for_2_ss,
+ &hf_he_oper_max_he_mcs_for_3_ss,
+ &hf_he_oper_max_he_mcs_for_4_ss,
+ &hf_he_oper_max_he_mcs_for_5_ss,
+ &hf_he_oper_max_he_mcs_for_6_ss,
+ &hf_he_oper_max_he_mcs_for_7_ss,
+ &hf_he_oper_max_he_mcs_for_8_ss,
+ NULL
+};
+
+#define VHT_OPERATION_INFORMATION_PRESENT 0x00200000
+#define MULTIPLE_BSSID_AP 0x10000000
+
+static const value_string channel_width_vals[] = {
+ { 0, "20 MHz or 40 MHz BSS Bandwidth" },
+ { 1, "80 MHz, 160 MHz or 80+80 MHz BSS Bandwidth" },
+ { 2, "160 MHz BSS Bandwidth (deprecated)" },
+ { 3, "Non-contiguous 80+80 MHz BSS Bandwidth (deprecated)" },
+ { 0, NULL }
+};
+
+static void
+dissect_he_operation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset, int len _U_)
+{
+ guint32 op_params = tvb_get_letohl(tvb, offset);
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_he_operation_parameter, ett_he_operation_params,
+ he_operation_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 4;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_he_operation_basic_mcs, ett_he_oper_basic_mcs,
+ he_basic_he_mcs_header, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ if (op_params & VHT_OPERATION_INFORMATION_PRESENT) {
+ proto_tree *vht_op_info = NULL;
+ proto_item *pi = NULL;
+
+ vht_op_info = proto_tree_add_subtree(tree, tvb, offset, 3,
+ ett_he_operation_vht_op_info, NULL,
+ "VHT Operation Information");
+ pi = proto_tree_add_item(vht_op_info, hf_he_operation_channel_width, tvb,
+ offset, 1, ENC_NA);
+ proto_item_append_text(pi, ": %s",
+ val_to_str(tvb_get_guint8(tvb, offset),
+ channel_width_vals,
+ "Reserved %u"));
+ offset++;
+
+ proto_tree_add_item(vht_op_info, hf_he_operation_channel_center_freq_0,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(vht_op_info, hf_he_operation_channel_center_freq_1,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ }
+
+ if (op_params & MULTIPLE_BSSID_AP) {
+ proto_tree_add_item(tree, hf_he_operation_max_bssid_indicator, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+ }
+}
+
+static const int *uora_headers[] = {
+ &hf_he_uora_eocwmin,
+ &hf_he_uora_owcwmax,
+ &hf_he_uora_reserved,
+ NULL
+};
+
+static void
+dissect_uora_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset)
+{
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_he_uora_field, ett_he_uora_tree, uora_headers,
+ ENC_NA, BMT_NO_APPEND);
+ offset++;
+}
+
+static int
+dissect_muac_param_record(tvbuff_t *tvb, proto_tree *tree, int offset)
+{
+ proto_tree_add_item(tree, hf_he_muac_aci_aifsn, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(tree, hf_he_muac_ecwmin_ecwmax, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(tree, hf_he_mu_edca_timer, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ return offset;
+}
+
+static void
+dissect_mu_edca_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset, int len _U_)
+{
+ proto_tree *param_tree = NULL;
+
+ /* Is this from an AP or an STA? */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_qos_info_ap,
+ ett_ff_qos_info, ieee80211_ff_qos_info_ap_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset++;
+
+ param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
+ NULL, "MUAC_BE Parameter Record");
+ offset = dissect_muac_param_record(tvb, param_tree, offset);
+
+ param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
+ NULL, "MUAC_BK Parameter Record");
+ offset = dissect_muac_param_record(tvb, param_tree, offset);
+
+ param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
+ NULL, "MUAC_VI Parameter Record");
+ offset = dissect_muac_param_record(tvb, param_tree, offset);
+
+ param_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_he_mu_edca_param,
+ NULL, "MUAC_VO Parameter Record");
+ offset = dissect_muac_param_record(tvb, param_tree, offset);
+}
+
+#define SRP_DISALLOWED 0x01
+#define NON_SRG_OBSS_PD_SR_DISALLOWED 0x02
+#define NON_SRG_OFFSET_PRESENT 0x04
+#define SRG_INFORMATION_PRESENT 0x08
+#define HESIGA_SPATIAL_REUSE_VAL15_ALLOWED 0x10
+
+static const int *sr_control_field_headers[] = {
+ &hf_he_srp_disallowed,
+ &hf_he_non_srg_obss_pd_sr_disallowed,
+ &hf_he_non_srg_offset_present,
+ &hf_he_srg_information_present,
+ &hf_he_hesiga_spatial_reuse_value15_allowed,
+ &hf_he_sr_control_reserved,
+ NULL
+};
+
+static void
+dissect_spatial_reuse_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
+{
+ guint8 sr_control = tvb_get_guint8(tvb, offset);
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_he_spatial_reuse_sr_control,
+ ett_he_spatial_reuse_control,
+ sr_control_field_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset++;
+
+ if (sr_control & NON_SRG_OFFSET_PRESENT) {
+ proto_tree_add_item(tree, hf_he_spatial_non_srg_obss_pd_max_offset,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ }
+
+ if (sr_control & SRG_INFORMATION_PRESENT) {
+ proto_tree_add_item(tree, hf_he_spatial_srg_obss_pd_min_offset, tvb,
+ offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(tree, hf_he_spatial_srg_obss_pd_max_offset, tvb,
+ offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(tree, hf_he_spatial_srg_bss_color_bitmap, tvb,
+ offset, 8, ENC_NA);
+ offset += 8;
+ proto_tree_add_item(tree, hf_he_spatial_srg_partial_bssid_bitmap,
+ tvb, offset, 8, ENC_NA);
+ offset += 8;
+ }
+}
+
+static void
+dissect_ndp_feedback_report_set(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
+{
+ proto_tree_add_item(tree, hf_he_resource_request_buffer_thresh, tvb, offset,
+ 1, ENC_NA);
+}
+
+static const int *bss_new_color_headers[] = {
+ &hf_he_new_bss_color_info_color,
+ &hf_he_new_bss_color_info_reserved,
+ NULL
+};
+
+static void
+dissect_bss_color_change(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
+{
+ proto_tree_add_item(tree, hf_he_bss_color_change_switch_countdown, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_he_bss_color_change_new_color_info,
+ ett_he_bss_new_color_info, bss_new_color_headers,
+ ENC_NA, BMT_NO_APPEND);
+}
+
+static const int *ess_info_field_headers[] = {
+ &hf_he_ess_report_planned_ess,
+ &hf_he_ess_report_edge_of_ess,
+ NULL
+};
+
+static void
+dissect_ess_report(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
+{
+ guint8 bss_trans_thresh = tvb_get_guint8(tvb, offset) >> 2;
+
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_he_ess_report_info_field,
+ ett_he_ess_report_info_field,
+ ess_info_field_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ if (bss_trans_thresh == 63)
+ proto_tree_add_int_format(tree, hf_he_ess_report_recommend_transition_thresh, tvb,
+ offset, 1, bss_trans_thresh, " (%ddBm)",
+ -100 + bss_trans_thresh);
+ else
+ proto_tree_add_int_format(tree, hf_he_ess_report_recommend_transition_thresh,
+ tvb, offset, 1, bss_trans_thresh, " (No recommendation)");
+}
+
static int
ieee80211_tag_element_id_extension(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
int tag_len = tvb_reported_length(tvb);
ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
int offset = 0;
- guint32 ext_tag_len;
+ int ext_tag_len;
guint8 ext_tag_no;
if (tag_len < 1)
@@ -16383,6 +17547,33 @@ ieee80211_tag_element_id_extension(tvbuff_t *tvb, packet_info *pinfo, proto_tree
case ETAG_FILS_NONCE:
proto_tree_add_item(tree, hf_ieee80211_fils_nonce, tvb, offset, ext_tag_len, ENC_NA);
break;
+ case ETAG_HE_CAPABILITIES:
+ dissect_he_capabilities(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_HE_OPERATION:
+ dissect_he_operation(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_UORA_PARAMETER_SET:
+ dissect_uora_parameter_set(tvb, pinfo, tree, offset);
+ break;
+ case ETAG_MU_EDCA_PARAMETER_SET:
+ dissect_mu_edca_parameter_set(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_SPATIAL_REUSE_PARAMETER_SET:
+ dissect_spatial_reuse_parameter_set(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_NDP_FEEDBACK_REPORT_PARAMETER_SET:
+ dissect_ndp_feedback_report_set(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_BSS_COLOR_CHANGE_ANNOUNCEMENT:
+ dissect_bss_color_change(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_QUIET_TIME_PERIOD_SETUP:
+
+ break;
+ case ETAG_ESS_REPORT:
+ dissect_ess_report(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
default:
break;
}
@@ -17252,6 +18443,7 @@ ieee80211_tag_addba_ext(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
else
{
proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_no_frag, tvb, 0, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_he_fragmentation_operation, tvb, 0, 1, ENC_NA);
}
return tvb_captured_length(tvb);
}
@@ -22269,6 +23461,11 @@ proto_register_ieee80211(void)
FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }},
+ {&hf_ieee80211_tag_addba_ext_he_fragmentation_operation,
+ {"ADDBA HE Fragmentation Operation", "wlan.addba.he_frag_oper",
+ FT_BOOLEAN, 8, NULL, 0x60,
+ NULL, HFILL }},
+
{&hf_ieee80211_tag_multi_band_ctrl_sta_role,
{"STA Rold", "wlan.multi_band.ctrl_sta_role",
FT_UINT8, BASE_DEC, NULL, 0xe0,
@@ -26684,6 +27881,48 @@ proto_register_ieee80211(void)
FT_BOOLEAN, 16, NULL, 0x8000,
NULL, HFILL }},
+ /* Extended Capability Octet 10 */
+ {&hf_ieee80211_tag_extended_capabilities_b72,
+ {"Reserved", "wlan.extcap.b72",
+ FT_UINT8, BASE_HEX, NULL, 0x01,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b73,
+ {"Extended Spectrum Management Capable", "wlan.extcap.b73",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b74,
+ {"Future Channel Capable", "wlan.extcap.b74",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b75,
+ {"Reserved", "wlan.extcap.b75",
+ FT_UINT8, BASE_HEX, NULL, 0x08,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b76,
+ {"Reserved", "wlan.extcap.b76",
+ FT_UINT8, BASE_HEX, NULL, 0x10,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b77,
+ {"TWT Requester Support", "wlan.extcap.b77",
+ FT_BOOLEAN, 16, NULL, 0x20,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b78,
+ {"TWT Responder Support", "wlan.extcap.b78",
+ FT_BOOLEAN, 16, NULL, 0x40,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b79,
+ {"OBSS Narrow Bandwidth RU in UL OFDMA Tolerance Support", "wlan.extcap.b79",
+ FT_BOOLEAN, 16, NULL, 0x80,
+ NULL, HFILL }},
+
+
{&hf_ieee80211_tag_cisco_ccx1_unknown,
{"Unknown", "wlan.cisco.ccx1.unknown",
FT_BYTES, BASE_NONE, NULL, 0,
@@ -26784,9 +28023,19 @@ proto_register_ieee80211(void)
FT_BOOLEAN, 32, NULL, 0x00002000,
NULL, HFILL }},
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_high_efficiency,
+ {"High Efficiency (HE AP)", "wlan.nreport.bssid.info.he",
+ FT_BOOLEAN, 32, NULL, 0x00004000,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_er_bss,
+ {"Extended Range BSS", "wlan.nreport.bssid.info.er_bss",
+ FT_BOOLEAN, 32, NULL, 0x00008000,
+ NULL, HFILL }},
+
{&hf_ieee80211_tag_neighbor_report_bssid_info_reserved,
{"Reserved", "wlan.nreport.bssid.info.reserved",
- FT_UINT32, BASE_HEX, NULL, 0xFFFFC000,
+ FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
"Must be zero", HFILL }},
{&hf_ieee80211_tag_neighbor_report_ope_class,
@@ -27720,11 +28969,144 @@ proto_register_ieee80211(void)
"High Throughput Control (+HTC)", HFILL }},
{&hf_ieee80211_htc_vht,
- {"VHT", "wlan.htc.lac.vht",
+ {"VHT", "wlan.htc.vht",
FT_BOOLEAN, 32, NULL, HTC_VHT,
"High Throughput Control HT/VHT flag", HFILL }},
- {&hf_ieee80211_htc_lac,
+ {&hf_ieee80211_htc_he,
+ {"HE", "wlan.htc.he",
+ FT_BOOLEAN, 32, NULL, HTC_HE,
+ "High Efficiency Control HE flag", HFILL }},
+
+ {&hf_ieee80211_htc_he_ctrl_id,
+ {"Control ID", "wlan.htc.he.a_control.ctrl_id",
+ FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_umrs_he_tb_ppdu_len,
+ {"HE TB PPDU Length", "wlan.htc.he.a_control.umrs.he_tb_ppdu_len",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_umrs_ru_allocation,
+ {"RU Allocation", "wlan.htc.he.a_control.umrs.ru_allocation",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_dl_tx_power,
+ {"DL Tx Power", "wlan.htc.he.a_control.umrs.dl_tx_power",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_ul_target_rssi,
+ {"UL Target RSSI", "wlan.htc.he.a_control.umrs.ul_target_rssi",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_ul_mcs,
+ {"UL MCS", "wlan.htc.he.a_control.umrs.ul_mcs",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_om_rx_nss,
+ {"Rx NSS", "wlan.htc.he.a_control.om.rx_nss",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_om_channel_width,
+ {"Channel Width", "wlan.htc.he.a_control.om.channel_width",
+ FT_UINT8, BASE_DEC, NULL, 0x00, NULL, HFILL }},
+
+ {&hf_ieee80211_he_om_ul_mu_disable,
+ {"UL MU Disable", "wlan.htc.he.a_control.om.ul_mu_disable",
+ FT_BOOLEAN, 1, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_om_tx_nsts,
+ {"Tx NSTS", "wlan.htc.he.a_control.om.tx_nsts",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_unsolicited_mfb,
+ {"Unsolicited MFB", "wlan.htc.he.a_control.hla.unsolicited_mrq",
+ FT_BOOLEAN, 8, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_mrq,
+ {"MRQ", "wlan.htc.he.a_control.hla.mrq",
+ FT_BOOLEAN, 8, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_nss,
+ {"NSS", "wlan.htc.he.a_control.hla.NSS",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_he_mcs,
+ {"HE-MCS", "wlan.htc.he.a_control.hla.he_mcs",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_dcm,
+ {"DCM", "wlan.htc.he.a_control.hla.dcm",
+ FT_BOOLEAN, 8, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_ru,
+ {"RU", "wlan.htc.he.a_control.hla.ru",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_bw,
+ {"BW", "wlan.htc.he.a_control.hla.bw",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_msi_ppdu_type,
+ {"MSI/PPDU Type", "wlan.htc.he.a_control.hla.msi_ppdu_type",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_hla_tx_bf,
+ {"Tx BF", "wlan.htc.he.a_control.hla.tx_bf",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_aci_bitmap,
+ {"ACI Bitmap", "wlan.htc.he.a_control.bsr.aci_bitmap",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_delta_tid,
+ {"Delta TID", "wlan.htc.he.a_control.bsr.delta_tid",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_aci_high,
+ {"ACI High", "wlan.htc.he.a_control.bsr.aci_high",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_scaling_factor,
+ {"Scaling Factor", "wlan.htc.he.a_control.bsr.scaling_factor",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_queue_size_high,
+ {"Queue Size High", "wlan.htc.he.a_control.bsr.queue_size_high",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_queue_size_all,
+ {"Queue Size All", "wlan.htc.he.a_control.bsr.queue_size_all",
+ FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_uph_ul_power_headroom,
+ {"UL Power Headroom", "wlan.htc.he.a_control.uph.ul_power_headroom",
+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_uph_ul_min_transmit_power_flag,
+ {"Minimum Transmit Power Flag", "wlan.htc.he.a_control.uph.min_transmit_power_flag",
+ FT_BOOLEAN, 1, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_cci_ac_constraint,
+ {"AC Constraint", "wlan.htc.he.a_control.cci.ac_constraint",
+ FT_BOOLEAN, 1, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_cci_rdg_more_ppdu,
+ {"RDG/More PPDU", "wlan.htc.he.a_control.cci.rdg_more_ppdu",
+ FT_BOOLEAN, 1, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_cci_sr_ppdu_indic,
+ {"SR PPDU Indication", "wlan.htc.he.a_control.cci.sr_ppdu_indic",
+ FT_BOOLEAN, 1, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_btc_avail_chan,
+ {"Available Channel Bitmap", "wlan.htc.he.a_control.bqr.avail_chan_bitmap",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_btc_reserved,
+ {"Reserved", "wlan.htc.he.a_control.bqr.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_ieee80211_htc_ht_lac,
{"Link Adaptation Control (LAC)", "wlan.htc.lac",
FT_UINT32, BASE_HEX, NULL, 0x0000FFFE,
"High Throughput Control Link Adaptation Control (LAC)", HFILL }},
@@ -28548,7 +29930,720 @@ proto_register_ieee80211(void)
{&hf_ieee80211_fils_nonce,
{"FILS Nonce", "wlan.ext_tag.fils.nonce",
FT_BYTES, BASE_NONE, NULL, 0x0,
- NULL, HFILL }}
+ NULL, HFILL }},
+
+ {&hf_he_mac_capabilities,
+ {"HE MAC Capabilities Information", "wlan.ext_tag.he_mac_caps",
+ FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_htc_he_support,
+ {"+HTC HE Support", "wlan.ext_tag.he_mac_cap.htc_he_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000000001,
+ NULL, HFILL }},
+
+ {&hf_he_twt_requester_support,
+ {"TWT Requester Support", "wlan.ext_tag.he_mac_cap.twt_req_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000000002,
+ NULL, HFILL }},
+
+ {&hf_he_twt_responder_support,
+ {"TWT Responder Support", "wlan.ext_tag.he_mac_cap.twt_rsp_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000000004,
+ NULL, HFILL }},
+
+ {&hf_he_fragmentation_support,
+ {"Fragmentation Support", "wlan.ext_tag.he_mac_cap.fragmentation_support",
+ FT_UINT40, BASE_DEC|BASE_VAL64_STRING,
+ VALS64(he_fragmentation_support_vals), 0x0000000018,
+ NULL, HFILL }},
+
+ {&hf_he_max_number_fragmented_msdus,
+ {"Maximum Number of Fragmented MSDUs", "wlan.ext_tag.he_mac_cap.max_frag_msdus",
+ FT_UINT40, BASE_DEC, NULL, 0x00000000E0,
+ NULL, HFILL }},
+
+ {&hf_he_min_fragment_size,
+ {"Minimum Fragment Size", "wlan.ext_tag.he_mac_cap.min_frag_size",
+ FT_UINT40, BASE_DEC|BASE_VAL64_STRING,
+ VALS64(he_minimum_fragmentation_size_vals), 0x0000000300,
+ NULL, HFILL }},
+
+ {&hf_he_trigger_frame_mac_padding_dur,
+ {"Trigger Frame MAC Padding Duration", "wlan.ext_tag.he_mac_cap.trig_frm_mac_padding_dur",
+ FT_UINT40, BASE_DEC, NULL, 0x0000000C00, NULL, HFILL }},
+
+ {&hf_he_multi_tid_aggregation_support,
+ {"Multi-TID Aggregation Support", "wlan.ext_tag.he_mac_cap.multi_tid_agg_support",
+ FT_UINT40, BASE_DEC, NULL, 0x0000007000, NULL, HFILL }},
+
+ {&hf_he_he_link_adaptation_support,
+ {"HE Link Adaption Support", "wlan.ext_tag.he_mac_cap.he_link_adatopion_support",
+ FT_UINT40, BASE_DEC|BASE_VAL64_STRING,
+ VALS64(he_link_adaptation_support_vals), 0x0000018000,
+ NULL, HFILL }},
+
+ {&hf_he_all_ack_support,
+ {"All Ack Support", "wlan.ext_tag.he_mac_cap.all_ack_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000020000,
+ NULL, HFILL }},
+
+ {&hf_he_umrs_support,
+ {"UMRS Support", "wlan.ext_tag.he_mac_cap.umrs_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000040000,
+ NULL, HFILL }},
+
+ {&hf_he_bsr_support,
+ {"BSR Support", "wlan.ext_tag.he_mac_cap.bsr_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000080000,
+ NULL, HFILL }},
+
+ {&hf_he_broadcast_twt_support,
+ {"Broadcast TWT Support", "wlan.ext_tag.he_mac_cap.broadcast_twt_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000100000,
+ NULL, HFILL }},
+
+ {&hf_he_32_bit_ba_bitmap_support,
+ {"32-bit BA Bitmap Support", "wlan.ext_tag.he_mac_cap.32_bit_ba_bitmap_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000200000,
+ NULL, HFILL }},
+
+ {&hf_he_mu_cascading_support,
+ {"MU Cascading Support", "wlan.ext_tag.he_mac_cap.mu_cascading_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000400000,
+ NULL, HFILL }},
+
+ {&hf_he_ack_enabled_aggregation_support,
+ {"Ack-Enabled Aggregation Support", "wlan.ext_tag.he_mac_cap.ack_enabled_agg_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0000800000,
+ NULL, HFILL }},
+
+ {&hf_he_group_addressed_multi_sta_blkack_support,
+ {"Group Addressed Multi-STA BlockAck in DL MU Support", "wlan.ext_tag.he_mac_cap.i_give_up",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0001000000,
+ NULL, HFILL }},
+
+ {&hf_he_om_control_support,
+ {"OM Control Support", "wlan.ext_tag.he_mac_cap.om_control_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0002000000,
+ NULL, HFILL }},
+
+ {&hf_he_ofdma_ra_support,
+ {"OFDMA RA Support", "wlan.ext_tag.he_mac_cap.ofdma_ra_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0004000000,
+ NULL, HFILL }},
+
+ {&hf_he_max_a_mpdu_length_exponent,
+ {"Maximum A-MPDU Length Exponent", "wlan.ext_tag.he_mac_cap.max_a_mpdu_len_exp",
+ FT_UINT40, BASE_DEC, NULL, 0x0018000000, NULL, HFILL }},
+
+ {&hf_he_a_msdu_fragmentation_support,
+ {"A-MSDU Fragmentation Support", "wlan.ext_tag.he_mac_cap.a_msdu_frag_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0020000000,
+ NULL, HFILL }},
+
+ {&hf_he_flexible_twt_schedule_support,
+ {"Flexible TWT Schedule Support", "wlan.ext_tag.he_mac_cap.flexible_twt_sched_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0040000000,
+ NULL, HFILL }},
+
+ {&hf_he_rx_control_frame_to_multibss,
+ {"Rx Control Frame to MultiBSS", "wlan.ext_tag.he_mac_cap.rx_ctl_frm_multibss",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0080000000,
+ NULL, HFILL }},
+
+ {&hf_he_bsrp_bqrp_a_mpdu_aggregation,
+ {"BSRP BQRP A-MPDU Aggregation", "wlan.ext_tag.he_mac_cap.bsrp_bqrp_a_mpdu_agg",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0100000000,
+ NULL, HFILL }},
+
+ {&hf_he_qtp_support,
+ {"QTP Support", "wlan.ext_tag.he_mac_cap.qtp_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0200000000,
+ NULL, HFILL }},
+
+ {&hf_he_bqr_support,
+ {"BQR Support", "wlan.ext_tag.he_mac_cap.bqr_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0400000000,
+ NULL, HFILL }},
+
+ {&hf_he_sr_responder,
+ {"SR Responder Role", "wlan.ext_tag.he_mac_cap.sr_responder",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x0800000000,
+ NULL, HFILL }},
+
+ {&hf_he_ndp_feedback_report_support,
+ {"NDP Feedback Report Support", "wlan.ext_tag.he_mac_cap.ndp_feedback_report_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x1000000000,
+ NULL, HFILL }},
+
+ {&hf_he_ops_support,
+ {"OPS Support", "wlan.ext_tag.he_mac_cap.ops_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x2000000000,
+ NULL, HFILL }},
+
+ {&hf_he_a_msdu_in_a_mpdu_support,
+ {"A-MSDU in A-MPDU Support", "wlan.ext_tag.he_mac_cap.a_msdu_in_a_mpdu_support",
+ FT_BOOLEAN, 40, TFS(&tfs_supported_not_supported), 0x4000000000,
+ NULL, HFILL }},
+
+ {&hf_he_reserved,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_31",
+ FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
+
+ {&hf_he_reserved_bits_5_7,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bits_5_7",
+ FT_UINT40, BASE_HEX, NULL, 0x00000000E0, NULL, HFILL }},
+
+ {&hf_he_reserved_bits_8_9,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bits_8_9",
+ FT_UINT40, BASE_HEX, NULL, 0x0000000300, NULL, HFILL }},
+
+ {&hf_he_reserved_bit_8,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_8",
+ FT_UINT40, BASE_HEX, NULL, 0x0000000100, NULL, HFILL }},
+
+ {&hf_he_reserved_bit_10,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_10",
+ FT_UINT40, BASE_HEX, NULL, 0x0000000400, NULL, HFILL }},
+
+ {&hf_he_reserved_bit_11,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_11",
+ FT_UINT40, BASE_HEX, NULL, 0x0000000800, NULL, HFILL }},
+
+ {&hf_he_reserved_bit_17,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_17",
+ FT_UINT40, BASE_HEX, NULL, 0x0000020000, NULL, HFILL }},
+
+ {&hf_he_phy_dual_band_support,
+ {"Dual Band Support", "wlan.ext_tag.he_phy_cap.fbytes",
+ FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dual_band_support,
+ {"Dual Band Support", "wlan.ext_tag.he_phy_cap.fbyte.dbs",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
+ NULL, HFILL }},
+
+ {&hf_he_phy_chan_width_set,
+ {"Channel Width Set", "wlan.ext_tag.he_phy_cap.fbytes",
+ FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL }},
+
+ {&hf_he_40mhz_channel_2_4ghz,
+ {"40MHz in 2.4GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.40mhz_in_24ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
+
+ {&hf_he_40_and_80_mhz_5ghz,
+ {"40 & 80MHz in the 5GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.40_80_in_5ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04, NULL, HFILL }},
+
+ {&hf_he_160_mhz_5ghz,
+ {"160MHz in the 5GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.160_in_5ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08, NULL, HFILL }},
+
+ {&hf_he_160_80_plus_80_mhz_5ghz,
+ {"160/80+80MHz in the 5GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.160_80_80_in_5ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10, NULL, HFILL }},
+
+ {&hf_he_242_tone_rus_in_2_4ghz,
+ {"242 tone RUs in the 2.4GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.242_tone_in_2_4ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20, NULL, HFILL }},
+
+ {&hf_he_242_tone_rus_in_5ghz,
+ {"242 tone RUs in the 5GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.242_tone_in_5ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40, NULL, HFILL }},
+
+ {&hf_he_chan_width_reserved,
+ {"Reserved", "wlan.ext_tag.he_phy_cap.chan_width_set.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL }},
+
+ {&hf_he_phy_b8_to_b23,
+ {"Bits 8 to 23", "wlan.ext_tag.he_phy_cap.bits_8_to_23",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_phy_cap_punctured_preamble_rx,
+ {"Punctured Preamble RX", "wlan.ext_tag.he_phy_cap.nbytes.punc_preamble_rx",
+ FT_UINT16, BASE_HEX, NULL, 0x000F, NULL, HFILL }},
+
+ {&hf_he_phy_cap_device_class,
+ {"Device Class", "wlan.ext_tag.he_phy_cap.nbytes.device_class",
+ FT_UINT16, BASE_HEX, NULL, 0x0010, NULL, HFILL }},
+
+ {&hf_he_phy_cap_ldpc_coding_in_payload,
+ {"LDPC Coding In Payload", "wlan.ext_tag.he_phy_cap.nbytes.ldpc_coding_in_payload",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020, NULL, HFILL }},
+
+ {&hf_he_phy_cap_he_su_ppdu_1x_he_ltf_08us,
+ {"HE SU PPDU With 1x HE-LTF and 0.8us GI",
+ "wlan.ext_tag.he_phy_cap.nbytes.he_su_ppdu_with_1x_he_ltf_08us",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
+
+ {&hf_he_phy_cap_midamble_rx_max_nsts,
+ {"Midamble Rx Max NSTS", "wlan.ext_tag.he_phy_cap.mbytes.midamble_rx_max_nsts",
+ FT_UINT16, BASE_HEX, NULL, 0x0180, NULL, HFILL }},
+
+ {&hf_he_phy_cap_ndp_with_4x_he_ltf_32us,
+ {"NDP With 4x HE-LTF and 3.2us GI",
+ "wlan.ext_tag.he_phy_cap.nbytes.ndp_with_4x_he_ltf_4x_3.2us",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
+
+ {&hf_he_phy_cap_stbc_tx_lt_80mhz,
+ {"STBC Tx <= 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.stbc_tx_lt_80hz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
+
+ {&hf_he_phy_cap_stbc_rx_lt_80mhz,
+ {"STBC Rx <= 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.stbc_rx_lt_80hz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dopler_tx,
+ {"Dopler Tx", "wlan.ext_tag.he_phy_cap.nbytes.dopler_tx",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dopler_rx,
+ {"Dopler Rx", "wlan.ext_tag.he_phy_cap.nbytes.stbc_tx_lt_80hz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_full_bw_ul_mu_mimo,
+ {"Full Bandwidth UL MU-MIMO", "wlan.ext_tag.he_phy_cap.nbytes.full_bw_ul_mu_mimo",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x4000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_partial_bw_ul_mu_mimo,
+ {"Partial Bandwidth UL MU-MIMO", "wlan.ext_tag.he_phy_cap.nbytes.partial_bw_ul_mu_mimo",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x8000, NULL, HFILL }},
+
+ {&hf_he_phy_b24_to_b39,
+ {"Bits 24 to 39", "wlan.ext_tag.he_phy_cap.bits_24_to_39",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dcm_max_constellation_tx,
+ {"DCM Max Constellation TX", "wlan.ext_tag.he_phy_cap.nbytes.dcm_max_const_tx",
+ FT_UINT16, BASE_HEX, NULL, 0x0003, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dcm_max_nss_tx,
+ {"DCM Max NSS Tx", "wlan.ext_tag.he_phy_cap.nbytes.dcm_max_nss_tx",
+ FT_UINT16, BASE_HEX, NULL, 0x0004, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dcm_max_constellation_rx,
+ {"DCM Max Constellation Rx", "wlan.ext_tag.he_phy_cap.nbytes.dcm_max_const_rx",
+ FT_UINT16, BASE_HEX, NULL, 0x0018, NULL, HFILL }},
+
+ {&hf_he_phy_cap_dcm_max_nss_rx,
+ {"DCM Max NSS Rx", "wlan.ext_tag.he_phy_cap.nbytes.dcm_max_nss_tx",
+ FT_UINT16, BASE_HEX, NULL, 0x0020, NULL, HFILL }},
+
+ {&hf_he_phy_cap_rx_he_muppdu_from_non_ap,
+ {"Rx HE MU PPDU from Non-AP STA", "wlan.ext_tag.he_phy_cap.nbytes.rx_he_mu_ppdu",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
+
+ {&hf_he_phy_cap_su_beamformer,
+ {"SU Beamformer", "wlan.ext_tag.he_phy_cap.nbytes.su_beamformer",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080, NULL, HFILL }},
+
+ {&hf_he_phy_cap_su_beamformee,
+ {"SU Beamformee", "wlan.ext_tag.he_phy_cap.nbytes.su_beamformee",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
+
+ {&hf_he_phy_cap_mu_beamformer,
+ {"MU Beamformer", "wlan.ext_tag.he_phy_cap.nbytes.mu_beamformer",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
+
+ {&hf_he_phy_cap_beamformer_sts_lte_80mhz,
+ {"Beamformee STS <= 80 Mhz", "wlan.ext_tag.he_phy_cap.nbytes.beamformee_sts_lte_80mhz",
+ FT_UINT16, BASE_HEX, NULL, 0x1C00, NULL, HFILL }},
+
+ {&hf_he_phy_cap_beamformer_sts_gt_80mhz,
+ {"Beamformee STS > 80 Mhz", "wlan.ext_tag.he_phy_cap.nbytes.beamformee_sts_gt_80mhz",
+ FT_UINT16, BASE_HEX, NULL, 0xE000, NULL, HFILL }},
+
+ {&hf_he_phy_b40_to_b55,
+ {"Bits 40 to 55", "wlan.ext_tag.he_phy_cap.bits_40_to_55",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_phy_cap_number_of_sounding_dims_lte_80,
+ {"Number Of Sounding Dimensions <= 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.no_sounding_dims_lte_80",
+ FT_UINT16, BASE_DEC, NULL, 0x0007, NULL, HFILL }},
+
+ {&hf_he_phy_cap_number_of_sounding_dims_gt_80,
+ {"Number Of Sounding Dimensions > 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.no_sounding_dims_gr_80",
+ FT_UINT16, BASE_DEC, NULL, 0x0038, NULL, HFILL }},
+
+ {&hf_he_phy_cap_ng_eq_16_su_fb,
+ {"Ng = 16 SU Feedback", "wlan.ext_tag.he_phy_cap.nbytes.ng_eq_16_su_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
+
+ {&hf_he_phy_cap_ng_eq_16_mu_fb,
+ {"Ng = 16 MU Feedback", "wlan.ext_tag.he_phy_cap.nbytes.ng_eq_16_mu_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080, NULL, HFILL }},
+
+ {&hf_he_phy_cap_codebook_size_eq_4_2_fb,
+ {"Codebook Size SU Feedback", "wlan.ext_tag.he_phy_cap.nbytes.codebook_size_su_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
+
+ {&hf_he_phy_cap_codebook_size_eq_7_5_fb,
+ {"Codebook Size MU Feedback", "wlan.ext_tag.he_phy_cap.nbytes.codebook_size_mu_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
+
+ {&hf_he_phy_cap_triggered_su_beamforming_fb,
+ {"Triggered SU Beamforming Feedback", "wlan.ext_tag.he_phy_cap.nbytes.trig_su_bf_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
+
+ {&hf_he_phy_cap_triggered_mu_beamforming_fb,
+ {"Triggered MU Beamforming Feedback", "wlan.ext_tag.he_phy_cap.nbytes.trig_mu_bf_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
+
+ {&hf_he_phy_cap_triggered_cqi_fb,
+ {"Triggered CQI Feedback", "wlan.ext_tag.he_phy_cap.nbytes.trig_cqi_fb",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_partial_bw_extended_range,
+ {"Partial Bandwidth Extended Range", "wlan.ext_tag.he_phy_cap.nbytes.partial_bw_er",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_partial_bw_dl_mu_mimo,
+ {"Partial Badnwidth DL MU-MIMO", "wlan.ext_tag.he_phy_cap.nbytes.partial_bw_dl_mu_mimo",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x4000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_ppe_threshold_present,
+ {"PPE Threshold Present", "wlan.ext_tag.he_phy_cap.nbytes.ppe_thres_present",
+ FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL }},
+
+ {&hf_he_phy_b56_to_b71,
+ {"Bits 56 to 71", "wlan.ext_tag.he_phy_cap.bits_56_to_71",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_phy_cap_srp_based_sr_support,
+ {"SRP-based SR Support", "wlan.ext_tag.he_phy_cap.nbytes.srp_based_sr_sup",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001, NULL, HFILL }},
+
+ {&hf_he_phy_cap_power_boost_factor_ar_support,
+ {"Power Boost Factor ar Support", "wlan.ext_tag.he_phy_cap.nbytes.pwr_bst_factor_ar_sup",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0002, NULL, HFILL }},
+
+ {&hf_he_phy_cap_he_su_ppdu_etc_gi,
+ {"HE SU PPDU & HE MU PPDU w 4x HE-LTF & 0.8us GI", "wlan.ext_tag.he_phy_cap.nbytes.he_su_ppdu_etc_gi",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0004, NULL, HFILL }},
+
+ {&hf_he_phy_cap_max_nc,
+ {"Max Nc", "wlan.ext_tag.he_phy_cap.nbytes.max_nc",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0038, NULL, HFILL }},
+
+ {&hf_he_phy_cap_stbc_tx_gt_80_mhz,
+ {"STBC Tx > 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.stbc_tx_gt_80_mhz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040, NULL, HFILL }},
+
+ {&hf_he_phy_cap_stbc_rx_gt_80_mhz,
+ {"STBC Rx > 80 Mhz", "wlan.ext_tag.he_phy_cap.nbytes.stbc_rx_gt_80_mhz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080, NULL, HFILL }},
+
+ {&hf_he_phy_cap_he_er_su_ppdu_4xxx_gi,
+ {"HE ER SU PPDU W 4x HE-LTF & 0.8us GI", "wlan.ext_tag.he_phy_cap.nbytes.he_er_su_ppdu_4xxx_gi",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
+
+ {&hf_he_phy_cap_20mhz_in_40mgz_24ghz_band,
+ {"20 MHz In 40 MHz HE PPDU In 2.4GHz Band", "wlan.ext_tag.he_phy_cap.nbytes.20_mhz_in_40_in2_4ghz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
+
+ {&hf_he_phy_cap_20mhz_in_160_80p80_ppdu,
+ {"20 MHz In 160/80+80 MHz HE PPDU", "wlan.ext_tag.he_phy_cap.nbytes.20_mhz_in_160_80p80",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
+
+ {&hf_he_phy_cap_80mgz_in_160_80p80_ppdu,
+ {"80 MHz In 160/80+80 MHz He PPDU", "wlan.ext_tag.he_phy_cap.nbytes.80_mhz_in_160_80p80",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
+
+ {&hf_he_phy_cap_he_er_su_ppdu_1xxx_gi,
+ {"HE ER SU PPDU W 1x HE-LTF & 0.8us GI", "wlan.ext_tag.he_phy_cap.nbytes.he_er_su_ppdu_4xxx_gi",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_midamble_rx_2x_xxx_ltf,
+ {"Midamble Rx 2x & 1x HE-LTF", "wlan.ext_tag.he_phy_cap.nbytes.midamble_rx_2x_1x_he_ltf",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
+
+ {&hf_he_phy_cap_b70_b71_reserved,
+ {"Reserved", "wlan.ext_tag.he_phy_cap.nbytes.reserved_b70_b71",
+ FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_1_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x0003, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_2_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x000C, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_3_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x0030, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_4_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x00C0, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_5_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x0300, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_6_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x0C00, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_7_ss",
+ FT_UINT16, BASE_HEX, NULL, 0x3000, NULL, HFILL }},
+
+ {&hf_he_mcs_max_he_mcs_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_for_8_ss",
+ FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
+
+ {&hf_he_rx_he_mcs_map_lte_80,
+ {"Rx HEX-MCS Map <= 80 Mhz", "wlan.ext_tag.he_mcs_map.rx_he_mcs_map_lte_80",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_tx_he_mcs_map_lte_80,
+ {"Tx HEX-MCS Map <= 80 Mhz", "wlan.ext_tag.he_mcs_map.tx_he_mcs_map_lte_80",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_rx_he_mcs_map_160,
+ {"Rx HEX-MCS Map 160 Mhz", "wlan.ext_tag.he_mcs_map.rx_he_mcs_map_160",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_tx_he_mcs_map_160,
+ {"Tx HEX-MCS Map 160 Mhz", "wlan.ext_tag.he_mcs_map.tx_he_mcs_map_160",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_rx_he_mcs_map_80_80,
+ {"Rx HEX-MCS Map 80+80 Mhz", "wlan.ext_tag.he_mcs_map.rx_he_mcs_map_80_80",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_tx_he_mcs_map_80_80,
+ {"Tx HEX-MCS Map 80+80 Mhz", "wlan.ext_tag.he_mcs_map.tx_he_mcs_map_80_80",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_he_ppe_thresholds_nss,
+ {"NSS", "wlan.ext_tag.he_ppe_thresholds.nss",
+ FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
+
+ {&hf_he_ppe_thresholds_ru_index_bitmask,
+ {"RU Index Bitmask", "wlan.ext_tag.he_ppe_thresholds.ru_index_bitmask",
+ FT_UINT8, BASE_HEX, NULL, 0x78, NULL, HFILL }},
+
+ {&hf_he_ppe_ppet16,
+ {"PPET16","wlan.ext_tag.he_ppe_thresholds.ppet16",
+ FT_UINT8, BASE_HEX, VALS(constellation_vals), 0x0, NULL, HFILL }},
+
+ {&hf_he_ppe_ppet8,
+ {"PPET8","wlan.ext_tag.he_ppe_thresholds.ppet8",
+ FT_UINT8, BASE_HEX, VALS(constellation_vals), 0x0, NULL, HFILL }},
+
+ {&hf_he_operation_parameter,
+ {"HE Operation Parameters", "wlan.ext_tag.he_operation.params",
+ FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_operation_bss_color,
+ {"BSS Color", "wlan.ext_tag.he_operation.he_color",
+ FT_UINT32, BASE_DEC, NULL, 0x0000003f, NULL, HFILL }},
+
+ {&hf_he_operation_default_pe_duration,
+ {"Default PE Duration", "wlan.ext_tag.he_operation.default_pe_duration",
+ FT_UINT32, BASE_DEC, NULL, 0x000001C0, NULL, HFILL }},
+
+ {&hf_he_operation_twt_required,
+ {"TWT Required", "wlan.ext_tag.he_operation.twt_required",
+ FT_BOOLEAN, 32, TFS(&tfs_required_not_required), 0x00000200, NULL, HFILL }},
+
+ {&hf_he_operation_txop_duration_rts_threshold,
+ {"TXOP Duration RTS Threshold", "wlan.ext_tag.he_operation.txop_duration_rts_thresh",
+ FT_UINT32, BASE_DEC, NULL, 0x000FFC00, NULL, HFILL }},
+
+ {&hf_he_operation_partial_bss_color,
+ {"Partial BSS Color", "wlan.ext_tag.he_operation.partial_bss_color",
+ FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL }},
+
+ {&hf_he_operation_vht_operation_information_present,
+ {"VHT Operation Information Present", "wlan.ext_tag.he_operation.vht_op_info_present",
+ FT_BOOLEAN, 32, NULL, 0x00200000, NULL, HFILL }},
+
+ {&hf_he_operation_reserved_b22_b27,
+ {"Reserved", "wlan.ext_tag.he_operation.reserved_b22_b27",
+ FT_UINT32, BASE_HEX, NULL, 0x0FC00000, NULL, HFILL }},
+
+ {&hf_he_operation_multiple_bssid_ap,
+ {"Multiple BSSID AP", "wlan.ext_tag.he_operation.multiple_bssid_ap",
+ FT_BOOLEAN, 32, NULL, 0x10000000, NULL, HFILL }},
+
+ {&hf_he_operation_txbssid_indicator,
+ {"TX BSSID Indicator", "wlan.ext_tag.he_operation.tx_bssid_indicator",
+ FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL }},
+
+ {&hf_he_operation_bss_color_disabled,
+ {"BSS Color Disabled", "wlan.ext_tag.he_operation.bss_color_disabled",
+ FT_BOOLEAN, 32, TFS(&tfs_disabled_enabled), 0x40000000, NULL, HFILL }},
+
+ {&hf_he_operation_reserved_b31,
+ {"Reserved", "wlan.ext_tag.he_operation.reserved_b31",
+ FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL }},
+
+ {&hf_he_operation_basic_mcs,
+ {"Basic HE-MCS and NSS Set", "wlan.ext_tag.he_operation.basic_he_mcs_and_nss",
+ FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_1_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_2_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_3_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_4_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_5_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_6_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_7_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
+
+ {&hf_he_oper_max_he_mcs_for_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_operation.max_he_mcs_for_8_ss",
+ FT_UINT16, BASE_DEC, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
+
+ {&hf_he_operation_channel_width,
+ {"channel Width", "wlan.ext_tag.he_operation.vht_op_info.channel_width",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_operation_channel_center_freq_0,
+ {"Channel Center Frequency Segment 0", "wlan.ext_tag.he_operatoon.vht_op_info.chan_center_freq_seg_0",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_operation_channel_center_freq_1,
+ {"Channel Center Frequency Segment 1", "wlan.ext_tag.he_operatoon.vht_op_info.chan_center_freq_seg_1",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_operation_max_bssid_indicator,
+ {"MaxBSSID Indicator", "wlan.ext_tag.he_operation.maxbssid_indicator",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_muac_aci_aifsn,
+ {"AIC/AIFSN","wlan.ext_tag.mu_edca_parameter_set.aic_aifsn",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_mu_edca_timer,
+ {"MU EDCA Timer","wlan.ext_tag.mu_edca_parameter_set.mu_edca_timer",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_muac_ecwmin_ecwmax,
+ {"ECWmin/ECWmax","wlan.ext_tag.mu_edca_parameter_set.ecwmin_ecwmax",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_spatial_reuse_sr_control,
+ {"SR Control", "wlan.ext_tag.spatial_reuse.sr_control",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_srp_disallowed,
+ {"SRP Disallowed", "wlan.ext_tag.spatial_reuse.sr_control.srp_dis",
+ FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
+
+ {&hf_he_non_srg_obss_pd_sr_disallowed,
+ {"NON-SRG OBSS PD SR Disallowed", "wlan.ext_tag.spatial_reuse.sr_control.non_srg_obss_pd_sr_dis",
+ FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
+
+ {&hf_he_non_srg_offset_present,
+ {"Non-SRG Offset Present", "wlan.ext_tag.spatial_reuse.sr_control.non_srg_ofs_present",
+ FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL }},
+
+ {&hf_he_srg_information_present,
+ {"SRG Information Present", "wlan.ext_tag.spatial_reuse.sr_control.srg_info_present",
+ FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL }},
+
+ {&hf_he_hesiga_spatial_reuse_value15_allowed,
+ {"HESIGA Spatial Reuse value 15 allowed", "wlan.ext_tag.spatial_reuse.sr_control.hesiga_val_15_allowed",
+ FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL }},
+
+ {&hf_he_sr_control_reserved,
+ {"Reserved", "wlan.ext_tag.spatial_reuse.sr_control.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL }},
+
+ {&hf_he_spatial_non_srg_obss_pd_max_offset,
+ {"Non-SRG OBSS PD Max Offset", "wlan.ext_tag.spatial_reuse.non_srg_obss_pd_max_offset",
+ FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_spatial_srg_obss_pd_min_offset,
+ {"SRG OBSS PD Min Offset", "wlan.ext_tag.spatial_reuse.srg_obss_pd_min_offset",
+ FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_spatial_srg_obss_pd_max_offset,
+ {"SRG OBSS PD Max Offset", "wlan.ext_tag.spatial_reuse.srg_obss_pd_max_offset",
+ FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_spatial_srg_bss_color_bitmap,
+ {"SRG BSS Color Bitmap", "wlan.ext_tag.spatial_reuse.srg_bss_color_bitmap",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_spatial_srg_partial_bssid_bitmap,
+ {"SRG Partial BSSID Bitmap", "wlan.ext_tag.spatial_reuse.srg_partial_bssid_bitmap",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_resource_request_buffer_thresh,
+ {"Resource Request Buffer Threshold Exponent", "wlan.ext_tag.ndp_feedback.res_req_buf_thresh_exp",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_bss_color_change_new_color_info,
+ {"New BSS Color Info", "wlan.ext_tag.bss_color_change.new_color_info",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_new_bss_color_info_color,
+ {"New BSS Color", "wlan.ext_tag.bss_color_change.new_bss_color",
+ FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL }},
+
+ {&hf_he_new_bss_color_info_reserved,
+ {"Reserved", "wlan.ext_tag.bss_color_change.new_color_reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL }},
+
+ {&hf_he_bss_color_change_switch_countdown,
+ {"BSS Color Switch Countdown", "wlan.ext_tag.bss_color_change.color_switch_countdown",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_ess_report_planned_ess,
+ {"Planned ESS", "wlan.ext_tag.ess_report.ess_info.planned_ess",
+ FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL }},
+
+ {&hf_he_ess_report_edge_of_ess,
+ {"Edge of ESS", "wlan.ext_tag.ess_report.ess_info.edge_of_ess",
+ FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL }},
+
+ {&hf_he_ess_report_info_field,
+ {"ESS Information field", "wlan.ext_tag.ess_report.ess_info.field",
+ FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL }},
+
+ {&hf_he_ess_report_recommend_transition_thresh,
+ {"Recommended BSS Transition Threshold", "wlan.ext_tag.ess_report.ess_info.thresh",
+ FT_UINT8, BASE_DEC, NULL, 0xFC, NULL, HFILL }},
+
+ {&hf_he_uora_field,
+ {"UL OFDMA-based Random Access Parameter SET", "wlan.ext_tag.uora_parameter_set.field",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+
+ {&hf_he_uora_eocwmin,
+ {"EOCWmin", "wlan.ext_tag.uora_parameter_set.eocwmin",
+ FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
+
+ {&hf_he_uora_owcwmax,
+ {"EOCWmax", "wlan.ext_tag.uora_parameter_set.eocwmax",
+ FT_UINT8, BASE_DEC, NULL, 0x38, NULL, HFILL }},
+
+ {&hf_he_uora_reserved,
+ {"Reserved", "wlan.ext_tag.uora_parameter_set.reserved",
+ FT_UINT8, BASE_DEC, NULL, 0xC0, NULL, HFILL }},
};
static hf_register_info aggregate_fields[] = {
@@ -28633,6 +30728,7 @@ proto_register_ieee80211(void)
&ett_hta_cap2_tree,
&ett_htc_tree,
+ &ett_htc_he_a_control,
&ett_mfb_subtree,
&ett_lac_subtree,
@@ -28682,6 +30778,7 @@ proto_register_ieee80211(void)
&ett_tag_ex_cap7,
&ett_tag_ex_cap8,
&ett_tag_ex_cap89,
+ &ett_tag_ex_cap10,
&ett_tag_rm_cap1,
&ett_tag_rm_cap2,
@@ -28768,7 +30865,38 @@ proto_register_ieee80211(void)
&ett_sta_info,
&ett_gas_resp_fragment,
- &ett_gas_resp_fragments
+ &ett_gas_resp_fragments,
+
+ /* 802.11ax trees */
+ &ett_he_mac_capabilities,
+ &ett_he_phy_capabilities,
+ &ett_he_phy_cap_first_byte,
+ &ett_he_phy_cap_chan_width_set,
+ &ett_he_phy_cap_b8_to_b23,
+ &ett_he_phy_cap_b24_to_b39,
+ &ett_he_phy_cap_b40_to_b55,
+ &ett_he_phy_cap_b56_to_b71,
+ &ett_he_mcs_and_nss_set,
+ &ett_he_rx_tx_he_mcs_map_lte_80,
+ &ett_he_rx_mcs_map_lte_80,
+ &ett_he_tx_mcs_map_lte_80,
+ &ett_he_rx_tx_he_mcs_map_160,
+ &ett_he_rx_mcs_map_160,
+ &ett_he_tx_mcs_map_160,
+ &ett_he_rx_tx_he_mcs_map_80_80,
+ &ett_he_rx_mcs_map_80_80,
+ &ett_he_tx_mcs_map_80_80,
+ &ett_he_ppe_threshold,
+ &ett_he_ppe_nss,
+ &ett_he_ppe_ru_alloc,
+ &ett_he_operation_params,
+ &ett_he_oper_basic_mcs,
+ &ett_he_operation_vht_op_info,
+ &ett_he_mu_edca_param,
+ &ett_he_uora_tree,
+ &ett_he_spatial_reuse_control,
+ &ett_he_ess_report_info_field,
+ &ett_he_bss_new_color_info,
};
static ei_register_info ei[] = {
diff --git a/epan/dissectors/packet-ieee80211.h b/epan/dissectors/packet-ieee80211.h
index e899e82c5f..5fa11fc08f 100644
--- a/epan/dissectors/packet-ieee80211.h
+++ b/epan/dissectors/packet-ieee80211.h
@@ -194,6 +194,7 @@ gboolean is_broadcast_bssid(const address *bssid);
* COMPOSE_FRAME_TYPE() values for control frames.
* 0x160 - 0x16A are for control frame extension where type = 1 and subtype =6.
*/
+#define CTRL_TRIGGER 0x12 /* HE Trigger */
#define CTRL_BEAMFORM_RPT_POLL 0x14 /* Beamforming Report */
#define CTRL_VHT_NDP_ANNC 0x15 /* VHT NDP Announcement */
#define CTRL_POLL 0x162 /* Poll */