* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * SPDX-License-Identifier: GPL-2.0-or-later
*
* Credits:
*
#include "packet-sflow.h"
#include "packet-gre.h"
-#include <epan/crypt/airpdcap_ws.h>
+#include <epan/crypt/dot11decrypt_ws.h>
void proto_register_ieee80211(void);
void proto_reg_handoff_ieee80211(void);
#define WLAN_IGNORE_PROT_W_IV 2
static gint wlan_ignore_prot = WLAN_IGNORE_PROT_NO;
+/* The Key MIC len has been set by the user */
+static guint wlan_key_mic_len = 0;
+
/* Table for reassembly of fragments. */
static reassembly_table wlan_reassembly_table;
dk_type = dk->type;
free_key_string(dk);
switch (dk_type) {
- case AIRPDCAP_KEY_TYPE_WEP:
- case AIRPDCAP_KEY_TYPE_WEP_40:
- case AIRPDCAP_KEY_TYPE_WEP_104:
- if (rec->key != AIRPDCAP_KEY_TYPE_WEP) {
+ case DOT11DECRYPT_KEY_TYPE_WEP:
+ case DOT11DECRYPT_KEY_TYPE_WEP_40:
+ case DOT11DECRYPT_KEY_TYPE_WEP_104:
+ if (rec->key != DOT11DECRYPT_KEY_TYPE_WEP) {
*err = g_strdup("Invalid key format");
return FALSE;
}
break;
- case AIRPDCAP_KEY_TYPE_WPA_PWD:
- if (rec->key != AIRPDCAP_KEY_TYPE_WPA_PWD) {
+ case DOT11DECRYPT_KEY_TYPE_WPA_PWD:
+ if (rec->key != DOT11DECRYPT_KEY_TYPE_WPA_PWD) {
*err = g_strdup("Invalid key format");
return FALSE;
}
break;
- case AIRPDCAP_KEY_TYPE_WPA_PSK:
- if (rec->key != AIRPDCAP_KEY_TYPE_WPA_PSK) {
+ case DOT11DECRYPT_KEY_TYPE_WPA_PSK:
+ if (rec->key != DOT11DECRYPT_KEY_TYPE_WPA_PSK) {
*err = g_strdup("Invalid key format");
return FALSE;
}
proto_tree *tree, int tagged_parameters_len, int ftype,
association_sanity_check_t *association_sanity_check);
-static tvbuff_t *try_decrypt(tvbuff_t *tvb, packet_info *pinfo, guint32 offset, guint32 len, guint8 *algorithm, guint32 *sec_header, guint32 *sec_trailer, PAIRPDCAP_KEY_ITEM used_key);
+static tvbuff_t *try_decrypt(tvbuff_t *tvb, packet_info *pinfo, guint32 offset, guint32 len, guint8 *algorithm, guint32 *sec_header, guint32 *sec_trailer, PDOT11DECRYPT_KEY_ITEM used_key);
static int weak_iv(guchar *iv);
/* ************************************************************************* */
#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. */
* 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
#define TAG_MCCAOP_ADVERTISEMENT_OV 174
#define TAG_QUIET_PERIOD_REQ 175 /* IEEE Std 802.11ad */
#define TAG_QUIET_PERIOD_RES 177 /* IEEE Std 802.11ad */
-#define TAG_ECPAC_POLICY 182 /* IEEE Std 802.11ad */
+#define TAG_ECAPC_POLICY 182 /* IEEE Std 802.11ad */
#define TAG_CLUSTER_TIME_OFFSET 183 /* IEEE Std 802.11ad */
#define TAG_ANTENNA_SECTOR_ID 190 /* IEEE Std 802.11ad */
#define TAG_VHT_CAPABILITY 191 /* IEEE Std 802.11ac/D3.1 */
{ TAG_MCCAOP_ADVERTISEMENT_OV, "MCCAOP Advertisement Overview" },
{ TAG_QUIET_PERIOD_REQ, "Quiet Period Request" },
{ TAG_QUIET_PERIOD_RES, "Quiet Period Response" },
- { TAG_ECPAC_POLICY, "ECPAC Policy" },
+ { TAG_ECAPC_POLICY, "ECAPC Policy" },
{ TAG_CLUSTER_TIME_OFFSET, "Cluster Time Offset" },
{ TAG_ANTENNA_SECTOR_ID, "Antenna Sector ID" },
- { TAG_VHT_CAPABILITY, "VHT Capabilities (IEEE Std 802.11ac/D3.1)" },
- { TAG_VHT_OPERATION, "VHT Operation (IEEE Std 802.11ac/D3.1)" },
+ { TAG_VHT_CAPABILITY, "VHT Capabilities" },
+ { TAG_VHT_OPERATION, "VHT Operation" },
{ TAG_EXT_BSS_LOAD, "Extended BSS Load" },
{ TAG_WIDE_BW_CHANNEL_SWITCH, "Wide Bandwidth Channel Switch" },
- { TAG_VHT_TX_PWR_ENVELOPE, "VHT Tx Power Envelope (IEEE Std 802.11ac/D5.0)" },
+ { TAG_VHT_TX_PWR_ENVELOPE, "VHT Tx Power Envelope" },
{ TAG_CHANNEL_SWITCH_WRAPPER, "Channel Switch Wrapper" },
{ TAG_OPERATING_MODE_NOTIFICATION, "Operating Mode Notification" },
{ TAG_VENDOR_SPECIFIC_IE, "Vendor Specific" },
#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" },
{ 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);
static const value_string wfa_subtype_vals[] = {
+ { WFA_SUBTYPE_SUBSCRIPTION_REMEDIATION, "Subscription Remediation" },
+ { WFA_SUBTYPE_DEAUTHENTICATION_IMMINENT, "Deauthentication Imminent" },
{ WFA_SUBTYPE_P2P, "P2P" },
{ WFA_SUBTYPE_HS20_INDICATION, "Hotspot 2.0 Indication" },
{ WFA_SUBTYPE_HS20_ANQP, "Hotspot 2.0 ANQP" },
+ { WFA_SUBTYPE_OSEN, "OSU Server-only l2 Encryption Network" },
{ WFA_SUBTYPE_DPP, "Device Provisioning Protocol" },
{ WFA_SUBTYPE_IEEE1905_MULTI_AP, "IEEE1905 Multi-AP" },
{ 0, NULL }
{ 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);
{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"},
#define CAT_ROBUST_AV_STREAMING 19
#define CAT_UNPROTECTED_DMG 20
#define CAT_VHT 21
+#define CAT_HE 30
+#define CAT_PROTECTED_HE 31
#define CAT_VENDOR_SPECIFIC_PROTECTED 126
#define CAT_VENDOR_SPECIFIC 127
#define MRVL_MESH_MGMT_ACTION_RERR 2
#define MRVL_MESH_MGMT_ACTION_PLDM 3
-#define ANQP_INFO_ANQP_QUERY_LIST 256
-#define ANQP_INFO_ANQP_CAPAB_LIST 257
-#define ANQP_INFO_VENUE_NAME_INFO 258
-#define ANQP_INFO_EMERGENCY_CALL_NUMBER_INFO 259
-#define ANQP_INFO_NETWORK_AUTH_TYPE_INFO 260
-#define ANQP_INFO_ROAMING_CONSORTIUM_LIST 261
+#define ANQP_INFO_ANQP_QUERY_LIST 256
+#define ANQP_INFO_ANQP_CAPAB_LIST 257
+#define ANQP_INFO_VENUE_NAME_INFO 258
+#define ANQP_INFO_EMERGENCY_CALL_NUMBER_INFO 259
+#define ANQP_INFO_NETWORK_AUTH_TYPE_INFO 260
+#define ANQP_INFO_ROAMING_CONSORTIUM_LIST 261
#define ANQP_INFO_IP_ADDR_TYPE_AVAILABILITY_INFO 262
-#define ANQP_INFO_NAI_REALM_LIST 263
-#define ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO 264
-#define ANQP_INFO_AP_GEOSPATIAL_LOCATION 265
-#define ANQP_INFO_AP_CIVIC_LOCATION 266
-#define ANQP_INFO_AP_LOCATION_PUBLIC_ID_URI 267
-#define ANQP_INFO_DOMAIN_NAME_LIST 268
-#define ANQP_INFO_EMERGENCY_ALERT_ID_URI 269
-#define ANQP_INFO_TDLS_CAPAB_INFO 270
-#define ANQP_INFO_EMERGENCY_NAI 271
-#define ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST 56797
+#define ANQP_INFO_NAI_REALM_LIST 263
+#define ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO 264
+#define ANQP_INFO_AP_GEOSPATIAL_LOCATION 265
+#define ANQP_INFO_AP_CIVIC_LOCATION 266
+#define ANQP_INFO_AP_LOCATION_PUBLIC_ID_URI 267
+#define ANQP_INFO_DOMAIN_NAME_LIST 268
+#define ANQP_INFO_EMERGENCY_ALERT_ID_URI 269
+#define ANQP_INFO_TDLS_CAPAB_INFO 270
+#define ANQP_INFO_EMERGENCY_NAI 271
+#define ANQP_INFO_NEIGHBOR_REPORT 272
+#define ANQP_INFO_VENUE_URL 277
+#define ANQP_INFO_ADVICE_OF_CHARGE 278
+#define ANQP_INFO_LOCAL_CONTENT 279
+#define ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST 56797
/* ANQP information ID - IEEE Std 802.11u-2011 - Table 7-43bk */
static const value_string anqp_info_id_vals[] = {
{ANQP_INFO_EMERGENCY_ALERT_ID_URI, "Emergency Alert Identifier URI"},
{ANQP_INFO_TDLS_CAPAB_INFO, "TDLS Capability information"},
{ANQP_INFO_EMERGENCY_NAI, "Emergency NAI"},
+ {ANQP_INFO_NEIGHBOR_REPORT, "Neighbor Report"},
+ {ANQP_INFO_VENUE_URL, "Venue URL"},
+ {ANQP_INFO_ADVICE_OF_CHARGE, "Advice of Charge"},
+ {ANQP_INFO_LOCAL_CONTENT, "Local Content"},
{ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST, "ANQP vendor-specific list"},
{0, NULL}
};
{CAT_ROBUST_AV_STREAMING, "Robust AV Streaming"},
{CAT_UNPROTECTED_DMG, "Unprotected DMG"},
{CAT_VHT, "VHT"},
+ {CAT_HE, "HE"},
+ {CAT_PROTECTED_HE, "Protected HE"},
{CAT_VENDOR_SPECIFIC_PROTECTED, "Vendor-specific Protected"},
{CAT_VENDOR_SPECIFIC, "Vendor Specific"},
#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
{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}
};
"Immediate Acknowledgement Required"
};
-static const value_string ieee80211_block_ack_request_type_flags[] = {
- {0x00, "Basic Block Ack Request"},
- {0x01, "Reserved"},
- {0x02, "Compressed Block Ack Request"},
- {0x03, "Multi-TID Block Ack Request"},
- {0x00, NULL}
-};
-
-static const value_string ieee80211_block_ack_type_flags[] = {
- {0x00, "Basic Block Ack"},
- {0x01, "Reserved"},
- {0x02, "Compressed Block"},
- {0x03, "Multi-TID Block"},
- {0x00, NULL}
-};
-
static const value_string ft_action_codes[] = {
{FT_ACTION_REQUEST, "FT Request"},
{FT_ACTION_RESPONSE, "FT Response"},
{0x00, NULL}
};
-static const true_false_string ht_info_channel_width_flag = {
+static const true_false_string ht_info_channel_sta_width_flag = {
"Channel of any width supported",
"20 MHz channel width only"
};
"Prohibited"
};
-static const true_false_string ht_info_psmp_stas_only_flag = {
- "Association requests are accepted from only PSMP capable STA",
- "Association requests are accepted regardless of PSMP capability"
-};
-
-static const value_string ht_info_service_interval_granularity_flags[] = {
- {0x00, "5 ms"},
- {0x01, "10 ms"},
- {0x02, "15 ms"},
- {0x03, "20 ms"},
- {0x04, "25 ms"},
- {0x05, "30 ms"},
- {0x06, "35 ms"},
- {0x07, "40 ms"},
- {0x00, NULL}
-};
-
-static const value_string ht_info_operating_mode_flags[] = {
- {0x00, "All STAs are - 20/40 MHz HT or in a 20/40 MHz BSS or are 20 MHz HT in a 20 MHz BSS"},
+static const value_string ht_info_operating_protection_mode_flags[] = {
+ {0x00, "No protection mode"},
{0x01, "HT non-member protection mode"},
- {0x02, "Only HT STAs in the BSS, however, there exists at least one 20 MHz STA"},
- {0x03, "HT mixed mode"},
+ {0x02, "20 MHz protection mode"},
+ {0x03, "non-HT mixed mode"},
{0x00, NULL}
};
"All associated STAs are greenfield capable"
};
-static const true_false_string ht_info_transmit_burst_limit_flag = {
- "2.4 GHz - 6.16 ms | All other bands - 3.08 ms",
- "No limit"
-};
-
static const true_false_string ht_info_obss_non_ht_stas_present_flag = {
"Use of protection for non-HT STAs by overlapping BSSs is needed",
"Use of protection for non-HT STAs by overlapping BSSs is not needed"
"No second beacon is transmitted"
};
-static const true_false_string ht_info_dual_cts_protection_flag = {
- "Required",
- "Not required"
-};
-
static const true_false_string ht_info_secondary_beacon_flag = {
- "Secondary beacon",
+ "STBC beacon",
"Primary beacon"
};
};
static const value_string wep_type_vals[] = {
- { AIRPDCAP_KEY_TYPE_WEP, STRING_KEY_TYPE_WEP },
- { AIRPDCAP_KEY_TYPE_WPA_PWD, STRING_KEY_TYPE_WPA_PWD },
- { AIRPDCAP_KEY_TYPE_WPA_PSK, STRING_KEY_TYPE_WPA_PSK },
+ { DOT11DECRYPT_KEY_TYPE_WEP, STRING_KEY_TYPE_WEP },
+ { DOT11DECRYPT_KEY_TYPE_WPA_PWD, STRING_KEY_TYPE_WPA_PWD },
+ { DOT11DECRYPT_KEY_TYPE_WPA_PSK, STRING_KEY_TYPE_WPA_PSK },
{ 0x00, NULL }
};
{0, NULL}
};
+static const value_string extended_sc_mcs[] = {
+ {0x0, "None"},
+ {0x1, "MCS 9.1"},
+ {0x2, "MCS 12.1"},
+ {0x3, "MCS 12.2"},
+ {0x4, "MCS 12.3"},
+ {0x5, "MCS 12.4"},
+ {0x6, "MCS 12.5"},
+ {0x7, "MCS 12.6"},
+ {0, NULL}
+};
+
+static const range_string max_basic_sf_amsdu[] = {
+ {0, 0, "No Limit"},
+ {1, 1, "4 Basic subframes"},
+ {2, 2, "8 Basic subframes"},
+ {3, 3, "16 Basic subframes"},
+ {4, 4, "32 Basic subframes"},
+ {5, 5, "64 Basic subframes"},
+ {6, 6, "128 Basic subframes"},
+ {7, 7, "256 Basic subframes"},
+ {8, 255, "reserved"},
+ {0, 0, NULL}
+};
+
+static const range_string max_short_sf_amsdu[] = {
+ {0, 0, "No Limit"},
+ {1, 1, "32 Short subframes"},
+ {2, 2, "64 Short subframes"},
+ {3, 3, "128 Short subframes"},
+ {4, 4, "256 Short subframes"},
+ {5, 5, "512 Short subframes"},
+ {6, 6, "1024 Short subframes"},
+ {7, 255, "reserved"},
+ {0, 0, NULL}
+};
+
static const value_string allocation_type[] = {
{0x0, "SP Allocation"},
- {0x4, "CBAP allocation"},
+ {0x1, "CBAP allocation"},
{0, NULL}
};
{0x00, "20 MHz"},
{0x01, "40 MHz"},
{0x02, "80 MHz"},
- {0x03, "160 MHz / 80+80 Mhz"},
+ {0x03, "160 MHz / 80+80 MHz"},
{0, NULL}
};
{0, NULL}
};
-
static int proto_wlan = -1;
static int proto_centrino = -1;
static int proto_aggregate = -1;
static int hf_ieee80211_qos_queue_size = -1;
/* ************************************************************************* */
-/* Header values for HT control field (+HTC) */
+/* Header values for HT control field (+HTC) and HE control */
/* ************************************************************************* */
/* 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_ul_reserved = -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_om_reserved = -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_hla_reserved = -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_uph_reserved = -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_cci_reserved = -1;
+static int hf_ieee80211_he_btc_avail_chan = -1;
+static int hf_ieee80211_he_btc_reserved = -1;
+static int hf_ieee80211_he_trigger_common_info = -1;
+static int hf_ieee80211_he_trigger_type = -1;
+static int hf_ieee80211_he_trigger_length = -1;
+static int hf_ieee80211_he_trigger_cascade_indication = -1;
+static int hf_ieee80211_he_trigger_cs_required = -1;
+static int hf_ieee80211_he_trigger_bw = -1;
+static int hf_ieee80211_he_trigger_gi_and_ltf_type = -1;
+static int hf_ieee80211_he_trigger_mu_mimo_ltf_mode = -1;
+static int hf_ieee80211_he_trigger_num_he_ltf_syms_etc = -1;
+static int hf_ieee80211_he_trigger_stbc = -1;
+static int hf_ieee80211_he_trigger_ldpc_extra_sym_seg = -1;
+static int hf_ieee80211_he_trigger_ap_tx_power = -1;
+static int hf_ieee80211_he_trigger_packet_extension = -1;
+static int hf_ieee80211_he_trigger_spatial_reuse = -1;
+static int hf_ieee80211_he_trigger_doppler = -1;
+static int hf_ieee80211_he_trigger_he_sig_a_reserved = -1;
+static int hf_ieee80211_he_trigger_reserved = -1;
+static int hf_ieee80211_he_trigger_bar_ctrl = -1;
+static int hf_ieee80211_he_trigger_bar_ctrl_ba_ack_policy = -1;
+static int hf_ieee80211_he_trigger_bar_ctrl_ba_type = -1;
+static int hf_ieee80211_he_trigger_bar_ctrl_reserved = -1;
+static int hf_ieee80211_he_trigger_bar_ctrl_tid_info = -1;
+static int hf_ieee80211_he_trigger_bar_info = -1;
+static int hf_ieee80211_he_trigger_bar_info_blk_ack_seq_ctrl = -1;
+static int hf_ieee80211_he_trigger_mpdu_mu_spacing = -1;
+static int hf_ieee80211_he_trigger_tid_aggregation_limit = -1;
+static int hf_ieee80211_he_trigger_dependent_reserved1 = -1;
+static int hf_ieee80211_he_trigger_preferred_ac = -1;
+static int hf_ieee80211_he_trigger_user_info = -1;
+static int hf_ieee80211_he_trigger_starting_aid = -1;
+static int hf_ieee80211_he_trigger_dependent_reserved2 = -1;
+static int hf_ieee80211_he_trigger_feedback_type = -1;
+static int hf_ieee80211_he_trigger_dependent_reserved3 = -1;
+static int hf_ieee80211_he_trigger_nfrp_target_rssi = -1;
+static int hf_ieee80211_he_trigger_multiplexing_flag = -1;
+static int hf_ieee80211_he_trigger_dep_nfrp_user_info = -1;
+static int hf_ieee80211_he_trigger_feedback_seg_retrans_bm = -1;
+static int hf_ieee80211_he_trigger_aid12 = -1;
+static int hf_ieee80211_he_trigger_ru_allocation = -1;
+static int hf_ieee80211_he_trigger_coding_type = -1;
+static int hf_ieee80211_he_trigger_mcs = -1;
+static int hf_ieee80211_he_trigger_dcm = -1;
+static int hf_ieee80211_he_trigger_ss_allocation = -1;
+static int hf_ieee80211_he_trigger_target_rssi = -1;
+static int hf_ieee80211_he_trigger_user_reserved = -1;
+static int hf_ieee80211_he_trigger_dep_basic_user_info = -1;
+static int hf_ieee80211_he_ndp_annc_token = -1;
+static int hf_ieee80211_he_ndp_annc_sta = -1;
+static int hf_he_ndp_sounding_dialog_token_number = -1;
+static int hf_he_ndp_annc_he_subfield = -1;
+static int hf_he_ndp_annc_reserved = -1;
+static int hf_he_ndp_annc_aid11 = -1;
+static int hf_he_ndp_annc_partial_bw_info = -1;
+static int hf_he_ndp_annc_feedback_type_and_ng = -1;
+static int hf_he_ndp_annc_disambiguation = -1;
+static int hf_he_ndp_annc_codebook_size = -1;
+static int hf_he_ndp_annc_nc = -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;
static int hf_ieee80211_3gpp_gc_udhl = -1;
static int hf_ieee80211_3gpp_gc_iei = -1;
static int hf_ieee80211_3gpp_gc_num_plmns = -1;
+static int hf_ieee80211_3gpp_gc_plmn = -1;
static int hf_ieee80211_3gpp_gc_plmn_len = -1;
static int hf_ieee80211_ff_anqp_domain_name_len = -1;
static int hf_ieee80211_ff_anqp_domain_name = -1;
static int hf_ieee80211_ff_sa_query_action_code = -1;
static int hf_ieee80211_ff_transaction_id = -1;
+static int hf_ieee80211_ff_send_confirm = -1;
+static int hf_ieee80211_ff_anti_clogging_token = -1;
+static int hf_ieee80211_ff_scalar = -1;
+static int hf_ieee80211_ff_finite_field_element = -1;
+static int hf_ieee80211_ff_confirm = -1;
+static int hf_ieee80211_ff_finite_cyclic_group = -1;
+
/* Vendor specific */
static int hf_ieee80211_ff_marvell_action_type = -1;
static int hf_ieee80211_ff_marvell_mesh_mgt_action_code = -1;
static int hf_ieee80211_fc_analysis_tk = -1;
static int hf_ieee80211_fc_analysis_gtk = -1;
-static int hf_ieee80211_block_ack_request_control = -1;
static int hf_ieee80211_block_ack_control = -1;
static int hf_ieee80211_block_ack_control_ack_policy = -1;
-static int hf_ieee80211_block_ack_control_multi_tid = -1;
-static int hf_ieee80211_block_ack_control_compressed_bitmap = -1;
+static int hf_ieee80211_block_ack_control_type = -1;
static int hf_ieee80211_block_ack_control_reserved = -1;
+static int hf_ieee80211_block_ack_control_tid_info = -1;
+static int hf_ieee80211_block_ack_multi_sta_aid11 = -1;
+static int hf_ieee80211_block_ack_multi_sta_ack_type = -1;
+static int hf_ieee80211_block_ack_multi_sta_tid = -1;
+static int hf_ieee80211_block_ack_multi_sta_aid_tid = -1;
+static int hf_ieee80211_block_ack_multi_sta_reserved = -1;
+static int hf_ieee80211_block_ack_multi_sta_ra = -1;
-static int hf_ieee80211_block_ack_control_basic_tid_info = -1;
-static int hf_ieee80211_block_ack_control_compressed_tid_info = -1;
-static int hf_ieee80211_block_ack_control_multi_tid_info = -1;
-
-static int hf_ieee80211_block_ack_multi_tid_info = -1;
-static int hf_ieee80211_block_ack_request_type = -1;
static int hf_ieee80211_block_ack_multi_tid_reserved = -1;
static int hf_ieee80211_block_ack_multi_tid_value = -1;
-static int hf_ieee80211_block_ack_type = -1;
static int hf_ieee80211_block_ack_bitmap = -1;
static int hf_ieee80211_block_ack_bitmap_missing_frame = -1;
+static int hf_ieee80211_block_ack_gcr_addr = -1;
static int hf_ieee80211_tag_measure_request_measurement_mode = -1;
static int hf_ieee80211_tag_measure_request_bssid = -1;
static int hf_ieee80211_ht_info_delimiter1 = -1;
static int hf_ieee80211_ht_info_secondary_channel_offset = -1;
-static int hf_ieee80211_ht_info_channel_width = -1;
+static int hf_ieee80211_ht_info_sta_channel_width = -1;
static int hf_ieee80211_ht_info_rifs_mode = -1;
-static int hf_ieee80211_ht_info_psmp_stas_only = -1;
-static int hf_ieee80211_ht_info_service_interval_granularity = -1;
+static int hf_ieee80211_ht_info_reserved_b4_b7 = -1;
static int hf_ieee80211_ht_info_delimiter2 = -1;
-static int hf_ieee80211_ht_info_operating_mode = -1;
+static int hf_ieee80211_ht_info_protection = -1;
static int hf_ieee80211_ht_info_non_greenfield_sta_present = -1;
-static int hf_ieee80211_ht_info_transmit_burst_limit = -1;
+static int hf_ieee80211_ht_info_reserved_b11 = -1;
static int hf_ieee80211_ht_info_obss_non_ht_stas_present = -1;
-static int hf_ieee80211_ht_info_reserved_1 = -1;
+static int hf_ieee80211_ht_info_channel_center_freq_seg_2 = -1;
+static int hf_ieee80211_ht_info_reserved_b21_b23 = -1;
static int hf_ieee80211_ht_info_delimiter3 = -1;
-static int hf_ieee80211_ht_info_reserved_2 = -1;
+static int hf_ieee80211_ht_info_reserved_b24_b29 = -1;
static int hf_ieee80211_ht_info_dual_beacon = -1;
static int hf_ieee80211_ht_info_dual_cts_protection = -1;
static int hf_ieee80211_ht_info_secondary_beacon = -1;
static int hf_ieee80211_ht_info_lsig_txop_protection_full_support = -1;
static int hf_ieee80211_ht_info_pco_active = -1;
static int hf_ieee80211_ht_info_pco_phase = -1;
-static int hf_ieee80211_ht_info_reserved_3 = -1;
+static int hf_ieee80211_ht_info_reserved_b36_b39 = -1;
/*** End: 802.11n D1.10 - HT Information IE ***/
static int hf_ieee80211_tag_ap_channel_report_operating_class = -1;
static int hf_ieee80211_tag_extended_capabilities_b46 = -1;
static int hf_ieee80211_tag_extended_capabilities_b47 = -1;
static int hf_ieee80211_tag_extended_capabilities_b48 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b49 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b50 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b51 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b52 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b53 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b54 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b55 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b56 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b57 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b58 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b59 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b60 = -1;
static int hf_ieee80211_tag_extended_capabilities_b61 = -1;
static int hf_ieee80211_tag_extended_capabilities_b62 = -1;
static int hf_ieee80211_tag_extended_capabilities_b63 = -1;
-static int hf_ieee80211_tag_extended_capabilities_b64 = -1;
-static int hf_ieee80211_tag_extended_capabilities_o7 = -1;
-static int hf_ieee80211_tag_extended_capabilities_o8 = -1;
-static int hf_ieee80211_tag_extended_capabilities_o9 = -1;
+/* Used for the two-byte ext-cap field when present */
+static int hf_ieee80211_tag_extended_capabilities_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b56_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b57_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b58_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b59_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b60_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b61_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b62_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_max_num_msdus = -1;
+static int hf_ieee80211_tag_extended_capabilities_b65_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b66_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b67_2 = -1;
+static int hf_ieee80211_tag_extended_capabilities_b68_2 = -1;
+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_vht_link_adaptation_cap = -1;
static int hf_ieee80211_vht_rx_pattern = -1;
static int hf_ieee80211_vht_tx_pattern = -1;
-static int hf_ieee80211_vht_reserv = -1;
+static int hf_ieee80211_vht_ext_nss_bw_support = -1;
static int hf_ieee80211_vht_mcsset = -1;
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss = -1;
static int hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss = -1;
+static int hf_ieee80211_vht_mcsset_max_nsts_total = -1;
+static int hf_ieee80211_vht_mcsset_ext_nss_bw_cap = -1;
+static int hf_ieee80211_vht_mcsset_reserved = -1;
+
static int hf_ieee80211_vht_mcsset_rx_highest_long_gi = -1;
static int hf_ieee80211_vht_mcsset_tx_mcs_map = -1;
static int hf_ieee80211_vht_ndp_annc_token = -1;
static int hf_ieee80211_vht_ndp_annc_token_number = -1;
+static int hf_ieee80211_vht_ndp_annc_he_subfield = -1;
static int hf_ieee80211_vht_ndp_annc_token_reserved = -1;
-static int hf_ieee80211_vht_ndp_annc_sta_info = -1;
static int hf_ieee80211_vht_ndp_annc_sta_info_aid12 = -1;
static int hf_ieee80211_vht_ndp_annc_sta_info_feedback_type = -1;
static int hf_ieee80211_vht_ndp_annc_sta_info_nc_index = -1;
static int hf_ieee80211_vht_compressed_beamforming_phi_angle = -1;
static int hf_ieee80211_vht_compressed_beamforming_psi_angle = -1;
+static int hf_ieee80211_ff_he_action = -1;
+static int hf_he_mimo_control_nc_index = -1;
+static int hf_he_mimo_control_nr_index = -1;
+static int hf_he_mimo_control_bw = -1;
+static int hf_he_mimo_control_grouping = -1;
+static int hf_he_mimo_control_codebook_info = -1;
+static int hf_he_mimo_control_feedback_type = -1;
+static int hf_he_mimo_control_remaining_feedback_segs = -1;
+static int hf_he_mimo_control_first_feedback_seg = -1;
+static int hf_he_mimo_control_ru_start_index = -1;
+static int hf_he_mimo_control_ru_end_index = -1;
+static int hf_he_mimo_control_sounding_dialog_token_num = -1;
+static int hf_he_mimo_control_reserved = -1;
+static int hf_ieee80211_he_mimo_control_field = -1;
+
static int hf_ieee80211_tag_neighbor_report_bssid = -1;
static int hf_ieee80211_tag_neighbor_report_bssid_info = -1;
static int hf_ieee80211_tag_neighbor_report_bssid_info_reachability = -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;
static int hf_ieee80211_tag_obss_wctdf = -1;
static int hf_ieee80211_tag_obss_sat = -1;
+/* IEEE Std 802.11-2012: 8.4.2.25.1 */
+static int hf_group_data_cipher_suite_oui = -1;
+static int hf_group_data_cipher_suite_type = -1;
+static int hf_osen_pairwise_cipher_suite_oui = -1;
+static int hf_osen_pairwise_cipher_suite_type = -1;
+static int hf_osen_pcs_count = -1;
+static int hf_osen_akm_count = -1;
+static int hf_osen_akm_cipher_suite_oui = -1;
+static int hf_osen_akm_cipher_suite_type = -1;
+static int hf_osen_rsn_cap_preauth = -1;
+static int hf_osen_rsn_cap_no_pairwise = -1;
+static int hf_osen_rsn_cap_ptksa_replay_counter = -1;
+static int hf_osen_rsn_cap_gtksa_replay_counter = -1;
+static int hf_osen_rsn_cap_mfpr = -1;
+static int hf_osen_rsn_cap_mfpc = -1;
+static int hf_osen_rsn_cap_jmr = -1;
+static int hf_osen_rsn_cap_peerkey = -1;
+static int hf_osen_rsn_spp_a_msdu_capable = -1;
+static int hf_osen_rsn_spp_a_msdu_required = -1;
+static int hf_osen_rsn_pbac = -1;
+static int hf_osen_extended_key_id_iaf = -1;
+static int hf_osen_reserved = -1;
+static int hf_osen_rsn_cap_flags = -1;
+static int hf_osen_pmkid_count = -1;
+static int hf_osen_pmkid = -1;
+static int hf_osen_group_management_cipher_suite_oui = -1;
+static int hf_osen_group_management_cipher_suite_type = -1;
/*WAPI-Specification 7.3.2.25 : WAPI Parameter Set*/
static int hf_ieee80211_tag_wapi_param_set_version = -1;
static int hf_ieee80211_tag_wnm_sleep_mode_response_status = -1;
static int hf_ieee80211_tag_wnm_sleep_mode_interval = -1;
+static int hf_ieee80211_wnm_sub_elt_id = -1;
+static int hf_ieee80211_wnm_sub_elt_len = -1;
+
/* IEEE Std 802.11v-2011 7.3.2.87 */
static int hf_ieee80211_tag_time_zone = -1;
static int hf_ieee80211_vs_extreme_ap_length = -1;
static int hf_ieee80211_vs_extreme_ap_name = -1;
+static int hf_ieee80211_vs_aerohive_unknown = -1;
+static int hf_ieee80211_vs_aerohive_hostname_length = -1;
+static int hf_ieee80211_vs_aerohive_hostname = -1;
+static int hf_ieee80211_vs_aerohive_data = -1;
+
static int hf_ieee80211_rsn_ie_pmkid = -1;
static int hf_ieee80211_rsn_ie_unknown = -1;
static int hf_hs20_indication_dgaf_disabled = -1;
static int hf_hs20_indication_pps_mo_id_present = -1;
static int hf_hs20_indication_anqp_domain_id_present = -1;
+static int hf_hs20_reserved = -1;
static int hf_hs20_indication_release_number = -1;
+static int hf_hs20_indication_pps_mo_id = -1;
+static int hf_hs20_indication_anqp_domain_id = -1;
static int hf_hs20_anqp_subtype = -1;
static int hf_hs20_anqp_reserved = -1;
static int hf_hs20_anqp_nai_hrq_length = -1;
static int hf_hs20_anqp_nai_hrq_realm_name = -1;
static int hf_hs20_anqp_oper_class_indic = -1;
+static int hf_hs20_osu_friendly_names_len = -1;
+static int hf_hs20_osu_friendly_name_length = -1;
+static int hf_hs20_osu_friendly_name_language = -1;
+static int hf_hs20_osu_friendly_name_name = -1;
+static int hf_hs20_osu_server_uri_len = -1;
+static int hf_hs20_osu_server_uri = -1;
+static int hf_hs20_osu_method_list_len = -1;
+static int hf_hs20_osu_method_val = -1;
+static int hf_hs20_icons_avail_len = -1;
+static int hf_hs20_osu_providers_list_ssid_len = -1;
+static int hf_hs20_osu_providers_ssid = -1;
+static int hf_hs20_osu_providers_count = -1;
+static int hf_hs20_osu_prov_length = -1;
+static int hf_hs20_icon_request_filename = -1;
+static int hf_hs20_icon_binary_file_status = -1;
+static int hf_hs20_icon_type_length = -1;
+static int hf_hs20_icon_type = -1;
+static int hf_hs20_icon_binary_data_len = -1;
+static int hf_hs20_icon_binary_data = -1;
+static int hf_osu_icon_avail_width = -1;
+static int hf_osu_icon_avail_height = -1;
+static int hf_osu_icon_avail_lang_code = -1;
+static int hf_osu_icon_avail_icon_type_len = -1;
+static int hf_osu_icon_avail_icon_type = -1;
+static int hf_osu_icon_avail_filename_len = -1;
+static int hf_osu_icon_avail_filename = -1;
+static int hf_hs20_osu_nai_len = -1;
+static int hf_hs20_osu_nai = -1;
+static int hf_hs20_osu_service_desc_len = -1;
+static int hf_hs20_osu_service_desc_duple_len = -1;
+static int hf_hs20_osu_service_desc_lang = -1;
+static int hf_hs20_osu_service_desc = -1;
+static int hf_hs20_anqp_venue_url_length = -1;
+static int hf_hs20_anqp_venue_number = -1;
+static int hf_hs20_anqp_venue_url = -1;
+static int hf_hs20_anqp_advice_of_charge_length = -1;
+static int hf_hs20_anqp_advice_of_charge_type = -1;
+static int hf_hs20_anqp_aoc_nai_realm_encoding = -1;
+static int hf_hs20_anqp_aoc_nai_realm_len = -1;
+static int hf_hs20_anqp_aoc_nai_realm = -1;
+static int hf_hs20_anqp_aoc_plan_len = -1;
+static int hf_hs20_anqp_aoc_plan_lang = -1;
+static int hf_hs20_anqp_aoc_plan_curcy = -1;
+static int hf_hs20_anqp_aoc_plan_information = -1;
+
+static int hf_hs20_subscription_remediation_url_len = -1;
+static int hf_hs20_subscription_remediation_server_url = -1;
+static int hf_hs20_subscription_remediation_server_method = -1;
+static int hf_hs20_deauth_reason_code = -1;
+static int hf_hs20_reauth_delay = -1;
+static int hf_hs20_deauth_reason_url_len = -1;
+static int hf_hs20_deauth_imminent_reason_url = -1;
/* IEEE Std 802.11ad */
static int hf_ieee80211_block_ack_RBUFCAP = -1;
static int hf_ieee80211_tag_pcp_decenter = -1;
static int hf_ieee80211_tag_pcp_forwarding = -1;
static int hf_ieee80211_tag_pcp_center = -1;
+static int hf_ieee80211_tag_sta_beam_track = -1;
+static int hf_ieee80211_tag_ext_sc_mcs_max_tx = -1;
+static int hf_ieee80211_tag_ext_sc_mcs_tx_code_7_8 = -1;
+static int hf_ieee80211_tag_ext_sc_mcs_max_rx = -1;
+static int hf_ieee80211_tag_ext_sc_mcs_rx_code_7_8 = -1;
+static int hf_ieee80211_tag_max_basic_sf_amsdu = -1;
+static int hf_ieee80211_tag_max_short_sf_amsdu = -1;
static int hf_ieee80211_tag_PSRSI = -1;
static int hf_ieee80211_tag_min_BHI_duration = -1;
static int hf_ieee80211_tag_brdct_sta_info_dur = -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_addba_ext_reserved = -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;
static int hf_ieee80211_mysterious_olpc_stuff = -1;
+static int hf_ieee80211_esp_access_category = -1;
+static int hf_ieee80211_esp_reserved = -1;
+static int hf_ieee80211_esp_data_format = -1;
+static int hf_ieee80211_esp_ba_windows_size = -1;
+static int hf_ieee80211_esp_est_air_time_frac = -1;
+static int hf_ieee80211_esp_data_ppdu_duration_target = -1;
+static int hf_ieee80211_estimated_service_params = -1;
+
+static int hf_ieee80211_fcg_new_channel_number = -1;
+static int hf_ieee80211_fcg_extra_info = -1;
+
static int hf_ieee80211_ext_tag = -1;
static int hf_ieee80211_ext_tag_number = -1;
static int hf_ieee80211_ext_tag_length = -1;
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_18 = -1;
+static int hf_he_reserved_bit_19 = -1;
+static int hf_he_reserved_bit_25 = -1;
+static int hf_he_reserved_bits_5_7 = -1;
+static int hf_he_reserved_bits_8_9 = -1;
+static int hf_he_reserved_bits_15_16 = -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_80_rx_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_rx_8_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_80_tx_8_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_rx_8_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_80p80_tx_8_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_rx_8_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_1_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_2_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_3_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_4_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_5_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_6_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_7_ss = -1;
+static int hf_he_mcs_max_he_mcs_160_tx_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_doppler_tx = -1;
+static int hf_he_phy_cap_doppler_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_40mhz_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_fragments = -1;
static gint ett_fragment = -1;
static gint ett_block_ack = -1;
+static gint ett_block_ack_tid = -1;
+static gint ett_block_ack_request_control = -1;
static gint ett_block_ack_bitmap = -1;
+static gint ett_block_ack_request_multi_sta_aid_tid = -1;
+static gint ett_multi_sta_block_ack = -1;
static gint ett_ath_cap_tree = -1;
static gint ett_80211_mgt = -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;
+static gint ett_ieee80211_umrs_control = -1;
+static gint ett_ieee80211_om_control = -1;
+static gint ett_ieee80211_hla_control = -1;
+static gint ett_ieee80211_buffer_status_report = -1;
+static gint ett_ieee80211_control_uph = -1;
+static gint ett_ieee80211_bqr_control = -1;
+static gint ett_ieee80211_control_cci = -1;
static gint ett_vht_cap_tree = -1;
static gint ett_vht_mcsset_tree = -1;
static gint ett_vht_op_tree = -1;
static gint ett_vht_tpe_info_tree = -1;
-static gint ett_vht_ndp_annc_token_tree = -1;
+static gint ett_vht_ndp_annc = -1;
static gint ett_vht_ndp_annc_sta_info_tree = -1;
+static gint ett_vht_ndp_annc_sta_list = -1;
+
+static gint ett_he_mimo_control = -1;
static gint ett_ff_vhtmimo_cntrl = -1;
static gint ett_ff_vhtmimo_beamforming_report = -1;
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_cap9 = -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;
static gint ett_fcs = -1;
+static gint ett_hs20_osu_providers_list = -1;
+static gint ett_hs20_osu_provider_tree = -1;
+static gint ett_hs20_friendly_names_list = -1;
+static gint ett_hs20_friendly_name_tree = -1;
+static gint ett_hs20_osu_provider_method_list = -1;
+static gint ett_osu_icons_avail_list = -1;
+static gint ett_hs20_osu_icon_tree = -1;
+static gint ett_hs20_osu_service_desc_list = -1;
+static gint ett_hs20_osu_service_desc_tree = -1;
+static gint ett_hs20_venue_url = -1;
+static gint ett_hs20_advice_of_charge = -1;
+static gint ett_hs20_aoc_plan = -1;
+
+static gint ett_hs20_ofn_tree = -1;
+
static gint ett_adv_proto = -1;
static gint ett_adv_proto_tuple = -1;
static gint ett_gas_query = -1;
static gint ett_tag_ric_data_desc_ie = -1;
static gint ett_anqp_vendor_capab = -1;
+static gint ett_osen_group_data_cipher_suite = -1;
+static gint ett_osen_pairwise_cipher_suites = -1;
+static gint ett_osen_pairwise_cipher_suite = -1;
+static gint ett_osen_akm_cipher_suites = -1;
+static gint ett_osen_akm_cipher_suite = -1;
+static gint ett_osen_rsn_cap_tree = -1;
+static gint ett_osen_pmkid_list = -1;
+static gint ett_osen_pmkid_tree = -1;
+static gint ett_osen_group_management_cipher_suite = -1;
+
static gint ett_hs20_cc_proto_port_tuple = -1;
static gint ett_ssid_list = -1;
static gint ett_qos_map_set_exception = -1;
static gint ett_qos_map_set_range = -1;
+static gint ett_wnm_notif_subelt = -1;
+
+static gint ett_ieee80211_3gpp_plmn = -1;
+
static expert_field ei_ieee80211_bad_length = EI_INIT;
static expert_field ei_ieee80211_inv_val = EI_INIT;
static expert_field ei_ieee80211_vht_tpe_pwr_info_count = EI_INIT;
static gint ett_allocation_tree = -1;
static gint ett_sta_info = -1;
+static gint ett_ieee80211_esp = -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 gint ett_he_trigger_common_info = -1;
+static gint ett_he_trigger_base_common_info = -1;
+static gint ett_he_trigger_bar_ctrl = -1;
+static gint ett_he_trigger_bar_info = -1;
+static gint ett_he_trigger_user_info = -1;
+static gint ett_he_trigger_base_user_info = -1;
+static gint ett_he_trigger_dep_basic_user_info = -1;
+static gint ett_he_trigger_dep_nfrp_user_info = -1;
+static gint ett_he_ndp_annc = -1;
+static gint ett_he_ndp_annc_sta_list = -1;
+static gint ett_he_ndp_annc_sta_item = -1;
+static gint ett_he_ndp_annc_sta_info = -1;
+
static const fragment_items frag_items = {
&ett_fragment,
&ett_fragments,
return addresses_equal(&bssid_broadcast, bssid);
}
+static heur_dissector_list_t heur_subdissector_list;
+
static dissector_handle_t ieee80211_handle;
static dissector_handle_t wlan_withoutfcs_handle;
static dissector_handle_t llc_handle;
{0, NULL}
};
-AIRPDCAP_CONTEXT airpdcap_ctx;
+DOT11DECRYPT_CONTEXT dot11decrypt_ctx;
#define PSMP_STA_INFO_BROADCAST 0
#define PSMP_STA_INFO_MULTICAST 1
gint8 snr;
char edge_sign;
- snr = (gint8) tvb_get_guint8(tvb, offset);
+ snr = tvb_get_gint8(tvb, offset);
switch(snr) {
case -128:
return offset;
}
+/*
+ * This function is called from two different places. In one case it is called
+ * without the tag and length. In other cases, it is called with those and
+ * is asked to return the type and subtype. We know the difference because
+ * type and subtype will be NULL in the first case.
+ */
static guint
dissect_advertisement_protocol_common(packet_info *pinfo, proto_tree *tree,
tvbuff_t *tvb, int offset, guint *type,
guint *subtype)
{
- guint8 tag_no, tag_len, left;
+ guint8 tag_no = 0, tag_len, left;
proto_item *item = NULL, *adv_item;
proto_tree *adv_tree, *adv_tuple_tree;
if (type)
item = proto_tree_add_item(tree, hf_ieee80211_tag_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- tag_len = tvb_get_guint8(tvb, offset + 1);
- if (tag_no != TAG_ADVERTISEMENT_PROTOCOL) {
+ /*
+ * If we have the tag and len, use the len in the tvb, otherwise ask
+ * for the length of the tvb.
+ */
+ if (type)
+ tag_len = tvb_get_guint8(tvb, offset + 1);
+ else
+ tag_len = tvb_reported_length_remaining(tvb, 0);
+
+ if (type && tag_no != TAG_ADVERTISEMENT_PROTOCOL) {
expert_add_info_format(pinfo, item, &ei_ieee80211_tag_number,
"Unexpected IE %d (expected Advertisement "
"Protocol)", tag_no);
}
left = tag_len;
- offset += 2;
+ if (type) /* Skip past the header if there ... */
+ offset += 2;
adv_tree = proto_tree_add_subtree(tree, tvb, offset, left,
ett_adv_proto, &adv_item, "Advertisement Protocol element");
left -= 1;
if (oui == OUI_WFA) {
proto_tree_add_item(adv_tuple_tree, hf_ieee80211_dpp_subtype, tvb, offset, 1, ENC_NA);
- if (wfa_subtype == WFA_SUBTYPE_DPP) {
+ if (subtype && wfa_subtype == WFA_SUBTYPE_DPP) {
*subtype = WFA_SUBTYPE_DPP;
*subtype |= (tvb_get_guint8(tvb, offset) << 8);
}
static void
dissect_3gpp_cellular_network_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint8 iei, num;
+ guint8 iei, num, plmn_idx = 0;
proto_item *item;
/* See Annex A of 3GPP TS 24.234 v8.1.0 for description */
proto_tree_add_item(tree, hf_ieee80211_3gpp_gc_num_plmns, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
while (num > 0) {
+ proto_item *plmn_item = NULL;
+ proto_tree *plmn_tree = NULL;
+ guint plmn_val = 0;
+
if (tvb_reported_length_remaining(tvb, offset) < 3)
break;
- dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_NONE, TRUE);
+ plmn_val = tvb_get_letoh24(tvb, offset);
+ plmn_item = proto_tree_add_uint_format(tree, hf_ieee80211_3gpp_gc_plmn,
+ tvb, offset, 3, plmn_val, "PLMN %d (0x%x)",
+ plmn_idx++, plmn_val);
+ plmn_tree = proto_item_add_subtree(plmn_item, ett_ieee80211_3gpp_plmn);
+ dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, plmn_tree, offset, E212_NONE, TRUE);
num--;
offset += 3;
}
}
}
-#define HS20_ANQP_HS_QUERY_LIST 1
-#define HS20_ANQP_HS_CAPABILITY_LIST 2
-#define HS20_ANQP_OPERATOR_FRIENDLY_NAME 3
-#define HS20_ANQP_WAN_METRICS 4
-#define HS20_ANQP_CONNECTION_CAPABILITY 5
-#define HS20_ANQP_NAI_HOME_REALM_QUERY 6
+static int
+dissect_hs20_subscription_remediation(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void *data _U_)
+{
+ int offset = 0;
+ guint8 url_len = tvb_get_guint8(tvb, offset);
+ proto_item *pi = NULL;
+
+ proto_tree_add_item(tree, hf_hs20_subscription_remediation_url_len, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+ if (tvb_reported_length_remaining(tvb, offset) >= url_len) {
+ pi = proto_tree_add_item(tree, hf_hs20_subscription_remediation_server_url,
+ tvb, offset, url_len, ENC_ASCII|ENC_NA);
+ offset += url_len;
+ PROTO_ITEM_SET_URL(pi);
+ proto_tree_add_item(tree, hf_hs20_subscription_remediation_server_method,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ }
+
+ return offset;
+}
+
+static int
+dissect_hs20_deauthentication_imminent(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void *data _U_)
+{
+ int offset = 0;
+ guint8 url_len = 0;
+ proto_item *pi = NULL;
+
+ proto_tree_add_item(tree, hf_hs20_deauth_reason_code, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(tree, hf_hs20_reauth_delay, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ url_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_hs20_deauth_reason_url_len, tvb, offset, 1,
+ ENC_NA);
+ offset++;
+
+ if (tvb_reported_length_remaining(tvb, offset) >= url_len) {
+ pi = proto_tree_add_item(tree, hf_hs20_deauth_imminent_reason_url,
+ tvb, offset, url_len, ENC_ASCII|ENC_NA);
+ offset += url_len;
+ PROTO_ITEM_SET_URL(pi);
+ }
+ return offset;
+}
+
+#define HS20_ANQP_HS_QUERY_LIST 1
+#define HS20_ANQP_HS_CAPABILITY_LIST 2
+#define HS20_ANQP_OPERATOR_FRIENDLY_NAME 3
+#define HS20_ANQP_WAN_METRICS 4
+#define HS20_ANQP_CONNECTION_CAPABILITY 5
+#define HS20_ANQP_NAI_HOME_REALM_QUERY 6
#define HS20_ANQP_OPERATING_CLASS_INDICATION 7
+#define HS20_ANQP_OSU_PROVIDERS_LIST 8
+/* 9 is reserved */
+#define HS20_ANQP_ICON_REQUEST 10
+#define HS20_ANQP_ICON_BINARY_FILE 11
+#define HS20_ANQP_OPERATOR_ICON_METADATA 12
+#define HS20_ANQP_ADVICE_OF_CHARGE 13
static const value_string hs20_anqp_subtype_vals[] = {
{ HS20_ANQP_HS_QUERY_LIST, "HS Query list" },
{ HS20_ANQP_CONNECTION_CAPABILITY, "Connection Capability" },
{ HS20_ANQP_NAI_HOME_REALM_QUERY, "NAI Home Realm Query" },
{ HS20_ANQP_OPERATING_CLASS_INDICATION, "Operating Class Indication" },
+ { HS20_ANQP_OSU_PROVIDERS_LIST, "OSU Providers List" },
+ { HS20_ANQP_ICON_REQUEST, "Icon Request" },
+ { HS20_ANQP_ICON_BINARY_FILE, "Icon Binary File" },
+ { HS20_ANQP_OPERATOR_ICON_METADATA, "Operator Icon Metadata" },
+ { HS20_ANQP_ADVICE_OF_CHARGE, "Advice of Charge" },
{ 0, NULL }
};
static void
dissect_hs20_anqp_operator_friendly_name(proto_tree *tree, tvbuff_t *tvb,
- packet_info *pinfo, int offset, int end)
+ packet_info *pinfo, int offset,
+ int end, int hf_array[],
+ gint ett_val)
{
+ int ofn_index = 0;
+
while (offset + 4 <= end) {
guint8 vlen = tvb_get_guint8(tvb, offset);
- proto_item *item = proto_tree_add_item(tree, hf_hs20_anqp_ofn_length,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree *ofn_tree = NULL;
+ proto_item *item = NULL, *pi = NULL;
+ int start_offset = offset;
+
+ ofn_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_val,
+ &pi, "Friendly Name %d", ofn_index);
+
+ item = proto_tree_add_item(ofn_tree, hf_array[0],
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset++;
if (vlen > end - offset || vlen < 3) {
expert_add_info(pinfo, item, &ei_hs20_anqp_ofn_length);
break;
}
- proto_tree_add_item(tree, hf_hs20_anqp_ofn_language,
+ proto_tree_add_item(tree, hf_array[1],
tvb, offset, 3, ENC_ASCII|ENC_NA);
- proto_tree_add_item(tree, hf_hs20_anqp_ofn_name,
+ proto_tree_add_item(tree, hf_array[2],
tvb, offset + 3, vlen - 3, ENC_UTF_8|ENC_NA);
offset += vlen;
+
+ proto_item_set_len(pi, offset - start_offset);
+ ofn_index++;
}
}
"ProtoPort Tuple - ip_proto=%u port_num=%u status=%s",
ip_proto, port_num,
val_to_str(status, hs20_cc_status_vals,
- "Unknown (%u)"));
+ "Reserved (%u)"));
proto_tree_add_item(tuple, hf_hs20_anqp_cc_proto_ip_proto,
tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset++;
}
static int
-dissect_hs20_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
+dissect_hs20_osu_friendly_names(proto_tree *tree, tvbuff_t *tvb,
+ packet_info *pinfo, int offset, int end _U_)
{
- guint8 subtype;
- int end = tvb_reported_length(tvb);
- int offset = 0;
- anqp_info_dissector_data_t* anqp_data = (anqp_info_dissector_data_t*)data;
-
- DISSECTOR_ASSERT(anqp_data);
+ int osu_fn_hf_array[3] = {hf_hs20_osu_friendly_name_length,
+ hf_hs20_osu_friendly_name_language,
+ hf_hs20_osu_friendly_name_name };
+ guint16 osu_fn_count = tvb_get_letohs(tvb, offset);
+ proto_tree *fn_tree = NULL;
- subtype = tvb_get_guint8(tvb, offset);
- proto_item_append_text(tree, " - HS 2.0 %s",
- val_to_str(subtype, hs20_anqp_subtype_vals,
- "Unknown (%u)"));
- if (anqp_data->idx == 0) {
- col_append_fstr(pinfo->cinfo, COL_INFO, " HS 2.0 %s",
- val_to_str(subtype, hs20_anqp_subtype_vals,
- "Unknown (%u)"));
- } else if (anqp_data->idx == 1) {
- col_append_str(pinfo->cinfo, COL_INFO, ", ..");
- }
- proto_tree_add_item(tree, hf_hs20_anqp_subtype, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset++;
+ proto_tree_add_item(tree, hf_hs20_osu_friendly_names_len, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
- proto_tree_add_item(tree, hf_hs20_anqp_reserved, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset++;
+ fn_tree = proto_tree_add_subtree(tree, tvb, offset, osu_fn_count,
+ ett_hs20_friendly_names_list, NULL,
+ "Friendly Names List");
- switch (subtype) {
- case HS20_ANQP_HS_QUERY_LIST:
- dissect_hs20_anqp_hs_query_list(tree, tvb, offset, end);
- break;
- case HS20_ANQP_HS_CAPABILITY_LIST:
- dissect_hs20_anqp_hs_capability_list(tree, tvb, offset, end);
- break;
- case HS20_ANQP_OPERATOR_FRIENDLY_NAME:
- dissect_hs20_anqp_operator_friendly_name(tree, tvb, pinfo, offset, end);
- break;
- case HS20_ANQP_WAN_METRICS:
- dissect_hs20_anqp_wan_metrics(tree, tvb, offset, anqp_data->request);
- break;
- case HS20_ANQP_CONNECTION_CAPABILITY:
- dissect_hs20_anqp_connection_capability(tree, tvb, offset, end);
- break;
- case HS20_ANQP_NAI_HOME_REALM_QUERY:
- dissect_hs20_anqp_nai_home_realm_query(tree, tvb, pinfo, offset, end);
- break;
- case HS20_ANQP_OPERATING_CLASS_INDICATION:
- dissect_hs20_anqp_oper_class_indic(tree, tvb, offset, end);
- break;
- default:
- if (offset == end)
- break;
- proto_tree_add_item(tree, hf_hs20_anqp_payload, tvb, offset,
- end - offset, ENC_NA);
- break;
- }
+ dissect_hs20_anqp_operator_friendly_name(fn_tree, tvb, pinfo, offset,
+ offset + osu_fn_count,
+ osu_fn_hf_array, ett_hs20_friendly_name_tree);
- return tvb_captured_length(tvb);
+ return offset + osu_fn_count;
}
static int
-dissect_vendor_wifi_alliance_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
+dissect_hs20_osu_icon_available(proto_tree *tree, tvbuff_t *tvb,
+ packet_info *pinfo _U_, int offset, int end _U_, guint16 icon_index)
{
- guint8 subtype;
- int offset = 0;
- tvbuff_t *subtvb;
+ proto_tree *icon_avail = NULL;
+ proto_item *pi = NULL;
+ int start_offset = offset;
+ guint8 icon_type_len = 0, icon_filename_len = 0;
- subtype = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_anqp_wfa_subtype, tvb, offset, 1, ENC_NA);
- offset += 1;
+ icon_avail = proto_tree_add_subtree_format(tree, tvb, offset, -1,
+ ett_hs20_osu_icon_tree, &pi,
+ "Icon Available %d", icon_index);
- subtvb = tvb_new_subset_remaining(tvb, offset);
- if (!dissector_try_uint_new(wifi_alliance_anqp_info_table, subtype, subtvb, pinfo, tree, FALSE, data))
- call_data_dissector(subtvb, pinfo, tree);
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_width, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
- return tvb_captured_length(tvb);
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_height, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_lang_code, tvb, offset, 3,
+ ENC_ASCII|ENC_NA);
+ offset += 3;
+
+ icon_type_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_icon_type_len, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_icon_type, tvb, offset,
+ icon_type_len, ENC_ASCII|ENC_NA);
+ offset += icon_type_len;
+
+ icon_filename_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_filename_len, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(icon_avail, hf_osu_icon_avail_filename, tvb, offset,
+ icon_filename_len, ENC_ASCII|ENC_NA);
+ offset += icon_filename_len;
+
+ proto_item_set_len(pi, offset - start_offset);
+
+ return offset;
}
+static const value_string osu_method_vals[] = {
+ { 0, "OMA DM" },
+ { 1, "SOAP XML SPP" },
+ { 0, NULL },
+};
static int
-dissect_anqp_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
- gboolean request, int idx)
-{
- guint16 id, len;
- guint32 oui;
- proto_item *item;
- tvbuff_t *vendor_tvb;
- anqp_info_dissector_data_t anqp_info;
+dissect_hs20_osu_provider(proto_tree *tree, tvbuff_t *tvb,
+ packet_info *pinfo, int offset, int end, guint8 provider_index)
+{
+ proto_tree *prov_tree = NULL;
+ proto_item *osupi = NULL, *uri_pi = NULL;
+ int start_offset = offset;
+ guint8 osu_server_uri_len = 0;
+ guint8 osu_method_list_len = 0;
+ guint16 icons_avail = 0, icons_index = 0;
+ guint8 osu_nai_len = 0;
+ guint16 osu_service_desc_len = 0;
+
+ prov_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
+ ett_hs20_osu_provider_tree, &osupi,
+ "OSU Provider %d", provider_index);
+
+ proto_tree_add_item(prov_tree, hf_hs20_osu_prov_length, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
- item = proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_id,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- id = tvb_get_letohs(tvb, offset);
- if (id != ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST) {
- if (idx == 0) {
- proto_item_append_text(tree, " - %s",
- val_to_str_ext(id, &anqp_info_id_vals_ext, "Unknown (%u)"));
- col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
- val_to_str_ext(id, &anqp_info_id_vals_ext, "Unknown (%u)"));
- } else if (idx == 1) {
- proto_item_append_text(tree, ", ..");
- col_append_str(pinfo->cinfo, COL_INFO, ", ..");
+ offset = dissect_hs20_osu_friendly_names(prov_tree, tvb, pinfo, offset, end);
+
+ proto_item_set_len(osupi, offset - start_offset);
+
+ osu_server_uri_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(prov_tree, hf_hs20_osu_server_uri_len, tvb, offset, 1,
+ ENC_NA);
+ offset++;
+
+ uri_pi = proto_tree_add_item(prov_tree, hf_hs20_osu_server_uri, tvb, offset,
+ osu_server_uri_len, ENC_ASCII|ENC_NA);
+ offset += osu_server_uri_len;
+ PROTO_ITEM_SET_URL(uri_pi);
+
+ osu_method_list_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(prov_tree, hf_hs20_osu_method_list_len, tvb, offset, 1,
+ ENC_NA);
+ offset++;
+
+ if (osu_method_list_len > 0) {
+ proto_tree *osu_method_list = NULL;
+ guint8 osu_method_list_index = 0;
+
+ osu_method_list = proto_tree_add_subtree(prov_tree, tvb, offset,
+ osu_method_list_len,
+ ett_hs20_osu_provider_method_list,
+ NULL, "OSU Method List");
+ while (osu_method_list_len > osu_method_list_index) {
+ proto_item *pi = NULL;
+ guint8 method = tvb_get_guint8(tvb, offset);
+
+ pi = proto_tree_add_item(osu_method_list, hf_hs20_osu_method_val, tvb,
+ offset, 1, ENC_NA);
+ proto_item_append_text(pi, ": %s",
+ val_to_str(method, osu_method_vals,
+ "Reserved"));
+ offset++;
+ osu_method_list_index++;
}
}
- tree = proto_item_add_subtree(item, ett_gas_anqp);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_length,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- len = tvb_get_letohs(tvb, offset);
+
+ icons_avail = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(prov_tree, hf_hs20_icons_avail_len, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
offset += 2;
- if (tvb_reported_length_remaining(tvb, offset) < len) {
- expert_add_info(pinfo, tree, &ei_ieee80211_ff_anqp_info_length);
- return 4 + len;
+
+ if (icons_avail > 0) {
+ proto_tree *icon_list = NULL;
+ proto_item *pi = NULL;
+
+ start_offset = offset;
+
+ icon_list = proto_tree_add_subtree(prov_tree, tvb, offset, -1,
+ ett_osu_icons_avail_list, &pi,
+ "Icons Available");
+
+ while ((offset - start_offset) < icons_avail) {
+ offset = dissect_hs20_osu_icon_available(icon_list, tvb, pinfo, offset,
+ end, icons_index);
+ icons_index++;
+ }
+
+ proto_item_set_len(pi, offset - start_offset);
}
- switch (id)
- {
- case ANQP_INFO_ANQP_QUERY_LIST:
- dissect_anqp_query_list(tree, tvb, pinfo, offset, offset + len);
- break;
- case ANQP_INFO_ANQP_CAPAB_LIST:
- dissect_anqp_capab_list(tree, tvb, pinfo, offset, offset + len);
- break;
- case ANQP_INFO_VENUE_NAME_INFO:
- dissect_venue_name_info(tree, tvb, pinfo, offset, offset + len);
- break;
- case ANQP_INFO_NETWORK_AUTH_TYPE_INFO:
- dissect_network_auth_type(tree, tvb, offset, offset + len);
- break;
- case ANQP_INFO_ROAMING_CONSORTIUM_LIST:
- dissect_roaming_consortium_list(tree, tvb, pinfo, offset, offset + len);
- break;
- case ANQP_INFO_IP_ADDR_TYPE_AVAILABILITY_INFO:
- dissect_ip_addr_type_availability_info(tree, tvb, offset);
- break;
- case ANQP_INFO_NAI_REALM_LIST:
- dissect_nai_realm_list(tree, tvb, pinfo, offset, offset + len);
- break;
- case ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO:
- dissect_3gpp_cellular_network_info(tree, tvb, pinfo, offset);
- break;
- case ANQP_INFO_DOMAIN_NAME_LIST:
- dissect_domain_name_list(tree, tvb, offset, offset + len);
- break;
- case ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST:
- proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
- offset += 3;
- vendor_tvb = tvb_new_subset_length(tvb, offset, len);
- anqp_info.request = request;
- anqp_info.idx = idx;
- if (!dissector_try_uint_new(vendor_specific_anqp_info_table, oui, vendor_tvb, pinfo, tree, FALSE, &anqp_info))
- {
- proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info, tvb, offset, len, ENC_NA);
- }
- break;
- default:
- proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info,
- tvb, offset, len, ENC_NA);
- break;
+ osu_nai_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(prov_tree, hf_hs20_osu_nai_len, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ if (osu_nai_len > 0) {
+ proto_tree_add_item(prov_tree, hf_hs20_osu_nai, tvb, offset,
+ osu_nai_len, ENC_NA);
+ offset += osu_nai_len;
}
- return 4 + len;
-}
+ osu_service_desc_len = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(prov_tree, hf_hs20_osu_service_desc_len, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
-static void
-dissect_anqp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, gboolean request)
-{
- int idx = 0;
+ if (osu_service_desc_len > 0) {
+ proto_tree *desc_tree = NULL;
+ proto_item *pi = NULL;
+ guint8 service_desc_index = 0;
- proto_item_append_text(tree, ": ANQP ");
- proto_item_append_text(tree, request ? "Request" : "Response");
- if (tvb_reported_length_remaining(tvb, offset) < 4) {
- expert_add_info_format(pinfo, tree, &ei_ieee80211_not_enough_room_for_anqp_header,
- "Not enough room for ANQP header");
- return;
- }
- col_append_fstr(pinfo->cinfo, COL_INFO, ", ANQP %s",
- request ? "Req" : "Resp");
- while (tvb_reported_length_remaining(tvb, offset) > 0) {
- offset += dissect_anqp_info(tree, tvb, pinfo, offset, request, idx);
- idx += 1;
- }
-}
+ start_offset = offset;
+ desc_tree = proto_tree_add_subtree(prov_tree, tvb, offset, -1,
+ ett_hs20_osu_service_desc_list, &pi,
+ "OSU Service Description List");
-static guint
-dissect_gas_initial_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
- guint type, guint subtype)
-{
- guint16 req_len;
- int start = offset;
- proto_item *item;
- proto_tree *query;
+ while ((offset - start_offset) < osu_service_desc_len) {
+ proto_tree *desc_duple = NULL;
+ guint8 serv_desc_len = tvb_get_guint8(tvb, offset);
- /* Query Request Length (2 octets) */
- req_len = tvb_get_letohs(tvb, offset);
+ desc_duple = proto_tree_add_subtree_format(desc_tree, tvb, offset,
+ 1 + serv_desc_len,
+ ett_hs20_osu_service_desc_tree, NULL,
+ "OSU Service Description Duple %d",
+ service_desc_index);
- query = proto_tree_add_subtree(tree, tvb, offset, 2 + req_len, ett_gas_query, &item, "Query Request");
- if (tvb_reported_length_remaining(tvb, offset) < 2 + req_len) {
- expert_add_info(pinfo, item, &ei_ieee80211_ff_query_request_length);
- return tvb_reported_length_remaining(tvb, offset);
- }
+ proto_tree_add_item(desc_duple, hf_hs20_osu_service_desc_duple_len, tvb,
+ offset, 1, ENC_NA);
+ offset++;
- proto_tree_add_item(query, hf_ieee80211_ff_query_request_length,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- /*
- * Query Request (GAS query; formatted per protocol specified in the
- * Advertisement Protocol IE)
- */
- switch (type) {
- case ADV_PROTO_ID_ANQP:
- dissect_anqp(query, tvb, pinfo, offset, TRUE);
- break;
- case ADV_PROTO_ID_VS:
- if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) | WFA_SUBTYPE_DPP)) {
- col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
- val_to_str(subtype >> 8, dpp_subtype_vals, "Unknown (%u)"));
- dissect_wifi_dpp_config_proto(pinfo, query, tvb, offset);
+ proto_tree_add_item(desc_duple, hf_hs20_osu_service_desc_lang, tvb, offset,
+ 3, ENC_ASCII|ENC_NA);
+ offset += 3;
+
+ proto_tree_add_item(desc_duple, hf_hs20_osu_service_desc, tvb, offset,
+ serv_desc_len - 3, ENC_ASCII|ENC_NA);
+ offset += serv_desc_len - 3;
+
+ service_desc_index++;
}
- break;
- default:
- proto_tree_add_item(query, hf_ieee80211_ff_query_request,
- tvb, offset, req_len, ENC_NA);
+
+ proto_item_set_len(pi, offset - start_offset);
}
- offset += req_len;
- return offset - start;
+ return end;
}
-static guint
-dissect_gas_initial_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
- guint type, guint subtype)
+static void
+dissect_hs20_anqp_osu_providers_list(proto_tree *tree, tvbuff_t *tvb,
+ packet_info *pinfo, int offset, int end)
{
- guint16 resp_len;
- int start = offset;
- proto_item *item;
- proto_tree *query;
+ guint8 ssid_len = tvb_get_guint8(tvb, offset);
+ guint8 osu_prov_count = 0, osu_prov_index = 0;
- /* Query Response Length (2 octets) */
- resp_len = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_hs20_osu_providers_list_ssid_len, tvb, offset, 1,
+ ENC_NA);
+ offset++;
- query = proto_tree_add_subtree(tree, tvb, offset, 2 + resp_len,
- ett_gas_query, &item, "Query Response");
- if (tvb_reported_length_remaining(tvb, offset) < 2 + resp_len) {
- expert_add_info(pinfo, item, &ei_ieee80211_ff_query_response_length);
- return tvb_reported_length_remaining(tvb, offset);
- }
+ proto_tree_add_item(tree, hf_hs20_osu_providers_ssid, tvb, offset, ssid_len,
+ ENC_UTF_8|ENC_NA);
+ offset += ssid_len;
- proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- /* Query Response (optional) */
- if (resp_len) {
- switch (type) {
- case ADV_PROTO_ID_ANQP:
- dissect_anqp(query, tvb, pinfo, offset, FALSE);
- break;
- case ADV_PROTO_ID_VS:
- if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) | WFA_SUBTYPE_DPP)) {
- col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
- val_to_str(subtype >> 8, dpp_subtype_vals, "Unknown (%u)"));
- dissect_wifi_dpp_config_proto(pinfo, query, tvb, offset);
- }
- break;
- default:
- proto_tree_add_item(query, hf_ieee80211_ff_query_response,
- tvb, offset, resp_len, ENC_NA);
+ osu_prov_count = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_hs20_osu_providers_count, tvb, offset, 1,
+ ENC_NA);
+ offset++;
+
+ if (osu_prov_count > 0) {
+ int start_offset = offset;
+ proto_item *pi = NULL;
+ proto_tree *osu_prov_list = NULL;
+
+ osu_prov_list = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_hs20_osu_providers_list, &pi,
+ "OSU Providers List");
+ while (offset < end && osu_prov_count > osu_prov_index) {
+ offset = dissect_hs20_osu_provider(osu_prov_list, tvb, pinfo, offset, end,
+ osu_prov_index);
+ osu_prov_index++;
}
- offset += resp_len;
+
+ proto_item_set_len(pi, offset - start_offset);
}
+}
- return offset - start;
+static void
+dissect_hs20_anqp_icon_request(proto_tree *tree, tvbuff_t *tvb, int offset,
+ int end)
+{
+ proto_tree_add_item(tree, hf_hs20_icon_request_filename, tvb, offset,
+ end - offset, ENC_UTF_8|ENC_NA);
}
-static reassembly_table gas_reassembly_table;
+static const value_string hs20_icon_download_status_vals[] = {
+ { 0, "Success" },
+ { 1, "File not found" },
+ { 2, "Unspecified file error" },
+ { 0, NULL }
+};
-static gint ett_gas_resp_fragment = -1;
-static gint ett_gas_resp_fragments = -1;
+static void
+dissect_hs20_anqp_icon_binary_file(proto_tree *tree, tvbuff_t *tvb, int offset,
+ int end _U_)
+{
+ guint8 icon_download_status = tvb_get_guint8(tvb, offset);
+ proto_item *pi = NULL;
+ guint8 icon_type_len = 0;
+ guint16 icon_binary_data_len = 0;
-static int hf_ieee80211_gas_resp_fragments = -1;
-static int hf_ieee80211_gas_resp_fragment = -1;
-static int hf_ieee80211_gas_resp_fragment_overlap = -1;
-static int hf_ieee80211_gas_resp_fragment_overlap_conflict = -1;
-static int hf_ieee80211_gas_resp_fragment_multiple_tails = -1;
-static int hf_ieee80211_gas_resp_fragment_too_long_fragment = -1;
-static int hf_ieee80211_gas_resp_fragment_error = -1;
-static int hf_ieee80211_gas_resp_fragment_count = -1;
-static int hf_ieee80211_gas_resp_reassembled_in = -1;
-static int hf_ieee80211_gas_resp_reassembled_length = -1;
+ pi = proto_tree_add_item(tree, hf_hs20_icon_binary_file_status, tvb, offset, 1,
+ ENC_NA);
+ offset++;
+ proto_item_append_text(pi, ": %s",
+ val_to_str(icon_download_status,
+ hs20_icon_download_status_vals,
+ "Reserved (%u)"));
-static const fragment_items gas_resp_frag_items = {
- &ett_gas_resp_fragment,
- &ett_gas_resp_fragments,
- &hf_ieee80211_gas_resp_fragments,
- &hf_ieee80211_gas_resp_fragment,
- &hf_ieee80211_gas_resp_fragment_overlap,
- &hf_ieee80211_gas_resp_fragment_overlap_conflict,
- &hf_ieee80211_gas_resp_fragment_multiple_tails,
- &hf_ieee80211_gas_resp_fragment_too_long_fragment,
- &hf_ieee80211_gas_resp_fragment_error,
- &hf_ieee80211_gas_resp_fragment_count,
- &hf_ieee80211_gas_resp_reassembled_in,
- &hf_ieee80211_gas_resp_reassembled_length,
- /* Reassembled data field */
- NULL,
- "GAS Response fragments"
-};
+ icon_type_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_hs20_icon_type_length, tvb, offset, 1, ENC_NA);
+ offset++;
-static guint
-dissect_gas_comeback_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
- guint type, guint subtype _U_, guint8 frag, gboolean more,
- guint8 dialog_token)
-{
- guint16 resp_len;
- int start = offset;
- proto_item *item;
- proto_tree *query;
+ proto_tree_add_item(tree, hf_hs20_icon_type, tvb, offset, icon_type_len,
+ ENC_UTF_8|ENC_NA);
+ offset += icon_type_len;
- /* Query Response Length (2 octets) */
- resp_len = tvb_get_letohs(tvb, offset);
+ icon_binary_data_len = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_hs20_icon_binary_data_len, tvb, offset, 2,
+ ENC_BIG_ENDIAN);
+ offset += 2;
- query = proto_tree_add_subtree(tree, tvb, offset, 2 + resp_len,
- ett_gas_query, &item, "Query Response");
- if (tvb_reported_length_remaining(tvb, offset) < 2 + resp_len) {
- expert_add_info(pinfo, item, &ei_ieee80211_ff_query_response_length);
- return tvb_reported_length_remaining(tvb, offset);
- }
+ proto_tree_add_item(tree, hf_hs20_icon_binary_data, tvb, offset,
+ icon_binary_data_len, ENC_NA);
+}
- proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
+static void
+dissect_hs20_anqp_operator_icon_metadata(proto_tree *tree, tvbuff_t *tvb,
+ int offset, int end _U_)
+{
+ proto_item *pi = NULL;
+ int start_offset = offset;
+ guint8 icon_type_len = 0, icon_filename_len = 0;
+
+ proto_tree_add_item(tree, hf_osu_icon_avail_width, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
offset += 2;
- /* Query Response (optional) */
- if (resp_len) {
- if (type == ADV_PROTO_ID_ANQP && (frag == 0) && !more)
- dissect_anqp(query, tvb, pinfo, offset, FALSE);
- else {
- fragment_head *frag_msg;
- gboolean save_fragmented;
- tvbuff_t *new_tvb;
- save_fragmented = pinfo->fragmented;
- pinfo->fragmented = TRUE;
- frag_msg = fragment_add_seq_check(&gas_reassembly_table, tvb, offset,
- pinfo, dialog_token, NULL,
- frag, resp_len, more);
- new_tvb = process_reassembled_data(tvb, offset, pinfo,
- "Reassembled GAS Query Response",
- frag_msg, &gas_resp_frag_items,
- NULL, tree);
- if (new_tvb) {
- if (type == ADV_PROTO_ID_ANQP)
- dissect_anqp(query, new_tvb, pinfo, 0, FALSE);
- else
- proto_tree_add_item(query, hf_ieee80211_ff_query_response,
- new_tvb, 0,
- tvb_reported_length_remaining(new_tvb, 0),
- ENC_NA);
- }
+ proto_tree_add_item(tree, hf_osu_icon_avail_height, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
- /* The old tvb cannot be used anymore */
- ieee80211_tvb_invalid = TRUE;
+ proto_tree_add_item(tree, hf_osu_icon_avail_lang_code, tvb, offset, 3,
+ ENC_ASCII|ENC_NA);
+ offset += 3;
- pinfo->fragmented = save_fragmented;
- }
- offset += resp_len;
- }
+ icon_type_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_osu_icon_avail_icon_type_len, tvb, offset,
+ 1, ENC_NA);
+ offset++;
- return offset - start;
-}
+ proto_tree_add_item(tree, hf_osu_icon_avail_icon_type, tvb, offset,
+ icon_type_len, ENC_ASCII|ENC_NA);
+ offset += icon_type_len;
-/* ************************************************************************* */
-/* Dissect and add fixed mgmt fields to protocol tree */
-/* ************************************************************************* */
+ icon_filename_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_osu_icon_avail_filename_len, tvb, offset,
+ 1, ENC_NA);
+ offset++;
-static guint64 last_timestamp;
+ proto_tree_add_item(tree, hf_osu_icon_avail_filename, tvb, offset,
+ icon_filename_len, ENC_ASCII|ENC_NA);
+ offset += icon_filename_len;
-static guint
-add_ff_timestamp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- last_timestamp = tvb_get_letoh64(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_ff_timestamp, tvb, offset, 8,
- ENC_LITTLE_ENDIAN);
- return 8;
+ proto_item_set_len(pi, offset - start_offset);
}
-static guint
-add_ff_beacon_interval(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+static void
+dissect_anqp_venue_url(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_beacon_interval, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- col_append_fstr(pinfo->cinfo, COL_INFO, ", BI=%d",
- tvb_get_letohs(tvb, offset));
- return 2;
+ guint16 url_duple_index = 0;
+
+ while (offset < end) {
+ proto_tree *venue_url = NULL;
+ proto_item *url_pi = NULL;
+ guint8 url_duple_len = tvb_get_guint8(tvb, offset);
+
+ venue_url = proto_tree_add_subtree_format(tree, tvb, offset,
+ url_duple_len + 1, ett_hs20_venue_url, NULL,
+ "Venue URL Duple %d", url_duple_index);
+
+ proto_tree_add_item(venue_url, hf_hs20_anqp_venue_url_length, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_item(venue_url, hf_hs20_anqp_venue_number, tvb, offset, 1,
+ ENC_NA);
+ offset++;
+
+ url_pi = proto_tree_add_item(venue_url, hf_hs20_anqp_venue_url, tvb, offset,
+ url_duple_len -1, ENC_ASCII|ENC_NA);
+ PROTO_ITEM_SET_URL(url_pi);
+
+ offset += (url_duple_len - 1);
+
+ url_duple_index++;
+ }
}
-static guint
-add_ff_cap_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+static const value_string advice_of_charge_type_vals[] = {
+ { 0, "Time-based" },
+ { 1, "Data-volume-based" },
+ { 2, "Time-and-data-volume-based" },
+ { 3, "Unlimited" },
+ { 0, NULL }
+};
+
+static void
+dissect_hs20_anqp_advice_of_charge(proto_tree *tree, tvbuff_t *tvb, int offset,
+ int end _U_)
{
- static const int *ieee80211_ap_fields[] = {
- &hf_ieee80211_ff_cf_ess,
- &hf_ieee80211_ff_cf_ibss,
- &hf_ieee80211_ff_cf_ap_poll,
- &hf_ieee80211_ff_cf_privacy,
- &hf_ieee80211_ff_cf_preamble,
- &hf_ieee80211_ff_cf_pbcc,
- &hf_ieee80211_ff_cf_agility,
- &hf_ieee80211_ff_cf_spec_man,
- &hf_ieee80211_ff_short_slot_time,
- &hf_ieee80211_ff_cf_apsd,
- &hf_ieee80211_ff_radio_measurement,
- &hf_ieee80211_ff_dsss_ofdm,
- &hf_ieee80211_ff_cf_del_blk_ack,
- &hf_ieee80211_ff_cf_imm_blk_ack,
- NULL
- };
+ guint16 toc_index = 0;
- static const int *ieee80211_sta_fields[] = {
- &hf_ieee80211_ff_cf_ess,
- &hf_ieee80211_ff_cf_ibss,
- &hf_ieee80211_ff_cf_sta_poll,
- &hf_ieee80211_ff_cf_privacy,
- &hf_ieee80211_ff_cf_preamble,
- &hf_ieee80211_ff_cf_pbcc,
- &hf_ieee80211_ff_cf_agility,
- &hf_ieee80211_ff_cf_spec_man,
- &hf_ieee80211_ff_short_slot_time,
- &hf_ieee80211_ff_cf_apsd,
- &hf_ieee80211_ff_radio_measurement,
- &hf_ieee80211_ff_dsss_ofdm,
- &hf_ieee80211_ff_cf_del_blk_ack,
- &hf_ieee80211_ff_cf_imm_blk_ack,
- NULL
- };
+ while (offset < end) {
+ guint16 adv_charge_len = tvb_get_letohs(tvb, offset);
+ proto_tree *aoc_tree = NULL;
+ proto_tree *plan_info_tree = NULL;
+ proto_item *pi = NULL, *tpi = NULL;
+ int start_offset = offset;
+ guint8 aoc_type = 0, nai_realm_len = 0;
+ guint8 plan_index = 0;
+ guint16 plan_tot_len = 0;
+ int plan_offset = 0;
+
+ aoc_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
+ ett_hs20_advice_of_charge, &pi,
+ "Advice of Charge Duple %d", toc_index);
+ proto_tree_add_item(aoc_tree, hf_hs20_anqp_advice_of_charge_length, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- if ((tvb_get_letohs(tvb, offset) & 0x0001) != 0) {
- /* This is an AP */
- 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);
- } else {
- /* This is a STA */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_capture,
- ett_cap_tree, ieee80211_sta_fields,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- }
+ aoc_type = tvb_get_guint8(tvb, offset);
+ tpi = proto_tree_add_item(aoc_tree, hf_hs20_anqp_advice_of_charge_type, tvb,
+ offset, 1, ENC_NA);
+ offset++;
+ proto_item_append_text(tpi, ": %s",
+ val_to_str(aoc_type,
+ advice_of_charge_type_vals,
+ "Reserved (%u)"));
- return 2;
-}
+ proto_tree_add_item(aoc_tree, hf_hs20_anqp_aoc_nai_realm_encoding, tvb,
+ offset, 1, ENC_NA);
+ offset++;
-static guint
-add_ff_auth_alg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_auth_alg, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ nai_realm_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(aoc_tree, hf_hs20_anqp_aoc_nai_realm_len, tvb, offset,
+ 1, ENC_NA);
+ offset++;
-static guint
-add_ff_auth_trans_seq(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_auth_seq, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ proto_tree_add_item(aoc_tree, hf_hs20_anqp_aoc_nai_realm, tvb, offset,
+ nai_realm_len, ENC_UTF_8|ENC_NA);
+ offset += nai_realm_len;
-static guint
-add_ff_current_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_current_ap, tvb, offset, 6,
- ENC_NA);
- return 6;
-}
+ plan_tot_len = adv_charge_len - 3 - nai_realm_len;
+ plan_offset = offset;
-static guint
-add_ff_listen_ival(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_listen_ival, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ while (offset < (plan_offset + plan_tot_len)) {
+ guint16 plan_len = tvb_get_letohs(tvb, offset);
-static guint
-add_ff_reason_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_reason, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ plan_info_tree = proto_tree_add_subtree_format(aoc_tree, tvb, offset,
+ plan_len + 2, ett_hs20_aoc_plan, NULL,
+ "Plan #%u", plan_index);
-static guint
-add_ff_assoc_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_assoc_id, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ proto_tree_add_item(plan_info_tree, hf_hs20_anqp_aoc_plan_len, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
-static guint
-add_ff_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_status_code, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ proto_tree_add_item(plan_info_tree, hf_hs20_anqp_aoc_plan_lang, tvb,
+ offset, 3, ENC_ASCII|ENC_NA);
+ offset += 3;
-static guint
-add_ff_category_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_category_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ proto_tree_add_item(plan_info_tree, hf_hs20_anqp_aoc_plan_curcy, tvb,
+ offset, 3, ENC_ASCII|ENC_NA);
+ offset += 3;
-static guint
-add_ff_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_action_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ proto_tree_add_item(plan_info_tree, hf_hs20_anqp_aoc_plan_information,
+ tvb, offset, plan_len - 6, ENC_UTF_8|ENC_NA);
+ offset += plan_len - 6;
-static guint
-add_ff_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_dialog_token, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ plan_index++;
+ }
-static guint
-add_ff_followup_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_followup_dialog_token, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ proto_item_set_len(pi, offset - start_offset);
-static guint
-add_ff_wme_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_wme_action_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
+ toc_index++;
+ }
}
-static guint
-add_ff_wme_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+static int
+dissect_hs20_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_wme_status_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ guint8 subtype;
+ int ofn_hf_array[3] = {hf_hs20_anqp_ofn_length,
+ hf_hs20_anqp_ofn_language,
+ hf_hs20_anqp_ofn_name };
-static guint
-add_ff_qos_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_qos_action_code, tvb, offset, 1,
+ int end = tvb_reported_length(tvb);
+ int offset = 0;
+ anqp_info_dissector_data_t* anqp_data = (anqp_info_dissector_data_t*)data;
+
+ DISSECTOR_ASSERT(anqp_data);
+
+ subtype = tvb_get_guint8(tvb, offset);
+ proto_item_append_text(tree, " - HS 2.0 %s",
+ val_to_str(subtype, hs20_anqp_subtype_vals,
+ "Reserved (%u)"));
+ if (anqp_data->idx == 0) {
+ col_append_fstr(pinfo->cinfo, COL_INFO, " HS 2.0 %s",
+ val_to_str(subtype, hs20_anqp_subtype_vals,
+ "Reserved (%u)"));
+ } else if (anqp_data->idx == 1) {
+ col_append_str(pinfo->cinfo, COL_INFO, ", ..");
+ }
+ proto_tree_add_item(tree, hf_hs20_anqp_subtype, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
- return 1;
-}
+ offset++;
-static guint
-add_ff_block_ack_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_ba_action, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_hs20_anqp_reserved, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
- return 1;
-}
+ offset++;
-static guint
-add_ff_block_ack_param(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_block_ack_params,
- ett_ff_ba_param_tree,
- ieee80211_ff_block_ack_params_fields,
- ENC_LITTLE_ENDIAN);
- return 2;
-}
+ switch (subtype) {
+ case HS20_ANQP_HS_QUERY_LIST:
+ dissect_hs20_anqp_hs_query_list(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_HS_CAPABILITY_LIST:
+ dissect_hs20_anqp_hs_capability_list(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_OPERATOR_FRIENDLY_NAME:
+ dissect_hs20_anqp_operator_friendly_name(tree, tvb, pinfo, offset, end,
+ ofn_hf_array, ett_hs20_ofn_tree);
+ break;
+ case HS20_ANQP_WAN_METRICS:
+ dissect_hs20_anqp_wan_metrics(tree, tvb, offset, anqp_data->request);
+ break;
+ case HS20_ANQP_CONNECTION_CAPABILITY:
+ dissect_hs20_anqp_connection_capability(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_NAI_HOME_REALM_QUERY:
+ dissect_hs20_anqp_nai_home_realm_query(tree, tvb, pinfo, offset, end);
+ break;
+ case HS20_ANQP_OPERATING_CLASS_INDICATION:
+ dissect_hs20_anqp_oper_class_indic(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_OSU_PROVIDERS_LIST:
+ dissect_hs20_anqp_osu_providers_list(tree, tvb, pinfo, offset, end);
+ break;
+ case HS20_ANQP_ICON_REQUEST:
+ dissect_hs20_anqp_icon_request(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_ICON_BINARY_FILE:
+ dissect_hs20_anqp_icon_binary_file(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_OPERATOR_ICON_METADATA:
+ dissect_hs20_anqp_operator_icon_metadata(tree, tvb, offset, end);
+ break;
+ case HS20_ANQP_ADVICE_OF_CHARGE:
+ dissect_hs20_anqp_advice_of_charge(tree, tvb, offset, end);
+ break;
+ default:
+ if (offset == end)
+ break;
+ proto_tree_add_item(tree, hf_hs20_anqp_payload, tvb, offset,
+ end - offset, ENC_NA);
+ break;
+ }
-static guint
-add_ff_block_ack_timeout(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_block_ack_timeout, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
+ return tvb_captured_length(tvb);
}
-static guint
-add_ff_block_ack_ssc(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+static int
+dissect_vendor_wifi_alliance_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_block_ack_ssc,
- ett_ff_ba_ssc_tree, ieee80211_ff_block_ack_ssc_fields,
- ENC_LITTLE_ENDIAN);
- return 2;
+ guint8 subtype;
+ int offset = 0;
+ tvbuff_t *subtvb;
+
+ subtype = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_anqp_wfa_subtype, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ subtvb = tvb_new_subset_remaining(tvb, offset);
+ if (!dissector_try_uint_new(wifi_alliance_anqp_info_table, subtype, subtvb, pinfo, tree, FALSE, data))
+ call_data_dissector(subtvb, pinfo, tree);
+
+ return tvb_captured_length(tvb);
}
-static guint
-add_ff_qos_ts_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_tsinfo,
- ett_tsinfo_tree, ieee80211_tsinfo_fields,
- ENC_LITTLE_ENDIAN);
- return 3;
-}
-static guint
-add_ff_mesh_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_action, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+static int
+dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data);
-static guint
-add_ff_multihop_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+static int
+dissect_anqp_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
+ gboolean request, int idx)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_multihop_action, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ guint16 id, len;
+ guint32 oui;
+ proto_item *item, *item_len;
+ tvbuff_t *vendor_tvb;
+ anqp_info_dissector_data_t anqp_info;
-static guint
-add_ff_mesh_control(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- int start = offset;
- guint8 flags;
+ item = proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_id,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ id = tvb_get_letohs(tvb, offset);
+ if (id != ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST) {
+ if (idx == 0) {
+ proto_item_append_text(tree, " - %s",
+ val_to_str_ext(id, &anqp_info_id_vals_ext, "Unknown (%u)"));
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
+ val_to_str_ext(id, &anqp_info_id_vals_ext, "Unknown (%u)"));
+ } else if (idx == 1) {
+ proto_item_append_text(tree, ", ..");
+ col_append_str(pinfo->cinfo, COL_INFO, ", ..");
+ }
+ }
+ tree = proto_item_add_subtree(item, ett_gas_anqp);
+ offset += 2;
+ item_len = proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info_length,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ len = tvb_get_letohs(tvb, offset);
+ offset += 2;
+ if (tvb_reported_length_remaining(tvb, offset) < len) {
+ expert_add_info(pinfo, tree, &ei_ieee80211_ff_anqp_info_length);
+ return 4 + len;
+ }
+ switch (id)
+ {
+ case ANQP_INFO_ANQP_QUERY_LIST:
+ dissect_anqp_query_list(tree, tvb, pinfo, offset, offset + len);
+ break;
+ case ANQP_INFO_ANQP_CAPAB_LIST:
+ dissect_anqp_capab_list(tree, tvb, pinfo, offset, offset + len);
+ break;
+ case ANQP_INFO_VENUE_NAME_INFO:
+ dissect_venue_name_info(tree, tvb, pinfo, offset, offset + len);
+ break;
+ case ANQP_INFO_NETWORK_AUTH_TYPE_INFO:
+ dissect_network_auth_type(tree, tvb, offset, offset + len);
+ break;
+ case ANQP_INFO_ROAMING_CONSORTIUM_LIST:
+ dissect_roaming_consortium_list(tree, tvb, pinfo, offset, offset + len);
+ break;
+ case ANQP_INFO_IP_ADDR_TYPE_AVAILABILITY_INFO:
+ dissect_ip_addr_type_availability_info(tree, tvb, offset);
+ break;
+ case ANQP_INFO_NAI_REALM_LIST:
+ dissect_nai_realm_list(tree, tvb, pinfo, offset, offset + len);
+ break;
+ case ANQP_INFO_3GPP_CELLULAR_NETWORK_INFO:
+ dissect_3gpp_cellular_network_info(tree, tvb, pinfo, offset);
+ break;
+ case ANQP_INFO_DOMAIN_NAME_LIST:
+ dissect_domain_name_list(tree, tvb, offset, offset + len);
+ break;
+ case ANQP_INFO_NEIGHBOR_REPORT:
+ {
+ tvbuff_t *report_tvb;
+ ieee80211_tagged_field_data_t field_data;
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_flags, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- flags = tvb_get_guint8(tvb, offset);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_ttl, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_sequence, tvb, offset, 4,
- ENC_LITTLE_ENDIAN);
- offset += 4;
+ report_tvb = tvb_new_subset_length(tvb, offset, len);
+ field_data.item_tag = item;
+ field_data.item_tag_length = item_len;
+ dissect_neighbor_report(report_tvb, pinfo, tree, &field_data);
+ }
+ break;
+ case ANQP_INFO_ANQP_VENDOR_SPECIFIC_LIST:
+ proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
+ offset += 3;
+ vendor_tvb = tvb_new_subset_length(tvb, offset, len);
- switch (flags & 0x03) {
- case 1:
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr4, tvb, offset, 6,
- ENC_NA);
- offset += 6;
+ anqp_info.request = request;
+ anqp_info.idx = idx;
+ if (!dissector_try_uint_new(vendor_specific_anqp_info_table, oui, vendor_tvb, pinfo, tree, FALSE, &anqp_info))
+ {
+ proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info, tvb, offset, len, ENC_NA);
+ }
break;
- case 2:
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr5, tvb, offset, 6,
- ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr6, tvb, offset, 6,
- ENC_NA);
- offset += 6;
+ case ANQP_INFO_VENUE_URL:
+ dissect_anqp_venue_url(tree, tvb, offset, offset + len);
break;
- case 3:
- proto_item_append_text(tree, " Unknown Address Extension Mode");
+ case ANQP_INFO_ADVICE_OF_CHARGE:
+ dissect_hs20_anqp_advice_of_charge(tree, tvb, offset, offset + len);
break;
default:
- /* no default action */
+ proto_tree_add_item(tree, hf_ieee80211_ff_anqp_info,
+ tvb, offset, len, ENC_NA);
break;
}
- return offset - start;
-}
-
-static guint
-add_ff_selfprot_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_selfprot_action, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
+ return 4 + len;
}
-static guint
-add_ff_dls_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+static void
+dissect_anqp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, gboolean request)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_dls_action_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
-}
+ int idx = 0;
-static guint
-add_ff_dst_mac_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_dst_mac_addr, tvb, offset, 6,
- ENC_NA);
- return 6;
+ proto_item_append_text(tree, ": ANQP ");
+ proto_item_append_text(tree, request ? "Request" : "Response");
+ if (tvb_reported_length_remaining(tvb, offset) < 4) {
+ expert_add_info_format(pinfo, tree, &ei_ieee80211_not_enough_room_for_anqp_header,
+ "Not enough room for ANQP header");
+ return;
+ }
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", ANQP %s",
+ request ? "Req" : "Resp");
+ while (tvb_reported_length_remaining(tvb, offset) > 0) {
+ offset += dissect_anqp_info(tree, tvb, pinfo, offset, request, idx);
+ idx += 1;
+ }
}
static guint
-add_ff_src_mac_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+dissect_gas_initial_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
+ guint type, guint subtype)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_src_mac_addr, tvb, offset, 6,
- ENC_NA);
- return 6;
-}
+ guint16 req_len;
+ int start = offset;
+ proto_item *item;
+ proto_tree *query;
-static guint
-add_ff_req_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_req_ap_addr, tvb, offset, 6,
- ENC_NA);
- return 6;
-}
+ /* Query Request Length (2 octets) */
+ req_len = tvb_get_letohs(tvb, offset);
-static guint
-add_ff_res_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_res_ap_addr, tvb, offset, 6,
- ENC_NA);
- return 6;
-}
+ query = proto_tree_add_subtree(tree, tvb, offset, 2 + req_len, ett_gas_query, &item, "Query Request");
+ if (tvb_reported_length_remaining(tvb, offset) < 2 + req_len) {
+ expert_add_info(pinfo, item, &ei_ieee80211_ff_query_request_length);
+ return tvb_reported_length_remaining(tvb, offset);
+ }
-static guint
-add_ff_check_beacon(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_check_beacon, tvb, offset, 1,
- ENC_NA);
- return 1;
-}
+ proto_tree_add_item(query, hf_ieee80211_ff_query_request_length,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ /*
+ * Query Request (GAS query; formatted per protocol specified in the
+ * Advertisement Protocol IE)
+ */
+ switch (type) {
+ case ADV_PROTO_ID_ANQP:
+ dissect_anqp(query, tvb, pinfo, offset, TRUE);
+ break;
+ case ADV_PROTO_ID_VS:
+ if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) | WFA_SUBTYPE_DPP)) {
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
+ val_to_str(subtype >> 8, dpp_subtype_vals, "Unknown (%u)"));
+ dissect_wifi_dpp_config_proto(pinfo, query, tvb, offset);
+ }
+ break;
+ default:
+ proto_tree_add_item(query, hf_ieee80211_ff_query_request,
+ tvb, offset, req_len, ENC_NA);
+ }
+ offset += req_len;
-static guint
-add_ff_tod(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_tod, tvb, offset, 4,
- ENC_NA);
- return 4;
+ return offset - start;
}
static guint
-add_ff_toa(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+dissect_gas_initial_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
+ guint type, guint subtype)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_toa, tvb, offset, 4,
- ENC_NA);
- return 4;
-}
+ guint16 resp_len;
+ int start = offset;
+ proto_item *item;
+ proto_tree *query;
-static guint
-add_ff_max_tod_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_max_tod_err, tvb, offset, 1,
- ENC_NA);
- return 1;
-}
+ /* Query Response Length (2 octets) */
+ resp_len = tvb_get_letohs(tvb, offset);
-static guint
-add_ff_max_toa_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_max_toa_err, tvb, offset, 1,
- ENC_NA);
- return 1;
+ query = proto_tree_add_subtree(tree, tvb, offset, 2 + resp_len,
+ ett_gas_query, &item, "Query Response");
+ if (tvb_reported_length_remaining(tvb, offset) < 2 + resp_len) {
+ expert_add_info(pinfo, item, &ei_ieee80211_ff_query_response_length);
+ return tvb_reported_length_remaining(tvb, offset);
+ }
+
+ proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ /* Query Response (optional) */
+ if (resp_len) {
+ switch (type) {
+ case ADV_PROTO_ID_ANQP:
+ dissect_anqp(query, tvb, pinfo, offset, FALSE);
+ break;
+ case ADV_PROTO_ID_VS:
+ if (subtype == ((DPP_CONFIGURATION_PROTOCOL << 8) | WFA_SUBTYPE_DPP)) {
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", DPP - %s",
+ val_to_str(subtype >> 8, dpp_subtype_vals, "Unknown (%u)"));
+ dissect_wifi_dpp_config_proto(pinfo, query, tvb, offset);
+ }
+ break;
+ default:
+ proto_tree_add_item(query, hf_ieee80211_ff_query_response,
+ tvb, offset, resp_len, ENC_NA);
+ }
+ offset += resp_len;
+ }
+
+ return offset - start;
}
+static reassembly_table gas_reassembly_table;
+
+static gint ett_gas_resp_fragment = -1;
+static gint ett_gas_resp_fragments = -1;
+
+static int hf_ieee80211_gas_resp_fragments = -1;
+static int hf_ieee80211_gas_resp_fragment = -1;
+static int hf_ieee80211_gas_resp_fragment_overlap = -1;
+static int hf_ieee80211_gas_resp_fragment_overlap_conflict = -1;
+static int hf_ieee80211_gas_resp_fragment_multiple_tails = -1;
+static int hf_ieee80211_gas_resp_fragment_too_long_fragment = -1;
+static int hf_ieee80211_gas_resp_fragment_error = -1;
+static int hf_ieee80211_gas_resp_fragment_count = -1;
+static int hf_ieee80211_gas_resp_reassembled_in = -1;
+static int hf_ieee80211_gas_resp_reassembled_length = -1;
+
+static const fragment_items gas_resp_frag_items = {
+ &ett_gas_resp_fragment,
+ &ett_gas_resp_fragments,
+ &hf_ieee80211_gas_resp_fragments,
+ &hf_ieee80211_gas_resp_fragment,
+ &hf_ieee80211_gas_resp_fragment_overlap,
+ &hf_ieee80211_gas_resp_fragment_overlap_conflict,
+ &hf_ieee80211_gas_resp_fragment_multiple_tails,
+ &hf_ieee80211_gas_resp_fragment_too_long_fragment,
+ &hf_ieee80211_gas_resp_fragment_error,
+ &hf_ieee80211_gas_resp_fragment_count,
+ &hf_ieee80211_gas_resp_reassembled_in,
+ &hf_ieee80211_gas_resp_reassembled_length,
+ /* Reassembled data field */
+ NULL,
+ "GAS Response fragments"
+};
+
static guint
-add_ff_dls_timeout(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+dissect_gas_comeback_response(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset,
+ guint type, guint subtype _U_, guint8 frag, gboolean more,
+ guint8 dialog_token)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_dls_timeout, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
+ guint16 resp_len;
+ int start = offset;
+ proto_item *item;
+ proto_tree *query;
+
+ /* Query Response Length (2 octets) */
+ resp_len = tvb_get_letohs(tvb, offset);
+
+ query = proto_tree_add_subtree(tree, tvb, offset, 2 + resp_len,
+ ett_gas_query, &item, "Query Response");
+ if (tvb_reported_length_remaining(tvb, offset) < 2 + resp_len) {
+ expert_add_info(pinfo, item, &ei_ieee80211_ff_query_response_length);
+ return tvb_reported_length_remaining(tvb, offset);
+ }
+
+ proto_tree_add_item(query, hf_ieee80211_ff_query_response_length,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ /* Query Response (optional) */
+ if (resp_len) {
+ if (type == ADV_PROTO_ID_ANQP && (frag == 0) && !more)
+ dissect_anqp(query, tvb, pinfo, offset, FALSE);
+ else {
+ fragment_head *frag_msg;
+ gboolean save_fragmented;
+ tvbuff_t *new_tvb;
+
+ save_fragmented = pinfo->fragmented;
+ pinfo->fragmented = TRUE;
+ frag_msg = fragment_add_seq_check(&gas_reassembly_table, tvb, offset,
+ pinfo, dialog_token, NULL,
+ frag, resp_len, more);
+ new_tvb = process_reassembled_data(tvb, offset, pinfo,
+ "Reassembled GAS Query Response",
+ frag_msg, &gas_resp_frag_items,
+ NULL, tree);
+ if (new_tvb) {
+ if (type == ADV_PROTO_ID_ANQP)
+ dissect_anqp(query, new_tvb, pinfo, 0, FALSE);
+ else
+ proto_tree_add_item(query, hf_ieee80211_ff_query_response,
+ new_tvb, 0,
+ tvb_reported_length_remaining(new_tvb, 0),
+ ENC_NA);
+ }
+
+ /* The old tvb cannot be used anymore */
+ ieee80211_tvb_invalid = TRUE;
+
+ pinfo->fragmented = save_fragmented;
+ }
+ offset += resp_len;
+ }
+
+ return offset - start;
}
+/* ************************************************************************* */
+/* Dissect and add fixed mgmt fields to protocol tree */
+/* ************************************************************************* */
+
+static guint64 last_timestamp;
+
static guint
-add_ff_delba_param_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_timestamp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_delba_param,
- ett_ff_ba_param_tree, ieee80211_ff_delba_param_fields,
- ENC_LITTLE_ENDIAN);
- return 2;
+ last_timestamp = tvb_get_letoh64(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_ff_timestamp, tvb, offset, 8,
+ ENC_LITTLE_ENDIAN);
+ return 8;
}
static guint
-add_ff_max_reg_pwr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_beacon_interval(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_max_reg_pwr, tvb, offset, 2,
+ proto_tree_add_item(tree, hf_ieee80211_ff_beacon_interval, tvb, offset, 2,
ENC_LITTLE_ENDIAN);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", BI=%d",
+ tvb_get_letohs(tvb, offset));
return 2;
}
static guint
-add_ff_measurement_pilot_int(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_cap_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_measurement_pilot_int, tvb, offset,
- 1, ENC_NA);
- return 1;
+ static const int *ieee80211_ap_fields[] = {
+ &hf_ieee80211_ff_cf_ess,
+ &hf_ieee80211_ff_cf_ibss,
+ &hf_ieee80211_ff_cf_ap_poll,
+ &hf_ieee80211_ff_cf_privacy,
+ &hf_ieee80211_ff_cf_preamble,
+ &hf_ieee80211_ff_cf_pbcc,
+ &hf_ieee80211_ff_cf_agility,
+ &hf_ieee80211_ff_cf_spec_man,
+ &hf_ieee80211_ff_short_slot_time,
+ &hf_ieee80211_ff_cf_apsd,
+ &hf_ieee80211_ff_radio_measurement,
+ &hf_ieee80211_ff_dsss_ofdm,
+ &hf_ieee80211_ff_cf_del_blk_ack,
+ &hf_ieee80211_ff_cf_imm_blk_ack,
+ NULL
+ };
+
+ static const int *ieee80211_sta_fields[] = {
+ &hf_ieee80211_ff_cf_ess,
+ &hf_ieee80211_ff_cf_ibss,
+ &hf_ieee80211_ff_cf_sta_poll,
+ &hf_ieee80211_ff_cf_privacy,
+ &hf_ieee80211_ff_cf_preamble,
+ &hf_ieee80211_ff_cf_pbcc,
+ &hf_ieee80211_ff_cf_agility,
+ &hf_ieee80211_ff_cf_spec_man,
+ &hf_ieee80211_ff_short_slot_time,
+ &hf_ieee80211_ff_cf_apsd,
+ &hf_ieee80211_ff_radio_measurement,
+ &hf_ieee80211_ff_dsss_ofdm,
+ &hf_ieee80211_ff_cf_del_blk_ack,
+ &hf_ieee80211_ff_cf_imm_blk_ack,
+ NULL
+ };
+
+ if ((tvb_get_letohs(tvb, offset) & 0x0001) != 0) {
+ /* This is an AP */
+ 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,
+ ett_cap_tree, ieee80211_sta_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ }
+
+ return 2;
}
static guint
-add_ff_country_str(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_auth_alg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_country_str, tvb, offset, 3,
- ENC_ASCII|ENC_NA);
- return 3;
+ proto_tree_add_item(tree, hf_ieee80211_ff_auth_alg, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
static guint
-add_ff_max_tx_pwr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_auth_trans_seq(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_max_tx_pwr, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_auth_seq, tvb, offset, 2,
ENC_LITTLE_ENDIAN);
- return 1;
+ return 2;
}
static guint
-add_ff_tx_pwr_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_current_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_tx_pwr_used, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_current_ap, tvb, offset, 6,
+ ENC_NA);
+ return 6;
}
static guint
-add_ff_transceiver_noise_floor(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_listen_ival(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_transceiver_noise_floor, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- return 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_listen_ival, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
static guint
-add_ff_channel_width(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_reason_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_channel_width, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_reason, tvb, offset, 2,
ENC_LITTLE_ENDIAN);
- return 1;
+ return 2;
}
-/* QoS Info: 802.11-2012 8.4.1.17 */
static guint
-add_ff_qos_info_ap(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_assoc_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* From AP so decode as AP: Figure 8-51-QoS Info field when sent by a AP */
- 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);
- return 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_assoc_id, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
-
-/* QoS Info: 802.11-2012 8.4.1.17 */
static guint
-add_ff_qos_info_sta(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* To AP so decode as STA: Figure 8-52-QoS Info field when set by a non-AP STA */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_qos_info_sta,
- ett_ff_qos_info, ieee80211_ff_qos_info_sta_fields,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_status_code, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
static guint
-add_ff_sm_pwr_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_category_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_sm_pwr_save,
- ett_ff_sm_pwr_save, ieee80211_ff_sw_pwr_save_fields,
- ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_category_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_pco_phase_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_pco_phase_cntrl, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_action_code, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_psmp_param_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_psmp_param_set,
- ett_ff_psmp_param_set,
- ieee80211_ff_psmp_param_set_fields,
- ENC_LITTLE_ENDIAN);
- return 2;
+ proto_tree_add_item(tree, hf_ieee80211_ff_dialog_token, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_mimo_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_followup_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_item *mimo_item;
- proto_tree *mimo_tree;
- static const int *ieee80211_mimo_fields[] = {
- &hf_ieee80211_ff_mimo_cntrl_nc_index,
- &hf_ieee80211_ff_mimo_cntrl_nr_index,
- &hf_ieee80211_ff_mimo_cntrl_channel_width,
- &hf_ieee80211_ff_mimo_cntrl_grouping,
- &hf_ieee80211_ff_mimo_cntrl_coefficient_size,
- &hf_ieee80211_ff_mimo_cntrl_codebook_info,
- &hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment,
- &hf_ieee80211_ff_mimo_cntrl_reserved,
- NULL
- };
+ proto_tree_add_item(tree, hf_ieee80211_ff_followup_dialog_token, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- mimo_item = proto_tree_add_item(tree, hf_ieee80211_ff_mimo_cntrl, tvb,
- offset, 6, ENC_NA);
- mimo_tree = proto_item_add_subtree(mimo_item, ett_ff_mimo_cntrl);
+static guint
+add_ff_wme_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_wme_action_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- proto_tree_add_bitmask_list(mimo_tree, tvb, offset, 2, ieee80211_mimo_fields, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(mimo_tree, hf_ieee80211_ff_mimo_cntrl_sounding_timestamp,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
+static guint
+add_ff_wme_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_wme_status_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- return 6;
+static guint
+add_ff_qos_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_qos_action_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_ant_selection(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_block_ack_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_ant_selection,
- ett_ff_ant_sel, ieee80211_ff_ant_selection_fields,
- ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_ba_action, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_extended_channel_switch_announcement(proto_tree *tree, tvbuff_t *tvb,
- packet_info *pinfo _U_, int offset)
+add_ff_block_ack_param(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_bitmask(tree, tvb, offset,
- hf_ieee80211_ff_ext_channel_switch_announcement,
- ett_ff_chan_switch_announce,
- ieee80211_ff_ext_channel_switch_announcement_fields,
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_block_ack_params,
+ ett_ff_ba_param_tree,
+ ieee80211_ff_block_ack_params_fields,
ENC_LITTLE_ENDIAN);
- return 4;
+ return 2;
}
static guint
-add_ff_ht_information(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_block_ack_timeout(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_ht_info,
- ett_ff_ht_info, ieee80211_ff_ht_info_fields,
+ proto_tree_add_item(tree, hf_ieee80211_ff_block_ack_timeout, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_block_ack_ssc(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_block_ack_ssc,
+ ett_ff_ba_ssc_tree, ieee80211_ff_block_ack_ssc_fields,
ENC_LITTLE_ENDIAN);
- return 1;
+ return 2;
}
static guint
-add_ff_ht_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_qos_ts_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_ht_action, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_tsinfo,
+ ett_tsinfo_tree, ieee80211_tsinfo_fields,
+ ENC_LITTLE_ENDIAN);
+ return 3;
}
static guint
-add_ff_dmg_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_mesh_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_dmg_action_code, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_action, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_dmg_pwr_mgmt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_multihop_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_dmg_pwr_mgmt, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_multihop_action, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_psmp_sta_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_mesh_control(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_item *psmp_item;
- proto_tree *psmp_tree;
-
- psmp_item = proto_tree_add_item(tree, hf_ieee80211_ff_psmp_sta_info, tvb,
- offset, 8, ENC_LITTLE_ENDIAN);
- psmp_tree = proto_item_add_subtree(psmp_item, ett_ff_psmp_sta_info);
+ int start = offset;
+ guint8 flags;
- proto_tree_add_item(psmp_item, hf_ieee80211_ff_psmp_sta_info_type, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_flags, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ flags = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_ttl, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_sequence, tvb, offset, 4,
+ ENC_LITTLE_ENDIAN);
+ offset += 4;
- switch (tvb_get_letohl(tvb, offset) & PSMP_STA_INFO_FLAG_TYPE) {
- case PSMP_STA_INFO_BROADCAST:
- proto_tree_add_item(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
- /* Missing 64 bit bitmask... */
- proto_tree_add_uint64(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_reserved_large,
- tvb, offset, 8,
- (tvb_get_letoh64(tvb, offset) &
- G_GUINT64_CONSTANT(0xFFFFFFFFFFE00000)) >> 21);
+ switch (flags & 0x03) {
+ case 1:
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr4, tvb, offset, 6,
+ ENC_NA);
+ offset += 6;
break;
- case PSMP_STA_INFO_MULTICAST:
- proto_tree_add_item(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
- /* Missing 64 bit bitmask... */
- proto_tree_add_uint64(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id,
- tvb, offset, 6,
- (tvb_get_letoh64(tvb, offset) &
- G_GUINT64_CONSTANT(0xFFFFFFFFFFE00000)) >> 21);
+ case 2:
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr5, tvb, offset, 6,
+ ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_ff_mesh_addr6, tvb, offset, 6,
+ ENC_NA);
+ offset += 6;
break;
- case PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED:
- proto_tree_add_item(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_sta_id, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- proto_tree_add_item(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_utt_start_offset,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_utt_duration,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(psmp_tree,
- hf_ieee80211_ff_psmp_sta_info_reserved_small, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
+ case 3:
+ proto_item_append_text(tree, " Unknown Address Extension Mode");
+ break;
+ default:
+ /* no default action */
break;
}
- return 8;
-}
-
-static guint
-add_ff_schedule_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- static const int *ieee80211_schedule_info_fields1[] = {
- &hf_ieee80211_sched_info_agg,
- NULL
- };
- static const int *ieee80211_schedule_info_fields2[] = {
- &hf_ieee80211_sched_info_agg,
- &hf_ieee80211_sched_info_tsid,
- &hf_ieee80211_sched_info_dir,
- NULL
- };
-
- if (tvb_get_letohs(tvb, offset) & 0x0001) {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_sched_info,
- ett_sched_tree, ieee80211_schedule_info_fields2,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- } else {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_sched_info,
- ett_sched_tree, ieee80211_schedule_info_fields1,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- }
-
- return 2;
+ return offset - start;
}
static guint
-add_ff_pa_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_selfprot_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_public_action, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_selfprot_action, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_ppa_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_dls_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_protected_public_action, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_dls_action_code, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_ft_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_dst_mac_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_ft_action_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- return 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_dst_mac_addr, tvb, offset, 6,
+ ENC_NA);
+ return 6;
}
static guint
-add_ff_sta_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_src_mac_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_sta_address, tvb, offset, 6,
+ proto_tree_add_item(tree, hf_ieee80211_ff_src_mac_addr, tvb, offset, 6,
ENC_NA);
return 6;
}
static guint
-add_ff_target_ap_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_req_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_target_ap_address, tvb, offset, 6,
+ proto_tree_add_item(tree, hf_ieee80211_ff_req_ap_addr, tvb, offset, 6,
ENC_NA);
return 6;
}
static guint
-add_ff_gas_comeback_delay(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_res_ap_addr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_gas_comeback_delay, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
+ proto_tree_add_item(tree, hf_ieee80211_ff_res_ap_addr, tvb, offset, 6,
+ ENC_NA);
+ return 6;
}
static guint
-add_ff_gas_fragment_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_check_beacon(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_gas_fragment_id, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_ff_more_gas_fragments, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_check_beacon, tvb, offset, 1,
+ ENC_NA);
return 1;
}
static guint
-add_ff_sa_query_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_tod(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_sa_query_action_code, tvb, offset,
- 1, ENC_LITTLE_ENDIAN);
- return 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_tod, tvb, offset, 4,
+ ENC_NA);
+ return 4;
}
static guint
-add_ff_transaction_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_toa(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_transaction_id, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- return 2;
+ proto_tree_add_item(tree, hf_ieee80211_ff_toa, tvb, offset, 4,
+ ENC_NA);
+ return 4;
}
static guint
-add_ff_tdls_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_max_tod_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint8 code;
- code = tvb_get_guint8(tvb, offset);
- col_set_str(pinfo->cinfo, COL_INFO,
- val_to_str_ext_const(code, &tdls_action_codes_ext,
- "Unknown TDLS Action"));
- proto_tree_add_item(tree, hf_ieee80211_ff_tdls_action_code, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_max_tod_err, tvb, offset, 1,
+ ENC_NA);
return 1;
}
static guint
-add_ff_target_channel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_max_toa_err(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_target_channel, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_max_toa_err, tvb, offset, 1,
+ ENC_NA);
return 1;
}
static guint
-add_ff_operating_class(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_dls_timeout(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_operating_class, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_dls_timeout, tvb, offset, 2,
ENC_LITTLE_ENDIAN);
- return 1;
+ return 2;
}
static guint
-add_ff_wnm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_delba_param_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint8 code;
-
- code = tvb_get_guint8(tvb, offset);
- col_set_str(pinfo->cinfo, COL_INFO,
- val_to_str_ext_const(code, &wnm_action_codes_ext, "Unknown WNM Action"));
- proto_tree_add_item(tree, hf_ieee80211_ff_wnm_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- return 1;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_delba_param,
+ ett_ff_ba_param_tree, ieee80211_ff_delba_param_fields,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
static guint
-add_ff_unprotected_wnm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_max_reg_pwr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint8 code;
+ proto_tree_add_item(tree, hf_ieee80211_ff_max_reg_pwr, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
+}
- code = tvb_get_guint8(tvb, offset);
- col_set_str(pinfo->cinfo, COL_INFO,
- val_to_str_ext_const(code, &unprotected_wnm_action_codes_ext, "Unknown Unprotected WNM Action"));
- proto_tree_add_item(tree, hf_ieee80211_ff_unprotected_wnm_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+static guint
+add_ff_measurement_pilot_int(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_measurement_pilot_int, tvb, offset,
+ 1, ENC_NA);
return 1;
}
static guint
-add_ff_unprotected_dmg_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_country_str(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_unprotected_dmg_action_code, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_country_str, tvb, offset, 3,
+ ENC_ASCII|ENC_NA);
+ return 3;
+}
+
+static guint
+add_ff_max_tx_pwr(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_max_tx_pwr, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_key_data_length(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_tx_pwr_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_key_data_length, tvb, offset, 2,
+ proto_tree_add_item(tree, hf_ieee80211_ff_tx_pwr_used, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
- return 2;
+ return 1;
}
static guint
-add_ff_wnm_notification_type(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_transceiver_noise_floor(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_wnm_notification_type,
- tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_transceiver_noise_floor, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
return 1;
}
-/* Action frame: Radio Measurement actions */
static guint
-add_ff_rm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_channel_width(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_action_code, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_channel_width, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
+/* QoS Info: 802.11-2012 8.4.1.17 */
static guint
-add_ff_rm_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_qos_info_ap(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_dialog_token, tvb, offset, 1, ENC_NA);
+ /* From AP so decode as AP: Figure 8-51-QoS Info field when sent by a AP */
+ 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);
return 1;
}
-/* Radio Measurement Request frame, Action fields */
+
+/* QoS Info: 802.11-2012 8.4.1.17 */
static guint
-add_ff_rm_repetitions(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_qos_info_sta(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* Note: 65535 means repeated until cancelled or superseded */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_repetitions, tvb, offset, 2,
- ENC_BIG_ENDIAN);
- return 2;
+ /* To AP so decode as STA: Figure 8-52-QoS Info field when set by a non-AP STA */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_qos_info_sta,
+ ett_ff_qos_info, ieee80211_ff_qos_info_sta_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 1;
}
-/* Link Measurement Request frame, Action fields*/
static guint
-add_ff_rm_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_sm_pwr_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* In dBm, see 8.4.1.20 */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_tx_power, tvb, offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_sm_pwr_save,
+ ett_ff_sm_pwr_save, ieee80211_ff_sw_pwr_save_fields,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_rm_max_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_pco_phase_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* In dBm, see 8.4.1.19 */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_max_tx_power, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_pco_phase_cntrl, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
-/* Link Measurement Report frame, Action fields */
static guint
-add_ff_rm_tpc_report(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_psmp_param_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree *tpc_tree;
- proto_item *tpc_item;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_psmp_param_set,
+ ett_ff_psmp_param_set,
+ ieee80211_ff_psmp_param_set_fields,
+ ENC_LITTLE_ENDIAN);
+ return 2;
+}
- /* 8.4.2.19 TPC Report element */
- tpc_item = proto_tree_add_item(tree, hf_ieee80211_ff_tpc, tvb, offset, 4, ENC_NA);
- tpc_tree = proto_item_add_subtree(tpc_item, ett_tpc);
- proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_element_id, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_length, tvb, offset + 1, 1, ENC_NA);
- proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_tx_power, tvb, offset + 2, 1, ENC_NA);
- proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_link_margin, tvb, offset + 3, 1, ENC_NA);
- return 4;
+static guint
+add_ff_mimo_cntrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_item *mimo_item;
+ proto_tree *mimo_tree;
+ static const int *ieee80211_mimo_fields[] = {
+ &hf_ieee80211_ff_mimo_cntrl_nc_index,
+ &hf_ieee80211_ff_mimo_cntrl_nr_index,
+ &hf_ieee80211_ff_mimo_cntrl_channel_width,
+ &hf_ieee80211_ff_mimo_cntrl_grouping,
+ &hf_ieee80211_ff_mimo_cntrl_coefficient_size,
+ &hf_ieee80211_ff_mimo_cntrl_codebook_info,
+ &hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment,
+ &hf_ieee80211_ff_mimo_cntrl_reserved,
+ NULL
+ };
+
+ mimo_item = proto_tree_add_item(tree, hf_ieee80211_ff_mimo_cntrl, tvb,
+ offset, 6, ENC_NA);
+ mimo_tree = proto_item_add_subtree(mimo_item, ett_ff_mimo_cntrl);
+
+ proto_tree_add_bitmask_list(mimo_tree, tvb, offset, 2, ieee80211_mimo_fields, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(mimo_tree, hf_ieee80211_ff_mimo_cntrl_sounding_timestamp,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+
+ return 6;
}
static guint
-add_ff_rm_rx_antenna_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_ant_selection(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* 8.4.2.42: 0 means unknown, 1-254 is valid, 255 means multiple antennas */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_rx_antenna_id, tvb, offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_ant_selection,
+ ett_ff_ant_sel, ieee80211_ff_ant_selection_fields,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_rm_tx_antenna_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_extended_channel_switch_announcement(proto_tree *tree, tvbuff_t *tvb,
+ packet_info *pinfo _U_, int offset)
{
- /* 8.4.2.42: 0 means unknown, 1-254 is valid, 255 means multiple antennas */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_tx_antenna_id, tvb, offset, 1, ENC_NA);
- return 1;
+ proto_tree_add_bitmask(tree, tvb, offset,
+ hf_ieee80211_ff_ext_channel_switch_announcement,
+ ett_ff_chan_switch_announce,
+ ieee80211_ff_ext_channel_switch_announcement_fields,
+ ENC_LITTLE_ENDIAN);
+ return 4;
}
static guint
-add_ff_rm_rcpi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_ht_information(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* 8.4.2.40: RCPI as specified for certain PHYs */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_rcpi, tvb, offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_ht_info,
+ ett_ff_ht_info, ieee80211_ff_ht_info_fields,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_rm_rsni(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_ht_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- /* 8.4.2.43: RSNI in steps of 0.5 dB, calculated as:
- * RSNI = (10 * log10((RCPI_{power} - ANPI_{power}) / ANPI_{power}) + 20)*2 */
- proto_tree_add_item(tree, hf_ieee80211_ff_rm_rsni, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_ht_action, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_bss_transition_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_dmg_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_status_code, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_dmg_action_code, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_bss_termination_delay(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_dmg_pwr_mgmt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_termination_delay, tvb, offset, 1,
+ proto_tree_add_item(tree, hf_ieee80211_ff_dmg_pwr_mgmt, tvb, offset, 1,
ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_action_spectrum_mgmt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_psmp_sta_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- switch (tvb_get_guint8(tvb, offset + 1)) {
- case SM_ACTION_MEASUREMENT_REQUEST:
- case SM_ACTION_MEASUREMENT_REPORT:
- case SM_ACTION_TPC_REQUEST:
- case SM_ACTION_TPC_REPORT:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
- return 3;
- case SM_ACTION_CHAN_SWITCH_ANNC:
- case SM_ACTION_EXT_CHAN_SWITCH_ANNC:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_action_code(tree, tvb, pinfo, offset + 1);
- return 2;
- default:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_action_code(tree, tvb, pinfo, offset + 1);
- return 2;
- }
+ proto_item *psmp_item;
+ proto_tree *psmp_tree;
+
+ psmp_item = proto_tree_add_item(tree, hf_ieee80211_ff_psmp_sta_info, tvb,
+ offset, 8, ENC_LITTLE_ENDIAN);
+ psmp_tree = proto_item_add_subtree(psmp_item, ett_ff_psmp_sta_info);
+
+ proto_tree_add_item(psmp_item, hf_ieee80211_ff_psmp_sta_info_type, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+
+ switch (tvb_get_letohl(tvb, offset) & PSMP_STA_INFO_FLAG_TYPE) {
+ case PSMP_STA_INFO_BROADCAST:
+ proto_tree_add_item(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ /* Missing 64 bit bitmask... */
+ proto_tree_add_uint64(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_reserved_large,
+ tvb, offset, 8,
+ (tvb_get_letoh64(tvb, offset) &
+ G_GUINT64_CONSTANT(0xFFFFFFFFFFE00000)) >> 21);
+ break;
+ case PSMP_STA_INFO_MULTICAST:
+ proto_tree_add_item(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ /* Missing 64 bit bitmask... */
+ proto_tree_add_uint64(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id,
+ tvb, offset, 6,
+ (tvb_get_letoh64(tvb, offset) &
+ G_GUINT64_CONSTANT(0xFFFFFFFFFFE00000)) >> 21);
+ break;
+ case PSMP_STA_INFO_INDIVIDUALLY_ADDRESSED:
+ proto_tree_add_item(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_dtt_start_offset, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_dtt_duration,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_sta_id, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_utt_start_offset,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(psmp_tree, hf_ieee80211_ff_psmp_sta_info_utt_duration,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(psmp_tree,
+ hf_ieee80211_ff_psmp_sta_info_reserved_small, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ break;
+ }
+
+ return 8;
}
static guint
-add_ff_action_qos(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_schedule_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- switch (tvb_get_guint8(tvb, offset + 1)) {
- case QOS_ACTION_ADDTS_REQUEST:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
- return 3;
- case QOS_ACTION_ADDTS_RESPONSE:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
- add_ff_status_code(tree, tvb, pinfo, offset + 3);
- return 5;
- case QOS_ACTION_DELTS:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_qos_ts_info(tree, tvb, pinfo, offset + 2);
- add_ff_reason_code(tree, tvb, pinfo, offset + 5);
- return 7;
- case QOS_ACTION_SCHEDULE:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
- return 2;
- case QOS_ACTION_MAP_CONFIGURE:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
- return 2;
- default:
- add_ff_category_code(tree, tvb, pinfo, offset);
- return 2;
+ static const int *ieee80211_schedule_info_fields1[] = {
+ &hf_ieee80211_sched_info_agg,
+ NULL
+ };
+ static const int *ieee80211_schedule_info_fields2[] = {
+ &hf_ieee80211_sched_info_agg,
+ &hf_ieee80211_sched_info_tsid,
+ &hf_ieee80211_sched_info_dir,
+ NULL
+ };
+
+ if (tvb_get_letohs(tvb, offset) & 0x0001) {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_sched_info,
+ ett_sched_tree, ieee80211_schedule_info_fields2,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_sched_info,
+ ett_sched_tree, ieee80211_schedule_info_fields1,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
}
+
+ return 2;
}
static guint
-add_ff_action_dls(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_pa_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- switch (tvb_get_guint8(tvb, offset + 1)) {
- case DLS_ACTION_REQUEST:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_dls_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_dst_mac_addr(tree, tvb, pinfo, offset + 2);
- add_ff_src_mac_addr(tree, tvb, pinfo, offset + 8);
- add_ff_cap_info(tree, tvb, pinfo, offset + 14);
- add_ff_dls_timeout(tree, tvb, pinfo, offset + 16);
- return 18;
- case DLS_ACTION_RESPONSE:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_dls_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_status_code(tree, tvb, pinfo, offset + 2);
- add_ff_dst_mac_addr(tree, tvb, pinfo, offset + 4);
- add_ff_src_mac_addr(tree, tvb, pinfo, offset + 10);
- if (!hf_ieee80211_ff_status_code) {
- add_ff_cap_info(tree, tvb, pinfo, offset + 16);
- }
- return 16;
- case DLS_ACTION_TEARDOWN:
- add_ff_category_code(tree, tvb, pinfo, offset);
- add_ff_dls_action_code(tree, tvb, pinfo, offset + 1);
- add_ff_dst_mac_addr(tree, tvb, pinfo, offset + 2);
- add_ff_src_mac_addr(tree, tvb, pinfo, offset + 8);
- add_ff_reason_code(tree, tvb, pinfo, offset + 14);
- return 16;
- default:
- add_ff_category_code(tree, tvb, pinfo, offset);
- return 2;
- }
+ proto_tree_add_item(tree, hf_ieee80211_ff_public_action, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_block_ack(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_ppa_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint start = offset;
+ proto_tree_add_item(tree, hf_ieee80211_ff_protected_public_action, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- switch (tvb_get_guint8(tvb, offset + 1)) {
- case BA_ADD_BLOCK_ACK_REQUEST:
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_param(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_timeout(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_ssc(tree, tvb, pinfo, offset);
- break;
- case BA_ADD_BLOCK_ACK_RESPONSE:
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_param(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_timeout(tree, tvb, pinfo, offset);
- break;
- case BA_DELETE_BLOCK_ACK:
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
- offset += add_ff_delba_param_set(tree, tvb, pinfo, offset);
- offset += add_ff_reason_code(tree, tvb, pinfo, offset);
- break;
- }
+static guint
+add_ff_ft_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_ft_action_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- return offset - start; /* Size of fixed fields */
+static guint
+add_ff_sta_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_sta_address, tvb, offset, 6,
+ ENC_NA);
+ return 6;
}
static guint
-add_ff_action_public_fields(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, guint8 code)
+add_ff_target_ap_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint32 oui;
- guint type;
- guint subtype;
- guint8 dialog_token;
- guint8 frag;
- gboolean more;
- tvbuff_t *vendor_tvb;
- int dissected;
+ proto_tree_add_item(tree, hf_ieee80211_ff_target_ap_address, tvb, offset, 6,
+ ENC_NA);
+ return 6;
+}
- guint start = offset;
+static guint
+add_ff_gas_comeback_delay(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_gas_comeback_delay, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
+}
- switch (code) {
- case PA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT:
- offset += add_ff_extended_channel_switch_announcement(tree, tvb, pinfo, offset);
- break;
- case PA_VENDOR_SPECIFIC:
- proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
- offset += 3;
- switch (oui) {
- case OUI_WFA:
- subtype = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_oui_wfa_subtype, tvb, offset, 1, ENC_NA);
- offset += 1;
- vendor_tvb = tvb_new_subset_remaining(tvb, offset);
- dissected = dissector_try_uint_new(wifi_alliance_public_action_table, subtype, vendor_tvb, pinfo, tree, FALSE, NULL);
- offset += dissected;
- break;
- default:
- /* Don't know how to handle this vendor */
- break;
- }
- break;
- case PA_GAS_INITIAL_REQUEST:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
- &type, &subtype);
- offset += dissect_gas_initial_request(tree, tvb, pinfo, offset, type,
- subtype);
- break;
- case PA_GAS_INITIAL_RESPONSE:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- offset += add_ff_gas_comeback_delay(tree, tvb, pinfo, offset);
- offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
- &type, &subtype);
- offset += dissect_gas_initial_response(tree, tvb, pinfo, offset, type,
- subtype);
- break;
- case PA_GAS_COMEBACK_REQUEST:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case PA_GAS_COMEBACK_RESPONSE:
- dialog_token = tvb_get_guint8(tvb, offset);
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- frag = tvb_get_guint8(tvb, offset) & 0x7f;
- more = (tvb_get_guint8(tvb, offset) & 0x80) != 0;
- offset += add_ff_gas_fragment_id(tree, tvb, pinfo, offset);
- offset += add_ff_gas_comeback_delay(tree, tvb, pinfo, offset);
- offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
- &type, &subtype);
- offset += dissect_gas_comeback_response(tree, tvb, pinfo, offset, type,
- subtype, frag, more, dialog_token);
- break;
- case PA_TDLS_DISCOVERY_RESPONSE:
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "TDLS");
- col_set_str(pinfo->cinfo, COL_INFO, "TDLS Discovery Response");
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_cap_info(tree, tvb, pinfo, offset);
- break;
- case PA_QAB_REQUEST:
- case PA_QAB_RESPONSE:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_req_ap_addr(tree, tvb, pinfo, offset);
- offset += add_ff_res_ap_addr(tree, tvb, pinfo, offset);
- break;
- }
-
- return offset - start; /* Size of fixed fields */
+static guint
+add_ff_gas_fragment_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_gas_fragment_id, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_more_gas_fragments, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_public(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_sa_query_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint8 code;
- guint start = offset;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_pa_action_code(tree, tvb, pinfo, offset);
- offset += add_ff_action_public_fields(tree, tvb, pinfo, offset, code);
- return offset - start;
+ proto_tree_add_item(tree, hf_ieee80211_ff_sa_query_action_code, tvb, offset,
+ 1, ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_protected_public(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_transaction_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint8 code;
- guint start = offset;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_ppa_action_code(tree, tvb, pinfo, offset);
- offset += add_ff_action_public_fields(tree, tvb, pinfo, offset, code);
- return offset - start;
+ proto_tree_add_item(tree, hf_ieee80211_ff_transaction_id, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
static guint
-add_ff_action_radio_measurement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_tdls_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint start = offset;
guint8 code;
-
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
code = tvb_get_guint8(tvb, offset);
- offset += add_ff_rm_action_code(tree, tvb, pinfo, offset);
+ col_set_str(pinfo->cinfo, COL_INFO,
+ val_to_str_ext_const(code, &tdls_action_codes_ext,
+ "Unknown TDLS Action"));
+ proto_tree_add_item(tree, hf_ieee80211_ff_tdls_action_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- switch (code) {
- case RM_ACTION_RADIO_MEASUREMENT_REQUEST:
- offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_rm_repetitions(tree, tvb, pinfo, offset);
- /* Followed by Measurement Request Elements */
- break;
- case RM_ACTION_RADIO_MEASUREMENT_REPORT:
- offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
- /* Followed by Measurement Report Elements */
- break;
- case RM_ACTION_LINK_MEASUREMENT_REQUEST:
- offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_rm_tx_power(tree, tvb, pinfo, offset);
- offset += add_ff_rm_max_tx_power(tree, tvb, pinfo, offset);
- /* Followed by Optional Subelements */
- break;
- case RM_ACTION_LINK_MEASUREMENT_REPORT:
- offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_rm_tpc_report(tree, tvb, pinfo, offset);
- offset += add_ff_rm_rx_antenna_id(tree, tvb, pinfo, offset);
- offset += add_ff_rm_tx_antenna_id(tree, tvb, pinfo, offset);
- offset += add_ff_rm_rcpi(tree, tvb, pinfo, offset);
- offset += add_ff_rm_rsni(tree, tvb, pinfo, offset);
- /* Followed by Optional Subelements */
- break;
- case RM_ACTION_NEIGHBOR_REPORT_REQUEST:
- offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
- /* Followed by Optional Subelements */
- break;
- case RM_ACTION_NEIGHBOR_REPORT_RESPONSE:
- offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
- /* Followed by Neighbor Report Elements */
- break;
- }
+static guint
+add_ff_target_channel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_target_channel, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
+}
- return offset - start; /* Size of fixed fields */
+static guint
+add_ff_operating_class(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_operating_class, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_fast_bss_transition(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_wnm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint start = offset;
guint8 code;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_ft_action_code(tree, tvb, pinfo, offset);
-
- switch (code) {
- case FT_ACTION_REQUEST:
- offset += add_ff_sta_address(tree, tvb, pinfo, offset);
- offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
- /* Followed by FT Request frame body (IEs) */
- break;
- case FT_ACTION_RESPONSE:
- offset += add_ff_sta_address(tree, tvb, pinfo, offset);
- offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- /* Followed by FT Response frame body (IEs) */
- break;
- case FT_ACTION_CONFIRM:
- offset += add_ff_sta_address(tree, tvb, pinfo, offset);
- offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
- /* Followed by FT Confirm frame body (IEs) */
- break;
- case FT_ACTION_ACK:
- offset += add_ff_sta_address(tree, tvb, pinfo, offset);
- offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- /* Followed by FT Ack frame body (IEs) */
- break;
- }
-
- return offset - start; /* Size of fixed fields */
+ code = tvb_get_guint8(tvb, offset);
+ col_set_str(pinfo->cinfo, COL_INFO,
+ val_to_str_ext_const(code, &wnm_action_codes_ext, "Unknown WNM Action"));
+ proto_tree_add_item(tree, hf_ieee80211_ff_wnm_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_sa_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_unprotected_wnm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint start = offset;
guint8 code;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_sa_query_action_code(tree, tvb, pinfo, offset);
-
- switch (code) {
- case SA_QUERY_REQUEST:
- offset += add_ff_transaction_id(tree, tvb, pinfo, offset);
- break;
- case SA_QUERY_RESPONSE:
- offset += add_ff_transaction_id(tree, tvb, pinfo, offset);
- break;
- }
-
- return offset - start; /* Size of fixed fields */
+ code = tvb_get_guint8(tvb, offset);
+ col_set_str(pinfo->cinfo, COL_INFO,
+ val_to_str_ext_const(code, &unprotected_wnm_action_codes_ext, "Unknown Unprotected WNM Action"));
+ proto_tree_add_item(tree, hf_ieee80211_ff_unprotected_wnm_action_code, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_mesh(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_unprotected_dmg_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint length;
-
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_mesh_action(tree, tvb, pinfo, offset);
- /* The only fixed fields are the category and mesh action. The rest are IEs.
- */
- length = 2;
- if (tvb_get_guint8(tvb, 1) == MESH_ACTION_TBTT_ADJ_RESPONSE) {
- /* ..except for the TBTT Adjustment Response, which has a status code field
- */
- length += add_ff_status_code(tree, tvb, pinfo, offset);
- }
- return length;
+ proto_tree_add_item(tree, hf_ieee80211_ff_unprotected_dmg_action_code, tvb, offset, 1, ENC_NA);
+ return 1;
}
static guint
-add_ff_action_multihop(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_key_data_length(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint start = offset;
-
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_multihop_action(tree, tvb, pinfo, offset);
- offset += add_ff_mesh_control(tree, tvb, pinfo, offset);
- return offset - start;
+ proto_tree_add_item(tree, hf_ieee80211_ff_key_data_length, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ return 2;
}
static guint
-add_ff_action_self_protected(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_wnm_notification_type(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint start = offset;
-
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_selfprot_action(tree, tvb, pinfo, offset);
-
- switch (tvb_get_guint8(tvb, start + 1)) {
- case SELFPROT_ACTION_MESH_PEERING_OPEN:
- offset += add_ff_cap_info(tree, tvb, pinfo, offset);
- break;
- case SELFPROT_ACTION_MESH_PEERING_CONFIRM:
- offset += add_ff_cap_info(tree, tvb, pinfo, offset);
- offset += add_ff_assoc_id(tree, tvb, pinfo, offset);
- break;
- }
-
- return offset - start;
+ proto_tree_add_item(tree, hf_ieee80211_ff_wnm_notification_type,
+ tvb, offset, 1, ENC_NA);
+ return 1;
}
+/* Action frame: Radio Measurement actions */
static guint
-add_ff_vht_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_rm_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_vht_action, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_action_code, tvb, offset, 1, ENC_NA);
return 1;
}
static guint
-wnm_bss_trans_mgmt_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_dialog_token(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- gint left;
- int tmp_sublen;
- const guint8 ids[] = { TAG_NEIGHBOR_REPORT };
-
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_dialog_token, tvb, offset, 1, ENC_NA);
+ return 1;
+}
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
-
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_query_reason, tvb, offset, 1,
- ENC_NA);
- offset += 1;
-
- left = tvb_reported_length_remaining(tvb, offset);
- if (left > 0) {
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
- tvb, offset, left, ENC_NA);
-
- while (left > 0){
- tmp_sublen = tvb_get_guint8(tvb, offset + 1);
- if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
- break;
- }
- left -= (tmp_sublen + 2);
- offset += (tmp_sublen + 2);
- }
- }
-
- return offset - start;
+/* Radio Measurement Request frame, Action fields */
+static guint
+add_ff_rm_repetitions(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ /* Note: 65535 means repeated until cancelled or superseded */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_repetitions, tvb, offset, 2,
+ ENC_BIG_ENDIAN);
+ return 2;
}
-
+/* Link Measurement Request frame, Action fields*/
static guint
-wnm_bss_trans_mgmt_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- guint8 mode;
- gint left;
- int tmp_sublen;
- const guint8 ids[] = { TAG_NEIGHBOR_REPORT };
-
- static const int *ieee80211_ff_request_flags[] = {
- &hf_ieee80211_ff_request_mode_pref_cand,
- &hf_ieee80211_ff_request_mode_abridged,
- &hf_ieee80211_ff_request_mode_disassoc_imminent,
- &hf_ieee80211_ff_request_mode_bss_term_included,
- &hf_ieee80211_ff_request_mode_ess_disassoc_imminent,
- NULL
- };
-
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
-
- mode = tvb_get_guint8(tvb, offset);
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_ff_request_flags, ENC_LITTLE_ENDIAN);
- offset += 1;
-
- proto_tree_add_item(tree, hf_ieee80211_ff_disassoc_timer, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- offset += 2;
-
- proto_tree_add_item(tree, hf_ieee80211_ff_validity_interval, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset += 1;
-
- if (mode & 0x08) {
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_termination_duration,
- tvb, offset, 8, ENC_NA);
- offset += 8;
- }
-
- if (mode & 0x10) {
- guint8 url_len;
- url_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_ff_url_len, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_url, tvb, offset, url_len,
- ENC_ASCII|ENC_NA);
- offset += url_len;
- }
-
- left = tvb_reported_length_remaining(tvb, offset);
- if (left > 0) {
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
- tvb, offset, left, ENC_NA);
-
- while (left > 0){
- tmp_sublen = tvb_get_guint8(tvb, offset + 1);
- if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
- break;
- }
- left -= (tmp_sublen + 2);
- offset += (tmp_sublen + 2);
- }
- }
-
- return offset - start;
+ /* In dBm, see 8.4.1.20 */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_tx_power, tvb, offset, 1, ENC_NA);
+ return 1;
}
-
static guint
-wnm_bss_trans_mgmt_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_max_tx_power(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- guint8 code;
- gint left;
- int tmp_sublen;
- const guint8 ids[] = { TAG_NEIGHBOR_REPORT };
+ /* In dBm, see 8.4.1.19 */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_max_tx_power, tvb, offset, 1, ENC_NA);
+ return 1;
+}
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_bss_transition_status_code(tree, tvb, pinfo, offset);
- offset += add_ff_bss_termination_delay(tree, tvb, pinfo, offset);
- if (!code) {
- proto_tree_add_item(tree, hf_ieee80211_ff_target_bss,
- tvb, offset, 6, ENC_NA);
- offset += 6;
- }
- left = tvb_reported_length_remaining(tvb, offset);
- if (left > 0) {
- proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
- tvb, offset, left, ENC_NA);
- while (left > 0){
- tmp_sublen = tvb_get_guint8(tvb, offset + 1);
- if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
- break;
- }
- left -= (tmp_sublen + 2);
- offset += (tmp_sublen + 2);
- }
- }
+/* Link Measurement Report frame, Action fields */
+static guint
+add_ff_rm_tpc_report(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree *tpc_tree;
+ proto_item *tpc_item;
- return offset - start;
+ /* 8.4.2.19 TPC Report element */
+ tpc_item = proto_tree_add_item(tree, hf_ieee80211_ff_tpc, tvb, offset, 4, ENC_NA);
+ tpc_tree = proto_item_add_subtree(tpc_item, ett_tpc);
+ proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_element_id, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_length, tvb, offset + 1, 1, ENC_NA);
+ proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_tx_power, tvb, offset + 2, 1, ENC_NA);
+ proto_tree_add_item(tpc_tree, hf_ieee80211_ff_tpc_link_margin, tvb, offset + 3, 1, ENC_NA);
+ return 4;
}
static guint
-wnm_sleep_mode_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_rx_antenna_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- return offset - start;
+ /* 8.4.2.42: 0 means unknown, 1-254 is valid, 255 means multiple antennas */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_rx_antenna_id, tvb, offset, 1, ENC_NA);
+ return 1;
}
static guint
-wnm_sleep_mode_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_tx_antenna_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- guint16 key_data_len;
- gint left;
-
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- key_data_len = tvb_get_letohs(tvb, offset);
- offset += add_ff_key_data_length(tree, tvb, pinfo, offset);
- left = tvb_reported_length_remaining(tvb, offset);
- if (left < key_data_len) {
- expert_add_info(pinfo, tree, &ei_ieee80211_tag_wnm_sleep_mode_no_key_data);
- return offset - start;
- }
- proto_tree_add_item(tree, hf_ieee80211_ff_key_data, tvb, offset,
- key_data_len, ENC_NA);
- offset += key_data_len;
- return offset - start;
+ /* 8.4.2.42: 0 means unknown, 1-254 is valid, 255 means multiple antennas */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_tx_antenna_id, tvb, offset, 1, ENC_NA);
+ return 1;
}
static guint
-wnm_tfs_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_rcpi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- return offset - start;
+ /* 8.4.2.40: RCPI as specified for certain PHYs */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_rcpi, tvb, offset, 1, ENC_NA);
+ return 1;
}
static guint
-wnm_tfs_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_rm_rsni(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- return offset - start;
+ /* 8.4.2.43: RSNI in steps of 0.5 dB, calculated as:
+ * RSNI = (10 * log10((RCPI_{power} - ANPI_{power}) / ANPI_{power}) + 20)*2 */
+ proto_tree_add_item(tree, hf_ieee80211_ff_rm_rsni, tvb, offset, 1, ENC_NA);
+ return 1;
}
static guint
-wnm_notification_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_bss_transition_status_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- int start = offset;
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_wnm_notification_type(tree, tvb, pinfo, offset);
- return offset - start;
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_status_code, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_wnm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_bss_termination_delay(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- guint8 code;
- guint start = offset;
-
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_wnm_action_code(tree, tvb, pinfo, offset);
- switch (code) {
- case WNM_BSS_TRANS_MGMT_QUERY:
- offset += wnm_bss_trans_mgmt_query(tree, tvb, pinfo, offset);
- break;
- case WNM_BSS_TRANS_MGMT_REQ:
- offset += wnm_bss_trans_mgmt_req(tree, tvb, pinfo, offset);
- break;
- case WNM_BSS_TRANS_MGMT_RESP:
- offset += wnm_bss_trans_mgmt_resp(tree, tvb, pinfo, offset);
- break;
- case WNM_TFS_REQ:
- offset += wnm_tfs_req(tree, tvb, pinfo, offset);
- break;
- case WNM_TFS_RESP:
- offset += wnm_tfs_resp(tree, tvb, pinfo, offset);
- break;
- case WNM_SLEEP_MODE_REQ:
- offset += wnm_sleep_mode_req(tree, tvb, pinfo, offset);
- break;
- case WNM_SLEEP_MODE_RESP:
- offset += wnm_sleep_mode_resp(tree, tvb, pinfo, offset);
- break;
- case WNM_NOTIFICATION_REQ:
- offset += wnm_notification_req(tree, tvb, pinfo, offset);
- break;
- }
-
- return offset - start; /* Size of fixed fields */
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_termination_delay, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ return 1;
}
static guint
-add_ff_action_unprotected_wnm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_action_spectrum_mgmt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint8 code;
- guint start = offset;
-
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_unprotected_wnm_action_code(tree, tvb, pinfo, offset);
-
- switch (code) {
- case UNPROTECTED_WNM_TIM:
- offset += add_ff_check_beacon(tree, tvb, pinfo, offset);
- offset += add_ff_timestamp(tree, tvb, pinfo, offset);
- offset += add_ff_tod(tree, tvb, pinfo, offset);
- offset += add_ff_toa(tree, tvb, pinfo, offset);
- offset += add_ff_max_tod_err(tree, tvb, pinfo, offset);
- offset += add_ff_max_toa_err(tree, tvb, pinfo, offset);
+ switch (tvb_get_guint8(tvb, offset + 1)) {
+ case SM_ACTION_MEASUREMENT_REQUEST:
+ case SM_ACTION_MEASUREMENT_REPORT:
+ case SM_ACTION_TPC_REQUEST:
+ case SM_ACTION_TPC_REPORT:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
+ return 3;
+ case SM_ACTION_CHAN_SWITCH_ANNC:
+ case SM_ACTION_EXT_CHAN_SWITCH_ANNC:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_action_code(tree, tvb, pinfo, offset + 1);
+ return 2;
+ default:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_action_code(tree, tvb, pinfo, offset + 1);
+ return 2;
+ }
+}
+
+static guint
+add_ff_action_qos(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ switch (tvb_get_guint8(tvb, offset + 1)) {
+ case QOS_ACTION_ADDTS_REQUEST:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
+ return 3;
+ case QOS_ACTION_ADDTS_RESPONSE:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_dialog_token(tree, tvb, pinfo, offset + 2);
+ add_ff_status_code(tree, tvb, pinfo, offset + 3);
+ return 5;
+ case QOS_ACTION_DELTS:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_qos_ts_info(tree, tvb, pinfo, offset + 2);
+ add_ff_reason_code(tree, tvb, pinfo, offset + 5);
+ return 7;
+ case QOS_ACTION_SCHEDULE:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
+ return 2;
+ case QOS_ACTION_MAP_CONFIGURE:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_qos_action_code(tree, tvb, pinfo, offset + 1);
+ return 2;
+ default:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ return 2;
+ }
+}
+
+static guint
+add_ff_action_dls(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ switch (tvb_get_guint8(tvb, offset + 1)) {
+ case DLS_ACTION_REQUEST:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_dls_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_dst_mac_addr(tree, tvb, pinfo, offset + 2);
+ add_ff_src_mac_addr(tree, tvb, pinfo, offset + 8);
+ add_ff_cap_info(tree, tvb, pinfo, offset + 14);
+ add_ff_dls_timeout(tree, tvb, pinfo, offset + 16);
+ return 18;
+ case DLS_ACTION_RESPONSE:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_dls_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_status_code(tree, tvb, pinfo, offset + 2);
+ add_ff_dst_mac_addr(tree, tvb, pinfo, offset + 4);
+ add_ff_src_mac_addr(tree, tvb, pinfo, offset + 10);
+ if (!hf_ieee80211_ff_status_code) {
+ add_ff_cap_info(tree, tvb, pinfo, offset + 16);
+ }
+ return 16;
+ case DLS_ACTION_TEARDOWN:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ add_ff_dls_action_code(tree, tvb, pinfo, offset + 1);
+ add_ff_dst_mac_addr(tree, tvb, pinfo, offset + 2);
+ add_ff_src_mac_addr(tree, tvb, pinfo, offset + 8);
+ add_ff_reason_code(tree, tvb, pinfo, offset + 14);
+ return 16;
+ default:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ return 2;
+ }
+}
+
+static guint
+add_ff_action_block_ack(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint start = offset;
+
+ switch (tvb_get_guint8(tvb, offset + 1)) {
+ case BA_ADD_BLOCK_ACK_REQUEST:
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_param(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_timeout(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_ssc(tree, tvb, pinfo, offset);
break;
- case UNPROTECTED_WNM_TIMING_MEASUREMENT:
+ case BA_ADD_BLOCK_ACK_RESPONSE:
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_followup_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_param(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_timeout(tree, tvb, pinfo, offset);
+ break;
+ case BA_DELETE_BLOCK_ACK:
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_block_ack_action_code(tree, tvb, pinfo, offset);
+ offset += add_ff_delba_param_set(tree, tvb, pinfo, offset);
+ offset += add_ff_reason_code(tree, tvb, pinfo, offset);
break;
}
}
static guint
-add_ff_action_tdls(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_action_public_fields(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, guint8 code)
{
- guint8 code;
- guint16 status;
- guint start = offset;
+ guint32 oui;
+ guint type;
+ guint subtype;
+ guint8 dialog_token;
+ guint8 frag;
+ gboolean more;
+ tvbuff_t *vendor_tvb;
+ int dissected;
+
+ guint start = offset;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_tdls_action_code(tree, tvb, pinfo, offset);
switch (code) {
- case TDLS_SETUP_REQUEST:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_cap_info(tree, tvb, pinfo, offset);
+ case PA_EXT_CHANNEL_SWITCH_ANNOUNCEMENT:
+ offset += add_ff_extended_channel_switch_announcement(tree, tvb, pinfo, offset);
break;
- case TDLS_SETUP_RESPONSE:
- status = tvb_get_letohs(tvb, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- if (tvb_reported_length_remaining(tvb, offset) < 2) {
- if (status == 0) {
- expert_add_info(pinfo, tree, &ei_ieee80211_tdls_setup_response_malformed);
- }
+ case PA_VENDOR_SPECIFIC:
+ proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
+ offset += 3;
+ switch (oui) {
+ case OUI_WFA:
+ subtype = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_oui_wfa_subtype, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ vendor_tvb = tvb_new_subset_remaining(tvb, offset);
+ dissected = dissector_try_uint_new(wifi_alliance_public_action_table, subtype, vendor_tvb, pinfo, tree, FALSE, NULL);
+ offset += dissected;
break;
- }
- offset += add_ff_cap_info(tree, tvb, pinfo, offset);
- break;
- case TDLS_SETUP_CONFIRM:
- status = tvb_get_letohs(tvb, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- if (tvb_reported_length_remaining(tvb, offset) < 1) {
- if (status == 0) {
- expert_add_info(pinfo, tree, &ei_ieee80211_tdls_setup_confirm_malformed);
- }
+ default:
+ /* Don't know how to handle this vendor */
break;
}
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case TDLS_TEARDOWN:
- offset += add_ff_reason_code(tree, tvb, pinfo, offset);
break;
- case TDLS_PEER_TRAFFIC_INDICATION:
+ case PA_GAS_INITIAL_REQUEST:
offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
+ &type, &subtype);
+ offset += dissect_gas_initial_request(tree, tvb, pinfo, offset, type,
+ subtype);
break;
- case TDLS_CHANNEL_SWITCH_REQUEST:
- offset += add_ff_target_channel(tree, tvb, pinfo, offset);
- offset += add_ff_operating_class(tree, tvb, pinfo, offset);
- break;
- case TDLS_CHANNEL_SWITCH_RESPONSE:
+ case PA_GAS_INITIAL_RESPONSE:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ offset += add_ff_gas_comeback_delay(tree, tvb, pinfo, offset);
+ offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
+ &type, &subtype);
+ offset += dissect_gas_initial_response(tree, tvb, pinfo, offset, type,
+ subtype);
break;
- case TDLS_PEER_PSM_REQUEST:
+ case PA_GAS_COMEBACK_REQUEST:
offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
break;
- case TDLS_PEER_PSM_RESPONSE:
+ case PA_GAS_COMEBACK_RESPONSE:
+ dialog_token = tvb_get_guint8(tvb, offset);
offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ frag = tvb_get_guint8(tvb, offset) & 0x7f;
+ more = (tvb_get_guint8(tvb, offset) & 0x80) != 0;
+ offset += add_ff_gas_fragment_id(tree, tvb, pinfo, offset);
+ offset += add_ff_gas_comeback_delay(tree, tvb, pinfo, offset);
+ offset += dissect_advertisement_protocol_common(pinfo, tree, tvb, offset,
+ &type, &subtype);
+ offset += dissect_gas_comeback_response(tree, tvb, pinfo, offset, type,
+ subtype, frag, more, dialog_token);
break;
- case TDLS_PEER_TRAFFIC_RESPONSE:
+ case PA_TDLS_DISCOVERY_RESPONSE:
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "TDLS");
+ col_set_str(pinfo->cinfo, COL_INFO, "TDLS Discovery Response");
offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_cap_info(tree, tvb, pinfo, offset);
break;
- case TDLS_DISCOVERY_REQUEST:
+ case PA_QAB_REQUEST:
+ case PA_QAB_RESPONSE:
offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_req_ap_addr(tree, tvb, pinfo, offset);
+ offset += add_ff_res_ap_addr(tree, tvb, pinfo, offset);
break;
}
}
static guint
-add_ff_action_mgmt_notification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_action_public(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
+ guint8 code;
guint start = offset;
-
offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_wme_action_code(tree, tvb, pinfo, offset);
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_wme_status_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_pa_action_code(tree, tvb, pinfo, offset);
+ offset += add_ff_action_public_fields(tree, tvb, pinfo, offset, code);
+ return offset - start;
+}
- return offset - start; /* Size of fixed fields */
+static guint
+add_ff_action_protected_public(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint8 code;
+ guint start = offset;
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_ppa_action_code(tree, tvb, pinfo, offset);
+ offset += add_ff_action_public_fields(tree, tvb, pinfo, offset, code);
+ return offset - start;
}
static guint
-add_ff_action_vendor_specific(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_action_radio_measurement(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint start = offset;
- guint32 oui;
- tvbuff_t *vendor_tvb;
- int dissected;
+ guint start = offset;
+ guint8 code;
offset += add_ff_category_code(tree, tvb, pinfo, offset);
- proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
- offset += 3;
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_rm_action_code(tree, tvb, pinfo, offset);
- vendor_tvb = tvb_new_subset_remaining(tvb, offset);
- dissected = dissector_try_uint_new(vendor_specific_action_table, oui, vendor_tvb, pinfo, tree, FALSE, NULL);
- if (dissected <= 0)
- {
- call_data_dissector(vendor_tvb, pinfo, tree);
- /* don't advance the dissector pointer as this will probably cause more malformed packets
- if vendor is unknown. It also matches previous behavior (before dissection table implementation) */
- dissected = 0;
+ switch (code) {
+ case RM_ACTION_RADIO_MEASUREMENT_REQUEST:
+ offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_repetitions(tree, tvb, pinfo, offset);
+ /* Followed by Measurement Request Elements */
+ break;
+ case RM_ACTION_RADIO_MEASUREMENT_REPORT:
+ offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
+ /* Followed by Measurement Report Elements */
+ break;
+ case RM_ACTION_LINK_MEASUREMENT_REQUEST:
+ offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_tx_power(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_max_tx_power(tree, tvb, pinfo, offset);
+ /* Followed by Optional Subelements */
+ break;
+ case RM_ACTION_LINK_MEASUREMENT_REPORT:
+ offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_tpc_report(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_rx_antenna_id(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_tx_antenna_id(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_rcpi(tree, tvb, pinfo, offset);
+ offset += add_ff_rm_rsni(tree, tvb, pinfo, offset);
+ /* Followed by Optional Subelements */
+ break;
+ case RM_ACTION_NEIGHBOR_REPORT_REQUEST:
+ offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
+ /* Followed by Optional Subelements */
+ break;
+ case RM_ACTION_NEIGHBOR_REPORT_RESPONSE:
+ offset += add_ff_rm_dialog_token(tree, tvb, pinfo, offset);
+ /* Followed by Neighbor Report Elements */
+ break;
}
- offset += dissected;
-
return offset - start; /* Size of fixed fields */
}
static guint
-add_ff_action_ht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_action_fast_bss_transition(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
guint start = offset;
- guint8 n_sta, i;
- mimo_control_t mimo_cntrl;
+ guint8 code;
offset += add_ff_category_code(tree, tvb, pinfo, offset);
- offset += add_ff_ht_action_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_ft_action_code(tree, tvb, pinfo, offset);
- switch (tvb_get_guint8(tvb, offset - 1)) {
- case HT_ACTION_NOTIFY_CHAN_WIDTH:
- offset += add_ff_channel_width(tree, tvb, pinfo, offset);
- break;
- case HT_ACTION_SM_PWR_SAVE:
- offset += add_ff_sm_pwr_cntrl(tree, tvb, pinfo, offset);
- break;
- case HT_ACTION_PSMP_ACTION:
- n_sta = tvb_get_guint8(tvb, offset);
- offset += add_ff_psmp_param_set(tree, tvb, pinfo, offset);
- for (i = 0; i < (n_sta & 0x0F); i++) {
- offset += add_ff_psmp_sta_info(tree, tvb, pinfo, offset);
- }
- break;
- case HT_ACTION_SET_PCO_PHASE:
- offset += add_ff_pco_phase_cntrl(tree, tvb, pinfo, offset);
+ switch (code) {
+ case FT_ACTION_REQUEST:
+ offset += add_ff_sta_address(tree, tvb, pinfo, offset);
+ offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
+ /* Followed by FT Request frame body (IEs) */
break;
- case HT_ACTION_MIMO_CSI:
- mimo_cntrl = get_mimo_control(tvb, offset);
- offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
- offset += add_mimo_csi_matrices_report(tree, tvb, offset, mimo_cntrl);
+ case FT_ACTION_RESPONSE:
+ offset += add_ff_sta_address(tree, tvb, pinfo, offset);
+ offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ /* Followed by FT Response frame body (IEs) */
break;
- case HT_ACTION_MIMO_BEAMFORMING:
- mimo_cntrl = get_mimo_control(tvb, offset);
- offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
- offset += add_mimo_beamforming_feedback_report(tree, tvb, offset,
- mimo_cntrl);
+ case FT_ACTION_CONFIRM:
+ offset += add_ff_sta_address(tree, tvb, pinfo, offset);
+ offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
+ /* Followed by FT Confirm frame body (IEs) */
break;
- case HT_ACTION_MIMO_COMPRESSED_BEAMFORMING:
- mimo_cntrl = get_mimo_control(tvb, offset);
- offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
- offset += add_mimo_compressed_beamforming_feedback_report(tree, tvb,
- offset,
- mimo_cntrl);
+ case FT_ACTION_ACK:
+ offset += add_ff_sta_address(tree, tvb, pinfo, offset);
+ offset += add_ff_target_ap_address(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ /* Followed by FT Ack frame body (IEs) */
break;
- case HT_ACTION_ANT_SEL_FEEDBACK:
- offset += add_ff_ant_selection(tree, tvb, pinfo, offset);
+ }
+
+ return offset - start; /* Size of fixed fields */
+}
+
+static guint
+add_ff_action_sa_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint start = offset;
+ guint8 code;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_sa_query_action_code(tree, tvb, pinfo, offset);
+
+ switch (code) {
+ case SA_QUERY_REQUEST:
+ offset += add_ff_transaction_id(tree, tvb, pinfo, offset);
break;
- case HT_ACTION_HT_INFO_EXCHANGE:
- offset += add_ff_ht_information(tree, tvb, pinfo, offset);
+ case SA_QUERY_RESPONSE:
+ offset += add_ff_transaction_id(tree, tvb, pinfo, offset);
break;
}
- return offset - start;
+ return offset - start; /* Size of fixed fields */
}
static guint
-add_ff_beacon_interval_ctrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_action_mesh(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bic,
- ett_bic_tree, ieee80211_ff_bic_fields,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ guint length;
- return 6;
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_mesh_action(tree, tvb, pinfo, offset);
+ /* The only fixed fields are the category and mesh action. The rest are IEs.
+ */
+ length = 2;
+ if (tvb_get_guint8(tvb, 1) == MESH_ACTION_TBTT_ADJ_RESPONSE) {
+ /* ..except for the TBTT Adjustment Response, which has a status code field
+ */
+ length += add_ff_status_code(tree, tvb, pinfo, offset);
+ }
+ return length;
}
static guint
-add_ff_beamforming_ctrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset, gboolean isGrant)
+add_ff_action_multihop(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- guint16 bf_field = tvb_get_letohs(tvb, offset);
- gboolean isInit = (bf_field & 0x2) >> 1;
- gboolean isResp = (bf_field & 0x4) >> 2;
- static const int *ieee80211_ff_beamforming_ctrl[] = {
- &hf_ieee80211_ff_bf_train,
- &hf_ieee80211_ff_bf_is_init,
- &hf_ieee80211_ff_bf_is_resp,
- &hf_ieee80211_ff_bf_rxss_len,
- &hf_ieee80211_ff_bf_rxss_rate,
- &hf_ieee80211_ff_bf_b10b15,
- NULL
- };
-
- static const int *ieee80211_ff_beamforming_ctrl_grant[] = {
- &hf_ieee80211_ff_bf_train,
- &hf_ieee80211_ff_bf_is_init,
- &hf_ieee80211_ff_bf_is_resp,
- &hf_ieee80211_ff_bf_num_sectors,
- &hf_ieee80211_ff_bf_num_rx_dmg_ants,
- &hf_ieee80211_ff_bf_b12b15,
- NULL
- };
+ guint start = offset;
- if((isInit==TRUE) && (isResp==TRUE) && isGrant) {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bf,
- ett_bf_tree, ieee80211_ff_beamforming_ctrl_grant,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- } else {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bf,
- ett_bf_tree, ieee80211_ff_beamforming_ctrl,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- }
- return 2;
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_multihop_action(tree, tvb, pinfo, offset);
+ offset += add_ff_mesh_control(tree, tvb, pinfo, offset);
+ return offset - start;
}
static guint
-add_ff_dynamic_allocation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_action_self_protected(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- static const int *ieee80211_ff_dynamic_allocation[] = {
- &hf_ieee80211_ff_TID,
- &hf_ieee80211_ff_alloc_type,
- &hf_ieee80211_ff_src_aid,
- &hf_ieee80211_ff_dest_aid,
- &hf_ieee80211_ff_alloc_duration,
- &hf_ieee80211_ff_b39,
- NULL
- };
+ guint start = offset;
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_dynamic_allocation,
- ett_dynamic_alloc_tree, ieee80211_ff_dynamic_allocation,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_selfprot_action(tree, tvb, pinfo, offset);
- return 5;
+ switch (tvb_get_guint8(tvb, start + 1)) {
+ case SELFPROT_ACTION_MESH_PEERING_OPEN:
+ offset += add_ff_cap_info(tree, tvb, pinfo, offset);
+ break;
+ case SELFPROT_ACTION_MESH_PEERING_CONFIRM:
+ offset += add_ff_cap_info(tree, tvb, pinfo, offset);
+ offset += add_ff_assoc_id(tree, tvb, pinfo, offset);
+ break;
+ }
+
+ return offset - start;
}
static guint
-add_ff_beamformed_link(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+add_ff_vht_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
{
- static const int *ieee80211_ff_beamformed_link[] = {
- &hf_ieee80211_ff_blm_unit_index,
- &hf_ieee80211_ff_blm_maint_value,
- &hf_ieee80211_ff_blm_is_master,
- NULL
- };
-
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_blm,
- ett_blm_tree, ieee80211_ff_beamformed_link,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_tree_add_item(tree, hf_ieee80211_ff_vht_action, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
return 1;
}
static guint
-add_ff_BRP_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+get_ff_auth_sae_len(tvbuff_t *tvb)
{
- static const int *ieee80211_ff_BRP_request[] = {
- &hf_ieee80211_ff_brp_L_RX,
- &hf_ieee80211_ff_brp_TX_TRN_REQ,
- &hf_ieee80211_ff_brp_MID_REQ,
- &hf_ieee80211_ff_brp_BC_REQ,
- &hf_ieee80211_ff_brp_MID_GRANT,
- &hf_ieee80211_ff_brp_BC_GRANT,
- &hf_ieee80211_ff_brp_chan_FBCK_CAP,
- &hf_ieee80211_ff_brp_tx_sector,
- &hf_ieee80211_ff_brp_other_aid,
- &hf_ieee80211_ff_brp_tx_antenna,
- &hf_ieee80211_ff_brp_reserved,
- NULL
- };
+ guint alg, seq, status_code;
+ alg = tvb_get_letohs(tvb, 0);
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_brp,
- ett_brp_tree, ieee80211_ff_BRP_request,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return 4;
+ /* SAE authentication is alg 3 (cf auth_alg) */
+ if (alg != 3)
+ return 0;
+
+ seq = tvb_get_letohs(tvb, 2);
+ status_code = tvb_get_letohs(tvb, 4);
+
+ /* 82: Rejected with Suggested BSS Transition (cf ieee80211_status_code) */
+ if ((seq == 2) && (status_code == 82))
+ return 0;
+
+ /* everything is fixed size fields */
+ return tvb_reported_length_remaining(tvb, 6);
}
-static guint
-add_ff_sector_sweep_feedback_from_iss(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+static void
+add_ff_auth_sae(proto_tree *tree, tvbuff_t *tvb)
{
- static const int *ieee80211_ff_sector_sweep_feedback_from_iss[] = {
- &hf_ieee80211_ff_sswf_total_sectors,
- &hf_ieee80211_ff_sswf_num_rx_dmg_ants,
- &hf_ieee80211_ff_sswf_reserved1,
- &hf_ieee80211_ff_sswf_poll_required,
- &hf_ieee80211_ff_sswf_reserved2,
- NULL
- };
+ guint alg, seq, status_code, len;
+ alg = tvb_get_letohs(tvb, 0);
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_sswf,
- ett_sswf_tree, ieee80211_ff_sector_sweep_feedback_from_iss,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return 3;
-}
+ /* SAE authentication is alg 3 (cf auth_alg) */
+ if (alg != 3)
+ return;
-static guint
-add_ff_sector_sweep_feedback_to_iss(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- static const int *ieee80211_ff_sector_sweep_feedback_to_iss[] = {
- &hf_ieee80211_ff_sswf_sector_select,
- &hf_ieee80211_ff_sswf_dmg_antenna_select,
- &hf_ieee80211_ff_sswf_snr_report,
- &hf_ieee80211_ff_sswf_poll_required,
- &hf_ieee80211_ff_sswf_reserved2,
- NULL
- };
+ seq = tvb_get_letohs(tvb, 2);
+ status_code = tvb_get_letohs(tvb, 4);
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_sswf,
- ett_sswf_tree, ieee80211_ff_sector_sweep_feedback_to_iss,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return 3;
+ if (seq == 1)
+ {
+ /* 76: Authentication is rejected because an Anti-Clogging Token is required (cf ieee80211_status_code) */
+ if (status_code == 76)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_ff_finite_cyclic_group, tvb, 6, 2,
+ ENC_LITTLE_ENDIAN);
+ len = tvb_reported_length_remaining(tvb, 8);
+ proto_tree_add_item(tree, hf_ieee80211_ff_anti_clogging_token, tvb, 8, len,
+ ENC_NA);
+ }
+ else if (status_code == 0)
+ {
+ guint group = tvb_get_letohs(tvb, 6);
+ guint sc_len, elt_len, offset;
+ proto_tree_add_item(tree, hf_ieee80211_ff_finite_cyclic_group, tvb, 6, 2,
+ ENC_LITTLE_ENDIAN);
+ offset = 8;
+ len = tvb_reported_length_remaining(tvb, offset);
+ switch (group)
+ {
+ /* Diffie-Hellman groups */
+ case 1:
+ sc_len = elt_len = 96;
+ break;
+ case 2:
+ sc_len = elt_len = 128;
+ break;
+ case 5:
+ sc_len = elt_len = 192;
+ break;
+ case 14:
+ sc_len = elt_len = 256;
+ break;
+ case 15:
+ sc_len = elt_len = 384;
+ break;
+ case 16:
+ sc_len = elt_len = 512;
+ break;
+ case 17:
+ sc_len = elt_len = 768;
+ break;
+ case 18:
+ sc_len = elt_len = 1024;
+ break;
+ case 22:
+ sc_len = 20;
+ elt_len = 128;
+ break;
+ case 23:
+ sc_len = 28;
+ elt_len = 256;
+ break;
+ case 24:
+ sc_len = 32;
+ elt_len = 256;
+ break;
+ /* ECC groups */
+ case 19:
+ case 28:
+ sc_len = 32;
+ elt_len = 64;
+ break;
+ case 20:
+ case 29:
+ sc_len = 48;
+ elt_len = 96;
+ break;
+ case 21:
+ sc_len = 66;
+ elt_len = 132;
+ break;
+ case 25:
+ sc_len = 24;
+ elt_len = 48;
+ break;
+ case 26:
+ sc_len = 28;
+ elt_len = 56;
+ break;
+ case 30:
+ sc_len = 64;
+ elt_len = 128;
+ break;
+ default:
+ /* assume no anti-clogging token */
+ if (!(len % 3))
+ {
+ sc_len = len / 3;
+ }
+ else
+ {
+ sc_len = len / 2;
+ }
+ elt_len = len - sc_len;
+ break;
+ }
+
+ if ((sc_len + elt_len) < len)
+ {
+ len = len - (sc_len + elt_len);
+ proto_tree_add_item(tree, hf_ieee80211_ff_anti_clogging_token, tvb, offset,
+ len, ENC_NA);
+ offset += len;
+ }
+ proto_tree_add_item(tree, hf_ieee80211_ff_scalar, tvb, offset,
+ sc_len, ENC_NA);
+ offset += sc_len;
+ proto_tree_add_item(tree, hf_ieee80211_ff_finite_field_element, tvb, offset,
+ elt_len, ENC_NA);
+ }
+ }
+ /* 82: Rejected with Suggested BSS Transition (cf ieee80211_status_code) */
+ else if ((seq == 2) && (status_code != 82))
+ {
+ proto_tree_add_item(tree, hf_ieee80211_ff_send_confirm, tvb, 6, 2,
+ ENC_LITTLE_ENDIAN);
+ len = tvb_reported_length_remaining(tvb, 8);
+ proto_tree_add_item(tree, hf_ieee80211_ff_confirm, tvb, 8, len,
+ ENC_NA);
+ };
}
static guint
-add_ff_sector_sweep(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_bss_trans_mgmt_query(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- static const int *ieee80211_ff_sector_sweep[] = {
- &hf_ieee80211_ff_ssw_direction,
- &hf_ieee80211_ff_ssw_cdown,
- &hf_ieee80211_ff_ssw_sector_id,
- &hf_ieee80211_ff_ssw_dmg_ant_id,
- &hf_ieee80211_ff_ssw_rxss_len,
- NULL
- };
+ int start = offset;
+ gint left;
+ int tmp_sublen;
+ const guint8 ids[] = { TAG_NEIGHBOR_REPORT };
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_ssw,
- ett_ssw_tree, ieee80211_ff_sector_sweep,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return 3;
+
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_query_reason, tvb, offset, 1,
+ ENC_NA);
+ offset += 1;
+
+ left = tvb_reported_length_remaining(tvb, offset);
+ if (left > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
+ tvb, offset, left, ENC_NA);
+
+ while (left > 0){
+ tmp_sublen = tvb_get_guint8(tvb, offset + 1);
+ if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
+ break;
+ }
+ left -= (tmp_sublen + 2);
+ offset += (tmp_sublen + 2);
+ }
+ }
+
+ return offset - start;
}
+
static guint
-add_ff_dmg_params(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_bss_trans_mgmt_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- static const int *ieee80211_ff_dmg_params[] = {
- &hf_ieee80211_ff_dmg_params_bss,
- &hf_ieee80211_ff_dmg_params_cbap_only,
- &hf_ieee80211_ff_dmg_params_cbap_src,
- &hf_ieee80211_ff_dmg_params_privacy,
- &hf_ieee80211_ff_dmg_params_policy,
+ int start = offset;
+ guint8 mode;
+ gint left;
+ int tmp_sublen;
+ const guint8 ids[] = { TAG_NEIGHBOR_REPORT };
+
+ static const int *ieee80211_ff_request_flags[] = {
+ &hf_ieee80211_ff_request_mode_pref_cand,
+ &hf_ieee80211_ff_request_mode_abridged,
+ &hf_ieee80211_ff_request_mode_disassoc_imminent,
+ &hf_ieee80211_ff_request_mode_bss_term_included,
+ &hf_ieee80211_ff_request_mode_ess_disassoc_imminent,
NULL
};
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_dmg_params,
- ett_dmg_params_tree, ieee80211_ff_dmg_params,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return 1;
-}
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
-static guint
-add_ff_cc_field(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean dis)
-{
- proto_item *cc_item = proto_tree_add_item(tree, hf_ieee80211_ff_cc, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- proto_tree *cc_tree = proto_item_add_subtree(cc_item, ett_cc_tree);
- guint64 cc_field;
- if(dis) {
- proto_tree_add_item(cc_tree, hf_ieee80211_ff_cc_abft_resp_addr, tvb, offset, 6, ENC_NA);
- } else {
- cc_field = tvb_get_letoh64(tvb, offset);
- /*TODO : Add support of bitmask for FT_(U)INT64 */
- proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_sp_duration, tvb, offset, 1, (guint32)(cc_field & 0xff));
- proto_tree_add_uint64(cc_tree, hf_ieee80211_ff_cc_cluster_id, tvb, offset+1, 6, (guint64)((cc_field & G_GUINT64_CONSTANT(0x00ffffffffffff00)) >> 8));
- proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_role, tvb, offset+7, 1, (guint32)((cc_field & G_GUINT64_CONSTANT(0x0300000000000000)) >> 56));
- proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_max_mem, tvb, offset+7, 1, (guint32)((cc_field & G_GUINT64_CONSTANT(0x7c00000000000000)) >> 58));
+ mode = tvb_get_guint8(tvb, offset);
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_ff_request_flags, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ieee80211_ff_disassoc_timer, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_ff_validity_interval, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ if (mode & 0x08) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_termination_duration,
+ tvb, offset, 8, ENC_NA);
+ offset += 8;
}
- return 8;
-}
+ if (mode & 0x10) {
+ guint8 url_len;
+ url_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_ff_url_len, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_url, tvb, offset, url_len,
+ ENC_ASCII|ENC_NA);
+ offset += url_len;
+ }
-static guint
-add_ff_band_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_band_id, tvb, offset, 1, ENC_NA);
- return 1;
-}
+ left = tvb_reported_length_remaining(tvb, offset);
+ if (left > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
+ tvb, offset, left, ENC_NA);
-static guint
-add_ff_subject_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_subject_address, tvb, offset, 6, ENC_NA);
- return 6;
-}
+ while (left > 0){
+ tmp_sublen = tvb_get_guint8(tvb, offset + 1);
+ if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
+ break;
+ }
+ left -= (tmp_sublen + 2);
+ offset += (tmp_sublen + 2);
+ }
+ }
-static guint
-add_ff_handover_reason(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_handover_reason, tvb, offset, 1, ENC_NA);
- return 1;
+ return offset - start;
}
-static guint
-add_ff_handover_remaining_bi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_handover_remaining_bi, tvb, offset, 1, ENC_NA);
- return 1;
-}
static guint
-add_ff_handover_result(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_bss_trans_mgmt_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_handover_result, tvb, offset, 1, ENC_NA);
- return 1;
+ int start = offset;
+ guint8 code;
+ gint left;
+ int tmp_sublen;
+ const guint8 ids[] = { TAG_NEIGHBOR_REPORT };
+
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_bss_transition_status_code(tree, tvb, pinfo, offset);
+ offset += add_ff_bss_termination_delay(tree, tvb, pinfo, offset);
+ if (!code) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_target_bss,
+ tvb, offset, 6, ENC_NA);
+ offset += 6;
+ }
+ left = tvb_reported_length_remaining(tvb, offset);
+ if (left > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_bss_transition_candidate_list_entries,
+ tvb, offset, left, ENC_NA);
+ while (left > 0){
+ tmp_sublen = tvb_get_guint8(tvb, offset + 1);
+ if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
+ break;
+ }
+ left -= (tmp_sublen + 2);
+ offset += (tmp_sublen + 2);
+ }
+ }
+
+ return offset - start;
}
static guint
-add_ff_handover_reject_reason(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_sleep_mode_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_handover_reject_reason, tvb, offset, 1, ENC_NA);
- return 1;
+ int start = offset;
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ return offset - start;
}
static guint
-add_ff_destination_reds_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_sleep_mode_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_destination_reds_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return 2;
-}
+ int start = offset;
+ guint16 key_data_len;
+ gint left;
-static guint
-add_ff_destination_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_destination_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return 2;
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ key_data_len = tvb_get_letohs(tvb, offset);
+ offset += add_ff_key_data_length(tree, tvb, pinfo, offset);
+ left = tvb_reported_length_remaining(tvb, offset);
+ if (left < key_data_len) {
+ expert_add_info(pinfo, tree, &ei_ieee80211_tag_wnm_sleep_mode_no_key_data);
+ return offset - start;
+ }
+ proto_tree_add_item(tree, hf_ieee80211_ff_key_data, tvb, offset,
+ key_data_len, ENC_NA);
+ offset += key_data_len;
+ return offset - start;
}
static guint
-add_ff_realy_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_tfs_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_realy_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return 2;
+ int start = offset;
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ return offset - start;
}
static guint
-add_ff_source_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_tfs_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_tree_add_item(tree, hf_ieee80211_ff_source_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return 2;
+ int start = offset;
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ return offset - start;
}
-static guint
-add_ff_timing_offset(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_timing_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return 2;
-}
+#define AP_DESCRIPTOR 0
+#define FIRMWARE_VERSION_CURRENT 1
+#define FIRMWARE_VERSION_NEW 2
static guint
-add_ff_sampling_frequency_offset(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_sampling_frequency_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return 2;
-}
+dissect_wnm_subelements(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
+ int offset) {
+ guint sub_elt_id = tvb_get_guint8(tvb, offset);
+ guint sub_elt_len = tvb_get_guint8(tvb, offset + 1);
-static guint
-add_ff_relay_operation_type(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_relay_operation_type, tvb, offset, 1, ENC_NA);
- return 1;
-}
+ proto_tree_add_item(tree, hf_ieee80211_wnm_sub_elt_id, tvb, offset, 1, ENC_NA);
+ offset++;
-static guint
-add_ff_fst_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_fst_action_code, tvb, offset, 1, ENC_NA);
- return 1;
-}
+ proto_tree_add_item(tree, hf_ieee80211_wnm_sub_elt_len, tvb, offset, 1, ENC_NA);
+ offset++;
-static guint
-add_ff_llt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_llt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- return 4;
-}
+ switch (sub_elt_id) {
+ case AP_DESCRIPTOR:
-static guint
-add_ff_fsts_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- proto_tree_add_item(tree, hf_ieee80211_ff_fsts_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- return 4;
-}
+ break;
-static guint
-add_ff_oct_mmpdu(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
-{
- guint start = offset;
- guint len = tvb_get_letohs(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_ff_mmpdu_len, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_ff_mmpdu_ctrl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_ff_oct_mmpdu, tvb, offset, len, ENC_NA);
- offset += len;
- return offset - start;
-}
+ case FIRMWARE_VERSION_CURRENT:
-static int
-add_tag_relay_capabilities(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;
- static const int *ieee80211_tag_relay_capabilities[] = {
- &hf_ieee80211_tag_relay_support,
- &hf_ieee80211_tag_relay_use,
- &hf_ieee80211_tag_relay_permission,
- &hf_ieee80211_tag_AC_power,
- &hf_ieee80211_tag_relay_prefer,
- &hf_ieee80211_tag_duplex,
- &hf_ieee80211_tag_cooperation,
- NULL
- };
+ break;
- if (tag_len < 2) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length must be 2");
- return 1;
+ case FIRMWARE_VERSION_NEW:
+
+ break;
}
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_relay_capabilities, ENC_NA);
- return tvb_captured_length(tvb);
+ offset += sub_elt_len;
+ return offset;
}
-#if 0
static guint
-add_ff_relay_capable_sta_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+wnm_notification_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_item *rcsi_item = proto_tree_add_item(tree, hf_ieee80211_ff_rcsi, tvb, offset, 3, ENC_LITTLE_ENDIAN);
- proto_tree *rcsi_tree = proto_item_add_subtree(rcsi_item, ett_rcsi_tree);
- proto_tree_add_item(rcsi_tree, hf_ieee80211_ff_rcsi_aid, tvb, offset, 1, ENC_NA);
- offset += 1;
- add_tag_relay_capabilities(pinfo, rcsi_item, 2, rcsi_tree, tvb, &offset);
- return 3;
+ int start = offset;
+ int len = 0;
+ guint8 wnm_type = 0;
+ guint8 wnm_sub_elt = 0;
+
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ wnm_type = tvb_get_guint8(tvb, offset);
+ offset += add_ff_wnm_notification_type(tree, tvb, pinfo, offset);
+ len = tvb_reported_length_remaining(tvb, offset);
+
+ if (wnm_type == 0) {
+ int offset_end = offset + len;
+ while (offset < offset_end) {
+ int start_offset = offset;
+ proto_tree *wnm_list = NULL;
+ proto_item *wnm_item = NULL;
+ wnm_list = proto_tree_add_subtree_format(tree, tvb, offset, -1,
+ ett_wnm_notif_subelt,
+ &wnm_item, "WNM Subelement %d", wnm_sub_elt);
+ offset = dissect_wnm_subelements(wnm_list, tvb, pinfo, offset);
+ proto_item_set_len(wnm_item, offset - start_offset);
+ }
+ }
+ return offset - start;
}
-#endif
-static void
-dissect_ieee80211_extension(guint16 fcf, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+static guint
+add_ff_action_wnm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- proto_item *ti;
- proto_tree *ext_tree;
- proto_tree *fixed_tree;
- proto_tree *tagged_tree;
-
- int offset = 0;
- int tagged_parameter_tree_len;
-
- ti = proto_tree_add_item(tree, proto_wlan_ext, tvb, offset, -1, ENC_NA);
- ext_tree = proto_item_add_subtree(ti, ett_80211_ext);
-
- switch (COMPOSE_FRAME_TYPE(fcf))
- {
- case EXTENSION_DMG_BEACON:
- {
- gboolean cc, dis;
- guint16 bic_field;
- fixed_tree = get_fixed_parameter_tree(ext_tree, tvb, offset, 20);
- offset += add_ff_timestamp(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_sector_sweep(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_beacon_interval(fixed_tree, tvb, pinfo, offset);
- bic_field = tvb_get_letohs(tvb, offset);
- cc = (bic_field & 0x1);
- dis = (bic_field & 0x2) >> 1;
- offset += add_ff_beacon_interval_ctrl(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_dmg_params(fixed_tree, tvb, pinfo, offset);
- if(cc) {
- offset += add_ff_cc_field(fixed_tree, tvb, offset, dis);
- }
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ guint8 code;
+ guint start = offset;
- /*
- * The tagged params are optional here. See Table 8.33a of the 2012
- * version of the standard.
- */
- if (tagged_parameter_tree_len) {
- tagged_tree = get_tagged_parameter_tree(ext_tree, tvb, offset, tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, EXTENSION_DMG_BEACON, NULL);
- }
- break;
- }
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_wnm_action_code(tree, tvb, pinfo, offset);
+ switch (code) {
+ case WNM_BSS_TRANS_MGMT_QUERY:
+ offset += wnm_bss_trans_mgmt_query(tree, tvb, pinfo, offset);
+ break;
+ case WNM_BSS_TRANS_MGMT_REQ:
+ offset += wnm_bss_trans_mgmt_req(tree, tvb, pinfo, offset);
+ break;
+ case WNM_BSS_TRANS_MGMT_RESP:
+ offset += wnm_bss_trans_mgmt_resp(tree, tvb, pinfo, offset);
+ break;
+ case WNM_TFS_REQ:
+ offset += wnm_tfs_req(tree, tvb, pinfo, offset);
+ break;
+ case WNM_TFS_RESP:
+ offset += wnm_tfs_resp(tree, tvb, pinfo, offset);
+ break;
+ case WNM_SLEEP_MODE_REQ:
+ offset += wnm_sleep_mode_req(tree, tvb, pinfo, offset);
+ break;
+ case WNM_SLEEP_MODE_RESP:
+ offset += wnm_sleep_mode_resp(tree, tvb, pinfo, offset);
+ break;
+ case WNM_NOTIFICATION_REQ:
+ offset += wnm_notification_req(tree, tvb, pinfo, offset);
+ break;
}
+
+ return offset - start; /* Size of fixed fields */
}
static guint
-add_ff_action_unprotected_dmg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+add_ff_action_unprotected_wnm(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
guint8 code;
guint start = offset;
offset += add_ff_category_code(tree, tvb, pinfo, offset);
code = tvb_get_guint8(tvb, offset);
- offset += add_ff_unprotected_dmg_action_code(tree, tvb, pinfo, offset);
+ offset += add_ff_unprotected_wnm_action_code(tree, tvb, pinfo, offset);
+
switch (code) {
- case UNPROTECTED_DMG_ANNOUNCE:
- offset += add_ff_timestamp(tree, tvb, pinfo, offset);
- offset += add_ff_beacon_interval(tree, tvb, pinfo, offset);
- break;
- case UNPROTECTED_DMG_BRP:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_BRP_request(tree, tvb, pinfo, offset);
- break;
+ case UNPROTECTED_WNM_TIM:
+ offset += add_ff_check_beacon(tree, tvb, pinfo, offset);
+ offset += add_ff_timestamp(tree, tvb, pinfo, offset);
+ offset += add_ff_tod(tree, tvb, pinfo, offset);
+ offset += add_ff_toa(tree, tvb, pinfo, offset);
+ offset += add_ff_max_tod_err(tree, tvb, pinfo, offset);
+ offset += add_ff_max_toa_err(tree, tvb, pinfo, offset);
+ break;
+ case UNPROTECTED_WNM_TIMING_MEASUREMENT:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_followup_dialog_token(tree, tvb, pinfo, offset);
+ break;
}
- return offset - start;
+
+ return offset - start; /* Size of fixed fields */
}
-/* There is no easy way to skip all these subcarrier indices that must not
- * be displayed when showing compressed beamforming feedback matrices
- * Table 8-53g IEEE Std 802.11ac-2013 amendment.
- *
- * The irregular use of case statements in this function is to improve
- * readability in what is otherwise a large funtion that does very little.
- */
-static inline int
-vht_compressed_skip_scidx(guint8 nchan_width, guint8 ng, int scidx)
+static guint
+add_ff_action_tdls(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- switch(nchan_width) {
- /* 20 MHz */
- case 0:
- /* No Grouping */
- if (ng == 0)
- switch (scidx) {
- /* Pilot subcarriers */
- case -21: case -7: case 7: case 21:
- /* DC subcarrier */
- case 0:
- scidx++;
- default:
- break;
- }
- break;
- /* 40 MHz */
- case 1:
- /* No Grouping */
- if (ng == 0)
- switch (scidx) {
- /* Pilot subcarriers */
- case -53: case -25: case -11: case 11: case 25: case 53:
- scidx++;
- break;
- /* DC subcarriers */
- case -1: case 0: case 1:
- scidx = 2;
- default:
- break;
- }
- break;
- /* 80 MHz */
- case 2:
- /* No Grouping */
- if (ng == 0)
- switch (scidx) {
- /* Pilot subcarriers */
- case -103: case -75: case -39: case -11: case 11: case 39: case 75: case 103:
- scidx++;
- break;
- /* DC subcarriers, skip -1, 0, 1 */
- case -1:
- scidx = 2;
- default:
- break;
- }
- break;
- /* 160 MHz / 80+80 Mhz
- * Skip values here assume 160 MHz, as vht_mimo_control does not let us differentiate
- * between 160 MHz & 80-80MHz */
- case 3:
- switch (ng) {
- /* No Grouping */
- case 0:
- /* DC subcarriers, skip -5 to 5*/
- if (scidx == -5) {
- scidx = 6;
- break;
- }
- switch (scidx) {
- /* Pilot subcarriers */
- case -231: case -203: case -167: case -139: case -117: case -89: case -53: case -25:
- case 25: case 53: case 89: case 117: case 139: case 167: case 203: case 231:
- scidx++;
- break;
- /* Other subcarriers, skip -129 to -127, 127 to 129 */
- case -129:
- scidx = -126;
- break;
- case 127:
- scidx = 130;
- break;
- default:
- break;
- }
- break;
- /* Grouping of 2 */
- case 1:
- switch (scidx) {
- /* DC subcarriers */
- case -128: case -4: case -2: case 0: case 2: case 4: case 128:
- scidx++;
- default:
- break;
- }
- break;
- /* Grouping of 4 */
- case 2:
- if (scidx == -2 || scidx == 2)
- scidx++;
- break;
+ guint8 code;
+ guint16 status;
+ guint start = offset;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_tdls_action_code(tree, tvb, pinfo, offset);
+ switch (code) {
+ case TDLS_SETUP_REQUEST:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_cap_info(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_SETUP_RESPONSE:
+ status = tvb_get_letohs(tvb, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ if (tvb_reported_length_remaining(tvb, offset) < 2) {
+ if (status == 0) {
+ expert_add_info(pinfo, tree, &ei_ieee80211_tdls_setup_response_malformed);
}
break;
- default:
+ }
+ offset += add_ff_cap_info(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_SETUP_CONFIRM:
+ status = tvb_get_letohs(tvb, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ if (tvb_reported_length_remaining(tvb, offset) < 1) {
+ if (status == 0) {
+ expert_add_info(pinfo, tree, &ei_ieee80211_tdls_setup_confirm_malformed);
+ }
break;
+ }
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_TEARDOWN:
+ offset += add_ff_reason_code(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_PEER_TRAFFIC_INDICATION:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_CHANNEL_SWITCH_REQUEST:
+ offset += add_ff_target_channel(tree, tvb, pinfo, offset);
+ offset += add_ff_operating_class(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_CHANNEL_SWITCH_RESPONSE:
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_PEER_PSM_REQUEST:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_PEER_PSM_RESPONSE:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_PEER_TRAFFIC_RESPONSE:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case TDLS_DISCOVERY_REQUEST:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
}
- return scidx;
+ return offset - start; /* Size of fixed fields */
}
-static inline int vht_exclusive_skip_scidx(guint8 nchan_width, guint8 ng, int scidx)
+static guint
+add_ff_action_mgmt_notification(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
- switch (nchan_width) {
- /* 20 MHz */
- case 0:
- switch (ng) {
- /* No Grouping */
- case 0:
- if (scidx == -2 || scidx == 1)
- scidx++;
- else
- scidx = scidx + 2;
- break;
- case 1:
- switch (scidx) {
- case -4: case 1:
- scidx = scidx + 3;
- break;
- case -1:
- scidx = 1;
- break;
- default:
- scidx = scidx + 4;
- break;
- }
- break;
- default:
- switch (scidx) {
- case -4: case 1:
- scidx = scidx + 3;
- break;
- case -1:
- scidx = 1;
- break;
- default:
- scidx = scidx + 8;
- break;
- }
- break;
- }
- break;
- /* 40 MHz */
- case 1:
- /* 80 MHz */
- case 2:
- switch (ng) {
- /* No Grouping */
- case 0:
- if (scidx == -2)
- scidx = 2;
- else
- scidx = scidx + 2;
- break;
- case 1:
- scidx = scidx + 4;
- break;
- default:
- if (scidx == -2)
- scidx = 2;
- else
- scidx = scidx + 8;
- break;
- }
- break;
- /* 160 MHz / 80+80 Mhz */
- case 3:
- switch (ng) {
- /* No Grouping */
- case 0:
- switch (scidx) {
- /* DC subcarriers, skip -4 to 4*/
- case -6:
- scidx = 6;
- break;
- /* Other subcarriers, skip -128, 128 */
- case -130:
- scidx = -126;
- break;
- case 126:
- scidx = 130;
- break;
- default:
- scidx = scidx + 2;
- break;
- }
- break;
- case 1:
- switch (scidx) {
- /* DC subcarriers, skip -4 to 4*/
- case -6:
- scidx = 6;
- break;
- default:
- scidx = scidx + 4;
- break;
- }
- break;
- default:
- switch (scidx) {
- case -6:
- scidx = 6;
- break;
- case -130:
- scidx = -126;
- break;
- case 126:
- scidx = 130;
- break;
- default:
- scidx = scidx + 8;
- break;
- }
+ guint start = offset;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_wme_action_code(tree, tvb, pinfo, offset);
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_wme_status_code(tree, tvb, pinfo, offset);
+
+ return offset - start; /* Size of fixed fields */
+}
+
+static guint
+add_ff_action_vendor_specific(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint start = offset;
+ guint32 oui;
+ tvbuff_t *vendor_tvb;
+ int dissected;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
+ offset += 3;
+
+ vendor_tvb = tvb_new_subset_remaining(tvb, offset);
+ dissected = dissector_try_uint_new(vendor_specific_action_table, oui, vendor_tvb, pinfo, tree, FALSE, NULL);
+ if (dissected <= 0)
+ {
+ call_data_dissector(vendor_tvb, pinfo, tree);
+ /* don't advance the dissector pointer as this will probably cause more malformed packets
+ if vendor is unknown. It also matches previous behavior (before dissection table implementation) */
+ dissected = 0;
+ }
+
+ offset += dissected;
+
+ return offset - start; /* Size of fixed fields */
+}
+
+static guint
+add_ff_action_ht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint start = offset;
+ guint8 n_sta, i;
+ mimo_control_t mimo_cntrl;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ offset += add_ff_ht_action_code(tree, tvb, pinfo, offset);
+
+ switch (tvb_get_guint8(tvb, offset - 1)) {
+ case HT_ACTION_NOTIFY_CHAN_WIDTH:
+ offset += add_ff_channel_width(tree, tvb, pinfo, offset);
+ break;
+ case HT_ACTION_SM_PWR_SAVE:
+ offset += add_ff_sm_pwr_cntrl(tree, tvb, pinfo, offset);
+ break;
+ case HT_ACTION_PSMP_ACTION:
+ n_sta = tvb_get_guint8(tvb, offset);
+ offset += add_ff_psmp_param_set(tree, tvb, pinfo, offset);
+ for (i = 0; i < (n_sta & 0x0F); i++) {
+ offset += add_ff_psmp_sta_info(tree, tvb, pinfo, offset);
+ }
+ break;
+ case HT_ACTION_SET_PCO_PHASE:
+ offset += add_ff_pco_phase_cntrl(tree, tvb, pinfo, offset);
+ break;
+ case HT_ACTION_MIMO_CSI:
+ mimo_cntrl = get_mimo_control(tvb, offset);
+ offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
+ offset += add_mimo_csi_matrices_report(tree, tvb, offset, mimo_cntrl);
+ break;
+ case HT_ACTION_MIMO_BEAMFORMING:
+ mimo_cntrl = get_mimo_control(tvb, offset);
+ offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
+ offset += add_mimo_beamforming_feedback_report(tree, tvb, offset,
+ mimo_cntrl);
+ break;
+ case HT_ACTION_MIMO_COMPRESSED_BEAMFORMING:
+ mimo_cntrl = get_mimo_control(tvb, offset);
+ offset += add_ff_mimo_cntrl(tree, tvb, pinfo, offset);
+ offset += add_mimo_compressed_beamforming_feedback_report(tree, tvb,
+ offset,
+ mimo_cntrl);
+ break;
+ case HT_ACTION_ANT_SEL_FEEDBACK:
+ offset += add_ff_ant_selection(tree, tvb, pinfo, offset);
+ break;
+ case HT_ACTION_HT_INFO_EXCHANGE:
+ offset += add_ff_ht_information(tree, tvb, pinfo, offset);
+ break;
+ }
+
+ return offset - start;
+}
+
+static guint
+add_ff_beacon_interval_ctrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bic,
+ ett_bic_tree, ieee80211_ff_bic_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+
+ return 6;
+}
+
+static guint
+add_ff_beamforming_ctrl(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset, gboolean isGrant)
+{
+ guint16 bf_field = tvb_get_letohs(tvb, offset);
+ gboolean isInit = (bf_field & 0x2) >> 1;
+ gboolean isResp = (bf_field & 0x4) >> 2;
+ static const int *ieee80211_ff_beamforming_ctrl[] = {
+ &hf_ieee80211_ff_bf_train,
+ &hf_ieee80211_ff_bf_is_init,
+ &hf_ieee80211_ff_bf_is_resp,
+ &hf_ieee80211_ff_bf_rxss_len,
+ &hf_ieee80211_ff_bf_rxss_rate,
+ &hf_ieee80211_ff_bf_b10b15,
+ NULL
+ };
+
+ static const int *ieee80211_ff_beamforming_ctrl_grant[] = {
+ &hf_ieee80211_ff_bf_train,
+ &hf_ieee80211_ff_bf_is_init,
+ &hf_ieee80211_ff_bf_is_resp,
+ &hf_ieee80211_ff_bf_num_sectors,
+ &hf_ieee80211_ff_bf_num_rx_dmg_ants,
+ &hf_ieee80211_ff_bf_b12b15,
+ NULL
+ };
+
+ if((isInit==TRUE) && (isResp==TRUE) && isGrant) {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bf,
+ ett_bf_tree, ieee80211_ff_beamforming_ctrl_grant,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_bf,
+ ett_bf_tree, ieee80211_ff_beamforming_ctrl,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ }
+ return 2;
+}
+
+static guint
+add_ff_dynamic_allocation(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_dynamic_allocation[] = {
+ &hf_ieee80211_ff_TID,
+ &hf_ieee80211_ff_alloc_type,
+ &hf_ieee80211_ff_src_aid,
+ &hf_ieee80211_ff_dest_aid,
+ &hf_ieee80211_ff_alloc_duration,
+ &hf_ieee80211_ff_b39,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_dynamic_allocation,
+ ett_dynamic_alloc_tree, ieee80211_ff_dynamic_allocation,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+
+ return 5;
+}
+
+static guint
+add_ff_beamformed_link(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_beamformed_link[] = {
+ &hf_ieee80211_ff_blm_unit_index,
+ &hf_ieee80211_ff_blm_maint_value,
+ &hf_ieee80211_ff_blm_is_master,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_blm,
+ ett_blm_tree, ieee80211_ff_beamformed_link,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 1;
+}
+
+static guint
+add_ff_BRP_request(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_BRP_request[] = {
+ &hf_ieee80211_ff_brp_L_RX,
+ &hf_ieee80211_ff_brp_TX_TRN_REQ,
+ &hf_ieee80211_ff_brp_MID_REQ,
+ &hf_ieee80211_ff_brp_BC_REQ,
+ &hf_ieee80211_ff_brp_MID_GRANT,
+ &hf_ieee80211_ff_brp_BC_GRANT,
+ &hf_ieee80211_ff_brp_chan_FBCK_CAP,
+ &hf_ieee80211_ff_brp_tx_sector,
+ &hf_ieee80211_ff_brp_other_aid,
+ &hf_ieee80211_ff_brp_tx_antenna,
+ &hf_ieee80211_ff_brp_reserved,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_brp,
+ ett_brp_tree, ieee80211_ff_BRP_request,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 4;
+}
+
+static guint
+add_ff_sector_sweep_feedback_from_iss(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_sector_sweep_feedback_from_iss[] = {
+ &hf_ieee80211_ff_sswf_total_sectors,
+ &hf_ieee80211_ff_sswf_num_rx_dmg_ants,
+ &hf_ieee80211_ff_sswf_reserved1,
+ &hf_ieee80211_ff_sswf_poll_required,
+ &hf_ieee80211_ff_sswf_reserved2,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_sswf,
+ ett_sswf_tree, ieee80211_ff_sector_sweep_feedback_from_iss,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 3;
+}
+
+static guint
+add_ff_sector_sweep_feedback_to_iss(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_sector_sweep_feedback_to_iss[] = {
+ &hf_ieee80211_ff_sswf_sector_select,
+ &hf_ieee80211_ff_sswf_dmg_antenna_select,
+ &hf_ieee80211_ff_sswf_snr_report,
+ &hf_ieee80211_ff_sswf_poll_required,
+ &hf_ieee80211_ff_sswf_reserved2,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_sswf,
+ ett_sswf_tree, ieee80211_ff_sector_sweep_feedback_to_iss,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 3;
+}
+
+static guint
+add_ff_sector_sweep(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_sector_sweep[] = {
+ &hf_ieee80211_ff_ssw_direction,
+ &hf_ieee80211_ff_ssw_cdown,
+ &hf_ieee80211_ff_ssw_sector_id,
+ &hf_ieee80211_ff_ssw_dmg_ant_id,
+ &hf_ieee80211_ff_ssw_rxss_len,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_ssw,
+ ett_ssw_tree, ieee80211_ff_sector_sweep,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 3;
+}
+
+static guint
+add_ff_dmg_params(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ static const int *ieee80211_ff_dmg_params[] = {
+ &hf_ieee80211_ff_dmg_params_bss,
+ &hf_ieee80211_ff_dmg_params_cbap_only,
+ &hf_ieee80211_ff_dmg_params_cbap_src,
+ &hf_ieee80211_ff_dmg_params_privacy,
+ &hf_ieee80211_ff_dmg_params_policy,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_dmg_params,
+ ett_dmg_params_tree, ieee80211_ff_dmg_params,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ return 1;
+}
+
+static guint
+add_ff_cc_field(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean dis)
+{
+ proto_item *cc_item = proto_tree_add_item(tree, hf_ieee80211_ff_cc, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ proto_tree *cc_tree = proto_item_add_subtree(cc_item, ett_cc_tree);
+ guint64 cc_field;
+ if(dis) {
+ proto_tree_add_item(cc_tree, hf_ieee80211_ff_cc_abft_resp_addr, tvb, offset, 6, ENC_NA);
+ } else {
+ cc_field = tvb_get_letoh64(tvb, offset);
+ /*TODO : Add support of bitmask for FT_(U)INT64 */
+ proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_sp_duration, tvb, offset, 1, (guint32)(cc_field & 0xff));
+ proto_tree_add_uint64(cc_tree, hf_ieee80211_ff_cc_cluster_id, tvb, offset+1, 6, (guint64)((cc_field & G_GUINT64_CONSTANT(0x00ffffffffffff00)) >> 8));
+ proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_role, tvb, offset+7, 1, (guint32)((cc_field & G_GUINT64_CONSTANT(0x0300000000000000)) >> 56));
+ proto_tree_add_uint(cc_tree, hf_ieee80211_ff_cc_max_mem, tvb, offset+7, 1, (guint32)((cc_field & G_GUINT64_CONSTANT(0x7c00000000000000)) >> 58));
+ }
+ return 8;
+}
+
+
+static guint
+add_ff_band_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_band_id, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_subject_address(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_subject_address, tvb, offset, 6, ENC_NA);
+ return 6;
+}
+
+static guint
+add_ff_handover_reason(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_handover_reason, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_handover_remaining_bi(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_handover_remaining_bi, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_handover_result(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_handover_result, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_handover_reject_reason(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_handover_reject_reason, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_destination_reds_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_destination_reds_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_destination_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_destination_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_realy_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_realy_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_source_aid(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_source_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_timing_offset(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_timing_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_sampling_frequency_offset(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_sampling_frequency_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return 2;
+}
+
+static guint
+add_ff_relay_operation_type(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_relay_operation_type, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_fst_action_code(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_fst_action_code, tvb, offset, 1, ENC_NA);
+ return 1;
+}
+
+static guint
+add_ff_llt(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_llt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ return 4;
+}
+
+static guint
+add_ff_fsts_id(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_ff_fsts_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ return 4;
+}
+
+static guint
+add_ff_oct_mmpdu(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ guint start = offset;
+ guint len = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_ff_mmpdu_len, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_ff_mmpdu_ctrl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_ff_oct_mmpdu, tvb, offset, len, ENC_NA);
+ offset += len;
+ return offset - start;
+}
+
+static int
+add_tag_relay_capabilities(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;
+ static const int *ieee80211_tag_relay_capabilities[] = {
+ &hf_ieee80211_tag_relay_support,
+ &hf_ieee80211_tag_relay_use,
+ &hf_ieee80211_tag_relay_permission,
+ &hf_ieee80211_tag_AC_power,
+ &hf_ieee80211_tag_relay_prefer,
+ &hf_ieee80211_tag_duplex,
+ &hf_ieee80211_tag_cooperation,
+ NULL
+ };
+
+ if (tag_len < 2) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length must be 2");
+ return 1;
+ }
+
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_relay_capabilities, ENC_NA);
+ return tvb_captured_length(tvb);
+}
+
+#if 0
+static guint
+add_ff_relay_capable_sta_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ proto_item *rcsi_item = proto_tree_add_item(tree, hf_ieee80211_ff_rcsi, tvb, offset, 3, ENC_LITTLE_ENDIAN);
+ proto_tree *rcsi_tree = proto_item_add_subtree(rcsi_item, ett_rcsi_tree);
+ proto_tree_add_item(rcsi_tree, hf_ieee80211_ff_rcsi_aid, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ add_tag_relay_capabilities(pinfo, rcsi_item, 2, rcsi_tree, tvb, &offset);
+ return 3;
+}
+#endif
+
+static void
+dissect_ieee80211_extension(guint16 fcf, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ proto_item *ti;
+ proto_tree *ext_tree;
+ proto_tree *fixed_tree;
+ proto_tree *tagged_tree;
+
+ int offset = 0;
+ int tagged_parameter_tree_len;
+
+ ti = proto_tree_add_item(tree, proto_wlan_ext, tvb, offset, -1, ENC_NA);
+ ext_tree = proto_item_add_subtree(ti, ett_80211_ext);
+
+ switch (COMPOSE_FRAME_TYPE(fcf))
+ {
+ case EXTENSION_DMG_BEACON:
+ {
+ gboolean cc, dis;
+ guint16 bic_field;
+ fixed_tree = get_fixed_parameter_tree(ext_tree, tvb, offset, 20);
+ offset += add_ff_timestamp(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_sector_sweep(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_beacon_interval(fixed_tree, tvb, pinfo, offset);
+ bic_field = tvb_get_letohs(tvb, offset);
+ cc = (bic_field & 0x1);
+ dis = (bic_field & 0x2) >> 1;
+ offset += add_ff_beacon_interval_ctrl(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_dmg_params(fixed_tree, tvb, pinfo, offset);
+ if(cc) {
+ offset += add_ff_cc_field(fixed_tree, tvb, offset, dis);
+ }
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+
+ /*
+ * The tagged params are optional here. See Table 8.33a of the 2012
+ * version of the standard.
+ */
+ if (tagged_parameter_tree_len) {
+ tagged_tree = get_tagged_parameter_tree(ext_tree, tvb, offset, tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, EXTENSION_DMG_BEACON, NULL);
+ }
+ break;
+ }
+ }
+}
+
+static guint
+add_ff_action_unprotected_dmg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint8 code;
+ guint start = offset;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_unprotected_dmg_action_code(tree, tvb, pinfo, offset);
+ switch (code) {
+ case UNPROTECTED_DMG_ANNOUNCE:
+ offset += add_ff_timestamp(tree, tvb, pinfo, offset);
+ offset += add_ff_beacon_interval(tree, tvb, pinfo, offset);
+ break;
+ case UNPROTECTED_DMG_BRP:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_BRP_request(tree, tvb, pinfo, offset);
+ break;
+ }
+ return offset - start;
+}
+
+/* There is no easy way to skip all these subcarrier indices that must not
+ * be displayed when showing compressed beamforming feedback matrices
+ * Table 8-53g IEEE Std 802.11ac-2013 amendment.
+ *
+ * The irregular use of case statements in this function is to improve
+ * readability in what is otherwise a large funtion that does very little.
+ */
+static inline int
+vht_compressed_skip_scidx(guint8 nchan_width, guint8 ng, int scidx)
+{
+ switch(nchan_width) {
+ /* 20 MHz */
+ case 0:
+ /* No Grouping */
+ if (ng == 0)
+ switch (scidx) {
+ /* Pilot subcarriers */
+ case -21: case -7: case 7: case 21:
+ /* DC subcarrier */
+ case 0:
+ scidx++;
+ default:
+ break;
+ }
+ break;
+ /* 40 MHz */
+ case 1:
+ /* No Grouping */
+ if (ng == 0)
+ switch (scidx) {
+ /* Pilot subcarriers */
+ case -53: case -25: case -11: case 11: case 25: case 53:
+ scidx++;
+ break;
+ /* DC subcarriers */
+ case -1: case 0: case 1:
+ scidx = 2;
+ default:
+ break;
+ }
+ break;
+ /* 80 MHz */
+ case 2:
+ /* No Grouping */
+ if (ng == 0)
+ switch (scidx) {
+ /* Pilot subcarriers */
+ case -103: case -75: case -39: case -11: case 11: case 39: case 75: case 103:
+ scidx++;
+ break;
+ /* DC subcarriers, skip -1, 0, 1 */
+ case -1:
+ scidx = 2;
+ default:
+ break;
+ }
+ break;
+ /* 160 MHz / 80+80 Mhz
+ * Skip values here assume 160 MHz, as vht_mimo_control does not let us differentiate
+ * between 160 MHz & 80-80MHz */
+ case 3:
+ switch (ng) {
+ /* No Grouping */
+ case 0:
+ /* DC subcarriers, skip -5 to 5*/
+ if (scidx == -5) {
+ scidx = 6;
+ break;
+ }
+ switch (scidx) {
+ /* Pilot subcarriers */
+ case -231: case -203: case -167: case -139: case -117: case -89: case -53: case -25:
+ case 25: case 53: case 89: case 117: case 139: case 167: case 203: case 231:
+ scidx++;
+ break;
+ /* Other subcarriers, skip -129 to -127, 127 to 129 */
+ case -129:
+ scidx = -126;
+ break;
+ case 127:
+ scidx = 130;
+ break;
+ default:
+ break;
+ }
+ break;
+ /* Grouping of 2 */
+ case 1:
+ switch (scidx) {
+ /* DC subcarriers */
+ case -128: case -4: case -2: case 0: case 2: case 4: case 128:
+ scidx++;
+ default:
+ break;
+ }
+ break;
+ /* Grouping of 4 */
+ case 2:
+ if (scidx == -2 || scidx == 2)
+ scidx++;
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return scidx;
+}
+
+static inline int vht_exclusive_skip_scidx(guint8 nchan_width, guint8 ng, int scidx)
+{
+ switch (nchan_width) {
+ /* 20 MHz */
+ case 0:
+ switch (ng) {
+ /* No Grouping */
+ case 0:
+ if (scidx == -2 || scidx == 1)
+ scidx++;
+ else
+ scidx = scidx + 2;
+ break;
+ case 1:
+ switch (scidx) {
+ case -4: case 1:
+ scidx = scidx + 3;
+ break;
+ case -1:
+ scidx = 1;
+ break;
+ default:
+ scidx = scidx + 4;
+ break;
+ }
+ break;
+ default:
+ switch (scidx) {
+ case -4: case 1:
+ scidx = scidx + 3;
+ break;
+ case -1:
+ scidx = 1;
+ break;
+ default:
+ scidx = scidx + 8;
+ break;
+ }
+ break;
+ }
+ break;
+ /* 40 MHz */
+ case 1:
+ /* 80 MHz */
+ case 2:
+ switch (ng) {
+ /* No Grouping */
+ case 0:
+ if (scidx == -2)
+ scidx = 2;
+ else
+ scidx = scidx + 2;
+ break;
+ case 1:
+ scidx = scidx + 4;
+ break;
+ default:
+ if (scidx == -2)
+ scidx = 2;
+ else
+ scidx = scidx + 8;
+ break;
+ }
+ break;
+ /* 160 MHz / 80+80 Mhz */
+ case 3:
+ switch (ng) {
+ /* No Grouping */
+ case 0:
+ switch (scidx) {
+ /* DC subcarriers, skip -4 to 4*/
+ case -6:
+ scidx = 6;
+ break;
+ /* Other subcarriers, skip -128, 128 */
+ case -130:
+ scidx = -126;
+ break;
+ case 126:
+ scidx = 130;
+ break;
+ default:
+ scidx = scidx + 2;
+ break;
+ }
+ break;
+ case 1:
+ switch (scidx) {
+ /* DC subcarriers, skip -4 to 4*/
+ case -6:
+ scidx = 6;
+ break;
+ default:
+ scidx = scidx + 4;
+ break;
+ }
+ break;
+ default:
+ switch (scidx) {
+ case -6:
+ scidx = 6;
+ break;
+ case -130:
+ scidx = -126;
+ break;
+ case 126:
+ scidx = 130;
+ break;
+ default:
+ scidx = scidx + 8;
+ break;
+ }
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return scidx;
+}
+
+static guint
+add_ff_vht_compressed_beamforming_report(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+{
+ guint32 vht_mimo;
+ guint8 nc;
+ guint8 nr;
+ guint8 chan_width;
+ guint8 grouping;
+ gboolean codebook_info;
+ gboolean feedback_type;
+ proto_item *vht_beam_item, *vht_excl_beam_item, *phi_angle, *psi_angle;
+ proto_tree *vht_beam_tree, *subtree, *vht_excl_beam_tree, *angletree;
+ int i, matrix_size, len, pos, ns, scidx = 0, matrix_len;
+ guint8 phi, psi, carry;
+ int j, ic, off_len = 0, sscidx = 0, xnsc;
+ int ir, off_pos, angle_val;
+ /* Table 8-53d Order of angles in the Compressed Beamforming Feedback
+ * Matrix subfield, IEEE Std 802.11ac-2013 amendment */
+ static const guint8 na_arr[8][8] = { { 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 2, 2, 0, 0, 0, 0, 0, 0 },
+ { 4, 6, 6, 0, 0, 0, 0, 0 },
+ { 6, 10, 12, 12, 0, 0, 0, 0 },
+ { 8, 14, 18, 20, 20, 0, 0, 0 },
+ { 10, 18, 24, 28, 30, 30, 0, 0 },
+ { 12, 22, 30, 36, 40, 42, 42, 0 },
+ { 14, 26, 36, 44, 50, 54, 56, 56 }
+ };
+ /* Table 8-53g Subcarriers for which a Compressed Beamforming Feedback Matrix
+ * subfield is sent back. IEEE Std 802.11ac-2013 amendment */
+ static const int ns_arr[4][3] = { { 52, 30, 16 },
+ { 108, 58, 30 },
+ { 234, 122, 62 },
+ { 468, 244, 124 }
+ };
+
+ /* Table 8-53j, no of Subcarriers for which the Delta SNR subfield is sent back to the beamformer.
+ * IEEE Std 802.11ac-2013 amendment */
+ static const int delta_ns_arr[4][3] = { { 30, 16, 10 },
+ { 58, 30, 16 },
+ { 122, 62, 32 },
+ { 244, 124, 64 }
+ };
+
+ vht_mimo = tvb_get_letoh24(tvb, offset);
+ proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_vht_mimo_cntrl,
+ ett_ff_vhtmimo_cntrl, hf_ieee80211_ff_vht_mimo_cntrl_fields, ENC_LITTLE_ENDIAN);
+ offset += 3;
+
+ /* Extract values for beamforming use */
+ nc = (vht_mimo & 0x7) + 1;
+ nr = ((vht_mimo & 0x38) >> 3) + 1;
+ chan_width = (vht_mimo & 0xC0) >> 6;
+ grouping = ((vht_mimo & 0x300) >> 8);
+ codebook_info = (vht_mimo & 0x400) >> 10;
+ feedback_type = (vht_mimo & 0x800) >> 11;
+
+ if (feedback_type) {
+ if (codebook_info) {
+ psi = 7; phi = 9;
+ } else {
+ psi = 5; phi = 7;
+ }
+ } else {
+ if (codebook_info) {
+ psi = 4; phi = 6;
+ } else {
+ psi = 2; phi = 4;
+ }
+ }
+
+ vht_beam_item = proto_tree_add_item(tree, hf_ieee80211_vht_compressed_beamforming_report, tvb,
+ offset, -1, ENC_NA);
+ vht_beam_tree = proto_item_add_subtree(vht_beam_item, ett_ff_vhtmimo_beamforming_report);
+
+ subtree = proto_tree_add_subtree(vht_beam_tree, tvb, offset, nc,
+ ett_ff_vhtmimo_beamforming_report_snr, NULL, "Average Signal to Noise Ratio");
+
+ for (i = 1; i <= nc; i++)
+ {
+ gint8 snr;
+ char edge_sign;
+
+ snr = tvb_get_gint8(tvb, offset);
+
+ switch(snr) {
+ case -128:
+ edge_sign = '<';
+ break;
+ case 127:
+ edge_sign = '>';
+ break;
+ default:
+ edge_sign = ' ';
+ break;
+ }
+
+ proto_tree_add_int_format(subtree, hf_ieee80211_vht_compressed_beamforming_report_snr, tvb, offset, 1,
+ snr, "Stream %d - Signal to Noise Ratio: %c%3.2fdB", i, edge_sign,snr/4.0+22.0);
+
+ offset += 1;
+ }
+
+ matrix_size = na_arr[nr - 1][nc -1] * (psi + phi)/2;
+ if (matrix_size % 8) {
+ carry = 1;
+ } else {
+ carry = 0;
+ }
+ off_len = (matrix_size/8) + carry;
+ angletree = proto_tree_add_subtree_format(vht_beam_tree, tvb, offset, off_len,
+ ett_ff_vhtmimo_beamforming_angle, NULL,"PHI and PSI Angle Decode");
+
+ off_pos = offset*8;
+ phi_angle = proto_tree_add_none_format(angletree, hf_ieee80211_vht_compressed_beamforming_phi_angle, tvb, offset, 0, "PHI(%u bits): ", phi);
+ for (ic = 1; ic <= nc; ic++) {
+ for (ir = 1; ir < nr; ir++) {
+ if (ir >= ic) {
+ angle_val = (int) tvb_get_bits16(tvb, off_pos, phi, ENC_BIG_ENDIAN);
+ if ((ir+1 < nr) || (ic+1 <= nc))
+ proto_item_append_text(phi_angle, "PHI%d%d: %d, ", ir, ic, angle_val);
+ else
+ proto_item_append_text(phi_angle, "PHI%d%d: %d", ir, ic, angle_val);
+ off_pos = off_pos + phi;
+ }
+ }
+ }
+
+ psi_angle = proto_tree_add_none_format(angletree, hf_ieee80211_vht_compressed_beamforming_psi_angle, tvb, offset, 0, "PSI(%u bits): ", psi);
+ for (ic = 1; ic <= nc; ic++)
+ for (ir = 2; ir <= nr; ir++)
+ if (ir > ic) {
+ angle_val = (int) tvb_get_bits8(tvb, off_pos, psi);
+ if ((ir+1 <= nr) || (ic+1 <= nc))
+ proto_item_append_text(psi_angle, "PSI%d%d: %d, ", ir, ic, angle_val);
+ else
+ proto_item_append_text(psi_angle, "PSI%d%d: %d", ir, ic, angle_val);
+ off_pos = off_pos + psi;
+ }
+
+ /* Table 8-53c Subfields of the VHT MIMO Control field (802.11ac-2013)
+ * reserves value 3 of the Grouping subfield. */
+ if (grouping == 3) {
+ expert_add_info_format(pinfo, vht_beam_item, &ei_ieee80211_inv_val,
+ "Grouping subfield value 3 is reserved");
+ return offset;
+ }
+
+ ns = ns_arr[chan_width][grouping];
+ if (((matrix_size)*(ns)) % 8)
+ matrix_len = (((matrix_size) * (ns)) / (8)) + 1;
+ else
+ matrix_len = (((matrix_size) * (ns)) / (8));
+ subtree = proto_tree_add_subtree(vht_beam_tree, tvb, offset, matrix_len,
+ ett_ff_vhtmimo_beamforming_report_feedback_matrices, NULL, "Beamforming Feedback Matrix");
+
+
+ switch(chan_width) {
+ case 0:
+ scidx = -28;
+ break;
+ case 1:
+ scidx = -58;
+ break;
+ case 2:
+ scidx = -122;
+ break;
+ case 3:
+ /* This is -122 for 80+80MHz Channel Width but vht_mimo_control does not allow us
+ * to differentiate between 160MHz and 80+80Mhz */
+ scidx = -250;
+ break;
+ }
+
+ pos = 0;
+ for (i = 0; i < ns; i++) {
+ if (pos % 8)
+ carry = 1;
+ else
+ carry = 0;
+ len = roundup2((pos + matrix_size), 8)/8 - roundup2(pos, 8)/8;
+ scidx = vht_compressed_skip_scidx(chan_width, grouping, scidx);
+
+ /* TODO : For certain values from na_arr, there is always going be a carry over or overflow from the previous or
+ into the next octet. The largest of possible unaligned values can be 41 bytes long, and masking and shifting
+ whole buffers to show correct values with padding and overflow bits is hence skipped, we only mark the bytes
+ of interest instead */
+ proto_tree_add_none_format(subtree, hf_ieee80211_vht_compressed_beamforming_feedback_matrix, tvb,
+ offset - carry, len + carry, "Compressed Beamforming Feedback Matrix for subcarrier %d", scidx++);
+ offset += len;
+ pos += matrix_size;
+ }
+
+ if (feedback_type) {
+ xnsc = delta_ns_arr[chan_width][grouping];
+ if ((nc * xnsc *4) % 8)
+ off_len = (nc * xnsc *4) / 8 + 1;
+ else
+ off_len = (nc * xnsc *4) / 8;
+ switch(chan_width) {
+ case 0:
+ sscidx = -28;
+ break;
+ case 1:
+ sscidx = -58;
+ break;
+ case 2:
+ sscidx = -122;
+ break;
+ case 3:
+ sscidx = -250;
+ break;
+ }
+ vht_excl_beam_item = proto_tree_add_item(tree, hf_ieee80211_vht_mu_exclusive_beamforming_report, tvb, offset, off_len, ENC_NA);
+ vht_excl_beam_tree = proto_item_add_subtree(vht_excl_beam_item, ett_ff_vhtmu_exclusive_beamforming_report_matrices);
+
+ carry = 1;
+ for (j = 1; j <= xnsc; j++) {
+ for (ic = 1; ic <= nc; ic++) {
+ if (carry % 2){
+ pos = 0;
+ len = 1;
+ }
+ else
+ {
+ pos = 1;
+ len = 0;
+ }
+ proto_tree_add_none_format(vht_excl_beam_tree, hf_ieee80211_vht_mu_Exclusive_beamforming_delta_snr, tvb,
+ offset - pos, 1, "Delta SNR for space-time stream %d for subcarrier %d", ic, sscidx);
+ offset += len;
+ carry ++;
+ }
+ sscidx = vht_exclusive_skip_scidx(chan_width, grouping, sscidx);
+ }
+ }
+
+ return offset;
+}
+
+static guint
+add_ff_action_vht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint start = offset;
+ guint8 vht_action, field_val;
+ guint64 msa_value;
+ guint64 upa_value;
+ int m;
+ proto_item *ti;
+ proto_tree *ti_tree;
+ proto_item *msa, *upa;
+ proto_tree *msa_tree, *upa_tree;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+
+ vht_action = tvb_get_guint8(tvb, offset);
+ offset += add_ff_vht_action(tree, tvb, pinfo, offset);
+
+ switch(vht_action){
+ case VHT_ACT_VHT_COMPRESSED_BEAMFORMING:{
+ offset = add_ff_vht_compressed_beamforming_report(tree, tvb, pinfo, offset);
+ offset += tvb_reported_length_remaining(tvb, offset);
+ }
+ break;
+ case VHT_ACT_GROUP_ID_MANAGEMENT:{
+ ti = proto_tree_add_item(tree, hf_ieee80211_vht_group_id_management, tvb,
+ offset, -1, ENC_NA);
+ ti_tree = proto_item_add_subtree(ti, ett_vht_grpidmgmt);
+
+ msa_value = tvb_get_letoh64(tvb, offset);
+ msa = proto_tree_add_item(ti_tree, hf_ieee80211_vht_membership_status_array, tvb,
+ offset, 8, ENC_NA);
+ msa_tree = proto_item_add_subtree(msa, ett_vht_msa);
+ for (m = 0; m < 64; m++) {
+ if (msa_value & (G_GINT64_CONSTANT(1) << m))
+ proto_tree_add_uint_format(msa_tree, hf_ieee80211_vht_membership_status_field,
+ tvb, offset + (m/8), 1, 1, "Membership Status in Group ID %d: 1", m);
+ }
+ offset += 8;
+
+ upa = proto_tree_add_item(ti_tree, hf_ieee80211_vht_user_position_array, tvb,
+ offset, 16, ENC_NA);
+ upa_tree = proto_item_add_subtree(upa, ett_vht_upa);
+
+ upa_value = tvb_get_letoh64(tvb, offset);
+ for (m = 0; m < 32; m++) {
+ if (msa_value & (G_GINT64_CONSTANT(1) << m)) {
+ field_val = (guint8) ((upa_value >> m*2) & 0x3);
+ proto_tree_add_uint_format(upa_tree, hf_ieee80211_vht_user_position_field,
+ tvb, offset + (m/4), 1, field_val, "User Position in Group ID %d: %u", m, field_val);
+ }
+ }
+ upa_value = tvb_get_letoh64(tvb, offset+8);
+ for (m = 0; m < 32; m++) {
+ if (msa_value & (G_GINT64_CONSTANT(1) << (32+m))) {
+ field_val = (guint8) ((upa_value >> m*2) & 0x3);
+ proto_tree_add_uint_format(upa_tree, hf_ieee80211_vht_user_position_field,
+ tvb, (offset + 8) + (m/4), 1, field_val, "User Position in Group ID %d: %u", m, field_val);
+ }
+ }
+ offset += tvb_reported_length_remaining(tvb, offset);
+ }
+ break;
+ case VHT_ACT_OPERATION_MODE_NOTIFICATION:{
+ ti = proto_tree_add_item(tree, hf_ieee80211_vht_operation_mode_notification, tvb,
+ offset, -1, ENC_NA);
+ expert_add_info(pinfo, ti, &ei_ieee80211_vht_action);
+ offset += tvb_reported_length_remaining(tvb, offset);
+ }
+ break;
+ default:
+ break;
+ }
+
+
+ return offset - start;
+}
+
+#define HE_COMPRESSED_BEAMFORMING_AND_CQI 0
+#define HE_QUIET_TIME_PERIOD 1
+
+static const value_string he_action_vals[] = {
+ { HE_COMPRESSED_BEAMFORMING_AND_CQI, "HE Compressed Beamforming And CQI" },
+ { HE_QUIET_TIME_PERIOD, "Quiet Time Period" },
+ { 0, NULL }
+};
+
+static guint
+add_ff_he_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_,
+ int offset)
+{
+ guint8 he_action = tvb_get_guint8(tvb, offset);
+
+ proto_tree_add_uint_format(tree, hf_ieee80211_ff_he_action, tvb, offset, 1,
+ he_action, "%s", val_to_str(he_action, he_action_vals,
+ "Reserved"));
+ return 1;
+}
+
+static const int *he_mimo_control_headers[] = {
+ &hf_he_mimo_control_nc_index,
+ &hf_he_mimo_control_nr_index,
+ &hf_he_mimo_control_bw,
+ &hf_he_mimo_control_grouping,
+ &hf_he_mimo_control_codebook_info,
+ &hf_he_mimo_control_feedback_type,
+ &hf_he_mimo_control_remaining_feedback_segs,
+ &hf_he_mimo_control_first_feedback_seg,
+ &hf_he_mimo_control_ru_start_index,
+ &hf_he_mimo_control_ru_end_index,
+ &hf_he_mimo_control_sounding_dialog_token_num,
+ &hf_he_mimo_control_reserved,
+ NULL
+};
+
+static guint
+add_ff_action_he(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint start = offset;
+ guint8 he_action;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+
+ he_action = tvb_get_guint8(tvb, offset);
+ offset += add_ff_he_action(tree, tvb, pinfo, offset);
+
+ switch (he_action) {
+ case HE_COMPRESSED_BEAMFORMING_AND_CQI:
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_he_mimo_control_field, ett_he_mimo_control,
+ he_mimo_control_headers, ENC_LITTLE_ENDIAN,
+ BMT_NO_APPEND);
+ offset += 5;
+ break;
+ case HE_QUIET_TIME_PERIOD:
+
+ break;
+ default:
+ break;
+ }
+ return offset - start;
+}
+
+static guint
+add_ff_action_fst(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint8 code;
+ guint start = offset;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_fst_action_code(tree, tvb, pinfo, offset);
+ switch (code) {
+ case FST_SETUP_REQUEST:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_llt(tree, tvb, pinfo, offset);
+ break;
+ case FST_SETUP_RESPONSE:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ case FST_TEAR_DOWN:
+ offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
+ break;
+ case FST_ACK_REQUEST:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
+ break;
+ case FST_ACK_RESPONSE:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
+ break;
+ case FST_ON_CHANNEL_TUNNEL_REQUEST:
+ offset += add_ff_oct_mmpdu(tree, tvb, pinfo, offset);
+ break;
+ }
+ return offset - start;
+}
+
+static guint
+add_ff_action_dmg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ guint8 code;
+ guint start = offset;
+ int left_offset;
+
+ offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ code = tvb_get_guint8(tvb, offset);
+ offset += add_ff_dmg_action_code(tree, tvb, pinfo, offset);
+ switch (code) {
+ case DMG_ACTION_PWR_SAVE_CONFIG_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_dmg_pwr_mgmt(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_PWR_SAVE_CONFIG_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_INFO_REQ:
+ offset += add_ff_subject_address(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_INFO_RES:
+ offset += add_ff_subject_address(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_HANDOVER_REQ:
+ offset += add_ff_handover_reason(tree, tvb, pinfo, offset);
+ offset += add_ff_handover_remaining_bi(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_HANDOVER_RES:
+ offset += add_ff_handover_result(tree, tvb, pinfo, offset);
+ offset += add_ff_handover_reject_reason(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_DTP_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_DTP_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_RELAY_SEARCH_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_destination_reds_aid(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_RELAY_SEARCH_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ left_offset =
+ tvb_reported_length_remaining(tvb, offset);
+ while(left_offset > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_peer_sta_aid, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset+1, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_internal_angle, tvb, offset+2, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ff_recommend, tvb, offset+2, 1, ENC_NA);
+ /* another reserved byte */
+ offset += 4;
+ left_offset -= 4;
+ }
+ break;
+ case DMG_ACTION_RLS_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
+ offset += add_ff_realy_aid(tree, tvb, pinfo, offset);
+ offset += add_ff_source_aid(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_RLS_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_RLS_ANNOUNCE:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
+ offset += add_ff_realy_aid(tree, tvb, pinfo, offset);
+ offset += add_ff_source_aid(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_RLS_TEARDOWN:
+ offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
+ offset += add_ff_realy_aid(tree, tvb, pinfo, offset);
+ offset += add_ff_source_aid(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_RELAY_ACK_REQ:
+ case DMG_ACTION_RELAY_ACK_RES:
+ break;
+ case DMG_ACTION_TPA_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_timing_offset(tree, tvb, pinfo, offset);
+ offset += add_ff_sampling_frequency_offset(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_TPA_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_TPA_REP:
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_ROC_REQ:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_relay_operation_type(tree, tvb, pinfo, offset);
+ break;
+ case DMG_ACTION_ROC_RES:
+ offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
+ offset += add_ff_status_code(tree, tvb, pinfo, offset);
+ break;
+ }
+ return offset - start;
+}
+
+static guint
+add_ff_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+{
+ switch (tvb_get_guint8(tvb, offset) & 0x7f) {
+ case CAT_SPECTRUM_MGMT: /* 0 */
+ return add_ff_action_spectrum_mgmt(tree, tvb, pinfo, offset);
+ case CAT_QOS: /* 1 */
+ return add_ff_action_qos(tree, tvb, pinfo, offset);
+ case CAT_DLS: /* 2 */
+ return add_ff_action_dls(tree, tvb, pinfo, offset);
+ case CAT_BLOCK_ACK: /* 3 */
+ return add_ff_action_block_ack(tree, tvb, pinfo, offset);
+ case CAT_PUBLIC: /* 4 */
+ return add_ff_action_public(tree, tvb, pinfo, offset);
+ case CAT_RADIO_MEASUREMENT: /* 5 */
+ return add_ff_action_radio_measurement(tree, tvb, pinfo, offset);
+ case CAT_FAST_BSS_TRANSITION: /* 6 */
+ return add_ff_action_fast_bss_transition(tree, tvb, pinfo, offset);
+ case CAT_HT: /* 7 */
+ return add_ff_action_ht(tree, tvb, pinfo, offset);
+ case CAT_SA_QUERY: /* 8 */
+ return add_ff_action_sa_query(tree, tvb, pinfo, offset);
+ case CAT_PUBLIC_PROTECTED: /* 9 */
+ return add_ff_action_protected_public(tree, tvb, pinfo, offset);
+ case CAT_WNM: /* 10 */
+ return add_ff_action_wnm(tree, tvb, pinfo, offset);
+ case CAT_UNPROTECTED_WNM: /* 11 */
+ return add_ff_action_unprotected_wnm(tree, tvb, pinfo, offset);
+ case CAT_TDLS: /* 12 */
+ return add_ff_action_tdls(tree, tvb, pinfo, offset);
+ case CAT_MESH: /* 13 */
+ return add_ff_action_mesh(tree, tvb, pinfo, offset);
+ case CAT_MULTIHOP: /* 14 */
+ return add_ff_action_multihop(tree, tvb, pinfo, offset);
+ case CAT_SELF_PROTECTED: /* 15 */
+ return add_ff_action_self_protected(tree, tvb, pinfo, offset);
+ case CAT_DMG: /* 16 */
+ return add_ff_action_dmg(tree, tvb, pinfo, offset);
+ case CAT_MGMT_NOTIFICATION: /* Management notification frame - 17 */
+ return add_ff_action_mgmt_notification(tree, tvb, pinfo, offset);
+ case CAT_FAST_SESSION_TRANSFER: /* 18 */
+ return add_ff_action_fst(tree, tvb, pinfo, offset);
+/* case CAT_ROBUST_AV_STREAMING: 19 */
+/* return add_ff_action_robust_av_streaming(tree, tvb, pinfo, offset); */
+ case CAT_UNPROTECTED_DMG: /* 20 */
+ return add_ff_action_unprotected_dmg(tree, tvb, pinfo, offset);
+ case CAT_VHT: /* 21 */
+ return add_ff_action_vht(tree, tvb, pinfo, offset);
+ case CAT_HE:
+ return add_ff_action_he(tree, tvb, pinfo, offset);
+/* case CAT_VENDOR_SPECIFIC_PROTECTED: Vendor Specific Protected Category - 126 */
+/* return add_ff_action_vendor_specific_protected(tree, tvb, pinfo, offset);*/
+ case CAT_VENDOR_SPECIFIC: /* Vendor Specific Protected Category - 127 */
+ return add_ff_action_vendor_specific(tree, tvb, pinfo, offset);
+ default:
+ add_ff_category_code(tree, tvb, pinfo, offset);
+ return 1;
+ }
+}
+
+static const value_string ieee80211_rsn_cipher_vals[] = {
+ {0, "NONE"},
+ {1, "WEP (40-bit)"},
+ {2, "TKIP"},
+ {3, "AES (OCB)"},
+ {4, "AES (CCM)"},
+ {5, "WEP (104-bit)"},
+ {6, "BIP"},
+ {7, "Group addressed traffic not allowed"},
+ {8, "GCMP"},
+ {0, NULL}
+};
+
+static const value_string ieee80211_rsn_keymgmt_vals[] = {
+ {0, "NONE"},
+ {1, "WPA"},
+ {2, "PSK"},
+ {3, "FT over IEEE 802.1X"},
+ {4, "FT using PSK"},
+ {5, "WPA (SHA256)"},
+ {6, "PSK (SHA256)"},
+ {7, "TDLS / TPK Handshake"},
+ {0, NULL}
+};
+
+static void
+oui_base_custom(gchar *result, guint32 oui)
+{
+ guint8 p_oui[3];
+ const gchar *manuf_name;
+
+ p_oui[0] = oui >> 16 & 0xFF;
+ p_oui[1] = oui >> 8 & 0xFF;
+ p_oui[2] = oui & 0xFF;
+
+ /* Attempt an OUI lookup. */
+ manuf_name = uint_get_manuf_name_if_known(oui);
+ if (manuf_name == NULL) {
+ /* Could not find an OUI. */
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%02x:%02x:%02x", p_oui[0], p_oui[1], p_oui[2]);
+ }
+ else {
+ /* Found an address string. */
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%02x:%02x:%02x (%s)", p_oui[0], p_oui[1], p_oui[2], manuf_name);
+ }
+}
+
+static void
+rsn_gcs_base_custom(gchar *result, guint32 gcs)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, gcs >> 8);
+ tmp_str = val_to_str_wmem(NULL, gcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+}
+
+static void
+rsn_pcs_base_custom(gchar *result, guint32 pcs)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, pcs >> 8);
+ tmp_str = val_to_str_wmem(NULL, pcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+
+}
+static void
+rsn_akms_base_custom(gchar *result, guint32 akms)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, akms >> 8);
+ tmp_str = val_to_str_wmem(NULL, akms & 0xFF, ieee80211_rsn_keymgmt_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+}
+
+static gchar *
+rsn_pcs_return(guint32 pcs)
+{
+ gchar *result;
+
+ result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
+ result[0] = '\0';
+ rsn_pcs_base_custom(result, pcs);
+
+ return result;
+}
+
+static gchar *
+rsn_akms_return(guint32 akms)
+{
+ gchar *result;
+
+ result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
+ result[0] = '\0';
+ rsn_akms_base_custom(result, akms);
+
+ return result;
+}
+
+static void
+rsn_gmcs_base_custom(gchar *result, guint32 gmcs)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, gmcs >> 8);
+ tmp_str = val_to_str_wmem(NULL, gmcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+}
+
+static void
+rsni_base_custom(gchar *result, guint32 rsni)
+{
+ double temp_double;
+
+ temp_double = (double)rsni;
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%f dB", (temp_double / 2));
+}
+
+static void
+vht_tpe_custom(gchar *result, guint8 txpwr)
+{
+ gint8 txpwr_db;
+
+ txpwr_db = (gint8)(txpwr);
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%3.1f dBm", (txpwr_db/2.0));
+}
+
+static void
+channel_number_custom(gchar *result, guint8 channel_number)
+{
+ switch(channel_number){
+ case 0:
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on all supported channels in the specified Operating Class)", channel_number);
+ break;
+ case 255:
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on all supported channels listed in the AP Channel Report)", channel_number);
+ break;
+ default :
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on that Channel Number)", channel_number);
+ break;
+ }
+}
+
+/* WPA / WME */
+static const value_string ieee802111_wfa_ie_type_vals[] = {
+ { 1, "WPA Information Element" },
+ { 2, "WMM/WME" },
+ { 4, "WPS" },
+ { 0, NULL }
+};
+
+static const value_string ieee80211_wfa_ie_wpa_cipher_vals[] = {
+ { 0, "NONE" },
+ { 1, "WEP (40-bit)" },
+ { 2, "TKIP" },
+ { 3, "AES (OCB)" },
+ { 4, "AES (CCM)" },
+ { 5, "WEP (104-bit)" },
+ { 6, "BIP" },
+ { 7, "Group addressed traffic not allowed" },
+ { 0, NULL }
+};
+
+static const value_string ieee80211_wfa_ie_wpa_keymgmt_vals[] = {
+ { 0, "NONE" },
+ { 1, "WPA" },
+ { 2, "PSK" },
+ { 3, "FT over IEEE 802.1X" },
+ { 4, "FT using PSK" },
+ { 5, "WPA (SHA256)" },
+ { 6, "PSK (SHA256)" },
+ { 7, "TDLS / TPK Handshake" },
+ { 0, NULL }
+};
+
+static const value_string ieee80211_wfa_ie_wme_acs_vals[] = {
+ { 0, "Best Effort" },
+ { 1, "Background" },
+ { 2, "Video" },
+ { 3, "Voice" },
+ { 0, NULL }
+};
+
+static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_direction_vals[] = {
+ { 0, "Uplink" },
+ { 1, "Downlink" },
+ { 2, "Direct link" },
+ { 3, "Bidirectional link" },
+ { 0, NULL }
+};
+
+static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_psb_vals[] = {
+ { 0, "Legacy" },
+ { 1, "U-APSD" },
+ { 0, NULL }
+};
+
+static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_up_vals[] = {
+ { 0, "Best Effort" },
+ { 1, "Background" },
+ { 2, "Spare" },
+ { 3, "Excellent Effort" },
+ { 4, "Controlled Load" },
+ { 5, "Video" },
+ { 6, "Voice" },
+ { 7, "Network Control" },
+ { 0, NULL }
+};
+
+static const value_string ieee802111_wfa_ie_wme_qos_info_sta_max_sp_length_vals[] = {
+ { 0, "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" },
+ { 1, "WMM AP may deliver a maximum of 2 buffered frames (MSDUs and MMPDUs) per USP" },
+ { 2, "WMM AP may deliver a maximum of 4 buffered frames (MSDUs and MMPDUs) per USP" },
+ { 3, "WMM AP may deliver a maximum of 6 buffered frames (MSDUs and MMPDUs) per USP" },
+ { 0, NULL}
+};
+static const true_false_string ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs = {
+ "WMM delivery and trigger enabled",
+ "non-WMM PS"
+};
+
+static void
+wpa_mcs_base_custom(gchar *result, guint32 mcs)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, mcs >> 8);
+ tmp_str = val_to_str_wmem(NULL, mcs & 0xFF, ieee80211_wfa_ie_wpa_cipher_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+}
+
+static void
+wpa_ucs_base_custom(gchar *result, guint32 ucs)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, ucs >> 8);
+ tmp_str = val_to_str_wmem(NULL, ucs & 0xFF, ieee80211_wfa_ie_wpa_cipher_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+}
+static void
+wpa_akms_base_custom(gchar *result, guint32 akms)
+{
+ gchar oui_result[SHORT_STR];
+ gchar *tmp_str;
+
+ oui_result[0] = '\0';
+ oui_base_custom(oui_result, akms >> 8);
+ tmp_str = val_to_str_wmem(NULL, akms & 0xFF, ieee80211_wfa_ie_wpa_keymgmt_vals, "Unknown %d");
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
+ wmem_free(NULL, tmp_str);
+}
+
+static gchar *
+wpa_ucs_return(guint32 ucs)
+{
+ gchar *result;
+
+ result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
+ result[0] = '\0';
+ wpa_ucs_base_custom(result, ucs);
+
+ return result;
+}
+
+static gchar *
+wpa_akms_return(guint32 akms)
+{
+ gchar *result;
+
+ result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
+ result[0] = '\0';
+ wpa_akms_base_custom(result, akms);
+
+ return result;
+}
+
+/* For each Field */
+static const value_string ieee80211_wapi_suite_type[] = {
+ {0, "Reserved"},
+ {1, "WAI Certificate Authentication and Key Management"},
+ {2, "WAI Preshared Key Authentication and Key Management"},
+ {0, NULL},
+};
+/* For Summary Tag Information */
+static const value_string ieee80211_wapi_suite_type_short[] = {
+ {0, "Reserved"},
+ {1, "WAI-CERT"},
+ {2, "WAI-PSK"},
+ {0, NULL},
+};
+
+static const value_string ieee80211_wapi_cipher_type[] = {
+ {0, "Reserved"},
+ {1, "WPI-SMS4"},
+ {0, NULL},
+};
+
+static const value_string ieee802111_wfa_ie_wme_type[] = {
+ { 0, "Information Element" },
+ { 1, "Parameter Element" },
+ { 2, "TSPEC Element" },
+ { 0, NULL}
+};
+
+static const value_string ft_subelem_id_vals[] = {
+ {0, "Reserved"},
+ {1, "PMK-R1 key holder identifier (R1KH-ID)"},
+ {2, "GTK subelement"},
+ {3, "PMK-R0 key holder identifier (R0KH-ID)"},
+ {4, "IGTK"},
+ {0, NULL}
+};
+
+static int
+dissect_wme_qos_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
+{
+ proto_item *wme_qos_info_item;
+
+ static const int *ieee80211_mgt_req[] = {
+ &hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length,
+ &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be,
+ &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk,
+ &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi,
+ &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo,
+ &hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved,
+ NULL
+ };
+
+ static const int *ieee80211_mgt_resp[] = {
+ &hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd,
+ &hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count,
+ &hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved,
+ NULL
+ };
+
+ switch (ftype) {
+ case MGT_ASSOC_REQ:
+ case MGT_PROBE_REQ:
+ case MGT_REASSOC_REQ:
+ {
+ /* To AP so decode as per WMM standard Figure 7 QoS Info field when sent from WMM STA*/
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_qos_info,
+ ett_wme_qos_info, ieee80211_mgt_req,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ break;
+ }
+ case MGT_BEACON:
+ case MGT_PROBE_RESP:
+ case MGT_ASSOC_RESP:
+ case MGT_REASSOC_RESP:
+ {
+ /* From AP so decode as per WMM standard Figure 6 QoS Info field when sent from WMM AP */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_qos_info,
+ ett_wme_qos_info, ieee80211_mgt_resp,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ break;
+ }
+ default:
+ wme_qos_info_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_qos_info, tvb, offset, 1, ENC_NA);
+ expert_add_info_format(pinfo, wme_qos_info_item, &ei_ieee80211_wfa_ie_wme_qos_info_bad_ftype, "Could not deduce direction to decode correctly, ftype %u", ftype);
+ break;
+ }
+
+ offset += 1;
+ return offset;
+}
+
+static int
+decode_qos_parameter_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
+{
+ int i;
+ /* WME QoS Info Field */
+ offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype);
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_reserved, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ /* AC Parameters */
+ for (i = 0; i < 4; i++)
+ {
+ proto_item *ac_item, *aci_aifsn_item, *ecw_item;
+ proto_tree *ac_tree, *ecw_tree;
+ guint8 aci_aifsn, ecw, ecwmin, ecwmax;
+ guint16 cwmin, cwmax;
+ static const int *ieee80211_wfa_ie_wme[] = {
+ &hf_ieee80211_wfa_ie_wme_acp_aci,
+ &hf_ieee80211_wfa_ie_wme_acp_acm,
+ &hf_ieee80211_wfa_ie_wme_acp_aifsn,
+ &hf_ieee80211_wfa_ie_wme_acp_reserved,
+ NULL
+ };
+
+ ac_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_ac_parameters, tvb, offset, 4, ENC_NA);
+ ac_tree = proto_item_add_subtree(ac_item, ett_wme_ac);
+
+ /* ACI/AIFSN Field */
+ aci_aifsn_item = proto_tree_add_bitmask_with_flags(ac_tree, tvb, offset, hf_ieee80211_wfa_ie_wme_acp_aci_aifsn,
+ ett_wme_aci_aifsn, ieee80211_wfa_ie_wme,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ aci_aifsn = tvb_get_guint8(tvb, offset);
+ /* 802.11-2012, 8.4.2.31 EDCA Parameter Set element */
+ if (aci_aifsn < 2) {
+ expert_add_info_format(pinfo, aci_aifsn_item, &ei_ieee80211_qos_bad_aifsn,
+ "The minimum value for the AIFSN subfield is 2 (found %u).", aci_aifsn);
+ }
+ proto_item_append_text(ac_item, " ACI %u (%s), ACM %s, AIFSN %u",
+ (aci_aifsn & 0x60) >> 5, try_val_to_str((aci_aifsn & 0x60) >> 5, ieee80211_wfa_ie_wme_acs_vals),
+ (aci_aifsn & 0x10) ? "yes" : "no", aci_aifsn & 0x0f);
+ offset += 1;
+
+ /* ECWmin/ECWmax field */
+ ecw_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_ecw, tvb, offset, 1, ENC_NA);
+ ecw_tree = proto_item_add_subtree(ecw_item, ett_wme_ecw);
+ ecw = tvb_get_guint8(tvb, offset);
+ ecwmin = ecw & 0x0f;
+ ecwmax = (ecw & 0xf0) >> 4;
+ cwmin= (1 << ecwmin) - 1;
+ cwmax= (1 << ecwmax) - 1;
+ proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_max, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_min, tvb, offset, 1, ENC_NA);
+ proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_max, tvb, offset, 1, cwmax);
+ proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_min, tvb, offset, 1, cwmin);
+ proto_item_append_text(ac_item, ", ECWmin/max %u/%u (CWmin/max %u/%u)", ecwmin, ecwmax, cwmin, cwmax);
+ offset += 1;
+
+ /* TXOP Limit */
+ proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_txop_limit, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ac_item, ", TXOP %u", tvb_get_letohs(tvb, offset));
+ offset += 2;
+ }
+
+ return offset;
+}
+
+static int
+dissect_vendor_ie_wpawme(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 tag_len, int ftype)
+{
+ guint8 type;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_type, tvb, offset, 1, ENC_NA);
+ type = tvb_get_guint8(tvb, offset);
+ proto_item_append_text(tree, ": %s", val_to_str(type, ieee802111_wfa_ie_type_vals, "Unknown %d"));
+ offset += 1;
+
+ switch (type) {
+ case 1: /* Wi-Fi Protected Access (WPA) */
+ {
+ proto_item *wpa_mcs_item, *wpa_ucs_item, *wpa_akms_item;
+ proto_item *wpa_sub_ucs_item, *wpa_sub_akms_item;
+ proto_tree *wpa_mcs_tree, *wpa_ucs_tree, *wpa_akms_tree;
+ proto_tree *wpa_sub_ucs_tree, *wpa_sub_akms_tree;
+ guint16 ucs_count, akms_count;
+ guint ii;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /* Multicast Cipher Suite */
+ wpa_mcs_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_mcs, tvb, offset, 4, ENC_BIG_ENDIAN);
+ wpa_mcs_tree = proto_item_add_subtree(wpa_mcs_item, ett_wpa_mcs_tree);
+ proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* Check if OUI is 00:50:F2 (WFA) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
+ {
+ proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_wfa_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+
+ /* Unicast Cipher Suites */
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_ucs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ ucs_count = tvb_get_letohs(tvb, offset);
+ offset += 2;
+
+ wpa_ucs_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_ucs_list, tvb, offset, ucs_count * 4, ENC_NA);
+ wpa_ucs_tree = proto_item_add_subtree(wpa_ucs_item, ett_wpa_ucs_tree);
+ for (ii = 0; ii < ucs_count; ii++)
+ {
+ wpa_sub_ucs_item = proto_tree_add_item(wpa_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs, tvb, offset, 4, ENC_BIG_ENDIAN);
+ wpa_sub_ucs_tree = proto_item_add_subtree(wpa_sub_ucs_item, ett_wpa_sub_ucs_tree);
+ proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* Check if OUI is 00:50:F2 (WFA) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
+ {
+ proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_wfa_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(wpa_ucs_item, " %s", wpa_ucs_return(tvb_get_ntohl(tvb, offset)));
+ } else {
+ proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+ }
+
+ /* Authenticated Key Management Suites */
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_akms_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ akms_count = tvb_get_letohs(tvb, offset);
+ offset += 2;
+
+ wpa_akms_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_akms_list, tvb, offset, akms_count * 4, ENC_NA);
+ wpa_akms_tree = proto_item_add_subtree(wpa_akms_item, ett_wpa_akms_tree);
+ for (ii = 0; ii < akms_count; ii++)
+ {
+ wpa_sub_akms_item = proto_tree_add_item(wpa_akms_tree, hf_ieee80211_wfa_ie_wpa_akms, tvb, offset, 4, ENC_BIG_ENDIAN);
+ wpa_sub_akms_tree = proto_item_add_subtree(wpa_sub_akms_item, ett_wpa_sub_akms_tree);
+ proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* Check if OUI is 00:50:F2 (WFA) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
+ {
+ proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_wfa_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(wpa_akms_item, " %s", wpa_akms_return(tvb_get_ntohl(tvb, offset)));
+ } else {
+ proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+ }
+ break;
+ }
+ case 2: /* Wireless Multimedia Enhancements (WME) */
+ {
+ guint8 subtype;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_subtype, tvb, offset, 1, ENC_NA);
+ subtype = tvb_get_guint8(tvb, offset);
+ proto_item_append_text(tree, ": %s", val_to_str(subtype, ieee802111_wfa_ie_wme_type, "Unknown %d"));
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_version, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ switch (subtype) {
+ case 0: /* WME Information Element */
+ {
+ /* WME QoS Info Field */
+ offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype);
+ break;
+ }
+ case 1: /* WME Parameter Element */
+ {
+ offset = decode_qos_parameter_set(tree, tvb, pinfo, offset, ftype);
+ break;
+ }
+ case 2: /* WME TSPEC Element */
+ {
+ static const int *ieee80211_wfa_ie_wme_tspec_tsinfo[] = {
+ &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid,
+ &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction,
+ &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb,
+ &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up,
+ &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_tspec_tsinfo,
+ ett_tsinfo_tree, ieee80211_wfa_ie_wme_tspec_tsinfo,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 3;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_nor_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_max_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_max_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_inact_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_susp_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_mean_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_peak_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_burst_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_delay_bound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_phy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_surplus, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_medium, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ break;
+ }
+ default:
+ /* No default Action */
+ break;
+ } /* End switch (subtype) */
+ break;
+ }
+ case 4: /* WPS: Wifi Protected Setup */
+ {
+ dissect_wps_tlvs(tree, tvb, offset, tag_len-1, NULL);
+ }
+ break;
+ default:
+ /* No default Action...*/
+ break;
+ } /* End switch (type) */
+
+ return offset;
+}
+
+/*
+ * Dissect a group data cipher suite which consists of an OUI and a one-byte
+ * selector: IEEE802.11 2012 Figure 9-256.
+ *
+ * Accepts a two entry array of header fields so we can use this elsewhere.
+ */
+static int dissect_group_data_cipher_suite(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int *hf_array, gint ett_val, char *label)
+{
+ proto_tree *gdcs_tree = NULL;
+
+ gdcs_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_val, NULL,
+ label);
+ proto_tree_add_item(gdcs_tree, hf_array[0], tvb, offset, 3, ENC_BIG_ENDIAN);
+ offset += 3;
+ proto_tree_add_item(gdcs_tree, hf_array[1], tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ return offset;
+}
+
+/*
+ * Handle the HS 2.0 rev 2 OSU Server-only authenticated layer 2 Encryption
+ * Network element. This is almost the same format as the RSNE so maybe some
+ * common code can be used.
+ */
+static int
+dissect_hs20_osen(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ int hf_array[2] = { hf_group_data_cipher_suite_oui,
+ hf_group_data_cipher_suite_type };
+ proto_tree *pwc_list = NULL;
+ proto_item *pwcsi = NULL;
+ guint16 pwc_count = 0, pwc_index = 0;
+ guint16 akms_count = 0, akms_index = 0;
+ static const int *osen_rsn_cap[] = {
+ &hf_osen_rsn_cap_preauth,
+ &hf_osen_rsn_cap_no_pairwise,
+ &hf_osen_rsn_cap_ptksa_replay_counter,
+ &hf_osen_rsn_cap_gtksa_replay_counter,
+ &hf_osen_rsn_cap_mfpr,
+ &hf_osen_rsn_cap_mfpc,
+ &hf_osen_rsn_cap_jmr,
+ &hf_osen_rsn_cap_peerkey,
+ &hf_osen_rsn_spp_a_msdu_capable,
+ &hf_osen_rsn_spp_a_msdu_required,
+ &hf_osen_rsn_pbac,
+ &hf_osen_extended_key_id_iaf,
+ &hf_osen_reserved,
+ NULL
+ };
+ guint16 pmkid_count = 0, pmkid_index = 0;
+ int gmcs_array[2] = { hf_osen_group_management_cipher_suite_oui,
+ hf_osen_group_management_cipher_suite_type };
+
+ offset = dissect_group_data_cipher_suite(tvb, pinfo, tree, offset, hf_array,
+ ett_osen_group_data_cipher_suite,
+ "OSEN Group Data Cipher Suite");
+
+ pwc_count = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_osen_pcs_count, tvb, offset,
+ 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ if (pwc_count > 0) {
+ int start_offset = offset;
+ pwc_list = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_osen_pairwise_cipher_suites, &pwcsi,
+ "OSEN Pairwise Cipher Suite List");
+
+ while (pwc_count > 0) {
+ if (tvb_reported_length_remaining(tvb, offset) >= 4) {
+ int hf_array2[2] = { hf_osen_pairwise_cipher_suite_oui,
+ hf_osen_pairwise_cipher_suite_type };
+ char label[128];
+
+ g_snprintf(label, sizeof(label), "OSEN Pairwise Cipher Suite %d", pwc_index);
+ offset = dissect_group_data_cipher_suite(tvb, pinfo, pwc_list,
+ offset, hf_array2, ett_osen_pairwise_cipher_suite,
+ label);
+ pwc_index++;
+ pwc_count--;
+ } else {
+ /* Insert the remaining? Expert Info? */
+ offset += tvb_reported_length_remaining(tvb, offset);
+ break;
+ }
+ }
+
+ proto_item_set_len(pwcsi, offset - start_offset);
+ }
+
+ if (tvb_reported_length_remaining(tvb, offset) == 0) {
+ return tvb_captured_length(tvb);
+ }
+
+ /* Now handle the AKM Suites */
+ akms_count = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_osen_akm_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ if (akms_count > 0) {
+ int start_offset = offset;
+ proto_tree *akm_list = NULL;
+ proto_item *akmcsi = NULL;
+
+ akm_list = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_osen_akm_cipher_suites, &akmcsi,
+ "OSEN AKM Cipher Suite List");
+
+ while (akms_count > 0) {
+ if (tvb_reported_length_remaining(tvb, offset) >= 4) {
+ int hf_array3[2] = { hf_osen_akm_cipher_suite_oui,
+ hf_osen_akm_cipher_suite_type};
+ char label[128];
+
+ g_snprintf(label, sizeof(label), "OSEN AKM Cipher Suite %d", akms_index);
+ offset = dissect_group_data_cipher_suite(tvb, pinfo, akm_list,
+ offset, hf_array3, ett_osen_akm_cipher_suite,
+ label);
+ akms_index++;
+ akms_count--;
+ } else {
+ /* Expert info? */
+ offset += tvb_reported_length_remaining(tvb, offset);
+ break;
+ }
+ }
+ proto_item_set_len(akmcsi, offset - start_offset);
+ }
+
+ /* Any more? */
+ if (tvb_reported_length_remaining(tvb, offset) == 0) {
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_osen_rsn_cap_flags,
+ ett_osen_rsn_cap_tree, osen_rsn_cap,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ /* Any more? */
+ if (tvb_reported_length_remaining(tvb, offset) == 0) {
+ return tvb_captured_length(tvb);
+ }
+
+ pmkid_count = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_osen_pmkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ if (pmkid_count > 0) {
+ proto_tree *pmkid_list = NULL;
+
+ pmkid_list = proto_tree_add_subtree(tree, tvb, offset, pmkid_count * 16,
+ ett_osen_pmkid_list, NULL,
+ "OSEN PKMID List");
+
+ while (pmkid_count > 0) {
+ proto_tree *pmkid_tree = NULL;
+
+ pmkid_tree = proto_tree_add_subtree_format(pmkid_list, tvb,offset, 16,
+ ett_osen_pmkid_tree, NULL,
+ "OSEN PKMID %d", pmkid_index);
+ proto_tree_add_item(pmkid_tree, hf_osen_pmkid, tvb, offset, 16,
+ ENC_NA);
+ offset += 16;
+ pmkid_index++;
+ pmkid_count--;
+ }
+ }
+
+ offset = dissect_group_data_cipher_suite(tvb, pinfo, tree, offset, gmcs_array,
+ ett_osen_group_management_cipher_suite,
+ "OSEN Group Management Cipher Suite");
+
+ return offset;
+}
+
+static const value_string hs20_indication_release_number_vals[] = {
+ { 0, "Release 1" },
+ { 1, "Release 2" },
+ { 0, NULL }
+};
+
+static int
+dissect_hs20_indication(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ static const int *ieee80211_hs20_indication[] = {
+ &hf_hs20_indication_dgaf_disabled,
+ &hf_hs20_indication_pps_mo_id_present,
+ &hf_hs20_indication_anqp_domain_id_present,
+ &hf_hs20_reserved,
+ &hf_hs20_indication_release_number,
+ NULL
+ };
+ int len = tvb_captured_length(tvb);
+ int offset = 0;
+ guint8 indic = tvb_get_guint8(tvb, offset);
+
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_hs20_indication,
+ ENC_NA);
+ offset++;
+
+ if (len >= 3 && (indic & 0x02)) { /* Contains a PPS MO ID field ... display it. */
+ proto_tree_add_item(tree, hf_hs20_indication_pps_mo_id, tvb, offset,
+ 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+
+ if ((len >= (offset + 2)) && (indic & 0x04)) {
+ proto_tree_add_item(tree, hf_hs20_indication_anqp_domain_id, tvb, offset,
+ 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+
+ return offset;
+}
+
+static void
+dissect_vendor_ie_wfa(packet_info *pinfo, proto_item *item, tvbuff_t *tag_tvb)
+{
+ gint tag_len = tvb_reported_length(tag_tvb);
+ guint8 subtype;
+ int offset = 0;
+ tvbuff_t *vendor_tvb;
+
+ if (tag_len < 4)
+ return;
+
+ subtype = tvb_get_guint8(tag_tvb, 3);
+ proto_item_append_text(item, ": %s", val_to_str_const(subtype, wfa_subtype_vals, "Unknown"));
+ vendor_tvb = tvb_new_subset_length(tag_tvb, offset + 4, tag_len - 4);
+ dissector_try_uint_new(wifi_alliance_ie_table, subtype, vendor_tvb, pinfo, item, FALSE, NULL);
+}
+
+static void
+dissect_vendor_ie_rsn(proto_item * item, proto_tree * tree, tvbuff_t * tvb, int offset, guint32 tag_len)
+{
+
+ switch(tvb_get_guint8(tvb, offset)){
+ case 4:
+ {
+ /* IEEE 802.11i / Key Data Encapsulation / Data Type=4 - PMKID.
+ * This is only used within EAPOL-Key frame Key Data. */
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_rsn_ie_pmkid, tvb, offset, 16, ENC_NA);
+ }
+ break;
+ default:
+ proto_tree_add_item(tree, hf_ieee80211_rsn_ie_unknown, tvb, offset, tag_len, ENC_NA);
+ break;
+ }
+
+ proto_item_append_text(item, ": RSN");
+
+}
+
+typedef enum {
+ MARVELL_IE_MESH = 4
+} marvell_ie_type_t;
+
+static void
+dissect_vendor_ie_marvell(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len)
+{
+ guint8 type;
+
+ type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ switch (type) {
+ case MARVELL_IE_MESH:
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_subtype, tvb,
+ offset++, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_version, tvb,
+ offset++, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_active_proto_id, tvb,
+ offset++, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_active_metric_id, tvb,
+ offset++, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_cap, tvb,
+ offset++, 1, ENC_LITTLE_ENDIAN);
+ break;
+
+ default:
+ proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_data, tvb, offset,
+ tag_len - 1, ENC_NA);
+ break;
+ }
+}
+
+typedef enum {
+ ATHEROS_IE_ADVCAP = 1,
+ ATHEROS_IE_XR = 3
+} atheros_ie_type_t;
+
+typedef enum {
+ ATHEROS_IE_ADVCAP_S = 1
+} atheros_ie_advcap_subtype_t;
+
+typedef enum {
+ ATHEROS_IE_XR_S = 1
+} atheros_ie_xr_subtype_t;
+
+typedef enum {
+ ATHEROS_IE_CAP_TURBOP = 0x01,
+ ATHEROS_IE_CAP_COMP = 0x02,
+ ATHEROS_IE_CAP_FF = 0x04,
+ ATHEROS_IE_CAP_XR = 0x08,
+ ATHEROS_IE_CAP_AR = 0x10,
+ ATHEROS_IE_CAP_BURST = 0x20,
+ ATHEROS_IE_CAP_WME = 0x40,
+ ATHEROS_IE_CAP_BOOST = 0x80
+} atheros_ie_cap_t;
+
+static const value_string atheros_ie_type_vals[] = {
+ { ATHEROS_IE_ADVCAP, "Advanced Capability"},
+ { ATHEROS_IE_XR, "eXtended Range"},
+ { 0, NULL }
+};
+
+static const int *ieee80211_atheros_ie_cap[] = {
+ &hf_ieee80211_atheros_ie_cap_f_turbop,
+ &hf_ieee80211_atheros_ie_cap_f_comp,
+ &hf_ieee80211_atheros_ie_cap_f_ff,
+ &hf_ieee80211_atheros_ie_cap_f_xr,
+ &hf_ieee80211_atheros_ie_cap_f_ar,
+ &hf_ieee80211_atheros_ie_cap_f_burst,
+ &hf_ieee80211_atheros_ie_cap_f_wme,
+ &hf_ieee80211_atheros_ie_cap_f_boost,
+ NULL
+};
+
+static void
+dissect_vendor_ie_atheros(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint tag_len,
+ packet_info *pinfo, proto_item *ti_len)
+{
+ guint8 type;
+ guint8 subtype;
+ guint8 version;
+
+ if (tag_len <= 3) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 6", tag_len+3); /* Add length of OUI to tag_length */
+ return;
+ }
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_type, tvb, offset, 1, ENC_NA);
+ type = tvb_get_guint8(tvb, offset);
+ proto_item_append_text(item, ": %s", val_to_str_const(type, atheros_ie_type_vals, "Unknown"));
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_subtype, tvb, offset, 1, ENC_NA);
+ subtype = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_version, tvb, offset, 1, ENC_NA);
+ version = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ tag_len -= 1;
+
+ if (version == 0)
+ {
+ switch (type) {
+ case ATHEROS_IE_ADVCAP:
+ {
+ switch (subtype) {
+ case ATHEROS_IE_ADVCAP_S:
+ {
+ proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_advcap_cap,
+ ett_ath_cap_tree, ieee80211_atheros_ie_cap,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_advcap_defkey, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ tag_len -= 2;
+ break;
+ }
+ default:
+ /* No default Action */
+ break;
+ } /* End switch (subtype) */
+ break;
+ }
+ case ATHEROS_IE_XR:
+ {
+ switch (subtype) {
+ case ATHEROS_IE_XR_S:
+ {
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_info, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_base_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ tag_len -= 6;
+
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_xr_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ tag_len -= 6;
+
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_xr_beacon, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ tag_len -= 2;
+
+ proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_xr_base_cap,
+ ett_ath_cap_tree, ieee80211_atheros_ie_cap,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_xr_xr_cap,
+ ett_ath_cap_tree, ieee80211_atheros_ie_cap,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
+ tag_len -= 1;
+ break;
+ }
+ default:
+ /* No default Action */
+ break;
+ } /* End switch (subtype) */
+ break;
+ default:
+ /* No default Action */
+ break;
+ } /* End switch (type) */
+
+ }
+ }
+ if (tag_len > 0) {
+ proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_data, tvb, offset, tag_len, ENC_NA);
+ }
+}
+
+typedef enum {
+ AIRONET_IE_DTPC = 0,
+ AIRONET_IE_UNKNOWN1 = 1,
+ AIRONET_IE_VERSION = 3,
+ AIRONET_IE_QOS,
+ AIRONET_IE_UNKNOWN11 = 11,
+ AIRONET_IE_QBSS_V2 = 14,
+ AIRONET_IE_CLIENT_MFP = 20
+} aironet_ie_type_t;
+
+static const value_string aironet_ie_type_vals[] = {
+ { AIRONET_IE_DTPC, "DTPC"},
+ { AIRONET_IE_UNKNOWN1, "Unknown (1)"},
+ { AIRONET_IE_VERSION, "CCX version"},
+ { AIRONET_IE_QOS, "Qos"},
+ { AIRONET_IE_UNKNOWN11, "Unknown (11)"},
+ { AIRONET_IE_QBSS_V2, "QBSS V2 - CCA"},
+ { AIRONET_IE_CLIENT_MFP, "Client MFP"},
+ { 0, NULL }
+};
+
+static const value_string aironet_mfp_vals[] = {
+ { 0, "Disabled"},
+ { 1, "Enabled"},
+ { 0, NULL }
+};
+
+static void
+dissect_vendor_ie_aironet(proto_item *aironet_item, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len)
+{
+ guint8 type;
+ int i;
+ gboolean dont_change = FALSE; /* Don't change the IE item text to default */
+
+ type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ switch (type) {
+ case AIRONET_IE_DTPC:
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_dtpc, tvb, offset, 1, ENC_NA);
+ proto_item_append_text(aironet_item, ": Aironet DTPC Powerlevel %ddBm", tvb_get_guint8(tvb, offset));
+ offset += 1;
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_dtpc_unknown, tvb, offset, 1, ENC_NA);
+ dont_change = TRUE;
+ break;
+ case AIRONET_IE_VERSION:
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(aironet_item, ": Aironet CCX version = %d", tvb_get_guint8(tvb, offset));
+ dont_change = TRUE;
+ break;
+ case AIRONET_IE_QOS:
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_qos_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_qos_paramset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ /* XXX: just copied over from WME. Maybe "Best Effort" and "Background"
+ * need to be swapped. Also, the "TXOP" may be TXOP - or not.
+ */
+ for (i = 0; i < 4; i++) {
+ guint8 byte1, byte2;
+ guint16 txop;
+ byte1 = tvb_get_guint8(tvb, offset);
+ byte2 = tvb_get_guint8(tvb, offset + 1);
+ txop = tvb_get_letohs(tvb, offset + 2);
+ proto_tree_add_bytes_format(ietree, hf_ieee80211_aironet_ie_qos_val, tvb, offset, 4, NULL,
+ "CCX QoS Parameters: ACI %u (%s), Admission Control %sMandatory, AIFSN %u, ECWmin %u, ECWmax %u, TXOP %u",
+ (byte1 & 0x60) >> 5, val_to_str((byte1 & 0x60) >> 5, wme_acs, "(Unknown: %d)"),
+ (byte1 & 0x10) ? "" : "not ", byte1 & 0x0f,
+ byte2 & 0x0f, (byte2 & 0xf0) >> 4,
+ txop);
+ offset += 4;
+ }
+ break;
+ case AIRONET_IE_QBSS_V2:
+ /* Extract Values */
+ proto_tree_add_item(ietree, hf_ieee80211_qbss2_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_qbss2_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_qbss2_cal, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ietree, hf_ieee80211_qbss2_gl, tvb, offset + 4, 1, ENC_LITTLE_ENDIAN);
+ break;
+ case AIRONET_IE_CLIENT_MFP:
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_clientmfp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(aironet_item, ": Aironet Client MFP %s",
+ val_to_str_const(1 & tvb_get_guint8(tvb, offset), aironet_mfp_vals, "Unknown"));
+ dont_change = TRUE;
+ break;
+ default:
+ proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_data, tvb, offset,
+ tag_len - 1, ENC_NA);
+ break;
+ }
+ if (!dont_change) {
+ proto_item_append_text(aironet_item, ": Aironet %s (%d)",
+ val_to_str_const(type, aironet_ie_type_vals, "Unknown"), type);
+ }
+}
+
+#define ARUBA_APNAME 3
+static const value_string ieee80211_vs_aruba_subtype_vals[] = {
+ { ARUBA_APNAME, "AP Name"},
+ { 0, NULL }
+};
+static void
+dissect_vendor_ie_aruba(proto_item *item, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len)
+{
+ guint8 type;
+ const guint8* name;
+
+ offset += 1; /* VS OUI Type */
+ tag_len -= 1;
+
+ type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_subtype, tvb, offset, 1, ENC_NA);
+ proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_aruba_subtype_vals, "Unknown"));
+ offset += 1;
+ tag_len -= 1;
+
+ switch (type) {
+ case ARUBA_APNAME:
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_aruba_apname, tvb,
+ offset, tag_len, ENC_ASCII|ENC_NA, wmem_packet_scope(), &name);
+ proto_item_append_text(item, " (%s)", name);
+ break;
+
+ default:
+ proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_data, tvb, offset,
+ tag_len, ENC_NA);
+ proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, tag_len));
+ break;
+ }
+}
+
+static void
+dissect_vendor_ie_mikrotik(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len)
+{
+ guint8 type, length;
+ proto_item *subitem;
+ proto_tree *subtree;
+
+ offset += 1; /* VS OUI Type */
+ tag_len -= 1;
+ /* FIXME: Make sure we have at least 2 bytes left */
+ proto_tree_add_item(ietree, hf_ieee80211_vs_mikrotik_unknown, tvb, offset, 2, ENC_NA);
+
+ offset += 2;
+ tag_len -= 2;
+
+ while (tag_len >= 2) {
+ type = tvb_get_guint8(tvb, offset);
+ length = tvb_get_guint8(tvb, offset+1);
+ subitem = proto_tree_add_item(ietree, hf_ieee80211_vs_mikrotik_subitem, tvb, offset, length+2, ENC_NA);
+ subtree = proto_item_add_subtree(subitem, ett_mikrotik);
+ proto_item_set_text(subitem, "Sub IE (T/L: %d/%d)", type, length);
+
+ proto_tree_add_item(subtree, hf_ieee80211_vs_mikrotik_subtype, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item(subtree, hf_ieee80211_vs_mikrotik_sublength, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ tag_len -= 1;
+
+ if (tag_len < length)
+ /* FIXME: warn about this */
+ length = tag_len;
+ if (length == 0) {
+ break;
+ }
+
+ proto_tree_add_item(subtree, hf_ieee80211_vs_mikrotik_subdata, tvb, offset, length, ENC_NA);
+ offset += length;
+ tag_len -= length;
+ }
+}
+
+#define AEROHIVE_HOSTNAME 33
+static const value_string ieee80211_vs_aerohive_type_vals[] = {
+ { AEROHIVE_HOSTNAME, "Host Name"},
+ { 0, NULL }
+};
+static void
+dissect_vendor_ie_aerohive(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len, packet_info *pinfo)
+{
+ guint32 type, length;
+ const guint8* hostname;
+ proto_item *ti_len;
+
+ /* VS OUI Type */
+ type = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ tag_len -= 1;
+
+ switch(type){
+ case AEROHIVE_HOSTNAME: /* Unknown (2 bytes) + Host Name Length (1 byte) + Host Name */
+
+ proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_aerohive_type_vals, "Unknown"));
+
+ proto_tree_add_item(ietree, hf_ieee80211_vs_aerohive_unknown, tvb, offset, 2, ENC_NA);
+ offset += 2;
+ tag_len -= 2;
+
+ ti_len = proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_aerohive_hostname_length, tvb, offset, 1, ENC_NA, &length);
+ offset += 1;
+ tag_len -= 1;
+
+ if (tag_len < length) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < Host Name Length");
+ length = tag_len;
+ }
+
+ proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_aerohive_hostname, tvb, offset, length, ENC_ASCII|ENC_NA, wmem_packet_scope(), &hostname);
+ proto_item_append_text(item, " (%s)", hostname);
+
+ break;
+
+ default:
+ proto_tree_add_item(ietree, hf_ieee80211_vs_aerohive_data, tvb, offset, tag_len, ENC_NA);
+ break;
+ }
+}
+
+enum vs_nintendo_type {
+ NINTENDO_SERVICES = 0x11,
+ NINTENDO_CONSOLEID = 0xF0
+};
+
+static const value_string ieee80211_vs_nintendo_type_vals[] = {
+ { NINTENDO_SERVICES, "Services"},
+ { NINTENDO_CONSOLEID, "ConsoleID"},
+ { 0, NULL }
+};
+
+static proto_tree*
+dissect_vendor_ie_nintendo_tlv(const int hfindex, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 sublen)
+{
+ proto_item *nintendo_item;
+ proto_tree *nintendo_tree;
+
+ nintendo_item = proto_tree_add_item(ietree, hfindex, tvb, offset, sublen, ENC_NA);
+ nintendo_tree = proto_item_add_subtree(nintendo_item, ett_nintendo);
+
+ proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_type, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_length, tvb, offset + 1, 1, ENC_NA);
+
+ return nintendo_tree;
+}
+
+static void
+dissect_vendor_ie_nintendo(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len)
+{
+ proto_tree *nintendo_tree;
+
+ guint8 subtype;
+ guint8 sublength;
+ guint32 length = tag_len;
+
+ /* Skip OUI type for now - the code is for type 1 (StreetPass) only */
+ /* http://3dbrew.org/wiki/StreetPass */
+ offset += 1;
+ length -= 1;
+
+ while(length > 0 && length < 256) { /* otherwise we are < 0 but on unsigned */
+ subtype = tvb_get_guint8(tvb, offset);
+ sublength = tvb_get_guint8(tvb, offset + 1);
+
+ switch(subtype) {
+ case NINTENDO_SERVICES:
+ nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_servicelist, ietree, tvb, offset, sublength + 2);
+ offset += 2;
+ length -= 2;
+
+ while (sublength > 4) {
+
+ proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_service, tvb, offset, 5, ENC_NA);
+ offset += 5;
+ length -= 5;
+ sublength -= 5;
+ }
+ break;
+ case NINTENDO_CONSOLEID:
+ nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_consoleid, ietree, tvb, offset, sublength + 2);
+ offset += + 2;
+ length -= + 2;
+
+ proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_consoleid, tvb, offset, sublength, ENC_NA);
+ offset += sublength;
+ length -= sublength;
+ break;
+ default:
+ nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_unknown, ietree, tvb, offset, sublength + 2);
+ offset += + 2;
+ length -= + 2;
+
+ proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_unknown, tvb, offset, sublength, ENC_NA);
+ offset += sublength;
+ length -= sublength;
+ break;
+ }
+ }
+}
+
+static void
+dissect_vendor_ie_meru(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len,
+ packet_info *pinfo)
+{
+ guint32 type, length;
+ proto_item *subitem, *ti_len;
+ proto_tree *subtree;
+
+ while (tag_len >= 2) {
+ subitem = proto_tree_add_item(ietree, hf_ieee80211_vs_meru_subitem, tvb, offset, 2, ENC_NA);
+ subtree = proto_item_add_subtree(subitem, ett_meru);
+
+ proto_tree_add_item_ret_uint(subtree, hf_ieee80211_vs_meru_subtype, tvb, offset, 1, ENC_NA, &type);
+ offset += 1;
+ tag_len -= 1;
+
+ ti_len = proto_tree_add_item_ret_uint(subtree, hf_ieee80211_vs_meru_sublength, tvb, offset, 1, ENC_NA, &length);
+ offset += 1;
+ tag_len -= 1;
+
+ if (tag_len < length) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < Sub Length");
+ length = tag_len;
+ }
+
+ proto_item_append_text(subitem, " (t=%d, l=%d)", type, length);
+ proto_item_set_len(subitem, 2+length);
+
+ proto_tree_add_item(subtree, hf_ieee80211_vs_meru_subdata, tvb, offset, length, ENC_NA);
+ offset += length;
+ tag_len -= length;
+
+ }
+}
+
+static const value_string ieee80211_vs_extreme_subtype_vals[] = {
+ { 1, "AP Name"},
+ { 0, NULL }
+};
+
+static void
+dissect_vendor_ie_extreme(proto_item *item _U_, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len,
+ packet_info *pinfo)
+{
+ guint32 type, length;
+ proto_item *ti_len;
+
+ proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_extreme_subtype, tvb, offset, 1, ENC_NA, &type);
+ offset += 1;
+ tag_len -= 1;
+
+ proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_subdata, tvb, offset, tag_len, ENC_NA);
+
+ switch(type){
+ case 1: /* Unknown (7 bytes) + AP Name Length (1 byte) + AP Name */
+
+ proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_unknown, tvb, offset, 7, ENC_NA);
+ offset += 7;
+ tag_len -= 1;
+
+ ti_len = proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_extreme_ap_length, tvb, offset, 1, ENC_NA, &length);
+ offset += 1;
+ tag_len -= 1;
+
+ if (tag_len < length) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < AP Length");
+ length = tag_len;
+ }
+
+ proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_ap_name, tvb, offset, length, ENC_ASCII|ENC_NA);
+
+ break;
+ default:
+ /* Expert info ? */
+ break;
+ }
+}
+
+/* 802.11-2012 8.4.2.37 QoS Capability element */
+static int
+dissect_qos_capability(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
+{
+ switch (ftype) {
+ case MGT_ASSOC_REQ:
+ case MGT_PROBE_REQ:
+ case MGT_REASSOC_REQ:
+ {
+ /* To AP so decode Qos Info as STA */
+ offset += add_ff_qos_info_sta(tree, tvb, pinfo, offset);
+ break;
+ }
+
+ case MGT_BEACON:
+ case MGT_PROBE_RESP:
+ case MGT_ASSOC_RESP:
+ case MGT_REASSOC_RESP:
+ {
+ /* From AP so decode QoS Info as AP */
+ offset += add_ff_qos_info_ap(tree, tvb, pinfo, offset);
+ break;
+ }
+
+ default:
+ expert_add_info_format(pinfo, proto_tree_get_parent(tree), &ei_ieee80211_qos_info_bad_ftype,
+ "Could not deduce direction to decode correctly, ftype %u", ftype);
+ break;
+ }
+
+ return offset;
+}
+
+/*
+ * 7.3.2.25 RSNE information element. Common format with OSEN except the
+ * verison... should refactor
+ */
+static int
+dissect_rsn_ie(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb,
+ int offset, guint32 tag_len, association_sanity_check_t *association_sanity_check)
+{
+ proto_item *rsn_gcs_item, *rsn_pcs_item, *rsn_akms_item, *rsn_pmkid_item, *rsn_gmcs_item;
+ proto_item *rsn_sub_pcs_item, *rsn_sub_akms_item;
+ proto_item *rsn_pcs_count, *rsn_akms_count, *rsn_pmkid_count;
+ proto_tree *rsn_gcs_tree, *rsn_pcs_tree, *rsn_akms_tree, *rsn_pmkid_tree, *rsn_gmcs_tree;
+ proto_tree *rsn_sub_pcs_tree, *rsn_sub_akms_tree;
+ guint16 pcs_count, akms_count, pmkid_count;
+ guint ii;
+ int tag_end = offset + tag_len;
+ static const int *ieee80211_rsn_cap[] = {
+ &hf_ieee80211_rsn_cap_preauth,
+ &hf_ieee80211_rsn_cap_no_pairwise,
+ &hf_ieee80211_rsn_cap_ptksa_replay_counter,
+ &hf_ieee80211_rsn_cap_gtksa_replay_counter,
+ &hf_ieee80211_rsn_cap_mfpr,
+ &hf_ieee80211_rsn_cap_mfpc,
+ &hf_ieee80211_rsn_cap_jmr,
+ &hf_ieee80211_rsn_cap_peerkey,
+ NULL
+ };
+
+ proto_tree_add_item(tree, hf_ieee80211_rsn_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /* 7.3.2.25.1 Group Cipher suites */
+ rsn_gcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gcs, tvb, offset, 4, ENC_BIG_ENDIAN);
+ rsn_gcs_tree = proto_item_add_subtree(rsn_gcs_item, ett_rsn_gcs_tree);
+ proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* Check if OUI is 00:0F:AC (ieee80211) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
+ {
+ proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_80211_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+
+ /* 7.3.2.25.2 Pairwise Cipher suites */
+ rsn_pcs_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ pcs_count = tvb_get_letohs(tvb, offset);
+ offset += 2;
+
+ if (offset + (pcs_count * 4) > tag_end)
+ {
+ expert_add_info_format(pinfo, rsn_pcs_count, &ei_ieee80211_rsn_pcs_count,
+ "Pairwise Cipher Suite Count too large, 4*%u > %d", pcs_count, tag_end - offset);
+ pcs_count = (tag_end - offset) / 4;
+ }
+
+ rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, ENC_NA);
+ rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree);
+ for (ii = 0; ii < pcs_count; ii++)
+ {
+ rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, ENC_BIG_ENDIAN);
+ rsn_sub_pcs_tree = proto_item_add_subtree(rsn_sub_pcs_item, ett_rsn_sub_pcs_tree);
+ proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* Check if OUI is 00:0F:AC (ieee80211) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
+ {
+ proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(rsn_pcs_item, " %s", rsn_pcs_return(tvb_get_ntohl(tvb, offset)));
+ } else {
+ proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+ }
+
+ if (offset >= tag_end)
+ {
+ return offset;
+ }
+
+ /* 7.3.2.25.2 AKM suites */
+ rsn_akms_count = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ akms_count = tvb_get_letohs(tvb, offset);
+ offset += 2;
+
+ if (offset + (akms_count * 4) > tag_end)
+ {
+ expert_add_info_format(pinfo, rsn_akms_count, &ei_ieee80211_rsn_pmkid_count,
+ "Auth Key Management (AKM) Suite Count too large, 4*%u > %d", akms_count, tag_end - offset);
+ akms_count = (tag_end - offset) / 4;
+ }
+
+ rsn_akms_item = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_list, tvb, offset, akms_count * 4, ENC_NA);
+ rsn_akms_tree = proto_item_add_subtree(rsn_akms_item, ett_rsn_akms_tree);
+ for (ii = 0; ii < akms_count; ii++)
+ {
+ rsn_sub_akms_item = proto_tree_add_item(rsn_akms_tree, hf_ieee80211_rsn_akms, tvb, offset, 4, ENC_BIG_ENDIAN);
+ rsn_sub_akms_tree = proto_item_add_subtree(rsn_sub_akms_item, ett_rsn_sub_akms_tree);
+ proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* Check if OUI is 00:0F:AC (ieee80211) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
+ {
+ proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(rsn_akms_item, " %s", rsn_akms_return(tvb_get_ntohl(tvb, offset)));
+
+ if (association_sanity_check) {
+ guint32 akm_suite = tvb_get_ntohl(tvb, offset);
+ if (akm_suite == 0x000FAC03 || akm_suite == 0x000FAC04 || akm_suite == 0x000FAC09) {
+ /* This is an FT AKM suite */
+ association_sanity_check->has_ft_akm_suite = TRUE;
+ if (association_sanity_check->rsn_first_ft_akm_suite == NULL && rsn_sub_akms_tree != NULL) {
+ association_sanity_check->rsn_first_ft_akm_suite = rsn_sub_akms_tree->last_child;
+ }
+ } else {
+ /* This is a non-FT AKM suite */
+ association_sanity_check->has_non_ft_akm_suite = TRUE;
+ if (association_sanity_check->rsn_first_non_ft_akm_suite == NULL && rsn_sub_akms_tree != NULL) {
+ association_sanity_check->rsn_first_non_ft_akm_suite = rsn_sub_akms_tree->last_child;
+ }
+ }
+ }
+ } else {
+ proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+ }
+
+ /* 7.3.2.25.3 RSN capabilities */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_rsn_cap,
+ ett_rsn_cap_tree, ieee80211_rsn_cap,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ if (offset >= tag_end)
+ {
+ return offset;
+ }
+ /* 7.3.2.25.4 PMKID */
+ rsn_pmkid_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ pmkid_count = tvb_get_letohs(tvb, offset);
+ offset += 2;
+
+ if (offset + (pmkid_count * 16) > tag_end)
+ {
+ expert_add_info_format(pinfo, rsn_pmkid_count, &ei_ieee80211_pmkid_count_too_large,
+ "PMKID Count too large, 16*%u > %d", pmkid_count, tag_end - offset);
+ pmkid_count = (tag_end - offset) / 16;
+ }
+
+ rsn_pmkid_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_list, tvb, offset, pmkid_count * 16, ENC_NA);
+ rsn_pmkid_tree = proto_item_add_subtree(rsn_pmkid_item, ett_rsn_pmkid_tree);
+ for (ii = 0; ii < pmkid_count; ii++)
+ {
+ proto_tree_add_item(rsn_pmkid_tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, ENC_NA);
+ offset += 16;
+ }
+
+ if (offset >= tag_end)
+ {
+ return offset;
+ }
+ /* Group Management Cipher Suite (802.11w)*/
+ rsn_gmcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gmcs, tvb, offset, 4, ENC_BIG_ENDIAN);
+ rsn_gmcs_tree = proto_item_add_subtree(rsn_gmcs_item, ett_rsn_gmcs_tree);
+ proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ /* Check if OUI is 00:0F:AC (ieee80211) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
+ {
+ proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_80211_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
+
+ return offset;
+}
+
+/* 7.3.2.27 Extended Capabilities information element (127) */
+static int
+dissect_extended_capabilities_ie(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;
+ proto_item *ti_ex_cap;
+ static const int *ieee80211_tag_extended_capabilities_byte1[] = {
+ &hf_ieee80211_tag_extended_capabilities_b0,
+ &hf_ieee80211_tag_extended_capabilities_b1,
+ &hf_ieee80211_tag_extended_capabilities_b2,
+ &hf_ieee80211_tag_extended_capabilities_b3,
+ &hf_ieee80211_tag_extended_capabilities_b4,
+ &hf_ieee80211_tag_extended_capabilities_b5,
+ &hf_ieee80211_tag_extended_capabilities_b6,
+ &hf_ieee80211_tag_extended_capabilities_b7,
+ NULL
+ };
+ static const int *ieee80211_tag_extended_capabilities_byte2[] = {
+ &hf_ieee80211_tag_extended_capabilities_b8,
+ &hf_ieee80211_tag_extended_capabilities_b9,
+ &hf_ieee80211_tag_extended_capabilities_b10,
+ &hf_ieee80211_tag_extended_capabilities_b11,
+ &hf_ieee80211_tag_extended_capabilities_b12,
+ &hf_ieee80211_tag_extended_capabilities_b13,
+ &hf_ieee80211_tag_extended_capabilities_b14,
+ &hf_ieee80211_tag_extended_capabilities_b15,
+ NULL
+ };
+ static const int *ieee80211_tag_extended_capabilities_byte3[] = {
+ &hf_ieee80211_tag_extended_capabilities_b16,
+ &hf_ieee80211_tag_extended_capabilities_b17,
+ &hf_ieee80211_tag_extended_capabilities_b18,
+ &hf_ieee80211_tag_extended_capabilities_b19,
+ &hf_ieee80211_tag_extended_capabilities_b20,
+ &hf_ieee80211_tag_extended_capabilities_b21,
+ &hf_ieee80211_tag_extended_capabilities_b22,
+ &hf_ieee80211_tag_extended_capabilities_b23,
+ NULL
+ };
+ static const int *ieee80211_tag_extended_capabilities_byte4[] = {
+ &hf_ieee80211_tag_extended_capabilities_b24,
+ &hf_ieee80211_tag_extended_capabilities_b25,
+ &hf_ieee80211_tag_extended_capabilities_b26,
+ &hf_ieee80211_tag_extended_capabilities_b27,
+ &hf_ieee80211_tag_extended_capabilities_b28,
+ &hf_ieee80211_tag_extended_capabilities_b29,
+ &hf_ieee80211_tag_extended_capabilities_b30,
+ &hf_ieee80211_tag_extended_capabilities_b31,
+ NULL
+ };
+ static const int *ieee80211_tag_extended_capabilities_byte5[] = {
+ &hf_ieee80211_tag_extended_capabilities_b32,
+ &hf_ieee80211_tag_extended_capabilities_b33,
+ &hf_ieee80211_tag_extended_capabilities_b34,
+ &hf_ieee80211_tag_extended_capabilities_b35,
+ &hf_ieee80211_tag_extended_capabilities_b36,
+ &hf_ieee80211_tag_extended_capabilities_b37,
+ &hf_ieee80211_tag_extended_capabilities_b38,
+ &hf_ieee80211_tag_extended_capabilities_b39,
+ NULL
+ };
+ static const int *ieee80211_tag_extended_capabilities_byte6[] = {
+ &hf_ieee80211_tag_extended_capabilities_b40,
+ &hf_ieee80211_tag_extended_capabilities_serv_int_granularity,
+ &hf_ieee80211_tag_extended_capabilities_b44,
+ &hf_ieee80211_tag_extended_capabilities_b45,
+ &hf_ieee80211_tag_extended_capabilities_b46,
+ &hf_ieee80211_tag_extended_capabilities_b47,
+ NULL
+ };
+ static const int *ieee80211_tag_extended_capabilities_byte7[] = {
+ &hf_ieee80211_tag_extended_capabilities_b48,
+ &hf_ieee80211_tag_extended_capabilities_b49,
+ &hf_ieee80211_tag_extended_capabilities_b50,
+ &hf_ieee80211_tag_extended_capabilities_b51,
+ &hf_ieee80211_tag_extended_capabilities_b52,
+ &hf_ieee80211_tag_extended_capabilities_b53,
+ &hf_ieee80211_tag_extended_capabilities_b54,
+ &hf_ieee80211_tag_extended_capabilities_b55,
+ NULL
+ };
+
+ static const int *ieee80211_tag_extended_capabilities_byte8[] = {
+ &hf_ieee80211_tag_extended_capabilities_b56,
+ &hf_ieee80211_tag_extended_capabilities_b57,
+ &hf_ieee80211_tag_extended_capabilities_b58,
+ &hf_ieee80211_tag_extended_capabilities_b59,
+ &hf_ieee80211_tag_extended_capabilities_b60,
+ &hf_ieee80211_tag_extended_capabilities_b61,
+ &hf_ieee80211_tag_extended_capabilities_b62,
+ &hf_ieee80211_tag_extended_capabilities_b63,
+ NULL
+ };
+
+ static const int *ieee80211_tag_extended_capabilities_bytes89[] = {
+ &hf_ieee80211_tag_extended_capabilities_b56_2,
+ &hf_ieee80211_tag_extended_capabilities_b57_2,
+ &hf_ieee80211_tag_extended_capabilities_b58_2,
+ &hf_ieee80211_tag_extended_capabilities_b59_2,
+ &hf_ieee80211_tag_extended_capabilities_b60_2,
+ &hf_ieee80211_tag_extended_capabilities_b61_2,
+ &hf_ieee80211_tag_extended_capabilities_b62_2,
+ &hf_ieee80211_tag_extended_capabilities_max_num_msdus,
+ &hf_ieee80211_tag_extended_capabilities_b65_2,
+ &hf_ieee80211_tag_extended_capabilities_b66_2,
+ &hf_ieee80211_tag_extended_capabilities_b67_2,
+ &hf_ieee80211_tag_extended_capabilities_b68_2,
+ &hf_ieee80211_tag_extended_capabilities_b69_2,
+ &hf_ieee80211_tag_extended_capabilities_b70_2,
+ &hf_ieee80211_tag_extended_capabilities_b71_2,
+ 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);
+ return 1;
+ }
+ proto_item_append_text(field_data->item_tag, " (%u octet%s)", tag_len, plurality(tag_len, "", "s"));
+
+ /* Extended Capability octet 1 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap1, ieee80211_tag_extended_capabilities_byte1,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 1)");
+ offset += 1;
+
+ /* Extended Capability octet 2 */
+ if (offset >= tag_len) {
+ return offset;
+ }
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap2, ieee80211_tag_extended_capabilities_byte2,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 2)");
+ offset += 1;
+
+ /* Extended Capability octet 3 */
+ if (offset >= tag_len) {
+ return offset;
+ }
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap3, ieee80211_tag_extended_capabilities_byte3,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 3)");
+ offset += 1;
+
+ /* Extended Capability octet 4 */
+ if (offset >= tag_len) {
+ return offset;
+ }
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap4, ieee80211_tag_extended_capabilities_byte4,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 4)");
+ offset += 1;
+
+ /* Extended Capability octet 5 */
+ if (offset >= tag_len) {
+ return offset;
+ }
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap5, ieee80211_tag_extended_capabilities_byte5,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 5)");
+ offset += 1;
+
+ /* Extended Capability octet 6 */
+ if (offset >= tag_len) {
+ return offset;
+ }
+
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap6, ieee80211_tag_extended_capabilities_byte6,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 6)");
+ offset += 1;
+
+
+ /* Extended Capability octet 7 */
+ if (offset >= tag_len) {
+ return offset;
+ }
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap7, ieee80211_tag_extended_capabilities_byte7,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 7)");
+ offset += 1;
+
+ /* Extended Capability octet 8 & 9 since two bits cross the boundary */
+ if (offset >= tag_len) {
+ return offset;
+ }
+
+ /* If only the first of the two bytes is present, do the best we can */
+ if (offset == tag_len - 1) {
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
+ ett_tag_ex_cap8, ieee80211_tag_extended_capabilities_byte8,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 8)");
+ offset += 1;
+ } else { /* Both bytes are there */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities_2,
+ ett_tag_ex_cap89, ieee80211_tag_extended_capabilities_bytes89,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octets 8 & 9)");
+ 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
+dissect_vht_mcs_set(proto_tree *tree, tvbuff_t *tvb, int offset)
+{
+ proto_item *ti;
+ proto_tree *mcs_tree;
+ static const int *ieee80211_vht_mcsset_rx_max_mcs[] = {
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss,
+ &hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss,
+ NULL
+ };
+ static const int *ieee80211_vht_mcsset_tx_max_mcs[] = {
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss,
+ &hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss,
+ NULL
+ };
+
+ /* 8 byte Supported MCS set */
+ ti = proto_tree_add_item(tree, hf_ieee80211_vht_mcsset, tvb, offset, 8, ENC_NA);
+
+ mcs_tree = proto_item_add_subtree(ti, ett_vht_mcsset_tree);
+
+ /* B0 - B15 */
+ proto_tree_add_bitmask_with_flags(mcs_tree, tvb, offset, hf_ieee80211_vht_mcsset_rx_mcs_map,
+ ett_vht_rx_mcsbit_tree, ieee80211_vht_mcsset_rx_max_mcs,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ /* B16 - B28 13 bits*/
+ proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_rx_highest_long_gi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ /* B29 - B31 Max NSTS Total*/
+ proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_max_nsts_total, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ offset += 2;
+
+ /* B32 - B47 */
+ proto_tree_add_bitmask_with_flags(mcs_tree, tvb, offset, hf_ieee80211_vht_mcsset_tx_mcs_map,
+ ett_vht_tx_mcsbit_tree, ieee80211_vht_mcsset_tx_max_mcs,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ /* B48 - B60 13 bits */
+ proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_tx_highest_long_gi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ /* B61 */
+ proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_ext_nss_bw_cap, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ /* B62 - B63 2 reserved bits*/
+ proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ offset += 2;
+ return offset;
+}
+
+static int
+dissect_vht_capability_ie(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;
+ static const int *ieee80211_vht_caps[] = {
+ &hf_ieee80211_vht_max_mpdu_length,
+ &hf_ieee80211_vht_supported_chan_width_set,
+ &hf_ieee80211_vht_rx_ldpc,
+ &hf_ieee80211_vht_short_gi_for_80,
+ &hf_ieee80211_vht_short_gi_for_160,
+ &hf_ieee80211_vht_tx_stbc,
+ /* End of first byte */
+ &hf_ieee80211_vht_rx_stbc,
+ &hf_ieee80211_vht_su_beamformer_cap,
+ &hf_ieee80211_vht_su_beamformee_cap,
+ &hf_ieee80211_vht_beamformer_antennas,
+ /* End of second byte */
+ &hf_ieee80211_vht_sounding_dimensions,
+ &hf_ieee80211_vht_mu_beamformer_cap,
+ &hf_ieee80211_vht_mu_beamformee_cap,
+ &hf_ieee80211_vht_txop_ps,
+ &hf_ieee80211_vht_var_htc_field,
+ &hf_ieee80211_vht_max_ampdu,
+ &hf_ieee80211_vht_link_adaptation_cap,
+ &hf_ieee80211_vht_rx_pattern,
+ &hf_ieee80211_vht_tx_pattern,
+ &hf_ieee80211_vht_ext_nss_bw_support,
+ NULL
+ };
+
+ if (tag_len != 12) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "VHT Capabilities IE length %u wrong, must be = 12", tag_len);
+ return 1;
+ }
+
+ /* 4 byte VHT Capabilities Info*/
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_cap,
+ ett_vht_cap_tree, ieee80211_vht_caps,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 4;
+
+ /* 8 byte MCS set */
+ offset = dissect_vht_mcs_set(tree, tvb, offset);
+
+ return offset;
+}
+
+static int
+dissect_vht_operation_ie(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;
+ proto_item *op_item;
+ proto_tree *op_tree;
+ static const int *ieee80211_vht_op_max_basic_mcs[] = {
+ &hf_ieee80211_vht_op_max_basic_mcs_for_1_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_2_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_3_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_4_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_5_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_6_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_7_ss,
+ &hf_ieee80211_vht_op_max_basic_mcs_for_8_ss,
+ NULL
+ };
+
+ if (tag_len != 5) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "VHT Operation IE length %u wrong, must be = 5", tag_len);
+ return 1;
+ }
+
+ /* 3 byte VHT Operation Info*/
+ op_item = proto_tree_add_item(tree, hf_ieee80211_vht_op, tvb, offset, 3, ENC_NA);
+ op_tree = proto_item_add_subtree(op_item, ett_vht_op_tree);
+ proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_width, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_center0, tvb, offset+1, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_center1, tvb, offset+2, 1, ENC_LITTLE_ENDIAN);
+
+ offset += 3;
+ /* VHT Basic MCS Set */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_op_basic_mcs_map,
+ ett_vht_basic_mcsbit_tree, ieee80211_vht_op_max_basic_mcs,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ return offset;
+}
+
+static int
+dissect_vht_tx_pwr_envelope(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;
+ proto_item *tx_pwr_item, *ti;
+ proto_tree *tx_pwr_info_tree;
+ guint8 opt_ie_cnt=0;
+ guint8 i;
+
+ if (tag_len < 2 || tag_len > 5) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "VHT TX PWR Envelope IE length %u wrong, must be >= 2 and <= 5", tag_len);
+ return 1;
+ }
+
+ tx_pwr_item = proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_info, tvb, offset, 1, ENC_NA);
+ tx_pwr_info_tree = proto_item_add_subtree(tx_pwr_item, ett_vht_tpe_info_tree);
+
+ ti = proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_unit, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+
+ opt_ie_cnt = tvb_get_guint8(tvb, offset) & 0x07;
+
+ offset += 1;
+
+ /* Power Constraint info is mandatory only for 20MHz, others are optional*/
+ /* Power is expressed in terms of 0.5dBm from -64 to 63 and is encoded
+ * as 8-bit 2's compliment */
+ for (i = 0; i <= opt_ie_cnt; i++) {
+ switch(i) {
+ case 0:
+ proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_20, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ case 1:
+ proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_40, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ case 2:
+ proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_80, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ case 3:
+ proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_160, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ default:
+ expert_add_info(pinfo, ti, &ei_ieee80211_vht_tpe_pwr_info_count);
+ offset += 1;
+ break;
+ }
+ }
+
+ return offset;
+}
+
+static int
+dissect_mobility_domain(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;
+
+ if (field_data->sanity_check != NULL) {
+ field_data->sanity_check->association_has_mobility_domain_element = TRUE;
+ }
+
+ if (tag_len < 3) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "MDIE content length must be at least 3 bytes");
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_mdid,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_ft_capab,
+ tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds,
+ tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_ft_capab_resource_req,
+ tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_fast_bss_transition(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;
+ if (tag_len < 82) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "FTIE content length must be at least 82 bytes");
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_mic_control,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_element_count,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_mic,
+ tvb, offset, 16, ENC_NA);
+ offset += 16;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_anonce,
+ tvb, offset, 32, ENC_NA);
+ offset += 32;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_snonce,
+ tvb, offset, 32, ENC_NA);
+ offset += 32;
+
+ while (offset + 2 <= tag_len) {
+ guint8 id, len;
+ int s_end;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_id,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ id = tvb_get_guint8(tvb, offset);
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_len,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ len = tvb_get_guint8(tvb, offset);
+ offset += 1;
+
+ if (offset + len > tag_len) {
+ proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tvb, offset,
+ tag_len - offset, "Invalid FTIE subelement");
+ return offset;
+ }
+
+ s_end = offset + len;
+ switch (id) {
+ case 1:
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_r1kh_id,
+ tvb, offset, len, ENC_NA);
+ break;
+ case 2:
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key_info,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key_id,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if (offset > s_end)
+ break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key_length,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ if (offset > s_end)
+ break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_rsc,
+ tvb, offset, 8, ENC_NA);
+ offset += 8;
+ if (offset > s_end)
+ break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key,
+ tvb, offset, s_end - offset, ENC_NA);
+ break;
+ case 3:
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_r0kh_id,
+ tvb, offset, len, ENC_NA);
+ break;
+ case 4:
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_key_id,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if (offset > s_end)
+ break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_ipn,
+ tvb, offset, 6, ENC_NA);
+ offset += 6;
+ if (offset > s_end)
+ break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_key_length,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ if (offset > s_end)
break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_key,
+ tvb, offset, 24, ENC_NA);
+ break;
+ default:
+ proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_data,
+ tvb, offset, len, ENC_NA);
+ break;
+ }
+ offset = s_end;
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_mmie(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;
+
+ if (tag_len < 16) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "MMIE content length must be at least 16 bytes");
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_mmie_keyid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_mmie_ipn, tvb, offset + 2, 6,
+ ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_mmie_mic, tvb, offset + 8, 8,
+ ENC_NA);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_ssid_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
+ proto_tree *entry;
+ gboolean first = TRUE;
+
+ while (offset + 1 <= tag_len) {
+ guint8 len = tvb_get_guint8(tvb, offset + 1);
+ guint8 *str;
+
+ if (offset + 2 + len > tag_len)
+ break;
+
+ str = tvb_format_text(tvb, offset + 2, len);
+ proto_item_append_text(tree, "%c %s", (first ? ':' : ','), str);
+ first = FALSE;
+ entry = proto_tree_add_subtree_format(tree, tvb, offset, 2 + len, ett_ssid_list, NULL, "SSID: %s", str);
+ proto_tree_add_item(entry, hf_ieee80211_tag_number, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset++;
+ proto_tree_add_uint(entry, hf_ieee80211_tag_length, tvb, offset, 1, len);
+ offset++;
+ proto_tree_add_item(entry, hf_ieee80211_tag_ssid, tvb, offset, len,
+ ENC_ASCII|ENC_NA);
+ offset += len;
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_link_identifier(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;
+
+ if (tag_len < 18) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Link Identifier content length must be at least "
+ "18 bytes");
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_link_id_bssid, tvb,
+ offset, 6, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_link_id_init_sta, tvb,
+ offset + 6, 6, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_link_id_resp_sta, tvb,
+ offset + 12, 6, ENC_NA);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_wakeup_schedule(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;
+
+ if (tag_len < 18) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Wakeup Schedule content length must be at least "
+ "18 bytes");
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_offset, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_interval, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree,
+ hf_ieee80211_tag_wakeup_schedule_awake_window_slots, tvb,
+ offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_max_awake_dur,
+ tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_idle_count, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_channel_switch_timing(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;
+
+ if (tag_len < 4) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Channel Switch Timing content length must be at "
+ "least 4 bytes");
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_channel_switch_timing_switch_time,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree,
+ hf_ieee80211_tag_channel_switch_timing_switch_timeout,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_pti_control(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;
+
+ if (tag_len < 3) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "PTI Control content length must be at least 3 bytes");
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_pti_control_tid, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_pti_control_sequence_control, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_pu_buffer_status(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;
+ static const int *ieee80211_pu_buffer_status[] = {
+ &hf_ieee80211_tag_pu_buffer_status_ac_bk,
+ &hf_ieee80211_tag_pu_buffer_status_ac_be,
+ &hf_ieee80211_tag_pu_buffer_status_ac_vi,
+ &hf_ieee80211_tag_pu_buffer_status_ac_vo,
+ NULL
+ };
+
+ if (tag_len < 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "PU Buffer Status content length must be at least 1 byte");
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_pu_buffer_status, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_timeout_interval(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
+ proto_item *pi;
+
+ pi = proto_tree_add_item(tree, hf_ieee80211_tag_timeout_int_type, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ if (tag_len < 5) {
+ expert_add_info_format(pinfo, pi, &ei_ieee80211_tag_length,
+ "Timeout Interval content length must be at least "
+ "5 bytes");
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_timeout_int_value, tvb,
+ offset + 1, 4, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_ric_data(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;
+ proto_tree *sub_tree;
+ guint8 desc_cnt = 0;
+ guint32 next_ie;
+ int offset_r = 0;
+ const guint8 ids[] = { TAG_RIC_DESCRIPTOR };
+
+ if (tag_len != 4) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "RIC Data Length must be 4 bytes");
+ return 0;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_id, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ desc_cnt = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_desc_cnt, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_status_code, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /* Our Design is such that all the Resource request IE's part of the RIC
+ * must be in the sub tree of RIC for better readability
+ * Even omnipeek does the same way.
+ */
+ sub_tree = proto_item_add_subtree(tree, ett_tag_ric_data_desc_ie);
+
+ proto_item_append_text(field_data->item_tag, " :Resource Descriptor List");
+ if (desc_cnt == 0) {
+ proto_item_append_text(field_data->item_tag, " :0 (Weird?)");
+ }
+
+ while ( desc_cnt != 0 ) {
+
+ next_ie = tvb_get_guint8(tvb, offset);
+ proto_item_append_text(field_data->item_tag, " :(%d:%s)", desc_cnt, val_to_str_ext(next_ie, &tag_num_vals_ext, "Reserved (%d)"));
+ /* Recursive call to avoid duplication of code*/
+ offset_r = add_tagged_field(pinfo, sub_tree, tvb, offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
+ if (offset_r == 0 )/* should never happen, returns a min of 2*/
+ break;
+ /* This will ensure that the IE after RIC is processed
+ * only once. This gives us a good looking RIC IE :-)
+ */
+ tag_len += offset_r;
+ desc_cnt--;
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+/* Overlapping BSS Scan Parameters (74) */
+static int
+dissect_overlap_bss_scan_par(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ int offset = 0;
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int tag_len = tvb_reported_length(tvb);
+
+ if (tag_len != 14) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "OBSS Length must be 14 bytes");
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_spd, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_sad, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_cwtsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_sptpc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_satpc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_wctdf, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_obss_sat, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ return offset;
+}
+
+/* RIC Descriptor (75) */
+static int
+dissect_ric_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ int offset = 0;
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int tag_len = tvb_reported_length(tvb);
+ guint8 rsrc_type = 0;
+
+ if (tag_len < 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "RIC Data Length must be at least 1 byte");
+ return 1;
+ }
+
+ rsrc_type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_ric_desc_rsrc_type, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ if (rsrc_type == 1) {
+ /* Block ACK params
+ * 802.11-2012: 8.4.2.53 RIC Descriptor element
+ * Block Ack parameter set as defined in 8.4.1.14,
+ * Block Ack timeout value as defined in 8.4.1.15, and
+ * Block Ack starting sequence control as defined in 8.3.1.8
+ */
+ /* TODO: Still figuring out how to parse these ones,
+ * need a sample capture with at least HEX Dump
+ */
+ proto_item_append_text(field_data->item_tag, " : Block ACK Params");
+ proto_tree_add_item(tree, hf_ieee80211_tag_ric_desc_var_params, tvb,
+ offset, tag_len-1, ENC_NA);
+ offset += tag_len -1;
+ }else {
+ /* 0, 2-255 are reserved*/
+ proto_item_append_text(field_data->item_tag, " :Reserved (type != 1)");
+ }
+
+ return offset;
+}
+
+static int
+dissect_ext_bss_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ proto_tree_add_item(tree, hf_ieee80211_ext_bss_mu_mimo_capable_sta_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_ext_bss_ss_underutilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_20mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_40mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_80mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ return offset;
+}
+
+static int
+dissect_wide_bw_channel_switch(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+
+ proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_width, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_center_freq_segment0, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_center_freq_segment1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ return offset;
+}
+
+static int
+dissect_channel_switch_wrapper(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
+ int tmp_sublen;
+ const guint8 ids[] = { TAG_COUNTRY_INFO, TAG_WIDE_BW_CHANNEL_SWITCH,
+ TAG_VHT_TX_PWR_ENVELOPE };
+
+ /*
+ Decode three subelement in IE-196(Channel Switch Wrapper element):
+ (1) New Country subelement
+ (2) Wide Bandwidth Channel Switch subelement
+ (3) New VHT Transmit Power Envelope subelement
+ */
+ while (tag_len > 0){
+ tmp_sublen = tvb_get_guint8(tvb, offset + 1);
+ if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
+ break;
+ }
+ tag_len -= (tmp_sublen + 2);
+ offset += (tmp_sublen + 2);
+ }
+ return offset;
+}
+
+static int
+dissect_operating_mode_notification(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ static const int *ieee80211_operat_mode_field[] = {
+ &hf_ieee80211_operat_mode_field_channel_width,
+ &hf_ieee80211_operat_mode_field_reserved,
+ &hf_ieee80211_operat_mode_field_rxnss,
+ &hf_ieee80211_operat_mode_field_rxnsstype,
+ NULL
+ };
+
+ /* Operating Mode field */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_operat_notification_mode,
+ ett_mcsbit_tree, ieee80211_operat_mode_field,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
+ return offset;
+}
+
+static int
+dissect_mcs_set(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean basic, gboolean vendorspecific)
+{
+ proto_item *ti;
+ proto_tree *mcs_tree, *bit_tree;
+ guint8 rx_nss, tx_nss; /* 0-4 for HT and 0-8 for VHT*/
+ guint32 value_mcs_0_31, value_mcs_32_52, value_mcs_53_76;
+ guint16 tx_mcs_set;
+ rx_nss = tx_nss = 8;
+ /* 16 byte Supported MCS set */
+ if (vendorspecific)
+ {
+ ti = proto_tree_add_string(tree, hf_ieee80211_mcsset_vs, tvb, offset, 16,
+ basic ? "Basic MCS Set" : "MCS Set");
+ } else
+ {
+ ti = proto_tree_add_string(tree, hf_ieee80211_mcsset, tvb, offset, 16,
+ basic ? "Basic MCS Set" : "MCS Set");
+ }
+ mcs_tree = proto_item_add_subtree(ti, ett_mcsset_tree);
+
+ /* Rx MCS Bitmask */
+ ti = proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_rx_bitmask, tvb, offset, 10, ENC_NA);
+ bit_tree = proto_item_add_subtree(ti, ett_mcsbit_tree);
+
+ /* Bits 0 - 31 */
+ value_mcs_0_31 = tvb_get_letohl(tvb, offset);
+
+ /* Handle all zeroes/ff's case..*/
+ if (value_mcs_0_31 != 0x0)
+ {
+ if (!(value_mcs_0_31 & (0xffffff00))) {
+ /*
+ * At least one MCS from 0-7 is supported, but no MCS from 8-31 are
+ * supported, so only 1 spatial stream is supported.
+ */
+ rx_nss = 0;
+ } else if (!(value_mcs_0_31 & (0xffff0000))) {
+ /*
+ * At least one MCS from 8-15 is supported, but no MCS from 16-31 are
+ * supported, so only 2 spatial streams are supported.
+ */
+ rx_nss = 1;
+ } else if (!(value_mcs_0_31 & (0xff000000))) {
+ /*
+ * At least one MCS from 16-23 is supported, but no MCS from 24-31 are
+ * supported, so only 3 spatial streams are supported.
+ */
+ rx_nss = 2;
+ } else {
+ /*
+ * At least one MCS from 24-31 is supported, so 4 spatial streams
+ * are supported.
+ */
+ rx_nss = 3;
+ }
+ }
+
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_0to7, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_8to15, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_16to23, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_24to31, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ /* Should be we check UEQM Supported?*/
+ /* Bits 32 - 52 */
+ value_mcs_32_52 = tvb_get_letohl(tvb, offset);
+ if (!(value_mcs_32_52 & (0x1ffffe))) {
+ /*
+ * MCS 33-52 aren't supported, so the number of spatial streams we get
+ * from whichever MCSes from 0-31 that we support is the total number
+ * of spatial streams we support.
+ */
+ ;
+ } else if (!(value_mcs_32_52 & (0x1fff80))) {
+ /*
+ * At least one MCS from 33-38 is supported, but no MCS from 39-52 is
+ * supported, so we have at least 2 spatial streams, but none of the
+ * MCSs in that range give us any more.
+ */
+ rx_nss = MAX(1, rx_nss);
+ } else {
+ /*
+ * At least one MCS from 39-52 is supported, so we have at least 3
+ * spatial streams.
+ */
+ rx_nss = MAX(2, rx_nss);
+ }
+
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_32, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_33to38, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_39to52, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /* Bits 53 - 76 */
+ value_mcs_53_76 = tvb_get_letohl(tvb, offset);
+ if ((value_mcs_53_76 & (0x1fffffe0))) {
+ /*
+ * At least one MCS from 53-76 is supported, so we have at least 4
+ * spatial streams.
+ */
+ rx_nss = MAX(3, rx_nss);
+ }
+
+ proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_53to76, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_highest_data_rate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /* Follow table 8-126 from 802.11-2012 */
+ tx_mcs_set = tvb_get_letohs(tvb, offset);
+
+ if (!(tx_mcs_set & 0x0001) && !(tx_mcs_set & 0x0002))
+ {
+ /* TX MCS Set is not defined
+ * so there is no interpretation for Max Tx Spatial Streams
+ */
+ tx_nss = 4; /* Not Defined*/
+ }
+
+ if ((tx_mcs_set & 0x0001) && !(tx_mcs_set & 0x0002))
+ {
+ /* TX MCS Set is defined to be equal to Rx MCS Set
+ * So, get the Max Spatial Streams from Rx
+ * MCS set
+ */
+ tx_nss = rx_nss;
+ }
+ proto_item_append_text(ti, ": %s", val_to_str(rx_nss, mcsset_tx_max_spatial_streams_flags, "Reserved:%d" ) );
+
+ proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_mcs_set_defined, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_max_spatial_streams, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, ", %s", val_to_str(tx_nss, mcsset_tx_max_spatial_streams_flags, "Reserved:%d" ) );
+ proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_unequal_modulation, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ offset += 3;
+ return offset;
+}
+
+/* 802.11n D1.10 - HT Information IE */
+static int
+dissect_ht_info_ie_1_1(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;
+ static const int *ieee80211_ht_info1_field[] = {
+ &hf_ieee80211_ht_info_secondary_channel_offset,
+ &hf_ieee80211_ht_info_sta_channel_width,
+ &hf_ieee80211_ht_info_rifs_mode,
+ &hf_ieee80211_ht_info_reserved_b4_b7,
+ NULL
+ };
+
+ static const int *ieee80211_ht_info2_field[] = {
+ &hf_ieee80211_ht_info_protection,
+ &hf_ieee80211_ht_info_non_greenfield_sta_present,
+ &hf_ieee80211_ht_info_reserved_b11,
+ &hf_ieee80211_ht_info_obss_non_ht_stas_present,
+ &hf_ieee80211_ht_info_channel_center_freq_seg_2,
+ &hf_ieee80211_ht_info_reserved_b21_b23,
+ NULL
+ };
+
+ static const int *ieee80211_ht_info3_field[] = {
+ &hf_ieee80211_ht_info_reserved_b24_b29,
+ &hf_ieee80211_ht_info_dual_beacon,
+ &hf_ieee80211_ht_info_dual_cts_protection,
+ &hf_ieee80211_ht_info_secondary_beacon,
+ &hf_ieee80211_ht_info_lsig_txop_protection_full_support,
+ &hf_ieee80211_ht_info_pco_active,
+ &hf_ieee80211_ht_info_pco_phase,
+ &hf_ieee80211_ht_info_reserved_b36_b39,
+ NULL
+ };
+
+ if (tag_len < 22) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "HT Information IE content length %u wrong, must be at least 22 bytes", tag_len);
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_ht_info_primary_channel, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_info_delimiter1,
+ ett_ht_info_delimiter1_tree, ieee80211_ht_info1_field,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
+
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_info_delimiter2,
+ ett_ht_info_delimiter2_tree, ieee80211_ht_info2_field,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_info_delimiter3,
+ ett_ht_info_delimiter3_tree, ieee80211_ht_info3_field,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ offset = dissect_mcs_set(tree, tvb, offset, TRUE, FALSE);
+
+ return offset;
+}
+
+
+static int
+dissect_wapi_param_set(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, int offset, guint32 tag_len, proto_item *ti_len,
+ proto_item *ti, int ftype)
+{
+ /* Parse the WAPI Parameter Set IE Here*/
+ proto_item *item;
+ proto_tree *subtree;
+ guint16 loop_cnt, version, akm_cnt = 1, ucast_cnt = 1, bkid_cnt = 1;
+ guint8 akm_suite_type = 0, ucast_cipher_type = 0, mcast_cipher_type = 0;
+ static const int *ieee80211_tag_wapi_param_set[] = {
+ &hf_ieee80211_tag_wapi_param_set_capab_preauth,
+ &hf_ieee80211_tag_wapi_param_set_capab_rsvd,
+ NULL
+ };
+
+ version = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /*MIN: 2 + (2+4)+ (2+4) + 4 + 2 + 0 (BKID CNT and LIST) =20*/
+ if (tag_len < 20) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
+ "tag_len is %d, it's neither WAPI not BSS-AC-Access-Delay", tag_len);
+ return offset;
+ }
+
+ if (version != 1) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
+ "Version of WAPI protocol is %d, must be = 1", version);
+ return offset;
+ }
+
+ /* AKM Suites: list can't be 0*/
+ akm_cnt = tvb_get_letohs(tvb, offset);
+ item = proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_akm_suite_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if (akm_cnt != 0) {
+ proto_item_append_text(ti, " : AKM Suite List:");
+ for (loop_cnt = 0; loop_cnt < akm_cnt; loop_cnt++) {
+ subtree = proto_item_add_subtree(item, ett_tag_wapi_param_set_akm_tree);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_akm_suite_oui, tvb, offset, 3, ENC_NA);
+ offset += 3;
+ akm_suite_type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_akm_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_item_append_text(ti, " (%d,%s)", loop_cnt+1, val_to_str(akm_suite_type,
+ ieee80211_wapi_suite_type_short, "Reserved: %d"));
+ }
+ proto_item_append_text(ti, " /");
+ } else {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Number of AKM suites is 0, must be min 1");
+ return offset;
+
+ }
+ /* Unicast Cipher Suites: list can't be 0*/
+ ucast_cnt = tvb_get_letohs(tvb, offset);
+ item = proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if (ucast_cnt != 0) {
+ proto_item_append_text(ti, " Unicast Cipher List:");
+ for (loop_cnt = 0; loop_cnt < ucast_cnt; loop_cnt++) {
+ subtree = proto_item_add_subtree(item, ett_tag_wapi_param_set_ucast_tree);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ offset += 3;
+ ucast_cipher_type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_item_append_text(ti, " (%d,%s)", loop_cnt+1, val_to_str(ucast_cipher_type, ieee80211_wapi_cipher_type, "Reserved: %d"));
+ }
+ proto_item_append_text(ti, " /");
+ } else {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Number of Unicast Cipher suites is 0, must be min 1");
+ return offset;
+
+ }
+
+ /* Multicast Cipher Suites*/
+ proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui, tvb, offset, 3, ENC_NA);
+ offset += 3;
+ mcast_cipher_type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_item_append_text(ti, " Multicast Cipher: %s", val_to_str(mcast_cipher_type, ieee80211_wapi_cipher_type, "Reserved: %d"));
+
+ /* WAPI capability */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_wapi_param_set_capab,
+ ett_tag_wapi_param_set_preauth_tree, ieee80211_tag_wapi_param_set,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ /* BKID List: The list can be 0
+ * Applicable only for assoc/re-assoc
+ */
+ if (ftype == MGT_ASSOC_REQ || ftype == MGT_REASSOC_REQ ) {
+ bkid_cnt = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_bkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if (bkid_cnt != 0) {
+ for (loop_cnt = 0; loop_cnt < bkid_cnt; loop_cnt++) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_bkid_list, tvb, offset, 16, ENC_NA);
+ offset += 16;
+ }
+ }
+ }
+ return offset;
+}
+
+static int
+dissect_bss_max_idle_period(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_max_idle_period,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_max_idle_options_protected,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ return offset;
+}
+
+enum tfs_request_subelem_id {
+ TFS_REQ_SUBELEM_TFS = 1,
+ TFS_REQ_SUBELEM_VENDOR_SPECIFIC = 221
+};
+
+static const value_string tfs_request_subelem_ids[] = {
+ { TFS_REQ_SUBELEM_TFS, "TFS subelement" },
+ { TFS_REQ_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific subelement" },
+ { 0, NULL }
+};
+
+static int
+dissect_tfs_request(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;
+ const guint8 ids[] = {
+ 1, /* TFS Subelement */
+ TAG_VENDOR_SPECIFIC_IE
+ };
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_id,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_ac_delete_after_match,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_ac_notify,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ if (offset + 1 >= tag_len) {
+ expert_add_info_format(pinfo, tree, &ei_ieee80211_missing_data,
+ "No TFS Request subelements in TFS Request");
+ return tvb_captured_length(tvb);
+ }
+
+ while (offset + 1 < tag_len) {
+ guint8 id, len;
+ int s_offset, s_end;
+
+ id = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem_id,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem_len,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ if (offset + len > tag_len) {
+ expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
+ "Not enough data for TFS Request subelement");
+ return tvb_captured_length(tvb);
+ }
+ switch (id) {
+ case TFS_REQ_SUBELEM_TFS:
+ s_offset = offset;
+ s_end = offset + len;
+ while (s_offset < s_end) {
+ /* TODO 1 is interpreted as TAG_SUPP_RATES, fix this! */
+ int tlen = add_tagged_field(pinfo, tree, tvb, s_offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
+ if (tlen==0)
+ break;
+ s_offset += tlen;
+ }
+ break;
+ default:
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem,
+ tvb, offset, len, ENC_NA);
+ break;
+ }
+ offset += len;
+ }
+
+ if (offset < tag_len) {
+ proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
+ tvb, offset, tag_len - offset, "Extra data after TFS Subelements");
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+enum tfs_response_subelem_id {
+ TFS_RESP_SUBELEM_TFS_STATUS = 1,
+ TFS_RESP_SUBELEM_TFS = 2,
+ TFS_RESP_SUBELEM_VENDOR_SPECIFIC = 221
+};
+
+static const value_string tfs_response_subelem_ids[] = {
+ { TFS_RESP_SUBELEM_TFS_STATUS, "TFS Status subelement" },
+ { TFS_RESP_SUBELEM_TFS, "TFS subelement" },
+ { TFS_RESP_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific subelement" },
+ { 0, NULL }
+};
+
+static int
+dissect_tfs_response(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;
+ const guint8 ids[] = {
+ 1, /* TFS Status subelement*/
+ 2, /* TFS subelement */
+ TAG_VENDOR_SPECIFIC_IE
+ };
+
+ while (offset + 3 <= tag_len) {
+ guint8 id, len;
+ int s_offset, s_end;
+
+ id = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem_id,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem_len,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ if (offset + len > tag_len) {
+ expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
+ "Not enough data for TFS Request subelement");
+ return tvb_captured_length(tvb);
+ }
+ switch (id) {
+ case TFS_RESP_SUBELEM_TFS_STATUS:
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_status,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_id,
+ tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
+ break;
+ case TFS_RESP_SUBELEM_TFS:
+ s_offset = offset;
+ s_end = offset + len;
+ while (s_offset < s_end) {
+ /* TODO Element IDs 1 and 2 are misinterpreted! */
+ int tlen = add_tagged_field(pinfo, tree, tvb, s_offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
+ if (tlen==0)
+ break;
+ s_offset += tlen;
}
break;
default:
+ proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem,
+ tvb, offset, len, ENC_NA);
break;
+ }
+
+ offset += len;
+ }
+
+ if (offset < tag_len) {
+ proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
+ tvb, offset, tag_len - offset, "Extra data after TFS Subelements");
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+static const value_string wnm_sleep_mode_action_types[] = {
+ { 0, "Enter WNM-Sleep Mode" },
+ { 1, "Exit WNM-Sleep Mode" },
+ { 0, NULL }
+};
+
+static const value_string wnm_sleep_mode_response_status_vals[] = {
+ { 0, "Enter/Exit WNM-Sleep Mode Accept" },
+ { 1, "Exit WNM-Sleep Mode Accept, GTK/IGTK update required" },
+ { 2, "Denied. The AP is unable to perform the requested action." },
+ { 3, "Denied temporarily. The AP is unable to perform the requested action "
+ "at the current time. The request can be submitted again at a later time."
+ },
+ { 4, "Denied. Due to the pending key expiration." },
+ { 5, "Denied. The requested action was not granted due to other WNM services "
+ "in use by the requesting STA." },
+ { 0, NULL }
+};
+
+static int
+dissect_wnm_sleep_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_action_type,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_response_status,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_interval,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ return offset;
+}
+
+static const value_string time_adv_timing_capab_vals[] = {
+ { 0, "No standardized external time source" },
+ { 1, "Timestamp offset based on UTC" },
+ { 2, "UTC time at which the TSF timer is 0" },
+ { 0, NULL }
+};
+
+static int
+dissect_time_adv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ guint8 capab;
+ proto_item *item;
+ proto_tree *subtree;
+ struct tm tm, *now;
+ time_t t;
+
+ capab = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_timing_capab,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ switch (capab) {
+ case 1:
+ proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_value,
+ tvb, offset, 10, ENC_NA);
+ offset += 10;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_error,
+ tvb, offset, 5, ENC_NA);
+ offset += 5;
+ break;
+ case 2:
+ item = proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_value,
+ tvb, offset, 10, ENC_NA);
+ subtree = proto_item_add_subtree(item, ett_tag_time_adv_tree);
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_year = tvb_get_letohs(tvb, offset) - 1900;
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_year,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ tm.tm_mon = tvb_get_guint8(tvb, offset) - 1;
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_month,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ tm.tm_mday = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_day,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ tm.tm_hour = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_hours,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ tm.tm_min = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_minutes,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ tm.tm_sec = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_seconds,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(subtree,
+ hf_ieee80211_tag_time_adv_time_value_milliseconds,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_reserved,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ tm.tm_isdst = -1;
+ t = mktime(&tm);
+ if (t != -1) {
+ t += (time_t)(last_timestamp / 1000000);
+ now = localtime(&t);
+ if (now)
+ proto_item_append_text(item,
+ ": current time=%u-%02u-%02u %02u:%02u:%02u",
+ now->tm_year + 1900, now->tm_mon + 1,
+ now->tm_mday, now->tm_hour, now->tm_min,
+ now->tm_sec);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_error,
+ tvb, offset, 5, ENC_NA);
+ offset += 5;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_update_counter,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ break;
+ }
+
+ return offset;
+}
+
+static int
+dissect_time_zone(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_time_zone, tvb, offset, tag_len,
+ ENC_ASCII|ENC_NA);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_ap_channel_report(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;
+
+ if (tag_len < 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "AP Channel Report length %u wrong, must be > 1", tag_len);
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_ap_channel_report_operating_class, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": Operating Class %u, Channel List :", tvb_get_guint8(tvb, offset));
+ offset += 1;
+
+ while (offset < tag_len)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_ap_channel_report_channel_list, tvb, offset, 1, ENC_NA);
+ proto_item_append_text(field_data->item_tag, " %u,", tvb_get_guint8(tvb, offset));
+ offset += 1;
+ }
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_secondary_channel_offset_ie(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;
+ if (tag_len != 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Secondary Channel Offset length %u wrong, must be = 1", tag_len);
+ return 1;
}
- return scidx;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_secondary_channel_offset, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
}
-static guint
-add_ff_vht_compressed_beamforming_report(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, int offset)
+/* BSS Average Access Delay element (63) */
+static int
+dissect_bss_avg_access_delay_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint32 vht_mimo;
- guint8 nc;
- guint8 nr;
- guint8 chan_width;
- guint8 grouping;
- gboolean codebook_info;
- gboolean feedback_type;
- proto_item *vht_beam_item, *vht_excl_beam_item, *phi_angle, *psi_angle;
- proto_tree *vht_beam_tree, *subtree, *vht_excl_beam_tree, *angletree;
- int i, matrix_size, len, pos, ns, scidx = 0, matrix_len;
- guint8 phi, psi, carry;
- int j, ic, off_len = 0, sscidx = 0, xnsc;
- int ir, off_pos, angle_val;
- /* Table 8-53d Order of angles in the Compressed Beamforming Feedback
- * Matrix subfield, IEEE Std 802.11ac-2013 amendment */
- static const guint8 na_arr[8][8] = { { 0, 0, 0, 0, 0, 0, 0, 0 },
- { 2, 2, 0, 0, 0, 0, 0, 0 },
- { 4, 6, 6, 0, 0, 0, 0, 0 },
- { 6, 10, 12, 12, 0, 0, 0, 0 },
- { 8, 14, 18, 20, 20, 0, 0, 0 },
- { 10, 18, 24, 28, 30, 30, 0, 0 },
- { 12, 22, 30, 36, 40, 42, 42, 0 },
- { 14, 26, 36, 44, 50, 54, 56, 56 }
- };
- /* Table 8-53g Subcarriers for which a Compressed Beamforming Feedback Matrix
- * subfield is sent back. IEEE Std 802.11ac-2013 amendment */
- static const int ns_arr[4][3] = { { 52, 30, 16 },
- { 108, 58, 30 },
- { 234, 122, 62 },
- { 468, 244, 124 }
- };
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ if (tag_len != 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "BSS Average Access Delay length %u wrong, must be = 1", tag_len);
+ return 1;
+ }
- /* Table 8-53j, no of Subcarriers for which the Delta SNR subfield is sent back to the beamformer.
- * IEEE Std 802.11ac-2013 amendment */
- static const int delta_ns_arr[4][3] = { { 30, 16, 10 },
- { 58, 30, 16 },
- { 122, 62, 32 },
- { 244, 124, 64 }
- };
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_ap_avg_access_delay, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- vht_mimo = tvb_get_letoh24(tvb, offset);
- proto_tree_add_bitmask(tree, tvb, offset, hf_ieee80211_ff_vht_mimo_cntrl,
- ett_ff_vhtmimo_cntrl, hf_ieee80211_ff_vht_mimo_cntrl_fields, ENC_LITTLE_ENDIAN);
- offset += 3;
+static int
+dissect_antenna_ie(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;
- /* Extract values for beamforming use */
- nc = (vht_mimo & 0x7) + 1;
- nr = ((vht_mimo & 0x38) >> 3) + 1;
- chan_width = (vht_mimo & 0xC0) >> 6;
- grouping = ((vht_mimo & 0x300) >> 8);
- codebook_info = (vht_mimo & 0x400) >> 10;
- feedback_type = (vht_mimo & 0x800) >> 11;
+ if (tag_len != 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Antenna length %u wrong, must be = 1", tag_len);
+ return 1;
+ }
- if (feedback_type) {
- if (codebook_info) {
- psi = 7; phi = 9;
- } else {
- psi = 5; phi = 7;
- }
- } else {
- if (codebook_info) {
- psi = 4; phi = 6;
- } else {
- psi = 2; phi = 4;
+ proto_tree_add_item(tree, hf_ieee80211_tag_antenna_id, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_rsni_ie(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;
+
+ if (tag_len != 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "RSNI length %u wrong, must be = 1", tag_len);
+ return 1;
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_rsni, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_measurement_pilot_trans_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
+ const guint8 ids[] = { TAG_VENDOR_SPECIFIC_IE };
+
+ /* The tag len can be 1 or more if there are sub-elements */
+
+ proto_tree_add_item(tree, hf_ieee80211_ff_measurement_pilot_int, tvb, offset,
+ 1, ENC_NA);
+
+ tag_len--;
+ offset++;
+
+ /* Also handle the optional sub-elements */
+
+ if (tag_len > 0) {
+ while (tag_len > 0) {
+ guint8 elt_len;
+
+ elt_len = tvb_get_guint8(tvb, offset + 1);
+
+ if(add_tagged_field(pinfo, tree, tvb, offset + 2, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
+ /* TODO: Add an expert info here and skip the field. */
+ break;
+ }
+
+ tag_len -= elt_len + 2;
+ offset += elt_len + 2;
}
}
- vht_beam_item = proto_tree_add_item(tree, hf_ieee80211_vht_compressed_beamforming_report, tvb,
- offset, -1, ENC_NA);
- vht_beam_tree = proto_item_add_subtree(vht_beam_item, ett_ff_vhtmimo_beamforming_report);
+ return tvb_captured_length(tvb);
+}
+
+static int
+dissect_bss_available_admission_capacity_ie(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;
+ guint16 bitmask;
+ static const int *ieee80211_tag_bss_avb_adm_cap_bitmask[] = {
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3,
+ &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv,
+ NULL
+ };
+
+ if (tag_len < 2) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "BSS Available Admission Capacity length %u wrong, must > = 2", tag_len);
+ return offset;
+ }
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_bss_avb_adm_cap_bitmask,
+ ett_tag_bss_bitmask_tree, ieee80211_tag_bss_avb_adm_cap_bitmask,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ bitmask = tvb_get_letohs(tvb, offset);
+ offset += 2;
+
+ if(bitmask & BSS_BITMASK_UP0)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up0, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP1)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP2)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up2, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP3)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up3, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP4)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up4, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP5)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up5, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP6)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up6, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_UP7)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up7, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_AC0)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac0, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_AC1)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_AC2)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac2, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if(bitmask & BSS_BITMASK_AC3)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac3, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ return offset;
+}
+
+static int
+dissect_bss_ac_access_delay_ie(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, int offset, guint32 tag_len, proto_item *ti_len)
+{
- subtree = proto_tree_add_subtree(vht_beam_tree, tvb, offset, nc,
- ett_ff_vhtmimo_beamforming_report_snr, NULL, "Average Signal to Noise Ratio");
+ if (tag_len != 4) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
+ "BSS AC Access Delay length %u wrong, must = 4", tag_len);
+ return offset;
+ }
- for (i = 1; i <= nc; i++)
- {
- gint8 snr;
- char edge_sign;
+ /* TODO: Display the scaled representation of the average
+ medium access delay (a big (precalculed) value_string ?)
+ See 8.4.2.46 BSS AC Access Delay element ... */
- snr = (gint8) tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_be, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_bk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_vi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_vo, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- switch(snr) {
- case -128:
- edge_sign = '<';
- break;
- case 127:
- edge_sign = '>';
- break;
- default:
- edge_sign = ' ';
- break;
- }
+ return offset;
+}
- proto_tree_add_int_format(subtree, hf_ieee80211_vht_compressed_beamforming_report_snr, tvb, offset, 1,
- snr, "Stream %d - Signal to Noise Ratio: %c%3.2fdB", i, edge_sign,snr/4.0+22.0);
+/* RM Enabled Capabilities (70) */
+static int
+dissect_rm_enabled_capabilities_ie(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;
+ proto_item *ti_ex_cap;
+ static const int *ieee80211_tag_rm_enabled_capabilities_octet1[] = {
+ &hf_ieee80211_tag_rm_enabled_capabilities_b0,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b1,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b2,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b3,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b4,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b5,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b6,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b7,
+ NULL
+ };
- offset += 1;
- }
+ static const int *ieee80211_tag_rm_enabled_capabilities_octet2[] = {
+ &hf_ieee80211_tag_rm_enabled_capabilities_b8,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b9,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b10,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b11,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b12,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b13,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b14,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b15,
+ NULL
+ };
- matrix_size = na_arr[nr - 1][nc -1] * (psi + phi)/2;
- if (matrix_size % 8) {
- carry = 1;
- } else {
- carry = 0;
- }
- off_len = (matrix_size/8) + carry;
- angletree = proto_tree_add_subtree_format(vht_beam_tree, tvb, offset, off_len,
- ett_ff_vhtmimo_beamforming_angle, NULL,"PHI and PSI Angle Decode");
+ static const int *ieee80211_tag_rm_enabled_capabilities_octet3[] = {
+ &hf_ieee80211_tag_rm_enabled_capabilities_b16,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b17,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b18to20,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b21to23,
+ NULL
+ };
- off_pos = offset*8;
- phi_angle = proto_tree_add_none_format(angletree, hf_ieee80211_vht_compressed_beamforming_phi_angle, tvb, offset, 0, "PHI(%u bits): ", phi);
- for (ic = 1; ic <= nc; ic++) {
- for (ir = 1; ir < nr; ir++) {
- if (ir >= ic) {
- angle_val = (int) tvb_get_bits16(tvb, off_pos, phi, ENC_BIG_ENDIAN);
- if ((ir+1 < nr) || (ic+1 <= nc))
- proto_item_append_text(phi_angle, "PHI%d%d: %d, ", ir, ic, angle_val);
- else
- proto_item_append_text(phi_angle, "PHI%d%d: %d", ir, ic, angle_val);
- off_pos = off_pos + phi;
- }
- }
- }
+ static const int *ieee80211_tag_rm_enabled_capabilities_octet4[] = {
+ &hf_ieee80211_tag_rm_enabled_capabilities_b24to26,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b27,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b28,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b29,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b30,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b31,
+ NULL
+ };
- psi_angle = proto_tree_add_none_format(angletree, hf_ieee80211_vht_compressed_beamforming_psi_angle, tvb, offset, 0, "PSI(%u bits): ", psi);
- for (ic = 1; ic <= nc; ic++)
- for (ir = 2; ir <= nr; ir++)
- if (ir > ic) {
- angle_val = (int) tvb_get_bits8(tvb, off_pos, psi);
- if ((ir+1 <= nr) || (ic+1 <= nc))
- proto_item_append_text(psi_angle, "PSI%d%d: %d, ", ir, ic, angle_val);
- else
- proto_item_append_text(psi_angle, "PSI%d%d: %d", ir, ic, angle_val);
- off_pos = off_pos + psi;
- }
+ static const int *ieee80211_tag_rm_enabled_capabilities_octet5[] = {
+ &hf_ieee80211_tag_rm_enabled_capabilities_b32,
+ &hf_ieee80211_tag_rm_enabled_capabilities_b33,
+ &hf_ieee80211_tag_rm_enabled_capabilities_o5,
+ NULL
+ };
- /* Table 8-53c Subfields of the VHT MIMO Control field (802.11ac-2013)
- * reserves value 3 of the Grouping subfield. */
- if (grouping == 3) {
- expert_add_info_format(pinfo, vht_beam_item, &ei_ieee80211_inv_val,
- "Grouping subfield value 3 is reserved");
- return offset;
+ if (tag_len != 5)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "RM Enabled Capabilities length %u wrong, must = 5", tag_len);
+ return 1;
}
+ proto_item_append_text(field_data->item_tag, " (%d octets)", tag_len);
- ns = ns_arr[chan_width][grouping];
- if (((matrix_size)*(ns)) % 8)
- matrix_len = (((matrix_size) * (ns)) / (8)) + 1;
- else
- matrix_len = (((matrix_size) * (ns)) / (8));
- subtree = proto_tree_add_subtree(vht_beam_tree, tvb, offset, matrix_len,
- ett_ff_vhtmimo_beamforming_report_feedback_matrices, NULL, "Beamforming Feedback Matrix");
+ /* RM Enabled Capability octet 1 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
+ ett_tag_rm_cap1, ieee80211_tag_rm_enabled_capabilities_octet1,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 1)");
+ offset += 1;
+ /* RM Enabled Capability octet 2 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
+ ett_tag_rm_cap2, ieee80211_tag_rm_enabled_capabilities_octet2,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 2)");
+ offset += 1;
- switch(chan_width) {
- case 0:
- scidx = -28;
- break;
- case 1:
- scidx = -58;
- break;
- case 2:
- scidx = -122;
- break;
- case 3:
- /* This is -122 for 80+80MHz Channel Width but vht_mimo_control does not allow us
- * to differentiate between 160MHz and 80+80Mhz */
- scidx = -250;
- break;
- }
+ /* RM Enabled Capability octet 3 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
+ ett_tag_rm_cap3, ieee80211_tag_rm_enabled_capabilities_octet3,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 3)");
+ offset += 1;
- pos = 0;
- for (i = 0; i < ns; i++) {
- if (pos % 8)
- carry = 1;
- else
- carry = 0;
- len = roundup2((pos + matrix_size), 8)/8 - roundup2(pos, 8)/8;
- scidx = vht_compressed_skip_scidx(chan_width, grouping, scidx);
+ /* RM Enabled Capability octet 4 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
+ ett_tag_rm_cap4, ieee80211_tag_rm_enabled_capabilities_octet4,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 4)");
+ offset += 1;
- /* TODO : For certain values from na_arr, there is always going be a carry over or overflow from the previous or
- into the next octet. The largest of possible unaligned values can be 41 bytes long, and masking and shifting
- whole buffers to show correct values with padding and overflow bits is hence skipped, we only mark the bytes
- of interest instead */
- proto_tree_add_none_format(subtree, hf_ieee80211_vht_compressed_beamforming_feedback_matrix, tvb,
- offset - carry, len + carry, "Compressed Beamforming Feedback Matrix for subcarrier %d", scidx++);
- offset += len;
- pos += matrix_size;
- }
+ /* RM Enabled Capability octet 5 */
+ ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
+ ett_tag_rm_cap5, ieee80211_tag_rm_enabled_capabilities_octet5,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_item_append_text(ti_ex_cap, " (octet 5)");
+ offset += 1;
- if (feedback_type) {
- xnsc = delta_ns_arr[chan_width][grouping];
- if ((nc * xnsc *4) % 8)
- off_len = (nc * xnsc *4) / 8 + 1;
- else
- off_len = (nc * xnsc *4) / 8;
- switch(chan_width) {
- case 0:
- sscidx = -28;
- break;
- case 1:
- sscidx = -58;
- break;
- case 2:
- sscidx = -122;
- break;
- case 3:
- sscidx = -250;
- break;
- }
- vht_excl_beam_item = proto_tree_add_item(tree, hf_ieee80211_vht_mu_exclusive_beamforming_report, tvb, offset, off_len, ENC_NA);
- vht_excl_beam_tree = proto_item_add_subtree(vht_excl_beam_item, ett_ff_vhtmu_exclusive_beamforming_report_matrices);
+ return offset;
+}
- carry = 1;
- for (j = 1; j <= xnsc; j++) {
- for (ic = 1; ic <= nc; ic++) {
- if (carry % 2){
- pos = 0;
- len = 1;
- }
- else
- {
- pos = 1;
- len = 0;
- }
- proto_tree_add_none_format(vht_excl_beam_tree, hf_ieee80211_vht_mu_Exclusive_beamforming_delta_snr, tvb,
- offset - pos, 1, "Delta SNR for space-time stream %d for subcarrier %d", ic, sscidx);
- offset += len;
- carry ++;
- }
- sscidx = vht_exclusive_skip_scidx(chan_width, grouping, sscidx);
- }
+/* 20/40 BSS Coexistence (72) */
+static int
+dissect_20_40_bss_coexistence(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;
+ static const int *ieee80211_20_40_bss_coexistence_fields[] = {
+ &hf_ieee80211_tag_20_40_bc_information_request,
+ &hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant,
+ &hf_ieee80211_tag_20_40_bc_20_mhz_bss_witdh_request,
+ &hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request,
+ &hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant,
+ &hf_ieee80211_tag_20_40_bc_reserved,
+ NULL
+ };
+
+ if (tag_len != 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "20/40 BSS Coexistence length %u wrong, must = 1", tag_len);
+ return 1;
}
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_20_40_bc,
+ ett_tag_20_40_bc, ieee80211_20_40_bss_coexistence_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+
+ offset += 1;
+
return offset;
}
-static guint
-add_ff_action_vht(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+static int
+dissect_ht_capability_ie_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
+ guint32 tag_len, proto_item *ti_len, gboolean vendorspecific)
{
- guint start = offset;
- guint8 vht_action, field_val;
- guint64 msa_value;
- guint64 upa_value, temp_val;
- int m;
- proto_item *ti;
- proto_tree *ti_tree;
- proto_item *msa, *upa;
- proto_tree *msa_tree, *upa_tree;
+ proto_item *cap_item, *ti;
+ proto_tree *cap_tree;
+ static const int *ieee80211_ht[] = {
+ &hf_ieee80211_ht_ldpc_coding,
+ &hf_ieee80211_ht_chan_width,
+ &hf_ieee80211_ht_sm_pwsave,
+ &hf_ieee80211_ht_green,
+ &hf_ieee80211_ht_short20,
+ &hf_ieee80211_ht_short40,
+ &hf_ieee80211_ht_tx_stbc,
+ &hf_ieee80211_ht_rx_stbc,
+ &hf_ieee80211_ht_delayed_block_ack,
+ &hf_ieee80211_ht_max_amsdu,
+ &hf_ieee80211_ht_dss_cck_40,
+ &hf_ieee80211_ht_psmp,
+ &hf_ieee80211_ht_40_mhz_intolerant,
+ &hf_ieee80211_ht_l_sig,
+ NULL
+ };
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
+ static const int *ieee80211_htex[] = {
+ &hf_ieee80211_htex_pco,
+ &hf_ieee80211_htex_transtime,
+ &hf_ieee80211_htex_mcs,
+ &hf_ieee80211_htex_htc_support,
+ &hf_ieee80211_htex_rd_responder,
+ NULL
+ };
- vht_action = tvb_get_guint8(tvb, offset);
- offset += add_ff_vht_action(tree, tvb, pinfo, offset);
+ static const int *ieee80211_txbf[] = {
+ &hf_ieee80211_txbf_cap,
+ &hf_ieee80211_txbf_rcv_ssc,
+ &hf_ieee80211_txbf_tx_ssc,
+ &hf_ieee80211_txbf_rcv_ndp,
+ &hf_ieee80211_txbf_tx_ndp,
+ &hf_ieee80211_txbf_impl_txbf,
+ &hf_ieee80211_txbf_calib,
+ &hf_ieee80211_txbf_expl_csi,
+ &hf_ieee80211_txbf_expl_uncomp_fm,
+ &hf_ieee80211_txbf_expl_comp_fm,
+ &hf_ieee80211_txbf_expl_bf_csi,
+ &hf_ieee80211_txbf_expl_uncomp_fm_feed,
+ &hf_ieee80211_txbf_expl_comp_fm_feed,
+ &hf_ieee80211_txbf_min_group,
+ &hf_ieee80211_txbf_csi_num_bf_ant,
+ &hf_ieee80211_txbf_uncomp_sm_bf_ant,
+ &hf_ieee80211_txbf_comp_sm_bf_ant,
+ &hf_ieee80211_txbf_csi_max_rows_bf,
+ &hf_ieee80211_txbf_chan_est,
+ &hf_ieee80211_txbf_resrv,
+ NULL
+ };
- switch(vht_action){
- case VHT_ACT_VHT_COMPRESSED_BEAMFORMING:{
- offset = add_ff_vht_compressed_beamforming_report(tree, tvb, pinfo, offset);
- offset += tvb_reported_length_remaining(tvb, offset);
- }
- break;
- case VHT_ACT_GROUP_ID_MANAGEMENT:{
- ti = proto_tree_add_item(tree, hf_ieee80211_vht_group_id_management, tvb,
- offset, -1, ENC_NA);
- ti_tree = proto_item_add_subtree(ti, ett_vht_grpidmgmt);
+ static const int *ieee80211_antsel[] = {
+ &hf_ieee80211_antsel_b0,
+ &hf_ieee80211_antsel_b1,
+ &hf_ieee80211_antsel_b2,
+ &hf_ieee80211_antsel_b3,
+ &hf_ieee80211_antsel_b4,
+ &hf_ieee80211_antsel_b5,
+ &hf_ieee80211_antsel_b6,
+ &hf_ieee80211_antsel_b7,
+ NULL
+ };
- msa_value = tvb_get_letoh64(tvb, offset);
- msa = proto_tree_add_item(ti_tree, hf_ieee80211_vht_membership_status_array, tvb,
- offset, 8, ENC_NA);
- msa_tree = proto_item_add_subtree(msa, ett_vht_msa);
- for (m = 0; m < 64; m++) {
- if (msa_value & (G_GINT64_CONSTANT(1) << m))
- proto_tree_add_uint_format(msa_tree, hf_ieee80211_vht_membership_status_field,
- tvb, offset + (m/8), 1, 1, "Membership Status in Group ID %d: 1", m);
- }
- offset += 8;
+ if (tag_len != 26) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
+ "HT Capabilities IE length %u wrong, must be = 26", tag_len);
+ return (offset > 0) ? offset : 1;
+ }
- upa = proto_tree_add_item(ti_tree, hf_ieee80211_vht_user_position_array, tvb,
- offset, 16, ENC_NA);
- upa_tree = proto_item_add_subtree(upa, ett_vht_upa);
+ if (wlan_ignore_draft_ht && vendorspecific)
+ return (offset > 0) ? offset : 1;
- upa_value = tvb_get_letoh64(tvb, offset);
- for (m = 0; m < 32; m++) {
- if (msa_value & (G_GINT64_CONSTANT(1) << m)) {
- temp_val = ((guint64) pow(4,m))*3;
- field_val = (guint8) ((upa_value & temp_val) >> m*2);
- proto_tree_add_uint_format(upa_tree, hf_ieee80211_vht_user_position_field,
- tvb, offset + (m/4), 1, field_val, "User Position in Group ID %d: %u", m, field_val);
- }
- }
- upa_value = tvb_get_letoh64(tvb, offset+8);
- for (m = 0; m < 32; m++) {
- if (msa_value & (G_GINT64_CONSTANT(1) << (32+m))) {
- temp_val = ((guint64) pow(4,m))*3;
- field_val = (guint8) ((upa_value & temp_val) >> m*2);
- proto_tree_add_uint_format(upa_tree, hf_ieee80211_vht_user_position_field,
- tvb, (offset + 8) + (m/4), 1, field_val, "User Position in Group ID %d: %u", m, field_val);
- }
- }
- offset += tvb_reported_length_remaining(tvb, offset);
- }
- break;
- case VHT_ACT_OPERATION_MODE_NOTIFICATION:{
- ti = proto_tree_add_item(tree, hf_ieee80211_vht_operation_mode_notification, tvb,
- offset, -1, ENC_NA);
- expert_add_info(pinfo, ti, &ei_ieee80211_vht_action);
- offset += tvb_reported_length_remaining(tvb, offset);
- }
- break;
- default:
- break;
+ /* 2 byte HT Capabilities Info*/
+ if (vendorspecific)
+ {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_vs_cap,
+ ett_ht_cap_tree, ieee80211_ht,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
}
+ else
+ {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_cap,
+ ett_ht_cap_tree, ieee80211_ht,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ }
+ offset += 2;
+ /* 1 byte A-MPDU Parameters */
+ if (vendorspecific)
+ {
+ cap_item = proto_tree_add_item(tree, hf_ieee80211_ampduparam_vs, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ } else
+ {
+ cap_item = proto_tree_add_item(tree, hf_ieee80211_ampduparam, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ }
+ cap_tree = proto_item_add_subtree(cap_item, ett_ampduparam_tree);
+ ti = proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_mpdu, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%04.0f[Bytes])", pow(2, 13+(tvb_get_guint8(tvb, offset) & 0x3))-1);
+ proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_mpdu_start_spacing, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- return offset - start;
-}
+ /* 16 byte MCS set */
+ offset = dissect_mcs_set(tree, tvb, offset, FALSE, vendorspecific);
-static guint
-add_ff_action_fst(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
-{
- guint8 code;
- guint start = offset;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_fst_action_code(tree, tvb, pinfo, offset);
- switch (code) {
- case FST_SETUP_REQUEST:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_llt(tree, tvb, pinfo, offset);
- break;
- case FST_SETUP_RESPONSE:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- break;
- case FST_TEAR_DOWN:
- offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
- break;
- case FST_ACK_REQUEST:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
- break;
- case FST_ACK_RESPONSE:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_fsts_id(tree, tvb, pinfo, offset);
- break;
- case FST_ON_CHANNEL_TUNNEL_REQUEST:
- offset += add_ff_oct_mmpdu(tree, tvb, pinfo, offset);
- break;
+ /* 2 byte HT Extended Capabilities */
+ if (vendorspecific)
+ {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_htex_vs_cap,
+ ett_htex_cap_tree, ieee80211_htex,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_htex_cap,
+ ett_htex_cap_tree, ieee80211_htex,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
}
- return offset - start;
+ offset += 2;
+
+
+ /* 4 byte TxBF capabilities */
+ if (vendorspecific)
+ {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_txbf_vs,
+ ett_txbf_tree, ieee80211_txbf,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ } else {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_txbf,
+ ett_txbf_tree, ieee80211_txbf,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ }
+ offset += 4;
+
+ /* 1 byte Antenna Selection (ASEL) capabilities */
+ if (vendorspecific)
+ {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_antsel_vs,
+ ett_antsel_tree, ieee80211_antsel,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ }
+ else
+ {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_antsel,
+ ett_antsel_tree, ieee80211_antsel,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ }
+ offset += 1;
+
+ return offset;
}
-static guint
-add_ff_action_dmg(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+static int
+dissect_ht_capability_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint8 code;
- guint start = offset;
- int left_offset;
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- offset += add_ff_category_code(tree, tvb, pinfo, offset);
- code = tvb_get_guint8(tvb, offset);
- offset += add_ff_dmg_action_code(tree, tvb, pinfo, offset);
- switch (code) {
- case DMG_ACTION_PWR_SAVE_CONFIG_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_dmg_pwr_mgmt(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_PWR_SAVE_CONFIG_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_INFO_REQ:
- offset += add_ff_subject_address(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_INFO_RES:
- offset += add_ff_subject_address(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_HANDOVER_REQ:
- offset += add_ff_handover_reason(tree, tvb, pinfo, offset);
- offset += add_ff_handover_remaining_bi(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_HANDOVER_RES:
- offset += add_ff_handover_result(tree, tvb, pinfo, offset);
- offset += add_ff_handover_reject_reason(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_DTP_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_DTP_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_RELAY_SEARCH_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_destination_reds_aid(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_RELAY_SEARCH_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_MUL_RELAY_CHANNEL_MEASURE_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- left_offset =
- tvb_reported_length_remaining(tvb, offset);
- while(left_offset > 0) {
- proto_tree_add_item(tree, hf_ieee80211_ff_peer_sta_aid, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset+1, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_ff_internal_angle, tvb, offset+2, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_ff_recommend, tvb, offset+2, 1, ENC_NA);
- /* another reserved byte */
- offset += 4;
- left_offset -= 4;
- }
- break;
- case DMG_ACTION_RLS_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
- offset += add_ff_realy_aid(tree, tvb, pinfo, offset);
- offset += add_ff_source_aid(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_RLS_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_RLS_ANNOUNCE:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
- offset += add_ff_realy_aid(tree, tvb, pinfo, offset);
- offset += add_ff_source_aid(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_RLS_TEARDOWN:
- offset += add_ff_destination_aid(tree, tvb, pinfo, offset);
- offset += add_ff_realy_aid(tree, tvb, pinfo, offset);
- offset += add_ff_source_aid(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_RELAY_ACK_REQ:
- case DMG_ACTION_RELAY_ACK_RES:
- break;
- case DMG_ACTION_TPA_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_timing_offset(tree, tvb, pinfo, offset);
- offset += add_ff_sampling_frequency_offset(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_TPA_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_TPA_REP:
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_ROC_REQ:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_relay_operation_type(tree, tvb, pinfo, offset);
- break;
- case DMG_ACTION_ROC_RES:
- offset += add_ff_dialog_token(tree, tvb, pinfo, offset);
- offset += add_ff_status_code(tree, tvb, pinfo, offset);
- break;
- }
- return offset - start;
+ return dissect_ht_capability_ie_common(tvb, pinfo, tree, 0, tvb_reported_length(tvb),
+ field_data->item_tag_length, FALSE);
}
-static guint
-add_ff_action(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
+static int
+dissect_ht_info_ie_1_0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
+ guint32 tag_len, proto_item *ti_len)
{
- switch (tvb_get_guint8(tvb, offset) & 0x7f) {
- case CAT_SPECTRUM_MGMT: /* 0 */
- return add_ff_action_spectrum_mgmt(tree, tvb, pinfo, offset);
- case CAT_QOS: /* 1 */
- return add_ff_action_qos(tree, tvb, pinfo, offset);
- case CAT_DLS: /* 2 */
- return add_ff_action_dls(tree, tvb, pinfo, offset);
- case CAT_BLOCK_ACK: /* 3 */
- return add_ff_action_block_ack(tree, tvb, pinfo, offset);
- case CAT_PUBLIC: /* 4 */
- return add_ff_action_public(tree, tvb, pinfo, offset);
- case CAT_RADIO_MEASUREMENT: /* 5 */
- return add_ff_action_radio_measurement(tree, tvb, pinfo, offset);
- case CAT_FAST_BSS_TRANSITION: /* 6 */
- return add_ff_action_fast_bss_transition(tree, tvb, pinfo, offset);
- case CAT_HT: /* 7 */
- return add_ff_action_ht(tree, tvb, pinfo, offset);
- case CAT_SA_QUERY: /* 8 */
- return add_ff_action_sa_query(tree, tvb, pinfo, offset);
- case CAT_PUBLIC_PROTECTED: /* 9 */
- return add_ff_action_protected_public(tree, tvb, pinfo, offset);
- case CAT_WNM: /* 10 */
- return add_ff_action_wnm(tree, tvb, pinfo, offset);
- case CAT_UNPROTECTED_WNM: /* 11 */
- return add_ff_action_unprotected_wnm(tree, tvb, pinfo, offset);
- case CAT_TDLS: /* 12 */
- return add_ff_action_tdls(tree, tvb, pinfo, offset);
- case CAT_MESH: /* 13 */
- return add_ff_action_mesh(tree, tvb, pinfo, offset);
- case CAT_MULTIHOP: /* 14 */
- return add_ff_action_multihop(tree, tvb, pinfo, offset);
- case CAT_SELF_PROTECTED: /* 15 */
- return add_ff_action_self_protected(tree, tvb, pinfo, offset);
- case CAT_DMG: /* 16 */
- return add_ff_action_dmg(tree, tvb, pinfo, offset);
- case CAT_MGMT_NOTIFICATION: /* Management notification frame - 17 */
- return add_ff_action_mgmt_notification(tree, tvb, pinfo, offset);
- case CAT_FAST_SESSION_TRANSFER: /* 18 */
- return add_ff_action_fst(tree, tvb, pinfo, offset);
-/* case CAT_ROBUST_AV_STREAMING: 19 */
-/* return add_ff_action_robust_av_streaming(tree, tvb, pinfo, offset); */
- case CAT_UNPROTECTED_DMG: /* 20 */
- return add_ff_action_unprotected_dmg(tree, tvb, pinfo, offset);
- case CAT_VHT: /* 21 */
- return add_ff_action_vht(tree, tvb, pinfo, offset);
-/* case CAT_VENDOR_SPECIFIC_PROTECTED: Vendor Specific Protected Category - 126 */
-/* return add_ff_action_vendor_specific_protected(tree, tvb, pinfo, offset);*/
- case CAT_VENDOR_SPECIFIC: /* Vendor Specific Protected Category - 127 */
- return add_ff_action_vendor_specific(tree, tvb, pinfo, offset);
- default:
- add_ff_category_code(tree, tvb, pinfo, offset);
- return 1;
+ static const int *ieee80211_hta1[] = {
+ &hf_ieee80211_hta_ext_chan_offset,
+ &hf_ieee80211_hta_rec_tx_width,
+ &hf_ieee80211_hta_rifs_mode,
+ &hf_ieee80211_hta_controlled_access,
+ &hf_ieee80211_hta_service_interval,
+ NULL
+ };
+
+ static const int *ieee80211_hta2[] = {
+ &hf_ieee80211_hta_operating_mode,
+ &hf_ieee80211_hta_non_gf_devices,
+ NULL
+ };
+
+ static const int *ieee80211_hta3[] = {
+ &hf_ieee80211_hta_basic_stbc_mcs,
+ &hf_ieee80211_hta_dual_stbc_protection,
+ &hf_ieee80211_hta_secondary_beacon,
+ &hf_ieee80211_hta_lsig_txop_protection,
+ &hf_ieee80211_hta_pco_active,
+ &hf_ieee80211_hta_pco_phase,
+ NULL
+ };
+
+ if (tag_len != 22) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
+ "Tag length %u wrong, must be = 22", tag_len);
+ return offset;
}
+
+ if (wlan_ignore_draft_ht)
+ return offset;
+
+ /* 1 HT Control Channel */
+ proto_tree_add_item(tree, hf_ieee80211_hta_cc, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ /* 1 byte HT additional capabilities */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap1,
+ ett_hta_cap_tree, ieee80211_hta1,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
+
+ /* 2 byte HT additional capabilities */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap2,
+ ett_hta_cap1_tree, ieee80211_hta2,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ /* 2 byte HT additional capabilities */
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap2,
+ ett_hta_cap2_tree, ieee80211_hta3,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ /* 16 byte Supported MCS set */
+ offset = dissect_mcs_set(tree, tvb, offset, FALSE, TRUE);
+
+ return offset;
}
-static const value_string ieee80211_rsn_cipher_vals[] = {
- {0, "NONE"},
- {1, "WEP (40-bit)"},
- {2, "TKIP"},
- {3, "AES (OCB)"},
- {4, "AES (CCM)"},
- {5, "WEP (104-bit)"},
- {6, "BIP"},
- {7, "Group addressed traffic not allowed"},
- {8, "GCMP"},
- {0, NULL}
-};
+/* 802.11n-D1.10 and 802.11n-D2.0, 7.1.3.5a */
-static const value_string ieee80211_rsn_keymgmt_vals[] = {
- {0, "NONE"},
- {1, "WPA"},
- {2, "PSK"},
- {3, "FT over IEEE 802.1X"},
- {4, "FT using PSK"},
- {5, "WPA (SHA256)"},
- {6, "PSK (SHA256)"},
- {7, "TDLS / TPK Handshake"},
- {0, NULL}
+/*
+ * 8.2.4.1.10 "Order field" says:
+ *
+ * The Order field is 1 bit in length. It is used for two purposes:
+ *
+ * -- It is set to 1 in a non-QoS data frame transmitted by a non-QoS
+ * STA to indicate that the frame contains an MSDU, or fragment
+ * thereof, that is being transferred using the StrictlyOrdered
+ * service class.
+ *
+ * -- It is set to 1 in a QoS data or management frame transmitted
+ * with a value of HT_GF or HT_MF for the FORMAT parameter of the
+ * TXVECTOR to indicate that the frame contains an HT Control field.
+ *
+ * 802.11ac changes the second of those clauses to say "HT_GF, HT_MF,
+ * or VHT", indicates that bit B0 of the field is 0 for HT and 1 for
+ * VHT (stealing a reserved bit from the Link Adaptation Control field),
+ * 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
+ * that we do *not* have to determine, from radio metadata, whether the
+ * frame was transmitted as an HT or VHT frame.
+ *
+ * (See bug 11351, in which a frame with an HT Control field, with a
+ * radiotap header, lacks the MCS or VHT fields in the radiotap header,
+ * so Wireshark has no clue that it's an HT or VHT field, and misdissected
+ * 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 }
};
+/*
+ * Print the UL target RSSI field as per the spec.
+ * 0->30 map to -90 to -30 dBm.
+ * 31 maps to Max ransmit power
+ */
static void
-oui_base_custom(gchar *result, guint32 oui)
+ul_target_rssi_base_custom(gchar *result, guint32 target_rssi)
{
- guint8 p_oui[3];
- const gchar *manuf_name;
-
- p_oui[0] = oui >> 16 & 0xFF;
- p_oui[1] = oui >> 8 & 0xFF;
- p_oui[2] = oui & 0xFF;
-
- /* Attempt an OUI lookup. */
- manuf_name = uint_get_manuf_name_if_known(oui);
- if (manuf_name == NULL) {
- /* Could not find an OUI. */
- g_snprintf(result, ITEM_LABEL_LENGTH, "%02x:%02x:%02x", p_oui[0], p_oui[1], p_oui[2]);
- }
- else {
- /* Found an address string. */
- g_snprintf(result, ITEM_LABEL_LENGTH, "%02x:%02x:%02x (%s)", p_oui[0], p_oui[1], p_oui[2], manuf_name);
+ if (target_rssi <= 30) {
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%ddBm", -90 + (2 * target_rssi));
+ } else if (target_rssi == 31) {
+ g_snprintf(result, ITEM_LABEL_LENGTH, "Max transmit power");
}
}
static void
-rsn_gcs_base_custom(gchar *result, guint32 gcs)
+dissect_a_control_umrs(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
+ proto_tree *umrs_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
- oui_result[0] = '\0';
- oui_base_custom(oui_result, gcs >> 8);
- tmp_str = val_to_str_wmem(NULL, gcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ umrs_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_umrs_control,
+ NULL, "UMRS Control: 0x%08x", the_bits);
+
+ proto_tree_add_uint(umrs_tree, hf_ieee80211_he_umrs_he_tb_ppdu_len, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(umrs_tree, hf_ieee80211_he_umrs_ru_allocation, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(umrs_tree, hf_ieee80211_he_dl_tx_power, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(umrs_tree, hf_ieee80211_he_ul_target_rssi, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(umrs_tree, hf_ieee80211_he_ul_mcs, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(umrs_tree, hf_ieee80211_he_ul_reserved, tvb,
+ offset, 4, the_bits);
}
static void
-rsn_pcs_base_custom(gchar *result, guint32 pcs)
+dissect_a_control_om(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
-
- oui_result[0] = '\0';
- oui_base_custom(oui_result, pcs >> 8);
- tmp_str = val_to_str_wmem(NULL, pcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
+ proto_tree *om_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000000FFF;
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ om_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_om_control,
+ NULL, "OM Control: 0x%04x", the_bits);
+
+ proto_tree_add_uint(om_tree, hf_ieee80211_he_om_rx_nss, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(om_tree, hf_ieee80211_he_om_channel_width, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(om_tree, hf_ieee80211_he_om_ul_mu_disable, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(om_tree, hf_ieee80211_he_om_tx_nsts, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(om_tree, hf_ieee80211_he_om_reserved, tvb,
+ offset, 4, the_bits);
}
+
static void
-rsn_akms_base_custom(gchar *result, guint32 akms)
+dissect_a_control_hla(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
+ proto_tree *hla_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
- oui_result[0] = '\0';
- oui_base_custom(oui_result, akms >> 8);
- tmp_str = val_to_str_wmem(NULL, akms & 0xFF, ieee80211_rsn_keymgmt_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ hla_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_hla_control,
+ NULL, "HLA Control: 0x%08x", the_bits);
+
+ proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_unsolicited_mfb, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_mrq, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_nss, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_he_mcs, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_dcm, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_ru, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_bw, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_msi_ppdu_type, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(hla_tree, hf_ieee80211_he_hla_tx_bf, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(hla_tree, hf_ieee80211_he_hla_reserved, tvb,
+ offset, 4, the_bits);
}
-static gchar *
-rsn_pcs_return(guint32 pcs)
+static void
+dissect_a_control_bsr(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gchar *result;
-
- result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
- result[0] = '\0';
- rsn_pcs_base_custom(result, pcs);
+ proto_tree *bsr_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x03FFFFFF;
- return result;
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ bsr_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_buffer_status_report,
+ NULL, "Buffer Status Report: 0x%08x", the_bits);
+
+ proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_aci_bitmap, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_delta_tid, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_aci_high, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_scaling_factor, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_queue_size_high, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(bsr_tree, hf_ieee80211_he_bsr_queue_size_all, tvb,
+ offset, 4, the_bits);
}
-static gchar *
-rsn_akms_return(guint32 akms)
+static void
+dissect_a_control_uph(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gchar *result;
+ proto_tree *uph_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000000FF;
- result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
- result[0] = '\0';
- rsn_akms_base_custom(result, akms);
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ uph_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_control_uph,
+ NULL, "UPH Control: 0x%02x", the_bits);
- return result;
+ proto_tree_add_uint(uph_tree, hf_ieee80211_he_uph_ul_power_headroom, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(uph_tree, hf_ieee80211_he_uph_ul_min_transmit_power_flag,
+ tvb, offset, 4, the_bits);
+ proto_tree_add_uint(uph_tree, hf_ieee80211_he_uph_reserved,
+ tvb, offset, 4, the_bits);
}
static void
-rsn_gmcs_base_custom(gchar *result, guint32 gmcs)
+dissect_a_control_bqr(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
-
- oui_result[0] = '\0';
- oui_base_custom(oui_result, gmcs >> 8);
- tmp_str = val_to_str_wmem(NULL, gmcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
-}
+ proto_tree *bqr_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000003FF;
-static void
-rsni_base_custom(gchar *result, guint32 rsni)
-{
- double temp_double;
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ bqr_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_bqr_control,
+ NULL, "BQR Control: 0x%04x", the_bits);
- temp_double = (double)rsni;
- g_snprintf(result, ITEM_LABEL_LENGTH, "%f dB", (temp_double / 2));
+ proto_tree_add_uint(bqr_tree, hf_ieee80211_he_btc_avail_chan, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(bqr_tree, hf_ieee80211_he_btc_reserved, tvb,
+ offset, 4, the_bits);
}
static void
-vht_tpe_custom(gchar *result, guint8 txpwr)
+dissect_a_control_cci(proto_tree *tree, tvbuff_t *tvb, int offset,
+ guint32 bits _U_, guint32 start_bit)
{
- gint8 txpwr_db;
+ proto_tree *cci_tree = NULL;
+ guint the_bits = (tvb_get_letohl(tvb, offset) >> start_bit) & 0x000000FF;
- txpwr_db = (gint8)(txpwr);
- g_snprintf(result, ITEM_LABEL_LENGTH, "%3.1f dBm", (txpwr_db/2.0));
-}
+ /*
+ * We isolated the bits and moved them to the bottom ... so display them
+ */
+ cci_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4,
+ ett_ieee80211_control_cci,
+ NULL, "Command Control Indication: 0x%02x", the_bits);
-static void
-channel_number_custom(gchar *result, guint8 channel_number)
-{
- switch(channel_number){
- case 0:
- g_snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on all supported channels in the specified Operating Class)", channel_number);
- break;
- case 255:
- g_snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on all supported channels listed in the AP Channel Report)", channel_number);
- break;
- default :
- g_snprintf(result, ITEM_LABEL_LENGTH, "%u (iterative measurements on that Channel Number)", channel_number);
- break;
- }
+ proto_tree_add_boolean(cci_tree, hf_ieee80211_he_cci_ac_constraint, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(cci_tree, hf_ieee80211_he_cci_rdg_more_ppdu, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_boolean(cci_tree, hf_ieee80211_he_cci_sr_ppdu_indic, tvb,
+ offset, 4, the_bits);
+ proto_tree_add_uint(cci_tree, hf_ieee80211_he_cci_reserved, tvb,
+ offset, 4, the_bits);
}
-/* WPA / WME */
-static const value_string ieee802111_wfa_ie_type_vals[] = {
- { 1, "WPA Information Element" },
- { 2, "WMM/WME" },
- { 4, "WPS" },
- { 0, NULL }
-};
-
-static const value_string ieee80211_wfa_ie_wpa_cipher_vals[] = {
- { 0, "NONE" },
- { 1, "WEP (40-bit)" },
- { 2, "TKIP" },
- { 3, "AES (OCB)" },
- { 4, "AES (CCM)" },
- { 5, "WEP (104-bit)" },
- { 6, "BIP" },
- { 7, "Group addressed traffic not allowed" },
- { 0, NULL }
-};
-
-static const value_string ieee80211_wfa_ie_wpa_keymgmt_vals[] = {
- { 0, "NONE" },
- { 1, "WPA" },
- { 2, "PSK" },
- { 3, "FT over IEEE 802.1X" },
- { 4, "FT using PSK" },
- { 5, "WPA (SHA256)" },
- { 6, "PSK (SHA256)" },
- { 7, "TDLS / TPK Handshake" },
- { 0, NULL }
-};
-
-static const value_string ieee80211_wfa_ie_wme_acs_vals[] = {
- { 0, "Best Effort" },
- { 1, "Background" },
- { 2, "Video" },
- { 3, "Voice" },
- { 0, NULL }
-};
-
-static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_direction_vals[] = {
- { 0, "Uplink" },
- { 1, "Downlink" },
- { 2, "Direct link" },
- { 3, "Bidirectional link" },
- { 0, NULL }
-};
-
-static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_psb_vals[] = {
- { 0, "Legacy" },
- { 1, "U-APSD" },
- { 0, NULL }
-};
-
-static const value_string ieee80211_wfa_ie_wme_tspec_tsinfo_up_vals[] = {
- { 0, "Best Effort" },
- { 1, "Background" },
- { 2, "Spare" },
- { 3, "Excellent Effort" },
- { 4, "Controlled Load" },
- { 5, "Video" },
- { 6, "Voice" },
- { 7, "Network Control" },
- { 0, NULL }
-};
-
-static const value_string ieee802111_wfa_ie_wme_qos_info_sta_max_sp_length_vals[] = {
- { 0, "WMM AP may deliver all buffered frames (MSDUs and MMPDUs)" },
- { 1, "WMM AP may deliver a maximum of 2 buffered frames (MSDUs and MMPDUs) per USP" },
- { 2, "WMM AP may deliver a maximum of 4 buffered frames (MSDUs and MMPDUs) per USP" },
- { 3, "WMM AP may deliver a maximum of 6 buffered frames (MSDUs and MMPDUs) per USP" },
- { 0, NULL}
-};
-static const true_false_string ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs = {
- "WMM delivery and trigger enabled",
- "non-WMM PS"
-};
-
static void
-wpa_mcs_base_custom(gchar *result, guint32 mcs)
+dissect_ht_control(proto_tree *tree, tvbuff_t *tvb, int offset)
{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
+ proto_item *ti;
+ proto_tree *htc_tree, *lac_subtree, *mfb_subtree;
+ guint32 htc;
- oui_result[0] = '\0';
- oui_base_custom(oui_result, mcs >> 8);
- tmp_str = val_to_str_wmem(NULL, mcs & 0xFF, ieee80211_wfa_ie_wpa_cipher_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
-}
+ htc = tvb_get_letohl(tvb, offset);
-static void
-wpa_ucs_base_custom(gchar *result, guint32 ucs)
-{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
+ ti = proto_tree_add_item(tree, hf_ieee80211_htc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ htc_tree = proto_item_add_subtree(ti, ett_htc_tree);
- oui_result[0] = '\0';
- oui_base_custom(oui_result, ucs >> 8);
- tmp_str = val_to_str_wmem(NULL, ucs & 0xFF, ieee80211_wfa_ie_wpa_cipher_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
-}
-static void
-wpa_akms_base_custom(gchar *result, guint32 akms)
-{
- gchar oui_result[SHORT_STR];
- gchar *tmp_str;
+ /* 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 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_format(htc_tree, tvb, offset, 4,
+ ett_htc_he_a_control, NULL,
+ "Aggregate Control: 0x%0x", htc >> 2);
+ 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;
+ }
+ }
+ } 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_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);
+ }
+ } else {
+ /* Start: Link Adaptation Control */
+ 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);
- oui_result[0] = '\0';
- oui_base_custom(oui_result, akms >> 8);
- tmp_str = val_to_str_wmem(NULL, akms & 0xFF, ieee80211_wfa_ie_wpa_keymgmt_vals, "Unknown %d");
- g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, tmp_str);
- wmem_free(NULL, tmp_str);
-}
+ if (HTC_IS_ASELI(htc)) {
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_aseli, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_mrq, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ if (HTC_LAC_MAI_MRQ(htc)) {
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_msi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ }
+ }
-static gchar *
-wpa_ucs_return(guint32 ucs)
-{
- gchar *result;
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mfsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
- result[0] = '\0';
- wpa_ucs_base_custom(result, ucs);
+ if (HTC_IS_ASELI(htc)) {
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_asel_command, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_asel_data, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mfb, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ }
+ /* End: Link Adaptation Control */
- return result;
-}
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_cal_pos, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_cal_seq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved1, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(htc_tree, hf_ieee80211_htc_csi_steering, tvb, offset, 4, ENC_LITTLE_ENDIAN);
-static gchar *
-wpa_akms_return(guint32 akms)
-{
- gchar *result;
+ 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);
+ }
- result = (gchar *)wmem_alloc(wmem_packet_scope(), SHORT_STR);
- result[0] = '\0';
- wpa_akms_base_custom(result, akms);
+ /*
+ * 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);
+ }
- return result;
+ /* offset += 2; */
}
-/* For each Field */
-static const value_string ieee80211_wapi_suite_type[] = {
- {0, "Reserved"},
- {1, "WAI Certificate Authentication and Key Management"},
- {2, "WAI Preshared Key Authentication and Key Management"},
- {0, NULL},
-};
-/* For Summary Tag Information */
-static const value_string ieee80211_wapi_suite_type_short[] = {
- {0, "Reserved"},
- {1, "WAI-CERT"},
- {2, "WAI-PSK"},
- {0, NULL},
-};
+#define IEEE80211_COMMON_OPT_BROKEN_FC 0x00000001
+#define IEEE80211_COMMON_OPT_IS_CENTRINO 0x00000002
+#define IEEE80211_COMMON_OPT_NORMAL_QOS 0x00000004
-static const value_string ieee80211_wapi_cipher_type[] = {
- {0, "Reserved"},
- {1, "WPI-SMS4"},
- {0, NULL},
-};
+static void
+dissect_frame_control(proto_tree *tree, tvbuff_t *tvb, guint32 option_flags,
+ guint32 offset, packet_info *pinfo)
+{
+ guint16 fcf, flags, frame_type_subtype;
+ proto_tree *fc_tree, *flag_tree;
+ proto_item *fc_item, *flag_item, *hidden_item, *ti;
-static const value_string ieee802111_wfa_ie_wme_type[] = {
- { 0, "Information Element" },
- { 1, "Parameter Element" },
- { 2, "TSPEC Element" },
- { 0, NULL}
-};
+ fcf = FETCH_FCF(offset);
-static const value_string ft_subelem_id_vals[] = {
- {0, "Reserved"},
- {1, "PMK-R1 key holder identifier (R1KH-ID)"},
- {2, "GTK subelement"},
- {3, "PMK-R0 key holder identifier (R0KH-ID)"},
- {4, "IGTK"},
- {0, NULL}
-};
+ flags = FCF_FLAGS(fcf);
+ frame_type_subtype = COMPOSE_FRAME_TYPE(fcf);
-static int
-dissect_wme_qos_info(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
-{
- proto_item *wme_qos_info_item;
+ /* Swap offset... */
+ if(option_flags & IEEE80211_COMMON_OPT_BROKEN_FC)
+ {
+ offset += 1;
+ }
- static const int *ieee80211_mgt_req[] = {
- &hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length,
- &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be,
- &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk,
- &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi,
- &hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo,
- &hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved,
- NULL
- };
+ proto_tree_add_uint(tree, hf_ieee80211_fc_frame_type_subtype, tvb, offset, 1, frame_type_subtype);
- static const int *ieee80211_mgt_resp[] = {
- &hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd,
- &hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count,
- &hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved,
- NULL
- };
+ fc_item = proto_tree_add_item(tree, hf_ieee80211_fc_field, tvb, offset, 2, ENC_BIG_ENDIAN);
- switch (ftype) {
- case MGT_ASSOC_REQ:
- case MGT_PROBE_REQ:
- case MGT_REASSOC_REQ:
- {
- /* To AP so decode as per WMM standard Figure 7 QoS Info field when sent from WMM STA*/
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_qos_info,
- ett_wme_qos_info, ieee80211_mgt_req,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- break;
- }
- case MGT_BEACON:
- case MGT_PROBE_RESP:
- case MGT_ASSOC_RESP:
- case MGT_REASSOC_RESP:
- {
- /* From AP so decode as per WMM standard Figure 6 QoS Info field when sent from WMM AP */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_qos_info,
- ett_wme_qos_info, ieee80211_mgt_resp,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- break;
- }
- default:
- wme_qos_info_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_qos_info, tvb, offset, 1, ENC_NA);
- expert_add_info_format(pinfo, wme_qos_info_item, &ei_ieee80211_wfa_ie_wme_qos_info_bad_ftype, "Could not deduce direction to decode correctly, ftype %u", ftype);
- break;
- }
+ fc_tree = proto_item_add_subtree(fc_item, ett_fc_tree);
+ proto_tree_add_item(fc_tree, hf_ieee80211_fc_proto_version, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(fc_tree, hf_ieee80211_fc_frame_type, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(fc_tree, hf_ieee80211_fc_frame_subtype, tvb, offset, 1, ENC_NA);
+ /* Changing control frame extension for extension frames */
+ if(IS_FRAME_EXTENSION(fcf) == 1) {
+ proto_tree_add_uint(fc_tree, hf_ieee80211_fc_frame_extension, tvb, offset, 1, FCF_FRAME_EXTENSION(fcf));
+ }
offset += 1;
- return offset;
-}
-static int
-decode_qos_parameter_set(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
-{
- int i;
- /* WME QoS Info Field */
- offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype);
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_reserved, tvb, offset, 1, ENC_NA);
- offset += 1;
- /* AC Parameters */
- for (i = 0; i < 4; i++)
+ /* Reswap offset...*/
+ if(option_flags & IEEE80211_COMMON_OPT_BROKEN_FC)
{
- proto_item *ac_item, *aci_aifsn_item, *ecw_item;
- proto_tree *ac_tree, *ecw_tree;
- guint8 aci_aifsn, ecw, ecwmin, ecwmax;
- guint16 cwmin, cwmax;
- static const int *ieee80211_wfa_ie_wme[] = {
- &hf_ieee80211_wfa_ie_wme_acp_aci,
- &hf_ieee80211_wfa_ie_wme_acp_acm,
- &hf_ieee80211_wfa_ie_wme_acp_aifsn,
- &hf_ieee80211_wfa_ie_wme_acp_reserved,
- NULL
- };
-
- ac_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_ac_parameters, tvb, offset, 4, ENC_NA);
- ac_tree = proto_item_add_subtree(ac_item, ett_wme_ac);
+ offset -= 1;
+ proto_item_append_text(fc_item, "(Swapped)");
+ }
- /* ACI/AIFSN Field */
- aci_aifsn_item = proto_tree_add_bitmask_with_flags(ac_tree, tvb, offset, hf_ieee80211_wfa_ie_wme_acp_aci_aifsn,
- ett_wme_aci_aifsn, ieee80211_wfa_ie_wme,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- aci_aifsn = tvb_get_guint8(tvb, offset);
- /* 802.11-2012, 8.4.2.31 EDCA Parameter Set element */
- if (aci_aifsn < 2) {
- expert_add_info_format(pinfo, aci_aifsn_item, &ei_ieee80211_qos_bad_aifsn,
- "The minimum value for the AIFSN subfield is 2 (found %u).", aci_aifsn);
+ /* Flags */
+ flag_item = proto_tree_add_item(fc_tree, hf_ieee80211_fc_flags, tvb, offset, 1, ENC_NA);
+ flag_tree = proto_item_add_subtree(flag_item, ett_proto_flags);
+ /* Changing control frame flags for extension frames */
+ if(IS_FRAME_EXTENSION(fcf) == 0) {
+ proto_tree_add_item(flag_tree, hf_ieee80211_fc_data_ds, tvb, offset, 1, ENC_NA);
+ hidden_item = proto_tree_add_item(flag_tree, hf_ieee80211_fc_to_ds, tvb, offset, 1, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(flag_tree, hf_ieee80211_fc_from_ds, tvb, offset, 1, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(flag_tree, hf_ieee80211_fc_more_frag, tvb, offset, 1, ENC_NA);
+ ti = proto_tree_add_item(flag_tree, hf_ieee80211_fc_retry, tvb, offset, 1, ENC_NA);
+ if( IS_RETRY(flags) )
+ {
+ expert_add_info(pinfo, ti, &ei_ieee80211_fc_retry);
+ wlan_stats.fc_retry = 1;
}
- proto_item_append_text(ac_item, " ACI %u (%s), ACM %s, AIFSN %u",
- (aci_aifsn & 0x60) >> 5, try_val_to_str((aci_aifsn & 0x60) >> 5, ieee80211_wfa_ie_wme_acs_vals),
- (aci_aifsn & 0x10) ? "yes" : "no", aci_aifsn & 0x0f);
- offset += 1;
+ }
+ proto_tree_add_item(flag_tree, hf_ieee80211_fc_pwr_mgt, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(flag_tree, hf_ieee80211_fc_more_data, tvb, offset, 1, ENC_NA);
+ /* Changing control frame flags for extension frames */
+ if(IS_FRAME_EXTENSION(fcf) == 0) {
+ proto_tree_add_item(flag_tree, hf_ieee80211_fc_protected, tvb, offset, 1, ENC_NA);
+ }
+ proto_tree_add_item(flag_tree, hf_ieee80211_fc_order, tvb, offset, 1, ENC_NA);
+}
- /* ECWmin/ECWmax field */
- ecw_item = proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_ecw, tvb, offset, 1, ENC_NA);
- ecw_tree = proto_item_add_subtree(ecw_item, ett_wme_ecw);
- ecw = tvb_get_guint8(tvb, offset);
- ecwmin = ecw & 0x0f;
- ecwmax = (ecw & 0xf0) >> 4;
- cwmin= (1 << ecwmin) - 1;
- cwmax= (1 << ecwmax) - 1;
- proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_max, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_ecw_min, tvb, offset, 1, ENC_NA);
- proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_max, tvb, offset, 1, cwmax);
- proto_tree_add_uint(ecw_tree, hf_ieee80211_wfa_ie_wme_acp_cw_min, tvb, offset, 1, cwmin);
- proto_item_append_text(ac_item, ", ECWmin/max %u/%u (CWmin/max %u/%u)", ecwmin, ecwmax, cwmin, cwmax);
- offset += 1;
+static void
+dissect_durid(proto_tree *hdr_tree, tvbuff_t *tvb, guint16 fts, gint offset)
+{
+ guint16 durid = tvb_get_letohs(tvb, offset);
- /* TXOP Limit */
- proto_tree_add_item(ac_tree, hf_ieee80211_wfa_ie_wme_acp_txop_limit, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ac_item, ", TXOP %u", tvb_get_letohs(tvb, offset));
- offset += 2;
+ if (durid < 0x8000) {
+ proto_tree_add_uint_format_value(hdr_tree, hf_ieee80211_did_duration, tvb,
+ offset, 2, durid, "%u microseconds", durid);
+ } else if (((durid & 0xC000) == 0xC000) &&
+ ((durid & 0x3FFF) > 0) && ((durid & 0x3FFF) <= 2007) &&
+ (fts == CTRL_PS_POLL)) {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_assoc_id, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ } else if (durid == 0x8000) {
+ proto_tree_add_uint_format(hdr_tree, hf_ieee80211_did_duration, tvb,
+ offset, 2, durid, "Duration/ID: %u", durid);
+ } else {
+ proto_tree_add_uint_format(hdr_tree, hf_ieee80211_did_duration, tvb,
+ offset, 2, durid, "Duration/ID: %u (reserved)", durid & 0x3FFF);
}
-
- return offset;
}
-static int
-dissect_vendor_ie_wpawme(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, guint32 tag_len, int ftype)
+
+static void
+dissect_vendor_ie_ht(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ guint offset, proto_item *item, proto_item *ti_len, gint tag_len)
{
+
guint8 type;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_type, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_ht_pren_type, tvb, offset, 1, ENC_NA);
type = tvb_get_guint8(tvb, offset);
- proto_item_append_text(tree, ": %s", val_to_str(type, ieee802111_wfa_ie_type_vals, "Unknown %d"));
offset += 1;
+ tag_len -= 1;
- switch (type) {
- case 1: /* Wi-Fi Protected Access (WPA) */
- {
- proto_item *wpa_mcs_item, *wpa_ucs_item, *wpa_akms_item;
- proto_item *wpa_sub_ucs_item, *wpa_sub_akms_item;
- proto_tree *wpa_mcs_tree, *wpa_ucs_tree, *wpa_akms_tree;
- proto_tree *wpa_sub_ucs_tree, *wpa_sub_akms_tree;
- guint16 ucs_count, akms_count;
- guint ii;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ switch(type){
+ case 51:
+ dissect_ht_capability_ie_common(tvb, pinfo, tree, offset, tag_len, ti_len, TRUE);
+ proto_item_append_text(item, ": HT Capabilities (802.11n D1.10)");
+ break;
- /* Multicast Cipher Suite */
- wpa_mcs_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_mcs, tvb, offset, 4, ENC_BIG_ENDIAN);
- wpa_mcs_tree = proto_item_add_subtree(wpa_mcs_item, ett_wpa_mcs_tree);
- proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ case 52:
+ dissect_ht_info_ie_1_0(tvb, pinfo, tree, offset, tag_len, ti_len);
+ proto_item_append_text(item, ": HT Additional Capabilities (802.11n D1.00)");
+ break;
- /* Check if OUI is 00:50:F2 (WFA) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
- {
- proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_wfa_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(wpa_mcs_tree, hf_ieee80211_wfa_ie_wpa_mcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- }
- offset += 4;
+ default:
+ proto_tree_add_item(tree, hf_ieee80211_ht_pren_unknown, tvb, offset, tag_len, ENC_NA);
+ break;
+ }
- /* Unicast Cipher Suites */
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_ucs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- ucs_count = tvb_get_letohs(tvb, offset);
- offset += 2;
+}
- wpa_ucs_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_ucs_list, tvb, offset, ucs_count * 4, ENC_NA);
- wpa_ucs_tree = proto_item_add_subtree(wpa_ucs_item, ett_wpa_ucs_tree);
- for (ii = 0; ii < ucs_count; ii++)
- {
- wpa_sub_ucs_item = proto_tree_add_item(wpa_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs, tvb, offset, 4, ENC_BIG_ENDIAN);
- wpa_sub_ucs_tree = proto_item_add_subtree(wpa_sub_ucs_item, ett_wpa_sub_ucs_tree);
- proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+static int
+dissect_interworking(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;
+ static const int *ieee80211_tag_interworking[] = {
+ &hf_ieee80211_tag_interworking_access_network_type,
+ &hf_ieee80211_tag_interworking_internet,
+ &hf_ieee80211_tag_interworking_asra,
+ &hf_ieee80211_tag_interworking_esr,
+ &hf_ieee80211_tag_interworking_uesa,
+ NULL
+ };
- /* Check if OUI is 00:50:F2 (WFA) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
- {
- proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_wfa_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(wpa_ucs_item, " %s", wpa_ucs_return(tvb_get_ntohl(tvb, offset)));
- } else {
- proto_tree_add_item(wpa_sub_ucs_tree, hf_ieee80211_wfa_ie_wpa_ucs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- }
- offset += 4;
- }
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_interworking, ENC_LITTLE_ENDIAN);
+ offset += 1;
- /* Authenticated Key Management Suites */
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_akms_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- akms_count = tvb_get_letohs(tvb, offset);
- offset += 2;
+ if ((tag_len == (1 + 2)) || (tag_len == (1 + 2 + 6))) {
+ dissect_venue_info(tree, tvb, offset);
+ offset += 2;
+ }
- wpa_akms_item = proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wpa_akms_list, tvb, offset, akms_count * 4, ENC_NA);
- wpa_akms_tree = proto_item_add_subtree(wpa_akms_item, ett_wpa_akms_tree);
- for (ii = 0; ii < akms_count; ii++)
- {
- wpa_sub_akms_item = proto_tree_add_item(wpa_akms_tree, hf_ieee80211_wfa_ie_wpa_akms, tvb, offset, 4, ENC_BIG_ENDIAN);
- wpa_sub_akms_tree = proto_item_add_subtree(wpa_sub_akms_item, ett_wpa_sub_akms_tree);
- proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ if ((tag_len == (1 + 6)) || (tag_len == (1 + 2 + 6))) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_interworking_hessid,
+ tvb, offset, 6, ENC_NA);
+ offset += 6;
+ }
- /* Check if OUI is 00:50:F2 (WFA) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_WPAWME)
- {
- proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_wfa_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(wpa_akms_item, " %s", wpa_akms_return(tvb_get_ntohl(tvb, offset)));
- } else {
- proto_tree_add_item(wpa_sub_akms_tree, hf_ieee80211_wfa_ie_wpa_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- }
- offset += 4;
- }
- break;
- }
- case 2: /* Wireless Multimedia Enhancements (WME) */
- {
- guint8 subtype;
+ if ((tag_len != 1) && (tag_len != (1 + 2)) && (tag_len != (1 + 6)) && (tag_len != (1 + 2 + 6))) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Invalid Interworking element length");
+ }
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_subtype, tvb, offset, 1, ENC_NA);
- subtype = tvb_get_guint8(tvb, offset);
- proto_item_append_text(tree, ": %s", val_to_str(subtype, ieee802111_wfa_ie_wme_type, "Unknown %d"));
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_version, tvb, offset, 1, ENC_NA);
- offset += 1;
- switch (subtype) {
- case 0: /* WME Information Element */
- {
- /* WME QoS Info Field */
- offset = dissect_wme_qos_info(tree, tvb, pinfo, offset, ftype);
- break;
- }
- case 1: /* WME Parameter Element */
- {
- offset = decode_qos_parameter_set(tree, tvb, pinfo, offset, ftype);
- break;
- }
- case 2: /* WME TSPEC Element */
- {
- static const int *ieee80211_wfa_ie_wme_tspec_tsinfo[] = {
- &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid,
- &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction,
- &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb,
- &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up,
- &hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved,
- NULL
- };
+ return offset;
+}
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_wfa_ie_wme_tspec_tsinfo,
- ett_tsinfo_tree, ieee80211_wfa_ie_wme_tspec_tsinfo,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 3;
+static int
+dissect_qos_map_set(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;
+ guint8 left;
+ guint8 val, val2;
+ int i;
+ proto_item *dscp_item, *item;
+ proto_tree *dscp_tree;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_nor_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (tag_len < 16 || tag_len & 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_bad_length,
+ "Truncated QoS Map Set element");
+ return tvb_captured_length(tvb);
+ }
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_max_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ left = tag_len - 16;
+ while (left >= 2) {
+ dscp_item = proto_tree_add_item(tree, hf_ieee80211_tag_qos_map_set_dscp_exc,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ dscp_tree = proto_item_add_subtree(dscp_item, ett_qos_map_set_exception);
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ item = proto_tree_add_item(dscp_tree,
+ hf_ieee80211_tag_qos_map_set_dscp_exc_val,
+ tvb, offset, 1, ENC_NA);
+ val = tvb_get_guint8(tvb, offset);
+ if (val > 63 && val != 255) {
+ expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
+ "Invalid DSCP Value");
+ }
+ offset++;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_max_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ item = proto_tree_add_item(dscp_tree,
+ hf_ieee80211_tag_qos_map_set_dscp_exc_up,
+ tvb, offset, 1, ENC_NA);
+ val2 = tvb_get_guint8(tvb, offset);
+ if (val2 > 7) {
+ expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
+ "Invalid User Priority");
+ }
+ offset++;
+
+ proto_item_append_text(dscp_item, " (0x%02x: UP %u)", val, val2);
+
+ left -= 2;
+ }
+
+ for (i = 0; i < 8; i++) {
+ dscp_item = proto_tree_add_item(tree, hf_ieee80211_tag_qos_map_set_range,
+ tvb, offset, 2, ENC_NA);
+ dscp_tree = proto_item_add_subtree(dscp_item, ett_qos_map_set_exception);
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_inact_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ item = proto_tree_add_item(dscp_tree, hf_ieee80211_tag_qos_map_set_low,
+ tvb, offset, 1, ENC_NA);
+ val = tvb_get_guint8(tvb, offset);
+ if (val > 63 && val != 255) {
+ expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
+ "Invalid DSCP Value");
+ }
+ offset++;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_susp_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ item = proto_tree_add_item(dscp_tree, hf_ieee80211_tag_qos_map_set_high,
+ tvb, offset, 1, ENC_NA);
+ val2 = tvb_get_guint8(tvb, offset);
+ if ((val2 > 63 && val2 != 255) || val2 < val ||
+ (val == 255 && val2 != 255) || (val != 255 && val2 == 255)) {
+ expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
+ "Invalid DSCP Value");
+ }
+ offset++;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ if (val == 255 && val2 == 255) {
+ proto_item_append_text(dscp_item, " (UP %u not in use)", i);
+ } else {
+ proto_item_append_text(dscp_item, " (0x%02x-0x%02x: UP %u)",
+ val, val2, i);
+ }
+ }
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ return tvb_captured_length(tvb);
+}
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_mean_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+static int
+dissect_roaming_consortium(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;
+ proto_item* item;
+ guint8 oi_lens, oi1_len, oi2_len;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_peak_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_num_anqp_oi,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_burst_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ oi_lens = tvb_get_guint8(tvb, offset);
+ oi1_len = oi_lens & 0x0f;
+ oi2_len = (oi_lens & 0xf0) >> 4;
+ proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi1_len,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi2_len,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_delay_bound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ if (offset + oi1_len > tag_len) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Truncated Roaming Consortium element");
+ return tvb_captured_length(tvb);
+ }
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_min_phy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ item = proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi1,
+ tvb, offset, oi1_len, ENC_NA);
+ add_manuf(item, tvb, offset);
+ offset += oi1_len;
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_surplus, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (offset + oi2_len > tag_len) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Truncated Roaming Consortium element");
+ return tvb_captured_length(tvb);
+ }
- proto_tree_add_item(tree, hf_ieee80211_wfa_ie_wme_tspec_medium, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (oi2_len > 0) {
+ item = proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi2,
+ tvb, offset, oi2_len, ENC_NA);
+ add_manuf(item, tvb, offset);
+ offset += oi2_len;
+ }
- break;
- }
- default:
- /* No default Action */
- break;
- } /* End switch (subtype) */
- break;
- }
- case 4: /* WPS: Wifi Protected Setup */
- {
- dissect_wps_tlvs(tree, tvb, offset, tag_len-1, NULL);
- }
- break;
- default:
- /* No default Action...*/
- break;
- } /* End switch (type) */
+ if (tag_len > offset) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi3,
+ tvb, offset, tag_len - offset, ENC_NA);
+ }
- return offset;
+ return tvb_captured_length(tvb);
}
-static const value_string hs20_indication_release_number_vals[] = {
- { 0, "Release 1" },
- { 1, "Release 2" },
- { 0, NULL }
-};
-static int
-dissect_hs20_indication(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- static const int *ieee80211_hs20_indication[] = {
- &hf_hs20_indication_dgaf_disabled,
- &hf_hs20_indication_pps_mo_id_present,
- &hf_hs20_indication_anqp_domain_id_present,
- &hf_hs20_indication_release_number,
- NULL
- };
+/* ************************************************************************* */
+/* Dissect and add tagged (optional) fields to proto tree */
+/* ************************************************************************* */
- proto_tree_add_bitmask_list(tree, tvb, 0, 1, ieee80211_hs20_indication, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+static int beacon_padding = 0; /* beacon padding bug */
-static void
-dissect_vendor_ie_wfa(packet_info *pinfo, proto_item *item, tvbuff_t *tag_tvb)
+static int
+ieee80211_tag_ssid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- gint tag_len = tvb_reported_length(tag_tvb);
- guint8 subtype;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
int offset = 0;
- tvbuff_t *vendor_tvb;
+ /* 7.3.2.1 SSID element (0) */
+ gchar *ssid; /* The SSID may consist of arbitrary bytes */
+ gint ssid_len = tag_len;
- if (tag_len < 4)
- return;
+ if (beacon_padding != 0) /* padding bug */
+ return offset;
- subtype = tvb_get_guint8(tag_tvb, 3);
- proto_item_append_text(item, ": %s", val_to_str_const(subtype, wfa_subtype_vals, "Unknown"));
- vendor_tvb = tvb_new_subset_length(tag_tvb, offset + 4, tag_len - 4);
- dissector_try_uint_new(wifi_alliance_ie_table, subtype, vendor_tvb, pinfo, item, FALSE, NULL);
-}
+ if (ssid_len > MAX_SSID_LEN) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "SSID length (%u) greater than maximum (%u)",
+ ssid_len, MAX_SSID_LEN);
+ ssid_len = MAX_SSID_LEN;
+ }
-static void
-dissect_vendor_ie_rsn(proto_item * item, proto_tree * tree, tvbuff_t * tvb, int offset, guint32 tag_len)
-{
+ /*
+ * XXX - the 802.11 specs aren't particularly clear on how the SSID
+ * is to be interpreted.
+ *
+ * IEEE Std 802.11-1999, section 7.3.2.2 "Service Set Identity (SSID)
+ * element" says just
+ *
+ * The length of the SSID information field is between 0 and 32
+ * octets. A 0 length information field indicates the broadcast SSID.
+ *
+ * with no indication that those octets encode a string.
+ *
+ * IEEE Std 802.11-2012, section 8.4.2.2 "SSID element", says that *but*
+ * says after it
+ *
+ * When the UTF-8 SSID subfield of the Extended Capabilities element
+ * is equal to 1 in the frame that includes the SSID element, the
+ * SSID is interpreted using UTF-8 encoding.
+ *
+ * NOTE -- This is true for Beacon and Probe Response frames when the
+ * MLME-START.request primitive was issued with the SSIDEncoding
+ * parameter equal to UTF-8.
+ *
+ * and the SSIDEncoding parameter can either be UNSPECIFIED or UTF-8.
+ *
+ * So I *guess* that means that, if the UTF-8 SSID subfield isn't
+ * equal to 1, the SSID is, in theory, just a bunch of octets, but
+ * in practice, *probably* ASCII as that's the typical convention,
+ * and, if it is equal to 1, it's a UTF-8 string. (Of course, a
+ * host can put anything there it wants to, so we shouldn't just
+ * assume that it's *valid* ASCII or *valid* UTF-8.)
+ *
+ * So we really should extract it as an array of ssid_len bytes,
+ * pass those bytes to Dot11DecryptSetLastSSID(), and:
+ *
+ * If the UTF-8 SSID subfield isn't set to 1, put the SSID in
+ * as an ENC_ASCII string;
+ *
+ * If the UTF-8 SSID subfield is set to 1, put it in as an
+ * ENC_UTF_8 string;
+ *
+ * and rely on the libwireshark core code to somehow deal with
+ * non-ASCII characters or invalid UTF-8 sequences or valid-but-
+ * not-all-printable ASCII or UTF-8 strings in the protocol tree
+ * display. I'm not sure we can currently rely on it to handle
+ * invalid UTF-8 or non-printable characters in UTF-8 strings,
+ * however, so we just treat it as ASCII for now.
+ *
+ * We also need a better way of getting the display format of a
+ * string value, so we can do something other than run it through
+ * format_text(), which won't handle UTF-8.
+ *
+ * Addendum: 802.11 2012 points out that a Zero-length SSID means
+ * the Wildcard SSID. Make it so. From 8.4.2.2 of 802.11 2012:
+ *
+ * "The length of the SSID field is between 0 and 32 octets. A SSID
+ * field of length 0 is used within Probe Request management frames to
+ * indicate the wildcard SSID. The wildcard SSID is also used in
+ * Beacon and Probe Response frames transmitted by mesh STAs."
+ *
+ * Also, we have to return a non-zero value here to prevent an ugly
+ * undissected field warning. Since this code is only called from
+ * one place and is used in call to dissector_try_uint_new, it is
+ * OK to do so.
+ */
+ ssid = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, ssid_len, ENC_ASCII);
+ if (ssid_len == (gint)tag_len) {
+ Dot11DecryptSetLastSSID(&dot11decrypt_ctx, (CHAR *) ssid, ssid_len);
+ }
+ proto_tree_add_item(tree, hf_ieee80211_tag_ssid, tvb, offset, tag_len,
+ ENC_ASCII|ENC_NA);
- switch(tvb_get_guint8(tvb, offset)){
- case 4:
- {
- /* IEEE 802.11i / Key Data Encapsulation / Data Type=4 - PMKID.
- * This is only used within EAPOL-Key frame Key Data. */
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_rsn_ie_pmkid, tvb, offset, 16, ENC_NA);
- }
- break;
- default:
- proto_tree_add_item(tree, hf_ieee80211_rsn_ie_unknown, tvb, offset, tag_len, ENC_NA);
- break;
+ if (ssid_len > 0) {
+ gchar* s = format_text(wmem_packet_scope(), ssid, ssid_len);
+ proto_item_append_text(field_data->item_tag, ": %s", s);
+
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", SSID=%s", s);
+
+ /* Wlan Stats */
+ memcpy(wlan_stats.ssid, ssid, MIN(ssid_len, MAX_SSID_LEN));
+ wlan_stats.ssid_len = ssid_len;
+ } else {
+ proto_item_append_text(field_data->item_tag, ": Wildcard SSID");
+
+ col_append_str(pinfo->cinfo, COL_INFO, ", SSID=Wildcard (Broadcast)");
+ offset += 1; // Make sure we return non-zero
}
- proto_item_append_text(item, ": RSN");
+ beacon_padding += 1; /* padding bug */
+ return offset + tag_len;
}
-typedef enum {
- MARVELL_IE_MESH = 4
-} marvell_ie_type_t;
+static void
+dissect_he_capabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int offset, int len);
static void
-dissect_vendor_ie_marvell(proto_item *item _U_, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len)
+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)
{
- guint8 type;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ guint8 sub_tag_id;
+ guint32 sub_tag_length;
+ proto_item *parent_item;
+ proto_tree *bssid_info_subtree, *bssid_info_cap_subtree, *sub_tag_tree;
+ tvbuff_t *sub_tag_tvb = NULL;
- type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ if (tag_len < 13) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Neighbor Report length %u wrong, must be > 13", tag_len);
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+
+ /*** Begin: BSSID Information ***/
+
+ parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_bssid_info, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ bssid_info_subtree = proto_item_add_subtree(parent_item, ett_tag_neighbor_report_bssid_info_tree);
+
+ proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_reachability, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_security, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_key_scope, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ parent_item = proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ bssid_info_cap_subtree = proto_item_add_subtree(parent_item, ett_tag_neighbor_report_bssid_info_capability_tree);
+ proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ 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;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_ope_class, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- switch (type) {
- case MARVELL_IE_MESH:
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_subtype, tvb,
- offset++, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_version, tvb,
- offset++, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_active_proto_id, tvb,
- offset++, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_active_metric_id, tvb,
- offset++, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_mesh_cap, tvb,
- offset++, 1, ENC_LITTLE_ENDIAN);
- break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- default:
- proto_tree_add_item(ietree, hf_ieee80211_marvell_ie_data, tvb, offset,
- tag_len - 1, ENC_NA);
- break;
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_phy_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ /* The Optional Subelements field format contains zero or more subelements */
+ if (tag_len == 13){ /* tag_len == 13 => no Subelements */
+ return tvb_captured_length(tvb);
}
-}
-typedef enum {
- ATHEROS_IE_ADVCAP = 1,
- ATHEROS_IE_XR = 3
-} atheros_ie_type_t;
+ while (offset < tag_len)
+ {
-typedef enum {
- ATHEROS_IE_ADVCAP_S = 1
-} atheros_ie_advcap_subtype_t;
+ sub_tag_id = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
-typedef enum {
- ATHEROS_IE_XR_S = 1
-} atheros_ie_xr_subtype_t;
+ sub_tag_length = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ sub_tag_tvb = tvb_new_subset_length(tvb, offset, sub_tag_length);
-typedef enum {
- ATHEROS_IE_CAP_TURBOP = 0x01,
- ATHEROS_IE_CAP_COMP = 0x02,
- ATHEROS_IE_CAP_FF = 0x04,
- ATHEROS_IE_CAP_XR = 0x08,
- ATHEROS_IE_CAP_AR = 0x10,
- ATHEROS_IE_CAP_BURST = 0x20,
- ATHEROS_IE_CAP_WME = 0x40,
- ATHEROS_IE_CAP_BOOST = 0x80
-} atheros_ie_cap_t;
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_data, tvb, offset, sub_tag_length, ENC_NA);
-static const value_string atheros_ie_type_vals[] = {
- { ATHEROS_IE_ADVCAP, "Advanced Capability"},
- { ATHEROS_IE_XR, "eXtended Range"},
- { 0, NULL }
-};
+ switch (sub_tag_id) {
+ case NR_SUB_ID_TSF_INFO:
+ /* TODO */
+ break;
+ case NR_SUB_ID_MEASUREMENT_PILOT_INFO:
+ /* TODO */
+ break;
+ case NR_SUB_ID_BSS_TRN_CAN_PREF:
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref, tvb, offset, 1, ENC_NA);
+ break;
+ case NR_SUB_ID_BSS_TER_DUR:
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf, tvb, offset, 8, ENC_NA);
-static const int *ieee80211_atheros_ie_cap[] = {
- &hf_ieee80211_atheros_ie_cap_f_turbop,
- &hf_ieee80211_atheros_ie_cap_f_comp,
- &hf_ieee80211_atheros_ie_cap_f_ff,
- &hf_ieee80211_atheros_ie_cap_f_xr,
- &hf_ieee80211_atheros_ie_cap_f_ar,
- &hf_ieee80211_atheros_ie_cap_f_burst,
- &hf_ieee80211_atheros_ie_cap_f_wme,
- &hf_ieee80211_atheros_ie_cap_f_boost,
- NULL
-};
+ proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_dur, tvb, offset+8, 2, ENC_NA);
+ break;
+ case NR_SUB_ID_HT_CAPABILITIES:
+ sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
+ ett_tag_neighbor_report_sub_tag_tree, NULL, "HT Capabilities");
+ dissect_ht_capability_ie_common(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_length, field_data->item_tag_length, FALSE);
+ break;
+ case NR_SUB_ID_HT_OPERATION:
+ sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
+ ett_tag_neighbor_report_sub_tag_tree, NULL, "HT Information");
+ dissect_ht_info_ie_1_1(sub_tag_tvb, pinfo, sub_tag_tree, data);
+ break;
+ case NR_SUB_ID_SEC_CHANNEL_OFFSET:
+ sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
+ 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;
+ }
-static void
-dissect_vendor_ie_atheros(proto_item *item _U_, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint tag_len,
- packet_info *pinfo, proto_item *ti_len)
-{
- guint8 type;
- guint8 subtype;
- guint8 version;
+ offset += sub_tag_length;
+ }
- if (tag_len <= 3) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 6", tag_len+3); /* Add length of OUI to tag_length */
- return;
+ return offset;
+}
+
+static int
+ieee80211_tag_supp_rates(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;
+ /* 7.3.2.2 Supported Rates element (1) */
+ 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);
+ return offset;
}
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_type, tvb, offset, 1, ENC_NA);
- type = tvb_get_guint8(tvb, offset);
- proto_item_append_text(item, ": %s", val_to_str_const(type, atheros_ie_type_vals, "Unknown"));
- offset += 1;
- tag_len -= 1;
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_subtype, tvb, offset, 1, ENC_NA);
- subtype = tvb_get_guint8(tvb, offset);
- offset += 1;
- tag_len -= 1;
+ while (offset < tag_len) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_supp_rates, tvb, offset, 1,
+ ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " %s,",
+ val_to_str_ext_const(tvb_get_guint8(tvb, offset),
+ &ieee80211_supported_rates_vals_ext,
+ "Unknown Rate"));
+ offset += 1;
+ }
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_version, tvb, offset, 1, ENC_NA);
- version = tvb_get_guint8(tvb, offset);
- offset += 1;
- tag_len -= 1;
+ proto_item_append_text(field_data->item_tag, " [Mbit/sec]");
- if (version == 0)
- {
- switch (type) {
- case ATHEROS_IE_ADVCAP:
- {
- switch (subtype) {
- case ATHEROS_IE_ADVCAP_S:
- {
- proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_advcap_cap,
- ett_ath_cap_tree, ieee80211_atheros_ie_cap,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
- tag_len -= 1;
+ return offset;
+}
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_advcap_defkey, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- tag_len -= 2;
- break;
- }
- default:
- /* No default Action */
- break;
- } /* End switch (subtype) */
- break;
- }
- case ATHEROS_IE_XR:
- {
- switch (subtype) {
- case ATHEROS_IE_XR_S:
- {
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_info, tvb, offset, 1, ENC_NA);
- offset += 1;
- tag_len -= 1;
+static int
+ieee80211_tag_fh_parameter(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;
+ /* 7.3.2.3 FH Parameter Set element (2) */
+ if (tag_len < 5) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u too short, must be >= 5", tag_len);
+ return 1;
+ }
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_base_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
- tag_len -= 6;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_dwell_time,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_xr_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
- tag_len -= 6;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_set,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_xr_xr_beacon, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- tag_len -= 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_pattern,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_xr_base_cap,
- ett_ath_cap_tree, ieee80211_atheros_ie_cap,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
- tag_len -= 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_index,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_bitmask_with_flags(ietree, tvb, offset, hf_ieee80211_atheros_ie_xr_xr_cap,
- ett_ath_cap_tree, ieee80211_atheros_ie_cap,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
- tag_len -= 1;
- break;
- }
- default:
- /* No default Action */
- break;
- } /* End switch (subtype) */
- break;
- default:
- /* No default Action */
- break;
- } /* End switch (type) */
+ return offset;
+}
- }
- }
- if (tag_len > 0) {
- proto_tree_add_item(ietree, hf_ieee80211_atheros_ie_data, tvb, offset, tag_len, ENC_NA);
+static int
+ieee80211_tag_ds_parameter(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;
+ /* 7.3.2.4 DS Parameter Set element (3) */
+ if (tag_len != 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u wrong, must be = 1", tag_len);
+ return 1;
}
-}
-typedef enum {
- AIRONET_IE_DTPC = 0,
- AIRONET_IE_UNKNOWN1 = 1,
- AIRONET_IE_VERSION = 3,
- AIRONET_IE_QOS,
- AIRONET_IE_UNKNOWN11 = 11,
- AIRONET_IE_QBSS_V2 = 14,
- AIRONET_IE_CLIENT_MFP = 20
-} aironet_ie_type_t;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ds_param_channel,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
-static const value_string aironet_ie_type_vals[] = {
- { AIRONET_IE_DTPC, "DTPC"},
- { AIRONET_IE_UNKNOWN1, "Unknown (1)"},
- { AIRONET_IE_VERSION, "CCX version"},
- { AIRONET_IE_QOS, "Qos"},
- { AIRONET_IE_UNKNOWN11, "Unknown (11)"},
- { AIRONET_IE_QBSS_V2, "QBSS V2 - CCA"},
- { AIRONET_IE_CLIENT_MFP, "Client MFP"},
- { 0, NULL }
-};
+ proto_item_append_text(field_data->item_tag, ": Current Channel: %u",
+ tvb_get_guint8(tvb, offset));
-static const value_string aironet_mfp_vals[] = {
- { 0, "Disabled"},
- { 1, "Enabled"},
- { 0, NULL }
-};
+ wlan_stats.channel = tvb_get_guint8(tvb, offset);
+ offset += 1;
-static void
-dissect_vendor_ie_aironet(proto_item *aironet_item, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len)
+ return offset;
+}
+
+static int
+ieee80211_tag_cf_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint8 type;
- int i;
- gboolean dont_change = FALSE; /* Don't change the IE item text to default */
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ /* 7.3.2.5 CF Parameter Set element (4) */
+ if (tag_len != 6) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u wrong, must be = 6", tag_len);
+ return offset;
+ }
- type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_cfp_count,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": CFP count %u", tvb_get_guint8(tvb, offset));
offset += 1;
- switch (type) {
- case AIRONET_IE_DTPC:
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_dtpc, tvb, offset, 1, ENC_NA);
- proto_item_append_text(aironet_item, ": Aironet DTPC Powerlevel %ddBm", tvb_get_guint8(tvb, offset));
- offset += 1;
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_dtpc_unknown, tvb, offset, 1, ENC_NA);
- dont_change = TRUE;
- break;
- case AIRONET_IE_VERSION:
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(aironet_item, ": Aironet CCX version = %d", tvb_get_guint8(tvb, offset));
- dont_change = TRUE;
- break;
- case AIRONET_IE_QOS:
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_qos_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_qos_paramset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_cfp_period,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": CFP Period %u", tvb_get_guint8(tvb, offset));
+ offset += 1;
- /* XXX: just copied over from WME. Maybe "Best Effort" and "Background"
- * need to be swapped. Also, the "TXOP" may be TXOP - or not.
- */
- for (i = 0; i < 4; i++) {
- guint8 byte1, byte2;
- guint16 txop;
- byte1 = tvb_get_guint8(tvb, offset);
- byte2 = tvb_get_guint8(tvb, offset + 1);
- txop = tvb_get_letohs(tvb, offset + 2);
- proto_tree_add_bytes_format(ietree, hf_ieee80211_aironet_ie_qos_val, tvb, offset, 4, NULL,
- "CCX QoS Parameters: ACI %u (%s), Admission Control %sMandatory, AIFSN %u, ECWmin %u, ECWmax %u, TXOP %u",
- (byte1 & 0x60) >> 5, val_to_str((byte1 & 0x60) >> 5, wme_acs, "(Unknown: %d)"),
- (byte1 & 0x10) ? "" : "not ", byte1 & 0x0f,
- byte2 & 0x0f, (byte2 & 0xf0) >> 4,
- txop);
- offset += 4;
- }
- break;
- case AIRONET_IE_QBSS_V2:
- /* Extract Values */
- proto_tree_add_item(ietree, hf_ieee80211_qbss2_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_qbss2_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_qbss2_cal, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ietree, hf_ieee80211_qbss2_gl, tvb, offset + 4, 1, ENC_LITTLE_ENDIAN);
- break;
- case AIRONET_IE_CLIENT_MFP:
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_clientmfp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(aironet_item, ": Aironet Client MFP %s",
- val_to_str_const(1 & tvb_get_guint8(tvb, offset), aironet_mfp_vals, "Unknown"));
- dont_change = TRUE;
- break;
- default:
- proto_tree_add_item(ietree, hf_ieee80211_aironet_ie_data, tvb, offset,
- tag_len - 1, ENC_NA);
- break;
- }
- if (!dont_change) {
- proto_item_append_text(aironet_item, ": Aironet %s (%d)",
- val_to_str_const(type, aironet_ie_type_vals, "Unknown"), type);
- }
+ proto_tree_add_item(tree, hf_ieee80211_tag_cfp_max_duration,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": CFP Max Duration %u",
+ tvb_get_letohs(tvb, offset));
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_cfp_dur_remaining,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": CFP Dur Remaining %u",
+ tvb_get_letohs(tvb, offset));
+ offset += 1;
+
+ return offset;
}
-#define ARUBA_APNAME 3
-static const value_string ieee80211_vs_aruba_subtype_vals[] = {
- { ARUBA_APNAME, "AP Name"},
- { 0, NULL }
-};
-static void
-dissect_vendor_ie_aruba(proto_item *item, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len)
+static int
+ieee80211_tag_tim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint8 type;
- const guint8* name;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ guint aid, pvb_len, n1, i, j, byte;
+ static const int *ieee80211_tim_bmapctl[] = {
+ &hf_ieee80211_tim_bmapctl_mcast,
+ &hf_ieee80211_tim_bmapctl_offset,
+ NULL
+ };
- offset += 1; /* VS OUI Type */
- tag_len -= 1;
+ /* 802.11-2012: 8.4.2.7 TIM element (5) */
+ if (tag_len < 4) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u too short, must be >= 4", tag_len);
+ return 1;
+ }
- type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_subtype, tvb, offset, 1, ENC_NA);
- proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_aruba_subtype_vals, "Unknown"));
+ proto_tree_add_item(tree, hf_ieee80211_tim_dtim_count,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": DTIM %u of", tvb_get_guint8(tvb, offset));
offset += 1;
- tag_len -= 1;
- switch (type) {
- case ARUBA_APNAME:
- offset += 1;
- tag_len -= 1;
+ proto_tree_add_item(tree, hf_ieee80211_tim_dtim_period,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " %u bitmap", tvb_get_guint8(tvb, offset + 1));
+ offset += 1;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tim_bmapctl,
+ ett_tag_bmapctl_tree, ieee80211_tim_bmapctl,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ pvb_len = tag_len - 3;
+ n1 = tvb_get_guint8(tvb, offset) & 0xFE;
+ offset += 1;
+
+ proto_tree_add_item(tree, hf_ieee80211_tim_partial_virtual_bitmap,
+ tvb, offset, pvb_len, ENC_NA);
+ /* FIXME: Handles dot11MgmtOptionMultiBSSIDActivated = false only */
+ for (i = 0; i < pvb_len; i++) {
+ byte = tvb_get_guint8(tvb, offset + i);
+ for (j = 0; j < 8; j++) {
+ if (byte & (1 << j)) {
+ aid = 8*n1 + 8*i + j;
+ proto_tree_add_uint(tree, hf_ieee80211_tim_aid, tvb, offset + i, 1, aid);
+ }
+ }
+ }
+ offset += pvb_len;
+
+ return offset;
+}
- proto_tree_add_item_ret_string(ietree, hf_ieee80211_vs_aruba_apname, tvb,
- offset, tag_len, ENC_ASCII|ENC_NA, wmem_packet_scope(), &name);
- proto_item_append_text(item, " (%s)", name);
- break;
+static int
+ieee80211_tag_ibss_parameter(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;
+ /* 7.3.2.7 IBSS Parameter Set element (6) */
- default:
- proto_tree_add_item(ietree, hf_ieee80211_vs_aruba_data, tvb, offset,
- tag_len, ENC_NA);
- proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, tag_len));
- break;
+ if (tag_len != 2) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u wrong, must be = 2", tag_len);
+ return 1;
}
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_ibss_atim_window,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": ATIM window 0x%x",
+ tvb_get_letohs(tvb, offset));
+ offset += 2;
+
+ return offset;
}
-static void
-dissect_vendor_ie_mikrotik(proto_item *item _U_, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len)
+static const value_string environment_vals[] = {
+ { 0x20, "Any" },
+ { 0x4f, "Outdoor" },
+ { 0x49, "Indoor" },
+ { 0, NULL }
+};
+
+static int
+ieee80211_tag_country_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint8 type, length;
- proto_item *subitem;
- proto_tree *subtree;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ /* 7.3.2.9 Country information element (7) */
+ proto_tree *sub_tree;
+ proto_item *sub_item;
+ const guint8* country_code;
- offset += 1; /* VS OUI Type */
- tag_len -= 1;
- /* FIXME: Make sure we have at least 2 bytes left */
- proto_tree_add_item(ietree, hf_ieee80211_vs_mikrotik_unknown, tvb, offset, 2, ENC_NA);
+ if (tag_len < 6) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u too short, must be >= 6", tag_len);
+ return 1;
+ }
+ proto_tree_add_item_ret_string(tree, hf_ieee80211_tag_country_info_code,
+ tvb, offset, 2, ENC_ASCII|ENC_NA, wmem_packet_scope(), &country_code);
+ proto_item_append_text(field_data->item_tag, ": Country Code %s", country_code);
offset += 2;
- tag_len -= 2;
- while (tag_len >= 2) {
- type = tvb_get_guint8(tvb, offset);
- length = tvb_get_guint8(tvb, offset+1);
- subitem = proto_tree_add_item(ietree, hf_ieee80211_vs_mikrotik_subitem, tvb, offset, length+2, ENC_NA);
- subtree = proto_item_add_subtree(subitem, ett_mikrotik);
- proto_item_set_text(subitem, "Sub IE (T/L: %d/%d)", type, length);
+ proto_tree_add_item(tree, hf_ieee80211_tag_country_info_env,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ", Environment %s",
+ val_to_str(tvb_get_guint8(tvb, offset),
+ environment_vals, "Unknown (0x%02x)"));
+ offset += 1;
- proto_tree_add_item(subtree, hf_ieee80211_vs_mikrotik_subtype, tvb, offset, 1, ENC_NA);
- offset += 1;
- tag_len -= 1;
+ while (offset < tag_len) {
+ /* Padding ? */
+ if ((tag_len - offset) < 3) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_country_info_pad,
+ tvb, offset, 1, ENC_NA);
+ offset += 1;
+ continue;
+ }
+ if (tvb_get_guint8(tvb, offset) <= 200) { /* 802.11d */
+ sub_item = proto_tree_add_item(tree, hf_ieee80211_tag_country_info_fnm,
+ tvb, offset, 3, ENC_NA);
+ sub_tree = proto_item_add_subtree(sub_item, ett_tag_country_fnm_tree);
- proto_tree_add_item(subtree, hf_ieee80211_vs_mikrotik_sublength, tvb, offset, 1, ENC_NA);
- offset += 1;
- tag_len -= 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_fcn,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(sub_item, ": First Channel Number: %u",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_nc,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(sub_item, ", Number of Channels: %u",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_mtpl,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(sub_item,
+ ", Maximum Transmit Power Level: %d dBm",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
+ } else { /* 802.11j */
+ sub_item = proto_tree_add_item(tree, hf_ieee80211_tag_country_info_rrc,
+ tvb, offset, 3, ENC_NA);
+ sub_tree = proto_item_add_subtree(sub_item, ett_tag_country_rcc_tree);
- if (tag_len < length)
- /* FIXME: warn about this */
- length = tag_len;
- if (length == 0) {
- break;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_oei,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(sub_item,
+ ": Operating Extension Identifier: %u",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_oc,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(sub_item, ", Operating Class: %u",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_cc,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(sub_item, ", Coverage Class: %u",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
}
-
- proto_tree_add_item(subtree, hf_ieee80211_vs_mikrotik_subdata, tvb, offset, length, ENC_NA);
- offset += length;
- tag_len -= length;
}
-}
-
-enum vs_nintendo_type {
- NINTENDO_SERVICES = 0x11,
- NINTENDO_CONSOLEID = 0xF0
-};
-static const value_string ieee80211_vs_nintendo_type_vals[] = {
- { NINTENDO_SERVICES, "Services"},
- { NINTENDO_CONSOLEID, "ConsoleID"},
- { 0, NULL }
-};
+ return offset;
+}
-static proto_tree*
-dissect_vendor_ie_nintendo_tlv(const int hfindex, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 sublen)
+static int
+ieee80211_tag_fh_hopping_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- proto_item *nintendo_item;
- proto_tree *nintendo_tree;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
- nintendo_item = proto_tree_add_item(ietree, hfindex, tvb, offset, sublen, ENC_NA);
- nintendo_tree = proto_item_add_subtree(nintendo_item, ett_nintendo);
+ /* 7.3.2.10 Hopping Pattern Parameters information element (8) */
+ if (tag_len < 2) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u too short, must be >= 2", tag_len);
+ return 1;
+ }
- proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_type, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_length, tvb, offset + 1, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_parameter_prime_radix,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": Prime Radix: %u", tvb_get_guint8(tvb, offset));
+ offset += 1;
- return nintendo_tree;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_parameter_nb_channels,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ", Number of Channels: %u",
+ tvb_get_guint8(tvb, offset));
+ offset += 1;
+
+ return offset;
}
-static void
-dissect_vendor_ie_nintendo(proto_item *item _U_, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len)
+static int
+ieee80211_tag_fh_hopping_table(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- proto_tree *nintendo_tree;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
- guint8 subtype;
- guint8 sublength;
- guint32 length = tag_len;
+ /* 7.3.2.11 Hopping Pattern Table information element (9) */
+ if (tag_len < 4) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u too short, must be >= 4", tag_len);
+ return 1;
+ }
- /* Skip OUI type for now - the code is for type 1 (StreetPass) only */
- /* http://3dbrew.org/wiki/StreetPass */
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_flag,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- length -= 1;
- while(length > 0 && length < 256) { /* otherwise we are < 0 but on unsigned */
- subtype = tvb_get_guint8(tvb, offset);
- sublength = tvb_get_guint8(tvb, offset + 1);
-
- switch(subtype) {
- case NINTENDO_SERVICES:
- nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_servicelist, ietree, tvb, offset, sublength + 2);
- offset += 2;
- length -= 2;
-
- while (sublength > 4) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_number_of_sets,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_service, tvb, offset, 5, ENC_NA);
- offset += 5;
- length -= 5;
- sublength -= 5;
- }
- break;
- case NINTENDO_CONSOLEID:
- nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_consoleid, ietree, tvb, offset, sublength + 2);
- offset += + 2;
- length -= + 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_modulus,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_consoleid, tvb, offset, sublength, ENC_NA);
- offset += sublength;
- length -= sublength;
- break;
- default:
- nintendo_tree = dissect_vendor_ie_nintendo_tlv(hf_ieee80211_vs_nintendo_unknown, ietree, tvb, offset, sublength + 2);
- offset += + 2;
- length -= + 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_offset,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
- proto_tree_add_item(nintendo_tree, hf_ieee80211_vs_nintendo_unknown, tvb, offset, sublength, ENC_NA);
- offset += sublength;
- length -= sublength;
- break;
- }
+ while (offset < tag_len) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_random_table,
+ tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
}
+
+ return offset;
}
-static void
-dissect_vendor_ie_meru(proto_item *item _U_, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len,
- packet_info *pinfo)
+int
+add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, int ftype,
+ const guint8 *valid_element_ids, guint valid_element_ids_count,
+ association_sanity_check_t *association_sanity_check)
{
- guint32 type, length;
- proto_item *subitem, *ti_len;
- proto_tree *subtree;
-
- while (tag_len >= 2) {
- subitem = proto_tree_add_item(ietree, hf_ieee80211_vs_meru_subitem, tvb, offset, 2, ENC_NA);
- subtree = proto_item_add_subtree(subitem, ett_meru);
+ tvbuff_t *tag_tvb;
+ guint32 tag_no, tag_len;
+ guint32 ext_tag_no, ext_tag_len;
+ proto_tree *orig_tree = tree;
+ proto_item *ti = NULL;
+ proto_item *ti_len, *ti_tag;
+ ieee80211_tagged_field_data_t field_data;
+ gboolean isDMG;
- proto_tree_add_item_ret_uint(subtree, hf_ieee80211_vs_meru_subtype, tvb, offset, 1, ENC_NA, &type);
- offset += 1;
- tag_len -= 1;
+ isDMG = GPOINTER_TO_INT(p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY));
- ti_len = proto_tree_add_item_ret_uint(subtree, hf_ieee80211_vs_meru_sublength, tvb, offset, 1, ENC_NA, &length);
- offset += 1;
- tag_len -= 1;
+ tag_no = tvb_get_guint8(tvb, offset);
+ tag_len = tvb_get_guint8(tvb, offset + 1);
- if (tag_len < length) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < Sub Length");
- length = tag_len;
+ if (tree) {
+ if (tag_no == TAG_ELEMENT_ID_EXTENSION) {
+ ext_tag_no = tvb_get_guint8(tvb, offset + 2);
+ ti = proto_tree_add_item(orig_tree, hf_ieee80211_ext_tag, tvb, offset + 2, tag_len , ENC_NA);
+ proto_item_append_text(ti, ": %s", val_to_str_ext(ext_tag_no, &tag_num_vals_eid_ext_ext, "Reserved (%d)"));
+ } else {
+ ti = proto_tree_add_item(orig_tree, hf_ieee80211_tag, tvb, offset, 2 + tag_len , ENC_NA);
+ proto_item_append_text(ti, ": %s", val_to_str_ext(tag_no, &tag_num_vals_ext, "Reserved (%d)"));
}
- proto_item_append_text(subitem, " (t=%d, l=%d)", type, length);
- proto_item_set_len(subitem, 2+length);
+ tree = proto_item_add_subtree(ti, ett_80211_mgt_ie);
- proto_tree_add_item(subtree, hf_ieee80211_vs_meru_subdata, tvb, offset, length, ENC_NA);
- offset += length;
- tag_len -= length;
+ }
+ if (tag_no == TAG_ELEMENT_ID_EXTENSION) {
+ ext_tag_len = tag_len - 1;
+ ti_tag = proto_tree_add_item(tree, hf_ieee80211_ext_tag_number, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ ti_len = proto_tree_add_uint(tree, hf_ieee80211_ext_tag_length, tvb, offset + 1, 1, ext_tag_len);
+ } else {
+ ti_tag = proto_tree_add_item(tree, hf_ieee80211_tag_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ ti_len = proto_tree_add_uint(tree, hf_ieee80211_tag_length, tvb, offset + 1, 1, tag_len);
+ }
+ if (tag_len > (guint)tvb_reported_length_remaining(tvb, offset)) {
+ expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
+ "Tag Length is longer than remaining payload");
}
-}
-static const value_string ieee80211_vs_extreme_subtype_vals[] = {
- { 1, "AP Name"},
- { 0, NULL }
-};
+ /* If the list of valid elements is restricted, require an Element ID to be
+ * present in that list. Otherwise stop decoding the value to prevent possible
+ * infinite recursions due to unexpected elements. */
+ if (valid_element_ids_count) {
+ gboolean valid_tag_no = FALSE;
+ guint i;
-static void
-dissect_vendor_ie_extreme(proto_item *item _U_, proto_tree *ietree,
- tvbuff_t *tvb, int offset, guint32 tag_len,
- packet_info *pinfo)
-{
- guint32 type, length;
- proto_item *ti_len;
+ for (i = 0; i < valid_element_ids_count; i++) {
+ valid_tag_no = valid_element_ids[i] == tag_no;
+ if (valid_tag_no)
+ break;
+ }
+ if (!valid_tag_no) {
+ expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_number,
+ "Unexpected Element ID %d", tag_no);
+ return tag_len + 1 + 1;
+ }
+ }
- proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_extreme_subtype, tvb, offset, 1, ENC_NA, &type);
- offset += 1;
- tag_len -= 1;
+ tag_tvb = tvb_new_subset_length(tvb, offset+2, tag_len);
+ field_data.sanity_check = association_sanity_check;
+ field_data.ftype = ftype;
+ field_data.isDMG = isDMG;
+ field_data.item_tag = ti;
+ field_data.item_tag_length = ti_len;
+ if (!dissector_try_uint_new(tagged_field_table, tag_no, tag_tvb, pinfo, tree, FALSE, &field_data))
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_data, tvb, offset + 1 + 1, tag_len, ENC_NA);
+ expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_data,
+ "Dissector for 802.11 IE Tag"
+ " (%s) code not implemented, Contact"
+ " Wireshark developers if you want this supported", val_to_str_ext(tag_no,
+ &tag_num_vals_ext, "(%d)"));
+ proto_item_append_text(ti, ": Undecoded");
+ }
- proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_subdata, tvb, offset, tag_len, ENC_NA);
+ return tag_len + 1 + 1;
+}
- switch(type){
- case 1: /* Unknown (7 bytes) + AP Name Length (1 byte) + AP Name */
+/* 7.3.2.12 Request information element (10) */
+static int
+ieee80211_tag_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
- proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_unknown, tvb, offset, 7, ENC_NA);
- offset += 7;
- tag_len -= 1;
+ while (offset < tag_len)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ }
+ return ((tag_len > 0) ? tag_len : 1);
+}
- ti_len = proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_extreme_ap_length, tvb, offset, 1, ENC_NA, &length);
- offset += 1;
- tag_len -= 1;
+/* 7.3.2.28 BSS Load element (11) */
+/* 8.4.2.30 in 802.11-2012 */
+static int
+ieee80211_tag_qbss_load(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;
- if (tag_len < length) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Tag length < AP Length");
- length = tag_len;
- }
+ if ((tag_len < 4) || (tag_len > 5))
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4 or 5", tag_len);
+ return tvb_captured_length(tvb);
+ }
- proto_tree_add_item(ietree, hf_ieee80211_vs_extreme_ap_name, tvb, offset, length, ENC_ASCII|ENC_NA);
+ if (tag_len == 4)
+ {
+ /* QBSS Version 1 */
+ proto_item_append_text(field_data->item_tag, " Cisco QBSS Version 1 - non CCA");
- break;
- default:
- /* Expert info ? */
- break;
+ /* Extract Values */
+ proto_tree_add_uint(tree, hf_ieee80211_qbss_version, tvb, offset, tag_len, 1);
+ proto_tree_add_item(tree, hf_ieee80211_qbss_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_qbss_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_qbss_adc, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ }
+ else if (tag_len == 5)
+ {
+ proto_item *base_item;
+
+ /* QBSS Version 2 */
+ proto_item_append_text(field_data->item_tag, " 802.11e CCA Version");
+
+ /* Extract Values */
+ proto_tree_add_uint(tree, hf_ieee80211_qbss_version, tvb, offset, tag_len, 2);
+ proto_tree_add_item(tree, hf_ieee80211_qbss_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ base_item = proto_tree_add_item(tree, hf_ieee80211_qbss_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(base_item, " (%d%%)", 100*tvb_get_guint8(tvb, offset + 2)/255);
+ base_item = proto_tree_add_item(tree, hf_ieee80211_qbss_adc, tvb, offset + 3, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(base_item, " (%d us/s)", tvb_get_letohs(tvb, offset + 3)*32);
}
+
+ return tvb_captured_length(tvb);
}
-/* 802.11-2012 8.4.2.37 QoS Capability element */
+/* 8.4.2.31 in 802-11-2012 */
static int
-dissect_qos_capability(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
+ieee80211_tag_edca_param_set(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- switch (ftype) {
- case MGT_ASSOC_REQ:
- case MGT_PROBE_REQ:
- case MGT_REASSOC_REQ:
- {
- /* To AP so decode Qos Info as STA */
- offset += add_ff_qos_info_sta(tree, tvb, pinfo, offset);
- break;
- }
-
- case MGT_BEACON:
- case MGT_PROBE_RESP:
- case MGT_ASSOC_RESP:
- case MGT_REASSOC_RESP:
- {
- /* From AP so decode QoS Info as AP */
- offset += add_ff_qos_info_ap(tree, tvb, pinfo, offset);
- break;
- }
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
- default:
- expert_add_info_format(pinfo, proto_tree_get_parent(tree), &ei_ieee80211_qos_info_bad_ftype,
- "Could not deduce direction to decode correctly, ftype %u", ftype);
- break;
+ if ((tag_len != 18))
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 18", tag_len);
+ return tvb_captured_length(tvb);
}
- return offset;
+ decode_qos_parameter_set(tree, tvb, pinfo, offset, field_data->ftype);
+
+ return tvb_captured_length(tvb);
}
-/* 7.3.2.25 RSN information element */
+/* TSPEC element (13) */
static int
-dissect_rsn_ie(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb,
- int offset, guint32 tag_len, association_sanity_check_t *association_sanity_check)
+ieee80211_tag_tspec(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- proto_item *rsn_gcs_item, *rsn_pcs_item, *rsn_akms_item, *rsn_pmkid_item, *rsn_gmcs_item;
- proto_item *rsn_sub_pcs_item, *rsn_sub_akms_item;
- proto_item *rsn_pcs_count, *rsn_akms_count, *rsn_pmkid_count;
- proto_tree *rsn_gcs_tree, *rsn_pcs_tree, *rsn_akms_tree, *rsn_pmkid_tree, *rsn_gmcs_tree;
- proto_tree *rsn_sub_pcs_tree, *rsn_sub_akms_tree;
- guint16 pcs_count, akms_count, pmkid_count;
- guint ii;
- int tag_end = offset + tag_len;
- static const int *ieee80211_rsn_cap[] = {
- &hf_ieee80211_rsn_cap_preauth,
- &hf_ieee80211_rsn_cap_no_pairwise,
- &hf_ieee80211_rsn_cap_ptksa_replay_counter,
- &hf_ieee80211_rsn_cap_gtksa_replay_counter,
- &hf_ieee80211_rsn_cap_mfpr,
- &hf_ieee80211_rsn_cap_mfpc,
- &hf_ieee80211_rsn_cap_jmr,
- &hf_ieee80211_rsn_cap_peerkey,
- NULL
- };
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+
+ if (field_data->isDMG == FALSE && tag_len != 55)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 55", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ if (field_data->isDMG == TRUE && tag_len != 57)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 57", tag_len);
+ return tvb_captured_length(tvb);
+ }
- proto_tree_add_item(tree, hf_ieee80211_rsn_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ add_ff_qos_ts_info(tree, tvb, pinfo, offset);
+ offset += 3;
+
+ proto_tree_add_item(tree, hf_ieee80211_tspec_nor_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
- /* 7.3.2.25.1 Group Cipher suites */
- rsn_gcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gcs, tvb, offset, 4, ENC_BIG_ENDIAN);
- rsn_gcs_tree = proto_item_add_subtree(rsn_gcs_item, ett_rsn_gcs_tree);
- proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tspec_max_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- /* Check if OUI is 00:0F:AC (ieee80211) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
- {
- proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_80211_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_min_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
- /* 7.3.2.25.2 Pairwise Cipher suites */
- rsn_pcs_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- pcs_count = tvb_get_letohs(tvb, offset);
- offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tspec_max_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- if (offset + (pcs_count * 4) > tag_end)
- {
- expert_add_info_format(pinfo, rsn_pcs_count, &ei_ieee80211_rsn_pcs_count,
- "Pairwise Cipher Suite Count too large, 4*%u > %d", pcs_count, tag_end - offset);
- pcs_count = (tag_end - offset) / 4;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_inact_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, ENC_NA);
- rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree);
- for (ii = 0; ii < pcs_count; ii++)
- {
- rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, ENC_BIG_ENDIAN);
- rsn_sub_pcs_tree = proto_item_add_subtree(rsn_sub_pcs_item, ett_rsn_sub_pcs_tree);
- proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tspec_susp_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- /* Check if OUI is 00:0F:AC (ieee80211) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
- {
- proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(rsn_pcs_item, " %s", rsn_pcs_return(tvb_get_ntohl(tvb, offset)));
- } else {
- proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- }
- offset += 4;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- if (offset >= tag_end)
- {
- return offset;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_min_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- /* 7.3.2.25.2 AKM suites */
- rsn_akms_count = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- akms_count = tvb_get_letohs(tvb, offset);
- offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tspec_mean_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- if (offset + (akms_count * 4) > tag_end)
- {
- expert_add_info_format(pinfo, rsn_akms_count, &ei_ieee80211_rsn_pmkid_count,
- "Auth Key Management (AKM) Suite Count too large, 4*%u > %d", akms_count, tag_end - offset);
- akms_count = (tag_end - offset) / 4;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_peak_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- rsn_akms_item = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_list, tvb, offset, akms_count * 4, ENC_NA);
- rsn_akms_tree = proto_item_add_subtree(rsn_akms_item, ett_rsn_akms_tree);
- for (ii = 0; ii < akms_count; ii++)
- {
- rsn_sub_akms_item = proto_tree_add_item(rsn_akms_tree, hf_ieee80211_rsn_akms, tvb, offset, 4, ENC_BIG_ENDIAN);
- rsn_sub_akms_tree = proto_item_add_subtree(rsn_sub_akms_item, ett_rsn_sub_akms_tree);
- proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tspec_burst_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- /* Check if OUI is 00:0F:AC (ieee80211) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
- {
- proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(rsn_akms_item, " %s", rsn_akms_return(tvb_get_ntohl(tvb, offset)));
+ proto_tree_add_item(tree, hf_ieee80211_tspec_delay_bound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- if (association_sanity_check) {
- guint32 akm_suite = tvb_get_ntohl(tvb, offset);
- if (akm_suite == 0x000FAC03 || akm_suite == 0x000FAC04 || akm_suite == 0x000FAC09) {
- /* This is an FT AKM suite */
- association_sanity_check->has_ft_akm_suite = TRUE;
- if (association_sanity_check->rsn_first_ft_akm_suite == NULL && rsn_sub_akms_tree != NULL) {
- association_sanity_check->rsn_first_ft_akm_suite = rsn_sub_akms_tree->last_child;
- }
- } else {
- /* This is a non-FT AKM suite */
- association_sanity_check->has_non_ft_akm_suite = TRUE;
- if (association_sanity_check->rsn_first_non_ft_akm_suite == NULL && rsn_sub_akms_tree != NULL) {
- association_sanity_check->rsn_first_non_ft_akm_suite = rsn_sub_akms_tree->last_child;
- }
- }
- }
- } else {
- proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- }
- offset += 4;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_min_phy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- /* 7.3.2.25.3 RSN capabilities */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_rsn_cap,
- ett_rsn_cap_tree, ieee80211_rsn_cap,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
- if (offset >= tag_end)
- {
- return offset;
- }
- /* 7.3.2.25.4 PMKID */
- rsn_pmkid_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- pmkid_count = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tspec_surplus, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
- if (offset + (pmkid_count * 16) > tag_end)
- {
- expert_add_info_format(pinfo, rsn_pmkid_count, &ei_ieee80211_pmkid_count_too_large,
- "PMKID Count too large, 16*%u > %d", pmkid_count, tag_end - offset);
- pmkid_count = (tag_end - offset) / 16;
- }
-
- rsn_pmkid_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_list, tvb, offset, pmkid_count * 16, ENC_NA);
- rsn_pmkid_tree = proto_item_add_subtree(rsn_pmkid_item, ett_rsn_pmkid_tree);
- for (ii = 0; ii < pmkid_count; ii++)
- {
- proto_tree_add_item(rsn_pmkid_tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, ENC_NA);
- offset += 16;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tspec_medium, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- if (offset >= tag_end)
- {
- return offset;
- }
- /* Group Management Cipher Suite (802.11w)*/
- rsn_gmcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gmcs, tvb, offset, 4, ENC_BIG_ENDIAN);
- rsn_gmcs_tree = proto_item_add_subtree(rsn_gmcs_item, ett_rsn_gmcs_tree);
- proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
- /* Check if OUI is 00:0F:AC (ieee80211) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
- {
- proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_80211_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_type, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ if(field_data->isDMG == TRUE) {
+ proto_tree_add_item(tree, hf_ieee80211_tspec_dmg, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ /*offset +=2;*/
}
- offset += 4;
- return offset;
+ return tvb_captured_length(tvb);
}
-/* 7.3.2.27 Extended Capabilities information element (127) */
+/* 7.3.2.31 TCLAS element (14) */
static int
-dissect_extended_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_tclas(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;
- proto_item *ti_ex_cap;
- proto_tree *ex_cap_tree;
- static const int *ieee80211_tag_extended_capabilities_byte1[] = {
- &hf_ieee80211_tag_extended_capabilities_b0,
- &hf_ieee80211_tag_extended_capabilities_b1,
- &hf_ieee80211_tag_extended_capabilities_b2,
- &hf_ieee80211_tag_extended_capabilities_b3,
- &hf_ieee80211_tag_extended_capabilities_b4,
- &hf_ieee80211_tag_extended_capabilities_b5,
- &hf_ieee80211_tag_extended_capabilities_b6,
- &hf_ieee80211_tag_extended_capabilities_b7,
- NULL
- };
- static const int *ieee80211_tag_extended_capabilities_byte2[] = {
- &hf_ieee80211_tag_extended_capabilities_b8,
- &hf_ieee80211_tag_extended_capabilities_b9,
- &hf_ieee80211_tag_extended_capabilities_b10,
- &hf_ieee80211_tag_extended_capabilities_b11,
- &hf_ieee80211_tag_extended_capabilities_b12,
- &hf_ieee80211_tag_extended_capabilities_b13,
- &hf_ieee80211_tag_extended_capabilities_b14,
- &hf_ieee80211_tag_extended_capabilities_b15,
- NULL
- };
- static const int *ieee80211_tag_extended_capabilities_byte3[] = {
- &hf_ieee80211_tag_extended_capabilities_b16,
- &hf_ieee80211_tag_extended_capabilities_b17,
- &hf_ieee80211_tag_extended_capabilities_b18,
- &hf_ieee80211_tag_extended_capabilities_b19,
- &hf_ieee80211_tag_extended_capabilities_b20,
- &hf_ieee80211_tag_extended_capabilities_b21,
- &hf_ieee80211_tag_extended_capabilities_b22,
- &hf_ieee80211_tag_extended_capabilities_b23,
- NULL
- };
- static const int *ieee80211_tag_extended_capabilities_byte4[] = {
- &hf_ieee80211_tag_extended_capabilities_b24,
- &hf_ieee80211_tag_extended_capabilities_b25,
- &hf_ieee80211_tag_extended_capabilities_b26,
- &hf_ieee80211_tag_extended_capabilities_b27,
- &hf_ieee80211_tag_extended_capabilities_b28,
- &hf_ieee80211_tag_extended_capabilities_b29,
- &hf_ieee80211_tag_extended_capabilities_b30,
- &hf_ieee80211_tag_extended_capabilities_b31,
+ guint8 type;
+ guint8 version;
+ static const int *ieee80211_tclas_class_mask0[] = {
+ &hf_ieee80211_tclas_class_mask0_src_addr,
+ &hf_ieee80211_tclas_class_mask0_dst_addr,
+ &hf_ieee80211_tclas_class_mask0_type,
NULL
};
- static const int *ieee80211_tag_extended_capabilities_byte5[] = {
- &hf_ieee80211_tag_extended_capabilities_b32,
- &hf_ieee80211_tag_extended_capabilities_b33,
- &hf_ieee80211_tag_extended_capabilities_b34,
- &hf_ieee80211_tag_extended_capabilities_b35,
- &hf_ieee80211_tag_extended_capabilities_b36,
- &hf_ieee80211_tag_extended_capabilities_b37,
- &hf_ieee80211_tag_extended_capabilities_b38,
- &hf_ieee80211_tag_extended_capabilities_b39,
+
+ static const int *ieee80211_tclas_class_mask1[] = {
+ &hf_ieee80211_tclas_class_mask1_ver,
+ &hf_ieee80211_tclas_class_mask1_src_ip,
+ &hf_ieee80211_tclas_class_mask1_dst_ip,
+ &hf_ieee80211_tclas_class_mask1_src_port,
+ &hf_ieee80211_tclas_class_mask1_dst_port,
+ &hf_ieee80211_tclas_class_mask1_ipv6_flow,
NULL
};
- static const int *ieee80211_tag_extended_capabilities_byte6[] = {
- &hf_ieee80211_tag_extended_capabilities_b40,
- &hf_ieee80211_tag_extended_capabilities_serv_int_granularity,
- &hf_ieee80211_tag_extended_capabilities_b44,
- &hf_ieee80211_tag_extended_capabilities_b45,
- &hf_ieee80211_tag_extended_capabilities_b46,
- &hf_ieee80211_tag_extended_capabilities_b47,
+
+ static const int *ieee80211_tclas_class_mask1_4[] = {
+ &hf_ieee80211_tclas_class_mask1_ver,
+ &hf_ieee80211_tclas_class_mask1_src_ip,
+ &hf_ieee80211_tclas_class_mask1_dst_ip,
+ &hf_ieee80211_tclas_class_mask1_src_port,
+ &hf_ieee80211_tclas_class_mask1_dst_port,
+ &hf_ieee80211_tclas_class_mask1_ipv4_dscp,
+ &hf_ieee80211_tclas_class_mask1_ipv4_proto,
NULL
};
- static const int *ieee80211_tag_extended_capabilities_byte7[] = {
- &hf_ieee80211_tag_extended_capabilities_b48,
- &hf_ieee80211_tag_extended_capabilities_o7,
+
+ static const int *ieee80211_tclas_class_mask2[] = {
+ &hf_ieee80211_tclas_class_mask2_tci,
NULL
};
-
- if (tag_len < 1)
+ if (tag_len < 5)
{
- 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);
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 5", tag_len);
return 1;
}
- proto_item_append_text(field_data->item_tag, " (%u octet%s)", tag_len, plurality(tag_len, "", "s"));
- /* Extended Capability octet 1 */
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap1, ieee80211_tag_extended_capabilities_byte1,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 1)");
+ proto_tree_add_item(tree, hf_ieee80211_tclas_up, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- /* Extended Capability octet 2 */
- if (offset >= tag_len) {
- return offset;
- }
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap2, ieee80211_tag_extended_capabilities_byte2,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 2)");
+ type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tclas_class_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- /* Extended Capability octet 3 */
- if (offset >= tag_len) {
- return offset;
- }
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap3, ieee80211_tag_extended_capabilities_byte3,
+ switch (type)
+ {
+ case 0:
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
+ ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask0,
ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 3)");
- offset += 1;
+ offset++;
- /* Extended Capability octet 4 */
- if (offset >= tag_len) {
- return offset;
- }
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap4, ieee80211_tag_extended_capabilities_byte4,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 4)");
- offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_src_mac_addr, tvb, offset, 6, ENC_NA);
+ offset += 6;
- /* Extended Capability octet 5 */
- if (offset >= tag_len) {
- return offset;
- }
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap5, ieee80211_tag_extended_capabilities_byte5,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 5)");
- offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_dst_mac_addr, tvb, offset, 6, ENC_NA);
+ offset += 6;
- /* Extended Capability octet 6 */
- if (offset >= tag_len) {
- return offset;
- }
+ proto_tree_add_item(tree, hf_ieee80211_tclas_ether_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ /*offset += 2;*/
+ break;
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap6, ieee80211_tag_extended_capabilities_byte6,
+ case 1:
+ version = tvb_get_guint8(tvb, offset+1);
+ if (version == 4) {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
+ ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask1_4,
ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 6)");
- offset += 1;
-
-
- /* Extended Capability octet 7 */
- if (offset >= tag_len) {
- return offset;
- }
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_extended_capabilities,
- ett_tag_ex_cap7, ieee80211_tag_extended_capabilities_byte7,
+ } else {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
+ ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask1,
ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 7)");
- offset += 1;
-
- /* Extended Capability octet 8 */
- if (offset >= tag_len) {
- return offset;
- }
- ti_ex_cap = proto_tree_add_item(tree, hf_ieee80211_tag_extended_capabilities, tvb, offset, 1, ENC_NA);
- proto_item_append_text(ti_ex_cap, " (octet 8)");
- ex_cap_tree = proto_item_add_subtree(ti_ex_cap, ett_tag_ex_cap8);
- proto_tree_add_item(ex_cap_tree, hf_ieee80211_tag_extended_capabilities_b61, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(ex_cap_tree, hf_ieee80211_tag_extended_capabilities_b62, tvb, offset, 1, ENC_NA);
+ }
+ offset += 1;
- /* Std802.11ac-2013, b63-64 indicate the Max Number of MSDUs in AMSDU. */
- ti_ex_cap = proto_tree_add_item(ex_cap_tree, hf_ieee80211_tag_extended_capabilities_b63, tvb, offset, 1, ENC_NA);
- if (offset+1 < tag_len) {
+ proto_tree_add_item(tree, hf_ieee80211_tclas_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ if (version == 4)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tclas_ipv4_src, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_ipv4_dst, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_dscp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_protocol, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ /*offset += 1;*/
+ }
+ else if (version == 6)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tclas_ipv6_src, tvb, offset, 16, ENC_NA);
+ offset += 16;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_ipv6_dst, tvb, offset, 16, ENC_NA);
+ offset += 16;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_flow, tvb, offset, 3, ENC_BIG_ENDIAN);
+ /*offset += 3;*/
+ }
+ break;
- proto_item_append_text(ti_ex_cap, " (b63-64 Max Number of MSDUs in AMSDU: %s)",
- val_to_str((tvb_get_guint8(tvb, offset) & 0x80) + ((tvb_get_guint8(tvb, offset+1) & 0x1) << 1),
- vht_max_mpdu_in_amsdu, "Unknown:%d"));
- }
+ case 2:
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
+ ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask2,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset++;
- proto_tree_add_item(ex_cap_tree, hf_ieee80211_tag_extended_capabilities_o8, tvb, offset, 1, ENC_NA);
- offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_tag_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ /*offset += 2;*/
+ break;
- /* Extended Capability octet 9 */
- if (offset >= tag_len) {
- return offset;
+ default:
+ break;
}
- ti_ex_cap = proto_tree_add_item(tree, hf_ieee80211_tag_extended_capabilities, tvb, offset, 1, ENC_NA);
- proto_item_append_text(ti_ex_cap, " (octet 9)");
- ex_cap_tree = proto_item_add_subtree(ti_ex_cap, ett_tag_ex_cap9);
- ti_ex_cap = proto_tree_add_item(ex_cap_tree, hf_ieee80211_tag_extended_capabilities_b64, tvb, offset, 1, ENC_NA);
- proto_item_append_text(ti_ex_cap, " (b63-64 Max Number of MSDUs in AMSDU)");
- proto_tree_add_item(ex_cap_tree, hf_ieee80211_tag_extended_capabilities_o9, tvb, offset, 1, ENC_NA);
- offset += 1;
- return offset;
+ return tvb_captured_length(tvb);
}
+
+/* 7.3.2.34 Schedule element (15) */
static int
-dissect_vht_mcs_set(proto_tree *tree, tvbuff_t *tvb, int offset)
+ieee80211_tag_schedule(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- proto_item *ti;
- proto_tree *mcs_tree;
- static const int *ieee80211_vht_mcsset_rx_max_mcs[] = {
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss,
- &hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss,
- NULL
- };
- static const int *ieee80211_vht_mcsset_tx_max_mcs[] = {
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss,
- &hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss,
- NULL
- };
-
- /* 8 byte Supported MCS set */
- ti = proto_tree_add_item(tree, hf_ieee80211_vht_mcsset, tvb, offset, 8, ENC_NA);
-
- mcs_tree = proto_item_add_subtree(ti, ett_vht_mcsset_tree);
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ if (tag_len != 14)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 14", tag_len);
+ return 1;
+ }
- /* B0 - B15 */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_mcsset_rx_mcs_map,
- ett_vht_rx_mcsbit_tree, ieee80211_vht_mcsset_rx_max_mcs,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ add_ff_schedule_info(tree, tvb, pinfo, offset);
offset += 2;
- /* B16 - B28 13 bits*/
- proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_rx_highest_long_gi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_sched_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- /* B29 - B31 2 reserved bits*/
+ proto_tree_add_item(tree, hf_ieee80211_sched_srv_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_sched_spec_int, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- /* B32 - B47 */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_mcsset_tx_mcs_map,
- ett_vht_tx_mcsbit_tree, ieee80211_vht_mcsset_tx_max_mcs,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
- /* B48 - B60 13 bits */
- proto_tree_add_item(mcs_tree, hf_ieee80211_vht_mcsset_tx_highest_long_gi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- /* B61 - B63 2 reserved bits*/
+/* 7.3.2.8 Challenge Text element (16) */
+static int
+ieee80211_tag_challenge_text(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int tag_len = tvb_reported_length(tvb);
+ int offset = 0;
- offset += 2;
- return offset;
+ proto_tree_add_item(tree, hf_ieee80211_tag_challenge_text, tvb, offset, tag_len, ENC_NA);
+
+ return ((tag_len > 0) ? tag_len : 1);
}
+/* 7.3.2.15 Power Constraint element (32) */
static int
-dissect_vht_capability_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_power_constraint(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;
- static const int *ieee80211_vht_caps[] = {
- &hf_ieee80211_vht_max_mpdu_length,
- &hf_ieee80211_vht_supported_chan_width_set,
- &hf_ieee80211_vht_rx_ldpc,
- &hf_ieee80211_vht_short_gi_for_80,
- &hf_ieee80211_vht_short_gi_for_160,
- &hf_ieee80211_vht_tx_stbc,
- /* End of first byte */
- &hf_ieee80211_vht_rx_stbc,
- &hf_ieee80211_vht_su_beamformer_cap,
- &hf_ieee80211_vht_su_beamformee_cap,
- &hf_ieee80211_vht_beamformer_antennas,
- /* End of second byte */
- &hf_ieee80211_vht_sounding_dimensions,
- &hf_ieee80211_vht_mu_beamformer_cap,
- &hf_ieee80211_vht_mu_beamformee_cap,
- &hf_ieee80211_vht_txop_ps,
- &hf_ieee80211_vht_var_htc_field,
- &hf_ieee80211_vht_max_ampdu,
- &hf_ieee80211_vht_link_adaptation_cap,
- &hf_ieee80211_vht_rx_pattern,
- &hf_ieee80211_vht_tx_pattern,
- &hf_ieee80211_vht_reserv,
- NULL
- };
-
- if (tag_len != 12) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "VHT Capabilities IE length %u wrong, must be = 12", tag_len);
+ if (tag_len != 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
return 1;
}
- /* 4 byte VHT Capabilities Info*/
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_cap,
- ett_vht_cap_tree, ieee80211_vht_caps,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 4;
-
- /* 8 byte MCS set */
- offset = dissect_vht_mcs_set(tree, tvb, offset);
-
- return offset;
+ proto_tree_add_item(tree, hf_ieee80211_tag_power_constraint_local, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ": %d", tvb_get_guint8(tvb, offset));
+ return tvb_captured_length(tvb);
}
+/* 7.3.2.16 Power Capability element (33) */
static int
-dissect_vht_operation_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_power_capability(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;
- proto_item *op_item;
- proto_tree *op_tree;
- static const int *ieee80211_vht_op_max_basic_mcs[] = {
- &hf_ieee80211_vht_op_max_basic_mcs_for_1_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_2_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_3_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_4_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_5_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_6_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_7_ss,
- &hf_ieee80211_vht_op_max_basic_mcs_for_8_ss,
- NULL
- };
-
- if (tag_len != 5) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "VHT Operation IE length %u wrong, must be = 5", tag_len);
+ if (tag_len != 2)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 2", tag_len);
return 1;
}
- /* 3 byte VHT Operation Info*/
- op_item = proto_tree_add_item(tree, hf_ieee80211_vht_op, tvb, offset, 3, ENC_NA);
- op_tree = proto_item_add_subtree(op_item, ett_vht_op_tree);
- proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_width, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_center0, tvb, offset+1, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(op_tree, hf_ieee80211_vht_op_channel_center1, tvb, offset+2, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_power_capability_min, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " Min: %d", tvb_get_gint8(tvb, offset));
+ offset += 1;
- offset += 3;
- /* VHT Basic MCS Set */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_vht_op_basic_mcs_map,
- ett_vht_basic_mcsbit_tree, ieee80211_vht_op_max_basic_mcs,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_power_capability_max, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ", Max: %d", tvb_get_gint8(tvb, offset));
+ return tvb_captured_length(tvb);
+}
- return offset;
+/* 7.3.2.18 TPC Request element (34) */
+static int
+ieee80211_tag_tpc_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void* data)
+{
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ if (tag_len != 0)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 0", tag_len);
+ return 1; /* Even with no data, we can't return 0 */
+ }
+
+ return 1; /* Even with no data, we can't return 0 */
}
+/* 7.3.2.18 TPC Report element (35) */
static int
-dissect_vht_tx_pwr_envelope(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_tpc_report(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;
- proto_item *tx_pwr_item, *ti;
- proto_tree *tx_pwr_info_tree;
- guint8 opt_ie_cnt=0;
- guint8 i;
- if (tag_len < 2 || tag_len > 5) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "VHT TX PWR Envelope IE length %u wrong, must be >= 2 and <= 5", tag_len);
+ if (tag_len != 2)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 2", tag_len);
return 1;
}
- tx_pwr_item = proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_info, tvb, offset, 1, ENC_NA);
- tx_pwr_info_tree = proto_item_add_subtree(tx_pwr_item, ett_vht_tpe_info_tree);
-
- ti = proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_unit, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tx_pwr_info_tree, hf_ieee80211_vht_tpe_pwr_info_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
-
- opt_ie_cnt = tvb_get_guint8(tvb, offset) & 0x07;
-
+ proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_trsmt_pow, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " Transmit Power: %d", tvb_get_guint8(tvb, offset));
offset += 1;
- /* Power Constraint info is mandatory only for 20MHz, others are optional*/
- /* Power is expressed in terms of 0.5dBm from -64 to 63 and is encoded
- * as 8-bit 2's compliment */
- for (i = 0; i <= opt_ie_cnt; i++) {
- switch(i) {
- case 0:
- proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_20, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- case 1:
- proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_40, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- case 2:
- proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_80, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- case 3:
- proto_tree_add_item(tree, hf_ieee80211_vht_tpe_pwr_constr_160, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- default:
- expert_add_info(pinfo, ti, &ei_ieee80211_vht_tpe_pwr_info_count);
- offset += 1;
- break;
- }
- }
-
- return offset;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_link_mrg, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ", Link Margin: %d", tvb_get_guint8(tvb, offset));
+ return tvb_captured_length(tvb);
}
+/* 7.3.2.19 Supported Channels element (36) */
static int
-dissect_mobility_domain(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_supported_channels(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;
- if (field_data->sanity_check != NULL) {
- field_data->sanity_check->association_has_mobility_domain_element = TRUE;
- }
+ proto_item *chan_item;
+ proto_tree *chan_tree;
+ guint i = 1;
- if (tag_len < 3) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "MDIE content length must be at least 3 bytes");
- return 1;
+ if (tag_len % 2 == 1) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u must be even", tag_len);
+ return tvb_captured_length(tvb);
}
- proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_mdid,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_ft_capab,
- tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds,
- tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_mobility_domain_ft_capab_resource_req,
- tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ while (offset < tag_len)
+ {
+ chan_item = proto_tree_add_item(tree, hf_ieee80211_tag_supported_channels, tvb, offset, 2, ENC_NA);
+ proto_item_append_text(chan_item, " #%d", i);
+ i += 1;
+
+ chan_tree = proto_item_add_subtree(chan_item , ett_tag_supported_channels);
+
+ proto_tree_add_item(chan_tree, hf_ieee80211_tag_supported_channels_first, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(chan_item, " First: %d", tvb_get_guint8(tvb, offset));
+ offset += 1;
+
+ proto_tree_add_item(chan_tree, hf_ieee80211_tag_supported_channels_range, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(chan_item, ", Range: %d ", tvb_get_guint8(tvb, offset));
+ offset += 1;
+
+ }
return tvb_captured_length(tvb);
}
+/* 7.3.2.20 Channel Switch Announcement element (37) */
static int
-dissect_fast_bss_transition(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_switch_ann(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;
- if (tag_len < 82) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "FTIE content length must be at least 82 bytes");
+ if (tag_len != 3)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 3", tag_len);
return 1;
}
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_mic_control,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_element_count,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_mic,
- tvb, offset, 16, ENC_NA);
- offset += 16;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_anonce,
- tvb, offset, 32, ENC_NA);
- offset += 32;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_snonce,
- tvb, offset, 32, ENC_NA);
- offset += 32;
-
- while (offset + 2 <= tag_len) {
- guint8 id, len;
- int s_end;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_id,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- id = tvb_get_guint8(tvb, offset);
- offset += 1;
-
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_len,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- len = tvb_get_guint8(tvb, offset);
- offset += 1;
-
- if (offset + len > tag_len) {
- proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tvb, offset,
- tag_len - offset, "Invalid FTIE subelement");
- return offset;
- }
+ proto_tree_add_item(tree, hf_ieee80211_csa_channel_switch_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " Mode: %d", tvb_get_guint8(tvb, offset));
+ offset += 1;
- s_end = offset + len;
- switch (id) {
- case 1:
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_r1kh_id,
- tvb, offset, len, ENC_NA);
- break;
- case 2:
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key_info,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key_id,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- if (offset > s_end)
- break;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key_length,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- if (offset > s_end)
- break;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_rsc,
- tvb, offset, 8, ENC_NA);
- offset += 8;
- if (offset > s_end)
- break;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_gtk_key,
- tvb, offset, s_end - offset, ENC_NA);
- break;
- case 3:
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_r0kh_id,
- tvb, offset, len, ENC_NA);
- break;
- case 4:
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_key_id,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- if (offset > s_end)
- break;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_ipn,
- tvb, offset, 6, ENC_NA);
- offset += 6;
- if (offset > s_end)
- break;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_key_length,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- if (offset > s_end)
- break;
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_igtk_key,
- tvb, offset, 24, ENC_NA);
- break;
- default:
- proto_tree_add_item(tree, hf_ieee80211_tag_ft_subelem_data,
- tvb, offset, len, ENC_NA);
- break;
- }
- offset = s_end;
- }
+ proto_tree_add_item(tree, hf_ieee80211_csa_new_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ", Number: %d ", tvb_get_guint8(tvb, offset));
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_csa_channel_switch_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, ", Count: %d ", tvb_get_guint8(tvb, offset));
return tvb_captured_length(tvb);
}
+/* 7.3.2.21 Measurement Request element (38) with update from 802.11k-2008 */
static int
-dissect_mmie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_measure_req(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;
+ guint8 request_type;
+ proto_item *parent_item;
+ proto_tree *sub_tree;
+ static const int *ieee80211_tag_measure_request_mode[] = {
+ &hf_ieee80211_tag_measure_request_mode_parallel,
+ &hf_ieee80211_tag_measure_request_mode_enable,
+ &hf_ieee80211_tag_measure_request_mode_request,
+ &hf_ieee80211_tag_measure_request_mode_report,
+ &hf_ieee80211_tag_measure_request_mode_duration_mandatory,
+ &hf_ieee80211_tag_measure_request_mode_reserved,
+ NULL
+ };
- if (tag_len < 16) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "MMIE content length must be at least 16 bytes");
- return 1;
+ if (tag_len < 3)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 3", tag_len);
+ return tvb_captured_length(tvb);
}
+ proto_tree_add_item(tree, hf_ieee80211_tag_measure_request_token, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_mmie_keyid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_mmie_ipn, tvb, offset + 2, 6,
- ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_mmie_mic, tvb, offset + 8, 8,
- ENC_NA);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_request_mode,
+ ett_tag_measure_request_mode_tree, ieee80211_tag_measure_request_mode,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
-static int
-dissect_ssid_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- int tag_len = tvb_reported_length(tvb);
- int offset = 0;
- proto_tree *entry;
- gboolean first = TRUE;
+ parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_measure_request_type, tvb, offset, 1, ENC_NA);
+ sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_request_type_tree);
+ request_type = tvb_get_guint8(tvb, offset);
+ offset += 1;
- while (offset + 1 <= tag_len) {
- guint8 len = tvb_get_guint8(tvb, offset + 1);
- guint8 *str;
+ switch (request_type) {
+ case 0: /* Basic Request */
+ case 1: /* Clear channel assessment (CCA) request */
+ case 2: /* Receive power indication (RPI) histogram request */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
- if (offset + 2 + len > tag_len)
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
break;
+ }
+ case 3: /* Channel Load Request */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
- str = tvb_format_text(tvb, offset + 2, len);
- proto_item_append_text(tree, "%c %s", (first ? ':' : ','), str);
- first = FALSE;
- entry = proto_tree_add_subtree_format(tree, tvb, offset, 2 + len, ett_ssid_list, NULL, "SSID: %s", str);
- proto_tree_add_item(entry, hf_ieee80211_tag_number, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset++;
- proto_tree_add_uint(entry, hf_ieee80211_tag_length, tvb, offset, 1, len);
- offset++;
- proto_tree_add_item(entry, hf_ieee80211_tag_ssid, tvb, offset, len,
- ENC_ASCII|ENC_NA);
- offset += len;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ while (offset < tag_len)
+ {
+ guint8 sub_id;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_id, tvb, offset, 1, ENC_NA);
+ sub_id = tvb_get_guint8(tvb, offset);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ switch (sub_id) {
+ case MEASURE_REQ_CHANNEL_LOAD_SUB_REPORTING_INFO: /* Channel Load Reporting Information (1) */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ default:
+ /* no default action */
+ break;
+ }
+ }
+ break;
+ }
+ case 4: /* Noise Histogram Request */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ while (offset < tag_len)
+ {
+ guint8 sub_id;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_id, tvb, offset, 1, ENC_NA);
+ sub_id = tvb_get_guint8(tvb, offset);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ switch (sub_id) {
+ case MEASURE_REQ_NOISE_HISTOGRAM_SUB_REPORTING_INFO: /* Noise Histogram Reporting Information (1) */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ default:
+ /* no default action */
+ break;
+ }
+ }
+ break;
+ }
+ case 5: /* Beacon Request */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_measurement_mode, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+
+ while (offset < tag_len)
+ {
+ guint8 sub_id, sub_length, sub_tag_end;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_id, tvb, offset, 1, ENC_NA);
+ sub_id = tvb_get_guint8(tvb, offset);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
+ sub_length = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ sub_tag_end = offset + sub_length;
+
+ switch (sub_id) {
+ case MEASURE_REQ_BEACON_SUB_SSID: /* SSID (0) */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_ssid, tvb, offset, sub_length, ENC_ASCII|ENC_NA);
+ offset += sub_length;
+ break;
+ case MEASURE_REQ_BEACON_SUB_BRI: /* Beacon Reporting Information (1) */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ break;
+ case MEASURE_REQ_BEACON_SUB_RD: /* Reporting Detail (2) */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ break;
+ case MEASURE_REQ_BEACON_SUB_REQUEST: /* Request (10) */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ break;
+ case MEASURE_REQ_BEACON_SUB_APCP: /* AP Channel Report (51) */
+ /* TODO */
+ break;
+ default:
+ /* no default action */
+ break;
+ }
+ if (offset < sub_tag_end)
+ {
+ proto_item *tix;
+ tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_unknown, tvb, offset, sub_tag_end - offset, ENC_NA);
+ expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_request_beacon_unknown);
+ offset = sub_tag_end;
+ }
+ }
+
+ break;
+ }
+ case 6: /* Frame Request */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_frame_request_type, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_mac_address, tvb, offset, 6, ENC_NA);
+ offset += 6;
+
+ /* TODO Add Optional Subelements */
+ break;
+ }
+ case 7: /* BSTA Statistics Request */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_peer_mac_address, tvb, offset, 6, ENC_NA);
+ offset += 6;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_group_id, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ /* TODO Add Optional Subelements */
+ break;
+ }
+ case 8: /* Location Configuration Indication (LCI) Request */
+ /* TODO */
+ case 9: /* Transmit Stream Measurement Request */
+ /* TODO */
+ case 10: /* Multicast diagnostics request */
+ /* TODO */
+ case 11: /* Location Civic request */
+ /* TODO */
+ case 12: /* Location Identifier request */
+ /* TODO */
+ case 13: /* Directional channel quality request */
+ /* TODO */
+ case 14: /* Directional measurement request */
+ /* TODO */
+ case 15: /* Directional statistics request */
+ /* TODO */
+ case 255: /* Measurement Pause Request*/
+ /* TODO */
+ default: /* unknown */
+ break;
+ }
+ if (offset < tag_len)
+ {
+ proto_item *tix;
+ tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_unknown, tvb, offset, tag_len - offset, ENC_NA);
+ expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_request_unknown);
}
return tvb_captured_length(tvb);
}
+/* 7.3.2.22 Measurement Report element (39) with update from 802.11k-2008 */
static int
-dissect_link_identifier(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_measure_rep(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;
+ proto_item *parent_item;
+ proto_tree *sub_tree;
+ guint8 report_type;
+ static const int *ieee80211_tag_measure_report_mode[] = {
+ &hf_ieee80211_tag_measure_report_mode_late,
+ &hf_ieee80211_tag_measure_report_mode_incapable,
+ &hf_ieee80211_tag_measure_report_mode_refused,
+ &hf_ieee80211_tag_measure_report_mode_reserved,
+ NULL
+ };
+ static const int *ieee80211_tag_measure_map_field[] = {
+ &hf_ieee80211_tag_measure_map_field_bss,
+ &hf_ieee80211_tag_measure_map_field_odfm,
+ &hf_ieee80211_tag_measure_map_field_unident_signal,
+ &hf_ieee80211_tag_measure_map_field_radar,
+ &hf_ieee80211_tag_measure_map_field_unmeasured,
+ &hf_ieee80211_tag_measure_map_field_reserved,
+ NULL
+ };
+ static const int *ieee80211_tag_measure_report_frame_info[] = {
+ &hf_ieee80211_tag_measure_report_frame_info_phy_type,
+ &hf_ieee80211_tag_measure_report_frame_info_frame_type,
+ NULL
+ };
- if (tag_len < 18) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Link Identifier content length must be at least "
- "18 bytes");
+ if (tag_len < 3)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 3", tag_len);
return tvb_captured_length(tvb);
}
+ proto_tree_add_item(tree, hf_ieee80211_tag_measure_report_measurement_token, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_link_id_bssid, tvb,
- offset, 6, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_link_id_init_sta, tvb,
- offset + 6, 6, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_link_id_resp_sta, tvb,
- offset + 12, 6, ENC_NA);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_report_mode,
+ ett_tag_measure_report_mode_tree, ieee80211_tag_measure_report_mode,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
-static int
-dissect_wakeup_schedule(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;
+ report_type = tvb_get_guint8(tvb, offset);
+ parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_measure_report_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_report_type_tree);
+ offset += 1;
- if (tag_len < 18) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Wakeup Schedule content length must be at least "
- "18 bytes");
+ if (tag_len == 3)
return tvb_captured_length(tvb);
+
+ switch (report_type) {
+ case 0: /* Basic Report */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_basic_map_field,
+ ett_tag_measure_report_basic_map_tree, ieee80211_tag_measure_map_field,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ break;
}
+ case 1: /* Clear channel assessment (CCA) report */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_offset, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
- proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_interval, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- proto_tree_add_item(tree,
- hf_ieee80211_tag_wakeup_schedule_awake_window_slots, tvb,
- offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_cca_busy_fraction, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ case 2: /* Receive power indication (RPI) histogram report */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_max_awake_dur,
- tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
- proto_tree_add_item(tree, hf_ieee80211_tag_wakeup_schedule_idle_count, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
-static int
-dissect_channel_switch_timing(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;
+ parent_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report, tvb, offset, 8, ENC_NA);
+ sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_report_rpi_tree);
- if (tag_len < 4) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Channel Switch Timing content length must be at "
- "least 4 bytes");
- return tvb_captured_length(tvb);
- }
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_0, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_channel_switch_timing_switch_time,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_1, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree,
- hf_ieee80211_tag_channel_switch_timing_switch_timeout,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_2, tvb, offset, 1, ENC_NA);
+ offset += 1;
-static int
-dissect_pti_control(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;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_3, tvb, offset, 1, ENC_NA);
+ offset += 1;
- if (tag_len < 3) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "PTI Control content length must be at least 3 bytes");
- return tvb_captured_length(tvb);
- }
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_4, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_pti_control_tid, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_5, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_pti_control_sequence_control, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_6, tvb, offset, 1, ENC_NA);
+ offset += 1;
-static int
-dissect_pu_buffer_status(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;
- static const int *ieee80211_pu_buffer_status[] = {
- &hf_ieee80211_tag_pu_buffer_status_ac_bk,
- &hf_ieee80211_tag_pu_buffer_status_ac_be,
- &hf_ieee80211_tag_pu_buffer_status_ac_vi,
- &hf_ieee80211_tag_pu_buffer_status_ac_vo,
- NULL
- };
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_7, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ break;
+ case 3: /* Channel Load Report */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
- if (tag_len < 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "PU Buffer Status content length must be at least 1 byte");
- return tvb_captured_length(tvb);
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_load, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ /* TODO Add Optional Subelements */
+ break;
}
+ case 4: /* Noise Histogram Report */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_pu_buffer_status, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ant_id, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_anpi, tvb, offset, 1, ENC_NA);
+ offset += 1;
-static int
-dissect_timeout_interval(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- int tag_len = tvb_reported_length(tvb);
- int offset = 0;
- proto_item *pi;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_0, tvb, offset, 1, ENC_NA);
+ offset += 1;
- pi = proto_tree_add_item(tree, hf_ieee80211_tag_timeout_int_type, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- if (tag_len < 5) {
- expert_add_info_format(pinfo, pi, &ei_ieee80211_tag_length,
- "Timeout Interval content length must be at least "
- "5 bytes");
- return 1;
- }
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_1, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_timeout_int_value, tvb,
- offset + 1, 4, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_2, tvb, offset, 1, ENC_NA);
+ offset += 1;
-static int
-dissect_ric_data(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;
- proto_tree *sub_tree;
- guint8 desc_cnt = 0;
- guint32 next_ie;
- int offset_r = 0;
- const guint8 ids[] = { TAG_RIC_DESCRIPTOR };
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_3, tvb, offset, 1, ENC_NA);
+ offset += 1;
- if (tag_len != 4) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "RIC Data Length must be 4 bytes");
- return 0;
- }
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_4, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_id, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_5, tvb, offset, 1, ENC_NA);
+ offset += 1;
- desc_cnt = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_desc_cnt, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_6, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_ric_data_status_code, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_7, tvb, offset, 1, ENC_NA);
+ offset += 1;
- /* Our Design is such that all the Resource request IE's part of the RIC
- * must be in the sub tree of RIC for better readability
- * Even omnipeek does the same way.
- */
- sub_tree = proto_item_add_subtree(tree, ett_tag_ric_data_desc_ie);
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_8, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_item_append_text(field_data->item_tag, " :Resource Descriptor List");
- if (desc_cnt == 0) {
- proto_item_append_text(field_data->item_tag, " :0 (Weird?)");
- }
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_9, tvb, offset, 1, ENC_NA);
+ offset += 1;
- while ( desc_cnt != 0 ) {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_10, tvb, offset, 1, ENC_NA);
+ offset += 1;
- next_ie = tvb_get_guint8(tvb, offset);
- proto_item_append_text(field_data->item_tag, " :(%d:%s)", desc_cnt, val_to_str_ext(next_ie, &tag_num_vals_ext, "Reserved (%d)"));
- /* Recursive call to avoid duplication of code*/
- offset_r = add_tagged_field(pinfo, sub_tree, tvb, offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
- if (offset_r == 0 )/* should never happen, returns a min of 2*/
- break;
- /* This will ensure that the IE after RIC is processed
- * only once. This gives us a good looking RIC IE :-)
- */
- tag_len += offset_r;
- desc_cnt--;
- }
+ /* TODO Add Optional Subelements */
+ break;
+ case 5: /* Beacon Report */
+ {
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
- return tvb_captured_length(tvb);
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
-/* Overlapping BSS Scan Parameters (74) */
-static int
-dissect_overlap_bss_scan_par(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
-{
- int offset = 0;
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int tag_len = tvb_reported_length(tvb);
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
- if (tag_len != 14) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "OBSS Length must be 14 bytes");
- return 1;
- }
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_spd, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_report_frame_info,
+ ett_tag_measure_report_frame_tree, ieee80211_tag_measure_report_frame_info,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_sad, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_rcpi, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_cwtsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_rsni, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_sptpc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_satpc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ant_id, tvb, offset, 1, ENC_NA);
+ offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_wctdf, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_parent_tsf, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tag_obss_sat, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ while (offset < tag_len)
+ {
+ guint8 sub_id, sub_length;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_beacon_sub_id, tvb, offset, 1, ENC_NA);
+ sub_id = tvb_get_guint8(tvb, offset);
+ offset += 1;
- return offset;
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_subelement_length, tvb, offset, 1, ENC_NA);
+ sub_length = tvb_get_guint8(tvb, offset);
+ offset += 1;
-/* RIC Descriptor (75) */
-static int
-dissect_ric_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
-{
- int offset = 0;
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int tag_len = tvb_reported_length(tvb);
- guint8 rsrc_type = 0;
+ switch (sub_id) {
+ case MEASURE_REP_REPORTED_FRAME_BODY: /* Reported Frame Body (1) */
+ {
+ proto_tree *rep_tree;
- if (tag_len < 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "RIC Data Length must be at least 1 byte");
- return 1;
- }
+ rep_tree = proto_tree_add_subtree(sub_tree, tvb, offset, sub_length, ett_tag_measure_reported_frame_tree, NULL, "Reported Frame Body");
- rsrc_type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_ric_desc_rsrc_type, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ add_ff_timestamp(rep_tree, tvb, pinfo, 0);
+ add_ff_beacon_interval(rep_tree, tvb, pinfo, 8);
+ add_ff_cap_info(rep_tree, tvb, pinfo, 10);
+ offset += 12;
- if (rsrc_type == 1) {
- /* Block ACK params
- * 802.11-2012: 8.4.2.53 RIC Descriptor element
- * Block Ack parameter set as defined in 8.4.1.14,
- * Block Ack timeout value as defined in 8.4.1.15, and
- * Block Ack starting sequence control as defined in 8.3.1.8
- */
- /* TODO: Still figuring out how to parse these ones,
- * need a sample capture with at least HEX Dump
- */
- proto_item_append_text(field_data->item_tag, " : Block ACK Params");
- proto_tree_add_item(tree, hf_ieee80211_tag_ric_desc_var_params, tvb,
- offset, tag_len-1, ENC_NA);
- offset += tag_len -1;
- }else {
- /* 0, 2-255 are reserved*/
- proto_item_append_text(field_data->item_tag, " :Reserved (type != 1)");
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, rep_tree, sub_length - 12, MGT_PROBE_RESP, NULL);
+ offset += (sub_length - 12);
+ }
+ break;
+ default:
+ /* no default action */
+ break;
+ }
+ }
+ break;
}
+ case 6: /* Frame Report */
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
- return offset;
-}
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
-static int
-dissect_ext_bss_load(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- int offset = 0;
- proto_tree_add_item(tree, hf_ieee80211_ext_bss_mu_mimo_capable_sta_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_ext_bss_ss_underutilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_20mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_40mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ext_bss_observable_sec_80mhz_utilization, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
- return offset;
+ proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ /* TODO Add Optional Subelements */
+ break;
+ case 7: /* BSTA Statistics Report */
+ /* TODO */
+ case 8: /* Location Configuration Information Report element */
+ /* TODO */
+ case 9: /* Transmit Stream Measurement Report */
+ /* TODO */
+ case 10: /* Multicast diagnostics Report */
+ /* TODO */
+ case 11: /* Location Civic Report */
+ /* TODO */
+ case 12: /* Location Identifier Report */
+ /* TODO */
+ case 13: /* Directional channel quality Report */
+ /* TODO */
+ case 14: /* Directional measurement Report */
+ /* TODO */
+ case 15: /* Directional statistics Report */
+ /* TODO */
+ default: /* unknown */
+ break;
+ }
+ if (offset < tag_len)
+ {
+ proto_item *tix;
+ tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_unknown, tvb, offset, tag_len - offset, ENC_NA);
+ expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_report_unknown);
+ }
+ return tvb_captured_length(tvb);
}
+/* 7.3.2.23 Quiet element (40) */
static int
-dissect_wide_bw_channel_switch(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+ieee80211_tag_quiet(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;
+ if (tag_len != 6)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
+ return tvb_captured_length(tvb);
+ }
- proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_width, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_center_freq_segment0, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_quiet_count, tvb, offset, 1, ENC_NA);
+ proto_item_append_text(field_data->item_tag, " Count: %d", tvb_get_guint8(tvb, offset));
offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_wide_bw_new_channel_center_freq_segment1, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_quiet_period, tvb, offset, 1, ENC_NA);
+ proto_item_append_text(field_data->item_tag, " Period: %d", tvb_get_guint8(tvb, offset));
offset += 1;
- return offset;
+ proto_tree_add_item(tree, hf_ieee80211_tag_quiet_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " Duration: %d", tvb_get_letohs(tvb, offset));
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_quiet_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " Offset: %d", tvb_get_letohs(tvb, offset));
+
+ return tvb_captured_length(tvb);
}
+/* 7.3.2.24 IBSS DFS element (41) */
static int
-dissect_channel_switch_wrapper(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+ieee80211_tag_ibss_dfs(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;
- int tmp_sublen;
- const guint8 ids[] = { TAG_COUNTRY_INFO, TAG_WIDE_BW_CHANNEL_SWITCH,
- TAG_VHT_TX_PWR_ENVELOPE };
+ proto_item *ti_sup_map;
+ proto_tree *sub_map_tree;
+ if (tag_len < 7)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 7", tag_len);
+ return tvb_captured_length(tvb);
+ }
- /*
- Decode three subelement in IE-196(Channel Switch Wrapper element):
- (1) New Country subelement
- (2) Wide Bandwidth Channel Switch subelement
- (3) New VHT Transmit Power Envelope subelement
- */
- while (tag_len > 0){
- tmp_sublen = tvb_get_guint8(tvb, offset + 1);
- if(add_tagged_field(pinfo, tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
- break;
- }
- tag_len -= (tmp_sublen + 2);
- offset += (tmp_sublen + 2);
+ proto_tree_add_item(tree, hf_ieee80211_tag_dfs_owner, tvb, offset, 6, ENC_NA);
+ proto_item_append_text(field_data->item_tag, " Owner: %s", tvb_ether_to_str(tvb, offset));
+ offset += 6;
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_dfs_recovery_interval, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ while (offset < tag_len)
+ {
+ ti_sup_map = proto_tree_add_item(tree, hf_ieee80211_tag_dfs_channel_map, tvb, offset, 2, ENC_NA);
+ sub_map_tree = proto_item_add_subtree(ti_sup_map, ett_tag_dfs_map_tree);
+ proto_tree_add_item(sub_map_tree, hf_ieee80211_tag_dfs_channel_number, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(sub_map_tree, hf_ieee80211_tag_dfs_map, tvb, offset, 1, ENC_NA);
+ offset += 2;
}
- return offset;
+ return tvb_captured_length(tvb);
}
+/* 7.3.2.13 ERP Information element (42) */
static int
-dissect_operating_mode_notification(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+ieee80211_tag_erp_info(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;
- static const int *ieee80211_operat_mode_field[] = {
- &hf_ieee80211_operat_mode_field_channel_width,
- &hf_ieee80211_operat_mode_field_reserved,
- &hf_ieee80211_operat_mode_field_rxnss,
- &hf_ieee80211_operat_mode_field_rxnsstype,
+ static const int *ieee80211_tag_erp_info_flags[] = {
+ &hf_ieee80211_tag_erp_info_erp_present,
+ &hf_ieee80211_tag_erp_info_use_protection,
+ &hf_ieee80211_tag_erp_info_barker_preamble_mode,
+ &hf_ieee80211_tag_erp_info_reserved,
NULL
};
- /* Operating Mode field */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_operat_notification_mode,
- ett_mcsbit_tree, ieee80211_operat_mode_field,
+ if (tag_len != 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_erp_info,
+ ett_tag_erp_info_tree, ieee80211_tag_erp_info_flags,
ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
- return offset;
+
+ return tvb_captured_length(tvb);
}
+/* 7.3.2.32 TS Delay element (43) */
static int
-dissect_mcs_set(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean basic, gboolean vendorspecific)
+ieee80211_tag_ts_delay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- proto_item *ti;
- proto_tree *mcs_tree, *bit_tree;
- guint8 rx_nss, tx_nss; /* 0-4 for HT and 0-8 for VHT*/
- guint32 value_mcs_0_31, value_mcs_32_52, value_mcs_53_76;
- guint16 tx_mcs_set;
- rx_nss = tx_nss = 8;
- /* 16 byte Supported MCS set */
- if (vendorspecific)
- {
- ti = proto_tree_add_string(tree, hf_ieee80211_mcsset_vs, tvb, offset, 16,
- basic ? "Basic MCS Set" : "MCS Set");
- } else
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ if (tag_len != 4)
{
- ti = proto_tree_add_string(tree, hf_ieee80211_mcsset, tvb, offset, 16,
- basic ? "Basic MCS Set" : "MCS Set");
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
+ return tvb_captured_length(tvb);
}
- mcs_tree = proto_item_add_subtree(ti, ett_mcsset_tree);
-
- /* Rx MCS Bitmask */
- ti = proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_rx_bitmask, tvb, offset, 10, ENC_NA);
- bit_tree = proto_item_add_subtree(ti, ett_mcsbit_tree);
- /* Bits 0 - 31 */
- value_mcs_0_31 = tvb_get_letohl(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_ts_delay, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " : %d", tvb_get_ntohl(tvb, offset));
+ return tvb_captured_length(tvb);
+}
- /* Handle all zeroes/ff's case..*/
- if (value_mcs_0_31 != 0x0)
+/* 7.3.2.33 TCLAS Processing element (44) */
+static int
+ieee80211_tag_tclas_process(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;
+ if (tag_len != 1)
{
- if (!(value_mcs_0_31 & (0xffffff00))) {
- /*
- * At least one MCS from 0-7 is supported, but no MCS from 8-31 are
- * supported, so only 1 spatial stream is supported.
- */
- rx_nss = 0;
- } else if (!(value_mcs_0_31 & (0xffff0000))) {
- /*
- * At least one MCS from 8-15 is supported, but no MCS from 16-31 are
- * supported, so only 2 spatial streams are supported.
- */
- rx_nss = 1;
- } else if (!(value_mcs_0_31 & (0xff000000))) {
- /*
- * At least one MCS from 16-23 is supported, but no MCS from 24-31 are
- * supported, so only 3 spatial streams are supported.
- */
- rx_nss = 2;
- } else {
- /*
- * At least one MCS from 24-31 is supported, so 4 spatial streams
- * are supported.
- */
- rx_nss = 3;
- }
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
+ return tvb_captured_length(tvb);
}
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_0to7, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_8to15, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_16to23, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_24to31, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tclas_process, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " : %s", val_to_str(tvb_get_guint8(tvb, offset), ieee80211_tclas_process_flag, "Unknown %d"));
+ return tvb_captured_length(tvb);
+}
- /* Should be we check UEQM Supported?*/
- /* Bits 32 - 52 */
- value_mcs_32_52 = tvb_get_letohl(tvb, offset);
- if (!(value_mcs_32_52 & (0x1ffffe))) {
- /*
- * MCS 33-52 aren't supported, so the number of spatial streams we get
- * from whichever MCSes from 0-31 that we support is the total number
- * of spatial streams we support.
- */
- ;
- } else if (!(value_mcs_32_52 & (0x1fff80))) {
- /*
- * At least one MCS from 33-38 is supported, but no MCS from 39-52 is
- * supported, so we have at least 2 spatial streams, but none of the
- * MCSs in that range give us any more.
- */
- rx_nss = MAX(1, rx_nss);
- } else {
- /*
- * At least one MCS from 39-52 is supported, so we have at least 3
- * spatial streams.
- */
- rx_nss = MAX(2, rx_nss);
+/* 802.11-2012 8.4.2.37 QoS Capability element (46) */
+static int
+ieee80211_tag_qos_capability(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;
+ if (tag_len != 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
+ return tvb_captured_length(tvb);
}
+ dissect_qos_capability(tree, tvb, pinfo, offset, field_data->ftype);
+ return tvb_captured_length(tvb);
+}
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_32, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_33to38, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_39to52, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- /* Bits 53 - 76 */
- value_mcs_53_76 = tvb_get_letohl(tvb, offset);
- if ((value_mcs_53_76 & (0x1fffffe0))) {
- /*
- * At least one MCS from 53-76 is supported, so we have at least 4
- * spatial streams.
- */
- rx_nss = MAX(3, rx_nss);
+static int
+ieee80211_tag_rsn_ie(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;
+ if (tag_len < 18)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 18", tag_len);
+ return tvb_captured_length(tvb);
}
- proto_tree_add_item(bit_tree, hf_ieee80211_mcsset_rx_bitmask_53to76, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
-
- proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_highest_data_rate, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- /* Follow table 8-126 from 802.11-2012 */
- tx_mcs_set = tvb_get_letohs(tvb, offset);
+ dissect_rsn_ie(pinfo, tree, tvb, offset, tag_len, field_data->sanity_check);
+ return tvb_captured_length(tvb);
+}
- if (!(tx_mcs_set & 0x0001) && !(tx_mcs_set & 0x0002))
+/* 7.3.2.14 Extended Supported Rates element (50) */
+static int
+ieee80211_tag_ext_supp_rates(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;
+ if (tag_len < 1)
{
- /* TX MCS Set is not defined
- * so there is no interpretation for Max Tx Spatial Streams
- */
- tx_nss = 4; /* Not Defined*/
+ 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);
+ return tvb_captured_length(tvb);
}
- if ((tx_mcs_set & 0x0001) && !(tx_mcs_set & 0x0002))
+ while (offset < tag_len)
{
- /* TX MCS Set is defined to be equal to Rx MCS Set
- * So, get the Max Spatial Streams from Rx
- * MCS set
- */
- tx_nss = rx_nss;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ext_supp_rates, tvb, offset, 1, ENC_NA);
+ proto_item_append_text(field_data->item_tag, " %s,", val_to_str_ext_const(tvb_get_guint8(tvb, offset), &ieee80211_supported_rates_vals_ext, "Unknown Rate"));
+ offset += 1;
}
- proto_item_append_text(ti, ": %s", val_to_str(rx_nss, mcsset_tx_max_spatial_streams_flags, "Reserved:%d" ) );
+ proto_item_append_text(field_data->item_tag, " [Mbit/sec]");
+ return tvb_captured_length(tvb);
+}
- proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_mcs_set_defined, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- ti = proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_max_spatial_streams, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti, ", %s", val_to_str(tx_nss, mcsset_tx_max_spatial_streams_flags, "Reserved:%d" ) );
- proto_tree_add_item(mcs_tree, hf_ieee80211_mcsset_tx_unequal_modulation, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- offset += 1;
+static int
+ieee80211_tag_cisco_ccx1_ckip(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;
+ /* From WCS manual:
+ * If Aironet IE support is enabled, the access point sends an Aironet
+ * IE 0x85 (which contains the access point name, load, number of
+ * associated clients, and so on) in the beacon and probe responses of
+ * this WLAN, and the controller sends Aironet IEs 0x85 and 0x95
+ * (which contains the management IP address of the controller and
+ * the IP address of the access point) in the reassociation response
+ * if it receives Aironet IE 0x85 in the reassociation request.
+ */
- offset += 3;
- return offset;
+ if (tag_len < 26)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u too short, must be >= 26", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_unknown, tvb, offset, 10, ENC_NA);
+ offset += 10;
+
+ /* The Name of the sending device starts at offset 10 and is up to
+ 15 or 16 bytes in length, \0 padded */
+ proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_name, tvb, offset, 16, ENC_ASCII|ENC_NA);
+ offset += 16;
+
+ /* Total number off associated clients and repeater access points */
+ proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_clients, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_unknown2, tvb, offset, 3, ENC_NA);
+ return tvb_captured_length(tvb);
}
-/* 802.11n D1.10 - HT Information IE */
static int
-dissect_ht_info_ie_1_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_vendor_specific_ie(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;
- static const int *ieee80211_ht_info1_field[] = {
- &hf_ieee80211_ht_info_secondary_channel_offset,
- &hf_ieee80211_ht_info_channel_width,
- &hf_ieee80211_ht_info_rifs_mode,
- &hf_ieee80211_ht_info_psmp_stas_only,
- &hf_ieee80211_ht_info_service_interval_granularity,
- NULL
- };
+ guint32 tag_vs_len = tag_len;
+ guint32 oui;
- static const int *ieee80211_ht_info2_field[] = {
- &hf_ieee80211_ht_info_operating_mode,
- &hf_ieee80211_ht_info_non_greenfield_sta_present,
- &hf_ieee80211_ht_info_transmit_burst_limit,
- &hf_ieee80211_ht_info_obss_non_ht_stas_present,
- &hf_ieee80211_ht_info_reserved_1,
- NULL
- };
+ if (tag_len < 3)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 3", tag_len);
+ return tvb_captured_length(tvb);
+ }
- static const int *ieee80211_ht_info3_field[] = {
- &hf_ieee80211_ht_info_reserved_2,
- &hf_ieee80211_ht_info_dual_beacon,
- &hf_ieee80211_ht_info_dual_cts_protection,
- &hf_ieee80211_ht_info_secondary_beacon,
- &hf_ieee80211_ht_info_lsig_txop_protection_full_support,
- &hf_ieee80211_ht_info_pco_active,
- &hf_ieee80211_ht_info_pco_phase,
- &hf_ieee80211_ht_info_reserved_3,
- NULL
- };
+ proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
+ proto_item_append_text(field_data->item_tag, ": %s", uint_get_manuf_name_if_known(oui));
+ offset += 3;
+ tag_vs_len -= 3;
- if (tag_len < 22) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "HT Information IE content length %u wrong, must be at least 22 bytes", tag_len);
- return 1;
+ if (tag_len > 0) {
+ proto_tree_add_item(field_data->item_tag, hf_ieee80211_tag_vendor_oui_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
}
- proto_tree_add_item(tree, hf_ieee80211_ht_info_primary_channel, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ switch (oui) {
+ /* 802.11 specific vendor ids */
+ case OUI_WPAWME:
+ dissect_vendor_ie_wpawme(tree, tvb, pinfo, offset, tag_vs_len, field_data->ftype);
+ break;
+ case OUI_RSN:
+ dissect_vendor_ie_rsn(field_data->item_tag, tree, tvb, offset, tag_vs_len);
+ break;
+ case OUI_PRE11N:
+ dissect_vendor_ie_ht(tvb, pinfo, tree, offset, field_data->item_tag, field_data->item_tag_length, tag_vs_len);
+ break;
+ case OUI_WFA:
+ dissect_vendor_ie_wfa(pinfo, field_data->item_tag, tvb);
+ break;
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_info_delimiter1,
- ett_ht_info_delimiter1_tree, ieee80211_ht_info1_field,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
+ /* Normal IEEE vendor ids (from oui.h) */
+ case OUI_CISCOWL: /* Cisco Wireless (Aironet) */
+ dissect_vendor_ie_aironet(field_data->item_tag, tree, tvb, offset, tag_vs_len);
+ break;
+ case OUI_MARVELL:
+ dissect_vendor_ie_marvell(field_data->item_tag, tree, tvb, offset, tag_vs_len);
+ break;
+ case OUI_ATHEROS:
+ dissect_vendor_ie_atheros(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo, field_data->item_tag_length);
+ break;
+ case OUI_ARUBA:
+ dissect_vendor_ie_aruba(field_data->item_tag, tree, tvb, offset, tag_vs_len);
+ break;
+ case OUI_NINTENDO:
+ dissect_vendor_ie_nintendo(field_data->item_tag, tree, tvb, offset, tag_vs_len);
+ break;
+ case OUI_MIKROTIK:
+ dissect_vendor_ie_mikrotik(field_data->item_tag, tree, tvb, offset, tag_vs_len);
+ break;
+ case OUI_MERU:
+ dissect_vendor_ie_meru(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
+ break;
+ case OUI_ZEBRA_EXTREME:
+ dissect_vendor_ie_extreme(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
+ break;
+ case OUI_AEROHIVE:
+ dissect_vendor_ie_aerohive(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
+ break;
+ default:
+ proto_tree_add_item(tree, hf_ieee80211_tag_vendor_data, tvb, offset, tag_vs_len, ENC_NA);
+ break;
+ }
+ return tvb_captured_length(tvb);
+}
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_info_delimiter2,
- ett_ht_info_delimiter2_tree, ieee80211_ht_info2_field,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
+#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
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_info_delimiter3,
- ett_ht_info_delimiter3_tree, ieee80211_ht_info3_field,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
+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 }
+};
- offset = dissect_mcs_set(tree, tvb, offset, TRUE, FALSE);
+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 }
+};
- return offset;
-}
+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 int
-dissect_wapi_param_set(tvbuff_t *tvb, packet_info *pinfo,
- proto_tree *tree, int offset, guint32 tag_len, proto_item *ti_len,
- proto_item *ti, int ftype)
-{
- /* Parse the WAPI Parameter Set IE Here*/
- proto_item *item;
- proto_tree *subtree;
- guint16 loop_cnt, version, akm_cnt = 1, ucast_cnt = 1, bkid_cnt = 1;
- guint8 akm_suite_type = 0, ucast_cipher_type = 0, mcast_cipher_type = 0;
- static const int *ieee80211_tag_wapi_param_set[] = {
- &hf_ieee80211_tag_wapi_param_set_capab_preauth,
- &hf_ieee80211_tag_wapi_param_set_capab_rsvd,
- NULL
- };
+static const int *he_phy_first_byte_headers[] = {
+ &hf_he_phy_cap_dual_band_support,
+ NULL,
+};
- version = tvb_get_letohs(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+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
+};
- /*MIN: 2 + (2+4)+ (2+4) + 4 + 2 + 0 (BKID CNT and LIST) =20*/
- if (tag_len < 20) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
- "tag_len is %d, it's neither WAPI not BSS-AC-Access-Delay", tag_len);
- return offset;
- }
+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_doppler_tx,
+ &hf_he_phy_cap_doppler_rx,
+ &hf_he_phy_cap_full_bw_ul_mu_mimo,
+ &hf_he_phy_cap_partial_bw_ul_mu_mimo,
+ NULL
+};
- if (version != 1) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
- "Version of WAPI protocol is %d, must be = 1", version);
- return offset;
- }
+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_40mhz_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_80_rx_headers [] = {
+ &hf_he_mcs_max_he_mcs_80_rx_1_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_2_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_3_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_4_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_5_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_6_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_7_ss,
+ &hf_he_mcs_max_he_mcs_80_rx_8_ss,
+ NULL
+};
+
+static const int *he_mcs_map_80_tx_headers [] = {
+ &hf_he_mcs_max_he_mcs_80_tx_1_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_2_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_3_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_4_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_5_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_6_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_7_ss,
+ &hf_he_mcs_max_he_mcs_80_tx_8_ss,
+ NULL
+};
+
+static const int *he_mcs_map_80p80_rx_headers [] = {
+ &hf_he_mcs_max_he_mcs_80p80_rx_1_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_2_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_3_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_4_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_5_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_6_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_7_ss,
+ &hf_he_mcs_max_he_mcs_80p80_rx_8_ss,
+ NULL
+};
+
+static const int *he_mcs_map_80p80_tx_headers [] = {
+ &hf_he_mcs_max_he_mcs_80p80_tx_1_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_2_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_3_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_4_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_5_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_6_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_7_ss,
+ &hf_he_mcs_max_he_mcs_80p80_tx_8_ss,
+ NULL
+};
+
+static const int *he_mcs_map_160_rx_headers [] = {
+ &hf_he_mcs_max_he_mcs_160_rx_1_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_2_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_3_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_4_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_5_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_6_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_7_ss,
+ &hf_he_mcs_max_he_mcs_160_rx_8_ss,
+ NULL
+};
+
+static const int *he_mcs_map_160_tx_headers [] = {
+ &hf_he_mcs_max_he_mcs_160_tx_1_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_2_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_3_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_4_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_5_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_6_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_7_ss,
+ &hf_he_mcs_max_he_mcs_160_tx_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 }
+};
- /* AKM Suites: list can't be 0*/
- akm_cnt = tvb_get_letohs(tvb, offset);
- item = proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_akm_suite_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+#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_bits_15_16;
+ he_mac_headers[10] = &hf_he_reserved_bit_18;
+ he_mac_headers[11] = &hf_he_reserved_bit_19;
+ he_mac_headers[17] = &hf_he_reserved_bit_25;
+ }
+ 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;
- if (akm_cnt != 0) {
- proto_item_append_text(ti, " : AKM Suite List:");
- for (loop_cnt = 0; loop_cnt < akm_cnt; loop_cnt++) {
- subtree = proto_item_add_subtree(item, ett_tag_wapi_param_set_akm_tree);
- proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_akm_suite_oui, tvb, offset, 3, ENC_NA);
- offset += 3;
- akm_suite_type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_akm_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_item_append_text(ti, " (%d,%s)", loop_cnt+1, val_to_str(akm_suite_type,
- ieee80211_wapi_suite_type_short, "Reserved: %d"));
- }
- proto_item_append_text(ti, " /");
- } else {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Number of AKM suites is 0, must be min 1");
- return offset;
- }
- /* Unicast Cipher Suites: list can't be 0*/
- ucast_cnt = tvb_get_letohs(tvb, offset);
- item = proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ /* 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_80_rx_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_80_tx_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
offset += 2;
- if (ucast_cnt != 0) {
- proto_item_append_text(ti, " Unicast Cipher List:");
- for (loop_cnt = 0; loop_cnt < ucast_cnt; loop_cnt++) {
- subtree = proto_item_add_subtree(item, ett_tag_wapi_param_set_ucast_tree);
- proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
- offset += 3;
- ucast_cipher_type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(subtree, hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_item_append_text(ti, " (%d,%s)", loop_cnt+1, val_to_str(ucast_cipher_type, ieee80211_wapi_cipher_type, "Reserved: %d"));
- }
- proto_item_append_text(ti, " /");
- } else {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length, "Number of Unicast Cipher suites is 0, must be min 1");
- return offset;
+ 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_160_rx_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_160_tx_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
}
- /* Multicast Cipher Suites*/
- proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui, tvb, offset, 3, ENC_NA);
- offset += 3;
- mcast_cipher_type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_item_append_text(ti, " Multicast Cipher: %s", val_to_str(mcast_cipher_type, ieee80211_wapi_cipher_type, "Reserved: %d"));
+ 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_80p80_rx_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_80p80_tx_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+ }
- /* WAPI capability */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_wapi_param_set_capab,
- ett_tag_wapi_param_set_preauth_tree, ieee80211_tag_wapi_param_set,
- 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);
- /* BKID List: The list can be 0
- * Applicable only for assoc/re-assoc
- */
- if (ftype == MGT_ASSOC_REQ || ftype == MGT_REASSOC_REQ ) {
- bkid_cnt = tvb_get_letohs(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_bkid_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- if (bkid_cnt != 0) {
- for (loop_cnt = 0; loop_cnt < bkid_cnt; loop_cnt++) {
- proto_tree_add_item(tree, hf_ieee80211_tag_wapi_param_set_bkid_list, tvb, offset, 16, ENC_NA);
- offset += 16;
+ /*
+ * Now, for each of the nss values, add a sub-tree with its thresholds.
+ * The actual count is one more than the number in the first three bits.
+ */
+ while (nss_index < nss_count + 1) {
+ 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 |
+ ((tvb_get_guint8(tvb, offset) &
+ ((1 << bits_needed) - 1)) << bits_avail);
+ }
+ /*
+ * 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++;
}
}
- return offset;
-}
-static int
-dissect_bss_max_idle_period(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- int offset = 0;
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_max_idle_period,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_max_idle_options_protected,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- return offset;
+ /* Add an Expert Info about extra bytes ... */
+
}
-enum tfs_request_subelem_id {
- TFS_REQ_SUBELEM_TFS = 1,
- TFS_REQ_SUBELEM_VENDOR_SPECIFIC = 221
+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 tfs_request_subelem_ids[] = {
- { TFS_REQ_SUBELEM_TFS, "TFS subelement" },
- { TFS_REQ_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific subelement" },
+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 int
-dissect_tfs_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+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_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- const guint8 ids[] = {
- 1, /* TFS Subelement */
- TAG_VENDOR_SPECIFIC_IE
- };
+ guint32 op_params = tvb_get_letohl(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_id,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_ac_delete_after_match,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_ac_notify,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- if (offset + 1 >= tag_len) {
- expert_add_info_format(pinfo, tree, &ei_ieee80211_missing_data,
- "No TFS Request subelements in TFS Request");
- return tvb_captured_length(tvb);
- }
+ 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;
- while (offset + 1 < tag_len) {
- guint8 id, len;
- int s_offset, s_end;
+ 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;
- id = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem_id,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- len = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem_len,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- if (offset + len > tag_len) {
- expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
- "Not enough data for TFS Request subelement");
- return tvb_captured_length(tvb);
- }
- switch (id) {
- case TFS_REQ_SUBELEM_TFS:
- s_offset = offset;
- s_end = offset + len;
- while (s_offset < s_end) {
- /* TODO 1 is interpreted as TAG_SUPP_RATES, fix this! */
- int tlen = add_tagged_field(pinfo, tree, tvb, s_offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
- if (tlen==0)
- break;
- s_offset += tlen;
- }
- break;
- default:
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_request_subelem,
- tvb, offset, len, ENC_NA);
- break;
- }
- offset += len;
- }
+ if (op_params & VHT_OPERATION_INFORMATION_PRESENT) {
+ proto_tree *vht_op_info = NULL;
+ proto_item *pi = NULL;
- if (offset < tag_len) {
- proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
- tvb, offset, tag_len - offset, "Extra data after TFS Subelements");
- }
+ 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++;
+ }
- return tvb_captured_length(tvb);
+ if (op_params & MULTIPLE_BSSID_AP) {
+ proto_tree_add_item(tree, hf_he_operation_max_bssid_indicator, tvb, offset,
+ 1, ENC_NA);
+ offset++;
+ }
}
-enum tfs_response_subelem_id {
- TFS_RESP_SUBELEM_TFS_STATUS = 1,
- TFS_RESP_SUBELEM_TFS = 2,
- TFS_RESP_SUBELEM_VENDOR_SPECIFIC = 221
+static const int *uora_headers[] = {
+ &hf_he_uora_eocwmin,
+ &hf_he_uora_owcwmax,
+ &hf_he_uora_reserved,
+ NULL
};
-static const value_string tfs_response_subelem_ids[] = {
- { TFS_RESP_SUBELEM_TFS_STATUS, "TFS Status subelement" },
- { TFS_RESP_SUBELEM_TFS, "TFS subelement" },
- { TFS_RESP_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific subelement" },
- { 0, 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_tfs_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_muac_param_record(tvbuff_t *tvb, proto_tree *tree, int offset)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- const guint8 ids[] = {
- 1, /* TFS Status subelement*/
- 2, /* TFS subelement */
- TAG_VENDOR_SPECIFIC_IE
- };
+ proto_tree_add_item(tree, hf_he_muac_aci_aifsn, tvb, offset, 1, ENC_NA);
+ offset++;
- while (offset + 3 <= tag_len) {
- guint8 id, len;
- int s_offset, s_end;
+ proto_tree_add_item(tree, hf_he_muac_ecwmin_ecwmax, tvb, offset, 1, ENC_NA);
+ offset++;
- id = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem_id,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- len = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem_len,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- if (offset + len > tag_len) {
- expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length,
- "Not enough data for TFS Request subelement");
- return tvb_captured_length(tvb);
- }
- switch (id) {
- case TFS_RESP_SUBELEM_TFS_STATUS:
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_status,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_id,
- tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
- break;
- case TFS_RESP_SUBELEM_TFS:
- s_offset = offset;
- s_end = offset + len;
- while (s_offset < s_end) {
- /* TODO Element IDs 1 and 2 are misinterpreted! */
- int tlen = add_tagged_field(pinfo, tree, tvb, s_offset, field_data->ftype, ids, G_N_ELEMENTS(ids), NULL);
- if (tlen==0)
- break;
- s_offset += tlen;
- }
- break;
- default:
- proto_tree_add_item(tree, hf_ieee80211_tag_tfs_response_subelem,
- tvb, offset, len, ENC_NA);
- break;
- }
+ proto_tree_add_item(tree, hf_he_mu_edca_timer, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ return offset;
+}
+
+static int
+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;
- offset += len;
- }
+ /* 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++;
- if (offset < tag_len) {
- proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
- tvb, offset, tag_len - offset, "Extra data after TFS Subelements");
- }
+ 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);
- return tvb_captured_length(tvb);
+ 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);
+
+ return offset;
}
-static const value_string wnm_sleep_mode_action_types[] = {
- { 0, "Enter WNM-Sleep Mode" },
- { 1, "Exit WNM-Sleep Mode" },
- { 0, NULL }
-};
+#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 value_string wnm_sleep_mode_response_status_vals[] = {
- { 0, "Enter/Exit WNM-Sleep Mode Accept" },
- { 1, "Exit WNM-Sleep Mode Accept, GTK/IGTK update required" },
- { 2, "Denied. The AP is unable to perform the requested action." },
- { 3, "Denied temporarily. The AP is unable to perform the requested action "
- "at the current time. The request can be submitted again at a later time."
- },
- { 4, "Denied. Due to the pending key expiration." },
- { 5, "Denied. The requested action was not granted due to other WNM services "
- "in use by the requesting STA." },
- { 0, NULL }
+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 int
-dissect_wnm_sleep_mode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+dissect_spatial_reuse_parameter_set(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
{
- int offset = 0;
- proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_action_type,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset++;
- proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_response_status,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ 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++;
- proto_tree_add_item(tree, hf_ieee80211_tag_wnm_sleep_mode_interval,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+
+ 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;
+ }
+
return offset;
}
-static const value_string time_adv_timing_capab_vals[] = {
- { 0, "No standardized external time source" },
- { 1, "Timestamp offset based on UTC" },
- { 2, "UTC time at which the TSF timer is 0" },
- { 0, NULL }
+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 int
-dissect_time_adv(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+static void
+dissect_bss_color_change(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
{
- int offset = 0;
- guint8 capab;
- proto_item *item;
- proto_tree *subtree;
- struct tm tm, *now;
- time_t t;
+ proto_tree_add_item(tree, hf_he_bss_color_change_switch_countdown, tvb, offset,
+ 1, ENC_NA);
+ offset++;
- capab = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_timing_capab,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ 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);
+}
- switch (capab) {
- case 1:
- proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_value,
- tvb, offset, 10, ENC_NA);
- offset += 10;
+static const int *ess_info_field_headers[] = {
+ &hf_he_ess_report_planned_ess,
+ &hf_he_ess_report_edge_of_ess,
+ NULL
+};
- proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_error,
- tvb, offset, 5, ENC_NA);
- offset += 5;
- break;
- case 2:
- item = proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_value,
- tvb, offset, 10, ENC_NA);
- subtree = proto_item_add_subtree(item, ett_tag_time_adv_tree);
- memset(&tm, 0, sizeof(tm));
- tm.tm_year = tvb_get_letohs(tvb, offset) - 1900;
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_year,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- tm.tm_mon = tvb_get_guint8(tvb, offset) - 1;
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_month,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- tm.tm_mday = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_day,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- tm.tm_hour = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_hours,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- tm.tm_min = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_minutes,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- tm.tm_sec = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_seconds,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(subtree,
- hf_ieee80211_tag_time_adv_time_value_milliseconds,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(subtree, hf_ieee80211_tag_time_adv_time_value_reserved,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+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;
- tm.tm_isdst = -1;
- t = mktime(&tm);
- if (t != -1) {
- t += (time_t)(last_timestamp / 1000000);
- now = localtime(&t);
- if (now)
- proto_item_append_text(item,
- ": current time=%u-%02u-%02u %02u:%02u:%02u",
- now->tm_year + 1900, now->tm_mon + 1,
- now->tm_mday, now->tm_hour, now->tm_min,
- now->tm_sec);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_error,
- tvb, offset, 5, ENC_NA);
- offset += 5;
+ 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)");
+}
- proto_tree_add_item(tree, hf_ieee80211_tag_time_adv_time_update_counter,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- break;
+/*
+ * There will be from 1 to 4 24-bit fields in the order of AC=BK, AC=BE,
+ * AC=VI and AC=VO.
+ */
+
+static const int *esp_headers[] = {
+ &hf_ieee80211_esp_access_category,
+ &hf_ieee80211_esp_reserved,
+ &hf_ieee80211_esp_data_format,
+ &hf_ieee80211_esp_ba_windows_size,
+ &hf_ieee80211_esp_est_air_time_frac,
+ &hf_ieee80211_esp_data_ppdu_duration_target,
+ NULL
+};
+
+static const value_string esp_access_category_vals[] = {
+ { 0, "AC=BK" },
+ { 1, "AC=BE" },
+ { 2, "AC=VI" },
+ { 3, "AC=VO" },
+ { 0, NULL }
+};
+
+static const value_string esp_data_format_vals[] = {
+ { 0, "No aggregation is expected to be performed" },
+ { 1, "A-MSDU aggregation is expected but not A-MPDUs when type is data" },
+ { 2, "A-MSDU aggregation is NOT expected but A-MPDUs aggregation is when type is data" },
+ { 3, "A-MSDU aggregation is expected and A-MPDU aggregation is when type is data" },
+ { 0, NULL }
+};
+
+static const value_string esp_ba_window_size_vals[] = {
+ { 0, "Block Ack not expected to be used" },
+ { 1, "2" },
+ { 2, "4" },
+ { 3, "6" },
+ { 4, "8" },
+ { 5, "16" },
+ { 6, "32" },
+ { 7, "64" },
+ { 0, NULL }
+};
+
+static int
+dissect_estimated_service_params(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len)
+{
+ while (len > 0) {
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_estimated_service_params, ett_ieee80211_esp,
+ esp_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 3;
+ len -= 3;
}
return offset;
}
static int
-dissect_time_zone(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+dissect_future_channel_guidance(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, int len _U_)
{
- int tag_len = tvb_reported_length(tvb);
- int offset = 0;
+ proto_tree_add_item(tree, hf_ieee80211_fcg_new_channel_number, tvb, offset,
+ 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tag_time_zone, tvb, offset, tag_len,
- ENC_ASCII|ENC_NA);
- return tvb_captured_length(tvb);
+ if (len - 4 > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_fcg_extra_info, tvb, offset, len - 4,
+ ENC_NA);
+ offset += len - 4;
+ }
+
+ return offset;
}
static int
-dissect_ap_channel_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+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;
+ int ext_tag_len;
+ guint8 ext_tag_no;
- if (tag_len < 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "AP Channel Report length %u wrong, must be > 1", tag_len);
+ if (tag_len < 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 1", tag_len);
return tvb_captured_length(tvb);
}
+ ext_tag_no = tvb_get_guint8(tvb, offset++);
+ ext_tag_len = tag_len - 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_ap_channel_report_operating_class, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": Operating Class %u, Channel List :", tvb_get_guint8(tvb, offset));
- offset += 1;
-
- while (offset < tag_len)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_ap_channel_report_channel_list, tvb, offset, 1, ENC_NA);
- proto_item_append_text(field_data->item_tag, " %u,", tvb_get_guint8(tvb, offset));
- offset += 1;
- }
- return tvb_captured_length(tvb);
-}
+ switch (ext_tag_no) {
+ case ETAG_FILS_SESSION:
+ proto_tree_add_item(tree, hf_ieee80211_fils_session, tvb, offset, ext_tag_len, ENC_NA);
+ break;
+ case ETAG_FILS_WRAPPED_DATA:
+ proto_tree_add_item(tree, hf_ieee80211_fils_wrapped_data, tvb, offset, ext_tag_len, ENC_NA);
+ break;
+ case ETAG_FILS_NONCE:
+ proto_tree_add_item(tree, hf_ieee80211_fils_nonce, tvb, offset, ext_tag_len, ENC_NA);
+ break;
+ case ETAG_ESTIMATED_SERVICE_PARAM:
+ dissect_estimated_service_params(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ case ETAG_FUTURE_CHANNEL_GUIDANCE:
+ dissect_future_channel_guidance(tvb, pinfo, tree, offset, ext_tag_len);
+ 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:
-static int
-dissect_secondary_channel_offset_ie(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;
- if (tag_len != 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Secondary Channel Offset length %u wrong, must be = 1", tag_len);
- return 1;
+ break;
+ case ETAG_ESS_REPORT:
+ dissect_ess_report(tvb, pinfo, tree, offset, ext_tag_len);
+ break;
+ default:
+ break;
}
- proto_tree_add_item(tree, hf_ieee80211_tag_secondary_channel_offset, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
return tvb_captured_length(tvb);
}
-/* BSS Average Access Delay element (63) */
+/* Conflict: WAPI Vs. IEEE */
static int
-dissect_bss_avg_access_delay_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_ie_68_conflict(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;
- if (tag_len != 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "BSS Average Access Delay length %u wrong, must be = 1", tag_len);
- return 1;
+ if (tag_len >= 20) { /* It Might be WAPI*/
+ dissect_wapi_param_set(tvb, pinfo, tree, 0, tag_len, field_data->item_tag_length, field_data->item_tag, field_data->ftype);
+ }
+ else { /* BSS AC Access Delay (68) */
+ dissect_bss_ac_access_delay_ie(tvb, pinfo, tree, 0, tag_len, field_data->item_tag_length);
}
-
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_ap_avg_access_delay, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
return tvb_captured_length(tvb);
}
static int
-dissect_antenna_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_mesh_peering_mgmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
int offset = 0;
- if (tag_len != 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Antenna length %u wrong, must be = 1", tag_len);
- return 1;
- }
+ proto_tree_add_item(tree, hf_ieee80211_mesh_peering_proto, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_mesh_peering_local_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ switch (tvb_get_guint8(tvb, 1))
+ { /* Self-protected action field */
+ case SELFPROT_ACTION_MESH_PEERING_OPEN:
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tag_antenna_id, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
+ case SELFPROT_ACTION_MESH_PEERING_CONFIRM:
+ proto_tree_add_item(tree, hf_ieee80211_mesh_peering_peer_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ break;
+
+ case SELFPROT_ACTION_MESH_PEERING_CLOSE:
+ if ((tag_len == 8) || (tag_len == 24))
+ {
+ proto_tree_add_item(tree, hf_ieee80211_mesh_peering_peer_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ add_ff_reason_code(tree, tvb, pinfo, offset);
+ break;
+ /* unexpected values */
+ default:
+ proto_tree_add_expert(tree, pinfo, &ei_ieee80211_mesh_peering_unexpected , tvb, offset, tag_len);
+ break;
+ }
+ if (tag_len - offset == 16)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, ENC_NA);
+ }
return tvb_captured_length(tvb);
}
static int
-dissect_rsni_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_mesh_configuration(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
int offset = 0;
+ proto_item *item;
+ proto_tree *subtree;
+ static const int *ieee80211_mesh_config_cap[] = {
+ &hf_ieee80211_mesh_config_cap_accepting,
+ &hf_ieee80211_mesh_config_cap_mcca_support,
+ &hf_ieee80211_mesh_config_cap_mcca_enabled,
+ &hf_ieee80211_mesh_config_cap_forwarding,
+ &hf_ieee80211_mesh_config_cap_mbca_enabled,
+ &hf_ieee80211_mesh_config_cap_tbtt_adjusting,
+ &hf_ieee80211_mesh_config_cap_power_save_level,
+ NULL
+ };
- if (tag_len != 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "RSNI length %u wrong, must be = 1", tag_len);
- return 1;
- }
-
- proto_tree_add_item(tree, hf_ieee80211_tag_rsni, tvb,
- offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_mesh_config_path_sel_protocol, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_mesh_config_path_sel_metric, tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_mesh_config_congestion_control, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_mesh_config_sync_method, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_mesh_config_auth_protocol, tvb, offset + 4, 1, ENC_LITTLE_ENDIAN);
+ item = proto_tree_add_item(tree, hf_ieee80211_mesh_config_formation_info, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
+ subtree = proto_item_add_subtree(item, ett_mesh_formation_info_tree);
+ proto_tree_add_item(subtree, hf_ieee80211_mesh_form_info_num_of_peerings, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_mesh_config_capability,
+ ett_mesh_config_cap_tree, ieee80211_mesh_config_cap,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
return tvb_captured_length(tvb);
}
static int
-dissect_measurement_pilot_trans_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+ieee80211_tag_mesh_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- int tag_len = tvb_reported_length(tvb);
int offset = 0;
- const guint8 ids[] = { TAG_VENDOR_SPECIFIC_IE };
-
- /* The tag len can be 1 or more if there are sub-elements */
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int tag_len = tvb_reported_length(tvb);
+ const guint8* mesh_id;
- proto_tree_add_item(tree, hf_ieee80211_ff_measurement_pilot_int, tvb, offset,
- 1, ENC_NA);
+ proto_tree_add_item_ret_string(tree, hf_ieee80211_mesh_id, tvb, offset, tag_len, ENC_ASCII|ENC_NA, wmem_packet_scope(), &mesh_id);
+ if (tag_len > 0) {
+ gchar* s = format_text(wmem_packet_scope(), mesh_id, tag_len);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", MESHID=%s", s);
+ proto_item_append_text(field_data->item_tag, ": %s", s);
+ }
+ /* Make sure dissector is accepted */
+ return ((tag_len > 0) ? tag_len : 1);
+}
- tag_len--;
- offset++;
+static int
+ieee80211_tag_mesh_preq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
- /* Also handle the optional sub-elements */
+ guint32 flags;
+ guint8 targs, i;
- if (tag_len > 0) {
- while (tag_len > 0) {
- gint8 elt_len = 0;
+ proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN, &flags);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_pdid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sta, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
- elt_len = tvb_get_guint8(tvb, offset + 1);
+ if (flags & (1<<6)) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_ext, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ }
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ targs = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ for (i = 0; i < targs; i++) {
+ const int * targ_flags[] = {
+ &hf_ieee80211_ff_hwmp_targ_to_flags,
+ &hf_ieee80211_ff_hwmp_targ_usn_flags,
+ NULL
+ };
- if(add_tagged_field(pinfo, tree, tvb, offset + 2, 0, ids, G_N_ELEMENTS(ids), NULL) == 0){
- /* TODO: Add an expert info here and skip the field. */
- break;
- }
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_hwmp_targ_flags,
+ ett_hwmp_targ_flags_tree, targ_flags, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- tag_len -= elt_len + 2;
- offset += elt_len + 2;
- }
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
}
return tvb_captured_length(tvb);
}
static int
-dissect_bss_available_admission_capacity_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_mesh_prep(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
int offset = 0;
- guint16 bitmask;
- static const int *ieee80211_tag_bss_avb_adm_cap_bitmask[] = {
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3,
- &hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv,
- NULL
- };
-
- if (tag_len < 2) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "BSS Available Admission Capacity length %u wrong, must > = 2", tag_len);
- return offset;
- }
-
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_bss_avb_adm_cap_bitmask,
- ett_tag_bss_bitmask_tree, ieee80211_tag_bss_avb_adm_cap_bitmask,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- bitmask = tvb_get_letohs(tvb, offset);
- offset += 2;
- if(bitmask & BSS_BITMASK_UP0)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up0, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP1)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP2)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up2, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP3)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up3, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP4)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up4, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP5)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up5, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP6)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up6, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_UP7)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_up7, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_AC0)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac0, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_AC1)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac1, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_AC2)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac2, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- if(bitmask & BSS_BITMASK_AC3)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avb_adm_cap_ac3, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ guint32 flags;
+ proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN, &flags);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset , 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ if (flags & (1<<6)) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_ext, tvb, offset, 6, ENC_NA);
+ offset += 6;
}
- return offset;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sta, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
}
static int
-dissect_bss_ac_access_delay_ie(tvbuff_t *tvb, packet_info *pinfo,
- proto_tree *tree, int offset, guint32 tag_len, proto_item *ti_len)
+ieee80211_tag_mesh_perr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
+ int offset = 0;
+ guint8 targs, i;
- if (tag_len != 4) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
- "BSS AC Access Delay length %u wrong, must = 4", tag_len);
- return offset;
- }
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ targs = tvb_get_guint8(tvb, offset);
+ offset += 1;
+ for (i = 0; i < targs; i++) {
+ guint8 flags = tvb_get_guint8(tvb, offset);
- /* TODO: Display the scaled representation of the average
- medium access delay (a big (precalculed) value_string ?)
- See 8.4.2.46 BSS AC Access Delay element ... */
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ if (flags & (1<<6)) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_ext, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ }
+ offset += add_ff_reason_code(tree, tvb, pinfo, offset);
+ }
+ return tvb_captured_length(tvb);
+}
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_be, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_bk, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+static int
+ieee80211_tag_rann(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ proto_tree_add_item(tree, hf_ieee80211_rann_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_vi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_bss_avg_ac_access_delay_vo, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
-
- return offset;
+ proto_tree_add_item(tree, hf_ieee80211_rann_root_sta, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_rann_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_rann_interval, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
}
-/* RM Enabled Capabilities (70) */
+/* Mesh Channel Switch Parameters (118) */
static int
-dissect_rm_enabled_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_mesh_channel_switch(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;
- proto_item *ti_ex_cap;
- static const int *ieee80211_tag_rm_enabled_capabilities_octet1[] = {
- &hf_ieee80211_tag_rm_enabled_capabilities_b0,
- &hf_ieee80211_tag_rm_enabled_capabilities_b1,
- &hf_ieee80211_tag_rm_enabled_capabilities_b2,
- &hf_ieee80211_tag_rm_enabled_capabilities_b3,
- &hf_ieee80211_tag_rm_enabled_capabilities_b4,
- &hf_ieee80211_tag_rm_enabled_capabilities_b5,
- &hf_ieee80211_tag_rm_enabled_capabilities_b6,
- &hf_ieee80211_tag_rm_enabled_capabilities_b7,
+ static const int * ieee80211_mesh_chswitch_flag[] = {
+ &hf_ieee80211_mesh_chswitch_flag_initiator,
+ &hf_ieee80211_mesh_chswitch_flag_txrestrict,
NULL
};
- static const int *ieee80211_tag_rm_enabled_capabilities_octet2[] = {
- &hf_ieee80211_tag_rm_enabled_capabilities_b8,
- &hf_ieee80211_tag_rm_enabled_capabilities_b9,
- &hf_ieee80211_tag_rm_enabled_capabilities_b10,
- &hf_ieee80211_tag_rm_enabled_capabilities_b11,
- &hf_ieee80211_tag_rm_enabled_capabilities_b12,
- &hf_ieee80211_tag_rm_enabled_capabilities_b13,
- &hf_ieee80211_tag_rm_enabled_capabilities_b14,
- &hf_ieee80211_tag_rm_enabled_capabilities_b15,
- NULL
- };
+ if (tag_len != 6)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
+ return tvb_captured_length(tvb);
+ }
- static const int *ieee80211_tag_rm_enabled_capabilities_octet3[] = {
- &hf_ieee80211_tag_rm_enabled_capabilities_b16,
- &hf_ieee80211_tag_rm_enabled_capabilities_b17,
- &hf_ieee80211_tag_rm_enabled_capabilities_b18to20,
- &hf_ieee80211_tag_rm_enabled_capabilities_b21to23,
- NULL
- };
+ proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(field_data->item_tag, " TTL: %d", tvb_get_guint8(tvb, offset));
+ offset += 1;
- static const int *ieee80211_tag_rm_enabled_capabilities_octet4[] = {
- &hf_ieee80211_tag_rm_enabled_capabilities_b24to26,
- &hf_ieee80211_tag_rm_enabled_capabilities_b27,
- &hf_ieee80211_tag_rm_enabled_capabilities_b28,
- &hf_ieee80211_tag_rm_enabled_capabilities_b29,
- &hf_ieee80211_tag_rm_enabled_capabilities_b30,
- &hf_ieee80211_tag_rm_enabled_capabilities_b31,
- NULL
- };
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_mesh_channel_switch_flag,
+ ett_mesh_chswitch_flag_tree, ieee80211_mesh_chswitch_flag, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 1;
- static const int *ieee80211_tag_rm_enabled_capabilities_octet5[] = {
- &hf_ieee80211_tag_rm_enabled_capabilities_b32,
- &hf_ieee80211_tag_rm_enabled_capabilities_b33,
- &hf_ieee80211_tag_rm_enabled_capabilities_o5,
- NULL
- };
+ proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_reason_code, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- if (tag_len != 5)
+ proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_precedence_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+/* Mesh Awake Window Parameters (119) */
+static int
+ieee80211_tag_mesh_awake_window(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;
+
+ if (tag_len != 2) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
+ "Tag length %u wrong, must be = 2", tag_len);
+ return tvb_captured_length(tvb);
+ }
+
+ proto_tree_add_item(tree, hf_ieee80211_mesh_awake_window, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+ieee80211_tag_channel_switch_announcement(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;
+ if (tag_len != 4)
{
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "RM Enabled Capabilities length %u wrong, must = 5", tag_len);
- return 1;
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
+ return tvb_captured_length(tvb);
}
- proto_item_append_text(field_data->item_tag, " (%d octets)", tag_len);
- /* RM Enabled Capability octet 1 */
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
- ett_tag_rm_cap1, ieee80211_tag_rm_enabled_capabilities_octet1,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 1)");
- offset += 1;
+ add_ff_extended_channel_switch_announcement(tree, tvb, pinfo, offset);
+ return tvb_captured_length(tvb);
+}
- /* RM Enabled Capability octet 2 */
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
- ett_tag_rm_cap2, ieee80211_tag_rm_enabled_capabilities_octet2,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 2)");
- offset += 1;
+static int
+ieee80211_tag_supported_operating_classes(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;
+ proto_item* item = NULL;
+ guint8 i;
+ guint8 field_len = 0;
+ guint8 alt_op_class_field[256];
- /* RM Enabled Capability octet 3 */
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
- ett_tag_rm_cap3, ieee80211_tag_rm_enabled_capabilities_octet3,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 3)");
- offset += 1;
+ if (tag_len < 2) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 2", tag_len);
+ return tvb_captured_length(tvb);
+ } else if (tag_len > 255) {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, uint8 <= 255", tag_len);
+ return tvb_captured_length(tvb);
+ }
- /* RM Enabled Capability octet 4 */
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
- ett_tag_rm_cap4, ieee80211_tag_rm_enabled_capabilities_octet4,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 4)");
- offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_supported_ope_classes_current, tvb, offset++, 1, ENC_NA);
- /* RM Enabled Capability octet 5 */
- ti_ex_cap = proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_rm_enabled_capabilities,
- ett_tag_rm_cap5, ieee80211_tag_rm_enabled_capabilities_octet5,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- proto_item_append_text(ti_ex_cap, " (octet 5)");
- offset += 1;
+ for (i = offset; i < tag_len; i++) {
+ guint8 op_class = tvb_get_guint8(tvb, i);
+ /* Field terminates immediately before OneHundredAndThirty or Zero delimiter */
+ if (op_class == 130 || op_class == 0) {
+ break;
+ }
+ alt_op_class_field[field_len++] = op_class;
+ }
+ if (field_len) {
+ item = proto_tree_add_item(tree, hf_ieee80211_tag_supported_ope_classes_alternate, tvb, offset, field_len, ENC_NA);
+ }
+ for (i = 0; i < field_len; i++) {
+ proto_item_append_text(item, i == 0 ? ": %d":", %d", alt_op_class_field[i]);
+ }
- return offset;
+ /* TODO parse optional Current Operating Class Extension Sequence field */
+ /* TODO parse optional Operating Class Duple Sequence field */
+ return tvb_captured_length(tvb);
+}
+
+static int
+ieee80211_tag_bss_parameter_change(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;
+ gboolean size;
+ if (tag_len != 7)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 7", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ size = (tvb_get_guint8(tvb, offset) & 0x02) >> 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_move, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_size, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tbtt_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ if(size == TRUE) { /* if size bit is 0, the field is reserved. */
+ proto_tree_add_item(tree, hf_ieee80211_tag_bi_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ }
+ return tvb_captured_length(tvb);
}
-/* 20/40 BSS Coexistence (72) */
static int
-dissect_20_40_bss_coexistence(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_dmg_capabilities(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;
- static const int *ieee80211_20_40_bss_coexistence_fields[] = {
- &hf_ieee80211_tag_20_40_bc_information_request,
- &hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant,
- &hf_ieee80211_tag_20_40_bc_20_mhz_bss_witdh_request,
- &hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request,
- &hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant,
- &hf_ieee80211_tag_20_40_bc_reserved,
+
+ static const int * ieee80211_tag_dmg_cap1[] = {
+ &hf_ieee80211_tag_reverse_direction,
+ &hf_ieee80211_tag_hlts,
+ &hf_ieee80211_tag_tpc,
+ &hf_ieee80211_tag_spsh,
+ &hf_ieee80211_tag_rx_antenna,
+ &hf_ieee80211_tag_fast_link,
+ &hf_ieee80211_tag_num_sectors,
+ &hf_ieee80211_tag_rxss_length,
+ &hf_ieee80211_tag_reciprocity,
+ &hf_ieee80211_tag_max_ampdu_exp,
NULL
};
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "20/40 BSS Coexistence length %u wrong, must = 1", tag_len);
- return 1;
- }
-
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_20_40_bc,
- ett_tag_20_40_bc, ieee80211_20_40_bss_coexistence_fields,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
-
- offset += 1;
-
- return offset;
-}
-
-static int
-dissect_ht_capability_ie_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
- guint32 tag_len, proto_item *ti_len, gboolean vendorspecific)
-{
- proto_item *cap_item, *ti;
- proto_tree *cap_tree;
- static const int *ieee80211_ht[] = {
- &hf_ieee80211_ht_ldpc_coding,
- &hf_ieee80211_ht_chan_width,
- &hf_ieee80211_ht_sm_pwsave,
- &hf_ieee80211_ht_green,
- &hf_ieee80211_ht_short20,
- &hf_ieee80211_ht_short40,
- &hf_ieee80211_ht_tx_stbc,
- &hf_ieee80211_ht_rx_stbc,
- &hf_ieee80211_ht_delayed_block_ack,
- &hf_ieee80211_ht_max_amsdu,
- &hf_ieee80211_ht_dss_cck_40,
- &hf_ieee80211_ht_psmp,
- &hf_ieee80211_ht_40_mhz_intolerant,
- &hf_ieee80211_ht_l_sig,
+ static const int * ieee80211_tag_dmg_cap2[] = {
+ &hf_ieee80211_tag_min_mpdu_spacing,
+ &hf_ieee80211_tag_ba_flow_control,
+ &hf_ieee80211_tag_max_sc_rx_mcs,
+ &hf_ieee80211_tag_max_ofdm_rx_mcs,
+ &hf_ieee80211_tag_max_sc_tx_mcs,
+ &hf_ieee80211_tag_max_ofdm_tx_mcs,
NULL
};
- static const int *ieee80211_htex[] = {
- &hf_ieee80211_htex_pco,
- &hf_ieee80211_htex_transtime,
- &hf_ieee80211_htex_mcs,
- &hf_ieee80211_htex_htc_support,
- &hf_ieee80211_htex_rd_responder,
+ static const int * ieee80211_tag_dmg_cap3[] = {
+ &hf_ieee80211_tag_low_power_supported,
+ &hf_ieee80211_tag_code_rate,
+ &hf_ieee80211_tag_dtp,
+ &hf_ieee80211_tag_appdu_supp,
+ &hf_ieee80211_tag_heartbeat,
+ &hf_ieee80211_tag_other_aid,
+ &hf_ieee80211_tag_pattern_recip,
+ &hf_ieee80211_tag_heartbeat_elapsed,
+ &hf_ieee80211_tag_grant_ack_supp,
+ &hf_ieee80211_tag_RXSSTxRate_supp,
NULL
};
- static const int *ieee80211_txbf[] = {
- &hf_ieee80211_txbf_cap,
- &hf_ieee80211_txbf_rcv_ssc,
- &hf_ieee80211_txbf_tx_ssc,
- &hf_ieee80211_txbf_rcv_ndp,
- &hf_ieee80211_txbf_tx_ndp,
- &hf_ieee80211_txbf_impl_txbf,
- &hf_ieee80211_txbf_calib,
- &hf_ieee80211_txbf_expl_csi,
- &hf_ieee80211_txbf_expl_uncomp_fm,
- &hf_ieee80211_txbf_expl_comp_fm,
- &hf_ieee80211_txbf_expl_bf_csi,
- &hf_ieee80211_txbf_expl_uncomp_fm_feed,
- &hf_ieee80211_txbf_expl_comp_fm_feed,
- &hf_ieee80211_txbf_min_group,
- &hf_ieee80211_txbf_csi_num_bf_ant,
- &hf_ieee80211_txbf_uncomp_sm_bf_ant,
- &hf_ieee80211_txbf_comp_sm_bf_ant,
- &hf_ieee80211_txbf_csi_max_rows_bf,
- &hf_ieee80211_txbf_chan_est,
- &hf_ieee80211_txbf_resrv,
+ static const int * ieee80211_tag_dmg_cap4[] = {
+ &hf_ieee80211_tag_pcp_tddti,
+ &hf_ieee80211_tag_pcp_PSA,
+ &hf_ieee80211_tag_pcp_handover,
+ &hf_ieee80211_tag_pcp_max_assoc,
+ &hf_ieee80211_tag_pcp_power_src,
+ &hf_ieee80211_tag_pcp_decenter,
+ &hf_ieee80211_tag_pcp_forwarding,
+ &hf_ieee80211_tag_pcp_center,
NULL
};
- static const int *ieee80211_antsel[] = {
- &hf_ieee80211_antsel_b0,
- &hf_ieee80211_antsel_b1,
- &hf_ieee80211_antsel_b2,
- &hf_ieee80211_antsel_b3,
- &hf_ieee80211_antsel_b4,
- &hf_ieee80211_antsel_b5,
- &hf_ieee80211_antsel_b6,
- &hf_ieee80211_antsel_b7,
+ static const int * ieee80211_tag_dmg_cap5[] = {
+ &hf_ieee80211_tag_ext_sc_mcs_max_tx,
+ &hf_ieee80211_tag_ext_sc_mcs_tx_code_7_8,
+ &hf_ieee80211_tag_ext_sc_mcs_max_rx,
+ &hf_ieee80211_tag_ext_sc_mcs_rx_code_7_8,
NULL
};
- if (tag_len != 26) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
- "HT Capabilities IE length %u wrong, must be = 26", tag_len);
- return (offset > 0) ? offset : 1;
- }
-
- if (wlan_ignore_draft_ht && vendorspecific)
- return (offset > 0) ? offset : 1;
-
- /* 2 byte HT Capabilities Info*/
- if (vendorspecific)
- {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_vs_cap,
- ett_ht_cap_tree, ieee80211_ht,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- }
- else
+ /*
+ * Plenty of devices still do not conform to the older version of this
+ * field. So, it must be at least 17 bytes in length.
+ */
+ if (tag_len < 17)
{
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ht_cap,
- ett_ht_cap_tree, ieee80211_ht,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must contain at least 17 bytes", tag_len);
+ return tvb_captured_length(tvb);
}
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_dmg_capa_sta_addr, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_tag_dmg_capa_aid, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_dmg_cap1, ENC_LITTLE_ENDIAN);
+ offset += 3;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_dmg_cap2, ENC_LITTLE_ENDIAN);
+ offset += 3;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_dmg_cap3, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_dmg_cap4, ENC_LITTLE_ENDIAN);
offset += 2;
- /* 1 byte A-MPDU Parameters */
- if (vendorspecific)
- {
- cap_item = proto_tree_add_item(tree, hf_ieee80211_ampduparam_vs, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- } else
+ /*
+ * There are many captures out there that do not conform to the 2016
+ * version, so give them a malformed IE message now after we have dissected
+ * the above
+ */
+ if (tag_len != 22)
{
- cap_item = proto_tree_add_item(tree, hf_ieee80211_ampduparam, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u does not conform to IEEE802.11-2016, should contain 22 bytes", tag_len);
+ return tvb_captured_length(tvb);
}
- cap_tree = proto_item_add_subtree(cap_item, ett_ampduparam_tree);
- ti = proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_mpdu, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(ti, " (%04.0f[Bytes])", pow(2, 13+(tvb_get_guint8(tvb, offset) & 0x3))-1);
- proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_mpdu_start_spacing, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(cap_tree, hf_ieee80211_ampduparam_reserved, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+
+ proto_tree_add_item(tree, hf_ieee80211_tag_sta_beam_track, tvb, offset, 2, ENC_NA);
+ offset += 2;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_dmg_cap5, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_max_basic_sf_amsdu, tvb, offset, 1, ENC_NA);
offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_max_short_sf_amsdu, tvb, offset, 1, ENC_NA);
- /* 16 byte MCS set */
- offset = dissect_mcs_set(tree, tvb, offset, FALSE, vendorspecific);
+ return tvb_captured_length(tvb);
+}
+static int
+ieee80211_tag_dmg_operation(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;
+ static const int * ieee80211_tag_dmg_operation_flags[] = {
+ &hf_ieee80211_tag_pcp_tddti,
+ &hf_ieee80211_tag_pcp_PSA,
+ &hf_ieee80211_tag_pcp_handover,
+ NULL
+ };
- /* 2 byte HT Extended Capabilities */
- if (vendorspecific)
+ if (tag_len != 10)
{
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_htex_vs_cap,
- ett_htex_cap_tree, ieee80211_htex,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- } else {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_htex_cap,
- ett_htex_cap_tree, ieee80211_htex,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 10", tag_len);
+ return tvb_captured_length(tvb);
}
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_dmg_operation_flags, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_PSRSI, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_min_BHI_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_brdct_sta_info_dur, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_assoc_resp_confirm_time, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_min_pp_duration, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_SP_idle_timeout, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_max_lost_beacons, tvb, offset, 1, ENC_NA);
+ return tvb_captured_length(tvb);
+}
+static int
+ieee80211_tag_antenna_section_id(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;
+ static const int * ieee80211_tag_antenna[] = {
+ &hf_ieee80211_tag_type,
+ &hf_ieee80211_tag_tap1,
+ &hf_ieee80211_tag_state1,
+ &hf_ieee80211_tag_tap2,
+ &hf_ieee80211_tag_state2,
+ NULL
+ };
- /* 4 byte TxBF capabilities */
- if (vendorspecific)
+ if (tag_len != 4)
{
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_txbf_vs,
- ett_txbf_tree, ieee80211_txbf,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- } else {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_txbf,
- ett_txbf_tree, ieee80211_txbf,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ proto_tree_add_bitmask_list(tree, tvb, offset, 4, ieee80211_tag_antenna, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
+
+static int
+ieee80211_tag_extended_schedule(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;
+ int i;
+ gboolean isGrant;
+ proto_tree * alloc_tree;
+ if ((tag_len%15) != 0)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be N*15 where 0<=N<=17", tag_len);
+ return tvb_captured_length(tvb);
}
- offset += 4;
+ isGrant = ((field_data->ftype==CTRL_GRANT)||(field_data->ftype==CTRL_GRANT_ACK));
+ for(i=0; i < tag_len; i+=15) {
+ alloc_tree = proto_tree_add_subtree_format(tree, tvb, offset, 15, ett_allocation_tree, NULL, "Allocation %d", i/15);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_allocation_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_allocation_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_pseudo_static, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_truncatable, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_extendable, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_pcp_active, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_lp_sc_used, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ offset += add_ff_beamforming_ctrl(alloc_tree, tvb, pinfo, offset, isGrant);
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_src_aid, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_dest_aid, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_block_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_num_blocks, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_block_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ return tvb_captured_length(tvb);
+}
- /* 1 byte Antenna Selection (ASEL) capabilities */
- if (vendorspecific)
+static int
+ieee80211_tag_sta_availability(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;
+ int i;
+ proto_tree * sta_info_tree;
+ if ((tag_len%2) != 0)
{
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_antsel_vs,
- ett_antsel_tree, ieee80211_antsel,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be N*2 where N>=0", tag_len);
+ return tvb_captured_length(tvb);
}
- else
- {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_antsel,
- ett_antsel_tree, ieee80211_antsel,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ for(i=0; i < tag_len; i+=2) {
+ sta_info_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_sta_info, NULL, "STA Info %d", i/2);
+ proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_cbap, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_pp_avail, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
}
- offset += 1;
-
- return offset;
+ return tvb_captured_length(tvb);
}
static int
-dissect_ht_capability_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_next_dmg_ati(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;
-
- return dissect_ht_capability_ie_common(tvb, pinfo, tree, 0, tvb_reported_length(tvb),
- field_data->item_tag_length, FALSE);
+ int offset = 0;
+ if (tag_len != 6)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ proto_tree_add_item(tree, hf_ieee80211_tag_next_ati_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tag_next_ati_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
}
static int
-dissect_ht_info_ie_1_0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset,
- guint32 tag_len, proto_item *ti_len)
+ieee80211_tag_nextpcp_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- static const int *ieee80211_hta1[] = {
- &hf_ieee80211_hta_ext_chan_offset,
- &hf_ieee80211_hta_rec_tx_width,
- &hf_ieee80211_hta_rifs_mode,
- &hf_ieee80211_hta_controlled_access,
- &hf_ieee80211_hta_service_interval,
- NULL
- };
-
- static const int *ieee80211_hta2[] = {
- &hf_ieee80211_hta_operating_mode,
- &hf_ieee80211_hta_non_gf_devices,
- NULL
- };
-
- static const int *ieee80211_hta3[] = {
- &hf_ieee80211_hta_basic_stbc_mcs,
- &hf_ieee80211_hta_dual_stbc_protection,
- &hf_ieee80211_hta_secondary_beacon,
- &hf_ieee80211_hta_lsig_txop_protection,
- &hf_ieee80211_hta_pco_active,
- &hf_ieee80211_hta_pco_phase,
- NULL
- };
-
- if (tag_len != 22) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
- "Tag length %u wrong, must be = 22", tag_len);
- return offset;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ int i;
+ if (tag_len < 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 1", tag_len);
+ return tvb_captured_length(tvb);
}
-
- if (wlan_ignore_draft_ht)
- return offset;
-
- /* 1 HT Control Channel */
- proto_tree_add_item(tree, hf_ieee80211_hta_cc, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
-
- /* 1 byte HT additional capabilities */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap1,
- ett_hta_cap_tree, ieee80211_hta1,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ proto_tree_add_item(tree, hf_ieee80211_tag_nextpcp_token, tvb, offset, 1, ENC_NA);
offset += 1;
-
- /* 2 byte HT additional capabilities */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap2,
- ett_hta_cap1_tree, ieee80211_hta2,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
-
- /* 2 byte HT additional capabilities */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_hta_cap2,
- ett_hta_cap2_tree, ieee80211_hta3,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 2;
-
- /* 16 byte Supported MCS set */
- offset = dissect_mcs_set(tree, tvb, offset, FALSE, TRUE);
-
- return offset;
+ for(i=0; i < tag_len-1; i+=1) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_nextpcp_list, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ return tvb_captured_length(tvb);
}
-/* 802.11n-D1.10 and 802.11n-D2.0, 7.1.3.5a */
-
-/*
- * 8.2.4.1.10 "Order field" says:
- *
- * The Order field is 1 bit in length. It is used for two purposes:
- *
- * -- It is set to 1 in a non-QoS data frame transmitted by a non-QoS
- * STA to indicate that the frame contains an MSDU, or fragment
- * thereof, that is being transferred using the StrictlyOrdered
- * service class.
- *
- * -- It is set to 1 in a QoS data or management frame transmitted
- * with a value of HT_GF or HT_MF for the FORMAT parameter of the
- * TXVECTOR to indicate that the frame contains an HT Control field.
- *
- * 802.11ac changes the second of those clauses to say "HT_GF, HT_MF,
- * or VHT", indicates that bit B0 of the field is 0 for HT and 1 for
- * VHT (stealing a reserved bit from the Link Adaptation Control field),
- * and that everything except for "AC Constraint" and "RDG/More Cowbell^W
- * PPDU" is different for the VHT version.
- *
- * 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
- * that we do *not* have to determine, from radio metadata, whether the
- * frame was transmitted as an HT or VHT frame.
- *
- * (See bug 11351, in which a frame with an HT Control field, with a
- * radiotap header, lacks the MCS or VHT fields in the radiotap header,
- * so Wireshark has no clue that it's an HT or VHT field, and misdissected
- * 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.)
- */
-
-static void
-dissect_ht_control(proto_tree *tree, tvbuff_t *tvb, int offset)
+static int
+ieee80211_tag_pcp_handover(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- proto_item *ti;
- proto_tree *htc_tree, *lac_subtree, *mfb_subtree;
- guint32 htc;
-
- htc = tvb_get_letohl(tvb, offset);
-
- ti = proto_tree_add_item(tree, hf_ieee80211_htc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- htc_tree = proto_item_add_subtree(ti, ett_htc_tree);
-
- /* 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);
- }
- 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_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);
- } else {
- /* Start: Link Adaptation Control */
- ti = proto_tree_add_item(htc_tree, hf_ieee80211_htc_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);
-
- if (HTC_IS_ASELI(htc)) {
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_aseli, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_mrq, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- if (HTC_LAC_MAI_MRQ(htc)) {
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_msi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mai_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- }
- }
-
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mfsi, tvb, offset, 2, ENC_LITTLE_ENDIAN);
-
- if (HTC_IS_ASELI(htc)) {
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_asel_command, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_asel_data, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(lac_subtree, hf_ieee80211_htc_lac_mfb, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- }
- /* End: Link Adaptation Control */
-
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_cal_pos, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_cal_seq, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_reserved1, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(htc_tree, hf_ieee80211_htc_csi_steering, tvb, offset, 4, ENC_LITTLE_ENDIAN);
-
- 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);
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
+ if (tag_len != 13)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 13", tag_len);
+ return tvb_captured_length(tvb);
}
- 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);
+ proto_tree_add_item(tree, hf_ieee80211_tag_old_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_tag_new_pcp_addr, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(tree, hf_ieee80211_tag_reamaining_BI, tvb, offset, 1, ENC_NA);
+ return tvb_captured_length(tvb);
+}
- /* offset += 2; */
+static int
+ieee80211_tag_beamlink_maintenance(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;
+ if (tag_len != 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ add_ff_beamformed_link(tree, tvb, pinfo, offset);
+ return tvb_captured_length(tvb);
}
-#define IEEE80211_COMMON_OPT_BROKEN_FC 0x00000001
-#define IEEE80211_COMMON_OPT_IS_CENTRINO 0x00000002
-#define IEEE80211_COMMON_OPT_NORMAL_QOS 0x00000004
+static int
+ieee80211_tag_quiet_period_res(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;
+ if (tag_len != 10)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 10", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ proto_tree_add_item(tree, hf_ieee80211_tag_request_token, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ add_ff_sta_address(tree, tvb, pinfo, offset);
+ return tvb_captured_length(tvb);
+}
-static void
-dissect_frame_control(proto_tree *tree, tvbuff_t *tvb, guint32 option_flags,
- guint32 offset, packet_info *pinfo)
+static int
+ieee80211_tag_relay_transfer_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint16 fcf, flags, frame_type_subtype;
- proto_tree *fc_tree, *flag_tree;
- proto_item *fc_item, *flag_item, *hidden_item, *ti;
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
- fcf = FETCH_FCF(offset);
+ if (tag_len != 8)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ proto_tree_add_item(tree, hf_ieee80211_tag_duplex_relay, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_cooperation_relay, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tx_mode, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_link_change_interval, tvb, offset+1, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_data_sensing_time, tvb, offset+2, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_first_period, tvb, offset+3, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_second_period, tvb, offset+5, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- flags = FCF_FLAGS(fcf);
- frame_type_subtype = COMPOSE_FRAME_TYPE(fcf);
+static int
+ieee80211_tag_dmg_beam_refinement(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;
+ static const int * ieee80211_dmg_beam_refinement_fields[] = {
+ &hf_ieee80211_tag_initiator,
+ &hf_ieee80211_tag_tx_train_res,
+ &hf_ieee80211_tag_rx_train_res,
+ &hf_ieee80211_tag_tx_trn_ok,
+ &hf_ieee80211_tag_txss_fbck_req,
+ &hf_ieee80211_tag_bs_fbck,
+ &hf_ieee80211_tag_bs_fbck_antenna_id,
+ &hf_ieee80211_tag_snr_requested,
+ &hf_ieee80211_tag_channel_measurement_requested,
+ &hf_ieee80211_tag_number_of_taps_requested,
+ &hf_ieee80211_tag_sector_id_order_req,
+ &hf_ieee80211_tag_snr_present,
+ &hf_ieee80211_tag_channel_measurement_present,
+ &hf_ieee80211_tag_tap_delay_present,
+ &hf_ieee80211_tag_number_of_taps_present,
+ &hf_ieee80211_tag_number_of_measurement,
+ &hf_ieee80211_tag_sector_id_order_present,
+ &hf_ieee80211_tag_number_of_beams,
+ &hf_ieee80211_tag_mid_extension,
+ &hf_ieee80211_tag_capability_request,
+ &hf_ieee80211_tag_beam_refine_reserved,
+ NULL
+ };
- /* Swap offset... */
- if(option_flags & IEEE80211_COMMON_OPT_BROKEN_FC)
+ if (tag_len != 5)
{
- offset += 1;
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 5", tag_len);
+ return tvb_captured_length(tvb);
}
- proto_tree_add_uint(tree, hf_ieee80211_fc_frame_type_subtype, tvb, offset, 1, frame_type_subtype);
-
- fc_item = proto_tree_add_item(tree, hf_ieee80211_fc_field, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_bitmask_list(tree, tvb, offset, 5, ieee80211_dmg_beam_refinement_fields, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- fc_tree = proto_item_add_subtree(fc_item, ett_fc_tree);
+static int
+ieee80211_tag_wakeup_schedule_ad(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;
- proto_tree_add_item(fc_tree, hf_ieee80211_fc_proto_version, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(fc_tree, hf_ieee80211_fc_frame_type, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(fc_tree, hf_ieee80211_fc_frame_subtype, tvb, offset, 1, ENC_NA);
- /* Changing control frame extension for extension frames */
- if(IS_FRAME_EXTENSION(fcf) == 1) {
- proto_tree_add_uint(fc_tree, hf_ieee80211_fc_frame_extension, tvb, offset, 1, FCF_FRAME_EXTENSION(fcf));
+ if (tag_len != 8)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
+ return tvb_captured_length(tvb);
}
- offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bi_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tag_sleep_cycle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_num_awake_bis, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- /* Reswap offset...*/
- if(option_flags & IEEE80211_COMMON_OPT_BROKEN_FC)
+static int
+ieee80211_tag_dmg_tspec(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;
+
+ gboolean isGrant;
+ int num_constraints;
+ if (tag_len < 14)
{
- offset -= 1;
- proto_item_append_text(fc_item, "(Swapped)");
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 14", tag_len);
+ return tvb_captured_length(tvb);
}
+ static const int * ieee80211_tag_tspec_flags[] = {
+ &hf_ieee80211_tag_tspec_allocation_id,
+ &hf_ieee80211_tag_tspec_allocation_type,
+ &hf_ieee80211_tag_tspec_allocation_format,
+ &hf_ieee80211_tag_tspec_pseudo_static,
+ &hf_ieee80211_tag_tspec_truncatable,
+ &hf_ieee80211_tag_tspec_extendable,
+ &hf_ieee80211_tag_tspec_lp_sc_used,
+ &hf_ieee80211_tag_tspec_up,
+ &hf_ieee80211_tag_tap2,
+ &hf_ieee80211_tag_tspec_dest_aid,
+ NULL
+ };
- /* Flags */
- flag_item = proto_tree_add_item(fc_tree, hf_ieee80211_fc_flags, tvb, offset, 1, ENC_NA);
- flag_tree = proto_item_add_subtree(flag_item, ett_proto_flags);
- /* Changing control frame flags for extension frames */
- if(IS_FRAME_EXTENSION(fcf) == 0) {
- proto_tree_add_item(flag_tree, hf_ieee80211_fc_data_ds, tvb, offset, 1, ENC_NA);
- hidden_item = proto_tree_add_item(flag_tree, hf_ieee80211_fc_to_ds, tvb, offset, 1, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(flag_tree, hf_ieee80211_fc_from_ds, tvb, offset, 1, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(flag_tree, hf_ieee80211_fc_more_frag, tvb, offset, 1, ENC_NA);
- ti = proto_tree_add_item(flag_tree, hf_ieee80211_fc_retry, tvb, offset, 1, ENC_NA);
- if( IS_RETRY(flags) )
- {
- expert_add_info(pinfo, ti, &ei_ieee80211_fc_retry);
- wlan_stats.fc_retry = 1;
- }
- }
- proto_tree_add_item(flag_tree, hf_ieee80211_fc_pwr_mgt, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(flag_tree, hf_ieee80211_fc_more_data, tvb, offset, 1, ENC_NA);
- /* Changing control frame flags for extension frames */
- if(IS_FRAME_EXTENSION(fcf) == 0) {
- proto_tree_add_item(flag_tree, hf_ieee80211_fc_protected, tvb, offset, 1, ENC_NA);
+ proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_tspec_flags, ENC_LITTLE_ENDIAN);
+ offset += 3;
+ isGrant = ((field_data->ftype==CTRL_GRANT)||(field_data->ftype==CTRL_GRANT_ACK));
+ offset += add_ff_beamforming_ctrl(tree, tvb, pinfo, 2, isGrant);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_allocation_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_min_allocation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_max_allocation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_min_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ num_constraints = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_num_of_constraints, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ while(num_constraints > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_interferer_mac, tvb, offset, 2, ENC_NA);
+ offset += 6;
+ num_constraints--;
}
- proto_tree_add_item(flag_tree, hf_ieee80211_fc_order, tvb, offset, 1, ENC_NA);
+ return tvb_captured_length(tvb);
}
-static void
-dissect_durid(proto_tree *hdr_tree, tvbuff_t *tvb, guint16 fts, gint offset)
+static int
+ieee80211_tag_channel_measurement_fb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
- guint16 durid = tvb_get_letohs(tvb, offset);
+ int tag_len = tvb_reported_length(tvb);
+ ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
+ int offset = 0;
- if (durid < 0x8000) {
- proto_tree_add_uint_format_value(hdr_tree, hf_ieee80211_did_duration, tvb,
- offset, 2, durid, "%u microseconds", durid);
- } else if (((durid & 0xC000) == 0xC000) &&
- ((durid & 0x3FFF) > 0) && ((durid & 0x3FFF) <= 2007) &&
- (fts == CTRL_PS_POLL)) {
- proto_tree_add_item(hdr_tree, hf_ieee80211_assoc_id, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- } else if (durid == 0x8000) {
- proto_tree_add_uint_format(hdr_tree, hf_ieee80211_did_duration, tvb,
- offset, 2, durid, "Duration/ID: %u", durid);
- } else {
- proto_tree_add_uint_format(hdr_tree, hf_ieee80211_did_duration, tvb,
- offset, 2, durid, "Duration/ID: %u (reserved)", durid & 0x3FFF);
+ int num_measurement;
+ if (tag_len%5 != 0)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be multiple of 5", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ num_measurement = tvb_get_guint8(tvb, offset+1);
+ offset += 2;
+ while(num_measurement > 0) {
+ proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_realtive_I, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_realtive_Q, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_tap_delay, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_sector_id, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_antenna_id, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ num_measurement--;
}
+ return tvb_captured_length(tvb);
}
-
-static void
-dissect_vendor_ie_ht(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
- guint offset, proto_item *item, proto_item *ti_len, gint tag_len)
+static int
+ieee80211_tag_awake_window(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;
- guint8 type;
-
- proto_tree_add_item(tree, hf_ieee80211_ht_pren_type, tvb, offset, 1, ENC_NA);
- type = tvb_get_guint8(tvb, offset);
- offset += 1;
- tag_len -= 1;
-
-
- switch(type){
- case 51:
- dissect_ht_capability_ie_common(tvb, pinfo, tree, offset, tag_len, ti_len, TRUE);
- proto_item_append_text(item, ": HT Capabilities (802.11n D1.10)");
- break;
-
- case 52:
- dissect_ht_info_ie_1_0(tvb, pinfo, tree, offset, tag_len, ti_len);
- proto_item_append_text(item, ": HT Additional Capabilities (802.11n D1.00)");
- break;
-
- default:
- proto_tree_add_item(tree, hf_ieee80211_ht_pren_unknown, tvb, offset, tag_len, ENC_NA);
- break;
+ if (tag_len != 2)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 2", tag_len);
}
-
+ else
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_awake_window, tvb, 0, 2, ENC_LITTLE_ENDIAN);
+ }
+ return tvb_captured_length(tvb);
}
static int
-dissect_interworking(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_addba_ext(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;
- static const int *ieee80211_tag_interworking[] = {
- &hf_ieee80211_tag_interworking_access_network_type,
- &hf_ieee80211_tag_interworking_internet,
- &hf_ieee80211_tag_interworking_asra,
- &hf_ieee80211_tag_interworking_esr,
- &hf_ieee80211_tag_interworking_uesa,
- NULL
- };
-
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_interworking, ENC_LITTLE_ENDIAN);
- offset += 1;
-
- if ((tag_len == (1 + 2)) || (tag_len == (1 + 2 + 6))) {
- dissect_venue_info(tree, tvb, offset);
- offset += 2;
- }
- if ((tag_len == (1 + 6)) || (tag_len == (1 + 2 + 6))) {
- proto_tree_add_item(tree, hf_ieee80211_tag_interworking_hessid,
- tvb, offset, 6, ENC_NA);
- offset += 6;
+ if (tag_len != 1)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
}
-
- if ((tag_len != 1) && (tag_len != (1 + 2)) && (tag_len != (1 + 6)) && (tag_len != (1 + 2 + 6))) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Invalid Interworking element length");
+ 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);
+ proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_reserved, tvb, 0, 1, ENC_NA);
}
-
- return offset;
+ return tvb_captured_length(tvb);
}
static int
-dissect_qos_map_set(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_multi_band(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;
- guint8 left;
- guint8 val, val2;
- int i;
- proto_item *dscp_item, *item;
- proto_tree *dscp_tree;
+ gboolean chiper_present, addr_present;
+ static const int * ieee80211_tag_multi_band_ctrl[] = {
+ &hf_ieee80211_tag_multi_band_ctrl_sta_role,
+ &hf_ieee80211_tag_multi_band_ctrl_addr_present,
+ &hf_ieee80211_tag_multi_band_ctrl_cipher_present,
+ NULL
+ };
+ static const int * ieee80211_tag_multi_band_conn[] = {
+ &hf_ieee80211_tag_multi_band_conn_ap,
+ &hf_ieee80211_tag_multi_band_conn_pcp,
+ &hf_ieee80211_tag_multi_band_conn_dls,
+ &hf_ieee80211_tag_multi_band_conn_tdls,
+ &hf_ieee80211_tag_multi_band_conn_ibss,
+ NULL
+ };
- if (tag_len < 16 || tag_len & 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_bad_length,
- "Truncated QoS Map Set element");
+ if (tag_len < 22)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 22", tag_len);
return tvb_captured_length(tvb);
}
+ chiper_present = (tvb_get_letohs(tvb, offset) & 0x08) >> 3;
+ addr_present = (tvb_get_letohs(tvb, offset) & 0x10) >> 4;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_multi_band_ctrl, ENC_NA);
+ offset += 1;
+ offset += add_ff_band_id(tree, tvb, pinfo, 1);
+ proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_oper_class, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_channel_number, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_bssid, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ offset += add_ff_beacon_interval(tree, tvb, pinfo, 2);
+ proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_tsf_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
- left = tag_len - 16;
- while (left >= 2) {
- dscp_item = proto_tree_add_item(tree, hf_ieee80211_tag_qos_map_set_dscp_exc,
- tvb, offset, 2, ENC_NA);
- dscp_tree = proto_item_add_subtree(dscp_item, ett_qos_map_set_exception);
-
- item = proto_tree_add_item(dscp_tree,
- hf_ieee80211_tag_qos_map_set_dscp_exc_val,
- tvb, offset, 1, ENC_NA);
- val = tvb_get_guint8(tvb, offset);
- if (val > 63 && val != 255) {
- expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
- "Invalid DSCP Value");
- }
- offset++;
-
- item = proto_tree_add_item(dscp_tree,
- hf_ieee80211_tag_qos_map_set_dscp_exc_up,
- tvb, offset, 1, ENC_NA);
- val2 = tvb_get_guint8(tvb, offset);
- if (val2 > 7) {
- expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
- "Invalid User Priority");
- }
- offset++;
-
- proto_item_append_text(dscp_item, " (0x%02x: UP %u)", val, val2);
-
- left -= 2;
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_multi_band_conn, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_fst_timeout, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ if(addr_present)
+ {
+ proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_sta_mac, tvb, offset, 6, ENC_NA);
+ offset += 6;
}
+ if(chiper_present)
+ {
+ proto_item *rsn_pcs_count, *rsn_pcs_item, *rsn_sub_pcs_item;
+ proto_tree *rsn_pcs_tree, *rsn_sub_pcs_tree;
+ gint ii;
+ guint16 pcs_count;
+ int tag_end = tvb_reported_length(tvb);
+ rsn_pcs_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ pcs_count = tvb_get_letohs(tvb, offset);
+ offset += 2;
- for (i = 0; i < 8; i++) {
- dscp_item = proto_tree_add_item(tree, hf_ieee80211_tag_qos_map_set_range,
- tvb, offset, 2, ENC_NA);
- dscp_tree = proto_item_add_subtree(dscp_item, ett_qos_map_set_exception);
-
- item = proto_tree_add_item(dscp_tree, hf_ieee80211_tag_qos_map_set_low,
- tvb, offset, 1, ENC_NA);
- val = tvb_get_guint8(tvb, offset);
- if (val > 63 && val != 255) {
- expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
- "Invalid DSCP Value");
+ if (offset + (pcs_count * 4) > tag_end)
+ {
+ expert_add_info_format(pinfo, rsn_pcs_count, &ei_ieee80211_rsn_pcs_count,
+ "Pairwise Cipher Suite Count too large, 4*%u > %d", pcs_count, tag_end - offset);
+ pcs_count = (tag_end - offset) / 4;
}
- offset++;
- item = proto_tree_add_item(dscp_tree, hf_ieee80211_tag_qos_map_set_high,
- tvb, offset, 1, ENC_NA);
- val2 = tvb_get_guint8(tvb, offset);
- if ((val2 > 63 && val2 != 255) || val2 < val ||
- (val == 255 && val2 != 255) || (val != 255 && val2 == 255)) {
- expert_add_info_format(pinfo, item, &ei_ieee80211_inv_val,
- "Invalid DSCP Value");
- }
- offset++;
+ rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, ENC_NA);
+ rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree);
+ for (ii = 0; ii < pcs_count; ii++)
+ {
+ rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, ENC_BIG_ENDIAN);
+ rsn_sub_pcs_tree = proto_item_add_subtree(rsn_sub_pcs_item, ett_rsn_sub_pcs_tree);
+ proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
- if (val == 255 && val2 == 255) {
- proto_item_append_text(dscp_item, " (UP %u not in use)", i);
- } else {
- proto_item_append_text(dscp_item, " (0x%02x-0x%02x: UP %u)",
- val, val2, i);
+ /* Check if OUI is 00:0F:AC (ieee80211) */
+ if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
+ {
+ proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(rsn_pcs_item, " %s", rsn_pcs_return(tvb_get_ntohl(tvb, offset)));
+ } else {
+ proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
+ }
+ offset += 4;
}
}
}
static int
-dissect_roaming_consortium(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+ieee80211_tag_dmg_link_margin(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;
- proto_item* item;
- guint8 oi_lens, oi1_len, oi2_len;
- proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_num_anqp_oi,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ if (tag_len != 8)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
+ return tvb_captured_length(tvb);
+ }
+ proto_tree_add_item(tree, hf_ieee80211_tag_activity, tvb, offset, 1, ENC_NA);
offset += 1;
-
- oi_lens = tvb_get_guint8(tvb, offset);
- oi1_len = oi_lens & 0x0f;
- oi2_len = (oi_lens & 0xf0) >> 4;
- proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi1_len,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi2_len,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_ieee80211_tag_dmg_link_adapt_mcs, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_dmg_link_adapt_link_margin, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset, 1, ENC_NA);
offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ref_timestamp, tvb, offset, 3, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- if (offset + oi1_len > tag_len) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Truncated Roaming Consortium element");
+static int
+ieee80211_tag_dmg_link_adaption_ack(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;
+
+ if (tag_len != 5)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 5", tag_len);
return tvb_captured_length(tvb);
}
+ proto_tree_add_item(tree, hf_ieee80211_tag_activity, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_ieee80211_tag_ref_timestamp, tvb, offset, 3, ENC_LITTLE_ENDIAN);
+ return tvb_captured_length(tvb);
+}
- item = proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi1,
- tvb, offset, oi1_len, ENC_NA);
- add_manuf(item, tvb, offset);
- offset += oi1_len;
+static int
+ieee80211_tag_switching_stream(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;
+ static const int * ieee80211_tag_switching_stream_flags[] = {
+ &hf_ieee80211_tag_switching_stream_old_tid,
+ &hf_ieee80211_tag_switching_stream_old_direction,
+ &hf_ieee80211_tag_switching_stream_new_tid,
+ &hf_ieee80211_tag_switching_stream_new_direction,
+ &hf_ieee80211_tag_switching_stream_new_valid_id,
+ &hf_ieee80211_tag_switching_stream_llt_type,
+ NULL
+ };
- if (offset + oi2_len > tag_len) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Truncated Roaming Consortium element");
+ int param_num;
+ if (tag_len < 4)
+ {
+ expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 4", tag_len);
return tvb_captured_length(tvb);
}
-
- if (oi2_len > 0) {
- proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi2,
- tvb, offset, oi2_len, ENC_NA);
- offset += oi2_len;
+ offset += add_ff_band_id(tree, tvb, pinfo, 1);
+ offset += add_ff_band_id(tree, tvb, pinfo, 1);
+ proto_tree_add_item(tree, hf_ieee80211_tag_switching_stream_non_qos, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ param_num = tvb_get_letohs(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_tag_switching_stream_param_num, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ while(param_num > 0)
+ {
+ proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_switching_stream_flags, ENC_NA);
+ param_num--;
+ offset += 2;
}
+ return tvb_captured_length(tvb);
+}
- if (tag_len > offset) {
- proto_tree_add_item(tree, hf_ieee80211_tag_roaming_consortium_oi3,
- tvb, offset, tag_len - offset, ENC_NA);
+static void
+ieee_80211_add_tagged_parameters(tvbuff_t *tvb, int offset, packet_info *pinfo,
+ proto_tree *tree, int tagged_parameters_len, int ftype,
+ association_sanity_check_t *association_sanity_check)
+{
+ int next_len;
+ beacon_padding = 0; /* this is for the beacon padding confused with ssid fix */
+ while (tagged_parameters_len > 0) {
+ /* TODO make callers optionally specify the list of valid IE IDs? */
+ if ((next_len=add_tagged_field (pinfo, tree, tvb, offset, ftype, NULL, 0, association_sanity_check)) == 0)
+ break;
+ if (next_len > tagged_parameters_len) {
+ /* XXX - flag this as an error? */
+ next_len = tagged_parameters_len;
+ }
+ offset += next_len;
+ tagged_parameters_len -= next_len;
}
-
- return tvb_captured_length(tvb);
}
+static void
+ieee_80211_do_association_sanity_check(packet_info *pinfo, association_sanity_check_t *sanity_check)
+{
+ /* Given a [re-]association request frame, consider it in its totality and
+ add expert information as appropriate */
+
+ if (sanity_check->association_has_mobility_domain_element) {
+ /* This is an FT association, warn about any non-FT AKM suites */
+ if (sanity_check->has_non_ft_akm_suite) {
+ expert_add_info_format(pinfo, sanity_check->rsn_first_non_ft_akm_suite, &ei_ieee80211_mismatched_akm_suite,
+ "Non-FT AKM suite is prohibited for FT association request");
+ }
+ } else {
+ /* This is a non-FT association, warn about any FT AKM suites */
+ if (sanity_check->has_ft_akm_suite) {
+ expert_add_info_format(pinfo, sanity_check->rsn_first_ft_akm_suite, &ei_ieee80211_mismatched_akm_suite,
+ "FT AKM suite is prohibited for non-FT association request");
+ }
+ }
+}
/* ************************************************************************* */
-/* Dissect and add tagged (optional) fields to proto tree */
+/* Dissect 802.11 management frame */
/* ************************************************************************* */
+static void
+dissect_ieee80211_mgt(guint16 fcf, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ proto_item *ti;
+ proto_tree *mgt_tree;
+ proto_tree *fixed_tree;
+ proto_tree *tagged_tree;
+ int offset = 0;
+ int tagged_parameter_tree_len;
-static int beacon_padding = 0; /* beacon padding bug */
+ association_sanity_check_t association_sanity_check;
+ memset(&association_sanity_check, 0, sizeof(association_sanity_check));
-static int
-ieee80211_tag_ssid(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;
- /* 7.3.2.1 SSID element (0) */
- gchar *ssid; /* The SSID may consist of arbitrary bytes */
- gint ssid_len = tag_len;
+ ieee80211_tvb_invalid = FALSE;
- if (beacon_padding != 0) /* padding bug */
- return offset;
+ ti = proto_tree_add_item(tree, proto_wlan, tvb, 0, -1, ENC_NA);
+ mgt_tree = proto_item_add_subtree(ti, ett_80211_mgt);
- if (ssid_len > MAX_SSID_LEN) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "SSID length (%u) greater than maximum (%u)",
- ssid_len, MAX_SSID_LEN);
- ssid_len = MAX_SSID_LEN;
- }
+ switch (COMPOSE_FRAME_TYPE(fcf))
+ {
- /*
- * XXX - the 802.11 specs aren't particularly clear on how the SSID
- * is to be interpreted.
- *
- * IEEE Std 802.11-1999, section 7.3.2.2 "Service Set Identity (SSID)
- * element" says just
- *
- * The length of the SSID information field is between 0 and 32
- * octets. A 0 length information field indicates the broadcast SSID.
- *
- * with no indication that those octets encode a string.
- *
- * IEEE Std 802.11-2012, section 8.4.2.2 "SSID element", says that *but*
- * says after it
- *
- * When the UTF-8 SSID subfield of the Extended Capabilities element
- * is equal to 1 in the frame that includes the SSID element, the
- * SSID is interpreted using UTF-8 encoding.
- *
- * NOTE -- This is true for Beacon and Probe Response frames when the
- * MLME-START.request primitive was issued with the SSIDEncoding
- * parameter equal to UTF-8.
- *
- * and the SSIDEncoding parameter can either be UNSPECIFIED or UTF-8.
- *
- * So I *guess* that means that, if the UTF-8 SSID subfield isn't
- * equal to 1, the SSID is, in theory, just a bunch of octets, but
- * in practice, *probably* ASCII as that's the typical convention,
- * and, if it is equal to 1, it's a UTF-8 string. (Of course, a
- * host can put anything there it wants to, so we shouldn't just
- * assume that it's *valid* ASCII or *valid* UTF-8.)
- *
- * So we really should extract it as an array of ssid_len bytes,
- * pass those bytes to AirPDcapSetLastSSID(), and:
- *
- * If the UTF-8 SSID subfield isn't set to 1, put the SSID in
- * as an ENC_ASCII string;
- *
- * If the UTF-8 SSID subfield is set to 1, put it in as an
- * ENC_UTF_8 string;
- *
- * and rely on the libwireshark core code to somehow deal with
- * non-ASCII characters or invalid UTF-8 sequences or valid-but-
- * not-all-printable ASCII or UTF-8 strings in the protocol tree
- * display. I'm not sure we can currently rely on it to handle
- * invalid UTF-8 or non-printable characters in UTF-8 strings,
- * however, so we just treat it as ASCII for now.
- *
- * We also need a better way of getting the display format of a
- * string value, so we can do something other than run it through
- * format_text(), which won't handle UTF-8.
- *
- * Addendum: 802.11 2012 points out that a Zero-length SSID means
- * the Wildcard SSID. Make it so. From 8.4.2.2 of 802.11 2012:
- *
- * "The length of the SSID field is between 0 and 32 octets. A SSID
- * field of length 0 is used within Probe Request management frames to
- * indicate the wildcard SSID. The wildcard SSID is also used in
- * Beacon and Probe Response frames transmitted by mesh STAs."
- *
- * Also, we have to return a non-zero value here to prevent an ugly
- * undissected field warning. Since this code is only called from
- * one place and is used in call to dissector_try_uint_new, it is
- * OK to do so.
- */
- ssid = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, ssid_len, ENC_ASCII);
- if (ssid_len == (gint)tag_len) {
- AirPDcapSetLastSSID(&airpdcap_ctx, (CHAR *) ssid, ssid_len);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_ssid, tvb, offset, tag_len,
- ENC_ASCII|ENC_NA);
+ case MGT_ASSOC_REQ:
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 4);
+ add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
+ add_ff_listen_ival(fixed_tree, tvb, pinfo, 2);
+ offset = 4; /* Size of fixed fields */
- if (ssid_len > 0) {
- gchar* s = format_text(wmem_packet_scope(), ssid, ssid_len);
- proto_item_append_text(field_data->item_tag, ": %s", s);
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_ASSOC_REQ, &association_sanity_check);
+ ieee_80211_do_association_sanity_check(pinfo, &association_sanity_check);
+ break;
- col_append_fstr(pinfo->cinfo, COL_INFO, ", SSID=%s", s);
- /* Wlan Stats */
- memcpy(wlan_stats.ssid, ssid, MIN(ssid_len, MAX_SSID_LEN));
- wlan_stats.ssid_len = ssid_len;
- } else {
- proto_item_append_text(field_data->item_tag, ": Wildcard SSID");
+ case MGT_ASSOC_RESP:
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 6);
+ add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
+ add_ff_status_code(fixed_tree, tvb, pinfo, 2);
+ add_ff_assoc_id(fixed_tree, tvb, pinfo, 4);
+ offset = 6; /* Size of fixed fields */
+
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_ASSOC_RESP, NULL);
+ break;
+
+
+ case MGT_REASSOC_REQ:
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 10);
+ add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
+ add_ff_listen_ival(fixed_tree, tvb, pinfo, 2);
+ add_ff_current_ap_addr(fixed_tree, tvb, pinfo, 4);
+ offset = 10; /* Size of fixed fields */
+
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_REASSOC_REQ, &association_sanity_check);
+ ieee_80211_do_association_sanity_check(pinfo, &association_sanity_check);
+ break;
+
+ case MGT_REASSOC_RESP:
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 6);
+ add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
+ add_ff_status_code(fixed_tree, tvb, pinfo, 2);
+ add_ff_assoc_id(fixed_tree, tvb, pinfo, 4);
+ offset = 6; /* Size of fixed fields */
- col_append_str(pinfo->cinfo, COL_INFO, ", SSID=Wildcard (Broadcast)");
- offset += 1; // Make sure we return non-zero
- }
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_REASSOC_RESP, NULL);
+ break;
- beacon_padding += 1; /* padding bug */
- return offset + tag_len;
-}
+ case MGT_PROBE_REQ:
+ offset = 0;
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_PROBE_REQ, NULL);
+ break;
-static int
-dissect_neighbor_report(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;
- guint8 sub_tag_id;
- guint32 sub_tag_length;
- proto_item *parent_item;
- proto_tree *bssid_info_subtree, *bssid_info_cap_subtree, *sub_tag_tree;
- tvbuff_t *sub_tag_tvb = NULL;
+ case MGT_PROBE_RESP:
+ {
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12);
+ add_ff_timestamp(fixed_tree, tvb, pinfo, 0);
+ add_ff_beacon_interval(fixed_tree, tvb, pinfo, 8);
+ add_ff_cap_info(fixed_tree, tvb, pinfo, 10);
+ offset = 12; /* Size of fixed fields */
- if (tag_len < 13) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Neighbor Report length %u wrong, must be > 13", tag_len);
- return tvb_captured_length(tvb);
- }
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset, tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, MGT_PROBE_RESP, NULL);
+ break;
+ }
+ case MGT_MEASUREMENT_PILOT:
+ {
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12);
+ offset += add_ff_timestamp(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_measurement_pilot_int(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_beacon_interval(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_cap_info(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_country_str(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_max_reg_pwr(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_max_tx_pwr(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_tx_pwr_used(fixed_tree, tvb, pinfo, offset);
+ offset += add_ff_transceiver_noise_floor(fixed_tree, tvb, pinfo, offset);
+ /* TODO DS Parameter Set ??? */
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset, tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, MGT_MEASUREMENT_PILOT, NULL);
+ break;
+ }
+ case MGT_BEACON: /* Dissect protocol payload fields */
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12);
+ add_ff_timestamp(fixed_tree, tvb, pinfo, 0);
+ add_ff_beacon_interval(fixed_tree, tvb, pinfo, 8);
+ add_ff_cap_info(fixed_tree, tvb, pinfo, 10);
+ offset = 12; /* Size of fixed fields */
- /*** Begin: BSSID Information ***/
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_BEACON, NULL);
+ break;
- parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_bssid_info, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- bssid_info_subtree = proto_item_add_subtree(parent_item, ett_tag_neighbor_report_bssid_info_tree);
+ case MGT_ATIM:
+ break;
- proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_reachability, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_security, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_key_scope, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- parent_item = proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- bssid_info_cap_subtree = proto_item_add_subtree(parent_item, ett_tag_neighbor_report_bssid_info_capability_tree);
- proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_cap_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bssid_info_subtree, hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- 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_reserved, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ case MGT_DISASS:
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 2);
+ add_ff_reason_code(fixed_tree, tvb, pinfo, 0);
+ offset = 2; /* Size of fixed fields */
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len > 0) {
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_DISASS, NULL);
+ }
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_ope_class, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ case MGT_AUTHENTICATION:
+ offset = 6; /* Size of fixed fields */
+ offset += get_ff_auth_sae_len(tvb);
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, offset);
+ add_ff_auth_alg(fixed_tree, tvb, pinfo, 0);
+ add_ff_auth_trans_seq(fixed_tree, tvb, pinfo, 2);
+ add_ff_status_code(fixed_tree, tvb, pinfo, 4);
+ add_ff_auth_sae(fixed_tree, tvb);
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_phy_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ tagged_parameter_tree_len =
+ tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len > 0)
+ {
+ tagged_tree = get_tagged_parameter_tree(mgt_tree,
+ tvb,
+ offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_AUTHENTICATION, NULL);
+ }
+ break;
- /* The Optional Subelements field format contains zero or more subelements */
- if (tag_len == 13){ /* tag_len == 13 => no Subelements */
- return tvb_captured_length(tvb);
- }
+ case MGT_DEAUTHENTICATION:
+ fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 2);
+ add_ff_reason_code(fixed_tree, tvb, pinfo, 0);
+ offset = 2; /* Size of fixed fields */
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len > 0) {
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_DEAUTHENTICATION, NULL);
+ }
+ break;
- while (offset < tag_len)
- {
+ case MGT_ACTION:
+ {
+ proto_item *lcl_fixed_hdr;
+ proto_tree *lcl_fixed_tree;
+ lcl_fixed_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, &lcl_fixed_hdr, "Fixed parameters");
+ offset += add_ff_action(lcl_fixed_tree, tvb, pinfo, 0);
- sub_tag_id = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ proto_item_set_len(lcl_fixed_hdr, offset);
+ if (ieee80211_tvb_invalid)
+ break; /* Buffer not available for further processing */
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len > 0)
+ {
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_ACTION, NULL);
+ }
+ break;
+ }
+ case MGT_ACTION_NO_ACK:
+ {
+ proto_item *lcl_fixed_hdr;
+ proto_tree *lcl_fixed_tree;
+ lcl_fixed_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, &lcl_fixed_hdr, "Fixed parameters");
- sub_tag_length = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_length, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- sub_tag_tvb = tvb_new_subset_length(tvb, offset, sub_tag_length);
+ offset += add_ff_action(lcl_fixed_tree, tvb, pinfo, 0);
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_data, tvb, offset, sub_tag_length, ENC_NA);
+ proto_item_set_len(lcl_fixed_hdr, offset);
+ if (ieee80211_tvb_invalid)
+ break; /* Buffer not available for further processing */
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len > 0)
+ {
+ tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, MGT_ACTION_NO_ACK, NULL);
+ }
+ break;
+ }
+ case MGT_ARUBA_WLAN:
+ {
+ proto_tree *aruba_tree;
+ guint16 type;
+ type = tvb_get_ntohs(tvb, offset);
- switch (sub_tag_id) {
- case NR_SUB_ID_TSF_INFO:
- /* TODO */
- break;
- case NR_SUB_ID_MEASUREMENT_PILOT_INFO:
- /* TODO */
- break;
- case NR_SUB_ID_BSS_TRN_CAN_PREF:
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref, tvb, offset, 1, ENC_NA);
- break;
- case NR_SUB_ID_BSS_TER_DUR:
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf, tvb, offset, 8, ENC_NA);
+ aruba_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, NULL, "Aruba Management");
- proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_dur, tvb, offset+8, 2, ENC_NA);
- break;
- case NR_SUB_ID_HT_CAPABILITIES:
- sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
- ett_tag_neighbor_report_sub_tag_tree, NULL, "HT Capabilities");
- dissect_ht_capability_ie_common(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_length, field_data->item_tag_length, FALSE);
- break;
- case NR_SUB_ID_HT_OPERATION:
- sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
- ett_tag_neighbor_report_sub_tag_tree, NULL, "HT Information");
- dissect_ht_info_ie_1_1(sub_tag_tvb, pinfo, sub_tag_tree, data);
- break;
- case NR_SUB_ID_SEC_CHANNEL_OFFSET:
- sub_tag_tree = proto_tree_add_subtree(tree, tvb, offset, sub_tag_length,
- ett_tag_neighbor_report_sub_tag_tree, NULL, "Secondary Channel Offset");
- dissect_secondary_channel_offset_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
+ proto_tree_add_item(aruba_tree, hf_ieee80211_aruba, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ switch(type){
+ case 0x0003: /* MTU Size */
+ proto_tree_add_item(aruba_tree, hf_ieee80211_aruba_mtu, tvb, offset, 2, ENC_BIG_ENDIAN);
break;
- case NR_SUB_ID_VENDOR_SPECIFIC:
- default:
+ case 0x0005: /* HeartBeat Sequence */
+ proto_tree_add_item(aruba_tree, hf_ieee80211_aruba_hb_seq, tvb, offset, 8, ENC_BIG_ENDIAN);
break;
+ }
+ break;
}
+ }
+}
+
+/*
+ * Dissect a Block Ack request (which is also used in Trigger frames).
+ */
+static const int *block_ack_control_headers[] = {
+ &hf_ieee80211_block_ack_control_ack_policy,
+ &hf_ieee80211_block_ack_control_type,
+ &hf_ieee80211_block_ack_control_reserved,
+ &hf_ieee80211_block_ack_control_tid_info,
+ NULL
+};
- offset += sub_tag_length;
- }
+static const int *multi_sta_aid_tid_headers[] = {
+ &hf_ieee80211_block_ack_multi_sta_aid11,
+ &hf_ieee80211_block_ack_multi_sta_ack_type,
+ &hf_ieee80211_block_ack_multi_sta_tid,
+ NULL
+};
- return offset;
-}
+/*
+ * These bits are shown in reverse order in the spec.
+ */
+#define BASIC_BLOCK_ACK 0x0
+#define EXTENDED_COMPRESSED_BLOCK_ACK 0x1
+#define COMPRESSED_BLOCK_ACK 0x2
+#define MULTI_TID_BLOCK_ACK 0x3
+#define GCR_BLOCK_ACK 0x6
+#define GLK_GCR_BLOCK_ACK 0xA
+#define MULTI_STA_BLOCK_ACK 0xB
+
+static const value_string block_ack_type_vals[] = {
+ { BASIC_BLOCK_ACK, "Basic BlockAck" },
+ { EXTENDED_COMPRESSED_BLOCK_ACK, "Extended Compressed BlockAck" },
+ { COMPRESSED_BLOCK_ACK, "Compressed BlockAck" },
+ { MULTI_TID_BLOCK_ACK, "Multi-TID BlockAck" },
+ { GCR_BLOCK_ACK, "GCR BlockAck" },
+ { GLK_GCR_BLOCK_ACK, "GLK-GCR BlockAck" },
+ { MULTI_STA_BLOCK_ACK, "Multi-STA BlockAck" },
+ { 0, NULL }
+};
static int
-ieee80211_tag_supp_rates(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;
- /* 7.3.2.2 Supported Rates element (1) */
- 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);
- return offset;
- }
+dissect_ieee80211_block_ack_details(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, gboolean isDMG, gboolean is_req, gboolean has_fcs)
+{
+ proto_item *pi;
+ guint16 ba_control;
+ guint8 block_ack_type;
+ proto_tree *ba_tree;
+ guint8 tid_count, frag_num;
+ guint i;
+ proto_tree *ba_mtid_tree, *ba_mtid_sub_tree;
+ guint16 ssn;
+ guint64 bmap;
+ int f;
+ proto_item *ba_bitmap_item;
+ proto_tree *ba_bitmap_tree;
+ guint16 aid_tid;
+ proto_tree *ba_multi_sta_tree;
+ int ba_start = offset;
+
+ ba_control = tvb_get_letohs(tvb, offset);
+ block_ack_type = (ba_control & 0x001E) >> 1;
+ ba_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_block_ack,
+ &pi, is_req ? "%s Request" : "%s Response",
+ val_to_str(block_ack_type, block_ack_type_vals,
+ "Reserved (%d)"));
+ proto_tree_add_bitmask_with_flags(ba_tree, tvb, offset,
+ hf_ieee80211_block_ack_control,
+ ett_block_ack_request_control,
+ block_ack_control_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
- while (offset < tag_len) {
- proto_tree_add_item(tree, hf_ieee80211_tag_supp_rates, tvb, offset, 1,
- ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " %s,",
- val_to_str_ext_const(tvb_get_guint8(tvb, offset),
- &ieee80211_supported_rates_vals_ext,
- "Unknown Rate"));
- offset += 1;
- }
+ switch (block_ack_type) {
+ case BASIC_BLOCK_ACK:
+ if (isDMG == TRUE) {
+ expert_add_info_format(pinfo, ba_tree, &ei_ieee80211_dmg_subtype,
+ "DMG STAs shouldn't transmit BlockAckReq frames "
+ "with Basic BlockAckReqs");
+ }
- proto_item_append_text(field_data->item_tag, " [Mbit/sec]");
+ /* Both request and response have an SSC */
+ offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
- return offset;
-}
+ if (!is_req) {
+ proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_bitmap, tvb, offset,
+ 128, ENC_NA);
+ offset += 128;
+ }
+ break;
-static int
-ieee80211_tag_fh_parameter(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;
- /* 7.3.2.3 FH Parameter Set element (2) */
- if (tag_len < 5) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u too short, must be >= 5", tag_len);
- return 1;
- }
+ case COMPRESSED_BLOCK_ACK:
+ /*
+ * FIXME: For 802.11ax, the block ack bitmap can be 8 or 32 bytes
+ * depending on the values of the fragment number subfield in the
+ * SSC! All values other that 0 and 2 in bits B1 & B2 are reserved.
+ */
+ ssn = tvb_get_letohs(tvb, offset);
+ frag_num = ssn & 0x0F;
+ ssn >>= 4;
+ offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
+
+ if (!is_req) {
+ if ((frag_num & 0x06) == 0) {
+ bmap = tvb_get_letoh64(tvb, offset);
+ ba_bitmap_item = proto_tree_add_item(ba_tree,
+ hf_ieee80211_block_ack_bitmap,
+ tvb, offset, 8, ENC_NA);
+ ba_bitmap_tree = proto_item_add_subtree(ba_bitmap_item,
+ ett_block_ack_bitmap);
+ for (f = 0; f < 64; f++) {
+ if (bmap & (G_GUINT64_CONSTANT(1) << f))
+ continue;
+ proto_tree_add_uint_format_value(ba_bitmap_tree,
+ hf_ieee80211_block_ack_bitmap_missing_frame,
+ tvb, offset + (f/8), 1, ssn + f, "%u",
+ (ssn + f) & 0x0fff);
+ }
+ offset += 8;
+ } else if ((frag_num & 0x06) == 2) {
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_dwell_time,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_bitmap, tvb,
+ offset, 32, ENC_NA);
+ offset += 32;
+ } else {
+ /* Reserved ... */
+ }
+ }
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_set,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ case EXTENDED_COMPRESSED_BLOCK_ACK:
+ if (isDMG == FALSE) {
+ expert_add_info_format(pinfo, ba_tree, &ei_ieee80211_dmg_subtype,
+ "Non-DMG STAs shouldn't transmit BlockAckReq "
+ "frames with Extended Compressed BlockAckReqs");
+ }
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_pattern,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hop_index,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ if (!is_req) {
+ ssn = tvb_get_letohs(tvb, offset);
+ ssn >>= 4;
- return offset;
-}
+ bmap = tvb_get_letoh64(tvb, offset);
+ ba_bitmap_item = proto_tree_add_item(ba_tree,
+ hf_ieee80211_block_ack_bitmap,
+ tvb, offset, 8, ENC_NA);
+ ba_bitmap_tree = proto_item_add_subtree(ba_bitmap_item,
+ ett_block_ack_bitmap);
+ for (f = 0; f < 64; f++) {
+ if (bmap & (G_GUINT64_CONSTANT(1) << f))
+ continue;
+ proto_tree_add_uint(ba_bitmap_tree,
+ hf_ieee80211_block_ack_bitmap_missing_frame,
+ tvb, offset + (f/8), 1, ssn + f);
+ }
+ offset += 8;
+ proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_RBUFCAP, tvb, offset,
+ 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ }
+ break;
-static int
-ieee80211_tag_ds_parameter(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;
- /* 7.3.2.4 DS Parameter Set element (3) */
- if (tag_len != 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u wrong, must be = 1", tag_len);
- return 1;
- }
+ case MULTI_TID_BLOCK_ACK:
- proto_tree_add_item(tree, hf_ieee80211_tag_ds_param_channel,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ if (isDMG == TRUE) {
+ expert_add_info_format(pinfo, ba_tree, &ei_ieee80211_dmg_subtype,
+ "DMG STAs shouldn't transmit BlockAckReq frames "
+ "with Multi-TID BlockAckReqs");
+ }
- proto_item_append_text(field_data->item_tag, ": Current Channel: %u",
- tvb_get_guint8(tvb, offset));
+ tid_count = ((ba_control & 0xF000) >> 12) + 1;
+ if (is_req) {
+ ba_mtid_tree = proto_tree_add_subtree(ba_tree, tvb, offset, tid_count*4,
+ ett_block_ack, NULL, "TID List");
+ for (i = 0; i < tid_count; i++) {
+ guint8 tid = tvb_get_guint8(tvb, offset) & 0x0F;
+ ba_mtid_sub_tree = proto_tree_add_subtree_format(ba_mtid_tree, tvb,
+ offset, 4, ett_block_ack_tid, NULL,
+ "TID %u details", tid);
+
+ proto_tree_add_item(ba_mtid_sub_tree,
+ hf_ieee80211_block_ack_multi_tid_reserved, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ba_mtid_sub_tree,
+ hf_ieee80211_block_ack_multi_tid_value, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+ offset += 2;
- wlan_stats.channel = tvb_get_guint8(tvb, offset);
- offset += 1;
+ offset += add_ff_block_ack_ssc(ba_mtid_sub_tree, tvb, pinfo, offset);
+ }
+ } else {
+ ba_mtid_tree = proto_tree_add_subtree(ba_tree, tvb, offset, tid_count*4,
+ ett_block_ack, NULL, "TID List");
+ for (i = 0; i < tid_count; i++) {
+ guint8 tid = tvb_get_guint8(tvb, offset) & 0x0F;
+ ba_mtid_sub_tree = proto_tree_add_subtree_format(ba_mtid_tree, tvb,
+ offset, 4, ett_block_ack_tid, NULL,
+ "TID %u details", tid);
+
+ proto_tree_add_item(ba_mtid_sub_tree,
+ hf_ieee80211_block_ack_multi_tid_reserved,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ba_mtid_sub_tree,
+ hf_ieee80211_block_ack_multi_tid_value, tvb,
+ offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
- return offset;
-}
+ offset += add_ff_block_ack_ssc(ba_mtid_sub_tree, tvb, pinfo, offset);
+ proto_tree_add_item(ba_mtid_sub_tree,
+ hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
+ offset += 8;
+ }
+ }
+ break;
-static int
-ieee80211_tag_cf_parameter(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;
- /* 7.3.2.5 CF Parameter Set element (4) */
- if (tag_len != 6) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u wrong, must be = 6", tag_len);
- return offset;
- }
+ case GCR_BLOCK_ACK:
+ offset += add_ff_block_ack_ssc(ba_tree, tvb, pinfo, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_cfp_count,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": CFP count %u", tvb_get_guint8(tvb, offset));
- offset += 1;
+ proto_tree_add_item(ba_tree, hf_ieee80211_block_ack_gcr_addr, tvb,
+ offset, 6, ENC_NA);
+ offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tag_cfp_period,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": CFP Period %u", tvb_get_guint8(tvb, offset));
- offset += 1;
+ if (!is_req) {
+ proto_tree_add_item(ba_tree,
+ hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
+ offset += 8;
+ }
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tag_cfp_max_duration,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": CFP Max Duration %u",
- tvb_get_letohs(tvb, offset));
- offset += 2;
+ case MULTI_STA_BLOCK_ACK:
+ while (tvb_reported_length_remaining(tvb, offset) > (has_fcs ? 4 : 0)) {
+ int start = offset;
+ proto_item *msta_ti = NULL;
+ aid_tid = tvb_get_letohs(tvb, offset);
+ ba_multi_sta_tree = proto_tree_add_subtree_format(ba_tree, tvb, offset, -1,
+ ett_multi_sta_block_ack, &msta_ti,
+ "Per AID TID Info: 0x%0x", aid_tid & 0x07ff);
+ proto_tree_add_bitmask_with_flags(ba_multi_sta_tree, tvb, offset,
+ hf_ieee80211_block_ack_multi_sta_aid_tid,
+ ett_block_ack_request_multi_sta_aid_tid,
+ multi_sta_aid_tid_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_cfp_dur_remaining,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": CFP Dur Remaining %u",
- tvb_get_letohs(tvb, offset));
- offset += 1;
+ if ((aid_tid & 0x07ff) != 2045) {
+ if (((aid_tid & 0x0800) == 0) && (aid_tid & 0xf000) <= 7) {
+ guint8 bitmap_size;
+ frag_num = tvb_get_guint8(tvb, offset);
+ offset += add_ff_block_ack_ssc(ba_multi_sta_tree, tvb, pinfo, offset);
+ bitmap_size = ((frag_num + 2) & 0x6) >> 1; /* Turn into an exponent */
+ bitmap_size = 4 << bitmap_size; /* It goes 4, 8, 16, 32 */
+ proto_tree_add_item(ba_multi_sta_tree, hf_ieee80211_block_ack_bitmap, tvb,
+ offset, bitmap_size, ENC_NA);
+ offset += bitmap_size;
+ }
+ } else {
+ offset += add_ff_block_ack_ssc(ba_multi_sta_tree, tvb, pinfo, offset);
+ proto_tree_add_item(ba_multi_sta_tree, hf_ieee80211_block_ack_multi_sta_reserved,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(ba_multi_sta_tree, hf_ieee80211_block_ack_multi_sta_ra,
+ tvb, offset, 6, ENC_NA);
+ offset += 6;
+ }
+ proto_item_set_len(msta_ti, offset - start);
+ }
+ break;
+ }
+ proto_item_set_len(pi, offset - ba_start);
return offset;
}
static int
-ieee80211_tag_tim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_block_ack(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, gboolean isDMG, gboolean is_req, gboolean has_fcs)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- guint aid, pvb_len, n1, i, j, byte;
- static const int *ieee80211_tim_bmapctl[] = {
- &hf_ieee80211_tim_bmapctl_mcast,
- &hf_ieee80211_tim_bmapctl_offset,
- NULL
- };
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ proto_item *hidden_item;
- /* 802.11-2012: 8.4.2.7 TIM element (5) */
- if (tag_len < 4) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u too short, must be >= 4", tag_len);
- return 1;
- }
+ proto_tree_add_item(tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(tree, hf_ieee80211_addr_ta_resolved, tvb,
+ offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(tree, hf_ieee80211_addr, tvb, offset, 6,
+ ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(tree, hf_ieee80211_addr_resolved, tvb,
+ offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tim_dtim_count,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": DTIM %u of", tvb_get_guint8(tvb, offset));
- offset += 1;
+ return dissect_ieee80211_block_ack_details(tvb, pinfo, tree, offset, isDMG, is_req, has_fcs);
+}
- proto_tree_add_item(tree, hf_ieee80211_tim_dtim_period,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " %u bitmap", tvb_get_guint8(tvb, offset + 1));
- offset += 1;
+/*
+ * Dissect an 802.11ax HE Trigger frame and return the actual len including
+ * padding!
+ */
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tim_bmapctl,
- ett_tag_bmapctl_tree, ieee80211_tim_bmapctl,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- pvb_len = tag_len - 3;
- n1 = tvb_get_guint8(tvb, offset) & 0xFE;
- offset += 1;
+#define TRIGGER_TYPE_BASIC 0
+#define TRIGGER_TYPE_BRP 1
+#define TRIGGER_TYPE_MU_BAR 2
+#define TRIGGER_TYPE_MU_RTS 3
+#define TRIGGER_TYPE_BSRP 4
+#define TRIGGER_TYPE_GCR_MU_BAR 5
+#define TRIGGER_TYPE_BQRP 6
+#define TRIGGER_TYPE_NFRP 7
+
+static const val64_string trigger_type_vals[] = {
+ { 0, "Basic" },
+ { 1, "Beamforming Report Poll (BRP)" },
+ { 2, "MU-BAR" },
+ { 3, "MU-RTS" },
+ { 4, "Buffer Status Report Poll (BSRP)" },
+ { 5, "GCR MU-BAR" },
+ { 6, "Bandwidth Query Report Poll (BQRP)" },
+ { 7, "NDP Feedback Report Poll (NFRP)" },
+ { 0, NULL }
+};
- proto_tree_add_item(tree, hf_ieee80211_tim_partial_virtual_bitmap,
- tvb, offset, pvb_len, ENC_NA);
- /* FIXME: Handles dot11MgmtOptionMultiBSSIDActivated = false only */
- for (i = 0; i < pvb_len; i++) {
- byte = tvb_get_guint8(tvb, offset + i);
- for (j = 0; j < 8; j++) {
- if (byte & (1 << j)) {
- aid = 8*n1 + 8*i + j;
- proto_tree_add_uint(tree, hf_ieee80211_tim_aid, tvb, offset + i, 1, aid);
- }
- }
- }
- offset += pvb_len;
+static const val64_string bw_subfield_vals[] = {
+ { 0, "20 MHz" },
+ { 1, "40 MHz" },
+ { 2, "80 MHz" },
+ { 3, "80+80 MHz or 160 MHz" },
+ { 0, NULL }
+};
- return offset;
-}
+static const val64_string gi_and_ltf_type_subfield_vals[] = {
+ { 0, "1x LTF + 1.6 us GI" },
+ { 1, "2x LTF + 1.6 us GI" },
+ { 2, "4x LTF + 3.2 us GI" },
+ { 3, "Reserved" },
+ { 0, NULL }
+};
-static int
-ieee80211_tag_ibss_parameter(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;
- /* 7.3.2.7 IBSS Parameter Set element (6) */
+static const true_false_string mu_mimo_ltf_mode_tfs = {
+ "HE masked HE LTF sequence mode",
+ "HE single stream pilot HE LTF mode"
+};
- if (tag_len != 2) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u wrong, must be = 2", tag_len);
- return 1;
- }
+static const int *he_trig_frm_bar_ctrl_fields[] = {
+ &hf_ieee80211_he_trigger_bar_ctrl_ba_ack_policy,
+ &hf_ieee80211_he_trigger_bar_ctrl_ba_type,
+ &hf_ieee80211_he_trigger_bar_ctrl_reserved,
+ &hf_ieee80211_he_trigger_bar_ctrl_tid_info,
+ NULL
+};
- proto_tree_add_item(tree, hf_ieee80211_tag_ibss_atim_window,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": ATIM window 0x%x",
- tvb_get_letohs(tvb, offset));
- offset += 2;
+static const int *he_trig_frm_bar_info_fields[] = {
+ &hf_ieee80211_he_trigger_bar_info_blk_ack_seq_ctrl,
+ NULL
+};
- return offset;
-}
+static void
+add_gcr_mu_bar_trigger_frame_common_info(proto_tree *tree, tvbuff_t *tvb,
+ int offset)
+{
-static const value_string environment_vals[] = {
- { 0x20, "Any" },
- { 0x4f, "Outdoor" },
- { 0x49, "Indoor" },
- { 0, NULL }
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_he_trigger_bar_ctrl,
+ ett_he_trigger_bar_ctrl,
+ he_trig_frm_bar_ctrl_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_he_trigger_bar_info,
+ ett_he_trigger_bar_info,
+ he_trig_frm_bar_info_fields,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+}
+
+static const int *common_info_headers[] = {
+ &hf_ieee80211_he_trigger_type,
+ &hf_ieee80211_he_trigger_length,
+ &hf_ieee80211_he_trigger_cascade_indication,
+ &hf_ieee80211_he_trigger_cs_required,
+ &hf_ieee80211_he_trigger_bw,
+ &hf_ieee80211_he_trigger_gi_and_ltf_type,
+ &hf_ieee80211_he_trigger_mu_mimo_ltf_mode,
+ &hf_ieee80211_he_trigger_num_he_ltf_syms_etc,
+ &hf_ieee80211_he_trigger_stbc,
+ &hf_ieee80211_he_trigger_ldpc_extra_sym_seg,
+ &hf_ieee80211_he_trigger_ap_tx_power,
+ &hf_ieee80211_he_trigger_packet_extension,
+ &hf_ieee80211_he_trigger_spatial_reuse,
+ &hf_ieee80211_he_trigger_doppler,
+ &hf_ieee80211_he_trigger_he_sig_a_reserved,
+ &hf_ieee80211_he_trigger_reserved,
+ NULL
};
static int
-ieee80211_tag_country_info(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;
- /* 7.3.2.9 Country information element (7) */
- proto_tree *sub_tree;
- proto_item *sub_item;
- const guint8* country_code;
+add_he_trigger_common_info(proto_tree *tree, tvbuff_t *tvb, int offset,
+ packet_info *pinfo _U_, guint8 trigger_type, int *frame_len)
+{
+ proto_item *pi = NULL;
+ proto_tree *common_info = NULL;
+ int length = 0;
+ int start_offset = offset;
+
+ common_info = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_he_trigger_common_info, &pi, "Common Info");
+
+ proto_tree_add_bitmask_with_flags(common_info, tvb, offset,
+ hf_ieee80211_he_trigger_common_info,
+ ett_he_trigger_base_common_info,
+ common_info_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 8;
+ length += 8;
- if (tag_len < 6) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u too short, must be >= 6", tag_len);
- return 1;
+ /*
+ * Handle the trigger dependent common info
+ */
+ switch (trigger_type) {
+ case TRIGGER_TYPE_GCR_MU_BAR: /* Actually two uint16 fields */
+ add_gcr_mu_bar_trigger_frame_common_info(common_info, tvb, offset);
+ offset += 4;
+ length += 4;
+ break;
+ default: /* No other type has a trigger dependent common info subfield */
+ break;
}
+ proto_item_set_len(pi, offset - start_offset);
- proto_tree_add_item_ret_string(tree, hf_ieee80211_tag_country_info_code,
- tvb, offset, 2, ENC_ASCII|ENC_NA, wmem_packet_scope(), &country_code);
- proto_item_append_text(field_data->item_tag, ": Country Code %s", country_code);
- offset += 2;
+ *frame_len += length;
+ return length;
+}
- proto_tree_add_item(tree, hf_ieee80211_tag_country_info_env,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ", Environment %s",
- val_to_str(tvb_get_guint8(tvb, offset),
- environment_vals, "Unknown (0x%02x)"));
- offset += 1;
+static const true_false_string he_trigger_coding_type_tfs = {
+ "LDPC",
+ "BCC"
+};
- while (offset < tag_len) {
- /* Padding ? */
- if ((tag_len - offset) < 3) {
- proto_tree_add_item(tree, hf_ieee80211_tag_country_info_pad,
- tvb, offset, 1, ENC_NA);
- offset += 1;
- continue;
- }
- if (tvb_get_guint8(tvb, offset) <= 200) { /* 802.11d */
- sub_item = proto_tree_add_item(tree, hf_ieee80211_tag_country_info_fnm,
- tvb, offset, 3, ENC_NA);
- sub_tree = proto_item_add_subtree(sub_item, ett_tag_country_fnm_tree);
+static const value_string preferred_ac_vals[] = {
+ { 0, "AC_BK" },
+ { 1, "AC_BE" },
+ { 2, "AC_VI" },
+ { 3, "AC_VO" },
+ { 0, NULL }
+};
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_fcn,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(sub_item, ": First Channel Number: %d",
- tvb_get_guint8(tvb, offset));
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_nc,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(sub_item, ", Number of Channels: %d",
- tvb_get_guint8(tvb, offset));
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_fnm_mtpl,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(sub_item,
- ", Maximum Transmit Power Level: %d dBm",
- tvb_get_guint8(tvb, offset));
- offset += 1;
- } else { /* 802.11j */
- sub_item = proto_tree_add_item(tree, hf_ieee80211_tag_country_info_rrc,
- tvb, offset, 3, ENC_NA);
- sub_tree = proto_item_add_subtree(sub_item, ett_tag_country_rcc_tree);
+static const int *basic_trigger_dependent_user_headers[] = {
+ &hf_ieee80211_he_trigger_mpdu_mu_spacing,
+ &hf_ieee80211_he_trigger_tid_aggregation_limit,
+ &hf_ieee80211_he_trigger_dependent_reserved1,
+ &hf_ieee80211_he_trigger_preferred_ac,
+ NULL
+};
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_oei,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(sub_item,
- ": Operating Extension Identifier: %d",
- tvb_get_guint8(tvb, offset));
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_oc,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(sub_item, ", Operating Class: %d",
- tvb_get_guint8(tvb, offset));
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_country_info_rrc_cc,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(sub_item, ", Coverage Class: %d",
- tvb_get_guint8(tvb, offset));
- offset += 1;
- }
- }
+static void
+add_basic_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
+ int offset)
+{
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_he_trigger_dep_basic_user_info,
+ ett_he_trigger_dep_basic_user_info,
+ basic_trigger_dependent_user_headers,
+ ENC_NA, BMT_NO_APPEND);
+}
- return offset;
+static void
+add_brp_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
+ int offset)
+{
+ proto_tree_add_item(tree, hf_ieee80211_he_trigger_feedback_seg_retrans_bm,
+ tvb, offset, 1, ENC_NA);
}
static int
-ieee80211_tag_fh_hopping_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+add_mu_bar_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
+ int offset, packet_info *pinfo, int *frame_len)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
-
- /* 7.3.2.10 Hopping Pattern Parameters information element (8) */
- if (tag_len < 2) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u too short, must be >= 2", tag_len);
- return 1;
- }
+ int start_offset = offset;
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_parameter_prime_radix,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": Prime Radix: %u", tvb_get_guint8(tvb, offset));
- offset += 1;
+ /*
+ * It's a request and not DMG, I think. Also, it is only supposed to be
+ * a compressed block ack or a multi-tid block ack request.
+ */
+ offset = dissect_ieee80211_block_ack_details(tvb, pinfo, tree, offset,
+ FALSE, TRUE, FALSE);
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_parameter_nb_channels,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ", Number of Channels: %u",
- tvb_get_guint8(tvb, offset));
- offset += 1;
+ *frame_len += offset - start_offset;
return offset;
}
-static int
-ieee80211_tag_fh_hopping_table(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+
+static const int *nfrp_trigger_dependent_user_headers[] = {
+ &hf_ieee80211_he_trigger_starting_aid,
+ &hf_ieee80211_he_trigger_dependent_reserved2,
+ &hf_ieee80211_he_trigger_feedback_type,
+ &hf_ieee80211_he_trigger_dependent_reserved3,
+ &hf_ieee80211_he_trigger_nfrp_target_rssi,
+ &hf_ieee80211_he_trigger_multiplexing_flag,
+ NULL
+};
+
+static void
+add_nfrp_trigger_dependent_user_info(proto_tree *tree, tvbuff_t *tvb,
+ int offset)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_he_trigger_dep_nfrp_user_info,
+ ett_he_trigger_dep_nfrp_user_info,
+ nfrp_trigger_dependent_user_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+}
- /* 7.3.2.11 Hopping Pattern Table information element (9) */
- if (tag_len < 4) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u too short, must be >= 4", tag_len);
- return 1;
+/*
+ * Print the target RSSI field as per the spec.
+ * 0->90 map to -110 to -20 dBm.
+ * 127 maps to Max ransmit power for assigned MCS
+ * rest are reserved.
+ */
+static void
+target_rssi_base_custom(gchar *result, guint32 target_rssi)
+{
+ if (target_rssi <= 90) {
+ g_snprintf(result, ITEM_LABEL_LENGTH, "%ddBm", -110 + target_rssi);
+ } else if (target_rssi == 127) {
+ g_snprintf(result, ITEM_LABEL_LENGTH, "Max transmit power");
+ } else {
+ g_snprintf(result, ITEM_LABEL_LENGTH, "Reserved");
}
+}
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_flag,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+static const int *user_info_headers[] = {
+ &hf_ieee80211_he_trigger_aid12,
+ &hf_ieee80211_he_trigger_ru_allocation,
+ &hf_ieee80211_he_trigger_coding_type,
+ &hf_ieee80211_he_trigger_mcs,
+ &hf_ieee80211_he_trigger_dcm,
+ &hf_ieee80211_he_trigger_ss_allocation,
+ &hf_ieee80211_he_trigger_target_rssi,
+ &hf_ieee80211_he_trigger_user_reserved,
+ NULL
+};
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_number_of_sets,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+static int
+add_he_trigger_user_info(proto_tree *tree, tvbuff_t *tvb, int offset,
+ packet_info *pinfo, guint8 trigger_type, int *frame_len)
+{
+ proto_item *pi = NULL;
+ proto_tree *user_info = NULL;
+ int length = 0;
+ int start_offset = offset;
+ guint16 aid12_subfield = 0;
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_modulus,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ /*
+ * If the AID12 subfield has the value 4095 it indicates the start of
+ * the padding field.
+ */
+ user_info = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_he_trigger_user_info, &pi, "User Info");
+ aid12_subfield = tvb_get_letohs(tvb, offset) >> 4;
+
+ while (aid12_subfield != 4095) {
+ proto_tree_add_bitmask_with_flags(user_info, tvb, offset,
+ hf_ieee80211_he_trigger_user_info,
+ ett_he_trigger_base_user_info,
+ user_info_headers,
+ ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ offset += 5;
+ length += 5;
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_table_offset,
- tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ /*
+ * Handle the trigger dependent user info
+ */
+ switch (trigger_type) {
+ case TRIGGER_TYPE_BASIC:
+ add_basic_trigger_dependent_user_info(user_info, tvb, offset);
+ offset++;
+ length++;
+ break;
+ case TRIGGER_TYPE_BRP:
+ add_brp_trigger_dependent_user_info(user_info, tvb, offset);
+ offset++;
+ length++;
+ break;
+ case TRIGGER_TYPE_MU_BAR:
+ /* This is variable length so we need it to update the length */
+ offset += add_mu_bar_trigger_dependent_user_info(user_info, tvb,
+ offset, pinfo, &length);
+ break;
+ case TRIGGER_TYPE_NFRP:
+ add_nfrp_trigger_dependent_user_info(user_info, tvb, offset);
+ offset += 5;
+ length += 5;
+ break;
+ default:
+ break;
+ }
- while (offset < tag_len) {
- proto_tree_add_item(tree, hf_ieee80211_tag_fh_hopping_random_table,
- tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
+ aid12_subfield = tvb_get_letohs(tvb, offset) >> 4;
}
- return offset;
+ proto_item_set_len(pi, offset - start_offset);
+
+ *frame_len += length;
+ return length;
}
-int
-add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, int ftype,
- const guint8 *valid_element_ids, guint valid_element_ids_count,
- association_sanity_check_t *association_sanity_check)
+static int
+dissect_ieee80211_he_trigger(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset)
{
- tvbuff_t *tag_tvb;
- guint32 tag_no, tag_len;
- guint32 ext_tag_no, ext_tag_len;
- proto_tree *orig_tree = tree;
- proto_item *ti = NULL;
- proto_item *ti_len, *ti_tag;
- ieee80211_tagged_field_data_t field_data;
- gboolean isDMG;
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ proto_item *hidden_item;
+ guint8 trigger_type = 0;
+ int length = 0;
+
+ proto_tree_add_item(tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(tree, hf_ieee80211_addr_ta_resolved,
+ tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(tree, hf_ieee80211_addr, tvb, offset, 6,
+ ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(tree, hf_ieee80211_addr_resolved, tvb,
+ offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
- isDMG = GPOINTER_TO_INT(p_get_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY));
+ offset += 6;
+ length += 6;
- tag_no = tvb_get_guint8(tvb, offset);
- tag_len = tvb_get_guint8(tvb, offset + 1);
+ trigger_type = tvb_get_guint8(tvb, offset) & 0x0F;
+ col_append_fstr(pinfo->cinfo, COL_INFO, " %s",
+ val64_to_str(trigger_type, trigger_type_vals, "Reserved"));
+ /*
+ * Deal with the common Info and then any user info after that.
+ */
+ offset += add_he_trigger_common_info(tree, tvb, offset, pinfo,
+ trigger_type, &length);
- if (tree) {
- if (tag_no == TAG_ELEMENT_ID_EXTENSION) {
- ext_tag_no = tvb_get_guint8(tvb, offset + 2);
- ti = proto_tree_add_item(orig_tree, hf_ieee80211_ext_tag, tvb, offset + 2, tag_len , ENC_NA);
- proto_item_append_text(ti, ": %s", val_to_str_ext(ext_tag_no, &tag_num_vals_eid_ext_ext, "Reserved (%d)"));
- } else {
- ti = proto_tree_add_item(orig_tree, hf_ieee80211_tag, tvb, offset, 2 + tag_len , ENC_NA);
- proto_item_append_text(ti, ": %s", val_to_str_ext(tag_no, &tag_num_vals_ext, "Reserved (%d)"));
- }
+ /*
+ * Now the User Info field.
+ */
+ /*offset +=*/ add_he_trigger_user_info(tree, tvb, offset, pinfo,
+ trigger_type, &length);
- tree = proto_item_add_subtree(ti, ett_80211_mgt_ie);
+ /*
+ * Padding should commence here ... TODO, deal with it.
+ */
- }
+ return length;
+}
- if (tag_no == TAG_ELEMENT_ID_EXTENSION) {
- ext_tag_len = tag_len - 1;
- ti_tag = proto_tree_add_item(tree, hf_ieee80211_ext_tag_number, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- ti_len = proto_tree_add_uint(tree, hf_ieee80211_ext_tag_length, tvb, offset + 1, 1, ext_tag_len);
- } else {
- ti_tag = proto_tree_add_item(tree, hf_ieee80211_tag_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- ti_len = proto_tree_add_uint(tree, hf_ieee80211_tag_length, tvb, offset + 1, 1, tag_len);
- }
- if (tag_len > (guint)tvb_reported_length_remaining(tvb, offset)) {
- expert_add_info_format(pinfo, ti_len, &ei_ieee80211_tag_length,
- "Tag Length is longer than remaining payload");
- }
+/*
+ * Dissect a VHT or an HE NDP accouncement frame. They differ past
+ * the sounding dialog token with a bit in the SDT indicating VHT vs HE.
+ */
+#define NDP_ANNC_VHT_HE 0x02
- /* If the list of valid elements is restricted, require an Element ID to be
- * present in that list. Otherwise stop decoding the value to prevent possible
- * infinite recursions due to unexpected elements. */
- if (valid_element_ids_count) {
- gboolean valid_tag_no = FALSE;
- guint i;
+static const true_false_string he_ndp_annc_he_subfield_vals = {
+ "HE NDP Announcement frame",
+ "VHT NDP Announcement frame"
+};
- for (i = 0; i < valid_element_ids_count; i++) {
- valid_tag_no = valid_element_ids[i] == tag_no;
- if (valid_tag_no)
- break;
- }
- if (!valid_tag_no) {
- expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_number,
- "Unexpected Element ID %d", tag_no);
- return tag_len + 1 + 1;
- }
+static const int *vht_ndp_headers[] = {
+ &hf_ieee80211_vht_ndp_annc_token_reserved,
+ &hf_ieee80211_vht_ndp_annc_he_subfield,
+ &hf_ieee80211_vht_ndp_annc_token_number,
+ NULL
+};
+
+static int
+dissect_ieee80211_vht_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, gboolean has_fcs)
+{
+ guint16 sta_info;
+ guint8 len_fcs = 0;
+ proto_tree *sta_list;
+ proto_item *sta_info_item, *pi;
+ int saved_offset = 0;
+ int sta_index = 0;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_vht_ndp_annc_token, ett_vht_ndp_annc,
+ vht_ndp_headers, ENC_NA, BMT_NO_APPEND);
+ offset++;
+
+ if (has_fcs){
+ len_fcs = 4;
}
- tag_tvb = tvb_new_subset_length(tvb, offset+2, tag_len);
- field_data.sanity_check = association_sanity_check;
- field_data.ftype = ftype;
- field_data.isDMG = isDMG;
- field_data.item_tag = ti;
- field_data.item_tag_length = ti_len;
- if (!dissector_try_uint_new(tagged_field_table, tag_no, tag_tvb, pinfo, tree, FALSE, &field_data))
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_data, tvb, offset + 1 + 1, tag_len, ENC_NA);
- expert_add_info_format(pinfo, ti_tag, &ei_ieee80211_tag_data,
- "Dissector for 802.11 IE Tag"
- " (%s) code not implemented, Contact"
- " Wireshark developers if you want this supported", val_to_str_ext(tag_no,
- &tag_num_vals_ext, "(%d)"));
- proto_item_append_text(ti, ": Undecoded");
+ sta_list = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_vht_ndp_annc_sta_list, &pi, "STA list");
+ saved_offset = offset;
+
+ while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
+ sta_info_item = proto_tree_add_subtree_format(sta_list, tvb, offset, 2,
+ ett_vht_ndp_annc_sta_info_tree, NULL, "STA %d",
+ sta_index++);
+ proto_tree_add_item(sta_info_item, hf_ieee80211_vht_ndp_annc_sta_info_aid12,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(sta_info_item, hf_ieee80211_vht_ndp_annc_sta_info_feedback_type,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ sta_info = tvb_get_letohs(tvb, offset);
+
+ if (sta_info & 0x1000)
+ proto_tree_add_uint(sta_info_item,
+ hf_ieee80211_vht_ndp_annc_sta_info_nc_index,
+ tvb, offset, 2, sta_info);
+ else
+ proto_tree_add_item(sta_info_item, hf_ieee80211_vht_ndp_annc_sta_info_reserved,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
}
- return tag_len + 1 + 1;
+ proto_item_set_len(pi, offset - saved_offset);
+ return offset;
+}
+
+/*
+ * Format the partial BW as two 7 bit fields.
+ */
+static void
+partial_bw_info_base_custom(gchar *result, guint32 partial_bw)
+{
+ g_snprintf(result, ITEM_LABEL_LENGTH,
+ "RU Start Index:0x%0x, RU End Index:0x%0x",
+ partial_bw >> 7, partial_bw & 0x7F);
}
-/* 7.3.2.12 Request information element (10) */
+static const int *he_ndp_headers[] = {
+ &hf_he_ndp_annc_reserved,
+ &hf_he_ndp_annc_he_subfield,
+ &hf_he_ndp_sounding_dialog_token_number,
+ NULL
+};
+
+static const int *he_ndp_sta_headers[] = {
+ &hf_he_ndp_annc_aid11,
+ &hf_he_ndp_annc_partial_bw_info,
+ &hf_he_ndp_annc_feedback_type_and_ng,
+ &hf_he_ndp_annc_disambiguation,
+ &hf_he_ndp_annc_codebook_size,
+ &hf_he_ndp_annc_nc,
+ NULL
+};
+
static int
-ieee80211_tag_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- int tag_len = tvb_reported_length(tvb);
- int offset = 0;
+dissect_ieee80211_he_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, gboolean has_fcs)
+{
+ guint8 len_fcs = 0;
+ proto_tree *sta_list;
+ proto_item *pi;
+ int saved_offset;
+ int sta_index = 0;
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset,
+ hf_ieee80211_he_ndp_annc_token, ett_he_ndp_annc,
+ he_ndp_headers, ENC_NA, BMT_NO_APPEND);
+ offset++;
- while (offset < tag_len)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ if (has_fcs){
+ len_fcs = 4;
}
- return ((tag_len > 0) ? tag_len : 1);
+
+ saved_offset = offset;
+ sta_list = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_he_ndp_annc_sta_list, &pi, "STA list");
+
+ while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
+ proto_tree *sta_item;
+
+ sta_item = proto_tree_add_subtree_format(sta_list, tvb, offset, 4,
+ ett_he_ndp_annc_sta_item, NULL, "STA %d", sta_index++);
+ proto_tree_add_bitmask_with_flags(sta_item, tvb, offset,
+ hf_ieee80211_he_ndp_annc_sta, ett_he_ndp_annc_sta_info,
+ he_ndp_sta_headers, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+
+ offset += 4;
+ }
+
+ proto_item_set_len(pi, offset - saved_offset);
+ return offset;
}
-/* 7.3.2.28 BSS Load element (11) */
-/* 8.4.2.30 in 802.11-2012 */
static int
-ieee80211_tag_qbss_load(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_vht_he_ndp_annc(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, int offset, gboolean has_fcs)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ proto_item *hidden_item;
+ guint8 dialog_token;
- if ((tag_len < 4) || (tag_len > 5))
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4 or 5", tag_len);
- return tvb_captured_length(tvb);
- }
+ proto_tree_add_item(tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(tree, hf_ieee80211_addr_ta_resolved, tvb,
+ offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(tree, hf_ieee80211_addr, tvb, offset, 6,
+ ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(tree, hf_ieee80211_addr_resolved, tvb,
+ offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ offset += 6;
- if (tag_len == 4)
- {
- /* QBSS Version 1 */
- proto_item_append_text(field_data->item_tag, " Cisco QBSS Version 1 - non CCA");
+ dialog_token = tvb_get_guint8(tvb, offset);
- /* Extract Values */
- proto_tree_add_uint(tree, hf_ieee80211_qbss_version, tvb, offset, tag_len, 1);
- proto_tree_add_item(tree, hf_ieee80211_qbss_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_qbss_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_qbss_adc, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
+ /*
+ * Is it VHT or HE?
+ */
+ if (dialog_token & NDP_ANNC_VHT_HE) {
+ return dissect_ieee80211_he_ndp_annc(tvb, pinfo, tree, offset, has_fcs);
+ } else {
+ return dissect_ieee80211_vht_ndp_annc(tvb, pinfo, tree, offset, has_fcs);
}
- else if (tag_len == 5)
- {
- proto_item *base_item;
+}
- /* QBSS Version 2 */
- proto_item_append_text(field_data->item_tag, " 802.11e CCA Version");
+static void
+set_src_addr_cols(packet_info *pinfo, tvbuff_t *tvb, int offset, const char *type)
+{
+ address ether_addr;
- /* Extract Values */
- proto_tree_add_uint(tree, hf_ieee80211_qbss_version, tvb, offset, tag_len, 2);
- proto_tree_add_item(tree, hf_ieee80211_qbss_scount, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- base_item = proto_tree_add_item(tree, hf_ieee80211_qbss_cu, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(base_item, " (%d%%)", 100*tvb_get_guint8(tvb, offset + 2)/255);
- base_item = proto_tree_add_item(tree, hf_ieee80211_qbss_adc, tvb, offset + 3, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(base_item, " (%d us/s)", tvb_get_letohs(tvb, offset + 3)*32);
- }
+ set_address_tvb(ðer_addr, AT_ETHER, 6, tvb, offset);
- return tvb_captured_length(tvb);
+ col_add_fstr(pinfo->cinfo, COL_RES_DL_SRC, "%s (%s)",
+ address_with_resolution_to_str(wmem_packet_scope(), ðer_addr), type);
}
-/* 8.4.2.31 in 802-11-2012 */
-static int
-ieee80211_tag_edca_param_set(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+static void
+set_dst_addr_cols(packet_info *pinfo, tvbuff_t *tvb, int offset, const char *type)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
+ address ether_addr;
- if ((tag_len != 18))
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 18", tag_len);
- return tvb_captured_length(tvb);
- }
+ set_address_tvb(ðer_addr, AT_ETHER, 6, tvb, offset);
- decode_qos_parameter_set(tree, tvb, pinfo, offset, field_data->ftype);
+ col_add_fstr(pinfo->cinfo, COL_RES_DL_DST, "%s (%s)",
+ address_with_resolution_to_str(wmem_packet_scope(), ðer_addr), type);
+}
- return tvb_captured_length(tvb);
+static guint32
+crc32_802_tvb_padded(tvbuff_t *tvb, guint hdr_len, guint hdr_size, guint len)
+{
+ guint32 c_crc;
+
+ c_crc = crc32_ccitt_tvb(tvb, hdr_len);
+ c_crc = crc32_ccitt_tvb_offset_seed(tvb, hdr_size, len, ~c_crc);
+
+ return (c_crc);
}
-/* TSPEC element (13) */
+typedef enum {
+ ENCAP_802_2,
+ ENCAP_IPX,
+ ENCAP_ETHERNET
+} encap_t;
+
+/* ************************************************************************* */
+/* Dissect 802.11 frame */
+/* ************************************************************************* */
+/*
+ * The 802.11n specification makes some fairly significant changes to the
+ * layout of the MAC header. The first two bits of the MAC header are the
+ * protocol version. You'd think that the 802.11 committee would have
+ * bumped the version to indicate a different MAC layout, but NOOOO -- we
+ * have to go digging for bits in various locations instead.
+ */
static int
-ieee80211_tag_tspec(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_common(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, guint32 option_flags,
+ struct ieee_802_11_phdr *phdr)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
+ guint16 fcf, flags, frame_type_subtype, ctrl_fcf, ctrl_type_subtype;
+ guint16 cw_fcf;
+ guint16 seq_control;
+ guint32 seq_number, frag_number;
+ gboolean more_frags;
+ proto_item *ti = NULL;
+ proto_item *cw_item = NULL;
+ proto_item *hidden_item;
+ proto_tree *cw_tree = NULL;
+ guint16 hdr_len, ohdr_len;
+ guint16 htc_len = 0;
+ gboolean has_fcs;
+ gint len, reported_len, ivlen;
+ gint sta_addr_offset = 0;
+ const gchar *station_name;
+ gboolean is_amsdu = 0;
+ gboolean save_fragmented;
+ guint32 addr_type;
+ guint8 octet1, octet2;
+ char out_buff[SHORT_STR];
+ gint is_iv_bad;
+ guchar iv_buff[4];
+ const char *addr1_str = "RA";
+ guint offset;
+ const gchar *fts_str;
+ gchar flag_str[] = "opmPRMFTC";
+ gint ii;
+ guint16 qosoff = 0;
+ guint16 qos_control = 0;
+ gint meshctl_len = 0;
+ guint8 mesh_flags;
+ guint16 meshoff = 0;
+ static wlan_hdr_t whdrs[4];
+ gboolean retransmitted;
+ gboolean isDMG = (phdr->has_frequency ?
+ IS_80211AD(phdr->frequency) :
+ FALSE);
- if (field_data->isDMG == FALSE && tag_len != 55)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 55", tag_len);
- return tvb_captured_length(tvb);
- }
- if (field_data->isDMG == TRUE && tag_len != 57)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 57", tag_len);
- return tvb_captured_length(tvb);
- }
+ encap_t encap_type;
+ proto_tree *hdr_tree = NULL;
+ tvbuff_t *next_tvb = NULL;
+ wlan_hdr_t *whdr;
- add_ff_qos_ts_info(tree, tvb, pinfo, offset);
- offset += 3;
+ DOT11DECRYPT_KEY_ITEM used_key;
- proto_tree_add_item(tree, hf_ieee80211_tspec_nor_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY, GINT_TO_POINTER(isDMG));
- proto_tree_add_item(tree, hf_ieee80211_tspec_max_msdu, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ whdr= &whdrs[0];
- proto_tree_add_item(tree, hf_ieee80211_tspec_min_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "802.11");
+ col_clear(pinfo->cinfo, COL_INFO);
- proto_tree_add_item(tree, hf_ieee80211_tspec_max_srv, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ fcf = FETCH_FCF(0);
+ frame_type_subtype = COMPOSE_FRAME_TYPE(fcf);
+ whdr->type = frame_type_subtype;
+ if (frame_type_subtype == CTRL_CONTROL_WRAPPER)
+ ctrl_fcf = FETCH_FCF(10);
+ else
+ ctrl_fcf = 0;
- proto_tree_add_item(tree, hf_ieee80211_tspec_inact_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ fts_str = val_to_str_ext_const(frame_type_subtype, &frame_type_subtype_vals_ext,
+ "Unrecognized (Reserved frame)");
+ col_set_str(pinfo->cinfo, COL_INFO, fts_str);
- proto_tree_add_item(tree, hf_ieee80211_tspec_susp_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tspec_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+# define FROM_TO_DS 3
+ flags = FCF_FLAGS(fcf);
+ more_frags = HAVE_FRAGMENTS(flags);
- proto_tree_add_item(tree, hf_ieee80211_tspec_min_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ for (ii = 0; ii < 8; ii++) {
+ if (! (flags & 0x80 >> ii)) {
+ flag_str[ii] = '.';
+ }
+ }
+
+ switch (FCF_FRAME_TYPE (fcf)) {
+
+ case MGT_FRAME:
+ hdr_len = MGT_FRAME_HDR_LEN;
+ if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
+ /*
+ * Management frames with the Order bit set have an HT Control field;
+ * see 8.2.4.1.10 "Order field". If they're not HT frames, they should
+ * never have the Order bit set.
+ */
+ hdr_len += 4;
+ htc_len = 4;
+ }
+ break;
+
+ case CONTROL_FRAME:
+ if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
+ hdr_len = 6;
+ cw_fcf = ctrl_fcf;
+ } else {
+ hdr_len = 0;
+ cw_fcf = fcf;
+ }
+ switch (COMPOSE_FRAME_TYPE (cw_fcf)) {
+
+ case CTRL_TRIGGER:
+ /*
+ * This is a variable length frame ... we set the real length below
+ * and since the common info is variable, just set the hdr len to
+ * the fixed portion, 16. There can also be one or more user-info
+ * sections, followed by padding.
+ */
+ hdr_len = 16;
+ break;
+
+ case CTRL_BEAMFORM_RPT_POLL:
+ hdr_len += 17;
+ break;
+
+ case CTRL_VHT_NDP_ANNC:
+ hdr_len += 17;
+ /* TODO: for now we only consider a single STA, add support for more */
+ hdr_len += 2;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_mean_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ case CTRL_CTS:
+ case CTRL_ACKNOWLEDGEMENT:
+ hdr_len += 10;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_peak_data, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ case CTRL_POLL:
+ hdr_len += 18;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_burst_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ case CTRL_SPR:
+ case CTRL_GRANT:
+ case CTRL_GRANT_ACK:
+ hdr_len += 23;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_delay_bound, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ case CTRL_DMG_CTS:
+ hdr_len += 16;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_min_phy, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ case CTRL_DMG_DTS:
+ case CTRL_SSW:
+ hdr_len += 22;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_surplus, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ case CTRL_SSW_FEEDBACK:
+ case CTRL_SSW_ACK:
+ hdr_len += 24;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tspec_medium, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ case CTRL_RTS:
+ case CTRL_PS_POLL:
+ case CTRL_CFP_END:
+ case CTRL_CFP_ENDACK:
+ case CTRL_BLOCK_ACK_REQ:
+ case CTRL_BLOCK_ACK:
+ hdr_len += 16;
+ break;
- if(field_data->isDMG == TRUE) {
- proto_tree_add_item(tree, hf_ieee80211_tspec_dmg, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- /*offset +=2;*/
- }
+ default:
+ hdr_len += 4; /* XXX */
+ break;
+ }
+ break;
- return tvb_captured_length(tvb);
-}
+ case DATA_FRAME:
+ hdr_len = (FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) ? DATA_LONG_HDR_LEN : DATA_SHORT_HDR_LEN;
-/* 7.3.2.31 TCLAS element (14) */
-static int
-ieee80211_tag_tclas(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;
- guint8 type;
- guint8 version;
- static const int *ieee80211_tclas_class_mask0[] = {
- &hf_ieee80211_tclas_class_mask0_src_addr,
- &hf_ieee80211_tclas_class_mask0_dst_addr,
- &hf_ieee80211_tclas_class_mask0_type,
- NULL
- };
+ if ((option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) && DATA_FRAME_IS_QOS(frame_type_subtype)) {
+ /* QoS frame */
+ qosoff = hdr_len;
+ hdr_len += 2; /* Include the QoS field in the header length */
- static const int *ieee80211_tclas_class_mask1[] = {
- &hf_ieee80211_tclas_class_mask1_ver,
- &hf_ieee80211_tclas_class_mask1_src_ip,
- &hf_ieee80211_tclas_class_mask1_dst_ip,
- &hf_ieee80211_tclas_class_mask1_src_port,
- &hf_ieee80211_tclas_class_mask1_dst_port,
- &hf_ieee80211_tclas_class_mask1_ipv6_flow,
- NULL
- };
+ if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
+ /*
+ * QoS data frames with the Order bit set have an HT Control field;
+ * see 8.2.4.1.10 "Order field". If they're not HT frames, they
+ * should never have the Order bit set.
+ */
+ hdr_len += 4;
+ htc_len = 4;
+ }
- static const int *ieee80211_tclas_class_mask1_4[] = {
- &hf_ieee80211_tclas_class_mask1_ver,
- &hf_ieee80211_tclas_class_mask1_src_ip,
- &hf_ieee80211_tclas_class_mask1_dst_ip,
- &hf_ieee80211_tclas_class_mask1_src_port,
- &hf_ieee80211_tclas_class_mask1_dst_port,
- &hf_ieee80211_tclas_class_mask1_ipv4_dscp,
- &hf_ieee80211_tclas_class_mask1_ipv4_proto,
- NULL
- };
+ /*
+ * Does it look as if we have a mesh header?
+ * Look at the Mesh Control subfield of the QoS field and at the
+ * purported mesh flag fields.
+ */
+ qos_control = tvb_get_letohs(tvb, qosoff);
+ if (tvb_bytes_exist(tvb, hdr_len, 1)) {
+ meshoff = hdr_len;
+ mesh_flags = tvb_get_guint8(tvb, meshoff);
+ if (has_mesh_control(fcf, qos_control, mesh_flags)) {
+ /* Yes, add the length of that in as well. */
+ meshctl_len = find_mesh_control_length(mesh_flags);
+ hdr_len += meshctl_len;
+ }
+ }
+ }
+ break;
- static const int *ieee80211_tclas_class_mask2[] = {
- &hf_ieee80211_tclas_class_mask2_tci,
- NULL
- };
+ case EXTENSION_FRAME:
+ hdr_len = 10;
+ break;
- if (tag_len < 5)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 5", tag_len);
- return 1;
+ default:
+ hdr_len = 4; /* XXX */
+ break;
}
- proto_tree_add_item(tree, hf_ieee80211_tclas_up, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
-
- type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tclas_class_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
+ /*
+ * Some portions of this code calculate offsets relative to the end of the
+ * header. But when the header has been padded to align the data this must
+ * be done relative to true header size, not the padded/aligned value. To
+ * simplify this work we stash the original header size in ohdr_len instead
+ * of recalculating it every time we need it.
+ */
+ ohdr_len = hdr_len;
+ if (phdr->datapad) {
+ /*
+ * Add in Atheros padding between the 802.11 header and body.
+ *
+ * XXX - would the mesh header be part of the header or the body
+ * from the point of view of the Atheros adapters that insert
+ * the padding, assuming they even recognize a mesh header?
+ */
+ hdr_len = roundup2(hdr_len, 4);
+ }
- switch (type)
- {
- case 0:
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
- ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask0,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset++;
+ /* Add the FC and duration/id to the current tree */
+ ti = proto_tree_add_protocol_format (tree, proto_wlan, tvb, 0, hdr_len,
+ "IEEE 802.11 %s", fts_str);
+ hdr_tree = proto_item_add_subtree(ti, ett_80211);
- proto_tree_add_item(tree, hf_ieee80211_tclas_src_mac_addr, tvb, offset, 6, ENC_NA);
- offset += 6;
+ dissect_frame_control(hdr_tree, tvb, option_flags, 0, pinfo);
+ dissect_durid(hdr_tree, tvb, frame_type_subtype, 2);
- proto_tree_add_item(tree, hf_ieee80211_tclas_dst_mac_addr, tvb, offset, 6, ENC_NA);
- offset += 6;
+ switch (phdr->fcs_len)
+ {
+ case 0: /* Definitely has no FCS */
+ has_fcs = FALSE;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tclas_ether_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- /*offset += 2;*/
- break;
+ case 4: /* Definitely has an FCS */
+ has_fcs = TRUE;
+ break;
- case 1:
- version = tvb_get_guint8(tvb, offset+1);
- if (version == 4) {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
- ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask1_4,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- } else {
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
- ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask1,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- }
- offset += 1;
+ case -2: /* Data frames have no FCS, other frames may have an FCS */
+ /* XXX: -2 currently used only in wiretap/netmon.c */
+ if (FCF_FRAME_TYPE (fcf) == DATA_FRAME)
+ has_fcs = FALSE;
+ else /* Management, Control, Extension */
+ has_fcs = wlan_check_fcs;
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tclas_version, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- if (version == 4)
- {
- proto_tree_add_item(tree, hf_ieee80211_tclas_ipv4_src, tvb, offset, 4, ENC_BIG_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tclas_ipv4_dst, tvb, offset, 4, ENC_BIG_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tclas_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tclas_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tclas_dscp, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tclas_protocol, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- /*offset += 1;*/
- }
- else if (version == 6)
- {
- proto_tree_add_item(tree, hf_ieee80211_tclas_ipv6_src, tvb, offset, 16, ENC_NA);
- offset += 16;
- proto_tree_add_item(tree, hf_ieee80211_tclas_ipv6_dst, tvb, offset, 16, ENC_NA);
- offset += 16;
- proto_tree_add_item(tree, hf_ieee80211_tclas_src_port, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tclas_dst_port, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tclas_flow, tvb, offset, 3, ENC_BIG_ENDIAN);
- /*offset += 3;*/
+ default: /* Don't know - use "wlan_check_fcs" */
+ has_fcs = wlan_check_fcs;
+ break;
}
- break;
-
- case 2:
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tclas_class_mask,
- ett_tag_tclas_mask_tree, ieee80211_tclas_class_mask2,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset++;
- proto_tree_add_item(tree, hf_ieee80211_tclas_tag_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- /*offset += 2;*/
- break;
+ /*
+ * Decode the part of the frame header that isn't the same for all
+ * frame types.
+ */
+ seq_control = 0;
+ frag_number = 0;
+ seq_number = 0;
- default:
- break;
+ /* all frames have address 1 = RA */
+ if (tree) {
+ const gchar *ether_name = tvb_get_ether_name(tvb, 4);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ra, tvb, 4, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ra_resolved, tvb, 4, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 4, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, 4, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
}
- return tvb_captured_length(tvb);
-}
-
-/* 7.3.2.34 Schedule element (15) */
-static int
-ieee80211_tag_schedule(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;
- if (tag_len != 14)
+ switch (FCF_FRAME_TYPE (fcf))
{
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 14", tag_len);
- return 1;
- }
- add_ff_schedule_info(tree, tvb, pinfo, offset);
- offset += 2;
+ case MGT_FRAME:
+ /*
+ * All management frame types have the same header.
+ */
+ set_address_tvb(&pinfo->dl_src, wlan_address_type, 6, tvb, 10);
+ copy_address_shallow(&pinfo->src, &pinfo->dl_src);
+ set_address_tvb(&pinfo->dl_dst, wlan_address_type, 6, tvb, 4);
+ copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
- proto_tree_add_item(tree, hf_ieee80211_sched_srv_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ /* for tap */
+ set_address_tvb(&whdr->bssid, wlan_bssid_address_type, 6, tvb, 16);
+ copy_address_shallow(&whdr->src, &pinfo->dl_src);
+ copy_address_shallow(&whdr->dst, &pinfo->dl_dst);
- proto_tree_add_item(tree, hf_ieee80211_sched_srv_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ seq_control = tvb_get_letohs(tvb, 22);
+ frag_number = SEQCTL_FRAGMENT_NUMBER(seq_control);
+ seq_number = SEQCTL_SEQUENCE_NUMBER(seq_control);
- proto_tree_add_item(tree, hf_ieee80211_sched_spec_int, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ col_append_fstr(pinfo->cinfo, COL_INFO,
+ ", SN=%d", seq_number);
-/* 7.3.2.8 Challenge Text element (16) */
-static int
-ieee80211_tag_challenge_text(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- int tag_len = tvb_reported_length(tvb);
- int offset = 0;
+ col_append_fstr(pinfo->cinfo, COL_INFO,
+ ", FN=%d", frag_number);
- proto_tree_add_item(tree, hf_ieee80211_tag_challenge_text, tvb, offset, tag_len, ENC_NA);
+ if (tree)
+ {
+ const gchar *ra_da_name, *ta_sa_name, *bssid_name;
- return ((tag_len > 0) ? tag_len : 1);
-}
+ ra_da_name = tvb_get_ether_name(tvb, 4);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_da, tvb, 4, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_da_resolved, tvb, 4, 6, ra_da_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, 10, 6, ENC_NA);
+ ta_sa_name = tvb_get_ether_name(tvb, 10);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, 10, 6, ta_sa_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_sa, tvb, 10, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_sa_resolved, tvb, 10, 6, ta_sa_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, 16, 6, ENC_NA);
+ bssid_name = tvb_get_ether_name(tvb, 16);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, 16, 6, bssid_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
-/* 7.3.2.15 Power Constraint element (32) */
-static int
-ieee80211_tag_power_constraint(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;
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
- return 1;
- }
+ /* FIXME: With mgmt frames FROM_TO_DS is always 0, perhaps compare address to bssid instead? */
+ if ((flags & FROM_TO_DS) == FLAG_FROM_DS) { /* Receiver address */
+ sta_addr_offset = 4;
+ } else if ((flags & FROM_TO_DS) == FLAG_TO_DS) { /* Transmitter address */
+ sta_addr_offset = 10;
+ }
+ if (sta_addr_offset > 0) {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_staa, tvb, sta_addr_offset, 6, ENC_NA);
+ station_name = tvb_get_ether_name(tvb, sta_addr_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_staa_resolved, tvb, sta_addr_offset, 6, station_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
+ /* add items for wlan.addr filter */
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 10, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, 10, 6, ta_sa_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 16, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, 16, 6, bssid_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_frag_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_seq_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
+ }
+ break;
- proto_tree_add_item(tree, hf_ieee80211_tag_power_constraint_local, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ": %d", tvb_get_guint8(tvb, offset));
- return tvb_captured_length(tvb);
-}
+ case CONTROL_FRAME:
+ {
+ /*
+ * Control Wrapper frames insert themselves between address 1
+ * and address 2 in a normal control frame. Process address 1
+ * first, then handle the rest of the frame in dissect_control.
+ */
+ if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
+ offset = 10; /* FC + D/ID + Address 1 + CFC + HTC */
+ ctrl_fcf = FETCH_FCF(10);
+ ctrl_type_subtype = COMPOSE_FRAME_TYPE(ctrl_fcf);
+ } else {
+ offset = 10; /* FC + D/ID + Address 1 */
+ ctrl_type_subtype = frame_type_subtype;
+ }
+ /* Added to disallow DMG STA to transfer packets of certain forbidden types. */
+ switch (ctrl_type_subtype)
+ {
+ case CTRL_PS_POLL:
+ case CTRL_CTS:
+ case CTRL_CFP_ENDACK:
+ if(isDMG == TRUE) {
+ expert_add_info_format(pinfo, hdr_tree, &ei_ieee80211_dmg_subtype,
+ "DMG STA shouldn't transmit control frame of type contention-free period end+ack");
+ }
+ break;
+ default:
+ break;
+ }
-/* 7.3.2.16 Power Capability element (33) */
-static int
-ieee80211_tag_power_capability(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;
- if (tag_len != 2)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 2", tag_len);
- return 1;
- }
+ if (ctrl_type_subtype == CTRL_PS_POLL) {
+ addr1_str = "BSSID";
+ if (tree) {
+ const gchar *ether_name = tvb_get_ether_name(tvb, 4);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, 4, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, 4, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
+ }
- proto_tree_add_item(tree, hf_ieee80211_tag_power_capability_min, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " Min: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
+ /* Add address 1 */
+ set_dst_addr_cols(pinfo, tvb, 4, addr1_str);
- proto_tree_add_item(tree, hf_ieee80211_tag_power_capability_max, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ", Max :%d", tvb_get_guint8(tvb, offset));
- return tvb_captured_length(tvb);
-}
+ /*
+ * Start shoving in other fields if needed.
+ */
+ if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
+ /* if (tree) */
+ {
+ cw_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2,
+ ett_cntrl_wrapper_fc, NULL, "Contained Frame Control");
+ dissect_frame_control(cw_tree, tvb, 0, offset, pinfo);
+ dissect_ht_control(hdr_tree, tvb, offset + 2);
+ offset += 6;
+ hdr_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2,
+ ett_cntrl_wrapper_fc, &cw_item, "Carried Frame");
+ if (isDMG) {
+ expert_add_info_format(pinfo, cw_item, &ei_ieee80211_dmg_subtype,
+ "DMG STA shouldn't transmit Control Wrapper frame");
+ }
+ }
+ }
-/* 7.3.2.18 TPC Request element (34) */
-static int
-ieee80211_tag_tpc_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, void* data)
-{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- if (tag_len != 0)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 0", tag_len);
- return 1; /* Even with no data, we can't return 0 */
- }
+ switch (ctrl_type_subtype)
+ {
+ case CTRL_PS_POLL:
+ case CTRL_CFP_ENDACK:
+ {
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
+ /* if (tree) */
+ {
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ offset += 6;
+ }
+ break;
+ }
+
+ case CTRL_CFP_END:
+ {
+ if (isDMG)
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
+ else
+ set_src_addr_cols(pinfo, tvb, offset, "BSSID");
+ /* if (tree) */
+ {
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ if (isDMG) {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ } else {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ offset += 6;
+ }
+ break;
+ }
- return 1; /* Even with no data, we can't return 0 */
-}
+ case CTRL_TRIGGER:
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
+ /*
+ * The len returned will be adjusted to include any padding required
+ */
+ hdr_len = dissect_ieee80211_he_trigger(tvb, pinfo, hdr_tree, offset);
+ ohdr_len = hdr_len;
+ has_fcs = FALSE; /* Not sure at this stage */
+ break;
-/* 7.3.2.18 TPC Report element (35) */
-static int
-ieee80211_tag_tpc_report(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;
+ case CTRL_BEAMFORM_RPT_POLL:
+ {
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
+ /* if (tree) */
+ {
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
- if (tag_len != 2)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 2", tag_len);
- return 1;
- }
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_trsmt_pow, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " Transmit Power: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
+ proto_tree_add_item(hdr_tree, hf_ieee80211_beamform_feedback_seg_retrans_bitmap, tvb, offset, 1, ENC_NA);
+ }
+ break;
+ }
- proto_tree_add_item(tree, hf_ieee80211_tag_tpc_report_link_mrg, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ", Link Margin: %d", tvb_get_guint8(tvb, offset));
- return tvb_captured_length(tvb);
-}
+ case CTRL_VHT_NDP_ANNC:
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
-/* 7.3.2.19 Supported Channels element (36) */
-static int
-ieee80211_tag_supported_channels(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;
+ dissect_ieee80211_vht_he_ndp_annc(tvb, pinfo, hdr_tree, offset, has_fcs);
+ break;
- proto_item *chan_item;
- proto_tree *chan_tree;
- guint i = 1;
+ case CTRL_GRANT_ACK:
+ case CTRL_SSW:
+ case CTRL_SSW_FEEDBACK:
+ case CTRL_SSW_ACK:
+ case CTRL_DMG_CTS:
+ case CTRL_GRANT:
+ case CTRL_SPR:
+ case CTRL_POLL:
+ case CTRL_RTS:
+ {
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
+ /* if (tree) */
+ {
+ const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ offset += 6;
+ }
+ break;
+ }
- if (tag_len % 2 == 1) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u must be even", tag_len);
- return tvb_captured_length(tvb);
- }
+ case CTRL_CONTROL_WRAPPER:
+ /* XXX - We shouldn't see this. Should we throw an error? */
+ break;
- while (offset < tag_len)
- {
- chan_item = proto_tree_add_item(tree, hf_ieee80211_tag_supported_channels, tvb, offset, 2, ENC_NA);
- proto_item_append_text(chan_item, " #%d", i);
- i += 1;
+ case CTRL_BLOCK_ACK_REQ:
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
- chan_tree = proto_item_add_subtree(chan_item , ett_tag_supported_channels);
+ offset = dissect_ieee80211_block_ack(tvb, pinfo, hdr_tree, offset, isDMG, TRUE, has_fcs);
+ break;
- proto_tree_add_item(chan_tree, hf_ieee80211_tag_supported_channels_first, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(chan_item, " First: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
+ case CTRL_BLOCK_ACK:
+ set_src_addr_cols(pinfo, tvb, offset, "TA");
- proto_tree_add_item(chan_tree, hf_ieee80211_tag_supported_channels_range, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(chan_item, ", Range: %d ", tvb_get_guint8(tvb, offset));
- offset += 1;
+ offset = dissect_ieee80211_block_ack(tvb, pinfo, hdr_tree, offset, isDMG, FALSE, has_fcs);
+ break;
+ }
+/*
+ * 802.11ad : Used for extension types.
+ */
+ switch (ctrl_type_subtype) {
+ case CTRL_POLL: {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_cf_response_offset,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
- }
- return tvb_captured_length(tvb);
-}
+ break;
+ }
+ case CTRL_GRANT:
+ case CTRL_GRANT_ACK:
+ case CTRL_SPR: {
+ gboolean isGrant;
+ if(ctrl_type_subtype != CTRL_GRANT_ACK) {
+ offset += add_ff_dynamic_allocation(hdr_tree, tvb, pinfo, offset);
+ } else { /* CTRL_GRANT_ACK have 5 octets that are reserved*/
+ proto_tree_add_item(hdr_tree, hf_ieee80211_grant_ack_reserved, tvb, offset, 5, ENC_NA);
+ offset += 5;
+ }
+ isGrant = ((ctrl_type_subtype==CTRL_GRANT)||(ctrl_type_subtype==CTRL_GRANT_ACK));
+ add_ff_beamforming_ctrl(hdr_tree, tvb, pinfo, offset, isGrant);
+ /* offset += 2; */
+ break;
+ }
+ case CTRL_SSW: {
+ guint32 sector_sweep;
-/* 7.3.2.20 Channel Switch Announcement element (37) */
-static int
-ieee80211_tag_switch_ann(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;
- if (tag_len != 3)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 3", tag_len);
- return 1;
- }
+ sector_sweep = tvb_get_letoh24(tvb, offset);
+ offset += add_ff_sector_sweep(hdr_tree, tvb, pinfo, offset);
+ /* if Sector Sweep Direction = Responder, use SW Feedback field format when not transmitted as part of an ISS */
+ if(sector_sweep & 0x00001) {
+ add_ff_sector_sweep_feedback_to_iss(hdr_tree, tvb, pinfo, offset);
+ } else {
+ add_ff_sector_sweep_feedback_from_iss(hdr_tree, tvb, pinfo, offset);
+ }
+ /* offset += 3; */
+ break;
+ }
+ case CTRL_SSW_ACK:
+ case CTRL_SSW_FEEDBACK: {
+ offset += add_ff_sector_sweep_feedback_to_iss(hdr_tree, tvb, pinfo, offset);
+ offset += add_ff_BRP_request(hdr_tree, tvb, pinfo, offset);
+ add_ff_beamformed_link(hdr_tree, tvb, pinfo, offset);
+ /* offset += 1; */
+ break;
+ }
+ case CTRL_DMG_DTS: {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_nav_sa, tvb, offset, 6, ENC_NA);
+ offset += 6;
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_nav_da, tvb, offset, 6, ENC_NA);
+ /* offset += 6; */
+ break;
+ }
+ default:
+ break;
+ }
+ break;
+ }
- proto_tree_add_item(tree, hf_ieee80211_csa_channel_switch_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " Mode: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
+ case DATA_FRAME:
+ {
+ guint32 da_offset, sa_offset, ta_offset = 10, bssid_offset;
+ addr_type = FCF_ADDR_SELECTOR(fcf);
- proto_tree_add_item(tree, hf_ieee80211_csa_new_channel_number, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ", Number: %d ", tvb_get_guint8(tvb, offset));
- offset += 1;
+ /* In order to show src/dst address we must always do the following */
+ switch (addr_type)
+ {
- proto_tree_add_item(tree, hf_ieee80211_csa_channel_switch_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, ", Count: %d ", tvb_get_guint8(tvb, offset));
- return tvb_captured_length(tvb);
-}
+ case DATA_ADDR_T1:
+ da_offset = 4;
+ sa_offset = 10;
+ bssid_offset = 16;
+ break;
-/* 7.3.2.21 Measurement Request element (38) with update from 802.11k-2008 */
-static int
-ieee80211_tag_measure_req(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;
- guint8 request_type;
- proto_item *parent_item;
- proto_tree *sub_tree;
- static const int *ieee80211_tag_measure_request_mode[] = {
- &hf_ieee80211_tag_measure_request_mode_parallel,
- &hf_ieee80211_tag_measure_request_mode_enable,
- &hf_ieee80211_tag_measure_request_mode_request,
- &hf_ieee80211_tag_measure_request_mode_report,
- &hf_ieee80211_tag_measure_request_mode_duration_mandatory,
- &hf_ieee80211_tag_measure_request_mode_reserved,
- NULL
- };
+ case DATA_ADDR_T2:
+ da_offset = 4;
+ sa_offset = 16;
+ bssid_offset = 10;
+ break;
- if (tag_len < 3)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 3", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_measure_request_token, tvb, offset, 1, ENC_NA);
- offset += 1;
+ case DATA_ADDR_T3:
+ da_offset = 16;
+ sa_offset = 10;
+ bssid_offset = 4;
+ break;
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_request_mode,
- ett_tag_measure_request_mode_tree, ieee80211_tag_measure_request_mode,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
+ case DATA_ADDR_T4:
+ da_offset = 16;
+ sa_offset = 24;
+ bssid_offset = 10;
+ break;
+
+ default:
+ /* Should never happen? */
+ da_offset = 0;
+ sa_offset = 0;
+ ta_offset = 0;
+ bssid_offset = 0;
+ break;
+ }
- parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_measure_request_type, tvb, offset, 1, ENC_NA);
- sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_request_type_tree);
- request_type = tvb_get_guint8(tvb, offset);
- offset += 1;
- switch (request_type) {
- case 0: /* Basic Request */
- case 1: /* Clear channel assessment (CCA) request */
- case 2: /* Receive power indication (RPI) histogram request */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ set_address_tvb(&pinfo->dl_src, wlan_address_type, 6, tvb, sa_offset);
+ copy_address_shallow(&pinfo->src, &pinfo->dl_src);
+ set_address_tvb(&pinfo->dl_dst, wlan_address_type, 6, tvb, da_offset);
+ copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- break;
- }
- case 3: /* Channel Load Request */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* for tap */
+ set_address_tvb(&whdr->bssid, wlan_bssid_address_type, 6, tvb, bssid_offset);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ copy_address_shallow(&whdr->src, &pinfo->dl_src);
+ copy_address_shallow(&whdr->dst, &pinfo->dl_dst);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ seq_control = tvb_get_letohs(tvb, 22);
+ frag_number = SEQCTL_FRAGMENT_NUMBER(seq_control);
+ seq_number = SEQCTL_SEQUENCE_NUMBER(seq_control);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ col_append_fstr(pinfo->cinfo, COL_INFO,
+ ", SN=%d, FN=%d", seq_number, frag_number);
- while (offset < tag_len)
+ /* Now if we have a tree we start adding stuff */
+ if (tree)
{
- guint8 sub_id;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_id, tvb, offset, 1, ENC_NA);
- sub_id = tvb_get_guint8(tvb, offset);
- offset += 1;
+ const gchar *ta_name, *sa_name, *da_name, *bssid_name = NULL;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
- offset += 1;
+ switch (addr_type)
+ {
+ case DATA_ADDR_T1:
+ case DATA_ADDR_T2:
+ case DATA_ADDR_T3:
+ case DATA_ADDR_T4:
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, ta_offset, 6, ENC_NA);
+ ta_name = tvb_get_ether_name(tvb, ta_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, ta_offset, 6, ta_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ /* TA is always in the wlan.addr filter */
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, ta_offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, ta_offset, 6, ta_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
- switch (sub_id) {
- case MEASURE_REQ_CHANNEL_LOAD_SUB_REPORTING_INFO: /* Channel Load Reporting Information (1) */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- default:
- /* no default action */
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_da, tvb, da_offset, 6, ENC_NA);
+ da_name = tvb_get_ether_name(tvb, da_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_da_resolved, tvb, da_offset, 6, da_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_sa, tvb, sa_offset, 6, ENC_NA);
+ sa_name = tvb_get_ether_name(tvb, sa_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_sa_resolved, tvb, sa_offset, 6, sa_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, bssid_offset, 6, ENC_NA);
+ bssid_name = tvb_get_ether_name(tvb, bssid_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, bssid_offset, 6, bssid_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+
+ if ((flags & FROM_TO_DS) == FLAG_FROM_DS) { /* Receiver address */
+ sta_addr_offset = 4;
+ } else if ((flags & FROM_TO_DS) == FLAG_TO_DS) { /* Transmitter address */
+ sta_addr_offset = ta_offset;
+ }
+ if (sta_addr_offset > 0) {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_staa, tvb, sta_addr_offset, 6, ENC_NA);
+ station_name = tvb_get_ether_name(tvb, sta_addr_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_staa_resolved, tvb, sta_addr_offset, 6, station_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
+ proto_tree_add_item(hdr_tree, hf_ieee80211_frag_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(hdr_tree, hf_ieee80211_seq_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
+
+ /* add 3rd and 4th address for wlan.addr filter */
+ if (sa_offset != 4 && sa_offset != 10) {
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, sa_offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, sa_offset, 6, sa_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
+ if (da_offset != 4 && da_offset != 10 && da_offset != sa_offset) {
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, da_offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, da_offset, 6, da_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
+ if (bssid_offset != 4 && bssid_offset != 10 && bssid_offset != sa_offset && bssid_offset != da_offset) {
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, bssid_offset, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, bssid_offset, 6, bssid_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ }
break;
+ }
+
+ }
+ break;
+ }
+ case EXTENSION_FRAME: {
+ switch (frame_type_subtype) {
+ case EXTENSION_DMG_BEACON: {
+ set_dst_addr_cols(pinfo, tvb, 4, "BSSID");
+ if (tree) {
+ proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, 4, 6, ENC_NA);
+ hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 4, 6, ENC_NA);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
}
- }
- break;
- }
- case 4: /* Noise Histogram Request */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
+ break;
+ }
+ }
+ }
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ len = tvb_captured_length_remaining(tvb, hdr_len);
+ reported_len = tvb_reported_length_remaining(tvb, hdr_len);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (has_fcs)
+ {
+ /*
+ * Well, this packet should, in theory, have an FCS.
+ * Do we have the entire packet, and does it have enough data for
+ * the FCS?
+ */
+ if (reported_len < 4)
+ {
+ /*
+ * The packet is claimed not to even have enough data for a 4-byte
+ * FCS.
+ * Pretend it doesn't have an FCS.
+ */
+ ;
+ }
+ else if (len < reported_len)
+ {
+ /*
+ * The packet is claimed to have enough data for a 4-byte FCS, but
+ * we didn't capture all of the packet.
+ * Slice off the 4-byte FCS from the reported length, and trim the
+ * captured length so it's no more than the reported length; that
+ * will slice off what of the FCS, if any, is in the captured
+ * length.
+ */
+ reported_len -= 4;
+ if (len > reported_len)
+ len = reported_len;
+ }
+ else
+ {
+ /*
+ * We have the entire packet, and it includes a 4-byte FCS.
+ * Slice it off, and put it into the tree.
+ */
+ len -= 4;
+ reported_len -= 4;
+ if (wlan_check_checksum)
+ {
+ guint32 sent_fcs = tvb_get_letohl(tvb, hdr_len + len);
+ guint32 fcs;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (phdr->datapad)
+ fcs = crc32_802_tvb_padded(tvb, ohdr_len, hdr_len, len);
+ else
+ fcs = crc32_ccitt_tvb(tvb, hdr_len + len);
+ if (fcs != sent_fcs) {
+ flag_str[8] = '.';
+ }
- while (offset < tag_len)
- {
- guint8 sub_id;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_id, tvb, offset, 1, ENC_NA);
- sub_id = tvb_get_guint8(tvb, offset);
- offset += 1;
+ proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, fcs, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
+ } else {
+ proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
+ }
+ }
+ }
+ else
+ {
+ flag_str[8] = '\0';
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
- offset += 1;
+ proto_item_append_text(ti, ", Flags: %s", flag_str);
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", Flags=%s", flag_str);
- switch (sub_id) {
- case MEASURE_REQ_NOISE_HISTOGRAM_SUB_REPORTING_INFO: /* Noise Histogram Reporting Information (1) */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- default:
- /* no default action */
- break;
- }
- }
- break;
- }
- case 5: /* Beacon Request */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /*
+ * Only management and data frames have a body, so we don't have
+ * anything more to do for other types of frames.
+ */
+ switch (FCF_FRAME_TYPE (fcf))
+ {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ case MGT_FRAME:
+ if (htc_len == 4) {
+ dissect_ht_control(hdr_tree, tvb, ohdr_len - 4);
+ }
+ break;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ case DATA_FRAME:
+ if ((option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) && tree && DATA_FRAME_IS_QOS(frame_type_subtype))
+ {
+ proto_item *qos_fields, *qos_ti;
+ proto_tree *qos_tree;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_measurement_mode, tvb, offset, 1, ENC_NA);
- offset += 1;
+ guint16 qos_eosp;
+ guint16 qos_field_content;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
+ qos_fields = proto_tree_add_item(hdr_tree, hf_ieee80211_qos, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ qos_tree = proto_item_add_subtree(qos_fields, ett_qos_parameters);
- while (offset < tag_len)
- {
- guint8 sub_id, sub_length, sub_tag_end;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_id, tvb, offset, 1, ENC_NA);
- sub_id = tvb_get_guint8(tvb, offset);
- offset += 1;
+ qos_eosp = QOS_EOSP(qos_control);
+ qos_field_content = QOS_FIELD_CONTENT(qos_control);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_subelement_length, tvb, offset, 1, ENC_NA);
- sub_length = tvb_get_guint8(tvb, offset);
- offset += 1;
- sub_tag_end = offset + sub_length;
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_tid, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- switch (sub_id) {
- case MEASURE_REQ_BEACON_SUB_SSID: /* SSID (0) */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_ssid, tvb, offset, sub_length, ENC_ASCII|ENC_NA);
- offset += sub_length;
- break;
- case MEASURE_REQ_BEACON_SUB_BRI: /* Beacon Reporting Information (1) */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- break;
- case MEASURE_REQ_BEACON_SUB_RD: /* Reporting Detail (2) */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- break;
- case MEASURE_REQ_BEACON_SUB_REQUEST: /* Request (10) */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_sub_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- break;
- case MEASURE_REQ_BEACON_SUB_APCP: /* AP Channel Report (51) */
- /* TODO */
- break;
- default:
- /* no default action */
- break;
- }
- if (offset < sub_tag_end)
- {
- proto_item *tix;
- tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_beacon_unknown, tvb, offset, sub_tag_end - offset, ENC_NA);
- expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_request_beacon_unknown);
- offset = sub_tag_end;
- }
- }
+ qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_priority, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ PROTO_ITEM_SET_GENERATED(qos_ti);
- break;
- }
- case 6: /* Frame Request */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
+ if (FLAGS_DS_STATUS(flags) == (FLAG_FROM_DS|FLAG_TO_DS)) {
+ /* mesh frame */
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_eosp, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ } else {
+ if (flags & FLAG_TO_DS) {
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_bit4, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ } else {
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_eosp, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ }
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_ack_policy, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (flags & FLAG_FROM_DS) {
+ if (!DATA_FRAME_IS_NULL(frame_type_subtype)) {
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_amsdu_present, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ is_amsdu = QOS_AMSDU_PRESENT(qos_control);
+ }
+ if (DATA_FRAME_IS_CF_POLL(frame_type_subtype)) {
+ /* txop limit */
+ qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_txop_limit, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ if (qos_field_content == 0) {
+ proto_item_append_text(qos_ti, " (transmit one frame immediately)");
+ }
+ } else {
+ /* qap ps buffer state */
+ proto_item *qos_ps_buf_state_fields;
+ proto_tree *qos_ps_buf_state_tree;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ qos_ps_buf_state_fields = proto_tree_add_item(qos_tree, hf_ieee80211_qos_ps_buf_state, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ qos_ps_buf_state_tree = proto_item_add_subtree(qos_ps_buf_state_fields, ett_qos_ps_buf_state);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_frame_request_type, tvb, offset, 1, ENC_NA);
- offset += 1;
+ proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_buf_state_indicated, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_mac_address, tvb, offset, 6, ENC_NA);
- offset += 6;
+ if (QOS_PS_BUF_STATE_INDICATED(qos_field_content)) {
+ proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_highest_pri_buf_ac, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ qos_ti = proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_qap_buf_load, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ switch (QOS_PS_QAP_BUF_LOAD(qos_field_content)) {
- /* TODO Add Optional Subelements */
- break;
- }
- case 7: /* BSTA Statistics Request */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_peer_mac_address, tvb, offset, 6, ENC_NA);
- offset += 6;
+ case 0:
+ proto_item_append_text(qos_ti, " (no buffered traffic)");
+ break;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_randomization_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ default:
+ proto_item_append_text(qos_ti, " (%d octets)", QOS_PS_QAP_BUF_LOAD(qos_field_content)*4096);
+ break;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ case 15:
+ proto_item_append_text(qos_ti, " (greater than 57344 octets)");
+ break;
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_group_id, tvb, offset, 1, ENC_NA);
- offset += 1;
+ }
+ }
+ } else {
+ if (!DATA_FRAME_IS_NULL(frame_type_subtype)) {
+ proto_tree_add_item(qos_tree, hf_ieee80211_qos_amsdu_present, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ is_amsdu = QOS_AMSDU_PRESENT(qos_control);
+ }
+ /*
+ * Only QoS Data, Qos CF-ACK and NULL frames To-DS have a Queue Size
+ * field.
+ */
+ if ((DATA_FRAME_IS_NULL(frame_type_subtype) ||
+ (frame_type_subtype & 0x7) == 0 ||
+ DATA_FRAME_IS_CF_ACK(frame_type_subtype))) {
+ if (qos_eosp) {
+ /* queue size */
+ qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_queue_size, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ switch (qos_field_content) {
+ case 0:
+ proto_item_append_text(qos_ti, " (no buffered traffic in the queue)");
+ break;
- /* TODO Add Optional Subelements */
- break;
- }
- case 8: /* Location Configuration Indication (LCI) Request */
- /* TODO */
- case 9: /* Transmit Stream Measurement Request */
- /* TODO */
- case 10: /* Multicast diagnostics request */
- /* TODO */
- case 11: /* Location Civic request */
- /* TODO */
- case 12: /* Location Identifier request */
- /* TODO */
- case 13: /* Directional channel quality request */
- /* TODO */
- case 14: /* Directional measurement request */
- /* TODO */
- case 15: /* Directional statistics request */
- /* TODO */
- case 255: /* Measurement Pause Request*/
- /* TODO */
- default: /* unknown */
- break;
- }
- if (offset < tag_len)
- {
- proto_item *tix;
- tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_request_unknown, tvb, offset, tag_len - offset, ENC_NA);
- expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_request_unknown);
- }
+ default:
+ proto_item_append_text(qos_ti, " (%u bytes)", qos_field_content*256);
+ break;
- return tvb_captured_length(tvb);
-}
+ case 254:
+ proto_item_append_text(qos_ti, " (more than 64768 octets)");
+ break;
-/* 7.3.2.22 Measurement Report element (39) with update from 802.11k-2008 */
-static int
-ieee80211_tag_measure_rep(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;
- proto_item *parent_item;
- proto_tree *sub_tree;
- guint8 report_type;
- static const int *ieee80211_tag_measure_report_mode[] = {
- &hf_ieee80211_tag_measure_report_mode_late,
- &hf_ieee80211_tag_measure_report_mode_incapable,
- &hf_ieee80211_tag_measure_report_mode_refused,
- &hf_ieee80211_tag_measure_report_mode_reserved,
- NULL
- };
- static const int *ieee80211_tag_measure_map_field[] = {
- &hf_ieee80211_tag_measure_map_field_bss,
- &hf_ieee80211_tag_measure_map_field_odfm,
- &hf_ieee80211_tag_measure_map_field_unident_signal,
- &hf_ieee80211_tag_measure_map_field_radar,
- &hf_ieee80211_tag_measure_map_field_unmeasured,
- &hf_ieee80211_tag_measure_map_field_reserved,
- NULL
- };
- static const int *ieee80211_tag_measure_report_frame_info[] = {
- &hf_ieee80211_tag_measure_report_frame_info_phy_type,
- &hf_ieee80211_tag_measure_report_frame_info_frame_type,
- NULL
- };
+ case 255:
+ proto_item_append_text(qos_ti, " (unspecified or unknown)");
+ break;
+ }
+ } else {
+ /* txop duration requested */
+ qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_txop_dur_req,
+ tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ if (qos_field_content == 0) {
+ proto_item_append_text(qos_ti, " (no TXOP requested)");
+ }
+ }
+ }
+ }
- if (tag_len < 3)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag length %u too short, must be >= 3", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_measure_report_measurement_token, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* Do we have +HTC? */
+ if (htc_len == 4) {
+ dissect_ht_control(hdr_tree, tvb, ohdr_len - 4);
+ }
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_report_mode,
- ett_tag_measure_report_mode_tree, ieee80211_tag_measure_report_mode,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
+ if (meshctl_len != 0) {
+ proto_item *msh_fields;
+ proto_tree *msh_tree;
- report_type = tvb_get_guint8(tvb, offset);
- parent_item = proto_tree_add_item(tree, hf_ieee80211_tag_measure_report_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_report_type_tree);
- offset += 1;
+ msh_fields = proto_tree_add_item(hdr_tree, hf_ieee80211_mesh_control_field, tvb, meshoff, meshctl_len, ENC_NA);
+ msh_tree = proto_item_add_subtree(msh_fields, ett_msh_control);
+ add_ff_mesh_control(msh_tree, tvb, pinfo, meshoff);
+ }
- if (tag_len == 3)
- return tvb_captured_length(tvb);
+ } /* end of qos control field */
+ if (enable_decryption && !pinfo->fd->flags.visited) {
+ const guint8 *enc_data = tvb_get_ptr(tvb, 0, hdr_len+reported_len);
+ /* The processing will take care of 4-way handshake sessions for WPA and WPA2 decryption */
+ Dot11DecryptPacketProcess(&dot11decrypt_ctx, enc_data, hdr_len, hdr_len+reported_len, NULL, 0, NULL, TRUE);
- switch (report_type) {
- case 0: /* Basic Report */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ }
+ /*
+ * No-data frames don't have a body.
+ */
+ if (DATA_FRAME_IS_NULL(frame_type_subtype))
+ goto end_of_wlan;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ if (!wlan_subdissector) {
+ guint fnum = 0;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ /* key: bssid:src
+ * data: last seq_control seen and frame number
+ */
+ retransmitted = FALSE;
+ if (!pinfo->fd->flags.visited) {
+ retransmit_key key;
+ retransmit_key *result;
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_basic_map_field,
- ett_tag_measure_report_basic_map_tree, ieee80211_tag_measure_map_field,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- break;
- }
- case 1: /* Clear channel assessment (CCA) report */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ memcpy(key.bssid, whdr->bssid.data, 6);
+ memcpy(key.src, whdr->src.data, 6);
+ key.seq_control = 0;
+ result = (retransmit_key *)g_hash_table_lookup(fc_analyse_retransmit_table, &key);
+ if (result && (result->seq_control == seq_control)) {
+ /* keep a pointer to the first seen frame, could be done with proto data? */
+ fnum = result->fnum;
+ g_hash_table_insert(fc_first_frame_table, GINT_TO_POINTER(pinfo->num),
+ GINT_TO_POINTER(fnum));
+ retransmitted = TRUE;
+ } else {
+ /* first time or new seq*/
+ if (!result) {
+ result = wmem_new(wmem_file_scope(), retransmit_key);
+ *result = key;
+ g_hash_table_insert(fc_analyse_retransmit_table, result, result);
+ }
+ result->seq_control = seq_control;
+ result->fnum = pinfo->num;
+ }
+ }
+ else if ((fnum = GPOINTER_TO_UINT(g_hash_table_lookup(fc_first_frame_table, GINT_TO_POINTER(pinfo->num))))) {
+ retransmitted = TRUE;
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ if (retransmitted) {
+ col_append_str(pinfo->cinfo, COL_INFO, " [retransmitted]");
+ if (tree) {
+ proto_item *item;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ item=proto_tree_add_none_format(hdr_tree, hf_ieee80211_fc_analysis_retransmission, tvb, 0, 0,
+ "Retransmitted frame");
+ PROTO_ITEM_SET_GENERATED(item);
+ item=proto_tree_add_uint(hdr_tree, hf_ieee80211_fc_analysis_retransmission_frame, tvb, 0, 0, fnum);
+ PROTO_ITEM_SET_GENERATED(item);
+ }
+ next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len, len, reported_len);
+ call_data_dissector(next_tvb, pinfo, tree);
+ goto end_of_wlan;
+ }
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_cca_busy_fraction, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- case 2: /* Receive power indication (RPI) histogram report */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ break;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ case CONTROL_FRAME:
+ goto end_of_wlan;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ case EXTENSION_FRAME:
+ break;
- parent_item = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report, tvb, offset, 8, ENC_NA);
- sub_tree = proto_item_add_subtree(parent_item, ett_tag_measure_report_rpi_tree);
+ default:
+ goto end_of_wlan;
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_0, tvb, offset, 1, ENC_NA);
- offset += 1;
+ if (IS_PROTECTED(FCF_FLAGS(fcf))
+ && !phdr->decrypted
+ && (wlan_ignore_prot != WLAN_IGNORE_PROT_WO_IV)) {
+ /*
+ * It's a WEP or WPA encrypted frame, and it hasn't already been
+ * decrypted; dissect the protections parameters and decrypt the data,
+ * if we have a matching key. Otherwise display it as data.
+ */
+ gboolean can_decrypt = FALSE;
+ proto_tree *wep_tree = NULL;
+ guint32 iv;
+ guint8 key, keybyte;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_1, tvb, offset, 1, ENC_NA);
- offset += 1;
+#define PROTECTION_ALG_WEP DOT11DECRYPT_KEY_TYPE_WEP
+#define PROTECTION_ALG_TKIP DOT11DECRYPT_KEY_TYPE_TKIP
+#define PROTECTION_ALG_CCMP DOT11DECRYPT_KEY_TYPE_CCMP
+#define PROTECTION_ALG_RSNA PROTECTION_ALG_CCMP | PROTECTION_ALG_TKIP
+ guint8 algorithm=G_MAXUINT8;
+#define IS_TKIP(tvb, hdr_len) (tvb_get_guint8(tvb, hdr_len + 1) == \
+ ((tvb_get_guint8(tvb, hdr_len) | 0x20) & 0x7f))
+#define IS_CCMP(tvb, hdr_len) (tvb_get_guint8(tvb, hdr_len + 2) == 0)
+ guint32 sec_header=0;
+ guint32 sec_trailer=0;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_2, tvb, offset, 1, ENC_NA);
- offset += 1;
+ next_tvb = try_decrypt(tvb, pinfo, hdr_len, reported_len, &algorithm, &sec_header, &sec_trailer, &used_key);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_3, tvb, offset, 1, ENC_NA);
- offset += 1;
+ keybyte = tvb_get_guint8(tvb, hdr_len + 3);
+ key = KEY_OCTET_WEP_KEY(keybyte);
+ if ((keybyte & KEY_EXTIV) && (len >= EXTIV_LEN)) {
+ /* Extended IV; this frame is likely encrypted with TKIP or CCMP */
+ if (tree) {
+ if (algorithm==PROTECTION_ALG_TKIP)
+ wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
+ ett_wep_parameters, NULL, "TKIP parameters");
+ else if (algorithm==PROTECTION_ALG_CCMP)
+ wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
+ ett_wep_parameters, NULL, "CCMP parameters");
+ else {
+ if (IS_TKIP(tvb, hdr_len)) {
+ algorithm=PROTECTION_ALG_TKIP;
+ wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
+ ett_wep_parameters, NULL, "TKIP parameters");
+ } else if (IS_CCMP(tvb, hdr_len)) {
+ algorithm=PROTECTION_ALG_CCMP;
+ wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
+ ett_wep_parameters, NULL, "CCMP parameters");
+ } else
+ wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
+ ett_wep_parameters, NULL, "TKIP/CCMP parameters");
+ }
+ proto_item_set_len(ti, hdr_len + 8);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_4, tvb, offset, 1, ENC_NA);
- offset += 1;
+ if (algorithm==PROTECTION_ALG_TKIP) {
+ g_snprintf(out_buff, SHORT_STR, "0x%08X%02X%02X",
+ tvb_get_letohl(tvb, hdr_len + 4),
+ tvb_get_guint8(tvb, hdr_len),
+ tvb_get_guint8(tvb, hdr_len + 2));
+ proto_tree_add_string(wep_tree, hf_ieee80211_tkip_extiv, tvb, hdr_len,
+ EXTIV_LEN, out_buff);
+ } else if (algorithm==PROTECTION_ALG_CCMP) {
+ g_snprintf(out_buff, SHORT_STR, "0x%08X%02X%02X",
+ tvb_get_letohl(tvb, hdr_len + 4),
+ tvb_get_guint8(tvb, hdr_len + 1),
+ tvb_get_guint8(tvb, hdr_len));
+ proto_tree_add_string(wep_tree, hf_ieee80211_ccmp_extiv, tvb, hdr_len,
+ EXTIV_LEN, out_buff);
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_5, tvb, offset, 1, ENC_NA);
- offset += 1;
+ proto_tree_add_uint(wep_tree, hf_ieee80211_wep_key, tvb, hdr_len + 3, 1, key);
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_6, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* Subtract out the length of the IV. */
+ len -= EXTIV_LEN;
+ reported_len -= EXTIV_LEN;
+ ivlen = EXTIV_LEN;
+ /* It is unknown whether this is TKIP or CCMP, so let's not even try to
+ * parse TKIP Michael MIC+ICV or CCMP MIC. */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_rpi_histogram_report_7, tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- case 3: /* Channel Load Report */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* checking for the trailer */
+ if (next_tvb!=NULL) {
+ if (reported_len < (gint) sec_trailer) {
+ /* There is no space for a trailer, ignore it and don't decrypt */
+ ;
+ } else if (len < reported_len) {
+ /* There is space for a trailer, but we haven't capture all the */
+ /* packet. Slice off the trailer, but don't try to decrypt */
+ reported_len -= sec_trailer;
+ if (len > reported_len)
+ len = reported_len;
+ } else {
+ /* Ok, we have a trailer and the whole packet. Decrypt it! */
+ /* TODO: At the moment we won't add the trailer to the tree, */
+ /* so don't remove the trailer from the packet */
+ len -= sec_trailer;
+ reported_len -= sec_trailer;
+ can_decrypt = TRUE;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* Add Key information to packet */
+ bytes_to_hexstr(out_buff, used_key.KeyData.Wpa.Ptk+32, DOT11DECRYPT_TK_LEN); /* TK is stored in PTK at offset 32 bytes and 16 bytes long */
+ out_buff[2*DOT11DECRYPT_TK_LEN] = '\0';
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ if (key == 0) { /* encrypted with pairwise key */
+ ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_tk, tvb, 0, 0, out_buff);
+ PROTO_ITEM_SET_GENERATED(ti);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ /* Also add the PMK used to to decrypt the packet. (PMK==PSK) */
+ bytes_to_hexstr(out_buff, used_key.KeyData.Wpa.Psk, DOT11DECRYPT_WPA_PSK_LEN); /* 32 bytes */
+ out_buff[2*DOT11DECRYPT_WPA_PSK_LEN] = '\0';
+ ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_pmk, tvb, 0, 0, out_buff);
+ PROTO_ITEM_SET_GENERATED(ti);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_load, tvb, offset, 1, ENC_NA);
- offset += 1;
+ } else { /* Encrypted with Group Key */
+ ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_gtk, tvb, 0, 0, out_buff); /* GTK is stored in PTK at offset 32 bytes and 16 bytes long */
+ PROTO_ITEM_SET_GENERATED(ti);
+ }
+ }
+ }
+ } else {
+ /* No Ext. IV - WEP packet */
+ /*
+ * XXX - pass the IV and key to "try_decrypt_wep()", and have it pass
+ * them to "wep_decrypt()", rather than having "wep_decrypt()" extract
+ * them itself.
+ *
+ * Also, just pass the data *following* the WEP parameters as the
+ * buffer to decrypt.
+ */
+ iv = tvb_get_ntoh24(tvb, hdr_len);
+ if (tree) {
+ wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 4,
+ ett_wep_parameters, NULL, "WEP parameters");
- /* TODO Add Optional Subelements */
- break;
- }
- case 4: /* Noise Histogram Report */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
+ proto_tree_add_uint(wep_tree, hf_ieee80211_wep_iv, tvb, hdr_len, 3, iv);
+ tvb_memcpy(tvb, iv_buff, hdr_len, 3);
+ is_iv_bad = weak_iv(iv_buff);
+ if (is_iv_bad != -1) {
+ proto_tree_add_boolean_format (wep_tree, hf_ieee80211_wep_iv_weak,
+ tvb, 0, 0, TRUE,
+ "Weak IV for key byte %d",
+ is_iv_bad);
+ }
+ }
+ if (tree)
+ proto_tree_add_uint(wep_tree, hf_ieee80211_wep_key, tvb, hdr_len + 3, 1, key);
+
+ /* Subtract out the length of the IV. */
+ len -= 4;
+ reported_len -= 4;
+ ivlen = 4;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* Even if the decryption was not successful, set the algorithm */
+ algorithm=PROTECTION_ALG_WEP;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ /*
+ * Well, this packet should, in theory, have an ICV.
+ * Do we have the entire packet, and does it have enough data for
+ * the ICV?
+ */
+ if (reported_len < 4) {
+ /*
+ * The packet is claimed not to even have enough data for a
+ * 4-byte ICV.
+ * Pretend it doesn't have an ICV.
+ */
+ ;
+ } else if (len < reported_len) {
+ /*
+ * The packet is claimed to have enough data for a 4-byte ICV,
+ * but we didn't capture all of the packet.
+ * Slice off the 4-byte ICV from the reported length, and trim
+ * the captured length so it's no more than the reported length;
+ * that will slice off what of the ICV, if any, is in the
+ * captured length.
+ */
+ reported_len -= 4;
+ if (len > reported_len)
+ len = reported_len;
+ } else {
+ /*
+ * We have the entire packet, and it includes a 4-byte ICV.
+ * Slice it off, and put it into the tree.
+ *
+ * We only support decrypting if we have the the ICV.
+ *
+ * XXX - the ICV is encrypted; we're putting the encrypted
+ * value, not the decrypted value, into the tree.
+ */
+ len -= 4;
+ reported_len -= 4;
+ can_decrypt = TRUE;
+ }
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (algorithm == PROTECTION_ALG_WEP) {
+ g_strlcpy(wlan_stats.protection, "WEP", MAX_PROTECT_LEN);
+ } else if (algorithm == PROTECTION_ALG_TKIP) {
+ g_strlcpy(wlan_stats.protection, "TKIP", MAX_PROTECT_LEN);
+ } else if (algorithm == PROTECTION_ALG_CCMP) {
+ g_strlcpy(wlan_stats.protection, "CCMP", MAX_PROTECT_LEN);
+ } else {
+ g_strlcpy(wlan_stats.protection, "Unknown", MAX_PROTECT_LEN);
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ant_id, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* protection header */
+ if (!can_decrypt || (next_tvb == NULL)) {
+ /*
+ * WEP decode impossible or failed, treat payload as raw data
+ * and don't attempt fragment reassembly or further dissection.
+ */
+ next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len + ivlen, len, reported_len);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_anpi, tvb, offset, 1, ENC_NA);
- offset += 1;
+ if (tree) {
+ if (algorithm == PROTECTION_ALG_WEP) {
+ if (can_decrypt)
+ proto_tree_add_uint_format_value(wep_tree, hf_ieee80211_wep_icv, tvb,
+ hdr_len + ivlen + len, 4,
+ tvb_get_ntohl(tvb, hdr_len + ivlen + len),
+ "0x%08x (not verified)",
+ tvb_get_ntohl(tvb, hdr_len + ivlen + len));
+ } else if (algorithm == PROTECTION_ALG_CCMP) {
+ } else if (algorithm == PROTECTION_ALG_TKIP) {
+ }
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_0, tvb, offset, 1, ENC_NA);
- offset += 1;
+ if ((!(option_flags & IEEE80211_COMMON_OPT_IS_CENTRINO)) && (wlan_ignore_prot == WLAN_IGNORE_PROT_NO)) {
+ /* Some wireless drivers (such as Centrino) WEP payload already decrypted */
+ call_data_dissector(next_tvb, pinfo, tree);
+ goto end_of_wlan;
+ }
+ } else {
+ if (algorithm == PROTECTION_ALG_WEP) {
+ if (tree)
+ proto_tree_add_uint_format_value(wep_tree, hf_ieee80211_wep_icv, tvb,
+ hdr_len + ivlen + len, 4,
+ tvb_get_ntohl(tvb, hdr_len + ivlen + len),
+ "0x%08x (correct)",
+ tvb_get_ntohl(tvb, hdr_len + ivlen + len));
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_1, tvb, offset, 1, ENC_NA);
- offset += 1;
+ add_new_data_source(pinfo, next_tvb, "Decrypted WEP data");
+ } else if (algorithm==PROTECTION_ALG_CCMP) {
+ add_new_data_source(pinfo, next_tvb, "Decrypted CCMP data");
+ } else if (algorithm==PROTECTION_ALG_TKIP) {
+ add_new_data_source(pinfo, next_tvb, "Decrypted TKIP data");
+ }
+#undef IS_TKIP
+#undef IS_CCMP
+#undef PROTECTION_ALG_CCMP
+#undef PROTECTION_ALG_TKIP
+#undef PROTECTION_ALG_WEP
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_2, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /*
+ * WEP decryption successful!
+ *
+ * Use the tvbuff we got back from the decryption; the data starts at
+ * the beginning. The lengths are already correct for the decoded WEP
+ * payload.
+ */
+ hdr_len = 0;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_3, tvb, offset, 1, ENC_NA);
- offset += 1;
+ } else {
+ /*
+ * Not a WEP-encrypted frame; just use the data from the tvbuff
+ * handed to us.
+ *
+ * The payload starts at "hdr_len" (i.e., just past the 802.11
+ * MAC header), the length of data in the tvbuff following the
+ * 802.11 header is "len", and the length of data in the packet
+ * following the 802.11 header is "reported_len".
+ */
+ next_tvb = tvb;
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_4, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /*
+ * Do defragmentation if "wlan_defragment" is true, and we have more
+ * fragments or this isn't the first fragment.
+ *
+ * We have to do some special handling to catch frames that
+ * have the "More Fragments" indicator not set but that
+ * don't show up as reassembled and don't have any other
+ * fragments present. Some networking interfaces appear
+ * to do reassembly even when you're capturing raw packets
+ * *and* show the reassembled packet without the "More
+ * Fragments" indicator set *but* with a non-zero fragment
+ * number.
+ *
+ * "fragment_add_seq_802_11()" handles that; we want to call it
+ * even if we have a short frame, so that it does those checks - if
+ * the frame is short, it doesn't do reassembly on it.
+ *
+ * (This could get some false positives if we really *did* only
+ * capture the last fragment of a fragmented packet, but that's
+ * life.)
+ */
+ save_fragmented = pinfo->fragmented;
+ if (wlan_defragment && (more_frags || (frag_number != 0))) {
+ fragment_head *fd_head;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_5, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /*
+ * If we've already seen this frame, look it up in the
+ * table of reassembled packets, otherwise add it to
+ * whatever reassembly is in progress, if any, and see
+ * if it's done.
+ */
+ if (reported_len < 0)
+ THROW(ReportedBoundsError);
+ fd_head = fragment_add_seq_802_11(&wlan_reassembly_table,
+ next_tvb, hdr_len, pinfo, seq_number, NULL,
+ frag_number,
+ reported_len,
+ more_frags);
+ next_tvb = process_reassembled_data(tvb, hdr_len, pinfo,
+ "Reassembled 802.11", fd_head,
+ &frag_items, NULL, hdr_tree);
+ } else {
+ /*
+ * If this is the first fragment, dissect its contents, otherwise
+ * just show it as a fragment.
+ */
+ if (frag_number != 0) {
+ /* Not the first fragment - don't dissect it. */
+ next_tvb = NULL;
+ } else {
+ /* First fragment, or not fragmented. Dissect what we have here. */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_6, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /* Get a tvbuff for the payload. */
+ next_tvb = tvb_new_subset_length_caplen(next_tvb, hdr_len, len, reported_len);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_7, tvb, offset, 1, ENC_NA);
- offset += 1;
+ /*
+ * If this is the first fragment, but not the only fragment,
+ * tell the next protocol that.
+ */
+ if (more_frags)
+ pinfo->fragmented = TRUE;
+ else
+ pinfo->fragmented = FALSE;
+ }
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_8, tvb, offset, 1, ENC_NA);
- offset += 1;
+ if (next_tvb == NULL) {
+ /* Just show this as an incomplete fragment. */
+ col_set_str(pinfo->cinfo, COL_INFO, "Fragmented IEEE 802.11 frame");
+ next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len, len, reported_len);
+ call_data_dissector(next_tvb, pinfo, tree);
+ pinfo->fragmented = save_fragmented;
+ goto end_of_wlan;
+ }
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_9, tvb, offset, 1, ENC_NA);
- offset += 1;
+ switch (FCF_FRAME_TYPE (fcf))
+ {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ipi_density_10, tvb, offset, 1, ENC_NA);
- offset += 1;
+ case MGT_FRAME:
+ dissect_ieee80211_mgt(fcf, next_tvb, pinfo, tree);
+ break;
- /* TODO Add Optional Subelements */
- break;
- case 5: /* Beacon Report */
- {
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
+ case DATA_FRAME:
+ if (is_amsdu && (tvb_reported_length_remaining(next_tvb, 0) > 4)) {
+ proto_item *parent_item;
+ proto_tree *mpdu_tree;
+ guint32 msdu_offset = 0;
+ guint i = 1;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
+ parent_item = proto_tree_add_protocol_format(tree, proto_aggregate, next_tvb, 0,
+ tvb_reported_length_remaining(next_tvb, 0), "IEEE 802.11 Aggregate MSDU");
+ mpdu_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_parent_tree);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ do {
+ tvbuff_t *msdu_tvb;
+ guint16 msdu_length;
+ proto_tree *subframe_tree;
+ const gchar *resolve_name;
+
+ /*
+ * IEEE Std 802.11-2012 says, in section 8.3.2.2 "A-MSDU format":
+ *
+ * The A-MSDU subframe header contains three fields: DA, SA, and
+ * Length. The order of these fields and the bits within these
+ * fields are the same as the IEEE 802.3 frame format.
+ *
+ * which means that the length field is big-endian, not
+ * little-endian.
+ */
+ msdu_length = tvb_get_ntohs(next_tvb, msdu_offset+12);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ parent_item = proto_tree_add_item(mpdu_tree, hf_ieee80211_amsdu_subframe, next_tvb,
+ msdu_offset, roundup2(msdu_offset+14+msdu_length, 4), ENC_NA);
+ proto_item_append_text(parent_item, " #%u", i);
+ subframe_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_subframe_tree);
+ i += 1;
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_measure_report_frame_info,
- ett_tag_measure_report_frame_tree, ieee80211_tag_measure_report_frame_info,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
+ proto_tree_add_item(subframe_tree, hf_ieee80211_addr_da, next_tvb, msdu_offset, 6, ENC_NA);
+ resolve_name = tvb_get_ether_name(tvb, msdu_offset);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_da_resolved, tvb, msdu_offset, 6,
+ resolve_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(subframe_tree, hf_ieee80211_addr_sa, next_tvb, msdu_offset+6, 6, ENC_NA);
+ resolve_name = tvb_get_ether_name(tvb, msdu_offset+6);
+ hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_sa_resolved, tvb, msdu_offset+6, 6,
+ resolve_name);
+ PROTO_ITEM_SET_HIDDEN(hidden_item);
+ proto_tree_add_item(subframe_tree, hf_ieee80211_amsdu_length, next_tvb, msdu_offset+12, 2, ENC_BIG_ENDIAN);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_rcpi, tvb, offset, 1, ENC_NA);
- offset += 1;
+ msdu_offset += 14;
+ msdu_tvb = tvb_new_subset_length(next_tvb, msdu_offset, msdu_length);
+ call_dissector(llc_handle, msdu_tvb, pinfo, subframe_tree);
+ msdu_offset = roundup2(msdu_offset+msdu_length, 4);
+ } while (tvb_reported_length_remaining(next_tvb, msdu_offset) > 14);
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_rsni, tvb, offset, 1, ENC_NA);
- offset += 1;
+ break;
+ }
+ /* I guess some bridges take Netware Ethernet_802_3 frames,
+ which are 802.3 frames (with a length field rather than
+ a type field, but with no 802.2 header in the payload),
+ and just stick the payload into an 802.11 frame. I've seen
+ captures that show frames of that sort.
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
+ We also handle some odd form of encapsulation in which a
+ complete Ethernet frame is encapsulated within an 802.11
+ data frame, with no 802.2 header. This has been seen
+ from some hardware.
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_ant_id, tvb, offset, 1, ENC_NA);
- offset += 1;
+ On top of that, at least at some point it appeared that
+ the OLPC XO sent out frames with two bytes of 0 between
+ the "end" of the 802.11 header and the beginning of
+ the payload. Something similar has also been observed
+ with Atheros chipsets. There the sequence control field
+ seems repeated.
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_parent_tsf, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ So, if the packet doesn't start with 0xaa 0xaa:
- while (offset < tag_len)
- {
- guint8 sub_id, sub_length;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_beacon_sub_id, tvb, offset, 1, ENC_NA);
- sub_id = tvb_get_guint8(tvb, offset);
- offset += 1;
+ we first use the same scheme that linux-wlan-ng does to detect
+ those encapsulated Ethernet frames, namely looking to see whether
+ the frame either starts with 6 octets that match the destination
+ address from the 802.11 header or has 6 octets that match the
+ source address from the 802.11 header following the first 6 octets,
+ and, if so, treat it as an encapsulated Ethernet frame;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_subelement_length, tvb, offset, 1, ENC_NA);
- sub_length = tvb_get_guint8(tvb, offset);
- offset += 1;
+ otherwise, we use the same scheme that we use in the Ethernet
+ dissector to recognize Netware 802.3 frames, namely checking
+ whether the packet starts with 0xff 0xff and, if so, treat it
+ as an encapsulated IPX frame, and then check whether the
+ packet starts with 0x00 0x00 and, if so, treat it as an OLPC
+ frame, or check the packet starts with the repetition of the
+ sequence control field and, if so, treat it as an Atheros frame. */
+ heur_dtbl_entry_t *hdtbl_entry;
+ if (dissector_try_heuristic(heur_subdissector_list, next_tvb, pinfo, tree, &hdtbl_entry, NULL)) {
+ pinfo->fragmented = save_fragmented;
+ goto end_of_wlan; /* heuristics dissector handled it. */
+ }
+ encap_type = ENCAP_802_2;
+ if (tvb_bytes_exist(next_tvb, 0, 2)) {
+ octet1 = tvb_get_guint8(next_tvb, 0);
+ octet2 = tvb_get_guint8(next_tvb, 1);
+ if ((octet1 != 0xaa) || (octet2 != 0xaa)) {
+ if ((tvb_memeql(next_tvb, 6, (const guint8 *)pinfo->dl_src.data, 6) == 0) ||
+ (tvb_memeql(next_tvb, 0, (const guint8 *)pinfo->dl_dst.data, 6) == 0))
+ encap_type = ENCAP_ETHERNET;
+ else if ((octet1 == 0xff) && (octet2 == 0xff))
+ encap_type = ENCAP_IPX;
+ else if (((octet1 == 0x00) && (octet2 == 0x00)) ||
+ (((octet2 << 8) | octet1) == seq_control)) {
+ proto_tree_add_item(tree, hf_ieee80211_mysterious_olpc_stuff, next_tvb, 0, 2, ENC_NA);
+ next_tvb = tvb_new_subset_remaining(next_tvb, 2);
+ }
+ }
+ }
- switch (sub_id) {
- case MEASURE_REP_REPORTED_FRAME_BODY: /* Reported Frame Body (1) */
- {
- proto_tree *rep_tree;
+ switch (encap_type) {
- rep_tree = proto_tree_add_subtree(sub_tree, tvb, offset, sub_length, ett_tag_measure_reported_frame_tree, NULL, "Reported Frame Body");
+ case ENCAP_802_2:
+ call_dissector(llc_handle, next_tvb, pinfo, tree);
+ break;
- add_ff_timestamp(rep_tree, tvb, pinfo, 0);
- add_ff_beacon_interval(rep_tree, tvb, pinfo, 8);
- add_ff_cap_info(rep_tree, tvb, pinfo, 10);
- offset += 12;
+ case ENCAP_ETHERNET:
+ call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree);
+ break;
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, rep_tree, sub_length - 12, MGT_PROBE_RESP, NULL);
- offset += (sub_length - 12);
- }
+ case ENCAP_IPX:
+ call_dissector(ipx_handle, next_tvb, pinfo, tree);
break;
- default:
- /* no default action */
- break;
}
+ break;
+
+ case EXTENSION_FRAME:
+ {
+ dissect_ieee80211_extension(fcf, next_tvb, pinfo, tree);
+ break;
}
- break;
}
- case 6: /* Frame Report */
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_operating_class, tvb, offset, 1, ENC_NA);
- offset += 1;
-
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
-
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_start_time, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ pinfo->fragmented = save_fragmented;
- proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+end_of_wlan:
+ whdr->stats = wlan_stats;
+ tap_queue_packet(wlan_tap, pinfo, whdr);
+ memset(&wlan_stats, 0, sizeof wlan_stats);
- /* TODO Add Optional Subelements */
- break;
- case 7: /* BSTA Statistics Report */
- /* TODO */
- case 8: /* Location Configuration Information Report element */
- /* TODO */
- case 9: /* Transmit Stream Measurement Report */
- /* TODO */
- case 10: /* Multicast diagnostics Report */
- /* TODO */
- case 11: /* Location Civic Report */
- /* TODO */
- case 12: /* Location Identifier Report */
- /* TODO */
- case 13: /* Directional channel quality Report */
- /* TODO */
- case 14: /* Directional measurement Report */
- /* TODO */
- case 15: /* Directional statistics Report */
- /* TODO */
- default: /* unknown */
- break;
- }
- if (offset < tag_len)
- {
- proto_item *tix;
- tix = proto_tree_add_item(sub_tree, hf_ieee80211_tag_measure_report_unknown, tvb, offset, tag_len - offset, ENC_NA);
- expert_add_info(pinfo, tix, &ei_ieee80211_tag_measure_report_unknown);
- }
return tvb_captured_length(tvb);
}
-/* 7.3.2.23 Quiet element (40) */
+/*
+ * Dissect 802.11 with a variable-length link-layer header and with the FCS
+ * presence or absence indicated by the pseudo-header, if there is one.
+ */
static int
-ieee80211_tag_quiet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211(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;
- if (tag_len != 6)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
- return tvb_captured_length(tvb);
- }
-
- proto_tree_add_item(tree, hf_ieee80211_tag_quiet_count, tvb, offset, 1, ENC_NA);
- proto_item_append_text(field_data->item_tag, " Count: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
-
- proto_tree_add_item(tree, hf_ieee80211_tag_quiet_period, tvb, offset, 1, ENC_NA);
- proto_item_append_text(field_data->item_tag, " Period: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
-
- proto_tree_add_item(tree, hf_ieee80211_tag_quiet_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " Duration: %d", tvb_get_letohs(tvb, offset));
- offset += 2;
-
- proto_tree_add_item(tree, hf_ieee80211_tag_quiet_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " Offset: %d", tvb_get_letohs(tvb, offset));
+ struct ieee_802_11_phdr *phdr = (struct ieee_802_11_phdr *)data;
+ struct ieee_802_11_phdr ourphdr;
- return tvb_captured_length(tvb);
+ if (phdr == NULL) {
+ /*
+ * Fake a pseudo-header.
+ * XXX - what are we supposed to do if the FCS length is unknown?
+ */
+ memset(&ourphdr, 0, sizeof(ourphdr));
+ ourphdr.fcs_len = -1;
+ ourphdr.decrypted = FALSE;
+ ourphdr.datapad = FALSE;
+ ourphdr.phy = PHDR_802_11_PHY_UNKNOWN;
+ phdr = &ourphdr;
+ }
+ return dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, phdr);
}
-/* 7.3.2.24 IBSS DFS element (41) */
+/*
+ * Dissect 802.11 with a variable-length link-layer header and with an
+ * FCS, but no pseudo-header.
+ */
static int
-ieee80211_tag_ibss_dfs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_withfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- proto_item *ti_sup_map;
- proto_tree *sub_map_tree;
- if (tag_len < 7)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 7", tag_len);
- return tvb_captured_length(tvb);
- }
-
- proto_tree_add_item(tree, hf_ieee80211_tag_dfs_owner, tvb, offset, 6, ENC_NA);
- proto_item_append_text(field_data->item_tag, " Owner: %s", tvb_ether_to_str(tvb, offset));
- offset += 6;
-
- proto_tree_add_item(tree, hf_ieee80211_tag_dfs_recovery_interval, tvb, offset, 1, ENC_NA);
- offset += 1;
+ struct ieee_802_11_phdr phdr;
- while (offset < tag_len)
- {
- ti_sup_map = proto_tree_add_item(tree, hf_ieee80211_tag_dfs_channel_map, tvb, offset, 2, ENC_NA);
- sub_map_tree = proto_item_add_subtree(ti_sup_map, ett_tag_dfs_map_tree);
- proto_tree_add_item(sub_map_tree, hf_ieee80211_tag_dfs_channel_number, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(sub_map_tree, hf_ieee80211_tag_dfs_map, tvb, offset, 1, ENC_NA);
- offset += 2;
- }
+ /* Construct a pseudo-header to hand to the common code. */
+ memset(&phdr, 0, sizeof(phdr));
+ phdr.fcs_len = 4;
+ phdr.decrypted = FALSE;
+ phdr.datapad = FALSE;
+ phdr.phy = PHDR_802_11_PHY_UNKNOWN;
+ dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
return tvb_captured_length(tvb);
}
-/* 7.3.2.13 ERP Information element (42) */
+/*
+ * Dissect 802.11 with a variable-length link-layer header and without an
+ * FCS, but no pseudo-header.
+ */
static int
-ieee80211_tag_erp_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_withoutfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- static const int *ieee80211_tag_erp_info_flags[] = {
- &hf_ieee80211_tag_erp_info_erp_present,
- &hf_ieee80211_tag_erp_info_use_protection,
- &hf_ieee80211_tag_erp_info_barker_preamble_mode,
- &hf_ieee80211_tag_erp_info_reserved,
- NULL
- };
-
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
- return tvb_captured_length(tvb);
- }
-
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_tag_erp_info,
- ett_tag_erp_info_tree, ieee80211_tag_erp_info_flags,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
+ struct ieee_802_11_phdr phdr;
+ /* Construct a pseudo-header to hand to the common code. */
+ memset(&phdr, 0, sizeof(phdr));
+ phdr.decrypted = FALSE;
+ phdr.datapad = FALSE;
+ phdr.phy = PHDR_802_11_PHY_UNKNOWN;
+ dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
return tvb_captured_length(tvb);
}
-/* 7.3.2.32 TS Delay element (43) */
+/*
+ * Dissect 802.11 from an Intel 2200BG adapter in a Centrino laptop
+ * running Windows XP.
+ *
+ * From
+ *
+ * https://www.wireshark.org/lists/ethereal-dev/200407/msg00184.html
+ *
+ * and
+ *
+ * https://www.wireshark.org/lists/ethereal-dev/200407/msg00393.html:
+ *
+ * I tried capturing from a Centrino laptop with the Intel 2200BG 802.11g
+ * chipset. I saw a lot of "Ethernet II" frames with 0x2452 as ethertype.
+ *
+ * ...
+ *
+ * This behaviour has been observed on Windows XP. In my opinion it is
+ * a "proprietary" behaviour of either the Centrino driver or the Centrino
+ * hardware. Currently I have no Linux distro installed on the machine to
+ * verify whether it is also the case.
+ *
+ * These packets are seen only in a promiscuous capture:
+ * - Packets normally received by the Centrino computer have the normal
+ * structure (no 802.11/LLC header but directly IP header).
+ * - Packets that are supposed to be received by another computer have
+ * the 802.11/LLC headers. ... Also I noticed that when WEP is enabled,
+ * the 802.11 header has the flag "WEP" set to true, but the packet
+ * is already decrypted. I added a test in the code to accomodate this.
+ * For TKIP it seems to stay encrypted.
+ */
static int
-ieee80211_tag_ts_delay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_centrino(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- if (tag_len != 4)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
- return tvb_captured_length(tvb);
- }
+ struct ieee_802_11_phdr phdr;
- proto_tree_add_item(tree, hf_ieee80211_ts_delay, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " : %d", tvb_get_ntohl(tvb, offset));
+ /* Construct a pseudo-header to hand to the common code. */
+ memset(&phdr, 0, sizeof(phdr));
+ phdr.decrypted = FALSE;
+ phdr.datapad = FALSE;
+ phdr.phy = PHDR_802_11_PHY_UNKNOWN;
+ dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_IS_CENTRINO|IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
return tvb_captured_length(tvb);
}
-/* 7.3.2.33 TCLAS Processing element (44) */
+/*
+ * Dissect 802.11 with a variable-length link-layer header and a byte-swapped
+ * control field and with no FCS (some hardware sends out LWAPP-encapsulated
+ * 802.11 packets with the control field byte swapped).
+ */
static int
-ieee80211_tag_tclas_process(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_bsfc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
- return tvb_captured_length(tvb);
- }
+ struct ieee_802_11_phdr phdr;
- proto_tree_add_item(tree, hf_ieee80211_tclas_process, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " : %s", val_to_str(tvb_get_guint8(tvb, offset), ieee80211_tclas_process_flag, "Unknown %d"));
+ /* Construct a pseudo-header to hand to the common code. */
+ memset(&phdr, 0, sizeof(phdr));
+ phdr.decrypted = FALSE;
+ phdr.datapad = FALSE;
+ phdr.phy = PHDR_802_11_PHY_UNKNOWN;
+ dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_BROKEN_FC|IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
return tvb_captured_length(tvb);
}
-/* 802.11-2012 8.4.2.37 QoS Capability element (46) */
+/*
+ * Dissect 802.11 with a variable-length link-layer header without qos elements
+ * in data+qos frames and with no FCS (sent as WIDS frames by Cisco standalone
+ * APs).
+ */
static int
-ieee80211_tag_qos_capability(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_ieee80211_noqos(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 1", tag_len);
- return tvb_captured_length(tvb);
- }
- dissect_qos_capability(tree, tvb, pinfo, offset, field_data->ftype);
+ struct ieee_802_11_phdr phdr;
+
+ /* Construct a pseudo-header to hand to the common code. */
+ memset(&phdr, 0, sizeof(phdr));
+ phdr.decrypted = FALSE;
+ phdr.datapad = FALSE;
+ phdr.phy = PHDR_802_11_PHY_UNKNOWN;
+ dissect_ieee80211_common(tvb, pinfo, tree, 0, &phdr);
return tvb_captured_length(tvb);
}
-static int
-ieee80211_tag_rsn_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+
+/* ------------- */
+static guint
+retransmit_hash(gconstpointer k)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- if (tag_len < 18)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 18", tag_len);
- return tvb_captured_length(tvb);
- }
+ const retransmit_key *key = (const retransmit_key *)k;
+ guint hash_val;
+ int i;
- dissect_rsn_ie(pinfo, tree, tvb, offset, tag_len, field_data->sanity_check);
- return tvb_captured_length(tvb);
+ hash_val = 0;
+ for (i = 0; i < 6; i++)
+ hash_val += key->bssid[i];
+
+ for (i = 0; i < 6; i++)
+ hash_val += key->src[i];
+
+ return hash_val;
}
-/* 7.3.2.14 Extended Supported Rates element (50) */
-static int
-ieee80211_tag_ext_supp_rates(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+static gint
+retransmit_equal(gconstpointer k1, gconstpointer k2)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- 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);
- return tvb_captured_length(tvb);
- }
+ const retransmit_key *key1 = (const retransmit_key *)k1;
+ const retransmit_key *key2 = (const retransmit_key *)k2;
- while (offset < tag_len)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_ext_supp_rates, tvb, offset, 1, ENC_NA);
- proto_item_append_text(field_data->item_tag, " %s,", val_to_str_ext_const(tvb_get_guint8(tvb, offset), &ieee80211_supported_rates_vals_ext, "Unknown Rate"));
- offset += 1;
- }
- proto_item_append_text(field_data->item_tag, " [Mbit/sec]");
- return tvb_captured_length(tvb);
+ return ((!memcmp(key1->bssid, key2->bssid, 6) && !memcmp(key1->src, key2->src, 6)) ? TRUE:FALSE);
}
-static int
-ieee80211_tag_cisco_ccx1_ckip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+static guint
+frame_hash(gconstpointer k)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- /* From WCS manual:
- * If Aironet IE support is enabled, the access point sends an Aironet
- * IE 0x85 (which contains the access point name, load, number of
- * associated clients, and so on) in the beacon and probe responses of
- * this WLAN, and the controller sends Aironet IEs 0x85 and 0x95
- * (which contains the management IP address of the controller and
- * the IP address of the access point) in the reassociation response
- * if it receives Aironet IE 0x85 in the reassociation request.
- */
+ guint32 frame = GPOINTER_TO_UINT(k);
- if (tag_len < 26)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u too short, must be >= 26", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_unknown, tvb, offset, 10, ENC_NA);
- offset += 10;
+ return frame;
+}
+
+static gint
+frame_equal(gconstpointer k1, gconstpointer k2)
+{
+ guint32 frame1 = GPOINTER_TO_UINT(k1);
+ guint32 frame2 = GPOINTER_TO_UINT(k2);
+
+ return frame1==frame2;
+}
+
+/*
+ * EAPOL key description dissectors.
+ */
+#define KEY_INFO_KEYDES_VERSION_MASK 0x0007
+#define KEY_INFO_KEY_TYPE_MASK 0x0008
+#define KEY_INFO_KEY_INDEX_MASK 0x0030
+#define KEY_INFO_INSTALL_MASK 0x0040
+#define KEY_INFO_KEY_ACK_MASK 0x0080
+#define KEY_INFO_KEY_MIC_MASK 0x0100
+#define KEY_INFO_SECURE_MASK 0x0200
+#define KEY_INFO_ERROR_MASK 0x0400
+#define KEY_INFO_REQUEST_MASK 0x0800
+#define KEY_INFO_ENCRYPTED_KEY_DATA_MASK 0x1000
+#define KEY_INFO_SMK_MESSAGE_MASK 0x2000
+
+#define KEYDES_VER_TYPE1 0x01
+#define KEYDES_VER_TYPE2 0x02
+#define KEYDES_VER_TYPE3 0x03
+
+static const value_string keydes_version_vals[] = {
+ { KEYDES_VER_TYPE1, "RC4 Cipher, HMAC-MD5 MIC" },
+ { KEYDES_VER_TYPE2, "AES Cipher, HMAC-SHA1 MIC" },
+ { KEYDES_VER_TYPE3, "AES Cipher, AES-128-CMAC MIC" },
+ { 0, NULL }
+};
+
+static int proto_wlan_rsna_eapol = -1;
+
+static int hf_wlan_rsna_eapol_wpa_keydes_msgnr = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message = -1;
+static int hf_wlan_rsna_eapol_keydes_key_len = -1;
+static int hf_wlan_rsna_eapol_keydes_replay_counter = -1;
+static int hf_wlan_rsna_eapol_keydes_key_iv = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_nonce = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_rsc = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_id = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_mic = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_data_len = -1;
+static int hf_wlan_rsna_eapol_wpa_keydes_data = -1;
- /* The Name of the sending device starts at offset 10 and is up to
- 15 or 16 bytes in length, \0 padded */
- proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_name, tvb, offset, 16, ENC_ASCII|ENC_NA);
- offset += 16;
+static gint ett_keyinfo = -1;
+static gint ett_wlan_rsna_eapol_keydes_data = -1;
- /* Total number off associated clients and repeater access points */
- proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_clients, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_cisco_ccx1_unknown2, tvb, offset, 3, ENC_NA);
- return tvb_captured_length(tvb);
-}
+static const true_false_string keyinfo_key_type_tfs = { "Pairwise Key", "Group Key" };
static int
-ieee80211_tag_vendor_specific_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+dissect_wlan_rsna_eapol_wpa_or_rsn_key(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int offset = 0;
- guint32 tag_vs_len = tag_len;
- guint32 oui;
+ int offset = 0;
+ guint16 keyinfo;
+ guint16 eapol_data_len;
+ proto_tree *keydes_tree;
+ proto_tree *ti = NULL;
+ static const int * wlan_rsna_eapol_wpa_keydes_keyinfo[] = {
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data,
+ &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message,
+ NULL
+ };
+ guint16 eapol_data_offset = 76; /* 92 - 16 */
+ guint16 eapol_key_mic_len = 0;
- if (tag_len < 3)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 3", tag_len);
- return tvb_captured_length(tvb);
+ if (wlan_key_mic_len) {
+ eapol_data_offset += wlan_key_mic_len;
+ eapol_key_mic_len = wlan_key_mic_len;
+ } else {
+ eapol_data_offset = 92;
+ eapol_key_mic_len = 16;
}
- proto_tree_add_item_ret_uint(tree, hf_ieee80211_tag_oui, tvb, offset, 3, ENC_BIG_ENDIAN, &oui);
- proto_item_append_text(field_data->item_tag, ": %s", uint_get_manuf_name_if_known(oui));
- offset += 3;
- tag_vs_len -= 3;
+ /*
+ * RSNA key descriptors.
+ */
+ eapol_data_len = tvb_get_ntohs(tvb, offset+eapol_data_offset);
+ keyinfo = tvb_get_ntohs(tvb, offset);
+ if (keyinfo & KEY_INFO_REQUEST_MASK) {
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Request)");
+ if (keyinfo & KEY_INFO_ERROR_MASK)
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Request, Error)");
+ } else if (keyinfo & KEY_INFO_KEY_TYPE_MASK) {
+ guint16 masked;
+ /* Windows is setting the Secure Bit on message 2 when rekeying, so we'll ignore it */
+ masked = keyinfo &
+ (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK | KEY_INFO_KEY_MIC_MASK);
- if (tag_len > 0) {
- proto_tree_add_item(field_data->item_tag, hf_ieee80211_tag_vendor_oui_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- }
+ switch (masked) {
+ case KEY_INFO_KEY_ACK_MASK:
+ {
+ ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 1);
- switch (oui) {
- /* 802.11 specific vendor ids */
- case OUI_WPAWME:
- dissect_vendor_ie_wpawme(tree, tvb, pinfo, offset, tag_vs_len, field_data->ftype);
- break;
- case OUI_RSN:
- dissect_vendor_ie_rsn(field_data->item_tag, tree, tvb, offset, tag_vs_len);
- break;
- case OUI_PRE11N:
- dissect_vendor_ie_ht(tvb, pinfo, tree, offset, field_data->item_tag, field_data->item_tag_length, tag_vs_len);
- break;
- case OUI_WFA:
- dissect_vendor_ie_wfa(pinfo, field_data->item_tag, tvb);
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 1 of 4)");
break;
+ }
+ case KEY_INFO_KEY_MIC_MASK:
+ /* We check the key length to differentiate between message 2 and 4 and just hope that
+ there are no strange implementations with key data and non-zero key length in message 4.
+ According to the IEEE specification, sections 11.6.6.3 and 11.6.6.5 we should
+ use the Secure Bit and/or the Nonce, but there are implementations ignoring the spec.
+ The Secure Bit is incorrectly set on rekeys for Windows clients for Message 2 and the Nonce is non-zero
+ in Message 4 in Bug 11994 (Apple?) */
+ if (eapol_data_len) {
+ ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 2);
- /* Normal IEEE vendor ids (from oui.h) */
- case OUI_CISCOWL: /* Cisco Wireless (Aironet) */
- dissect_vendor_ie_aironet(field_data->item_tag, tree, tvb, offset, tag_vs_len);
- break;
- case OUI_MARVELL:
- dissect_vendor_ie_marvell(field_data->item_tag, tree, tvb, offset, tag_vs_len);
- break;
- case OUI_ATHEROS:
- dissect_vendor_ie_atheros(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo, field_data->item_tag_length);
- break;
- case OUI_ARUBA:
- dissect_vendor_ie_aruba(field_data->item_tag, tree, tvb, offset, tag_vs_len);
- break;
- case OUI_NINTENDO:
- dissect_vendor_ie_nintendo(field_data->item_tag, tree, tvb, offset, tag_vs_len);
- break;
- case OUI_MIKROTIK:
- dissect_vendor_ie_mikrotik(field_data->item_tag, tree, tvb, offset, tag_vs_len);
- break;
- case OUI_MERU:
- dissect_vendor_ie_meru(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
- break;
- case OUI_ZEBRA_EXTREME:
- dissect_vendor_ie_extreme(field_data->item_tag, tree, tvb, offset, tag_vs_len, pinfo);
- break;
- default:
- proto_tree_add_item(tree, hf_ieee80211_tag_vendor_data, tvb, offset, tag_vs_len, ENC_NA);
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 2 of 4)");
+ } else {
+ ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 4);
+
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 4 of 4)");
+ }
break;
- }
- return tvb_captured_length(tvb);
-}
+ case (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK | KEY_INFO_KEY_MIC_MASK):
+ {
+ ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 3);
-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;
- guint8 ext_tag_no;
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 3 of 4)");
+ break;
+ }
+ }
+ } else {
+ if (keyinfo & KEY_INFO_KEY_ACK_MASK) {
+ ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 1);
- if (tag_len < 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 1", tag_len);
- return tvb_captured_length(tvb);
- }
- ext_tag_no = tvb_get_guint8(tvb, offset++);
- ext_tag_len = tag_len - 1;
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 1 of 2)");
+ } else {
+ ti = proto_tree_add_uint(tree, hf_wlan_rsna_eapol_wpa_keydes_msgnr, tvb, offset, 0, 2);
- switch (ext_tag_no) {
- case ETAG_FILS_SESSION:
- proto_tree_add_item(tree, hf_ieee80211_fils_session, tvb, offset, ext_tag_len, ENC_NA);
- break;
- case ETAG_FILS_WRAPPED_DATA:
- proto_tree_add_item(tree, hf_ieee80211_fils_wrapped_data, tvb, offset, ext_tag_len, ENC_NA);
- break;
- case ETAG_FILS_NONCE:
- proto_tree_add_item(tree, hf_ieee80211_fils_nonce, tvb, offset, ext_tag_len, ENC_NA);
- break;
- default:
- break;
+ col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 2 of 2)");
+ }
}
+ PROTO_ITEM_SET_GENERATED(ti);
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_wlan_rsna_eapol_wpa_keydes_keyinfo,
+ ett_keyinfo, wlan_rsna_eapol_wpa_keydes_keyinfo,
+ ENC_BIG_ENDIAN, BMT_NO_APPEND);
+ offset += 2;
+
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_key_len, tvb, offset,
+ 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_replay_counter, tvb,
+ offset, 8, ENC_BIG_ENDIAN);
+ offset += 8;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_nonce, tvb, offset,
+ 32, ENC_NA);
+ offset += 32;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_key_iv, tvb,
+ offset, 16, ENC_NA);
+ offset += 16;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_rsc, tvb, offset,
+ 8, ENC_NA);
+ offset += 8;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_id, tvb, offset, 8,
+ ENC_NA);
+ offset += 8;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_mic, tvb, offset,
+ eapol_key_mic_len, ENC_NA);
+ offset += eapol_key_mic_len;
+ proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_data_len, tvb,
+ offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ if (eapol_data_len != 0) {
+ ti = proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_data,
+ tvb, offset, eapol_data_len, ENC_NA);
+ if ((keyinfo & KEY_INFO_ENCRYPTED_KEY_DATA_MASK) ||
+ !(keyinfo & KEY_INFO_KEY_TYPE_MASK)) {
+ /* RSN: EAPOL-Key Key Data is encrypted.
+ * WPA: Group Keys use encrypted Key Data.
+ * Cannot parse this without knowing the key.
+ * IEEE 802.11i-2004 8.5.2.
+ */
+ } else {
+ keydes_tree = proto_item_add_subtree(ti, ett_wlan_rsna_eapol_keydes_data);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, keydes_tree,
+ tvb_reported_length_remaining(tvb, offset),
+ -1, NULL);
+ }
+ }
return tvb_captured_length(tvb);
}
-/* Conflict: WAPI Vs. IEEE */
-static int
-ieee80211_tag_ie_68_conflict(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+/* It returns the algorithm used for decryption and the header and trailer lengths. */
+static tvbuff_t *
+try_decrypt(tvbuff_t *tvb, packet_info *pinfo, guint offset, guint len, guint8 *algorithm, guint32 *sec_header, guint32 *sec_trailer, PDOT11DECRYPT_KEY_ITEM used_key)
{
- int tag_len = tvb_reported_length(tvb);
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- if (tag_len >= 20) { /* It Might be WAPI*/
- dissect_wapi_param_set(tvb, pinfo, tree, 0, tag_len, field_data->item_tag_length, field_data->item_tag, field_data->ftype);
- }
- else { /* BSS AC Access Delay (68) */
- dissect_bss_ac_access_delay_ie(tvb, pinfo, tree, 0, tag_len, field_data->item_tag_length);
+ const guint8 *enc_data;
+ tvbuff_t *decr_tvb = NULL;
+ guint32 dec_caplen;
+ guchar dec_data[DOT11DECRYPT_MAX_CAPLEN];
+
+ if (!enable_decryption)
+ return NULL;
+
+ /* get the entire packet */
+ enc_data = tvb_get_ptr(tvb, 0, len+offset);
+
+ /* process packet with Dot11Decrypt */
+ if (Dot11DecryptPacketProcess(&dot11decrypt_ctx, enc_data, offset, offset+len, dec_data, &dec_caplen,
+ used_key, FALSE)==DOT11DECRYPT_RET_SUCCESS)
+ {
+ guint8 *tmp;
+ *algorithm=used_key->KeyType;
+ switch (*algorithm) {
+ case DOT11DECRYPT_KEY_TYPE_WEP:
+ *sec_header=DOT11DECRYPT_WEP_HEADER;
+ *sec_trailer=DOT11DECRYPT_WEP_TRAILER;
+ break;
+ case DOT11DECRYPT_KEY_TYPE_CCMP:
+ *sec_header=DOT11DECRYPT_RSNA_HEADER;
+ *sec_trailer=DOT11DECRYPT_CCMP_TRAILER;
+ break;
+ case DOT11DECRYPT_KEY_TYPE_TKIP:
+ *sec_header=DOT11DECRYPT_RSNA_HEADER;
+ *sec_trailer=DOT11DECRYPT_TKIP_TRAILER;
+ break;
+ default:
+ return NULL;
+ }
+
+ /* allocate buffer for decrypted payload */
+ tmp = (guint8 *)wmem_memdup(pinfo->pool, dec_data+offset, dec_caplen-offset);
+
+ len = dec_caplen-offset;
+
+ /* decrypt successful, let's set up a new data tvb. */
+ decr_tvb = tvb_new_child_real_data(tvb, tmp, len, len);
}
- return tvb_captured_length(tvb);
+
+ return decr_tvb;
}
-static int
-ieee80211_tag_mesh_peering_mgmt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+/* Collect our WEP and WPA keys */
+static void
+set_dot11decrypt_keys(void)
{
- int tag_len = tvb_reported_length(tvb);
- int offset = 0;
+ guint i;
+ DOT11DECRYPT_KEYS_COLLECTION *keys = g_new(DOT11DECRYPT_KEYS_COLLECTION, 1);
+ GByteArray *bytes = NULL;
- proto_tree_add_item(tree, hf_ieee80211_mesh_peering_proto, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_mesh_peering_local_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- switch (tvb_get_guint8(tvb, 1))
- { /* Self-protected action field */
- case SELFPROT_ACTION_MESH_PEERING_OPEN:
- break;
+ keys->nKeys = 0;
- case SELFPROT_ACTION_MESH_PEERING_CONFIRM:
- proto_tree_add_item(tree, hf_ieee80211_mesh_peering_peer_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- break;
+ for (i = 0; (uat_wep_key_records != NULL) && (i < num_wepkeys_uat) && (i < MAX_ENCRYPTION_KEYS); i++)
+ {
+ decryption_key_t *dk;
+ dk = parse_key_string(uat_wep_key_records[i].string, uat_wep_key_records[i].key);
- case SELFPROT_ACTION_MESH_PEERING_CLOSE:
- if ((tag_len == 8) || (tag_len == 24))
+ if (dk != NULL)
+ {
+ DOT11DECRYPT_KEY_ITEM key;
+ if (dk->type == DOT11DECRYPT_KEY_TYPE_WEP)
{
- proto_tree_add_item(tree, hf_ieee80211_mesh_peering_peer_link_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ gboolean res;
+ key.KeyType = DOT11DECRYPT_KEY_TYPE_WEP;
+
+ bytes = g_byte_array_new();
+ res = hex_str_to_bytes(dk->key->str, bytes, FALSE);
+
+ if (dk->key->str && res && (bytes->len > 0) && (bytes->len <= DOT11DECRYPT_WEP_KEY_MAXLEN))
+ {
+ /*
+ * WEP key is correct (well, the can be even or odd, so it is not
+ * a real check, I think... is a check performed somewhere in the
+ * Dot11Decrypt function???)
+ */
+ memcpy(key.KeyData.Wep.WepKey, bytes->data, bytes->len);
+ key.KeyData.Wep.WepKeyLen = bytes->len;
+ keys->Keys[keys->nKeys] = key;
+ keys->nKeys += 1;
+ }
}
- add_ff_reason_code(tree, tvb, pinfo, offset);
- break;
+ else if (dk->type == DOT11DECRYPT_KEY_TYPE_WPA_PWD)
+ {
+ key.KeyType = DOT11DECRYPT_KEY_TYPE_WPA_PWD;
- /* unexpected values */
- default:
- proto_tree_add_expert(tree, pinfo, &ei_ieee80211_mesh_peering_unexpected , tvb, offset, tag_len);
- break;
- }
- if (tag_len - offset == 16)
- {
- proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, ENC_NA);
- }
- return tvb_captured_length(tvb);
-}
+ /* XXX - This just lops the end if the key off if it's too long.
+ * Should we handle this more gracefully? */
+ g_strlcpy(key.UserPwd.Passphrase, dk->key->str, DOT11DECRYPT_WPA_PASSPHRASE_MAX_LEN+1);
-static int
-ieee80211_tag_mesh_configuration(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
-{
- int offset = 0;
- proto_item *item;
- proto_tree *subtree;
- static const int *ieee80211_mesh_config_cap[] = {
- &hf_ieee80211_mesh_config_cap_accepting,
- &hf_ieee80211_mesh_config_cap_mcca_support,
- &hf_ieee80211_mesh_config_cap_mcca_enabled,
- &hf_ieee80211_mesh_config_cap_forwarding,
- &hf_ieee80211_mesh_config_cap_mbca_enabled,
- &hf_ieee80211_mesh_config_cap_tbtt_adjusting,
- &hf_ieee80211_mesh_config_cap_power_save_level,
- NULL
- };
+ key.UserPwd.SsidLen = 0;
+ if ((dk->ssid != NULL) && (dk->ssid->len <= DOT11DECRYPT_WPA_SSID_MAX_LEN))
+ {
+ memcpy(key.UserPwd.Ssid, dk->ssid->data, dk->ssid->len);
+ key.UserPwd.SsidLen = dk->ssid->len;
+ }
- proto_tree_add_item(tree, hf_ieee80211_mesh_config_path_sel_protocol, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_mesh_config_path_sel_metric, tvb, offset + 1, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_mesh_config_congestion_control, tvb, offset + 2, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_mesh_config_sync_method, tvb, offset + 3, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_mesh_config_auth_protocol, tvb, offset + 4, 1, ENC_LITTLE_ENDIAN);
- item = proto_tree_add_item(tree, hf_ieee80211_mesh_config_formation_info, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
- subtree = proto_item_add_subtree(item, ett_mesh_formation_info_tree);
- proto_tree_add_item(subtree, hf_ieee80211_mesh_form_info_num_of_peerings, tvb, offset + 5, 1, ENC_LITTLE_ENDIAN);
+ keys->Keys[keys->nKeys] = key;
+ keys->nKeys += 1;
+ }
+ else if (dk->type == DOT11DECRYPT_KEY_TYPE_WPA_PSK)
+ {
+ key.KeyType = DOT11DECRYPT_KEY_TYPE_WPA_PSK;
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_mesh_config_capability,
- ett_mesh_config_cap_tree, ieee80211_mesh_config_cap,
- ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- return tvb_captured_length(tvb);
-}
+ bytes = g_byte_array_new();
+ hex_str_to_bytes(dk->key->str, bytes, FALSE);
-static int
-ieee80211_tag_mesh_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
-{
- int offset = 0;
- ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
- int tag_len = tvb_reported_length(tvb);
- const guint8* mesh_id;
+ /* XXX - Pass the correct array of bytes... */
+ if (bytes->len <= DOT11DECRYPT_WPA_PSK_LEN) {
+ memcpy(key.KeyData.Wpa.Psk, bytes->data, bytes->len);
- proto_tree_add_item_ret_string(tree, hf_ieee80211_mesh_id, tvb, offset, tag_len, ENC_ASCII|ENC_NA, wmem_packet_scope(), &mesh_id);
- if (tag_len > 0) {
- gchar* s = format_text(wmem_packet_scope(), mesh_id, tag_len);
- col_append_fstr(pinfo->cinfo, COL_INFO, ", MESHID=%s", s);
- proto_item_append_text(field_data->item_tag, ": %s", s);
+ keys->Keys[keys->nKeys] = key;
+ keys->nKeys += 1;
+ }
+ }
+ free_key_string(dk);
+ if (bytes) {
+ g_byte_array_free(bytes, TRUE);
+ bytes = NULL;
+ }
+ }
}
- /* Make sure dissector is accepted */
- return ((tag_len > 0) ? tag_len : 1);
+
+ /* Now set the keys */
+ Dot11DecryptSetKeys(&dot11decrypt_ctx, keys->Keys, keys->nKeys);
+ g_free(keys);
}
-static int
-ieee80211_tag_mesh_preq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+static void
+init_wepkeys(void)
{
- int offset = 0;
- guint32 flags;
- guint8 targs, i;
+ /*
+ * XXX - Dot11Decrypt - That God sends it to us beautiful (che dio ce la mandi bona)
+ * The next lines will add a key to the Dot11Decrypt context. The keystring will be added
+ * to the old WEP array too, but we don't care, because the packets will come here
+ * already decrypted... One of these days we will fix this too
+ */
+ set_dot11decrypt_keys();
+}
- proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN, &flags);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_pdid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sta, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+/*
+ * This code had been taken from AirSnort crack.c function classify()
+ * Permission granted by snax <at> shmoo dot com
+ * weak_iv - determine which key byte an iv is useful in resolving
+ * parm - p, pointer to the first byte of an IV
+ * return - n - this IV is weak for byte n of a WEP key
+ * -1 - this IV is not weak for any key bytes
+ *
+ * This function tests for IVs that are known to satisfy the criteria
+ * for a weak IV as specified in FMS section 7.1
+ *
+ */
+static int
+weak_iv(guchar *iv)
+{
+ guchar sum, k;
- if (flags & (1<<6)) {
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_ext, tvb, offset, 6, ENC_NA);
- offset += 6;
+ if ((iv[1] == 255) && (iv[0] > 2) && (iv[0] < 16)) {
+ return iv[0] -3;
}
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- targs = tvb_get_guint8(tvb, offset);
- offset += 1;
- for (i = 0; i < targs; i++) {
- const int * targ_flags[] = {
- &hf_ieee80211_ff_hwmp_targ_to_flags,
- &hf_ieee80211_ff_hwmp_targ_usn_flags,
- NULL
- };
-
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_ff_hwmp_targ_flags,
- ett_hwmp_targ_flags_tree, targ_flags, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
+ sum = iv[0] + iv[1];
+ if (sum == 1) {
+ if (iv[2] <= 0x0a) {
+ return iv[2] +2;
+ }
+ else if (iv[2] == 0xff) {
+ return 0;
+ }
}
-
- return tvb_captured_length(tvb);
+ k = 0xfe - iv[2];
+ if ((sum == k) && ((iv[2] >= 0xf2) && (iv[2] <= 0xfe) && (iv[2] != 0xfd))) {
+ return k;
+ }
+ return -1;
}
-static int
-ieee80211_tag_mesh_prep(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+static void
+wlan_retransmit_init(void)
{
- int offset = 0;
-
- guint32 flags;
- proto_tree_add_item_ret_uint(tree, hf_ieee80211_ff_hwmp_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN, &flags);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset , 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- if (flags & (1<<6)) {
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_ext, tvb, offset, 6, ENC_NA);
- offset += 6;
+ if (fc_analyse_retransmit_table) {
+ g_hash_table_destroy(fc_analyse_retransmit_table);
+ fc_analyse_retransmit_table = NULL;
}
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_lifetime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sta, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_orig_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
+
+ if (fc_first_frame_table) {
+ g_hash_table_destroy(fc_first_frame_table);
+ fc_first_frame_table = NULL;
+ }
+
+ if (wlan_subdissector)
+ return;
+
+ fc_analyse_retransmit_table= g_hash_table_new(retransmit_hash, retransmit_equal);
+ fc_first_frame_table = g_hash_table_new(frame_hash, frame_equal);
+
}
static int
-ieee80211_tag_mesh_perr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+dissect_data_encap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
- int offset = 0;
- guint8 targs, i;
+ int offset = 0;
+ guint8 type;
+ int tagged_parameter_tree_len;
+ proto_tree *tagged_tree;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_count, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- targs = tvb_get_guint8(tvb, offset);
+ type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_ieee80211_data_encap_payload_type, tvb, offset,
+ 1, ENC_LITTLE_ENDIAN);
offset += 1;
- for (i = 0; i < targs; i++) {
- guint8 flags = tvb_get_guint8(tvb, offset);
-
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sta, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- if (flags & (1<<6)) {
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_targ_ext, tvb, offset, 6, ENC_NA);
- offset += 6;
+ switch (type) {
+ case 1:
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "RRB");
+ /* TODO: IEEE 802.11r */
+ break;
+ case 2:
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "TDLS");
+ col_clear(pinfo->cinfo, COL_INFO);
+ offset += add_ff_action(tree, tvb, pinfo, offset);
+ tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
+ if (tagged_parameter_tree_len > 0) {
+ tagged_tree = get_tagged_parameter_tree(tree, tvb, offset,
+ tagged_parameter_tree_len);
+ ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
+ tagged_parameter_tree_len, -1, NULL);
}
- offset += add_ff_reason_code(tree, tvb, pinfo, offset);
+ break;
}
return tvb_captured_length(tvb);
}
-static int
-ieee80211_tag_rann(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+void
+proto_register_ieee80211(void)
{
- int offset = 0;
- proto_tree_add_item(tree, hf_ieee80211_rann_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_hopcount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_rann_root_sta, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_rann_sn, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_rann_interval, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_ff_hwmp_metric, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
-/* Mesh Channel Switch Parameters (118) */
-static int
-ieee80211_tag_mesh_channel_switch(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;
- static const int * ieee80211_mesh_chswitch_flag[] = {
- &hf_ieee80211_mesh_chswitch_flag_initiator,
- &hf_ieee80211_mesh_chswitch_flag_txrestrict,
- NULL
- };
+ static hf_register_info hf[] = {
+ {&hf_ieee80211_fc_field,
+ {"Frame Control Field", "wlan.fc",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "MAC Frame control", HFILL }},
- if (tag_len != 6)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
- return tvb_captured_length(tvb);
- }
+ {&hf_ieee80211_fc_proto_version,
+ {"Version", "wlan.fc.version",
+ FT_UINT8, BASE_DEC, NULL, 0x03,
+ "MAC Protocol version", HFILL }}, /* 0 */
- proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_ttl, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(field_data->item_tag, " TTL: %d", tvb_get_guint8(tvb, offset));
- offset += 1;
+ {&hf_ieee80211_fc_frame_type,
+ {"Type", "wlan.fc.type",
+ FT_UINT8, BASE_DEC, VALS(frame_type), 0x0C,
+ "Frame type", HFILL }},
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_ieee80211_mesh_channel_switch_flag,
- ett_mesh_chswitch_flag_tree, ieee80211_mesh_chswitch_flag, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
- offset += 1;
+ {&hf_ieee80211_fc_frame_subtype,
+ {"Subtype", "wlan.fc.subtype",
+ FT_UINT8, BASE_DEC, NULL, 0xF0,
+ "Frame subtype", HFILL }}, /* 2 */
- proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_reason_code, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ {&hf_ieee80211_fc_frame_type_subtype,
+ {"Type/Subtype", "wlan.fc.type_subtype",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &frame_type_subtype_vals_ext, 0x0,
+ "Type and subtype combined (first byte: type, second byte: subtype)", HFILL }},
- proto_tree_add_item(tree, hf_ieee80211_mesh_channel_switch_precedence_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fc_frame_extension,
+ {"Control Frame Extension", "wlan.fc.extension",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-/* Mesh Awake Window Parameters (119) */
-static int
-ieee80211_tag_mesh_awake_window(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;
+ {&hf_ieee80211_fc_flags,
+ {"Flags", "wlan.flags",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- if (tag_len != 2) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length,
- "Tag length %u wrong, must be = 2", tag_len);
- return tvb_captured_length(tvb);
- }
+ {&hf_ieee80211_fc_data_ds,
+ {"DS status", "wlan.fc.ds",
+ FT_UINT8, BASE_HEX, VALS(tofrom_ds), (FLAG_FROM_DS|FLAG_TO_DS),
+ "Data-frame DS-traversal status", HFILL }}, /* 3 */
- proto_tree_add_item(tree, hf_ieee80211_mesh_awake_window, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fc_to_ds,
+ {"To DS", "wlan.fc.tods",
+ FT_BOOLEAN, 8, TFS(&tods_flag), FLAG_TO_DS,
+ "To DS flag", HFILL }}, /* 4 */
-static int
-ieee80211_tag_channel_switch_announcement(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;
- if (tag_len != 4)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
- return tvb_captured_length(tvb);
- }
+ {&hf_ieee80211_fc_from_ds,
+ {"From DS", "wlan.fc.fromds",
+ FT_BOOLEAN, 8, TFS(&fromds_flag), FLAG_FROM_DS,
+ "From DS flag", HFILL }}, /* 5 */
- add_ff_extended_channel_switch_announcement(tree, tvb, pinfo, offset);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fc_more_frag,
+ {"More Fragments", "wlan.fc.frag",
+ FT_BOOLEAN, 8, TFS(&more_fragments), FLAG_MORE_FRAGMENTS,
+ "More Fragments flag", HFILL }}, /* 6 */
-static int
-ieee80211_tag_supported_operating_classes(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;
- proto_item* item = NULL;
- guint8 i;
- guint8 field_len = 0;
- guint8 alt_op_class_field[256];
+ {&hf_ieee80211_fc_retry,
+ {"Retry", "wlan.fc.retry",
+ FT_BOOLEAN, 8, TFS(&retry_flags), FLAG_RETRY,
+ "Retransmission flag", HFILL }},
- if (tag_len < 2) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be >= 2", tag_len);
- return tvb_captured_length(tvb);
- } else if (tag_len > 255) {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, uint8 <= 255", tag_len);
- return tvb_captured_length(tvb);
- }
+ {&hf_ieee80211_fc_analysis_retransmission,
+ {"Retransmission", "wlan.analysis.retransmission",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ "This frame is a suspected wireless retransmission", HFILL }},
+
+ {&hf_ieee80211_fc_analysis_retransmission_frame,
+ {"Retransmission of frame", "wlan.analysis.retransmission_frame",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "This is a retransmission of frame #", HFILL }},
+
+ {&hf_ieee80211_fc_pwr_mgt,
+ {"PWR MGT", "wlan.fc.pwrmgt",
+ FT_BOOLEAN, 8, TFS(&pm_flags), FLAG_POWER_MGT,
+ "Power management status", HFILL }},
+
+ {&hf_ieee80211_fc_more_data,
+ {"More Data", "wlan.fc.moredata",
+ FT_BOOLEAN, 8, TFS(&md_flags), FLAG_MORE_DATA,
+ "More data flag", HFILL }},
+
+ {&hf_ieee80211_fc_protected,
+ {"Protected flag", "wlan.fc.protected",
+ FT_BOOLEAN, 8, TFS(&protected_flags), FLAG_PROTECTED,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_fc_order,
+ {"Order flag", "wlan.fc.order",
+ FT_BOOLEAN, 8, TFS(&order_flags), FLAG_ORDER,
+ "Strictly ordered flag", HFILL }},
+
+ {&hf_ieee80211_assoc_id,
+ {"Association ID", "wlan.aid",
+ FT_UINT16, BASE_DEC, NULL, 0x3FFF,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_did_duration,
+ {"Duration", "wlan.duration",
+ FT_UINT16, BASE_DEC, NULL, 0x7FFF,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_addr_da,
+ {"Destination address", "wlan.da",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Destination Hardware Address", HFILL }},
+
+ {&hf_ieee80211_addr_da_resolved,
+ {"Destination address (resolved)", "wlan.da_resolved", FT_STRING,
+ BASE_NONE, NULL, 0x0,
+ "Destination Hardware Address (resolved)", HFILL }},
+
+ {&hf_ieee80211_addr_sa,
+ {"Source address", "wlan.sa",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Source Hardware Address", HFILL }},
+
+ {&hf_ieee80211_addr_sa_resolved,
+ {"Source address (resolved)", "wlan.sa_resolved", FT_STRING,
+ BASE_NONE, NULL, 0x0,
+ "Source Hardware Address (resolved)", HFILL }},
+
+ {&hf_ieee80211_addr,
+ {"Hardware address", "wlan.addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "SA, DA, BSSID, RA or TA Hardware Address", HFILL }},
- proto_tree_add_item(tree, hf_ieee80211_tag_supported_ope_classes_current, tvb, offset++, 1, ENC_NA);
+ {&hf_ieee80211_addr_resolved,
+ { "Hardware address (resolved)", "wlan.addr_resolved", FT_STRING,
+ BASE_NONE, NULL, 0x0,
+ "SA, DA, BSSID, RA or TA Hardware Address (resolved)", HFILL }},
- for (i = offset; i < tag_len; i++) {
- guint8 op_class = tvb_get_guint8(tvb, i);
- /* Field terminates immediately before OneHundredAndThirty or Zero delimiter */
- if (op_class == 130 || op_class == 0) {
- break;
- }
- alt_op_class_field[field_len++] = op_class;
- }
- if (field_len) {
- item = proto_tree_add_item(tree, hf_ieee80211_tag_supported_ope_classes_alternate, tvb, offset, field_len, ENC_NA);
- }
- for (i = 0; i < field_len; i++) {
- proto_item_append_text(item, i == 0 ? ": %d":", %d", alt_op_class_field[i]);
- }
+ {&hf_ieee80211_addr_ra,
+ {"Receiver address", "wlan.ra",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Receiving Station Hardware Address", HFILL }},
- /* TODO parse optional Current Operating Class Extension Sequence field */
- /* TODO parse optional Operating Class Duple Sequence field */
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_addr_ra_resolved,
+ {"Receiver address (resolved)", "wlan.ra_resolved", FT_STRING, BASE_NONE,
+ NULL, 0x0, "Receiving Station Hardware Address (resolved)", HFILL }},
-static int
-ieee80211_tag_bss_parameter_change(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;
- gboolean size;
- if (tag_len != 7)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 7", tag_len);
- return tvb_captured_length(tvb);
- }
- size = (tvb_get_guint8(tvb, offset) & 0x02) >> 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_move, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_size, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_tbtt_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- if(size == TRUE) { /* if size bit is 0, the field is reserved. */
- proto_tree_add_item(tree, hf_ieee80211_tag_bi_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_addr_ta,
+ {"Transmitter address", "wlan.ta",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Transmitting Station Hardware Address", HFILL }},
-static int
-ieee80211_tag_dmg_capabilities(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;
- static const int * ieee80211_tag_dmg_cap1[] = {
- &hf_ieee80211_tag_reverse_direction,
- &hf_ieee80211_tag_hlts,
- &hf_ieee80211_tag_tpc,
- &hf_ieee80211_tag_spsh,
- &hf_ieee80211_tag_rx_antenna,
- &hf_ieee80211_tag_fast_link,
- &hf_ieee80211_tag_num_sectors,
- &hf_ieee80211_tag_rxss_length,
- &hf_ieee80211_tag_reciprocity,
- &hf_ieee80211_tag_max_ampdu_exp,
- NULL
- };
+ {&hf_ieee80211_addr_ta_resolved,
+ {"Transmitter address (resolved)", "wlan.ta_resolved", FT_STRING,
+ BASE_NONE, NULL, 0x0,
+ "Transmitting Station Hardware Address (resolved)", HFILL }},
- static const int * ieee80211_tag_dmg_cap2[] = {
- &hf_ieee80211_tag_min_mpdu_spacing,
- &hf_ieee80211_tag_ba_flow_control,
- &hf_ieee80211_tag_max_sc_rx_mcs,
- &hf_ieee80211_tag_max_ofdm_rx_mcs,
- &hf_ieee80211_tag_max_sc_tx_mcs,
- &hf_ieee80211_tag_max_ofdm_tx_mcs,
- NULL
- };
+ {&hf_ieee80211_addr_bssid,
+ {"BSS Id", "wlan.bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Basic Service Set ID", HFILL }},
- static const int * ieee80211_tag_dmg_cap3[] = {
- &hf_ieee80211_tag_low_power_supported,
- &hf_ieee80211_tag_code_rate,
- &hf_ieee80211_tag_dtp,
- &hf_ieee80211_tag_appdu_supp,
- &hf_ieee80211_tag_heartbeat,
- &hf_ieee80211_tag_other_aid,
- &hf_ieee80211_tag_pattern_recip,
- &hf_ieee80211_tag_heartbeat_elapsed,
- &hf_ieee80211_tag_grant_ack_supp,
- &hf_ieee80211_tag_RXSSTxRate_supp,
- NULL
- };
+ {&hf_ieee80211_addr_bssid_resolved,
+ {"BSS Id (resolved)", "wlan.bssid_resolved", FT_STRING, BASE_NONE, NULL,
+ 0x0, "Basic Service Set ID (resolved)", HFILL }},
- static const int * ieee80211_tag_dmg_cap4[] = {
- &hf_ieee80211_tag_pcp_tddti,
- &hf_ieee80211_tag_pcp_PSA,
- &hf_ieee80211_tag_pcp_handover,
- &hf_ieee80211_tag_pcp_max_assoc,
- &hf_ieee80211_tag_pcp_power_src,
- &hf_ieee80211_tag_pcp_decenter,
- &hf_ieee80211_tag_pcp_forwarding,
- &hf_ieee80211_tag_pcp_center,
- NULL
- };
+ {&hf_ieee80211_addr_staa,
+ {"STA address", "wlan.staa",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Station Hardware Address", HFILL }},
- if (tag_len != 17)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 17", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_dmg_capa_sta_addr, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tag_dmg_capa_aid, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_dmg_cap1, ENC_LITTLE_ENDIAN);
- offset += 3;
- proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_dmg_cap2, ENC_LITTLE_ENDIAN);
- offset += 3;
- proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_dmg_cap3, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_bitmask_list(tree, tvb, offset, 2, ieee80211_tag_dmg_cap4, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_addr_staa_resolved,
+ {"STA address (resolved)", "wlan.staa_resolved", FT_STRING, BASE_NONE, NULL,
+ 0x0, "Station Hardware Address (resolved)", HFILL }},
-static int
-ieee80211_tag_dmg_operation(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;
- static const int * ieee80211_tag_dmg_operation_flags[] = {
- &hf_ieee80211_tag_pcp_tddti,
- &hf_ieee80211_tag_pcp_PSA,
- &hf_ieee80211_tag_pcp_handover,
- NULL
- };
+ {&hf_ieee80211_frag_number,
+ {"Fragment number", "wlan.frag",
+ FT_UINT16, BASE_DEC, NULL, 0x000F,
+ NULL, HFILL }},
- if (tag_len != 10)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 10", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_dmg_operation_flags, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_PSRSI, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_min_BHI_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_brdct_sta_info_dur, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_assoc_resp_confirm_time, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_min_pp_duration, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_SP_idle_timeout, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_max_lost_beacons, tvb, offset, 1, ENC_NA);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_seq_number,
+ {"Sequence number", "wlan.seq",
+ FT_UINT16, BASE_DEC, NULL, 0xFFF0,
+ NULL, HFILL }},
-static int
-ieee80211_tag_antenna_section_id(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;
- static const int * ieee80211_tag_antenna[] = {
- &hf_ieee80211_tag_type,
- &hf_ieee80211_tag_tap1,
- &hf_ieee80211_tag_state1,
- &hf_ieee80211_tag_tap2,
- &hf_ieee80211_tag_state2,
- NULL
- };
+ {&hf_ieee80211_mesh_control_field,
+ {"Mesh Control Field", "wlan.mesh.control_field",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- if (tag_len != 4)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 4", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_bitmask_list(tree, tvb, offset, 4, ieee80211_tag_antenna, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos,
+ {"Qos Control", "wlan.qos",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
-static int
-ieee80211_tag_extended_schedule(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;
- int i;
- gboolean isGrant;
- proto_tree * alloc_tree;
- if ((tag_len%15) != 0)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be N*15 where 0<=N<=17", tag_len);
- return tvb_captured_length(tvb);
- }
- isGrant = ((field_data->ftype==CTRL_GRANT)||(field_data->ftype==CTRL_GRANT_ACK));
- for(i=0; i < tag_len; i+=15) {
- alloc_tree = proto_tree_add_subtree_format(tree, tvb, offset, 15, ett_allocation_tree, NULL, "Allocation %d", i/15);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_allocation_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_allocation_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_pseudo_static, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_truncatable, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_extendable, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_pcp_active, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_lp_sc_used, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- offset += add_ff_beamforming_ctrl(alloc_tree, tvb, pinfo, offset, isGrant);
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_src_aid, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_dest_aid, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_start, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_block_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_num_blocks, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(alloc_tree, hf_ieee80211_tag_alloc_block_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_tid,
+ {"TID", "wlan.qos.tid",
+ FT_UINT16, BASE_DEC, NULL, 0x000F,
+ NULL, HFILL }},
-static int
-ieee80211_tag_sta_availability(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;
- int i;
- proto_tree * sta_info_tree;
- if ((tag_len%2) != 0)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be N*2 where N>=0", tag_len);
- return tvb_captured_length(tvb);
- }
- for(i=0; i < tag_len; i+=2) {
- sta_info_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_sta_info, NULL, "STA Info %d", i/2);
- proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_aid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_cbap, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sta_info_tree, hf_ieee80211_tag_pp_avail, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_priority,
+ {"Priority", "wlan.qos.priority",
+ FT_UINT16, BASE_DEC, VALS(ieee80211_qos_tags_acs), 0x0007,
+ "802.1D Tag", HFILL }},
-static int
-ieee80211_tag_next_dmg_ati(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;
- if (tag_len != 6)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be = 6", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_next_ati_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tag_next_ati_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_eosp,
+ {"EOSP", "wlan.qos.eosp",
+ FT_BOOLEAN, 16, TFS(&eosp_flag), QOS_FLAG_EOSP,
+ "EOSP Field", HFILL }},
-static int
-ieee80211_tag_nextpcp_list(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;
- int i;
- if (tag_len < 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 1", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_nextpcp_token, tvb, offset, 1, ENC_NA);
- offset += 1;
- for(i=0; i < tag_len-1; i+=1) {
- proto_tree_add_item(tree, hf_ieee80211_tag_nextpcp_list, tvb, offset, 1, ENC_NA);
- offset += 1;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_bit4,
+ {"QoS bit 4", "wlan.qos.bit4",
+ FT_BOOLEAN, 16, TFS(&bit4_flag), QOS_FLAG_EOSP,
+ NULL, HFILL }},
-static int
-ieee80211_tag_pcp_handover(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;
- if (tag_len != 13)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 13", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_old_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tag_new_pcp_addr, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(tree, hf_ieee80211_tag_reamaining_BI, tvb, offset, 1, ENC_NA);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_ack_policy,
+ {"Ack Policy", "wlan.qos.ack",
+ FT_UINT16, BASE_HEX, VALS(ack_policy), 0x0060,
+ NULL, HFILL }},
-static int
-ieee80211_tag_beamlink_maintenance(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;
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
- return tvb_captured_length(tvb);
- }
- add_ff_beamformed_link(tree, tvb, pinfo, offset);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_amsdu_present,
+ {"Payload Type", "wlan.qos.amsdupresent",
+ FT_BOOLEAN, 16, TFS(&ieee80211_qos_amsdu_present_flag), 0x0080,
+ NULL, HFILL }},
-static int
-ieee80211_tag_quiet_period_res(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;
- if (tag_len != 10)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 10", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_request_token, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
- add_ff_sta_address(tree, tvb, pinfo, offset);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_txop_limit,
+ {"TXOP Limit", "wlan.qos.txop_limit",
+ FT_UINT16, BASE_DEC, NULL, 0xFF00,
+ NULL, HFILL }},
-static int
-ieee80211_tag_relay_transfer_param(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;
+ {&hf_ieee80211_qos_ps_buf_state,
+ {"QAP PS Buffer State", "wlan.qos.ps_buf_state",
+ FT_UINT16, BASE_HEX, NULL, 0xFF00,
+ NULL, HFILL }},
- if (tag_len != 8)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_duplex_relay, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_cooperation_relay, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_tx_mode, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_link_change_interval, tvb, offset+1, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_data_sensing_time, tvb, offset+2, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_first_period, tvb, offset+3, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(tree, hf_ieee80211_tag_second_period, tvb, offset+5, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_buf_state_indicated,
+ {"Buffer State Indicated", "wlan.qos.buf_state_indicated",
+ FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0200,
+ NULL, HFILL }},
-static int
-ieee80211_tag_dmg_beam_refinement(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;
- static const int * ieee80211_dmg_beam_refinement_fields[] = {
- &hf_ieee80211_tag_initiator,
- &hf_ieee80211_tag_tx_train_res,
- &hf_ieee80211_tag_rx_train_res,
- &hf_ieee80211_tag_tx_trn_ok,
- &hf_ieee80211_tag_txss_fbck_req,
- &hf_ieee80211_tag_bs_fbck,
- &hf_ieee80211_tag_bs_fbck_antenna_id,
- &hf_ieee80211_tag_snr_requested,
- &hf_ieee80211_tag_channel_measurement_requested,
- &hf_ieee80211_tag_number_of_taps_requested,
- &hf_ieee80211_tag_sector_id_order_req,
- &hf_ieee80211_tag_snr_present,
- &hf_ieee80211_tag_channel_measurement_present,
- &hf_ieee80211_tag_tap_delay_present,
- &hf_ieee80211_tag_number_of_taps_present,
- &hf_ieee80211_tag_number_of_measurement,
- &hf_ieee80211_tag_sector_id_order_present,
- &hf_ieee80211_tag_number_of_beams,
- &hf_ieee80211_tag_mid_extension,
- &hf_ieee80211_tag_capability_request,
- &hf_ieee80211_tag_beam_refine_reserved,
- NULL
- };
+ {&hf_ieee80211_qos_highest_pri_buf_ac,
+ {"Highest-Priority Buffered AC", "wlan.qos.highest_pri_buf_ac",
+ FT_UINT16, BASE_DEC, VALS(wme_acs), 0x0C00,
+ NULL, HFILL }},
- if (tag_len != 5)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 5", tag_len);
- return tvb_captured_length(tvb);
- }
+ {&hf_ieee80211_qos_qap_buf_load,
+ {"QAP Buffered Load", "wlan.qos.qap_buf_load",
+ FT_UINT16, BASE_DEC, NULL, 0xF000,
+ NULL, HFILL }},
- proto_tree_add_bitmask_list(tree, tvb, offset, 5, ieee80211_dmg_beam_refinement_fields, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_qos_txop_dur_req,
+ {"TXOP Duration Requested", "wlan.qos.txop_dur_req",
+ FT_UINT16, BASE_DEC, NULL, 0xFF00,
+ NULL, HFILL }},
-static int
-ieee80211_tag_wakeup_schedule_ad(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;
+ {&hf_ieee80211_qos_queue_size,
+ {"Queue Size", "wlan.qos.queue_size",
+ FT_UINT16, BASE_DEC, NULL, 0xFF00,
+ NULL, HFILL }},
- if (tag_len != 8)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_bi_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tag_sleep_cycle, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_num_awake_bis, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fcs,
+ {"Frame check sequence", "wlan.fcs",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "Frame Check Sequence (FCS)", HFILL }},
+
+ {&hf_ieee80211_fcs_status,
+ {"FCS Status", "wlan.fcs.status",
+ FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_fragment_overlap,
+ {"Fragment overlap", "wlan.fragment.overlap",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Fragment overlaps with other fragments", HFILL }},
+
+ {&hf_ieee80211_fragment_overlap_conflict,
+ {"Conflicting data in fragment overlap", "wlan.fragment.overlap.conflict",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Overlapping fragments contained conflicting data", HFILL }},
+
+ {&hf_ieee80211_fragment_multiple_tails,
+ {"Multiple tail fragments found", "wlan.fragment.multipletails",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Several tails were found when defragmenting the packet", HFILL }},
-static int
-ieee80211_tag_dmg_tspec(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;
+ {&hf_ieee80211_fragment_too_long_fragment,
+ {"Fragment too long", "wlan.fragment.toolongfragment",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Fragment contained data past end of packet", HFILL }},
- gboolean isGrant;
- int num_constraints;
- if (tag_len < 14)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 14", tag_len);
- return tvb_captured_length(tvb);
- }
- static const int * ieee80211_tag_tspec_flags[] = {
- &hf_ieee80211_tag_tspec_allocation_id,
- &hf_ieee80211_tag_tspec_allocation_type,
- &hf_ieee80211_tag_tspec_allocation_format,
- &hf_ieee80211_tag_tspec_pseudo_static,
- &hf_ieee80211_tag_tspec_truncatable,
- &hf_ieee80211_tag_tspec_extendable,
- &hf_ieee80211_tag_tspec_lp_sc_used,
- &hf_ieee80211_tag_tspec_up,
- &hf_ieee80211_tag_tap2,
- &hf_ieee80211_tag_tspec_dest_aid,
- NULL
- };
+ {&hf_ieee80211_fragment_error,
+ {"Defragmentation error", "wlan.fragment.error",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "Defragmentation error due to illegal fragments", HFILL }},
- proto_tree_add_bitmask_list(tree, tvb, offset, 3, ieee80211_tag_tspec_flags, ENC_LITTLE_ENDIAN);
- offset += 3;
- isGrant = ((field_data->ftype==CTRL_GRANT)||(field_data->ftype==CTRL_GRANT_ACK));
- offset += add_ff_beamforming_ctrl(tree, tvb, pinfo, 2, isGrant);
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_allocation_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_min_allocation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_max_allocation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_min_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- num_constraints = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_num_of_constraints, tvb, offset, 1, ENC_NA);
- offset += 1;
- while(num_constraints > 0) {
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_start_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- offset += 4;
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_duration, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_period, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_ieee80211_tag_tspec_tsconst_interferer_mac, tvb, offset, 2, ENC_NA);
- offset += 6;
- num_constraints--;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fragment_count,
+ {"Fragment count", "wlan.fragment.count",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
-static int
-ieee80211_tag_channel_measurement_fb(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;
+ {&hf_ieee80211_fragment,
+ {"802.11 Fragment", "wlan.fragment",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
- int num_measurement;
- if (tag_len%5 != 0)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be multiple of 5", tag_len);
- return tvb_captured_length(tvb);
- }
- num_measurement = tvb_get_guint8(tvb, offset+1);
- offset += 2;
- while(num_measurement > 0) {
- proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_realtive_I, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_realtive_Q, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_tap_delay, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_sector_id, tvb, offset, 1, ENC_NA);
- proto_tree_add_item(tree, hf_ieee80211_tag_channel_measurement_feedback_antenna_id, tvb, offset, 1, ENC_NA);
- offset += 1;
- num_measurement--;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fragments,
+ {"802.11 Fragments", "wlan.fragments",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
-static int
-ieee80211_tag_awake_window(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;
+ {&hf_ieee80211_reassembled_in,
+ {"Reassembled 802.11 in frame", "wlan.reassembled_in",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "This 802.11 packet is reassembled in this frame", HFILL }},
- if (tag_len != 2)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 2", tag_len);
- }
- else
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_awake_window, tvb, 0, 2, ENC_LITTLE_ENDIAN);
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_reassembled_length,
+ {"Reassembled 802.11 length", "wlan.reassembled.length",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "The total length of the reassembled payload", HFILL }},
-static int
-ieee80211_tag_addba_ext(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;
+ {&hf_ieee80211_wep_iv,
+ {"Initialization Vector", "wlan.wep.iv",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- if (tag_len != 1)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 1", tag_len);
- }
- else
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_addba_ext_no_frag, tvb, 0, 1, ENC_NA);
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_wep_iv_weak,
+ {"Weak IV", "wlan.wep.weakiv",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ NULL, HFILL}},
-static int
-ieee80211_tag_multi_band(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;
- gboolean chiper_present, addr_present;
- static const int * ieee80211_tag_multi_band_ctrl[] = {
- &hf_ieee80211_tag_multi_band_ctrl_sta_role,
- &hf_ieee80211_tag_multi_band_ctrl_addr_present,
- &hf_ieee80211_tag_multi_band_ctrl_cipher_present,
- NULL
- };
- static const int * ieee80211_tag_multi_band_conn[] = {
- &hf_ieee80211_tag_multi_band_conn_ap,
- &hf_ieee80211_tag_multi_band_conn_pcp,
- &hf_ieee80211_tag_multi_band_conn_dls,
- &hf_ieee80211_tag_multi_band_conn_tdls,
- &hf_ieee80211_tag_multi_band_conn_ibss,
- NULL
- };
+ {&hf_ieee80211_tkip_extiv,
+ {"TKIP Ext. Initialization Vector", "wlan.tkip.extiv",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "TKIP Extended Initialization Vector", HFILL }},
- if (tag_len < 22)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 22", tag_len);
- return tvb_captured_length(tvb);
- }
- chiper_present = (tvb_get_letohs(tvb, offset) & 0x08) >> 3;
- addr_present = (tvb_get_letohs(tvb, offset) & 0x10) >> 4;
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_multi_band_ctrl, ENC_NA);
- offset += 1;
- offset += add_ff_band_id(tree, tvb, pinfo, 1);
- proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_oper_class, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_channel_number, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_bssid, tvb, offset, 6, ENC_NA);
- offset += 6;
- offset += add_ff_beacon_interval(tree, tvb, pinfo, 2);
- proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_tsf_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN);
- offset += 8;
+ {&hf_ieee80211_ccmp_extiv,
+ {"CCMP Ext. Initialization Vector", "wlan.ccmp.extiv",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "CCMP Extended Initialization Vector", HFILL }},
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_multi_band_conn, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_fst_timeout, tvb, offset, 1, ENC_NA);
- offset += 1;
- if(addr_present)
- {
- proto_tree_add_item(tree, hf_ieee80211_tag_multi_band_sta_mac, tvb, offset, 6, ENC_NA);
- offset += 6;
- }
- if(chiper_present)
- {
- proto_item *rsn_pcs_count, *rsn_pcs_item, *rsn_sub_pcs_item;
- proto_tree *rsn_pcs_tree, *rsn_sub_pcs_tree;
- gint ii;
- guint16 pcs_count;
- int tag_end = tvb_reported_length(tvb);
- rsn_pcs_count = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- pcs_count = tvb_get_letohs(tvb, offset);
- offset += 2;
+ {&hf_ieee80211_wep_key,
+ {"Key Index", "wlan.wep.key",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- if (offset + (pcs_count * 4) > tag_end)
- {
- expert_add_info_format(pinfo, rsn_pcs_count, &ei_ieee80211_rsn_pcs_count,
- "Pairwise Cipher Suite Count too large, 4*%u > %d", pcs_count, tag_end - offset);
- pcs_count = (tag_end - offset) / 4;
- }
+ {&hf_ieee80211_wep_icv,
+ {"WEP ICV", "wlan.wep.icv",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, ENC_NA);
- rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree);
- for (ii = 0; ii < pcs_count; ii++)
- {
- rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, ENC_BIG_ENDIAN);
- rsn_sub_pcs_tree = proto_item_add_subtree(rsn_sub_pcs_item, ett_rsn_sub_pcs_tree);
- proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_oui, tvb, offset, 3, ENC_BIG_ENDIAN);
+ {&hf_ieee80211_fc_analysis_pmk,
+ {"PMK", "wlan.analysis.pmk",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
- /* Check if OUI is 00:0F:AC (ieee80211) */
- if (tvb_get_ntoh24(tvb, offset) == OUI_RSN)
- {
- proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- proto_item_append_text(rsn_pcs_item, " %s", rsn_pcs_return(tvb_get_ntohl(tvb, offset)));
- } else {
- proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_type, tvb, offset+3, 1, ENC_LITTLE_ENDIAN);
- }
- offset += 4;
- }
- }
+ {&hf_ieee80211_fc_analysis_tk,
+ {"TK", "wlan.analysis.tk",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_fc_analysis_gtk,
+ {"GTK", "wlan.analysis.gtk",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
-static int
-ieee80211_tag_dmg_link_margin(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;
+ {&hf_ieee80211_block_ack_control,
+ {"Block Ack Control", "wlan.ba.control",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- if (tag_len != 8)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 8", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_activity, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_dmg_link_adapt_mcs, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_dmg_link_adapt_link_margin, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_ff_snr, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_ref_timestamp, tvb, offset, 3, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_block_ack_control_ack_policy,
+ {"BA Ack Policy", "wlan.ba.control.ackpolicy",
+ FT_BOOLEAN, 16, TFS(&ieee80211_block_ack_control_ack_policy_flag), 0x01,
+ "Block Ack Request (BAR) Ack Policy", HFILL }},
-static int
-ieee80211_tag_dmg_link_adaption_ack(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;
+ {&hf_ieee80211_block_ack_control_type,
+ {"BA Type", "wlan.ba.control.ba_type",
+ FT_UINT16, BASE_HEX, VALS(block_ack_type_vals), 0x001e, NULL, HFILL }},
- if (tag_len != 5)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be 5", tag_len);
- return tvb_captured_length(tvb);
- }
- proto_tree_add_item(tree, hf_ieee80211_tag_activity, tvb, offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(tree, hf_ieee80211_tag_ref_timestamp, tvb, offset, 3, ENC_LITTLE_ENDIAN);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_block_ack_control_reserved,
+ {"Reserved", "wlan.ba.control.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0x0fe0,
+ NULL, HFILL }},
-static int
-ieee80211_tag_switching_stream(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;
- static const int * ieee80211_tag_switching_stream_flags[] = {
- &hf_ieee80211_tag_switching_stream_old_tid,
- &hf_ieee80211_tag_switching_stream_old_direction,
- &hf_ieee80211_tag_switching_stream_new_tid,
- &hf_ieee80211_tag_switching_stream_new_direction,
- &hf_ieee80211_tag_switching_stream_new_valid_id,
- &hf_ieee80211_tag_switching_stream_llt_type,
- NULL
- };
+ {&hf_ieee80211_block_ack_control_tid_info,
+ {"TID for which a Basic BlockAck frame is requested", "wlan.ba.basic.tidinfo",
+ FT_UINT16, BASE_HEX, NULL, 0xf000,
+ "Traffic Identifier (TID) for which a Basic BlockAck frame is requested", HFILL }},
- int param_num;
- if (tag_len < 4)
- {
- expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Tag Length %u wrong, must be at least 4", tag_len);
- return tvb_captured_length(tvb);
- }
- offset += add_ff_band_id(tree, tvb, pinfo, 1);
- offset += add_ff_band_id(tree, tvb, pinfo, 1);
- proto_tree_add_item(tree, hf_ieee80211_tag_switching_stream_non_qos, tvb, offset, 1, ENC_NA);
- offset += 1;
- param_num = tvb_get_letohs(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_tag_switching_stream_param_num, tvb, offset, 1, ENC_NA);
- offset += 1;
- while(param_num > 0)
- {
- proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_tag_switching_stream_flags, ENC_NA);
- param_num--;
- offset += 2;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_block_ack_multi_sta_aid11,
+ {"AID11", "wlan.ba.multi_sta.aid11",
+ FT_UINT16, BASE_HEX, NULL, 0x07ff, NULL, HFILL }},
-static void
-ieee_80211_add_tagged_parameters(tvbuff_t *tvb, int offset, packet_info *pinfo,
- proto_tree *tree, int tagged_parameters_len, int ftype,
- association_sanity_check_t *association_sanity_check)
-{
- int next_len;
- beacon_padding = 0; /* this is for the beacon padding confused with ssid fix */
- while (tagged_parameters_len > 0) {
- /* TODO make callers optionally specify the list of valid IE IDs? */
- if ((next_len=add_tagged_field (pinfo, tree, tvb, offset, ftype, NULL, 0, association_sanity_check)) == 0)
- break;
- if (next_len > tagged_parameters_len) {
- /* XXX - flag this as an error? */
- next_len = tagged_parameters_len;
- }
- offset += next_len;
- tagged_parameters_len -= next_len;
- }
-}
+ {&hf_ieee80211_block_ack_multi_sta_ack_type,
+ {"Ack Type", "wlan.ba.multi_sta.ack_type",
+ FT_UINT16, BASE_HEX, NULL, 0x0800, NULL, HFILL }},
-static void
-ieee_80211_do_association_sanity_check(packet_info *pinfo, association_sanity_check_t *sanity_check)
-{
- /* Given a [re-]association request frame, consider it in its totality and
- add expert information as appropriate */
+ {&hf_ieee80211_block_ack_multi_sta_tid,
+ {"TID", "wlan.ba.multi_sta.tid",
+ FT_UINT16, BASE_HEX, NULL, 0xf000, NULL, HFILL }},
- if (sanity_check->association_has_mobility_domain_element) {
- /* This is an FT association, warn about any non-FT AKM suites */
- if (sanity_check->has_non_ft_akm_suite) {
- expert_add_info_format(pinfo, sanity_check->rsn_first_non_ft_akm_suite, &ei_ieee80211_mismatched_akm_suite,
- "Non-FT AKM suite is prohibited for FT association request");
- }
- } else {
- /* This is a non-FT association, warn about any FT AKM suites */
- if (sanity_check->has_ft_akm_suite) {
- expert_add_info_format(pinfo, sanity_check->rsn_first_ft_akm_suite, &ei_ieee80211_mismatched_akm_suite,
- "FT AKM suite is prohibited for non-FT association request");
- }
- }
-}
+ {&hf_ieee80211_block_ack_multi_sta_aid_tid,
+ {"AID TID Info", "wlan.ba.multi_sta.aid_tid_info",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-/* ************************************************************************* */
-/* Dissect 802.11 management frame */
-/* ************************************************************************* */
-static void
-dissect_ieee80211_mgt(guint16 fcf, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
-{
- proto_item *ti;
- proto_tree *mgt_tree;
- proto_tree *fixed_tree;
- proto_tree *tagged_tree;
- int offset = 0;
- int tagged_parameter_tree_len;
+ {&hf_ieee80211_block_ack_multi_sta_reserved,
+ {"Reserved", "wlan.ba.multi_sta.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
- association_sanity_check_t association_sanity_check;
- memset(&association_sanity_check, 0, sizeof(association_sanity_check));
+ {&hf_ieee80211_block_ack_multi_sta_ra,
+ {"RA", "wlan.ba.multi_sta.ra",
+ FT_ETHER, BASE_NONE, NULL, 0x0, NULL, HFILL }},
- ieee80211_tvb_invalid = FALSE;
+ {&hf_ieee80211_block_ack_multi_tid_reserved,
+ {"Reserved", "wlan.bar.mtid.tidinfo.reserved",
+ FT_UINT16, BASE_HEX, 0, 0x0fff,
+ NULL, HFILL }},
- ti = proto_tree_add_item(tree, proto_wlan, tvb, 0, -1, ENC_NA);
- mgt_tree = proto_item_add_subtree(ti, ett_80211_mgt);
+ {&hf_ieee80211_block_ack_multi_tid_value,
+ {"Multi-TID Value", "wlan.bar.mtid.tidinfo.value",
+ FT_UINT16, BASE_HEX, 0, 0xf000,
+ NULL, HFILL }},
- switch (COMPOSE_FRAME_TYPE(fcf))
- {
+ {&hf_ieee80211_block_ack_bitmap,
+ {"Block Ack Bitmap", "wlan.ba.bm",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- case MGT_ASSOC_REQ:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 4);
- add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
- add_ff_listen_ival(fixed_tree, tvb, pinfo, 2);
- offset = 4; /* Size of fixed fields */
+ /* Used for Extended compressed BlockAck */
+ {&hf_ieee80211_block_ack_RBUFCAP,
+ {"Block Ack RBUFCAP", "wlan.ba.RBUFCAP",
+ FT_BOOLEAN, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_ASSOC_REQ, &association_sanity_check);
- ieee_80211_do_association_sanity_check(pinfo, &association_sanity_check);
- break;
+ {&hf_ieee80211_block_ack_bitmap_missing_frame,
+ {"Missing frame", "wlan.ba.bm.missing_frame",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+ {&hf_ieee80211_block_ack_gcr_addr,
+ {"GCR Group Address", "wlan.ba.gcr_group_addr",
+ FT_ETHER, BASE_NONE, NULL, 0, NULL, HFILL }},
- case MGT_ASSOC_RESP:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 6);
- add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
- add_ff_status_code(fixed_tree, tvb, pinfo, 2);
- add_ff_assoc_id(fixed_tree, tvb, pinfo, 4);
- offset = 6; /* Size of fixed fields */
+ {&hf_ieee80211_beamform_feedback_seg_retrans_bitmap,
+ {"Feedback segment Retansmission Bitmap", "wlan.beamform.feedback_seg_retrans_bitmap",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_ASSOC_RESP, NULL);
- break;
+ {&hf_ieee80211_vht_ndp_annc_token,
+ {"Sounding Dialog Token", "wlan.vht_ndp.token",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
+ {&hf_ieee80211_vht_ndp_annc_token_number,
+ {"Sounding Dialog Token Number", "wlan.vht_ndp.token.number",
+ FT_UINT8, BASE_DEC, NULL, 0xFC,
+ NULL, HFILL }},
- case MGT_REASSOC_REQ:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 10);
- add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
- add_ff_listen_ival(fixed_tree, tvb, pinfo, 2);
- add_ff_current_ap_addr(fixed_tree, tvb, pinfo, 4);
- offset = 10; /* Size of fixed fields */
+ {&hf_ieee80211_vht_ndp_annc_he_subfield,
+ {"HE", "wlan.vht_ndp.token.he",
+ FT_BOOLEAN, 8, TFS(&he_ndp_annc_he_subfield_vals), 0x02, NULL, HFILL }},
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_REASSOC_REQ, &association_sanity_check);
- ieee_80211_do_association_sanity_check(pinfo, &association_sanity_check);
- break;
+ {&hf_ieee80211_vht_ndp_annc_token_reserved,
+ {"Reserved", "wlan.vht_ndp.token.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x01,
+ NULL, HFILL }},
- case MGT_REASSOC_RESP:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 6);
- add_ff_cap_info(fixed_tree, tvb, pinfo, 0);
- add_ff_status_code(fixed_tree, tvb, pinfo, 2);
- add_ff_assoc_id(fixed_tree, tvb, pinfo, 4);
- offset = 6; /* Size of fixed fields */
+ {&hf_ieee80211_vht_ndp_annc_sta_info_aid12,
+ {"AID12", "wlan.vht_ndp.sta_info.aid12",
+ FT_UINT16, BASE_HEX, NULL, 0x0FFF,
+ "12 least significant bits of the AID of the target STA", HFILL }},
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_REASSOC_RESP, NULL);
- break;
+ {&hf_ieee80211_vht_ndp_annc_sta_info_feedback_type,
+ {"Feedback Type", "wlan.vht_ndp.sta_info.feedback_type",
+ FT_BOOLEAN, 16, TFS(&vht_ndp_annc_sta_info_feedback_type), 0x1000,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vht_ndp_annc_sta_info_nc_index,
+ {"Nc Index", "wlan.vht_ndp.sta_info.nc_index",
+ FT_UINT16, BASE_DEC, VALS(num_plus_one_3bit_flag), 0xE000,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vht_ndp_annc_sta_info_reserved,
+ {"Reserved", "wlan.vht_ndp.sta_info.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xE000,
+ NULL, HFILL }},
+ {&hf_ieee80211_data_encap_payload_type,
+ {"Payload Type", "wlan.data_encap.payload_type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_data_encap_payload_types), 0,
+ NULL, HFILL }},
- case MGT_PROBE_REQ:
- offset = 0;
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_PROBE_REQ, NULL);
- break;
+ {&hf_ieee80211_ff_tdls_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tdls_action_codes_ext, 0,
+ "Management action code", HFILL }},
- case MGT_PROBE_RESP:
- {
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12);
- add_ff_timestamp(fixed_tree, tvb, pinfo, 0);
- add_ff_beacon_interval(fixed_tree, tvb, pinfo, 8);
- add_ff_cap_info(fixed_tree, tvb, pinfo, 10);
- offset = 12; /* Size of fixed fields */
+ {&hf_ieee80211_ff_target_channel,
+ {"Target Channel", "wlan.fixed.target_channel",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset, tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, MGT_PROBE_RESP, NULL);
- break;
- }
- case MGT_MEASUREMENT_PILOT:
- {
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12);
- offset += add_ff_timestamp(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_measurement_pilot_int(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_beacon_interval(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_cap_info(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_country_str(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_max_reg_pwr(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_max_tx_pwr(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_tx_pwr_used(fixed_tree, tvb, pinfo, offset);
- offset += add_ff_transceiver_noise_floor(fixed_tree, tvb, pinfo, offset);
- /* TODO DS Parameter Set ??? */
+ {&hf_ieee80211_ff_operating_class,
+ {"Operating Class", "wlan.fixed.operating_class",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset, tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree, tagged_parameter_tree_len, MGT_MEASUREMENT_PILOT, NULL);
- break;
- }
- case MGT_BEACON: /* Dissect protocol payload fields */
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 12);
- add_ff_timestamp(fixed_tree, tvb, pinfo, 0);
- add_ff_beacon_interval(fixed_tree, tvb, pinfo, 8);
- add_ff_cap_info(fixed_tree, tvb, pinfo, 10);
- offset = 12; /* Size of fixed fields */
+ {&hf_ieee80211_ff_wnm_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &wnm_action_codes_ext, 0,
+ "Management action code", HFILL }},
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_BEACON, NULL);
- break;
+ {&hf_ieee80211_ff_unprotected_wnm_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &unprotected_wnm_action_codes_ext, 0,
+ "Management action code", HFILL }},
- case MGT_ATIM:
- break;
+ {&hf_ieee80211_ff_key_data,
+ {"Key Data", "wlan.fixed.key_data",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- case MGT_DISASS:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 2);
- add_ff_reason_code(fixed_tree, tvb, pinfo, 0);
- offset = 2; /* Size of fixed fields */
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len > 0) {
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_DISASS, NULL);
- }
- break;
+ {&hf_ieee80211_ff_key_data_length,
+ {"Key Data Length", "wlan.fixed.key_data_length",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- case MGT_AUTHENTICATION:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 6);
- add_ff_auth_alg(fixed_tree, tvb, pinfo, 0);
- add_ff_auth_trans_seq(fixed_tree, tvb, pinfo, 2);
- add_ff_status_code(fixed_tree, tvb, pinfo, 4);
- offset = 6; /* Size of fixed fields */
+ {&hf_ieee80211_ff_wnm_notification_type,
+ {"WNM-Notification type", "wlan.fixed.wnm_notification_type",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &wnm_notification_types_ext, 0,
+ NULL, HFILL }},
- tagged_parameter_tree_len =
- tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len > 0)
- {
- tagged_tree = get_tagged_parameter_tree(mgt_tree,
- tvb,
- offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_AUTHENTICATION, NULL);
- }
- break;
+ {&hf_ieee80211_ff_rm_action_code,
+ {"Action code", "wlan.rm.action_code",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rm_action_codes_ext, 0,
+ "Radio Measurement Action", HFILL }},
- case MGT_DEAUTHENTICATION:
- fixed_tree = get_fixed_parameter_tree(mgt_tree, tvb, 0, 2);
- add_ff_reason_code(fixed_tree, tvb, pinfo, 0);
- offset = 2; /* Size of fixed fields */
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len > 0) {
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_DEAUTHENTICATION, NULL);
- }
- break;
+ {&hf_ieee80211_ff_rm_dialog_token,
+ {"Dialog token", "wlan.rm.dialog_token",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Non-zero Dialog Token identifies request/report transaction", HFILL }},
- case MGT_ACTION:
- {
- proto_item *lcl_fixed_hdr;
- proto_tree *lcl_fixed_tree;
- lcl_fixed_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, &lcl_fixed_hdr, "Fixed parameters");
- offset += add_ff_action(lcl_fixed_tree, tvb, pinfo, 0);
+ {&hf_ieee80211_ff_rm_repetitions,
+ {"Repetitions", "wlan.rm.repetitions",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Numer of Repetitions, 65535 indicates repeat until cancellation", HFILL }},
- proto_item_set_len(lcl_fixed_hdr, offset);
- if (ieee80211_tvb_invalid)
- break; /* Buffer not available for further processing */
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len > 0)
- {
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_ACTION, NULL);
- }
- break;
- }
- case MGT_ACTION_NO_ACK:
- {
- proto_item *lcl_fixed_hdr;
- proto_tree *lcl_fixed_tree;
- lcl_fixed_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, &lcl_fixed_hdr, "Fixed parameters");
+ {&hf_ieee80211_ff_rm_tx_power,
+ {"Transmit Power Used", "wlan.rm.tx_power",
+ FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0,
+ NULL, HFILL }},
- offset += add_ff_action(lcl_fixed_tree, tvb, pinfo, 0);
+ {&hf_ieee80211_ff_rm_max_tx_power,
+ {"Max Transmit Power", "wlan.rm.max_tx_power",
+ FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0,
+ NULL, HFILL }},
- proto_item_set_len(lcl_fixed_hdr, offset);
- if (ieee80211_tvb_invalid)
- break; /* Buffer not available for further processing */
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len > 0)
- {
- tagged_tree = get_tagged_parameter_tree(mgt_tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, MGT_ACTION_NO_ACK, NULL);
- }
- break;
- }
- case MGT_ARUBA_WLAN:
- {
- proto_tree *aruba_tree;
- guint16 type;
- type = tvb_get_ntohs(tvb, offset);
+ {&hf_ieee80211_ff_tpc,
+ {"TPC Report", "wlan.rm.tpc",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- aruba_tree = proto_tree_add_subtree(mgt_tree, tvb, 0, 0, ett_fixed_parameters, NULL, "Aruba Management");
+ {&hf_ieee80211_ff_tpc_element_id,
+ {"TPC Element ID", "wlan.rm.tpc.element_id",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_item(aruba_tree, hf_ieee80211_aruba, tvb, offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- switch(type){
- case 0x0003: /* MTU Size */
- proto_tree_add_item(aruba_tree, hf_ieee80211_aruba_mtu, tvb, offset, 2, ENC_BIG_ENDIAN);
- break;
- case 0x0005: /* HeartBeat Sequence */
- proto_tree_add_item(aruba_tree, hf_ieee80211_aruba_hb_seq, tvb, offset, 8, ENC_BIG_ENDIAN);
- break;
- }
- break;
- }
- }
-}
+ {&hf_ieee80211_ff_tpc_length,
+ {"TPC Length", "wlan.rm.tpc.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Length of TPC Report element (always 2)", HFILL }},
-static void
-set_src_addr_cols(packet_info *pinfo, tvbuff_t *tvb, int offset, const char *type)
-{
- address ether_addr;
+ {&hf_ieee80211_ff_tpc_tx_power,
+ {"TPC Transmit Power", "wlan.rm.tpc.tx_power",
+ FT_INT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- set_address_tvb(ðer_addr, AT_ETHER, 6, tvb, offset);
+ {&hf_ieee80211_ff_tpc_link_margin,
+ {"TPC Link Margin", "wlan.rm.tpc.link_margin",
+ FT_INT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- col_add_fstr(pinfo->cinfo, COL_RES_DL_SRC, "%s (%s)",
- address_with_resolution_to_str(wmem_packet_scope(), ðer_addr), type);
-}
+ {&hf_ieee80211_ff_rm_rx_antenna_id,
+ {"Receive Antenna ID", "wlan.rm.rx_antenna_id",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-static void
-set_dst_addr_cols(packet_info *pinfo, tvbuff_t *tvb, int offset, const char *type)
-{
- address ether_addr;
+ {&hf_ieee80211_ff_rm_tx_antenna_id,
+ {"Transmit Antenna ID", "wlan.rm.tx_antenna_id",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_ff_rm_rcpi,
+ {"Received Channel Power", "wlan.rm.rcpi",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- set_address_tvb(ðer_addr, AT_ETHER, 6, tvb, offset);
+ {&hf_ieee80211_ff_rm_rsni,
+ {"Received Signal to noise indication", "wlan.rm.rsni",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- col_add_fstr(pinfo->cinfo, COL_RES_DL_DST, "%s (%s)",
- address_with_resolution_to_str(wmem_packet_scope(), ðer_addr), type);
-}
+ {&hf_ieee80211_ff_request_mode_pref_cand,
+ {"Preferred Candidate List Included", "wlan.fixed.request_mode.pref_cand",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }},
-static guint32
-crc32_802_tvb_padded(tvbuff_t *tvb, guint hdr_len, guint hdr_size, guint len)
-{
- guint32 c_crc;
+ {&hf_ieee80211_ff_request_mode_abridged,
+ {"Abridged", "wlan.fixed.request_mode.abridged",
+ FT_UINT8, BASE_DEC, NULL, 0x02,
+ NULL, HFILL }},
- c_crc = crc32_ccitt_tvb(tvb, hdr_len);
- c_crc = crc32_ccitt_tvb_offset_seed(tvb, hdr_size, len, ~c_crc);
+ {&hf_ieee80211_ff_request_mode_disassoc_imminent,
+ {"Disassociation Imminent", "wlan.fixed.request_mode.disassoc_imminent",
+ FT_UINT8, BASE_DEC, NULL, 0x04,
+ NULL, HFILL }},
- return (c_crc);
-}
+ {&hf_ieee80211_ff_request_mode_bss_term_included,
+ {"BSS Termination Included", "wlan.fixed.request_mode.bss_term_included",
+ FT_UINT8, BASE_DEC, NULL, 0x08,
+ NULL, HFILL }},
-typedef enum {
- ENCAP_802_2,
- ENCAP_IPX,
- ENCAP_ETHERNET
-} encap_t;
+ {&hf_ieee80211_ff_request_mode_ess_disassoc_imminent,
+ {"ESS Disassociation Imminent", "wlan.fixed.request_mode.ess_disassoc_imminent",
+ FT_UINT8, BASE_DEC, NULL, 0x10,
+ NULL, HFILL }},
-/* ************************************************************************* */
-/* Dissect 802.11 frame */
-/* ************************************************************************* */
-/*
- * The 802.11n specification makes some fairly significant changes to the
- * layout of the MAC header. The first two bits of the MAC header are the
- * protocol version. You'd think that the 802.11 committee would have
- * bumped the version to indicate a different MAC layout, but NOOOO -- we
- * have to go digging for bits in various locations instead.
- */
-static int
-dissect_ieee80211_common(tvbuff_t *tvb, packet_info *pinfo,
- proto_tree *tree, guint32 option_flags,
- struct ieee_802_11_phdr *phdr)
-{
- guint16 fcf, flags, frame_type_subtype, ctrl_fcf, ctrl_type_subtype;
- guint16 cw_fcf;
- guint16 seq_control;
- guint32 seq_number, frag_number;
- gboolean more_frags;
- proto_item *ti = NULL;
- proto_item *cw_item = NULL;
- proto_item *hidden_item;
- proto_tree *cw_tree = NULL;
- guint16 hdr_len, ohdr_len;
- guint16 htc_len = 0;
- gboolean has_fcs;
- gint len, reported_len, ivlen;
- gint sta_addr_offset = 0;
- const gchar *station_name;
- gboolean is_amsdu = 0;
- gboolean save_fragmented;
- guint32 addr_type;
- guint8 octet1, octet2;
- char out_buff[SHORT_STR];
- gint is_iv_bad;
- guchar iv_buff[4];
- const char *addr1_str = "RA";
- guint offset;
- const gchar *fts_str;
- gchar flag_str[] = "opmPRMFTC";
- gint ii;
- guint16 qosoff = 0;
- guint16 qos_control = 0;
- gint meshctl_len = 0;
- guint8 mesh_flags;
- guint16 meshoff = 0;
- static wlan_hdr_t whdrs[4];
- gboolean retransmitted;
- gboolean isDMG = (phdr->has_frequency ?
- IS_80211AD(phdr->frequency) :
- FALSE);
+ {&hf_ieee80211_ff_disassoc_timer,
+ {"Disassociation Timer", "wlan.fixed.disassoc_timer",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- encap_t encap_type;
- proto_tree *hdr_tree = NULL;
- tvbuff_t *next_tvb = NULL;
- wlan_hdr_t *whdr;
+ {&hf_ieee80211_ff_bss_termination_delay,
+ {"BSS Termination Delay", "wlan.fixed.bss_termination_delay",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- AIRPDCAP_KEY_ITEM used_key;
+ {&hf_ieee80211_ff_bss_transition_status_code,
+ {"BSS Transition Status Code", "wlan.fixed.bss_transition_status_code",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- p_add_proto_data(wmem_file_scope(), pinfo, proto_wlan, IS_DMG_KEY, GINT_TO_POINTER(isDMG));
+ {&hf_ieee80211_ff_validity_interval,
+ {"Validity Interval", "wlan.fixed.validity_interval",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- whdr= &whdrs[0];
+ {&hf_ieee80211_ff_bss_termination_duration,
+ {"BSS Termination Duration", "wlan.fixed.bss_termination_duration",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "802.11");
- col_clear(pinfo->cinfo, COL_INFO);
+ {&hf_ieee80211_ff_url_len,
+ {"Session Information URL Length",
+ "wlan.fixed.session_information.url_length",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- fcf = FETCH_FCF(0);
- frame_type_subtype = COMPOSE_FRAME_TYPE(fcf);
- whdr->type = frame_type_subtype;
- if (frame_type_subtype == CTRL_CONTROL_WRAPPER)
- ctrl_fcf = FETCH_FCF(10);
- else
- ctrl_fcf = 0;
+ {&hf_ieee80211_ff_url,
+ {"Session Information URL", "wlan.fixed.session_information.url",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- fts_str = val_to_str_ext_const(frame_type_subtype, &frame_type_subtype_vals_ext,
- "Unrecognized (Reserved frame)");
- col_set_str(pinfo->cinfo, COL_INFO, fts_str);
+ {&hf_ieee80211_ff_target_bss,
+ {"BSS Transition Target BSS", "wlan.fixed.bss_transition_target_bss",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+ {&hf_ieee80211_ff_bss_transition_query_reason,
+ {"BSS Transition Query Reason", "wlan.fixed.bss_transition_query_reason",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_transition_reasons), 0,
+ NULL, HFILL }},
-# define FROM_TO_DS 3
- flags = FCF_FLAGS(fcf);
- more_frags = HAVE_FRAGMENTS(flags);
+ {&hf_ieee80211_ff_bss_transition_candidate_list_entries,
+ {"BSS Transition Candidate List Entries", "wlan.fixed.bss_transition_candidate_list_entries",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- for (ii = 0; ii < 8; ii++) {
- if (! (flags & 0x80 >> ii)) {
- flag_str[ii] = '.';
- }
- }
+/* 802.11ad */
+ {&hf_ieee80211_cf_response_offset,
+ {"Response Offset", "wlan.res_offset",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- switch (FCF_FRAME_TYPE (fcf)) {
+ {&hf_ieee80211_grant_ack_reserved,
+ {"Reserved", "wlan.grant_ack.reserved",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- case MGT_FRAME:
- hdr_len = MGT_FRAME_HDR_LEN;
- if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
- /*
- * Management frames with the Order bit set have an HT Control field;
- * see 8.2.4.1.10 "Order field". If they're not HT frames, they should
- * never have the Order bit set.
- */
- hdr_len += 4;
- htc_len = 4;
- }
- break;
+ {&hf_ieee80211_ff_dynamic_allocation,
+ {"Dynamic Allocation", "wlan.dynamic_allocation",
+ FT_UINT40, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- case CONTROL_FRAME:
- if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
- hdr_len = 6;
- cw_fcf = ctrl_fcf;
- } else {
- hdr_len = 0;
- cw_fcf = fcf;
- }
- switch (COMPOSE_FRAME_TYPE (cw_fcf)) {
+ {&hf_ieee80211_ff_TID,
+ {"TID", "wlan.dynamic_allocation.tid",
+ FT_UINT40, BASE_DEC, NULL, 0x000000000F,
+ NULL, HFILL }},
- case CTRL_BEAMFORM_RPT_POLL:
- hdr_len += 17;
- break;
+ {&hf_ieee80211_ff_alloc_type,
+ {"Allocation Type", "wlan.dynamic_allocation.alloc_type",
+ FT_UINT40, BASE_DEC, NULL, 0x000000070,
+ NULL, HFILL }},
- case CTRL_VHT_NDP_ANNC:
- hdr_len += 17;
- /* TODO: for now we only consider a single STA, add support for more */
- hdr_len += 2;
- break;
+ {&hf_ieee80211_ff_src_aid,
+ {"Source AID", "wlan.dynamic_allocation.src_aid",
+ FT_UINT40, BASE_DEC, NULL, 0x0000007F80,
+ NULL, HFILL }},
- case CTRL_CTS:
- case CTRL_ACKNOWLEDGEMENT:
- hdr_len += 10;
- break;
+ {&hf_ieee80211_ff_dest_aid,
+ {"Destination AID", "wlan.dynamic_allocation.dest_aid",
+ FT_UINT40, BASE_DEC, NULL, 0x00007f8000,
+ NULL, HFILL }},
- case CTRL_POLL:
- hdr_len += 18;
- break;
+ {&hf_ieee80211_ff_alloc_duration,
+ {"Allocation Duration", "wlan.dynamic_allocation.alloc_duration",
+ FT_UINT40, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0x7FFF800000,
+ NULL, HFILL }},
- case CTRL_SPR:
- case CTRL_GRANT:
- case CTRL_GRANT_ACK:
- hdr_len += 23;
- break;
+ {&hf_ieee80211_ff_b39,
+ {"Reserved (b39)", "wlan.dynamic_allocation.b39",
+ FT_UINT40, BASE_HEX, NULL, 0x8000000000,
+ NULL, HFILL }},
- case CTRL_DMG_CTS:
- hdr_len += 16;
- break;
+ {&hf_ieee80211_ff_ssw,
+ {"Sector Sweep", "wlan.ssw",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- case CTRL_DMG_DTS:
- case CTRL_SSW:
- hdr_len += 22;
- break;
+ {&hf_ieee80211_ff_ssw_direction,
+ {"Sector Sweep Direction", "wlan.ssw.direction",
+ FT_BOOLEAN, 24, TFS(&ieee80211_cf_ssw_direction), 0x000001,
+ NULL, HFILL}},
+
+ {&hf_ieee80211_ff_ssw_cdown,
+ {"Sector Sweep CDOWN", "wlan.ssw.cdown",
+ FT_UINT24, BASE_DEC, NULL, 0x0003fe,
+ NULL, HFILL }},
- case CTRL_SSW_FEEDBACK:
- case CTRL_SSW_ACK:
- hdr_len += 24;
- break;
+ {&hf_ieee80211_ff_ssw_sector_id,
+ {"Sector Sweep Sector ID", "wlan.ssw.sector_id",
+ FT_UINT24, BASE_DEC, NULL, 0x00fc00,
+ NULL, HFILL }},
- case CTRL_RTS:
- case CTRL_PS_POLL:
- case CTRL_CFP_END:
- case CTRL_CFP_ENDACK:
- case CTRL_BLOCK_ACK_REQ:
- case CTRL_BLOCK_ACK:
- hdr_len += 16;
- break;
+ {&hf_ieee80211_ff_ssw_dmg_ant_id,
+ {"Sector Sweep DMG Antenna ID", "wlan.ssw.dmg_ant_id",
+ FT_UINT24, BASE_DEC, NULL, 0x030000,
+ NULL, HFILL }},
- default:
- hdr_len += 4; /* XXX */
- break;
- }
- break;
+ {&hf_ieee80211_ff_ssw_rxss_len,
+ {"Sector Sweep RXSS Length", "wlan.ssw.rxss_len",
+ FT_UINT24, BASE_DEC, NULL, 0xfc0000,
+ NULL, HFILL }},
- case DATA_FRAME:
- hdr_len = (FCF_ADDR_SELECTOR(fcf) == DATA_ADDR_T4) ? DATA_LONG_HDR_LEN : DATA_SHORT_HDR_LEN;
+ {&hf_ieee80211_ff_bf,
+ {"Beam Forming", "wlan.bf",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- if ((option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) && DATA_FRAME_IS_QOS(frame_type_subtype)) {
- /* QoS frame */
- qosoff = hdr_len;
- hdr_len += 2; /* Include the QoS field in the header length */
+ {&hf_ieee80211_ff_bf_train,
+ {"Beam Forming Training", "wlan.bf.train",
+ FT_BOOLEAN, 16, NULL, 0x0001,
+ NULL, HFILL }},
- if (HAS_HT_CONTROL(FCF_FLAGS(fcf))) {
- /*
- * QoS data frames with the Order bit set have an HT Control field;
- * see 8.2.4.1.10 "Order field". If they're not HT frames, they
- * should never have the Order bit set.
- */
- hdr_len += 4;
- htc_len = 4;
- }
+ {&hf_ieee80211_ff_bf_is_init,
+ {"Beam Forming Is InitiatorTXSS", "wlan.bf.isInit",
+ FT_BOOLEAN, 16, NULL, 0x0002,
+ NULL, HFILL }},
- /*
- * Does it look as if we have a mesh header?
- * Look at the Mesh Control subfield of the QoS field and at the
- * purported mesh flag fields.
- */
- qos_control = tvb_get_letohs(tvb, qosoff);
- if (tvb_bytes_exist(tvb, hdr_len, 1)) {
- meshoff = hdr_len;
- mesh_flags = tvb_get_guint8(tvb, meshoff);
- if (has_mesh_control(fcf, qos_control, mesh_flags)) {
- /* Yes, add the length of that in as well. */
- meshctl_len = find_mesh_control_length(mesh_flags);
- hdr_len += meshctl_len;
- }
- }
- }
- break;
+ {&hf_ieee80211_ff_bf_is_resp,
+ {"Beam Forming Is ResponderTXSS", "wlan.bf.isResp",
+ FT_BOOLEAN, 16, NULL, 0x0004,
+ NULL, HFILL }},
- case EXTENSION_FRAME:
- hdr_len = 10;
- break;
+ {&hf_ieee80211_ff_bf_rxss_len,
+ {"Beam Forming RXSS Length", "wlan.bf.rxss_len",
+ FT_UINT16, BASE_DEC, NULL, 0x01f8,
+ NULL, HFILL }},
- default:
- hdr_len = 4; /* XXX */
- break;
- }
+ {&hf_ieee80211_ff_bf_rxss_rate,
+ {"Beam Forming RXSS Rate", "wlan.bf.rxss_rate",
+ FT_BOOLEAN, 16, NULL, 0x0200,
+ NULL, HFILL }},
- /*
- * Some portions of this code calculate offsets relative to the end of the
- * header. But when the header has been padded to align the data this must
- * be done relative to true header size, not the padded/aligned value. To
- * simplify this work we stash the original header size in ohdr_len instead
- * of recalculating it every time we need it.
- */
- ohdr_len = hdr_len;
- if (phdr->datapad) {
- /*
- * Add in Atheros padding between the 802.11 header and body.
- *
- * XXX - would the mesh header be part of the header or the body
- * from the point of view of the Atheros adapters that insert
- * the padding, assuming they even recognize a mesh header?
- */
- hdr_len = roundup2(hdr_len, 4);
- }
+ {&hf_ieee80211_ff_bf_b10b15,
+ {"Reserved (B10-B15)", "wlan.bf.reserved",
+ FT_UINT16, BASE_DEC, NULL, 0xFC00,
+ NULL, HFILL }},
- /* Add the FC and duration/id to the current tree */
- ti = proto_tree_add_protocol_format (tree, proto_wlan, tvb, 0, hdr_len,
- "IEEE 802.11 %s", fts_str);
- hdr_tree = proto_item_add_subtree(ti, ett_80211);
+ {&hf_ieee80211_ff_bf_num_sectors,
+ {"Beam Forming Total Number of Sectors", "wlan.bf.num_sectors",
+ FT_UINT16, BASE_DEC, NULL, 0x03f8,
+ NULL, HFILL }},
- dissect_frame_control(hdr_tree, tvb, option_flags, 0, pinfo);
- dissect_durid(hdr_tree, tvb, frame_type_subtype, 2);
+ {&hf_ieee80211_ff_bf_num_rx_dmg_ants,
+ {"Beam Forming Number of DMG Antennas", "wlan.bf.num_dmg_ants",
+ FT_UINT16, BASE_DEC, NULL, 0x0c00,
+ NULL, HFILL }},
- switch (phdr->fcs_len)
- {
- case 0: /* Definitely has no FCS */
- has_fcs = FALSE;
- break;
+ {&hf_ieee80211_ff_bf_b12b15,
+ {"Reserved (B12-B15)", "wlan.bf.reserved",
+ FT_UINT16, BASE_DEC, NULL, 0xF000,
+ NULL, HFILL }},
- case 4: /* Definitely has an FCS */
- has_fcs = TRUE;
- break;
+ {&hf_ieee80211_addr_nav_da,
+ {"Destination address of STA that caused NAV update", "wlan.nav_da",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "DMG Destination Hardware Address", HFILL }},
- case -2: /* Data frames have no FCS, other frames may have an FCS */
- /* XXX: -2 currently used only in wiretap/netmon.c */
- if (FCF_FRAME_TYPE (fcf) == DATA_FRAME)
- has_fcs = FALSE;
- else /* Management, Control, Extension */
- has_fcs = wlan_check_fcs;
- break;
+ {&hf_ieee80211_addr_nav_sa,
+ {"Source address of STA that caused NAV update", "wlan.nav_sa",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "DMG Source Hardware Address", HFILL }},
- default: /* Don't know - use "wlan_check_fcs" */
- has_fcs = wlan_check_fcs;
- break;
- }
+ {&hf_ieee80211_ff_sswf,
+ {"Sector Sweep Feedback", "wlan.sswf",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- /*
- * Decode the part of the frame header that isn't the same for all
- * frame types.
- */
- seq_control = 0;
- frag_number = 0;
- seq_number = 0;
+ {&hf_ieee80211_ff_sswf_total_sectors,
+ {"Sector Sweep Feedback total number of sectors", "wlan.sswf.num_sectors",
+ FT_UINT24, BASE_DEC, NULL, 0x0001ff,
+ NULL, HFILL }},
- /* all frames have address 1 = RA */
- if (tree) {
- const gchar *ether_name = tvb_get_ether_name(tvb, 4);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ra, tvb, 4, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ra_resolved, tvb, 4, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 4, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, 4, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
+ {&hf_ieee80211_ff_sswf_num_rx_dmg_ants,
+ {"Sector Sweep Feedback Number of receive DMG Antennas", "wlan.sswf.num_dmg_ants",
+ FT_UINT24, BASE_DEC, NULL, 0x000600,
+ NULL, HFILL }},
- switch (FCF_FRAME_TYPE (fcf))
- {
+ {&hf_ieee80211_ff_sswf_poll_required,
+ {"Sector Sweep Feedback Poll required", "wlan.sswf.poll",
+ FT_BOOLEAN, 24, NULL, 0x010000,
+ NULL, HFILL }},
- case MGT_FRAME:
- /*
- * All management frame types have the same header.
- */
- set_address_tvb(&pinfo->dl_src, wlan_address_type, 6, tvb, 10);
- copy_address_shallow(&pinfo->src, &pinfo->dl_src);
- set_address_tvb(&pinfo->dl_dst, wlan_address_type, 6, tvb, 4);
- copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
+ {&hf_ieee80211_ff_sswf_reserved1,
+ {"Sector Sweep Feedback Reserved", "wlan.sswf.reserved",
+ FT_UINT24, BASE_HEX, NULL, 0x00F800,
+ NULL, HFILL }},
- /* for tap */
- set_address_tvb(&whdr->bssid, wlan_bssid_address_type, 6, tvb, 16);
- copy_address_shallow(&whdr->src, &pinfo->dl_src);
- copy_address_shallow(&whdr->dst, &pinfo->dl_dst);
+ {&hf_ieee80211_ff_sswf_reserved2,
+ {"Sector Sweep Feedback Reserved", "wlan.sswf.reserved",
+ FT_UINT24, BASE_HEX, NULL, 0xFE0000,
+ NULL, HFILL }},
- seq_control = tvb_get_letohs(tvb, 22);
- frag_number = SEQCTL_FRAGMENT_NUMBER(seq_control);
- seq_number = SEQCTL_SEQUENCE_NUMBER(seq_control);
+ {&hf_ieee80211_ff_sswf_sector_select,
+ {"Sector Sweep Feedback Sector Select", "wlan.sswf.sector_select",
+ FT_UINT24, BASE_DEC, NULL, 0x00003F,
+ NULL, HFILL }},
- col_append_fstr(pinfo->cinfo, COL_INFO,
- ", SN=%d", seq_number);
+ {&hf_ieee80211_ff_sswf_dmg_antenna_select,
+ {"Sector Sweep Feedback DMG Antenna Select", "wlan.sswf.dmg_antenna_select",
+ FT_UINT24, BASE_DEC, NULL, 0x0000C0,
+ NULL, HFILL }},
- col_append_fstr(pinfo->cinfo, COL_INFO,
- ", FN=%d", frag_number);
+ {&hf_ieee80211_ff_sswf_snr_report,
+ {"Sector Sweep Feedback SNR Report", "wlan.sswf.snr_report",
+ FT_UINT24, BASE_DEC, NULL, 0x00FF00,
+ NULL, HFILL }},
- if (tree)
- {
- const gchar *ra_da_name, *ta_sa_name, *bssid_name;
- ra_da_name = tvb_get_ether_name(tvb, 4);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_da, tvb, 4, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_da_resolved, tvb, 4, 6, ra_da_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, 10, 6, ENC_NA);
- ta_sa_name = tvb_get_ether_name(tvb, 10);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, 10, 6, ta_sa_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_sa, tvb, 10, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_sa_resolved, tvb, 10, 6, ta_sa_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, 16, 6, ENC_NA);
- bssid_name = tvb_get_ether_name(tvb, 16);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, 16, 6, bssid_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
+ {&hf_ieee80211_ff_brp,
+ {"BRP Request", "wlan.brp",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- /* FIXME: With mgmt frames FROM_TO_DS is always 0, perhaps compare address to bssid instead? */
- if ((flags & FROM_TO_DS) == FLAG_FROM_DS) { /* Receiver address */
- sta_addr_offset = 4;
- } else if ((flags & FROM_TO_DS) == FLAG_TO_DS) { /* Transmitter address */
- sta_addr_offset = 10;
- }
- if (sta_addr_offset > 0) {
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_staa, tvb, sta_addr_offset, 6, ENC_NA);
- station_name = tvb_get_ether_name(tvb, sta_addr_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_staa_resolved, tvb, sta_addr_offset, 6, station_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- /* add items for wlan.addr filter */
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 10, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, 10, 6, ta_sa_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 16, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, 16, 6, bssid_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(hdr_tree, hf_ieee80211_frag_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(hdr_tree, hf_ieee80211_seq_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
- }
- break;
+ {&hf_ieee80211_ff_brp_L_RX,
+ {"BRP Request L-RX", "wlan.brp.l_rx",
+ FT_UINT32, BASE_DEC, NULL, 0x0000001f,
+ NULL, HFILL }},
- case CONTROL_FRAME:
- {
- /*
- * Control Wrapper frames insert themselves between address 1
- * and address 2 in a normal control frame. Process address 1
- * first, then handle the rest of the frame in dissect_control.
- */
- if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
- offset = 10; /* FC + D/ID + Address 1 + CFC + HTC */
- ctrl_fcf = FETCH_FCF(10);
- ctrl_type_subtype = COMPOSE_FRAME_TYPE(ctrl_fcf);
- } else {
- offset = 10; /* FC + D/ID + Address 1 */
- ctrl_type_subtype = frame_type_subtype;
- }
- /* Added to disallow DMG STA to transfer packets of certain forbidden types. */
- switch (ctrl_type_subtype)
- {
- case CTRL_PS_POLL:
- case CTRL_CTS:
- case CTRL_CFP_ENDACK:
- if(isDMG == TRUE) {
- expert_add_info_format(pinfo, hdr_tree, &ei_ieee80211_dmg_subtype,
- "DMG STA shouldn't transmit control frame of type contention-free period end+ack");
- }
- break;
- default:
- break;
- }
+ {&hf_ieee80211_ff_brp_TX_TRN_REQ,
+ {"BRP Request TX-TRN-REQ", "wlan.brp.tx_trn_req",
+ FT_BOOLEAN, 32, NULL, 0x00000020,
+ NULL, HFILL }},
- if (ctrl_type_subtype == CTRL_PS_POLL) {
- addr1_str = "BSSID";
- if (tree) {
- const gchar *ether_name = tvb_get_ether_name(tvb, 4);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, 4, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, 4, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- }
+ {&hf_ieee80211_ff_brp_MID_REQ,
+ {"BRP Request MID-REQ", "wlan.brp.mid_req",
+ FT_BOOLEAN, 32, NULL, 0x00000040,
+ NULL, HFILL }},
- /* Add address 1 */
- set_dst_addr_cols(pinfo, tvb, 4, addr1_str);
+ {&hf_ieee80211_ff_brp_BC_REQ,
+ {"BRP Request BC-REQ", "wlan.brp.bc_req",
+ FT_BOOLEAN, 32, NULL, 0x00000080,
+ NULL, HFILL }},
- /*
- * Start shoving in other fields if needed.
- */
- if (frame_type_subtype == CTRL_CONTROL_WRAPPER) {
- /* if (tree) */
- {
- cw_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2,
- ett_cntrl_wrapper_fc, NULL, "Contained Frame Control");
- dissect_frame_control(cw_tree, tvb, 0, offset, pinfo);
- dissect_ht_control(hdr_tree, tvb, offset + 2);
- offset += 6;
- hdr_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, 2,
- ett_cntrl_wrapper_fc, &cw_item, "Carried Frame");
- if (isDMG) {
- expert_add_info_format(pinfo, cw_item, &ei_ieee80211_dmg_subtype,
- "DMG STA shouldn't transmit Control Wrapper frame");
- }
- }
- }
+ {&hf_ieee80211_ff_brp_MID_GRANT,
+ {"BRP Request MID-GRANT", "wlan.brp.mid_grant",
+ FT_BOOLEAN, 32, NULL, 0x00000100,
+ NULL, HFILL }},
- switch (ctrl_type_subtype)
- {
- case CTRL_PS_POLL:
- case CTRL_CFP_ENDACK:
- {
- set_src_addr_cols(pinfo, tvb, offset, "TA");
- /* if (tree) */
- {
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
- }
- break;
- }
+ {&hf_ieee80211_ff_brp_BC_GRANT,
+ {"BRP Request BC-GRANT", "wlan.brp.bc_grant",
+ FT_BOOLEAN, 32, NULL, 0x00000200,
+ NULL, HFILL }},
- case CTRL_CFP_END:
- {
- if (isDMG)
- set_src_addr_cols(pinfo, tvb, offset, "TA");
- else
- set_src_addr_cols(pinfo, tvb, offset, "BSSID");
- /* if (tree) */
- {
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
- if (isDMG) {
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- } else {
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
- }
- break;
- }
+ {&hf_ieee80211_ff_brp_chan_FBCK_CAP,
+ {"BRP Request Chan FBCK-CAP", "wlan.brp.chan_fbck_cap",
+ FT_BOOLEAN, 32, NULL, 0x00000400,
+ NULL, HFILL }},
- case CTRL_BEAMFORM_RPT_POLL:
- {
- set_src_addr_cols(pinfo, tvb, offset, "TA");
- /* if (tree) */
- {
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ {&hf_ieee80211_ff_brp_tx_sector,
+ {"BRP Request TX Sector ID", "wlan.brp.tx_sector_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0001f800,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
+ {&hf_ieee80211_ff_brp_other_aid,
+ {"BRP Request Other AID", "wlan.brp.other_aid",
+ FT_UINT32, BASE_DEC, NULL, 0x01fe0000,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_beamform_feedback_seg_retrans_bitmap, tvb, offset, 1, ENC_NA);
- }
- break;
- }
+ {&hf_ieee80211_ff_brp_tx_antenna,
+ {"BRP Request TX Antenna ID", "wlan.brp.tx_antenna_id",
+ FT_UINT32, BASE_DEC, NULL, 0x06000000,
+ NULL, HFILL }},
- case CTRL_VHT_NDP_ANNC:
- {
- set_src_addr_cols(pinfo, tvb, offset, "TA");
- /* if (tree) */
- {
- guint16 sta_info;
- guint8 len_fcs = 0;
- proto_tree *dialog_token_tree;
- proto_item *dialog_token_item;
- proto_tree *sta_info_tree;
- proto_item *sta_info_item;
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ {&hf_ieee80211_ff_brp_reserved,
+ {"BRP Request Reserved", "wlan.brp.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xF8000000,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
+ {&hf_ieee80211_ff_blm,
+ {"Beamformed Link Maintenance", "wlan.blm",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- dialog_token_item = proto_tree_add_item(hdr_tree, hf_ieee80211_vht_ndp_annc_token,
- tvb, offset, 1, ENC_NA);
- dialog_token_tree = proto_item_add_subtree(dialog_token_item, ett_vht_ndp_annc_token_tree);
- proto_tree_add_item(dialog_token_tree, hf_ieee80211_vht_ndp_annc_token_number,
- tvb, offset, 1, ENC_NA);
- proto_tree_add_item(dialog_token_tree, hf_ieee80211_vht_ndp_annc_token_reserved,
- tvb, offset, 1, ENC_NA);
- offset++;
+ {&hf_ieee80211_ff_blm_unit_index,
+ {"BeamLink Maintenance Uint Index", "wlan.blm.uint_index",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }},
- /* Check if there is FCS in the packet */
- if(has_fcs){
- len_fcs = 4;
- }
- while (tvb_reported_length_remaining(tvb, offset) > len_fcs) {
- sta_info_item = proto_tree_add_item(hdr_tree, hf_ieee80211_vht_ndp_annc_sta_info,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- sta_info_tree = proto_item_add_subtree(sta_info_item, ett_vht_ndp_annc_sta_info_tree);
- proto_tree_add_item(sta_info_tree, hf_ieee80211_vht_ndp_annc_sta_info_aid12,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sta_info_tree, hf_ieee80211_vht_ndp_annc_sta_info_feedback_type,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
-
- sta_info = tvb_get_letohs(tvb, offset);
-
- if (sta_info & 0x1000)
- proto_tree_add_uint(sta_info_tree,
- hf_ieee80211_vht_ndp_annc_sta_info_nc_index,
- tvb, offset, 2, sta_info);
- else
- proto_tree_add_item(sta_info_tree, hf_ieee80211_vht_ndp_annc_sta_info_reserved,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- }
- }
- break;
- }
+ {&hf_ieee80211_ff_blm_maint_value,
+ {"BeamLink Maintenance Value", "wlan.blm.value",
+ FT_UINT8, BASE_DEC, NULL, 0x7e,
+ NULL, HFILL }},
- case CTRL_GRANT_ACK:
- case CTRL_SSW:
- case CTRL_SSW_FEEDBACK:
- case CTRL_SSW_ACK:
- case CTRL_DMG_CTS:
- case CTRL_GRANT:
- case CTRL_SPR:
- case CTRL_POLL:
- case CTRL_RTS:
- {
- set_src_addr_cols(pinfo, tvb, offset, "TA");
- /* if (tree) */
- {
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
- }
- break;
- }
+ {&hf_ieee80211_ff_blm_is_master,
+ {"BeamLink Is Master", "wlan.blm.is_master",
+ FT_BOOLEAN, 8, NULL, 0x80,
+ NULL, HFILL }},
- case CTRL_CONTROL_WRAPPER:
- {
- /* XXX - We shouldn't see this. Should we throw an error? */
- break;
- }
+ {&hf_ieee80211_ff_bic,
+ {"Beacon Interval Control", "wlan.bic",
+ FT_UINT48, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- case CTRL_BLOCK_ACK_REQ:
- {
- set_src_addr_cols(pinfo, tvb, offset, "TA");
+ {&hf_ieee80211_ff_bic_cc_present,
+ {"Clustering Control Present", "wlan.bic.cc",
+ FT_BOOLEAN, 48, NULL, 0x000000000001,
+ NULL, HFILL }},
- /* if (tree) */
- {
- guint16 bar_control;
- guint8 block_ack_type;
- proto_item *bar_parent_item;
- proto_tree *bar_sub_tree;
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ {&hf_ieee80211_ff_bic_discovery_mode,
+ {"Discovery Mode", "wlan.bic.discovery_mode",
+ FT_BOOLEAN, 48, NULL, 0x000000000002,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
+ {&hf_ieee80211_ff_bic_next_beacon,
+ {"Next Beacon", "wlan.bic.next_beacon",
+ FT_UINT48, BASE_DEC, NULL, 0x00000000003c,
- bar_control = tvb_get_letohs(tvb, offset);
- /* According to the 802.11ad standard (28/12/12) there is need to find the
- * GCR subfield which isn't described, thus the black_ack_type calculations
- * should be changed.
- */
- block_ack_type = (bar_control & 0x0006) >> 1;
- proto_tree_add_item(hdr_tree, hf_ieee80211_block_ack_request_type, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- bar_parent_item = proto_tree_add_item(hdr_tree,
- hf_ieee80211_block_ack_request_control, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- bar_sub_tree = proto_item_add_subtree(bar_parent_item,
- ett_block_ack);
- proto_tree_add_item(bar_sub_tree,
- hf_ieee80211_block_ack_control_ack_policy, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bar_sub_tree, hf_ieee80211_block_ack_control_multi_tid,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bar_sub_tree,
- hf_ieee80211_block_ack_control_compressed_bitmap, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bar_sub_tree, hf_ieee80211_block_ack_control_reserved,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
-
- switch (block_ack_type)
- {
- case 0: /*Basic BlockAckReq */
- {
- if(isDMG == TRUE) {
- expert_add_info_format(pinfo, bar_sub_tree, &ei_ieee80211_dmg_subtype,
- "DMG STA shouldn't transmit BlockAckReq frame with Basic BlockAckReq");
- break;
- }
- proto_tree_add_item(bar_sub_tree,
- hf_ieee80211_block_ack_control_basic_tid_info, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- /*offset +=*/ add_ff_block_ack_ssc(hdr_tree, tvb, pinfo, offset);
- break;
- }
- case 1: /* Extended Compressesd BlockAckReq */
- if(isDMG == FALSE) {
- expert_add_info_format(pinfo, bar_sub_tree, &ei_ieee80211_dmg_subtype,
- "Non-DMG STA shouldn't transmit BlockAckReq frame with Extended Compressed BlockAckReq");
- break;
- }
- /* FALL THROUGH */
- case 2: /* Compressed BlockAckReq */
- {
- proto_tree_add_item(bar_sub_tree,
- hf_ieee80211_block_ack_control_compressed_tid_info, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- /*offset +=*/ add_ff_block_ack_ssc(hdr_tree, tvb, pinfo, offset);
- break;
- }
- case 3: /* Multi-TID BlockAckReq */
- {
- guint8 tid_count;
- guint iii;
- proto_tree *bar_mtid_tree, *bar_mtid_sub_tree;
-
- if(isDMG == TRUE) {
- expert_add_info_format(pinfo, bar_sub_tree, &ei_ieee80211_dmg_subtype,
- "DMG STA shouldn't transmit BlockAckReq frame with Basic BlockAckReq");
- break;
- }
-
- tid_count = ((bar_control & 0xF000) >> 12) + 1;
- proto_tree_add_uint(bar_sub_tree, hf_ieee80211_block_ack_control_multi_tid_info, tvb, offset, 2, tid_count);
- offset += 2;
-
- bar_mtid_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, tid_count*4, ett_block_ack, NULL, "Per TID Info");
- for (iii = 0; iii < tid_count; iii++) {
- bar_parent_item = proto_tree_add_uint(bar_mtid_tree, hf_ieee80211_block_ack_multi_tid_info, tvb, offset, 4, iii);
- bar_mtid_sub_tree = proto_item_add_subtree(bar_parent_item, ett_block_ack);
-
- proto_tree_add_item(bar_mtid_sub_tree, hf_ieee80211_block_ack_multi_tid_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(bar_mtid_sub_tree, hf_ieee80211_block_ack_multi_tid_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- offset += add_ff_block_ack_ssc(bar_mtid_sub_tree, tvb, pinfo, offset);
- }
- break;
- }
- }
- }
- break;
- }
+ NULL, HFILL }},
- case CTRL_BLOCK_ACK:
- {
- set_src_addr_cols(pinfo, tvb, offset, "TA");
+ {&hf_ieee80211_ff_bic_ati_present,
+ {"ATI Present", "wlan.bic.ati",
+ FT_BOOLEAN, 48, NULL, 0x000000000040,
+ NULL, HFILL }},
- /* if (tree) */
- {
- guint16 ba_control;
- guint8 block_ack_type;
- proto_item *ba_parent_item;
- proto_tree *ba_sub_tree;
- const gchar *ether_name = tvb_get_ether_name(tvb, offset);
+ {&hf_ieee80211_ff_bic_abft_len,
+ {"A-BFT length", "wlan.bic.abft_len",
+ FT_UINT48, BASE_DEC, NULL, 0x000000000380,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, offset, 6, ENC_NA);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, offset, 6, ether_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- offset += 6;
+ {&hf_ieee80211_ff_bic_fss,
+ {"FSS", "wlan.bic.fss",
+ FT_UINT48, BASE_DEC, NULL, 0x000000003c00,
+ NULL, HFILL }},
- ba_control = tvb_get_letohs(tvb, offset);
- block_ack_type = (ba_control & 0x0006) >> 1;
- proto_tree_add_item(hdr_tree, hf_ieee80211_block_ack_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- ba_parent_item = proto_tree_add_item(hdr_tree,
- hf_ieee80211_block_ack_control, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- ba_sub_tree = proto_item_add_subtree(ba_parent_item, ett_block_ack);
- proto_tree_add_item(ba_sub_tree, hf_ieee80211_block_ack_control_ack_policy,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ba_sub_tree, hf_ieee80211_block_ack_control_multi_tid,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ba_sub_tree,
- hf_ieee80211_block_ack_control_compressed_bitmap, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ba_sub_tree, hf_ieee80211_block_ack_control_reserved, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
-
- switch (block_ack_type)
- {
- case 0: /*Basic BlockAck */
- {
- proto_tree_add_item(ba_sub_tree,
- hf_ieee80211_block_ack_control_basic_tid_info, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- offset += add_ff_block_ack_ssc(hdr_tree, tvb, pinfo, offset);
- proto_tree_add_item(hdr_tree, hf_ieee80211_block_ack_bitmap, tvb, offset, 128, ENC_NA);
- /*offset += 128;*/
- break;
- }
- /* Added to support Extended Compressed BlockAck RBUFCAP subfield.*/
- case 1: /* Extended Compressed BlockAck */
- {
- guint16 ssn;
- guint64 bmap;
- int f;
- proto_item *ba_bitmap_item;
- proto_tree *ba_bitmap_tree;
- if(isDMG == FALSE) {
- expert_add_info_format(pinfo, ba_sub_tree, &ei_ieee80211_dmg_subtype,
- "Non-DMG STA shouldn't transmit BlockAck frame with Extended Compressed BlockAck");
- break;
- }
- proto_tree_add_item(ba_sub_tree, hf_ieee80211_block_ack_control_basic_tid_info, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- ssn = tvb_get_letohs(tvb, offset);
- ssn >>= 4;
- offset += add_ff_block_ack_ssc(hdr_tree, tvb, pinfo, offset);
- bmap = tvb_get_letoh64(tvb, offset);
- ba_bitmap_item = proto_tree_add_item(hdr_tree, hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
- ba_bitmap_tree = proto_item_add_subtree(ba_bitmap_item, ett_block_ack_bitmap);
- for (f = 0; f < 64; f++) {
- if (bmap & (G_GUINT64_CONSTANT(1) << f))
- continue;
- proto_tree_add_uint(ba_bitmap_tree, hf_ieee80211_block_ack_bitmap_missing_frame,
- tvb, offset + (f/8), 1, ssn + f);
- }
- offset += 8;
- proto_tree_add_item(ba_sub_tree, hf_ieee80211_block_ack_RBUFCAP, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- break;
- }
- case 2: /* Compressed BlockAck */
- {
- guint16 ssn;
- guint64 bmap;
- int f;
- proto_item *ba_bitmap_item;
- proto_tree *ba_bitmap_tree;
-
- proto_tree_add_item(ba_sub_tree, hf_ieee80211_block_ack_control_basic_tid_info, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- ssn = tvb_get_letohs(tvb, offset);
- ssn >>= 4;
- offset += add_ff_block_ack_ssc(hdr_tree, tvb, pinfo, offset);
- bmap = tvb_get_letoh64(tvb, offset);
- ba_bitmap_item = proto_tree_add_item(hdr_tree, hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
- ba_bitmap_tree = proto_item_add_subtree(ba_bitmap_item, ett_block_ack_bitmap);
- for (f = 0; f < 64; f++) {
- if (bmap & (G_GUINT64_CONSTANT(1) << f))
- continue;
- proto_tree_add_uint_format_value(ba_bitmap_tree, hf_ieee80211_block_ack_bitmap_missing_frame,
- tvb, offset + (f/8), 1, ssn + f, "%u", (ssn + f) & 0x0fff);
- }
- /*offset += 8;*/
- break;
- }
- case 3: /* Multi-TID BlockAck */
- {
- guint8 tid_count;
- guint iii;
- proto_tree *ba_mtid_tree, *ba_mtid_sub_tree;
-
- tid_count = ((ba_control & 0xF000) >> 12) + 1;
- proto_tree_add_uint(ba_sub_tree,
- hf_ieee80211_block_ack_control_compressed_tid_info, tvb, offset, 2, tid_count);
- offset += 2;
-
- ba_mtid_tree = proto_tree_add_subtree(hdr_tree, tvb, offset, tid_count*4, ett_block_ack, NULL, "Per TID Info");
- for (iii = 0; iii < tid_count; iii++) {
- ba_parent_item = proto_tree_add_uint(ba_mtid_tree, hf_ieee80211_block_ack_multi_tid_info, tvb, offset, 4, iii);
- ba_mtid_sub_tree = proto_item_add_subtree(ba_parent_item, ett_block_ack);
-
- proto_tree_add_item(ba_mtid_sub_tree, hf_ieee80211_block_ack_multi_tid_reserved, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(ba_mtid_sub_tree, hf_ieee80211_block_ack_multi_tid_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
-
- offset += add_ff_block_ack_ssc(ba_mtid_sub_tree, tvb, pinfo, offset);
- proto_tree_add_item(ba_mtid_sub_tree, hf_ieee80211_block_ack_bitmap, tvb, offset, 8, ENC_NA);
- offset += 8;
- }
- break;
- }
- }
- }
- break;
- }
- }
-/*
- * 802.11ad : Used for extension types.
- */
- switch (ctrl_type_subtype) {
- case CTRL_POLL: {
- proto_tree_add_item(hdr_tree, hf_ieee80211_cf_response_offset,
- tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ {&hf_ieee80211_ff_bic_is_resp,
+ {"Is TXSS Responder", "wlan.bic.is_responder",
+ FT_BOOLEAN, 48, NULL, 0x000000004000,
+ NULL, HFILL }},
- break;
- }
- case CTRL_GRANT:
- case CTRL_GRANT_ACK:
- case CTRL_SPR: {
- gboolean isGrant;
- if(ctrl_type_subtype != CTRL_GRANT_ACK) {
- offset += add_ff_dynamic_allocation(hdr_tree, tvb, pinfo, offset);
- } else { /* CTRL_GRANT_ACK have 5 octets that are reserved*/
- proto_tree_add_item(hdr_tree, hf_ieee80211_grant_ack_reserved, tvb, offset, 5, ENC_NA);
- offset += 5;
- }
- isGrant = ((ctrl_type_subtype==CTRL_GRANT)||(ctrl_type_subtype==CTRL_GRANT_ACK));
- add_ff_beamforming_ctrl(hdr_tree, tvb, pinfo, offset, isGrant);
- /* offset += 2; */
- break;
- }
- case CTRL_SSW: {
- guint32 sector_sweep;
+ {&hf_ieee80211_ff_bic_next_abft,
+ {"Next A-BFT", "wlan.bic.next_abft",
+ FT_UINT48, BASE_DEC, NULL, 0x000000078000,
+ NULL, HFILL }},
- sector_sweep = tvb_get_letoh24(tvb, offset);
- offset += add_ff_sector_sweep(hdr_tree, tvb, pinfo, offset);
- /* if Sector Sweep Direction = Responder, use SW Feedback field format when not transmitted as part of an ISS */
- if(sector_sweep & 0x00001) {
- add_ff_sector_sweep_feedback_to_iss(hdr_tree, tvb, pinfo, offset);
- } else {
- add_ff_sector_sweep_feedback_from_iss(hdr_tree, tvb, pinfo, offset);
- }
- /* offset += 3; */
- break;
- }
- case CTRL_SSW_ACK:
- case CTRL_SSW_FEEDBACK: {
- offset += add_ff_sector_sweep_feedback_to_iss(hdr_tree, tvb, pinfo, offset);
- offset += add_ff_BRP_request(hdr_tree, tvb, pinfo, offset);
- add_ff_beamformed_link(hdr_tree, tvb, pinfo, offset);
- /* offset += 1; */
- break;
- }
- case CTRL_DMG_DTS: {
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_nav_sa, tvb, offset, 6, ENC_NA);
- offset += 6;
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_nav_da, tvb, offset, 6, ENC_NA);
- /* offset += 6; */
- break;
- }
- default:
- break;
- }
- break;
- }
+ {&hf_ieee80211_ff_bic_frag_txss,
+ {"Fragmented TXSS", "wlan.bic.frag_txss",
+ FT_BOOLEAN, 48, NULL, 0x000000080000,
+ NULL, HFILL }},
- case DATA_FRAME:
- {
- guint32 da_offset, sa_offset, ta_offset = 10, bssid_offset;
- addr_type = FCF_ADDR_SELECTOR(fcf);
+ {&hf_ieee80211_ff_bic_txss_span,
+ {"TXSS span", "wlan.bic.txss_span",
+ FT_UINT48, BASE_DEC, NULL, 0x000007f00000,
+ NULL, HFILL }},
- /* In order to show src/dst address we must always do the following */
- switch (addr_type)
- {
+ {&hf_ieee80211_ff_bic_NBI_abft,
+ {"Number of Beacon Intervals that are needed to allocate A-BFT", "wlan.bic.NBI_abft",
+ FT_UINT48, BASE_DEC, NULL, 0x00078000000,
+ NULL, HFILL }},
- case DATA_ADDR_T1:
- da_offset = 4;
- sa_offset = 10;
- bssid_offset = 16;
- break;
+ {&hf_ieee80211_ff_bic_abft_count,
+ {"A-BFT Count", "wlan.bic.abft_count",
+ FT_UINT48, BASE_DEC, NULL, 0x001f80000000,
+ NULL, HFILL }},
- case DATA_ADDR_T2:
- da_offset = 4;
- sa_offset = 16;
- bssid_offset = 10;
- break;
+ {&hf_ieee80211_ff_bic_nabft,
+ {"Number of A-BFT's received from each Antenna", "wlan.bic.nabft",
+ FT_UINT48, BASE_DEC, NULL, 0x07e000000000,
+ NULL, HFILL }},
- case DATA_ADDR_T3:
- da_offset = 16;
- sa_offset = 10;
- bssid_offset = 4;
- break;
+ {&hf_ieee80211_ff_bic_pcp,
+ {"PCP Association Ready", "wlan.bic.pcp",
+ FT_BOOLEAN, 48, NULL, 0x080000000000,
+ NULL, HFILL }},
- case DATA_ADDR_T4:
- da_offset = 16;
- sa_offset = 24;
- bssid_offset = 10;
- break;
+ {&hf_ieee80211_ff_bic_reserved,
+ {"Reserved", "wlan.bic.reserved",
+ FT_UINT48, BASE_HEX, NULL, 0xF00000000000,
+ NULL, HFILL }},
- default:
- /* Should never happen? */
- da_offset = 0;
- sa_offset = 0;
- ta_offset = 0;
- bssid_offset = 0;
- break;
- }
+ {&hf_ieee80211_ff_dmg_params,
+ {"DMG Parameters", "wlan.dmg_params",
+ FT_UINT8, BASE_HEX , NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_ff_dmg_params_bss,
+ {"BSS Type", "wlan.dmg_params.bss",
+ FT_UINT8, BASE_DEC, VALS(bss_type), 0x03,
+ NULL, HFILL }},
+ {&hf_ieee80211_ff_dmg_params_cbap_only,
+ {"CBAP Only", "wlan.dmg_params.cbap_only",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }},
+ {&hf_ieee80211_ff_dmg_params_cbap_src,
+ {"CBAP Source", "wlan.dmg_params.cbap_src",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }},
- set_address_tvb(&pinfo->dl_src, wlan_address_type, 6, tvb, sa_offset);
- copy_address_shallow(&pinfo->src, &pinfo->dl_src);
- set_address_tvb(&pinfo->dl_dst, wlan_address_type, 6, tvb, da_offset);
- copy_address_shallow(&pinfo->dst, &pinfo->dl_dst);
+ {&hf_ieee80211_ff_dmg_params_privacy,
+ {"DMG Privacy", "wlan.dmg_params.privacy",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL }},
- /* for tap */
- set_address_tvb(&whdr->bssid, wlan_bssid_address_type, 6, tvb, bssid_offset);
+ {&hf_ieee80211_ff_dmg_params_policy,
+ {"ECAPC Policy Enforced", "wlan.dmg_params.policy",
+ FT_BOOLEAN, 8, NULL, 0x20,
+ NULL, HFILL }},
- copy_address_shallow(&whdr->src, &pinfo->dl_src);
- copy_address_shallow(&whdr->dst, &pinfo->dl_dst);
+ {&hf_ieee80211_ff_cc,
+ {"Clustering Control", "wlan.cc",
+ FT_UINT64, BASE_HEX , NULL, 0,
+ NULL, HFILL }},
- seq_control = tvb_get_letohs(tvb, 22);
- frag_number = SEQCTL_FRAGMENT_NUMBER(seq_control);
- seq_number = SEQCTL_SEQUENCE_NUMBER(seq_control);
+ {&hf_ieee80211_ff_cc_abft_resp_addr,
+ {"A-BFT Responder Address", "wlan.cc.abft_resp_addr",
+ FT_ETHER, BASE_NONE , NULL, 0,
+ NULL, HFILL }},
- col_append_fstr(pinfo->cinfo, COL_INFO,
- ", SN=%d, FN=%d", seq_number, frag_number);
+ {&hf_ieee80211_ff_cc_sp_duration,
+ {"Beacon SP Duration", "wlan.cc.sp_duration",
+ FT_UINT8, BASE_DEC , NULL, 0,
+ NULL, HFILL }},
- /* Now if we have a tree we start adding stuff */
- if (tree)
- {
- const gchar *ta_name, *sa_name, *da_name, *bssid_name = NULL;
+ {&hf_ieee80211_ff_cc_cluster_id,
+ {"Cluster ID", "wlan.cc.cluster_id",
+ FT_UINT64, BASE_DEC , NULL, 0,
+ NULL, HFILL }},
- switch (addr_type)
- {
- case DATA_ADDR_T1:
- case DATA_ADDR_T2:
- case DATA_ADDR_T3:
- case DATA_ADDR_T4:
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_ta, tvb, ta_offset, 6, ENC_NA);
- ta_name = tvb_get_ether_name(tvb, ta_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_ta_resolved, tvb, ta_offset, 6, ta_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- /* TA is always in the wlan.addr filter */
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, ta_offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, ta_offset, 6, ta_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
+ {&hf_ieee80211_ff_cc_role,
+ {"Cluster Member Role", "wlan.cc.rold",
+ FT_UINT8, BASE_DEC , NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_da, tvb, da_offset, 6, ENC_NA);
- da_name = tvb_get_ether_name(tvb, da_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_da_resolved, tvb, da_offset, 6, da_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
+ {&hf_ieee80211_ff_cc_max_mem,
+ {"Cluster MaxMem", "wlan.cc.max_mem",
+ FT_UINT8, BASE_DEC , NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_sa, tvb, sa_offset, 6, ENC_NA);
- sa_name = tvb_get_ether_name(tvb, sa_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_sa_resolved, tvb, sa_offset, 6, sa_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
+ {&hf_ieee80211_tag_relay_support,
+ {"Relay Supportability", "wlan.relay_capabilities.relay_support",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }},
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, bssid_offset, 6, ENC_NA);
- bssid_name = tvb_get_ether_name(tvb, bssid_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_bssid_resolved, tvb, bssid_offset, 6, bssid_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
+ {&hf_ieee80211_tag_relay_use,
+ {"Relay Usability", "wlan.relay_capabilities.relay_use",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }},
- if ((flags & FROM_TO_DS) == FLAG_FROM_DS) { /* Receiver address */
- sta_addr_offset = 4;
- } else if ((flags & FROM_TO_DS) == FLAG_TO_DS) { /* Transmitter address */
- sta_addr_offset = ta_offset;
- }
- if (sta_addr_offset > 0) {
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_staa, tvb, sta_addr_offset, 6, ENC_NA);
- station_name = tvb_get_ether_name(tvb, sta_addr_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_staa_resolved, tvb, sta_addr_offset, 6, station_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- proto_tree_add_item(hdr_tree, hf_ieee80211_frag_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(hdr_tree, hf_ieee80211_seq_number, tvb, 22, 2, ENC_LITTLE_ENDIAN);
+ {&hf_ieee80211_tag_relay_permission,
+ {"Relay Permission", "wlan.relay_capabilities.relay_permission",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }},
- /* add 3rd and 4th address for wlan.addr filter */
- if (sa_offset != 4 && sa_offset != 10) {
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, sa_offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, sa_offset, 6, sa_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- if (da_offset != 4 && da_offset != 10 && da_offset != sa_offset) {
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, da_offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, da_offset, 6, da_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- if (bssid_offset != 4 && bssid_offset != 10 && bssid_offset != sa_offset && bssid_offset != da_offset) {
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, bssid_offset, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_resolved, tvb, bssid_offset, 6, bssid_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- break;
- }
+ {&hf_ieee80211_tag_AC_power,
+ {"A/C Power", "wlan.relay_capabilities.AC_power",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }},
- }
- break;
- }
- case EXTENSION_FRAME: {
- switch (frame_type_subtype) {
- case EXTENSION_DMG_BEACON: {
- set_dst_addr_cols(pinfo, tvb, 4, "BSSID");
- if (tree) {
- proto_tree_add_item(hdr_tree, hf_ieee80211_addr_bssid, tvb, 4, 6, ENC_NA);
- hidden_item = proto_tree_add_item(hdr_tree, hf_ieee80211_addr, tvb, 4, 6, ENC_NA);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- }
- break;
- }
- }
- }
- }
+ {&hf_ieee80211_tag_relay_prefer,
+ {"Relay Preference", "wlan.relay_capabilities.relay_prefer",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL }},
- len = tvb_captured_length_remaining(tvb, hdr_len);
- reported_len = tvb_reported_length_remaining(tvb, hdr_len);
+ {&hf_ieee80211_tag_duplex,
+ {"Duplex", "wlan.relay_capabilities.duplex",
+ FT_UINT8, BASE_DEC, NULL, 0x60,
+ NULL, HFILL }},
- if (has_fcs)
- {
- /*
- * Well, this packet should, in theory, have an FCS.
- * Do we have the entire packet, and does it have enough data for
- * the FCS?
- */
- if (reported_len < 4)
- {
- /*
- * The packet is claimed not to even have enough data for a 4-byte
- * FCS.
- * Pretend it doesn't have an FCS.
- */
- ;
- }
- else if (len < reported_len)
- {
- /*
- * The packet is claimed to have enough data for a 4-byte FCS, but
- * we didn't capture all of the packet.
- * Slice off the 4-byte FCS from the reported length, and trim the
- * captured length so it's no more than the reported length; that
- * will slice off what of the FCS, if any, is in the captured
- * length.
- */
- reported_len -= 4;
- if (len > reported_len)
- len = reported_len;
- }
- else
- {
- /*
- * We have the entire packet, and it includes a 4-byte FCS.
- * Slice it off, and put it into the tree.
- */
- len -= 4;
- reported_len -= 4;
- if (wlan_check_checksum)
- {
- guint32 sent_fcs = tvb_get_letohl(tvb, hdr_len + len);
- guint32 fcs;
+ {&hf_ieee80211_tag_cooperation,
+ {"Cooperation", "wlan.relay_capabilities.cooperation",
+ FT_BOOLEAN, 8, NULL, 0x80,
+ NULL, HFILL }},
- if (phdr->datapad)
- fcs = crc32_802_tvb_padded(tvb, ohdr_len, hdr_len, len);
- else
- fcs = crc32_ccitt_tvb(tvb, hdr_len + len);
- if (fcs != sent_fcs) {
- flag_str[8] = '.';
- }
+#if 0
+ {&hf_ieee80211_ff_rcsi,
+ {"Relay Capable STA Info", "wlan.rcsi",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, fcs, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY);
- } else {
- proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, &ei_ieee80211_fcs, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
- }
- }
- }
- else
- {
- flag_str[8] = '\0';
- }
+ {&hf_ieee80211_ff_rcsi_aid,
+ {"AID", "wlan.rcsi.aid",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ NULL, HFILL }},
+#endif
- proto_item_append_text(ti, ", Flags: %s", flag_str);
- col_append_fstr(pinfo->cinfo, COL_INFO, ", Flags=%s", flag_str);
+ {&hf_ieee80211_ff_band_id,
+ {"Band ID", "wlan.band_id",
+ FT_UINT8, BASE_DEC, VALS(band_id), 0xff,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_move,
+ {"Move", "wlan.dmg_bss_param_change.move",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }},
- /*
- * Only management and data frames have a body, so we don't have
- * anything more to do for other types of frames.
- */
- switch (FCF_FRAME_TYPE (fcf))
- {
+ {&hf_ieee80211_tag_size,
+ {"Size", "wlan.dmg_bss_param_change.size",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }},
- case MGT_FRAME:
- if (htc_len == 4) {
- dissect_ht_control(hdr_tree, tvb, ohdr_len - 4);
- }
- break;
+ {&hf_ieee80211_tag_tbtt_offset,
+ {"TBTT Offset", "wlan.dmg_bss_param_change.tbtt_offset",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0xffffffff,
+ NULL, HFILL }},
- case DATA_FRAME:
- if ((option_flags & IEEE80211_COMMON_OPT_NORMAL_QOS) && tree && DATA_FRAME_IS_QOS(frame_type_subtype))
- {
- proto_item *qos_fields, *qos_ti;
- proto_tree *qos_tree;
+ {&hf_ieee80211_tag_bi_duration,
+ {"BI Duration", "wlan.dmg_bss_param_change.bi_duration",
+ FT_UINT16, BASE_DEC, NULL, 0xffff,
+ NULL, HFILL }},
- guint16 qos_eosp;
- guint16 qos_field_content;
+ {&hf_ieee80211_tag_dmg_capa_sta_addr,
+ {"STA Address", "wlan.dmg_capa.sta_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "STA_Address", HFILL }},
- qos_fields = proto_tree_add_item(hdr_tree, hf_ieee80211_qos, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- qos_tree = proto_item_add_subtree(qos_fields, ett_qos_parameters);
+ {&hf_ieee80211_tag_dmg_capa_aid,
+ {"AID", "wlan.dmg_capa.aid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+/* 8.4.2.127.2 DMG STA Capability Information field */
+ {&hf_ieee80211_tag_reverse_direction, /* DMG STA capa, bits [0] */
+ {"Reverse Direction", "wlan.dmg_capa.reverse_direction",
+ FT_BOOLEAN, 24, NULL, GENMASK(0, 0),
+ NULL, HFILL }},
- qos_eosp = QOS_EOSP(qos_control);
- qos_field_content = QOS_FIELD_CONTENT(qos_control);
+ {&hf_ieee80211_tag_hlts, /* DMG STA capa, bits [1] */
+ {"Higher Layer Timer Synchronization", "wlan.dmg_capa.htls",
+ FT_BOOLEAN, 24, NULL, GENMASK(1, 1),
+ NULL, HFILL }},
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_tid, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ {&hf_ieee80211_tag_tpc, /* DMG STA capa, bits [2] */
+ {"TPC", "wlan.dmg_capa.tpc",
+ FT_BOOLEAN, 24, NULL, GENMASK(2, 2),
+ NULL, HFILL }},
- qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_priority, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- PROTO_ITEM_SET_GENERATED(qos_ti);
+ {&hf_ieee80211_tag_spsh, /* DMG STA capa, bits [3] */
+ {"SPSH and Interference Mitigation", "wlan.dmg_capa.spsh",
+ FT_BOOLEAN, 24, NULL, GENMASK(3, 3),
+ NULL, HFILL }},
- if (FLAGS_DS_STATUS(flags) == (FLAG_FROM_DS|FLAG_TO_DS)) {
- /* mesh frame */
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_eosp, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- } else {
- if (flags & FLAG_TO_DS) {
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_bit4, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- } else {
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_eosp, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- }
- }
+ {&hf_ieee80211_tag_rx_antenna, /* DMG STA capa, bits [4..5] */
+ {"Number of RX DMG Antennas", "wlan.dmg_capa.num_rx",
+ FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), GENMASK(5, 4),
+ NULL, HFILL }},
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_ack_policy, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ {&hf_ieee80211_tag_fast_link, /* DMG STA capa, bits [6] */
+ {"Fast Link Adaptation", "wlan.dmg_capa.fast_link",
+ FT_BOOLEAN, 24, NULL, GENMASK(6, 6),
+ NULL, HFILL }},
- if (flags & FLAG_FROM_DS) {
- if (!DATA_FRAME_IS_NULL(frame_type_subtype)) {
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_amsdu_present, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- is_amsdu = QOS_AMSDU_PRESENT(qos_control);
- }
- if (DATA_FRAME_IS_CF_POLL(frame_type_subtype)) {
- /* txop limit */
- qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_txop_limit, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- if (qos_field_content == 0) {
- proto_item_append_text(qos_ti, " (transmit one frame immediately)");
- }
- } else {
- /* qap ps buffer state */
- proto_item *qos_ps_buf_state_fields;
- proto_tree *qos_ps_buf_state_tree;
+ {&hf_ieee80211_tag_num_sectors, /* DMG STA capa, bits [7..13] */
+ {"Total Number of Sectors", "wlan.dmg_capa.num_sectors",
+ FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), GENMASK(13, 7),
+ NULL, HFILL }},
- qos_ps_buf_state_fields = proto_tree_add_item(qos_tree, hf_ieee80211_qos_ps_buf_state, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- qos_ps_buf_state_tree = proto_item_add_subtree(qos_ps_buf_state_fields, ett_qos_ps_buf_state);
+ {&hf_ieee80211_tag_rxss_length, /* DMG STA capa, bits [14..19] */
+ {"RXSS Length", "wlan.dmg_capa.rxss_len",
+ FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_mul_two_base_custom), GENMASK(19, 14),
+ NULL, HFILL }},
- proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_buf_state_indicated, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
+ {&hf_ieee80211_tag_reciprocity, /* DMG STA capa, bits [20] */
+ {"DMG Antenna Reciprocity", "wlan.dmg_capa.reciprocity",
+ FT_BOOLEAN, 24, NULL, GENMASK(20, 20),
+ NULL, HFILL }},
+/* DMG STA capa, A-MPDU params, bits [21..26] */
+ {&hf_ieee80211_tag_max_ampdu_exp, /* DMG STA capa, bits [21..23] */
+ {"Maximum A-MPDU Length Exponent", "wlan.dmg_capa.max_ampdu_exp",
+ FT_UINT24, BASE_DEC, NULL, GENMASK(23, 21),
+ NULL, HFILL }},
- if (QOS_PS_BUF_STATE_INDICATED(qos_field_content)) {
- proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_highest_pri_buf_ac, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- qos_ti = proto_tree_add_item(qos_ps_buf_state_tree, hf_ieee80211_qos_qap_buf_load, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- switch (QOS_PS_QAP_BUF_LOAD(qos_field_content)) {
+ {&hf_ieee80211_tag_min_mpdu_spacing, /* DMG STA capa, bits [24..26] */
+ {"Minimum MPDU Start Spacing", "wlan.dmg_capa.min_mpdu_spacing",
+ FT_UINT24, BASE_DEC, NULL, GENMASK(26-24, 24-24),
+ NULL, HFILL }},
- case 0:
- proto_item_append_text(qos_ti, " (no buffered traffic)");
- break;
+ {&hf_ieee80211_tag_ba_flow_control , /* DMG STA capa, bits [27] */
+ {"BA with Flow Control", "wlan.dmg_capa.bs_flow_ctrl",
+ FT_BOOLEAN, 24, NULL, GENMASK(27-24, 27-24),
+ NULL, HFILL }},
+/* DMG STA capa, supported MCS set, bits [28..51] */
+ {&hf_ieee80211_tag_max_sc_rx_mcs, /* DMG STA capa, bits [28..32] */
+ {"Maximum SC Rx MCS", "wlan.dmg_capa.max_sc_rx_mcs",
+ FT_UINT24, BASE_DEC, NULL, GENMASK(32-24, 28-24),
+ NULL, HFILL }},
- default:
- proto_item_append_text(qos_ti, " (%d octets)", QOS_PS_QAP_BUF_LOAD(qos_field_content)*4096);
- break;
+ {&hf_ieee80211_tag_max_ofdm_rx_mcs, /* DMG STA capa, bits [33..37] */
+ {"Maximum OFDM Rx MCS", "wlan.dmg_capa.max_ofdm_rx_mcs",
+ FT_UINT24, BASE_DEC, NULL, GENMASK(37-24, 33-24),
+ NULL, HFILL }},
- case 15:
- proto_item_append_text(qos_ti, " (greater than 57344 octets)");
- break;
- }
+ {&hf_ieee80211_tag_max_sc_tx_mcs, /* DMG STA capa, bits [38..42] */
+ {"Maximum SC Tx MCS", "wlan.dmg_capa.max_sc_tx_mcs",
+ FT_UINT24, BASE_DEC, NULL, GENMASK(42-24, 38-24),
+ NULL, HFILL }},
- }
- }
- } else {
- if (!DATA_FRAME_IS_NULL(frame_type_subtype)) {
- proto_tree_add_item(qos_tree, hf_ieee80211_qos_amsdu_present, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- is_amsdu = QOS_AMSDU_PRESENT(qos_control);
- }
- if (qos_eosp) {
- /* queue size */
- qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_queue_size, tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- switch (qos_field_content) {
- case 0:
- proto_item_append_text(qos_ti, " (no buffered traffic in the queue)");
- break;
+ {&hf_ieee80211_tag_max_ofdm_tx_mcs, /* DMG STA capa, bits [43..47] */
+ {"Maximum OFDM Tx MCS", "wlan.dmg_capa.max_ofdm_tx_mcs",
+ FT_UINT24, BASE_DEC, NULL, GENMASK(47-24, 43-24),
+ NULL, HFILL }},
- default:
- proto_item_append_text(qos_ti, " (%u bytes)", qos_field_content*256);
- break;
+ {&hf_ieee80211_tag_low_power_supported, /* DMG STA capa, bits [48] */
+ {"Low Power SC PHY Supported", "wlan.dmg_capa.low_power_suuported",
+ FT_BOOLEAN, 16, NULL, GENMASK(48-48, 48-48),
+ NULL, HFILL }},
- case 254:
- proto_item_append_text(qos_ti, " (more than 64768 octets)");
- break;
+ {&hf_ieee80211_tag_code_rate, /* DMG STA capa, bits [49] */
+ {"Code Rate 13/16", "wlan.dmg_capa.code_rate",
+ FT_BOOLEAN, 16, NULL, GENMASK(49-48, 49-48),
+ NULL, HFILL }},
- case 255:
- proto_item_append_text(qos_ti, " (unspecified or unknown)");
- break;
- }
- } else {
- /* txop duration requested */
- qos_ti = proto_tree_add_item(qos_tree, hf_ieee80211_qos_txop_dur_req,
- tvb, qosoff, 2, ENC_LITTLE_ENDIAN);
- if (qos_field_content == 0) {
- proto_item_append_text(qos_ti, " (no TXOP requested)");
- }
- }
- }
+ {&hf_ieee80211_tag_dtp, /* DMG STA capa, bits [52] */
+ {"DTP Supported", "wlan.dmg_capa.dtp",
+ FT_BOOLEAN, 16, NULL, GENMASK(52-48, 52-48),
+ NULL, HFILL }},
- /* Do we have +HTC? */
- if (htc_len == 4) {
- dissect_ht_control(hdr_tree, tvb, ohdr_len - 4);
- }
+ {&hf_ieee80211_tag_appdu_supp, /* DMG STA capa, bits [53] */
+ {"A-PPDU Supported", "wlan.dmg_capa.appdu_supp",
+ FT_BOOLEAN, 16, NULL, GENMASK(53-48, 53-48),
+ NULL, HFILL }},
- if (meshctl_len != 0) {
- proto_item *msh_fields;
- proto_tree *msh_tree;
+ {&hf_ieee80211_tag_heartbeat, /* DMG STA capa, bits [54] */
+ {"HeartBeat", "wlan.dmg_capa.heartbeat",
+ FT_BOOLEAN, 16, NULL, GENMASK(54-48, 54-48),
+ NULL, HFILL }},
- msh_fields = proto_tree_add_item(hdr_tree, hf_ieee80211_mesh_control_field, tvb, meshoff, meshctl_len, ENC_NA);
- msh_tree = proto_item_add_subtree(msh_fields, ett_msh_control);
- add_ff_mesh_control(msh_tree, tvb, pinfo, meshoff);
- }
+ {&hf_ieee80211_tag_other_aid, /* DMG STA capa, bits [55] */
+ {"Supports Other_AID", "wlan.dmg_capa.other_aid",
+ FT_BOOLEAN, 16, NULL, GENMASK(55-48, 55-48),
+ NULL, HFILL }},
- } /* end of qos control field */
- if (enable_decryption && !pinfo->fd->flags.visited) {
- const guint8 *enc_data = tvb_get_ptr(tvb, 0, hdr_len+reported_len);
- /* The processing will take care of 4-way handshake sessions for WPA and WPA2 decryption */
- AirPDcapPacketProcess(&airpdcap_ctx, enc_data, hdr_len, hdr_len+reported_len, NULL, 0, NULL, TRUE);
+ {&hf_ieee80211_tag_pattern_recip, /* DMG STA capa, bits [56] */
+ {"Antenna Pattern Reciprocity", "wlan.dmg_capa.pattern_recip",
+ FT_BOOLEAN, 16, NULL, GENMASK(56-48, 56-48),
+ NULL, HFILL }},
- }
- /*
- * No-data frames don't have a body.
- */
- if (DATA_FRAME_IS_NULL(frame_type_subtype))
- goto end_of_wlan;
+ {&hf_ieee80211_tag_heartbeat_elapsed, /* DMG STA capa, bits [57..59] */
+ {"Heartbeat Elapsed Indication", "wlan.dmg_capa.heartbeat_elapsed",
+ FT_UINT16, BASE_DEC, NULL, GENMASK(59-48, 57-48),
+ NULL, HFILL }},
- if (!wlan_subdissector) {
- guint fnum = 0;
+ {&hf_ieee80211_tag_grant_ack_supp, /* DMG STA capa, bits [60] */
+ {"Grant ACK Supported", "wlan.dmg_capa.grant_ack_supp",
+ FT_BOOLEAN, 16, NULL, GENMASK(60-48, 60-48),
+ NULL, HFILL }},
- /* key: bssid:src
- * data: last seq_control seen and frame number
- */
- retransmitted = FALSE;
- if (!pinfo->fd->flags.visited) {
- retransmit_key key;
- retransmit_key *result;
+ {&hf_ieee80211_tag_RXSSTxRate_supp, /* DMG STA capa, bits [61] */
+ {"RXSSTxRate Supported", "wlan.dmg_capa.RXSSTxRate",
+ FT_BOOLEAN, 16, NULL, GENMASK(61-48, 61-48),
+ NULL, HFILL }},
+/* 8.4.2.127.3 DMG PCP/AP Capability Information field */
+ {&hf_ieee80211_tag_pcp_tddti, /* DMG PCP/AP capa, bits [0] */
+ {"TDDTI", "wlan.dmg_capa.pcp_tdtti",
+ FT_BOOLEAN, 16, NULL, GENMASK(0, 0),
+ NULL, HFILL }},
- memcpy(key.bssid, whdr->bssid.data, 6);
- memcpy(key.src, whdr->src.data, 6);
- key.seq_control = 0;
- result = (retransmit_key *)g_hash_table_lookup(fc_analyse_retransmit_table, &key);
- if (result && (result->seq_control == seq_control)) {
- /* keep a pointer to the first seen frame, could be done with proto data? */
- fnum = result->fnum;
- g_hash_table_insert(fc_first_frame_table, GINT_TO_POINTER(pinfo->num),
- GINT_TO_POINTER(fnum));
- retransmitted = TRUE;
- } else {
- /* first time or new seq*/
- if (!result) {
- result = wmem_new(wmem_file_scope(), retransmit_key);
- *result = key;
- g_hash_table_insert(fc_analyse_retransmit_table, result, result);
- }
- result->seq_control = seq_control;
- result->fnum = pinfo->num;
- }
- }
- else if ((fnum = GPOINTER_TO_UINT(g_hash_table_lookup(fc_first_frame_table, GINT_TO_POINTER(pinfo->num))))) {
- retransmitted = TRUE;
- }
+ {&hf_ieee80211_tag_pcp_PSA, /* DMG PCP/AP capa, bits [1] */
+ {"Pseudo-static Allocations", "wlan.dmg_capa.pcp_psa",
+ FT_BOOLEAN, 16, NULL, GENMASK(1, 1),
+ NULL, HFILL }},
- if (retransmitted) {
- col_append_str(pinfo->cinfo, COL_INFO, " [retransmitted]");
- if (tree) {
- proto_item *item;
+ {&hf_ieee80211_tag_pcp_handover, /* DMG PCP/AP capa, bits [2] */
+ {"PDP Handover", "wlan.dmg_capa.pcp_handover",
+ FT_BOOLEAN, 16, NULL, GENMASK(2, 2),
+ NULL, HFILL }},
- item=proto_tree_add_none_format(hdr_tree, hf_ieee80211_fc_analysis_retransmission, tvb, 0, 0,
- "Retransmitted frame");
- PROTO_ITEM_SET_GENERATED(item);
- item=proto_tree_add_uint(hdr_tree, hf_ieee80211_fc_analysis_retransmission_frame, tvb, 0, 0, fnum);
- PROTO_ITEM_SET_GENERATED(item);
- }
- next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len, len, reported_len);
- call_data_dissector(next_tvb, pinfo, tree);
- goto end_of_wlan;
- }
- }
+ {&hf_ieee80211_tag_pcp_max_assoc, /* DMG PCP/AP capa, bits [3..10] */
+ {"Max Associated STA Number", "wlan.dmg_capa.pcp_max_assoc",
+ FT_UINT16, BASE_DEC, NULL, GENMASK(10, 3),
+ NULL, HFILL }},
- break;
+ {&hf_ieee80211_tag_pcp_power_src, /* DMG PCP/AP capa, bits [11] */
+ {"Power Source", "wlan.dmg_capa.pcp_power_src",
+ FT_BOOLEAN, 16, NULL, GENMASK(11, 11),
+ NULL, HFILL }},
- case CONTROL_FRAME:
- goto end_of_wlan;
+ {&hf_ieee80211_tag_pcp_decenter, /* DMG PCP/AP capa, bits [12] */
+ {"Decentralized PCP/AP Clustering", "wlan.dmg_capa.pcp_decenter",
+ FT_BOOLEAN, 16, NULL, GENMASK(12, 12),
+ NULL, HFILL }},
- case EXTENSION_FRAME:
- break;
+ {&hf_ieee80211_tag_pcp_forwarding, /* DMG PCP/AP capa, bits [13] */
+ {"PCP Forwarding", "wlan.dmg_capa.pcp_forwarding",
+ FT_BOOLEAN, 16, NULL, GENMASK(13, 13),
+ NULL, HFILL }},
- default:
- goto end_of_wlan;
- }
+ {&hf_ieee80211_tag_pcp_center, /* DMG PCP/AP capa, bits [14] */
+ {"Centralized PCP/AP Clustering", "wlan.dmg_capa.pcp_center",
+ FT_BOOLEAN, 16, NULL, GENMASK(14, 14),
+ NULL, HFILL }},
- if (IS_PROTECTED(FCF_FLAGS(fcf))
- && !phdr->decrypted
- && (wlan_ignore_prot != WLAN_IGNORE_PROT_WO_IV)) {
- /*
- * It's a WEP or WPA encrypted frame, and it hasn't already been
- * decrypted; dissect the protections parameters and decrypt the data,
- * if we have a matching key. Otherwise display it as data.
- */
- gboolean can_decrypt = FALSE;
- proto_tree *wep_tree = NULL;
- guint32 iv;
- guint8 key, keybyte;
+ {&hf_ieee80211_tag_sta_beam_track, /* DMG STA beam track capa*/
+ {"STA Beam Tracking Time Limit", "wlan.dmg_capa.beam_track",
+ FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_microseconds, 0,
+ NULL, HFILL }},
-#define PROTECTION_ALG_WEP AIRPDCAP_KEY_TYPE_WEP
-#define PROTECTION_ALG_TKIP AIRPDCAP_KEY_TYPE_TKIP
-#define PROTECTION_ALG_CCMP AIRPDCAP_KEY_TYPE_CCMP
-#define PROTECTION_ALG_RSNA PROTECTION_ALG_CCMP | PROTECTION_ALG_TKIP
- guint8 algorithm=G_MAXUINT8;
-#define IS_TKIP(tvb, hdr_len) (tvb_get_guint8(tvb, hdr_len + 1) == \
- ((tvb_get_guint8(tvb, hdr_len) | 0x20) & 0x7f))
-#define IS_CCMP(tvb, hdr_len) (tvb_get_guint8(tvb, hdr_len + 2) == 0)
- guint32 sec_header=0;
- guint32 sec_trailer=0;
+ {&hf_ieee80211_tag_ext_sc_mcs_max_tx, /* DMG STA Ext SC MCS Capa: Max TX*/
+ {"Extended SC Max Tx MCS Name", "wlan.dmg_capa.ext_sc_mcs_capa_max_tx",
+ FT_UINT8, BASE_DEC, VALS(extended_sc_mcs), GENMASK(2, 0),
+ NULL, HFILL }},
- next_tvb = try_decrypt(tvb, pinfo, hdr_len, reported_len, &algorithm, &sec_header, &sec_trailer, &used_key);
+ {&hf_ieee80211_tag_ext_sc_mcs_tx_code_7_8, /* DMG STA Ext SC MCS Capa: Tx code rate 7/8*/
+ {"Extended SC Tx MCS code rate 7/8", "wlan.dmg_capa.ext_sc_mcs_tx_code_7_8",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), GENMASK(3, 3),
+ NULL, HFILL }},
- keybyte = tvb_get_guint8(tvb, hdr_len + 3);
- key = KEY_OCTET_WEP_KEY(keybyte);
- if ((keybyte & KEY_EXTIV) && (len >= EXTIV_LEN)) {
- /* Extended IV; this frame is likely encrypted with TKIP or CCMP */
- if (tree) {
- if (algorithm==PROTECTION_ALG_TKIP)
- wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
- ett_wep_parameters, NULL, "TKIP parameters");
- else if (algorithm==PROTECTION_ALG_CCMP)
- wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
- ett_wep_parameters, NULL, "CCMP parameters");
- else {
- if (IS_TKIP(tvb, hdr_len)) {
- algorithm=PROTECTION_ALG_TKIP;
- wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
- ett_wep_parameters, NULL, "TKIP parameters");
- } else if (IS_CCMP(tvb, hdr_len)) {
- algorithm=PROTECTION_ALG_CCMP;
- wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
- ett_wep_parameters, NULL, "CCMP parameters");
- } else
- wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 8,
- ett_wep_parameters, NULL, "TKIP/CCMP parameters");
- }
- proto_item_set_len(ti, hdr_len + 8);
+ {&hf_ieee80211_tag_ext_sc_mcs_max_rx, /* DMG STA Ext SC MCS Capa: Max RX*/
+ {"Extended SC Max Rx MCS Name", "wlan.dmg_capa.ext_sc_mcs_capa_max_rx",
+ FT_UINT8, BASE_DEC, VALS(extended_sc_mcs), GENMASK(6, 4),
+ NULL, HFILL }},
- if (algorithm==PROTECTION_ALG_TKIP) {
- g_snprintf(out_buff, SHORT_STR, "0x%08X%02X%02X",
- tvb_get_letohl(tvb, hdr_len + 4),
- tvb_get_guint8(tvb, hdr_len),
- tvb_get_guint8(tvb, hdr_len + 2));
- proto_tree_add_string(wep_tree, hf_ieee80211_tkip_extiv, tvb, hdr_len,
- EXTIV_LEN, out_buff);
- } else if (algorithm==PROTECTION_ALG_CCMP) {
- g_snprintf(out_buff, SHORT_STR, "0x%08X%02X%02X",
- tvb_get_letohl(tvb, hdr_len + 4),
- tvb_get_guint8(tvb, hdr_len + 1),
- tvb_get_guint8(tvb, hdr_len));
- proto_tree_add_string(wep_tree, hf_ieee80211_ccmp_extiv, tvb, hdr_len,
- EXTIV_LEN, out_buff);
- }
+ {&hf_ieee80211_tag_ext_sc_mcs_rx_code_7_8, /* DMG STA Ext SC MCS Capa: Rx code rate 7/8*/
+ {"Extended SC Rx MCS code rate 7/8", "wlan.dmg_capa.ext_sc_mcs_rx_code_7_8",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), GENMASK(7, 7),
+ NULL, HFILL }},
- proto_tree_add_uint(wep_tree, hf_ieee80211_wep_key, tvb, hdr_len + 3, 1, key);
- }
+ {&hf_ieee80211_tag_max_basic_sf_amsdu, /* DMG Max Number of Basic Subframes in an A-MSDU*/
+ {"Max Number of Basic Subframes in an A-MSDU", "wlan.dmg_capa.max_basic_sf_amsdu",
+ FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(max_basic_sf_amsdu), 0,
+ NULL, HFILL }},
- /* Subtract out the length of the IV. */
- len -= EXTIV_LEN;
- reported_len -= EXTIV_LEN;
- ivlen = EXTIV_LEN;
- /* It is unknown whether this is TKIP or CCMP, so let's not even try to
- * parse TKIP Michael MIC+ICV or CCMP MIC. */
+ {&hf_ieee80211_tag_max_short_sf_amsdu, /* DMG Max Number of short Subframes in an A-MSDU*/
+ {"Max Number of short Subframes in an A-MSDU", "wlan.dmg_capa.max_short_sf_amsdu",
+ FT_UINT8, BASE_RANGE_STRING | BASE_DEC, RVALS(max_short_sf_amsdu), 0,
+ NULL, HFILL }},
- /* checking for the trailer */
- if (next_tvb!=NULL) {
- if (reported_len < (gint) sec_trailer) {
- /* There is no space for a trailer, ignore it and don't decrypt */
- ;
- } else if (len < reported_len) {
- /* There is space for a trailer, but we haven't capture all the */
- /* packet. Slice off the trailer, but don't try to decrypt */
- reported_len -= sec_trailer;
- if (len > reported_len)
- len = reported_len;
- } else {
- /* Ok, we have a trailer and the whole packet. Decrypt it! */
- /* TODO: At the moment we won't add the trailer to the tree, */
- /* so don't remove the trailer from the packet */
- len -= sec_trailer;
- reported_len -= sec_trailer;
- can_decrypt = TRUE;
+ {&hf_ieee80211_tag_PSRSI,
+ {"PS Request Suspension Interval", "wlan.dmg_oper.psrsi",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* Add Key information to packet */
- bytes_to_hexstr(out_buff, used_key.KeyData.Wpa.Ptk+32, AIRPDCAP_TK_LEN); /* TK is stored in PTK at offset 32 bytes and 16 bytes long */
- out_buff[2*AIRPDCAP_TK_LEN] = '\0';
+ {&hf_ieee80211_tag_min_BHI_duration,
+ {"Min BHI Duration", "wlan.dmg_oper.min_BHI_duration",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- if (key == 0) { /* encrypted with pairwise key */
- ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_tk, tvb, 0, 0, out_buff);
- PROTO_ITEM_SET_GENERATED(ti);
+ {&hf_ieee80211_tag_brdct_sta_info_dur,
+ {"Broadcast STA Info Duration", "wlan.dmg_oper.brdcst_sta_info_dur",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* Also add the PMK used to to decrypt the packet. (PMK==PSK) */
- bytes_to_hexstr(out_buff, used_key.KeyData.Wpa.Psk, AIRPDCAP_WPA_PSK_LEN); /* 32 bytes */
- out_buff[2*AIRPDCAP_WPA_PSK_LEN] = '\0';
- ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_pmk, tvb, 0, 0, out_buff);
- PROTO_ITEM_SET_GENERATED(ti);
+ {&hf_ieee80211_tag_assoc_resp_confirm_time,
+ {"Associated Response Confirm Time", "wlan.dmg_oper.assoc_resp_confirm_time",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- } else { /* Encrypted with Group Key */
- ti = proto_tree_add_string(wep_tree, hf_ieee80211_fc_analysis_gtk, tvb, 0, 0, out_buff); /* GTK is stored in PTK at offset 32 bytes and 16 bytes long */
- PROTO_ITEM_SET_GENERATED(ti);
- }
- }
- }
- } else {
- /* No Ext. IV - WEP packet */
- /*
- * XXX - pass the IV and key to "try_decrypt_wep()", and have it pass
- * them to "wep_decrypt()", rather than having "wep_decrypt()" extract
- * them itself.
- *
- * Also, just pass the data *following* the WEP parameters as the
- * buffer to decrypt.
- */
- iv = tvb_get_ntoh24(tvb, hdr_len);
- if (tree) {
- wep_tree = proto_tree_add_subtree(hdr_tree, tvb, hdr_len, 4,
- ett_wep_parameters, NULL, "WEP parameters");
+ {&hf_ieee80211_tag_min_pp_duration,
+ {"Min PP Duration", "wlan.dmg_oper.min_pp_duration",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_uint(wep_tree, hf_ieee80211_wep_iv, tvb, hdr_len, 3, iv);
- tvb_memcpy(tvb, iv_buff, hdr_len, 3);
- is_iv_bad = weak_iv(iv_buff);
- if (is_iv_bad != -1) {
- proto_tree_add_boolean_format (wep_tree, hf_ieee80211_wep_iv_weak,
- tvb, 0, 0, TRUE,
- "Weak IV for key byte %d",
- is_iv_bad);
- }
- }
- if (tree)
- proto_tree_add_uint(wep_tree, hf_ieee80211_wep_key, tvb, hdr_len + 3, 1, key);
+ {&hf_ieee80211_tag_SP_idle_timeout,
+ {"SP Idle Timeout", "wlan.dmg_oper.SP_idle_timeout",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* Subtract out the length of the IV. */
- len -= 4;
- reported_len -= 4;
- ivlen = 4;
+ {&hf_ieee80211_tag_max_lost_beacons,
+ {"Max Lost Beacons", "wlan.dmg_oper.max_lost_beacons",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* Even if the decryption was not successful, set the algorithm */
- algorithm=PROTECTION_ALG_WEP;
+ {&hf_ieee80211_tag_type,
+ {"Type", "wlan.sctor_id.type",
+ FT_UINT32, BASE_HEX, NULL, 0x0000000f,
+ NULL, HFILL }},
- /*
- * Well, this packet should, in theory, have an ICV.
- * Do we have the entire packet, and does it have enough data for
- * the ICV?
- */
- if (reported_len < 4) {
- /*
- * The packet is claimed not to even have enough data for a
- * 4-byte ICV.
- * Pretend it doesn't have an ICV.
- */
- ;
- } else if (len < reported_len) {
- /*
- * The packet is claimed to have enough data for a 4-byte ICV,
- * but we didn't capture all of the packet.
- * Slice off the 4-byte ICV from the reported length, and trim
- * the captured length so it's no more than the reported length;
- * that will slice off what of the ICV, if any, is in the
- * captured length.
- */
- reported_len -= 4;
- if (len > reported_len)
- len = reported_len;
- } else {
- /*
- * We have the entire packet, and it includes a 4-byte ICV.
- * Slice it off, and put it into the tree.
- *
- * We only support decrypting if we have the the ICV.
- *
- * XXX - the ICV is encrypted; we're putting the encrypted
- * value, not the decrypted value, into the tree.
- */
- len -= 4;
- reported_len -= 4;
- can_decrypt = TRUE;
- }
- }
+ {&hf_ieee80211_tag_tap1,
+ {"Tap 1", "wlan.sctor_id.tap1",
+ FT_UINT32, BASE_HEX, NULL, 0x000003f0,
+ NULL, HFILL }},
- if (algorithm == PROTECTION_ALG_WEP) {
- g_strlcpy(wlan_stats.protection, "WEP", MAX_PROTECT_LEN);
- } else if (algorithm == PROTECTION_ALG_TKIP) {
- g_strlcpy(wlan_stats.protection, "TKIP", MAX_PROTECT_LEN);
- } else if (algorithm == PROTECTION_ALG_CCMP) {
- g_strlcpy(wlan_stats.protection, "CCMP", MAX_PROTECT_LEN);
- } else {
- g_strlcpy(wlan_stats.protection, "Unknown", MAX_PROTECT_LEN);
- }
+ {&hf_ieee80211_tag_state1,
+ {"State 1", "wlan.sctor_id.state1",
+ FT_UINT32, BASE_HEX, NULL, 0x0000fc00,
+ NULL, HFILL }},
- /* protection header */
- if (!can_decrypt || (next_tvb == NULL)) {
- /*
- * WEP decode impossible or failed, treat payload as raw data
- * and don't attempt fragment reassembly or further dissection.
- */
- next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len + ivlen, len, reported_len);
+ {&hf_ieee80211_tag_tap2,
+ {"Tap 2", "wlan.sctor_id.tap2",
+ FT_UINT32, BASE_HEX, NULL, 0x00ff0000,
+ NULL, HFILL }},
- if (tree) {
- if (algorithm == PROTECTION_ALG_WEP) {
- if (can_decrypt)
- proto_tree_add_uint_format_value(wep_tree, hf_ieee80211_wep_icv, tvb,
- hdr_len + ivlen + len, 4,
- tvb_get_ntohl(tvb, hdr_len + ivlen + len),
- "0x%08x (not verified)",
- tvb_get_ntohl(tvb, hdr_len + ivlen + len));
- } else if (algorithm == PROTECTION_ALG_CCMP) {
- } else if (algorithm == PROTECTION_ALG_TKIP) {
- }
- }
+ {&hf_ieee80211_tag_state2,
+ {"State 2", "wlan.sctor_id.state2",
+ FT_UINT32, BASE_HEX, NULL, 0xff000000,
+ NULL, HFILL }},
- if ((!(option_flags & IEEE80211_COMMON_OPT_IS_CENTRINO)) && (wlan_ignore_prot == WLAN_IGNORE_PROT_NO)) {
- /* Some wireless drivers (such as Centrino) WEP payload already decrypted */
- call_data_dissector(next_tvb, pinfo, tree);
- goto end_of_wlan;
- }
- } else {
- if (algorithm == PROTECTION_ALG_WEP) {
- if (tree)
- proto_tree_add_uint_format_value(wep_tree, hf_ieee80211_wep_icv, tvb,
- hdr_len + ivlen + len, 4,
- tvb_get_ntohl(tvb, hdr_len + ivlen + len),
- "0x%08x (correct)",
- tvb_get_ntohl(tvb, hdr_len + ivlen + len));
+ {&hf_ieee80211_tag_allocation_id,
+ {"Allocation ID", "wlan.ext_sched.alloc_id",
+ FT_UINT16, BASE_DEC, NULL, 0x000f,
+ NULL, HFILL }},
- add_new_data_source(pinfo, next_tvb, "Decrypted WEP data");
- } else if (algorithm==PROTECTION_ALG_CCMP) {
- add_new_data_source(pinfo, next_tvb, "Decrypted CCMP data");
- } else if (algorithm==PROTECTION_ALG_TKIP) {
- add_new_data_source(pinfo, next_tvb, "Decrypted TKIP data");
- }
-#undef IS_TKIP
-#undef IS_CCMP
-#undef PROTECTION_ALG_CCMP
-#undef PROTECTION_ALG_TKIP
-#undef PROTECTION_ALG_WEP
- }
+ {&hf_ieee80211_tag_allocation_type,
+ {"Allocation Type", "wlan.ext_sched.alloc_type",
+ FT_UINT16, BASE_DEC, VALS(allocation_type), 0x0070,
+ NULL, HFILL }},
- /*
- * WEP decryption successful!
- *
- * Use the tvbuff we got back from the decryption; the data starts at
- * the beginning. The lengths are already correct for the decoded WEP
- * payload.
- */
- hdr_len = 0;
+ {&hf_ieee80211_tag_pseudo_static,
+ {"Pseudo-static", "wlan.ext_sched.p_static",
+ FT_BOOLEAN, 16, NULL, 0x0080,
+ NULL, HFILL }},
- } else {
- /*
- * Not a WEP-encrypted frame; just use the data from the tvbuff
- * handed to us.
- *
- * The payload starts at "hdr_len" (i.e., just past the 802.11
- * MAC header), the length of data in the tvbuff following the
- * 802.11 header is "len", and the length of data in the packet
- * following the 802.11 header is "reported_len".
- */
- next_tvb = tvb;
- }
+ {&hf_ieee80211_tag_truncatable,
+ {"Truncatable", "wlan.ext_sched.truncatable",
+ FT_BOOLEAN, 16, NULL, 0x0100,
+ NULL, HFILL }},
- /*
- * Do defragmentation if "wlan_defragment" is true, and we have more
- * fragments or this isn't the first fragment.
- *
- * We have to do some special handling to catch frames that
- * have the "More Fragments" indicator not set but that
- * don't show up as reassembled and don't have any other
- * fragments present. Some networking interfaces appear
- * to do reassembly even when you're capturing raw packets
- * *and* show the reassembled packet without the "More
- * Fragments" indicator set *but* with a non-zero fragment
- * number.
- *
- * "fragment_add_seq_802_11()" handles that; we want to call it
- * even if we have a short frame, so that it does those checks - if
- * the frame is short, it doesn't do reassembly on it.
- *
- * (This could get some false positives if we really *did* only
- * capture the last fragment of a fragmented packet, but that's
- * life.)
- */
- save_fragmented = pinfo->fragmented;
- if (wlan_defragment && (more_frags || (frag_number != 0))) {
- fragment_head *fd_head;
+ {&hf_ieee80211_tag_extendable,
+ {"Extenedable", "wlan.ext_sched.extendable",
+ FT_BOOLEAN, 16, NULL, 0x0200,
+ NULL, HFILL }},
- /*
- * If we've already seen this frame, look it up in the
- * table of reassembled packets, otherwise add it to
- * whatever reassembly is in progress, if any, and see
- * if it's done.
- */
- if (reported_len < 0)
- THROW(ReportedBoundsError);
- fd_head = fragment_add_seq_802_11(&wlan_reassembly_table,
- next_tvb, hdr_len, pinfo, seq_number, NULL,
- frag_number,
- reported_len,
- more_frags);
- next_tvb = process_reassembled_data(tvb, hdr_len, pinfo,
- "Reassembled 802.11", fd_head,
- &frag_items, NULL, hdr_tree);
- } else {
- /*
- * If this is the first fragment, dissect its contents, otherwise
- * just show it as a fragment.
- */
- if (frag_number != 0) {
- /* Not the first fragment - don't dissect it. */
- next_tvb = NULL;
- } else {
- /* First fragment, or not fragmented. Dissect what we have here. */
+ {&hf_ieee80211_tag_pcp_active,
+ {"PCP Active", "wlan.ext_sched.pcp_active",
+ FT_BOOLEAN, 16, NULL, 0x0400,
+ NULL, HFILL }},
- /* Get a tvbuff for the payload. */
- next_tvb = tvb_new_subset_length_caplen(next_tvb, hdr_len, len, reported_len);
+ {&hf_ieee80211_tag_lp_sc_used,
+ {"LP SC Used", "wlan.ext_sched.lp_sc_used",
+ FT_BOOLEAN, 16, NULL, 0x0800,
+ NULL, HFILL }},
- /*
- * If this is the first fragment, but not the only fragment,
- * tell the next protocol that.
- */
- if (more_frags)
- pinfo->fragmented = TRUE;
- else
- pinfo->fragmented = FALSE;
- }
- }
+ {&hf_ieee80211_tag_src_aid,
+ {"Source AID", "wlan.ext_sched.src_id",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ NULL, HFILL }},
- if (next_tvb == NULL) {
- /* Just show this as an incomplete fragment. */
- col_set_str(pinfo->cinfo, COL_INFO, "Fragmented IEEE 802.11 frame");
- next_tvb = tvb_new_subset_length_caplen(tvb, hdr_len, len, reported_len);
- call_data_dissector(next_tvb, pinfo, tree);
- pinfo->fragmented = save_fragmented;
- goto end_of_wlan;
- }
+ {&hf_ieee80211_tag_dest_aid,
+ {"Destination AID", "wlan.ext_sched.dest_id",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ NULL, HFILL }},
- switch (FCF_FRAME_TYPE (fcf))
- {
+ {&hf_ieee80211_tag_alloc_start,
+ {"Allocation Start", "wlan.ext_sched.alloc_start",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- case MGT_FRAME:
- dissect_ieee80211_mgt(fcf, next_tvb, pinfo, tree);
- break;
+ {&hf_ieee80211_tag_alloc_block_duration,
+ {"Allocation Block Duration", "wlan.ext_sched.block_duration",
+ FT_UINT16, BASE_DEC, NULL, 0xffff,
+ NULL, HFILL }},
- case DATA_FRAME:
- if (is_amsdu && (tvb_reported_length_remaining(next_tvb, 0) > 4)) {
- proto_item *parent_item;
- proto_tree *mpdu_tree;
- guint32 msdu_offset = 0;
- guint i = 1;
+ {&hf_ieee80211_tag_num_blocks,
+ {"Number of Blocks", "wlan.ext_sched.num_blocks",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ NULL, HFILL }},
- parent_item = proto_tree_add_protocol_format(tree, proto_aggregate, next_tvb, 0,
- tvb_reported_length_remaining(next_tvb, 0), "IEEE 802.11 Aggregate MSDU");
- mpdu_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_parent_tree);
+ {&hf_ieee80211_tag_alloc_block_period,
+ {"Allocation Block Period", "wlan.ext_sched.alloc_block_period",
+ FT_UINT16, BASE_DEC, NULL, 0xffff,
+ NULL, HFILL }},
- do {
- tvbuff_t *msdu_tvb;
- guint16 msdu_length;
- proto_tree *subframe_tree;
- const gchar *resolve_name;
+ {&hf_ieee80211_tag_aid,
+ {"AID", "wlan.sta_avail.aid",
+ FT_UINT16, BASE_DEC, NULL, 0x00ff,
+ NULL, HFILL }},
- /*
- * IEEE Std 802.11-2012 says, in section 8.3.2.2 "A-MSDU format":
- *
- * The A-MSDU subframe header contains three fields: DA, SA, and
- * Length. The order of these fields and the bits within these
- * fields are the same as the IEEE 802.3 frame format.
- *
- * which means that the length field is big-endian, not
- * little-endian.
- */
- msdu_length = tvb_get_ntohs(next_tvb, msdu_offset+12);
+ {&hf_ieee80211_tag_cbap,
+ {"CBAP", "wlan.sta_avail.cbap",
+ FT_BOOLEAN, 16, NULL, 0x0100,
+ NULL, HFILL }},
- parent_item = proto_tree_add_item(mpdu_tree, hf_ieee80211_amsdu_subframe, next_tvb,
- msdu_offset, roundup2(msdu_offset+14+msdu_length, 4), ENC_NA);
- proto_item_append_text(parent_item, " #%u", i);
- subframe_tree = proto_item_add_subtree(parent_item, ett_msdu_aggregation_subframe_tree);
- i += 1;
+ {&hf_ieee80211_tag_pp_avail,
+ {"PP Available", "wlan.sta_avail.pp_avail",
+ FT_BOOLEAN, 16, NULL, 0x0200,
+ NULL, HFILL }},
- proto_tree_add_item(subframe_tree, hf_ieee80211_addr_da, next_tvb, msdu_offset, 6, ENC_NA);
- resolve_name = tvb_get_ether_name(tvb, msdu_offset);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_da_resolved, tvb, msdu_offset, 6,
- resolve_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(subframe_tree, hf_ieee80211_addr_sa, next_tvb, msdu_offset+6, 6, ENC_NA);
- resolve_name = tvb_get_ether_name(tvb, msdu_offset+6);
- hidden_item = proto_tree_add_string(hdr_tree, hf_ieee80211_addr_sa_resolved, tvb, msdu_offset+6, 6,
- resolve_name);
- PROTO_ITEM_SET_HIDDEN(hidden_item);
- proto_tree_add_item(subframe_tree, hf_ieee80211_amsdu_length, next_tvb, msdu_offset+12, 2, ENC_BIG_ENDIAN);
+ {&hf_ieee80211_tag_next_ati_start_time,
+ {"Start Time", "wlan.next_ati.start_time",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- msdu_offset += 14;
- msdu_tvb = tvb_new_subset_length(next_tvb, msdu_offset, msdu_length);
- call_dissector(llc_handle, msdu_tvb, pinfo, subframe_tree);
- msdu_offset = roundup2(msdu_offset+msdu_length, 4);
- } while (tvb_reported_length_remaining(next_tvb, msdu_offset) > 14);
+ {&hf_ieee80211_tag_next_ati_duration,
+ {"ATI Duration", "wlan.next_ati.duration",
+ FT_UINT16, BASE_DEC, NULL, 0xffff,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_old_bssid,
+ {"Old BSSID", "wlan.pcp_handover.old_bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "OLD_BSSID", HFILL }},
- break;
- }
- /* I guess some bridges take Netware Ethernet_802_3 frames,
- which are 802.3 frames (with a length field rather than
- a type field, but with no 802.2 header in the payload),
- and just stick the payload into an 802.11 frame. I've seen
- captures that show frames of that sort.
+ {&hf_ieee80211_tag_new_pcp_addr,
+ {"New PCP Address", "wlan.pcp_handover.new_pcp_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "New_PCP_Address", HFILL }},
- We also handle some odd form of encapsulation in which a
- complete Ethernet frame is encapsulated within an 802.11
- data frame, with no 802.2 header. This has been seen
- from some hardware.
+ {&hf_ieee80211_tag_bssid,
+ {"BSSID", "wlan.quiet_res.bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "BSS-ID", HFILL }},
- On top of that, at least at some point it appeared that
- the OLPC XO sent out frames with two bytes of 0 between
- the "end" of the 802.11 header and the beginning of
- the payload. Something similar has also been observed
- with Atheros chipsets. There the sequence control field
- seems repeated.
+ {&hf_ieee80211_tag_duplex_relay,
+ {"Duplex", "wlan.relay_capabilities.duplex",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }},
- So, if the packet doesn't start with 0xaa 0xaa:
+ {&hf_ieee80211_tag_cooperation_relay,
+ {"Cooperation", "wlan.relay_capabilities.cooperation",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }},
- we first use the same scheme that linux-wlan-ng does to detect
- those encapsulated Ethernet frames, namely looking to see whether
- the frame either starts with 6 octets that match the destination
- address from the 802.11 header or has 6 octets that match the
- source address from the 802.11 header following the first 6 octets,
- and, if so, treat it as an encapsulated Ethernet frame;
+ {&hf_ieee80211_tag_tx_mode,
+ {"TX-Mode", "wlan.realy_trans_param.tx_mode",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }},
- otherwise, we use the same scheme that we use in the Ethernet
- dissector to recognize Netware 802.3 frames, namely checking
- whether the packet starts with 0xff 0xff and, if so, treat it
- as an encapsulated IPX frame, and then check whether the
- packet starts with 0x00 0x00 and, if so, treat it as an OLPC
- frame, or check the packet starts with the repetition of the
- sequence control field and, if so, treat it as an Atheros frame. */
- encap_type = ENCAP_802_2;
- if (tvb_bytes_exist(next_tvb, 0, 2)) {
- octet1 = tvb_get_guint8(next_tvb, 0);
- octet2 = tvb_get_guint8(next_tvb, 1);
- if ((octet1 != 0xaa) || (octet2 != 0xaa)) {
- if ((tvb_memeql(next_tvb, 6, (const guint8 *)pinfo->dl_src.data, 6) == 0) ||
- (tvb_memeql(next_tvb, 0, (const guint8 *)pinfo->dl_dst.data, 6) == 0))
- encap_type = ENCAP_ETHERNET;
- else if ((octet1 == 0xff) && (octet2 == 0xff))
- encap_type = ENCAP_IPX;
- else if (((octet1 == 0x00) && (octet2 == 0x00)) ||
- (((octet2 << 8) | octet1) == seq_control)) {
- proto_tree_add_item(tree, hf_ieee80211_mysterious_olpc_stuff, next_tvb, 0, 2, ENC_NA);
- next_tvb = tvb_new_subset_remaining(next_tvb, 2);
- }
- }
- }
+ {&hf_ieee80211_tag_link_change_interval,
+ {"Link Change Interval", "wlan.realy_trans_param.link_change_interval",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0xff,
+ NULL, HFILL }},
- switch (encap_type) {
+ {&hf_ieee80211_tag_data_sensing_time,
+ {"Data Sensing Time", "wlan.realy_trans_param.data_sensing_time",
+ FT_UINT8, BASE_DEC, NULL, 0xff,
+ NULL, HFILL }},
- case ENCAP_802_2:
- call_dissector(llc_handle, next_tvb, pinfo, tree);
- break;
+ {&hf_ieee80211_tag_first_period,
+ {"First Period", "wlan.realy_trans_param.first_period",
+ FT_UINT16, BASE_DEC, NULL, 0xffff,
+ NULL, HFILL }},
- case ENCAP_ETHERNET:
- call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree);
- break;
+ {&hf_ieee80211_tag_second_period,
+ {"Second Period", "wlan.realy_trans_param.second_period",
+ FT_UINT16, BASE_DEC, NULL, 0xffff,
+ NULL, HFILL }},
- case ENCAP_IPX:
- call_dissector(ipx_handle, next_tvb, pinfo, tree);
- break;
- }
- break;
+ {&hf_ieee80211_tag_initiator,
+ {"Initiator", "wlan.beam_refine.initiator",
+ FT_BOOLEAN, 40, NULL, 0x0000000001,
+ NULL, HFILL }},
- case EXTENSION_FRAME:
- {
- dissect_ieee80211_extension(fcf, next_tvb, pinfo, tree);
- break;
- }
- }
- pinfo->fragmented = save_fragmented;
+ {&hf_ieee80211_tag_tx_train_res,
+ {"TX-train-response", "wlan.beam_refine.tx_train_res",
+ FT_BOOLEAN, 40, NULL, 0x0000000002,
+ NULL, HFILL }},
-end_of_wlan:
- whdr->stats = wlan_stats;
- tap_queue_packet(wlan_tap, pinfo, whdr);
- memset(&wlan_stats, 0, sizeof wlan_stats);
+ {&hf_ieee80211_tag_rx_train_res,
+ {"RX-train-response", "wlan.beam_refine.rx_train_res",
+ FT_BOOLEAN, 40, NULL, 0x0000000004,
+ NULL, HFILL }},
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_tag_tx_trn_ok,
+ {"TX-TRN-OK", "wlan.beam_refine.tx_trn_ok",
+ FT_BOOLEAN, 40, NULL, 0x0000000008,
+ NULL, HFILL }},
-/*
- * Dissect 802.11 with a variable-length link-layer header and with the FCS
- * presence or absence indicated by the pseudo-header, if there is one.
- */
-static int
-dissect_ieee80211(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
-{
- struct ieee_802_11_phdr *phdr = (struct ieee_802_11_phdr *)data;
- struct ieee_802_11_phdr ourphdr;
+ {&hf_ieee80211_tag_txss_fbck_req,
+ {"TXSS-FBCK-REQ", "wlan.beam_refine.txss_fbck_req",
+ FT_BOOLEAN, 40, NULL, 0x0000000010,
+ NULL, HFILL }},
- if (phdr == NULL) {
- /*
- * Fake a pseudo-header.
- * XXX - what are we supposed to do if the FCS length is unknown?
- */
- memset(&ourphdr, 0, sizeof(ourphdr));
- ourphdr.fcs_len = -1;
- ourphdr.decrypted = FALSE;
- ourphdr.datapad = FALSE;
- ourphdr.phy = PHDR_802_11_PHY_UNKNOWN;
- phdr = &ourphdr;
- }
- return dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, phdr);
-}
+ {&hf_ieee80211_tag_bs_fbck,
+ {"BS-FBCK", "wlan.beam_refine.bs_fbck",
+ FT_UINT40, BASE_DEC, NULL, 0x00000007e0,
+ NULL, HFILL }},
-/*
- * Dissect 802.11 with a variable-length link-layer header and with an
- * FCS, but no pseudo-header.
- */
-static int
-dissect_ieee80211_withfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- struct ieee_802_11_phdr phdr;
+ {&hf_ieee80211_tag_bs_fbck_antenna_id,
+ {"BS-FBCK Anetenna ID", "wlan.beam_refine.bs_fbck_antenna_id",
+ FT_UINT40, BASE_DEC, NULL, 0x0000001800,
+ NULL, HFILL }},
- /* Construct a pseudo-header to hand to the common code. */
- memset(&phdr, 0, sizeof(phdr));
- phdr.fcs_len = 4;
- phdr.decrypted = FALSE;
- phdr.datapad = FALSE;
- phdr.phy = PHDR_802_11_PHY_UNKNOWN;
- dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_tag_snr_requested,
+ {"SNR Requested", "wlan.beam_refine.snr_req",
+ FT_BOOLEAN, 40, NULL, 0x0000002000,
+ NULL, HFILL }},
-/*
- * Dissect 802.11 with a variable-length link-layer header and without an
- * FCS, but no pseudo-header.
- */
-static int
-dissect_ieee80211_withoutfcs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- struct ieee_802_11_phdr phdr;
+ {&hf_ieee80211_tag_channel_measurement_requested,
+ {"Channel Measurement Requested", "wlan.beam_refine.ch_measure_req",
+ FT_BOOLEAN, 40, NULL, 0x0000004000,
+ NULL, HFILL }},
- /* Construct a pseudo-header to hand to the common code. */
- memset(&phdr, 0, sizeof(phdr));
- phdr.decrypted = FALSE;
- phdr.datapad = FALSE;
- phdr.phy = PHDR_802_11_PHY_UNKNOWN;
- dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_tag_number_of_taps_requested,
+ {"Number of Taps Requested", "wlan.beam_refine.taps_req",
+ FT_UINT40, BASE_DEC | BASE_VAL64_STRING, VALS64(number_of_taps_values), 0x0000018000,
+ NULL, HFILL }},
-/*
- * Dissect 802.11 from an Intel 2200BG adapter in a Centrino laptop
- * running Windows XP.
- *
- * From
- *
- * https://www.wireshark.org/lists/ethereal-dev/200407/msg00184.html
- *
- * and
- *
- * https://www.wireshark.org/lists/ethereal-dev/200407/msg00393.html:
- *
- * I tried capturing from a Centrino laptop with the Intel 2200BG 802.11g
- * chipset. I saw a lot of "Ethernet II" frames with 0x2452 as ethertype.
- *
- * ...
- *
- * This behaviour has been observed on Windows XP. In my opinion it is
- * a "proprietary" behaviour of either the Centrino driver or the Centrino
- * hardware. Currently I have no Linux distro installed on the machine to
- * verify whether it is also the case.
- *
- * These packets are seen only in a promiscuous capture:
- * - Packets normally received by the Centrino computer have the normal
- * structure (no 802.11/LLC header but directly IP header).
- * - Packets that are supposed to be received by another computer have
- * the 802.11/LLC headers. ... Also I noticed that when WEP is enabled,
- * the 802.11 header has the flag "WEP" set to true, but the packet
- * is already decrypted. I added a test in the code to accomodate this.
- * For TKIP it seems to stay encrypted.
- */
-static int
-dissect_ieee80211_centrino(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- struct ieee_802_11_phdr phdr;
+ {&hf_ieee80211_tag_sector_id_order_req,
+ {"Sector ID Order Requested", "wlan.beam_refine.sector_id_req",
+ FT_BOOLEAN, 40, NULL, 0x0000020000,
+ NULL, HFILL }},
- /* Construct a pseudo-header to hand to the common code. */
- memset(&phdr, 0, sizeof(phdr));
- phdr.decrypted = FALSE;
- phdr.datapad = FALSE;
- phdr.phy = PHDR_802_11_PHY_UNKNOWN;
- dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_IS_CENTRINO|IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_tag_snr_present,
+ {"SNR Present", "wlan.beam_refine.snr_present",
+ FT_BOOLEAN, 40, NULL, 0x0000040000,
+ NULL, HFILL }},
-/*
- * Dissect 802.11 with a variable-length link-layer header and a byte-swapped
- * control field and with no FCS (some hardware sends out LWAPP-encapsulated
- * 802.11 packets with the control field byte swapped).
- */
-static int
-dissect_ieee80211_bsfc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- struct ieee_802_11_phdr phdr;
+ {&hf_ieee80211_tag_channel_measurement_present,
+ {"Channel Measurement Present", "wlan.beam_refine.ch_measure_present",
+ FT_BOOLEAN, 40, NULL, 0x0000080000,
+ NULL, HFILL }},
- /* Construct a pseudo-header to hand to the common code. */
- memset(&phdr, 0, sizeof(phdr));
- phdr.decrypted = FALSE;
- phdr.datapad = FALSE;
- phdr.phy = PHDR_802_11_PHY_UNKNOWN;
- dissect_ieee80211_common(tvb, pinfo, tree, IEEE80211_COMMON_OPT_BROKEN_FC|IEEE80211_COMMON_OPT_NORMAL_QOS, &phdr);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_tag_tap_delay_present,
+ {"Tap Delay Present", "wlan.beam_refine.tap_delay_present",
+ FT_BOOLEAN, 40, NULL, 0x0000100000,
+ NULL, HFILL }},
-/*
- * Dissect 802.11 with a variable-length link-layer header without qos elements
- * in data+qos frames and with no FCS (sent as WIDS frames by Cisco standalone
- * APs).
- */
-static int
-dissect_ieee80211_noqos(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- struct ieee_802_11_phdr phdr;
+ {&hf_ieee80211_tag_number_of_taps_present,
+ {"Number of Taps Present", "wlan.beam_refine.taps_present",
+ FT_UINT40, BASE_DEC | BASE_VAL64_STRING, VALS64(number_of_taps_values), 0x0000600000,
+ NULL, HFILL }},
- /* Construct a pseudo-header to hand to the common code. */
- memset(&phdr, 0, sizeof(phdr));
- phdr.decrypted = FALSE;
- phdr.datapad = FALSE;
- phdr.phy = PHDR_802_11_PHY_UNKNOWN;
- dissect_ieee80211_common(tvb, pinfo, tree, 0, &phdr);
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_tag_number_of_measurement,
+ {"Number of Measurements", "wlan.beam_refine.num_measurement",
+ FT_UINT40, BASE_DEC, NULL, 0x003f800000,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_sector_id_order_present,
+ {"Sector ID Order Present", "wlan.beam_refine.sector_id_present",
+ FT_BOOLEAN, 40, NULL, 0x0040000000,
+ NULL, HFILL }},
-/* ------------- */
-static guint
-retransmit_hash(gconstpointer k)
-{
- const retransmit_key *key = (const retransmit_key *)k;
- guint hash_val;
- int i;
+ {&hf_ieee80211_tag_number_of_beams,
+ {"Number of Beams", "wlan.beam_refine.num_beams",
+ FT_UINT40, BASE_DEC, NULL, 0x0f80000000,
+ NULL, HFILL }},
- hash_val = 0;
- for (i = 0; i < 6; i++)
- hash_val += key->bssid[i];
+ {&hf_ieee80211_tag_mid_extension,
+ {"MID Extension", "wlan.beam_refine.mid_ext",
+ FT_BOOLEAN, 40, NULL, 0x1000000000,
+ NULL, HFILL }},
- for (i = 0; i < 6; i++)
- hash_val += key->src[i];
+ {&hf_ieee80211_tag_capability_request,
+ {"Capability Request", "wlan.beam_refine.cap_req",
+ FT_BOOLEAN, 40, NULL, 0x2000000000,
+ NULL, HFILL }},
- return hash_val;
-}
+ {&hf_ieee80211_tag_beam_refine_reserved,
+ {"Reserved", "wlan.beam_refine.reserved",
+ FT_UINT40, BASE_DEC, NULL, 0xc000000000,
+ NULL, HFILL }},
-static gint
-retransmit_equal(gconstpointer k1, gconstpointer k2)
-{
- const retransmit_key *key1 = (const retransmit_key *)k1;
- const retransmit_key *key2 = (const retransmit_key *)k2;
+ {&hf_ieee80211_tag_nextpcp_list,
+ {"AID of NextPCP", "wlan.next_pcp.list",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- return ((!memcmp(key1->bssid, key2->bssid, 6) && !memcmp(key1->src, key2->src, 6)) ? TRUE:FALSE);
-}
+ {&hf_ieee80211_tag_nextpcp_token,
+ {"NextPCP List Token", "wlan.next_pcp.token",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-static guint
-frame_hash(gconstpointer k)
-{
- guint32 frame = GPOINTER_TO_UINT(k);
+ {&hf_ieee80211_tag_reamaining_BI,
+ {"Remaining BI's", "wlan.pcp_handover.remaining_BIs",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- return frame;
-}
+ {&hf_ieee80211_tag_request_token,
+ {"Request Token", "wlan.request_token",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-static gint
-frame_equal(gconstpointer k1, gconstpointer k2)
-{
- guint32 frame1 = GPOINTER_TO_UINT(k1);
- guint32 frame2 = GPOINTER_TO_UINT(k2);
+ {&hf_ieee80211_tag_bi_start_time,
+ {"BI Start Time", "wlan.bi_start_time",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- return frame1==frame2;
-}
+ {&hf_ieee80211_tag_sleep_cycle,
+ {"Sleep Cycle", "wlan.sleep_cycle",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-/*
- * EAPOL key description dissectors.
- */
-#define KEY_INFO_KEYDES_VERSION_MASK 0x0007
-#define KEY_INFO_KEY_TYPE_MASK 0x0008
-#define KEY_INFO_KEY_INDEX_MASK 0x0030
-#define KEY_INFO_INSTALL_MASK 0x0040
-#define KEY_INFO_KEY_ACK_MASK 0x0080
-#define KEY_INFO_KEY_MIC_MASK 0x0100
-#define KEY_INFO_SECURE_MASK 0x0200
-#define KEY_INFO_ERROR_MASK 0x0400
-#define KEY_INFO_REQUEST_MASK 0x0800
-#define KEY_INFO_ENCRYPTED_KEY_DATA_MASK 0x1000
-#define KEY_INFO_SMK_MESSAGE_MASK 0x2000
+ {&hf_ieee80211_tag_num_awake_bis,
+ {"Number of Awake/Doze BIs", "wlan.num_awake_bis",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-#define KEYDES_VER_TYPE1 0x01
-#define KEYDES_VER_TYPE2 0x02
-#define KEYDES_VER_TYPE3 0x03
+ {&hf_ieee80211_ff_dmg_action_code,
+ {"DMG Action", "wlan.fixed.dmg_act",
+ FT_UINT8, BASE_HEX, VALS(ff_dmg_action_flags), 0,
+ "Action Code", HFILL }},
-static const value_string keydes_version_vals[] = {
- { KEYDES_VER_TYPE1, "RC4 Cipher, HMAC-MD5 MIC" },
- { KEYDES_VER_TYPE2, "AES Cipher, HMAC-SHA1 MIC" },
- { KEYDES_VER_TYPE3, "AES Cipher, AES-128-CMAC MIC" },
- { 0, NULL }
-};
+ {&hf_ieee80211_ff_unprotected_dmg_action_code,
+ {"Unprotected DMG Action", "wlan.fixed.unprotected_dmg_act",
+ FT_UINT8, BASE_HEX, VALS(ff_unprotected_dmg_action_flags), 0,
+ "Action Code", HFILL }},
-static int proto_wlan_rsna_eapol = -1;
+ {&hf_ieee80211_ff_dmg_pwr_mgmt,
+ {"DMG Power Management", "wlan.dmg.pwr_mgmt",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }},
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message = -1;
-static int hf_wlan_rsna_eapol_keydes_key_len = -1;
-static int hf_wlan_rsna_eapol_keydes_replay_counter = -1;
-static int hf_wlan_rsna_eapol_keydes_key_iv = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_nonce = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_rsc = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_id = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_mic = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_data_len = -1;
-static int hf_wlan_rsna_eapol_wpa_keydes_data = -1;
+ {&hf_ieee80211_ff_subject_address,
+ {"Subject Address", "wlan.dmg.subject_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "MAC address of requested STA", HFILL }},
-static gint ett_keyinfo = -1;
-static gint ett_wlan_rsna_eapol_keydes_data = -1;
+ {&hf_ieee80211_ff_handover_reason,
+ {"Handover Reason", "wlan.dmg.handover_reason",
+ FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL }},
-static const true_false_string keyinfo_key_type_tfs = { "Pairwise Key", "Group Key" };
+ {&hf_ieee80211_ff_handover_remaining_bi,
+ {"Handover Remaining BI", "wlan.dmg.handover_remaining_bi",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }},
-static int
-dissect_wlan_rsna_eapol_wpa_or_rsn_key(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
-{
- int offset = 0;
- guint16 keyinfo;
- guint16 eapol_data_len;
- proto_tree *keydes_tree;
- proto_tree *ti = NULL;
- static const int * wlan_rsna_eapol_wpa_keydes_keyinfo[] = {
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_keydes_version,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_type,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_index,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_install,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_ack,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_key_mic,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_secure,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_error,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_request,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_encrypted_key_data,
- &hf_wlan_rsna_eapol_wpa_keydes_keyinfo_smk_message,
- NULL
- };
+ {&hf_ieee80211_ff_handover_result,
+ {"Handover Result", "wlan.dmg.handover_result",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }},
- /*
- * RSNA key descriptors.
- */
- eapol_data_len = tvb_get_ntohs(tvb, offset+92);
- keyinfo = tvb_get_ntohs(tvb, offset);
- if (keyinfo & KEY_INFO_REQUEST_MASK) {
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Request)");
- if (keyinfo & KEY_INFO_ERROR_MASK)
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Request, Error)");
- } else if (keyinfo & KEY_INFO_KEY_TYPE_MASK) {
- guint16 masked;
- /* Windows is setting the Secure Bit on message 2 when rekeying, so we'll ignore it */
- masked = keyinfo &
- (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK | KEY_INFO_KEY_MIC_MASK);
+ {&hf_ieee80211_ff_handover_reject_reason,
+ {"Handover Reject Reason", "wlan.dmg.handover_reject_reason",
+ FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL }},
- switch (masked) {
- case KEY_INFO_KEY_ACK_MASK:
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 1 of 4)");
- break;
+ {&hf_ieee80211_ff_destination_reds_aid,
+ {"Destination REDS AID", "wlan.dmg.destination_reds_aid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- case KEY_INFO_KEY_MIC_MASK:
- /* We check the key length to differentiate between message 2 and 4 and just hope that
- there are no strange implementations with key data and non-zero key length in message 4.
- According to the IEEE specification, sections 11.6.6.3 and 11.6.6.5 we should
- use the Secure Bit and/or the Nonce, but there are implementations ignoring the spec.
- The Secure Bit is incorrectly set on rekeys for Windows clients for Message 2 and the Nonce is non-zero
- in Message 4 in Bug 11994 (Apple?) */
- if (eapol_data_len)
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 2 of 4)");
- else
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 4 of 4)");
- break;
+ {&hf_ieee80211_ff_destination_aid,
+ {"Destination AID", "wlan.dmg.destination_aid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- case (KEY_INFO_INSTALL_MASK | KEY_INFO_KEY_ACK_MASK | KEY_INFO_KEY_MIC_MASK):
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Message 3 of 4)");
- break;
- }
- } else {
- if (keyinfo & KEY_INFO_KEY_ACK_MASK)
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 1 of 2)");
- else
- col_set_str(pinfo->cinfo, COL_INFO, "Key (Group Message 2 of 2)");
- }
+ {&hf_ieee80211_ff_realy_aid,
+ {"Relay AID", "wlan.dmg.realy_aid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_wlan_rsna_eapol_wpa_keydes_keyinfo,
- ett_keyinfo, wlan_rsna_eapol_wpa_keydes_keyinfo,
- ENC_BIG_ENDIAN, BMT_NO_APPEND);
- offset += 2;
+ {&hf_ieee80211_ff_source_aid,
+ {"Source AID", "wlan.dmg.source_aid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_key_len, tvb, offset,
- 2, ENC_BIG_ENDIAN);
- offset += 2;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_replay_counter, tvb,
- offset, 8, ENC_BIG_ENDIAN);
- offset += 8;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_nonce, tvb, offset,
- 32, ENC_NA);
- offset += 32;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_keydes_key_iv, tvb,
- offset, 16, ENC_NA);
- offset += 16;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_rsc, tvb, offset,
- 8, ENC_NA);
- offset += 8;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_id, tvb, offset, 8,
- ENC_NA);
- offset += 8;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_mic, tvb, offset,
- 16, ENC_NA);
- offset += 16;
- proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_data_len, tvb,
- offset, 2, ENC_BIG_ENDIAN);
- offset += 2;
- if (eapol_data_len != 0) {
- ti = proto_tree_add_item(tree, hf_wlan_rsna_eapol_wpa_keydes_data,
- tvb, offset, eapol_data_len, ENC_NA);
- if ((keyinfo & KEY_INFO_ENCRYPTED_KEY_DATA_MASK) ||
- !(keyinfo & KEY_INFO_KEY_TYPE_MASK)) {
- /* RSN: EAPOL-Key Key Data is encrypted.
- * WPA: Group Keys use encrypted Key Data.
- * Cannot parse this without knowing the key.
- * IEEE 802.11i-2004 8.5.2.
- */
- } else {
- keydes_tree = proto_item_add_subtree(ti, ett_wlan_rsna_eapol_keydes_data);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, keydes_tree,
- tvb_reported_length_remaining(tvb, offset),
- -1, NULL);
- }
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_ff_timing_offset,
+ {"Timing Offset", "wlan.dmg.timing_offset",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-/* It returns the algorithm used for decryption and the header and trailer lengths. */
-static tvbuff_t *
-try_decrypt(tvbuff_t *tvb, packet_info *pinfo, guint offset, guint len, guint8 *algorithm, guint32 *sec_header, guint32 *sec_trailer, PAIRPDCAP_KEY_ITEM used_key)
-{
- const guint8 *enc_data;
- tvbuff_t *decr_tvb = NULL;
- guint32 dec_caplen;
- guchar dec_data[AIRPDCAP_MAX_CAPLEN];
+ {&hf_ieee80211_ff_sampling_frequency_offset,
+ {"Sampling Frequency Offset", "wlan.dmg.sampling_frequency_offset",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- if (!enable_decryption)
- return NULL;
+ {&hf_ieee80211_ff_relay_operation_type,
+ {"Relay Operation Type", "wlan.dmg.relay_operation_type",
+ FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL }},
- /* get the entire packet */
- enc_data = tvb_get_ptr(tvb, 0, len+offset);
+ {&hf_ieee80211_ff_peer_sta_aid,
+ {"Peer STA AID", "wlan.dmg.peer_sta_aid",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* process packet with AirPDcap */
- if (AirPDcapPacketProcess(&airpdcap_ctx, enc_data, offset, offset+len, dec_data, &dec_caplen,
- used_key, FALSE)==AIRPDCAP_RET_SUCCESS)
- {
- guint8 *tmp;
- *algorithm=used_key->KeyType;
- switch (*algorithm) {
- case AIRPDCAP_KEY_TYPE_WEP:
- *sec_header=AIRPDCAP_WEP_HEADER;
- *sec_trailer=AIRPDCAP_WEP_TRAILER;
- break;
- case AIRPDCAP_KEY_TYPE_CCMP:
- *sec_header=AIRPDCAP_RSNA_HEADER;
- *sec_trailer=AIRPDCAP_CCMP_TRAILER;
- break;
- case AIRPDCAP_KEY_TYPE_TKIP:
- *sec_header=AIRPDCAP_RSNA_HEADER;
- *sec_trailer=AIRPDCAP_TKIP_TRAILER;
- break;
- default:
- return NULL;
- }
+ {&hf_ieee80211_ff_snr,
+ {"SNR", "wlan.dmg.snr",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* allocate buffer for decrypted payload */
- tmp = (guint8 *)wmem_memdup(pinfo->pool, dec_data+offset, dec_caplen-offset);
+ {&hf_ieee80211_ff_internal_angle,
+ {"Internal Angle", "wlan.dmg.internal_angle",
+ FT_UINT8, BASE_DEC, NULL, 0xfe,
+ NULL, HFILL }},
- len = dec_caplen-offset;
+ {&hf_ieee80211_ff_recommend,
+ {"Recommend", "wlan.dmg.recommend",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
+ NULL, HFILL }},
- /* decrypt successful, let's set up a new data tvb. */
- decr_tvb = tvb_new_child_real_data(tvb, tmp, len, len);
- }
+ {&hf_ieee80211_ff_fst_action_code,
+ {"FST Action Code", "wlan.fst.action_code",
+ FT_UINT8, BASE_HEX, VALS(ff_fst_action_flags), 0,
+ "Action Code", HFILL }},
- return decr_tvb;
-}
+ {&hf_ieee80211_ff_llt,
+ {"Link Loss Timeout", "wlan.fst.llt",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
-/* Collect our WEP and WPA keys */
-static void
-set_airpdcap_keys(void)
-{
- guint i;
- AIRPDCAP_KEYS_COLLECTION *keys = g_new(AIRPDCAP_KEYS_COLLECTION, 1);
- GByteArray *bytes = NULL;
+ {&hf_ieee80211_ff_fsts_id,
+ {"FSTS ID", "wlan.session_trans.fsts_id",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- keys->nKeys = 0;
+ {&hf_ieee80211_ff_mmpdu_len,
+ {"MMPDU Length", "wlan.fst.mmpdu_length",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- for (i = 0; (uat_wep_key_records != NULL) && (i < num_wepkeys_uat) && (i < MAX_ENCRYPTION_KEYS); i++)
- {
- decryption_key_t *dk;
- dk = parse_key_string(uat_wep_key_records[i].string, uat_wep_key_records[i].key);
+ {&hf_ieee80211_ff_mmpdu_ctrl,
+ {"MMPDU Control", "wlan.fst.mmpdu_ctrl",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- if (dk != NULL)
- {
- AIRPDCAP_KEY_ITEM key;
- if (dk->type == AIRPDCAP_KEY_TYPE_WEP)
- {
- gboolean res;
- key.KeyType = AIRPDCAP_KEY_TYPE_WEP;
+ {&hf_ieee80211_ff_oct_mmpdu,
+ {"OCT MMPDU", "wlan.fst.oct_mmpdu",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- bytes = g_byte_array_new();
- res = hex_str_to_bytes(dk->key->str, bytes, FALSE);
+ {&hf_ieee80211_ff_vht_mimo_cntrl,
+ {"VHT MIMO Control", "wlan.vht.mimo_control.control",
+ FT_UINT24, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
- if (dk->key->str && res && (bytes->len > 0) && (bytes->len <= AIRPDCAP_WEP_KEY_MAXLEN))
- {
- /*
- * WEP key is correct (well, the can be even or odd, so it is not
- * a real check, I think... is a check performed somewhere in the
- * AirPDcap function???)
- */
- memcpy(key.KeyData.Wep.WepKey, bytes->data, bytes->len);
- key.KeyData.Wep.WepKeyLen = bytes->len;
- keys->Keys[keys->nKeys] = key;
- keys->nKeys += 1;
- }
- }
- else if (dk->type == AIRPDCAP_KEY_TYPE_WPA_PWD)
- {
- key.KeyType = AIRPDCAP_KEY_TYPE_WPA_PWD;
+ {&hf_ieee80211_ff_vht_mimo_cntrl_nc_index,
+ {"Nc Index", "wlan.vht.mimo_control.ncindex",
+ FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_nc_index_vals), 0x000007,
+ "Number of Columns Less One", HFILL }},
- /* XXX - This just lops the end if the key off if it's too long.
- * Should we handle this more gracefully? */
- g_strlcpy(key.UserPwd.Passphrase, dk->key->str, AIRPDCAP_WPA_PASSPHRASE_MAX_LEN+1);
+ {&hf_ieee80211_ff_vht_mimo_cntrl_nr_index,
+ {"Nr Index", "wlan.vht.mimo_control.nrindex",
+ FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_nr_index_vals), 0x000038,
+ "Number of Rows Less One", HFILL }},
- key.UserPwd.SsidLen = 0;
- if ((dk->ssid != NULL) && (dk->ssid->len <= AIRPDCAP_WPA_SSID_MAX_LEN))
- {
- memcpy(key.UserPwd.Ssid, dk->ssid->data, dk->ssid->len);
- key.UserPwd.SsidLen = dk->ssid->len;
- }
+ {&hf_ieee80211_ff_vht_mimo_cntrl_channel_width,
+ {"Channel Width", "wlan.vht.mimo_control.chanwidth",
+ FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_channel_width_vals), 0x0000C0,
+ NULL, HFILL }},
- keys->Keys[keys->nKeys] = key;
- keys->nKeys += 1;
- }
- else if (dk->type == AIRPDCAP_KEY_TYPE_WPA_PSK)
- {
- key.KeyType = AIRPDCAP_KEY_TYPE_WPA_PSK;
+ {&hf_ieee80211_ff_vht_mimo_cntrl_grouping,
+ {"Grouping (Ng)", "wlan.vht.mimo_control.grouping",
+ FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_grouping_vals), 0x000300,
+ NULL, HFILL }},
- bytes = g_byte_array_new();
- hex_str_to_bytes(dk->key->str, bytes, FALSE);
+ {&hf_ieee80211_ff_vht_mimo_cntrl_codebook_info,
+ {"Codebook Information", "wlan.vht.mimo_control.codebookinfo",
+ FT_UINT24, BASE_HEX, NULL, 0x000400,
+ NULL, HFILL }},
- /* XXX - Pass the correct array of bytes... */
- if (bytes->len <= AIRPDCAP_WPA_PSK_LEN) {
- memcpy(key.KeyData.Wpa.Psk, bytes->data, bytes->len);
+ {&hf_ieee80211_ff_vht_mimo_cntrl_feedback_type,
+ {"Feedback Type", "wlan.vht.mimo_control.feedbacktype",
+ FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_feedback_vals), 0x000800,
+ NULL, HFILL }},
- keys->Keys[keys->nKeys] = key;
- keys->nKeys += 1;
- }
- }
- free_key_string(dk);
- if (bytes) {
- g_byte_array_free(bytes, TRUE);
- bytes = NULL;
- }
- }
- }
+ {&hf_ieee80211_ff_vht_mimo_cntrl_remaining_feedback_seg,
+ {"Remaining Feedback Segments", "wlan.vht.mimo_control.remainingfeedbackseg",
+ FT_UINT24, BASE_HEX, NULL, 0x007000,
+ NULL, HFILL }},
- /* Now set the keys */
- AirPDcapSetKeys(&airpdcap_ctx, keys->Keys, keys->nKeys);
- g_free(keys);
-}
+ {&hf_ieee80211_ff_vht_mimo_cntrl_first_feedback_seg,
+ {"First Feedback Segments", "wlan.vht.mimo_control.firstfeedbackseg",
+ FT_UINT24, BASE_HEX, NULL, 0x008000,
+ NULL, HFILL }},
-static void
-init_wepkeys(void)
-{
+ {&hf_ieee80211_ff_vht_mimo_cntrl_reserved,
+ {"Reserved", "wlan.vht.mimo_control.reserved",
+ FT_UINT24, BASE_HEX, NULL, 0x030000,
+ NULL, HFILL }},
- /*
- * XXX - AirPDcap - That God sends it to us beautiful (che dio ce la mandi bona)
- * The next lines will add a key to the AirPDcap context. The keystring will be added
- * to the old WEP array too, but we don't care, because the packets will come here
- * already decrypted... One of these days we will fix this too
- */
- set_airpdcap_keys();
-}
+ {&hf_ieee80211_ff_vht_mimo_cntrl_sounding_dialog_token_number,
+ {"Sounding Dialog Token Number", "wlan.vht.mimo_control.sounding_dialog_tocken_nbr",
+ FT_UINT24, BASE_HEX, NULL, 0xFC0000,
+ NULL, HFILL }},
-/*
- * This code had been taken from AirSnort crack.c function classify()
- * Permission granted by snax <at> shmoo dot com
- * weak_iv - determine which key byte an iv is useful in resolving
- * parm - p, pointer to the first byte of an IV
- * return - n - this IV is weak for byte n of a WEP key
- * -1 - this IV is not weak for any key bytes
- *
- * This function tests for IVs that are known to satisfy the criteria
- * for a weak IV as specified in FMS section 7.1
- *
- */
-static int
-weak_iv(guchar *iv)
-{
- guchar sum, k;
+ {&hf_ieee80211_ff_vht_action,
+ {"VHT Action", "wlan.vht.action",
+ FT_UINT8, BASE_DEC, VALS(vht_action_vals), 0,
+ NULL, HFILL }},
- if ((iv[1] == 255) && (iv[0] > 2) && (iv[0] < 16)) {
- return iv[0] -3;
- }
+ {&hf_ieee80211_vht_compressed_beamforming_report,
+ {"VHT Compressed Beamforming Report", "wlan.vht.compressed_beamforming_report",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- sum = iv[0] + iv[1];
- if (sum == 1) {
- if (iv[2] <= 0x0a) {
- return iv[2] +2;
- }
- else if (iv[2] == 0xff) {
- return 0;
- }
- }
- k = 0xfe - iv[2];
- if ((sum == k) && ((iv[2] >= 0xf2) && (iv[2] <= 0xfe) && (iv[2] != 0xfd))) {
- return k;
- }
- return -1;
-}
+ {&hf_ieee80211_vht_mu_exclusive_beamforming_report,
+ {"VHT MU Exclusive Beamforming Report","wlan.vht.exclusive_beamforming_report",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
-static void
-wlan_retransmit_init(void)
-{
- if (fc_analyse_retransmit_table) {
- g_hash_table_destroy(fc_analyse_retransmit_table);
- fc_analyse_retransmit_table = NULL;
- }
+ {&hf_ieee80211_vht_compressed_beamforming_report_snr,
+ {"Signal to Noise Ratio (SNR)", "wlan.vht.compressed_beamforming_report.snr",
+ FT_INT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- if (fc_first_frame_table) {
- g_hash_table_destroy(fc_first_frame_table);
- fc_first_frame_table = NULL;
- }
+ {&hf_ieee80211_vht_compressed_beamforming_phi_angle,
+ {"PHI", "wlan.vht.compressed_beamforming_report.phi",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- if (wlan_subdissector)
- return;
+ {&hf_ieee80211_vht_compressed_beamforming_psi_angle,
+ {"PSI", "wlan.vht.compressed_beamforming_report.psi",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- fc_analyse_retransmit_table= g_hash_table_new(retransmit_hash, retransmit_equal);
- fc_first_frame_table = g_hash_table_new(frame_hash, frame_equal);
+ {&hf_ieee80211_vht_compressed_beamforming_feedback_matrix,
+ {"Compressed Beamforming Feedback Matrix", "wlan.vht.compressed_beamforming_report.feedback_matrix",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
-}
+ {&hf_ieee80211_vht_mu_Exclusive_beamforming_delta_snr,
+ {"Delta SNR for space-time stream Nc for subcarrier k", "wlan.vht.exclusive_beamforming_report.delta_snr",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
-static int
-dissect_data_encap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-{
- int offset = 0;
- guint8 type;
- int tagged_parameter_tree_len;
- proto_tree *tagged_tree;
+ {&hf_ieee80211_vht_group_id_management,
+ {"Group ID Management", "wlan.vht.group_id_management",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(tree, hf_ieee80211_data_encap_payload_type, tvb, offset,
- 1, ENC_LITTLE_ENDIAN);
- offset += 1;
- switch (type) {
- case 1:
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "RRB");
- /* TODO: IEEE 802.11r */
- break;
- case 2:
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "TDLS");
- col_clear(pinfo->cinfo, COL_INFO);
- offset += add_ff_action(tree, tvb, pinfo, offset);
- tagged_parameter_tree_len = tvb_reported_length_remaining(tvb, offset);
- if (tagged_parameter_tree_len > 0) {
- tagged_tree = get_tagged_parameter_tree(tree, tvb, offset,
- tagged_parameter_tree_len);
- ieee_80211_add_tagged_parameters(tvb, offset, pinfo, tagged_tree,
- tagged_parameter_tree_len, -1, NULL);
- }
- break;
- }
- return tvb_captured_length(tvb);
-}
+ {&hf_ieee80211_vht_membership_status_array,
+ {"Membership Status Array", "wlan.vht.membership_status_array",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
-void
-proto_register_ieee80211(void)
-{
+ {&hf_ieee80211_vht_user_position_array,
+ {"User Position Array", "wlan.vht.user_position_array",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- static hf_register_info hf[] = {
- {&hf_ieee80211_fc_field,
- {"Frame Control Field", "wlan.fc",
- FT_UINT16, BASE_HEX, NULL, 0,
- "MAC Frame control", HFILL }},
+ {&hf_ieee80211_vht_membership_status_field,
+ {"Membership Status Field", "wlan.vht.membership_status_array.field",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fc_proto_version,
- {"Version", "wlan.fc.version",
- FT_UINT8, BASE_DEC, NULL, 0x03,
- "MAC Protocol version", HFILL }}, /* 0 */
+ {&hf_ieee80211_vht_user_position_field,
+ {"User Position Field", "wlan.vht.user_position_array.field",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fc_frame_type,
- {"Type", "wlan.fc.type",
- FT_UINT8, BASE_DEC, VALS(frame_type), 0x0C,
- "Frame type", HFILL }},
+ {&hf_ieee80211_vht_operation_mode_notification,
+ {"Operation Mode Notification", "wlan.vht.operation_mode_notification",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fc_frame_subtype,
- {"Subtype", "wlan.fc.subtype",
- FT_UINT8, BASE_DEC, NULL, 0xF0,
- "Frame subtype", HFILL }}, /* 2 */
+ {&hf_ieee80211_ff_he_action,
+ {"HE Action", "wlan.he.action",
+ FT_UINT8, BASE_DEC, VALS(he_action_vals), 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fc_frame_type_subtype,
- {"Type/Subtype", "wlan.fc.type_subtype",
- FT_UINT16, BASE_HEX|BASE_EXT_STRING, &frame_type_subtype_vals_ext, 0x0,
- "Type and subtype combined (first byte: type, second byte: subtype)", HFILL }},
+ {&hf_he_mimo_control_nc_index,
+ {"Nc Index", "wlan.he.mimo.nc_index",
+ FT_UINT40, BASE_DEC, NULL, 0x0000000007, NULL, HFILL }},
- {&hf_ieee80211_fc_frame_extension,
- {"Control Frame Extension", "wlan.fc.extension",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mimo_control_nr_index,
+ {"Nr Index", "wlan.he.mimo.nr_index",
+ FT_UINT40, BASE_DEC, NULL, 0x0000000038, NULL, HFILL }},
- {&hf_ieee80211_fc_flags,
- {"Flags", "wlan.flags",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mimo_control_bw,
+ {"BW", "wlan.he.mimo.bw",
+ FT_UINT40, BASE_DEC, NULL, 0x00000000C0, NULL, HFILL }},
- {&hf_ieee80211_fc_data_ds,
- {"DS status", "wlan.fc.ds",
- FT_UINT8, BASE_HEX, VALS(tofrom_ds), (FLAG_FROM_DS|FLAG_TO_DS),
- "Data-frame DS-traversal status", HFILL }}, /* 3 */
+ {&hf_he_mimo_control_grouping,
+ {"Grouping", "wlan.he.mimo.grouping",
+ FT_UINT40, BASE_DEC, NULL, 0x0000000100, NULL, HFILL }},
- {&hf_ieee80211_fc_to_ds,
- {"To DS", "wlan.fc.tods",
- FT_BOOLEAN, 8, TFS(&tods_flag), FLAG_TO_DS,
- "To DS flag", HFILL }}, /* 4 */
+ {&hf_he_mimo_control_codebook_info,
+ {"Codebook Information", "wlan.he.mimo.codebook_info",
+ FT_UINT40, BASE_DEC, NULL, 0x0000000200, NULL, HFILL }},
- {&hf_ieee80211_fc_from_ds,
- {"From DS", "wlan.fc.fromds",
- FT_BOOLEAN, 8, TFS(&fromds_flag), FLAG_FROM_DS,
- "From DS flag", HFILL }}, /* 5 */
+ {&hf_he_mimo_control_feedback_type,
+ {"Feedback Type", "wlan.he.mimo.feedback_type",
+ FT_UINT40, BASE_DEC, NULL, 0x0000000C00, NULL, HFILL }},
- {&hf_ieee80211_fc_more_frag,
- {"More Fragments", "wlan.fc.frag",
- FT_BOOLEAN, 8, TFS(&more_fragments), FLAG_MORE_FRAGMENTS,
- "More Fragments flag", HFILL }}, /* 6 */
+ {&hf_he_mimo_control_remaining_feedback_segs,
+ {"Remaining Feedback Segments", "wlan.he.mimo.remaining_feedback_segs",
+ FT_UINT40, BASE_DEC, NULL, 0x0000007000, NULL, HFILL }},
- {&hf_ieee80211_fc_retry,
- {"Retry", "wlan.fc.retry",
- FT_BOOLEAN, 8, TFS(&retry_flags), FLAG_RETRY,
- "Retransmission flag", HFILL }},
+ {&hf_he_mimo_control_first_feedback_seg,
+ {"First Feedback Segment", "wlan.he.mimo.first_feedback_seg",
+ FT_UINT40, BASE_DEC, NULL, 0x0000008000, NULL, HFILL }},
- { &hf_ieee80211_fc_analysis_retransmission,
- {"Retransmission", "wlan.analysis.retransmission",
- FT_NONE, BASE_NONE, NULL, 0x0,
- "This frame is a suspected wireless retransmission", HFILL }},
+ {&hf_he_mimo_control_ru_start_index,
+ {"RU Start Index", "wlan.he.mimo.ru_start_index",
+ FT_UINT40, BASE_HEX, NULL, 0x00007F0000, NULL, HFILL }},
- { &hf_ieee80211_fc_analysis_retransmission_frame,
- {"Retransmission of frame", "wlan.analysis.retransmission_frame",
- FT_FRAMENUM, BASE_NONE, NULL, 0x0,
- "This is a retransmission of frame #", HFILL }},
+ {&hf_he_mimo_control_ru_end_index,
+ {"RU End Index", "wlan.he.mimo.ru_end_index",
+ FT_UINT40, BASE_HEX, NULL, 0x003F800000, NULL, HFILL }},
- {&hf_ieee80211_fc_pwr_mgt,
- {"PWR MGT", "wlan.fc.pwrmgt",
- FT_BOOLEAN, 8, TFS(&pm_flags), FLAG_POWER_MGT,
- "Power management status", HFILL }},
+ {&hf_he_mimo_control_sounding_dialog_token_num,
+ {"Sounding Dialog Token Number", "wlan.he.mimo.sounding_dialog_token_num",
+ FT_UINT40, BASE_DEC, NULL, 0x0FC0000000, NULL, HFILL }},
- {&hf_ieee80211_fc_more_data,
- {"More Data", "wlan.fc.moredata",
- FT_BOOLEAN, 8, TFS(&md_flags), FLAG_MORE_DATA,
- "More data flag", HFILL }},
+ {&hf_he_mimo_control_reserved,
+ {"Reserved", "wlan.he.mimo.reserved",
+ FT_UINT40, BASE_DEC, NULL, 0xF000000000, NULL, HFILL }},
- {&hf_ieee80211_fc_protected,
- {"Protected flag", "wlan.fc.protected",
- FT_BOOLEAN, 8, TFS(&protected_flags), FLAG_PROTECTED,
- NULL, HFILL }},
+ {&hf_ieee80211_he_mimo_control_field,
+ {"HE MIMO Control", "wlan.he.action.he_mimo_control",
+ FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
- {&hf_ieee80211_fc_order,
- {"Order flag", "wlan.fc.order",
- FT_BOOLEAN, 8, TFS(&order_flags), FLAG_ORDER,
- "Strictly ordered flag", HFILL }},
+ {&hf_ieee80211_tag_tspec_allocation_id,
+ {"Allocation ID", "wlan.dmg_tspec.allocation_id",
+ FT_UINT24, BASE_DEC, NULL, 0x00000f,
+ NULL, HFILL }},
- {&hf_ieee80211_assoc_id,
- {"Association ID", "wlan.aid",
- FT_UINT16, BASE_DEC, NULL, 0x3FFF,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tspec_allocation_type,
+ {"Allocation Type", "wlan.dmg_tspec.allocation_type",
+ FT_UINT24, BASE_DEC, NULL, 0x000070,
+ NULL, HFILL }},
- {&hf_ieee80211_did_duration,
- {"Duration", "wlan.duration",
- FT_UINT16, BASE_DEC, NULL, 0x7FFF,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tspec_allocation_format,
+ {"Allocation Format", "wlan.dmg_tspec.allocation_format",
+ FT_BOOLEAN, 24, NULL, 0x000080,
+ NULL, HFILL }},
- {&hf_ieee80211_addr_da,
- {"Destination address", "wlan.da",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Destination Hardware Address", HFILL }},
+ {&hf_ieee80211_tag_tspec_pseudo_static,
+ {"Pseudo Static", "wlan.dmg_tspec.pseudo_static",
+ FT_BOOLEAN, 24, NULL, 0x000100,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_da_resolved,
- {"Destination address (resolved)", "wlan.da_resolved", FT_STRING,
- BASE_NONE, NULL, 0x0,
- "Destination Hardware Address (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_truncatable,
+ {"Truncatable", "wlan.dmg_tspec.truncatable",
+ FT_BOOLEAN, 24, NULL, 0x000200,
+ NULL, HFILL }},
- {&hf_ieee80211_addr_sa,
- {"Source address", "wlan.sa",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Source Hardware Address", HFILL }},
+ {&hf_ieee80211_tag_tspec_extendable,
+ {"Extendable", "wlan.dmg_tspec.extendable",
+ FT_BOOLEAN, 24, NULL, 0x000400,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_sa_resolved,
- {"Source address (resolved)", "wlan.sa_resolved", FT_STRING,
- BASE_NONE, NULL, 0x0,
- "Source Hardware Address (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_lp_sc_used,
+ {"LP SC Usec", "wlan.dmg_tspec.lp_sc_used",
+ FT_BOOLEAN, 24, NULL, 0x000800,
+ NULL, HFILL }},
- { &hf_ieee80211_addr,
- {"Hardware address", "wlan.addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "SA, DA, BSSID, RA or TA Hardware Address", HFILL }},
+ {&hf_ieee80211_tag_tspec_up,
+ {"UP", "wlan.dmg_tspec.up",
+ FT_UINT24, BASE_HEX, NULL, 0x007000,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_resolved,
- { "Hardware address (resolved)", "wlan.addr_resolved", FT_STRING,
- BASE_NONE, NULL, 0x0,
- "SA, DA, BSSID, RA or TA Hardware Address (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_dest_aid,
+ {"Destination AID", "wlan.dmg_tspec.dest_aid",
+ FT_UINT24, BASE_HEX, NULL, 0x7f8000,
+ NULL, HFILL }},
- {&hf_ieee80211_addr_ra,
- {"Receiver address", "wlan.ra",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Receiving Station Hardware Address", HFILL }},
+ {&hf_ieee80211_tag_tspec_allocation_period,
+ {"Allocation Period", "wlan.dmg_tspec.allocation_period",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_ra_resolved,
- {"Receiver address (resolved)", "wlan.ra_resolved", FT_STRING, BASE_NONE,
- NULL, 0x0, "Receiving Station Hardware Address (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_min_allocation,
+ {"Minimal Allocation", "wlan.dmg_tspec.min_allocation",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_addr_ta,
- {"Transmitter address", "wlan.ta",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Transmitting Station Hardware Address", HFILL }},
+ {&hf_ieee80211_tag_tspec_max_allocation,
+ {"Maximal Allocation", "wlan.dmg_tspec.max_allocation",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_ta_resolved,
- {"Transmitter address (resolved)", "wlan.ta_resolved", FT_STRING,
- BASE_NONE, NULL, 0x0,
- "Transmitting Station Hardware Address (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_min_duration,
+ {"Minimal Duration", "wlan.dmg_tspec.min_duration",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_addr_bssid,
- {"BSS Id", "wlan.bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Basic Service Set ID", HFILL }},
+ {&hf_ieee80211_tag_tspec_num_of_constraints,
+ {"Number Of Constraints", "wlan.dmg_tspec.num_of_constraints",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_bssid_resolved,
- {"BSS Id (resolved)", "wlan.bssid_resolved", FT_STRING, BASE_NONE, NULL,
- 0x0, "Basic Service Set ID (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_tsconst_start_time,
+ {"TS Constraint Start Time", "wlan.dmg_tspec.tsconst.start_time",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_addr_staa,
- {"STA address", "wlan.staa",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Station Hardware Address", HFILL }},
+ {&hf_ieee80211_tag_tspec_tsconst_duration,
+ {"TS Constraint Duration", "wlan.dmg_tspec.tsconst.duration",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- { &hf_ieee80211_addr_staa_resolved,
- {"STA address (resolved)", "wlan.staa_resolved", FT_STRING, BASE_NONE, NULL,
- 0x0, "Station Hardware Address (resolved)", HFILL }},
+ {&hf_ieee80211_tag_tspec_tsconst_period,
+ {"TS Constraint Period", "wlan.dmg_tspec.tsconst.period",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_frag_number,
- {"Fragment number", "wlan.frag",
- FT_UINT16, BASE_DEC, NULL, 0x000F,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tspec_tsconst_interferer_mac,
+ {"TS Constraint Interferer MAC Address", "wlan.dmg_tspec.tsconst.interferer_mac",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_seq_number,
- {"Sequence number", "wlan.seq",
- FT_UINT16, BASE_DEC, NULL, 0xFFF0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_channel_measurement_feedback_realtive_I,
+ {"Channel Measurement Feedback Relative I", "wlan.ch_meas_fb.realtive_I",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_mesh_control_field,
- {"Mesh Control Field", "wlan.mesh.control_field",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_channel_measurement_feedback_realtive_Q,
+ {"Channel Measurement Feedback Relative Q", "wlan.ch_meas_fb.realtive_Q",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos,
- {"Qos Control", "wlan.qos",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_channel_measurement_feedback_tap_delay,
+ {"Channel Measurement Feedback Tap Delay", "wlan.ch_meas_fb.tap_delay",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_tid,
- {"TID", "wlan.qos.tid",
- FT_UINT16, BASE_DEC, NULL, 0x000F,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_channel_measurement_feedback_sector_id,
+ {"Channel Measurement Feedback Secotr ID", "wlan.ch_meas_fb.sector_id",
+ FT_UINT8, BASE_DEC, NULL, 0xfc,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_priority,
- {"Priority", "wlan.qos.priority",
- FT_UINT16, BASE_DEC, VALS(ieee80211_qos_tags_acs), 0x0007,
- "802.1D Tag", HFILL }},
+ {&hf_ieee80211_tag_channel_measurement_feedback_antenna_id,
+ {"Channel Measurement Feedback Antenna ID", "wlan.ch_meas_fb.antenna_id",
+ FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_eosp,
- {"EOSP", "wlan.qos.eosp",
- FT_BOOLEAN, 16, TFS(&eosp_flag), QOS_FLAG_EOSP,
- "EOSP Field", HFILL }},
+ {&hf_ieee80211_tag_awake_window,
+ {"Awake Window", "wlan.awake_window",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_bit4,
- {"QoS bit 4", "wlan.qos.bit4",
- FT_BOOLEAN, 16, TFS(&bit4_flag), QOS_FLAG_EOSP,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_addba_ext_no_frag,
+ {"ADDBA No Fragmentation", "wlan.addba.no_frag",
+ FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_ack_policy,
- {"Ack Policy", "wlan.qos.ack",
- FT_UINT16, BASE_HEX, VALS(ack_policy), 0x0060,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_addba_ext_he_fragmentation_operation,
+ {"ADDBA HE Fragmentation Operation", "wlan.addba.he_frag_oper",
+ FT_UINT8, BASE_HEX, NULL, 0x06,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_amsdu_present,
- {"Payload Type", "wlan.qos.amsdupresent",
- FT_BOOLEAN, 16, TFS(&ieee80211_qos_amsdu_present_flag), 0x0080,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_addba_ext_reserved,
+ {"Reserved", "wlan.addba.he_frag_oper",
+ FT_UINT8, BASE_HEX, NULL, 0xF8,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_txop_limit,
- {"TXOP Limit", "wlan.qos.txop_limit",
- FT_UINT16, BASE_DEC, NULL, 0xFF00,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_ctrl_sta_role,
+ {"STA Rold", "wlan.multi_band.ctrl_sta_role",
+ FT_UINT8, BASE_DEC, NULL, 0xe0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_ps_buf_state,
- {"QAP PS Buffer State", "wlan.qos.ps_buf_state",
- FT_UINT16, BASE_HEX, NULL, 0xFF00,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_ctrl_addr_present,
+ {"STA MAC Address Present", "wlan.multi_band.ctrl_addr_present",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_buf_state_indicated,
- {"Buffer State Indicated", "wlan.qos.buf_state_indicated",
- FT_BOOLEAN, 16, TFS(&tfs_yes_no), 0x0200,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_ctrl_cipher_present,
+ {"PCS Present", "wlan.multi_band.ctrl_cipher_present",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_highest_pri_buf_ac,
- {"Highest-Priority Buffered AC", "wlan.qos.highest_pri_buf_ac",
- FT_UINT16, BASE_DEC, VALS(wme_acs), 0x0C00,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_oper_class,
+ {"Operating Class", "wlan.multi_band.oper_class",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_qap_buf_load,
- {"QAP Buffered Load", "wlan.qos.qap_buf_load",
- FT_UINT16, BASE_DEC, NULL, 0xF000,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_channel_number,
+ {"Channel Number", "wlan.multi_band.channel_number",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_txop_dur_req,
- {"TXOP Duration Requested", "wlan.qos.txop_dur_req",
- FT_UINT16, BASE_DEC, NULL, 0xFF00,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_tsf_offset,
+ {"TSF Offset", "wlan.multi_band.tsf_offset",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_qos_queue_size,
- {"Queue Size", "wlan.qos.queue_size",
- FT_UINT16, BASE_DEC, NULL, 0xFF00,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_conn_ap,
+ {"Connection Capability AP", "wlan.multi_band.conn_ap",
+ FT_BOOLEAN, 8, NULL, 0x80,
+ NULL, HFILL }},
- {&hf_ieee80211_fcs,
- {"Frame check sequence", "wlan.fcs",
- FT_UINT32, BASE_HEX, NULL, 0,
- "Frame Check Sequence (FCS)", HFILL }},
+ {&hf_ieee80211_tag_multi_band_conn_pcp,
+ {"Connection Capability PCP", "wlan.multi_band.conn_pcp",
+ FT_BOOLEAN, 8, NULL, 0x40,
+ NULL, HFILL }},
- {&hf_ieee80211_fcs_status,
- {"FCS Status", "wlan.fcs.status",
- FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_multi_band_conn_dls,
+ {"Connection Capability DLS", "wlan.multi_band.conn_dls",
+ FT_BOOLEAN, 8, NULL, 0x20,
+ NULL, HFILL }},
- {&hf_ieee80211_fragment_overlap,
- {"Fragment overlap", "wlan.fragment.overlap",
- FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "Fragment overlaps with other fragments", HFILL }},
+ {&hf_ieee80211_tag_multi_band_conn_tdls,
+ {"Connection Capability TDLS", "wlan.multi_band.conn_tdls",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL }},
- {&hf_ieee80211_fragment_overlap_conflict,
- {"Conflicting data in fragment overlap", "wlan.fragment.overlap.conflict",
- FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "Overlapping fragments contained conflicting data", HFILL }},
+ {&hf_ieee80211_tag_multi_band_conn_ibss,
+ {"Connection Capability IBSS", "wlan.multi_band.conn_ibss",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }},
- {&hf_ieee80211_fragment_multiple_tails,
- {"Multiple tail fragments found", "wlan.fragment.multipletails",
- FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "Several tails were found when defragmenting the packet", HFILL }},
+ {&hf_ieee80211_tag_multi_band_fst_timeout,
+ {"FST Session Timeout", "wlan.multi_band.fst_timeout",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fragment_too_long_fragment,
- {"Fragment too long", "wlan.fragment.toolongfragment",
- FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "Fragment contained data past end of packet", HFILL }},
+ {&hf_ieee80211_tag_multi_band_sta_mac,
+ {"Transmitting STA MAC Address", "wlan.multi_band.sta_mac",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fragment_error,
- {"Defragmentation error", "wlan.fragment.error",
- FT_FRAMENUM, BASE_NONE, NULL, 0x0,
- "Defragmentation error due to illegal fragments", HFILL }},
+ {&hf_ieee80211_tag_activity,
+ {"Activity", "wlan.activity",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_fragment_count,
- {"Fragment count", "wlan.fragment.count",
- FT_UINT32, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_tag_dmg_link_adapt_mcs,
+ {"MCS", "wlan.dmg_link_adapt.mcs",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_fragment,
- {"802.11 Fragment", "wlan.fragment",
- FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_tag_dmg_link_adapt_link_margin,
+ {"Link Margin", "wlan.dmg_link_adapt.link_margin",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_fragments,
- {"802.11 Fragments", "wlan.fragments",
- FT_NONE, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_tag_ref_timestamp,
+ {"Reference Timestamp", "wlan.ref_timestamp",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_reassembled_in,
- {"Reassembled 802.11 in frame", "wlan.reassembled_in",
- FT_FRAMENUM, BASE_NONE, NULL, 0x0,
- "This 802.11 packet is reassembled in this frame", HFILL }},
+ {&hf_ieee80211_tag_switching_stream_non_qos,
+ {"Non-Qos Data Frames", "wlan.switching_stream.non_qos",
+ FT_BOOLEAN, 8, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_reassembled_length,
- {"Reassembled 802.11 length", "wlan.reassembled.length",
- FT_UINT32, BASE_DEC, NULL, 0x0,
- "The total length of the reassembled payload", HFILL }},
+ {&hf_ieee80211_tag_switching_stream_param_num,
+ {"Number Of Switching Stream Elements", "wlan.switching_stream.param_num",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_wep_iv,
- {"Initialization Vector", "wlan.wep.iv",
- FT_UINT24, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_switching_stream_old_tid,
+ {"Old Band TID", "wlan.switching_stream.old_tid",
+ FT_UINT16, BASE_DEC, NULL, 0xf000,
+ NULL, HFILL }},
- {&hf_ieee80211_wep_iv_weak,
- {"Weak IV", "wlan.wep.weakiv",
- FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- NULL, HFILL}},
+ {&hf_ieee80211_tag_switching_stream_old_direction,
+ {"Old Band Direction", "wlan.switching_stream.old_direction",
+ FT_BOOLEAN, 16, NULL, 0x0800,
+ NULL, HFILL }},
- {&hf_ieee80211_tkip_extiv,
- {"TKIP Ext. Initialization Vector", "wlan.tkip.extiv",
- FT_STRING, BASE_NONE, NULL, 0,
- "TKIP Extended Initialization Vector", HFILL }},
+ {&hf_ieee80211_tag_switching_stream_new_tid,
+ {"New Band TID", "wlan.switching_stream.new_tid",
+ FT_UINT16, BASE_DEC, NULL, 0x0780,
+ NULL, HFILL }},
- {&hf_ieee80211_ccmp_extiv,
- {"CCMP Ext. Initialization Vector", "wlan.ccmp.extiv",
- FT_STRING, BASE_NONE, NULL, 0,
- "CCMP Extended Initialization Vector", HFILL }},
+ {&hf_ieee80211_tag_switching_stream_new_direction,
+ {"New Band Direction", "wlan.switching_stream.new_direction",
+ FT_BOOLEAN, 16, NULL, 0x0040,
+ NULL, HFILL }},
- {&hf_ieee80211_wep_key,
- {"Key Index", "wlan.wep.key",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_switching_stream_new_valid_id,
+ {"Stream ID in New Band Valid", "wlan.switching_stream.new_valid_id",
+ FT_BOOLEAN, 16, NULL, 0x0020,
+ NULL, HFILL }},
- {&hf_ieee80211_wep_icv,
- {"WEP ICV", "wlan.wep.icv",
- FT_UINT32, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_switching_stream_llt_type,
+ {"LLT Type", "wlan.switching_stream.llt_type",
+ FT_BOOLEAN, 16, NULL, 0x0010,
+ NULL, HFILL }},
- {&hf_ieee80211_fc_analysis_pmk,
- {"PMK", "wlan.analysis.pmk",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_ff_timestamp,
+ {"Timestamp", "wlan.fixed.timestamp",
+ FT_UINT64, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_fc_analysis_tk,
- {"TK", "wlan.analysis.tk",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_ff_auth_alg,
+ {"Authentication Algorithm", "wlan.fixed.auth.alg",
+ FT_UINT16, BASE_DEC, VALS(auth_alg), 0,
NULL, HFILL }},
- {&hf_ieee80211_fc_analysis_gtk,
- {"GTK", "wlan.analysis.gtk",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_ff_beacon_interval,
+ {"Beacon Interval", "wlan.fixed.beacon",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_request_control,
- {"Block Ack Request (BAR) Control", "wlan.bar.control",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_fixed_parameters,
+ {"Fixed parameters", "wlan.fixed.all",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_control,
- {"Block Ack Request Control", "wlan.ba.control",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tagged_parameters,
+ {"Tagged parameters", "wlan.tagged.all",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_control_ack_policy,
- {"BAR Ack Policy", "wlan.ba.control.ackpolicy",
- FT_BOOLEAN, 16, TFS(&ieee80211_block_ack_control_ack_policy_flag), 0x01,
- "Block Ack Request (BAR) Ack Policy", HFILL }},
+ {&hf_ieee80211_tag_ssid,
+ {"SSID", "wlan.ssid",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Indicates the identity of an ESS or IBSS", HFILL }},
- {&hf_ieee80211_block_ack_control_multi_tid,
- {"Multi-TID", "wlan.ba.control.multitid",
- FT_BOOLEAN, 16, 0, 0x02,
- "Multi-Traffic Identifier (TID)", HFILL }},
+ {&hf_ieee80211_tag_supp_rates,
+ {"Supported Rates", "wlan.supported_rates",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_supported_rates_vals_ext, 0x0,
+ "In Mbit/sec, (B) for Basic Rates", HFILL }},
- {&hf_ieee80211_block_ack_control_compressed_bitmap,
- {"Compressed Bitmap", "wlan.ba.control.cbitmap",
- FT_BOOLEAN, 16, 0, 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_fh_dwell_time,
+ {"Dwell Time", "wlan.fh.dwell_time",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "In Time Unit (TU)", HFILL }},
- {&hf_ieee80211_block_ack_control_reserved,
- {"Reserved", "wlan.ba.control.reserved",
- FT_UINT16, BASE_HEX, NULL, 0x0ff8,
+ {&hf_ieee80211_tag_fh_hop_set,
+ {"Hop Set", "wlan.fh.hop_set",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_control_basic_tid_info,
- {"TID for which a Basic BlockAck frame is requested", "wlan.ba.basic.tidinfo",
- FT_UINT16, BASE_HEX, NULL, 0xf000,
- "Traffic Identifier (TID) for which a Basic BlockAck frame is requested", HFILL }},
-
- {&hf_ieee80211_block_ack_control_compressed_tid_info,
- {"TID for which a BlockAck frame is requested", "wlan.bar.compressed.tidinfo",
- FT_UINT16, BASE_HEX, NULL, 0xf000,
- "Traffic Identifier (TID) for which a BlockAck frame is requested", HFILL }},
-
- {&hf_ieee80211_block_ack_control_multi_tid_info,
- {"Number of TIDs Present", "wlan.ba.mtid.tidinfo",
- FT_UINT16, BASE_HEX, NULL, 0xf000,
- "Number of Traffic Identifiers (TIDs) Present", HFILL }},
-
- {&hf_ieee80211_block_ack_multi_tid_info,
- {"Traffic Identifier (TID) Info", "wlan.ba.mtid.tid",
- FT_UINT8, BASE_DEC, 0, 0,
+ {&hf_ieee80211_tag_fh_hop_pattern,
+ {"Hop Pattern", "wlan.fh.hop_pattern",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_multi_tid_reserved,
- {"Reserved", "wlan.bar.mtid.tidinfo.reserved",
- FT_UINT16, BASE_HEX, 0, 0x0fff,
+ {&hf_ieee80211_tag_fh_hop_index,
+ {"Hop Index", "wlan.fh.hop_index",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_multi_tid_value,
- {"Multi-TID Value", "wlan.bar.mtid.tidinfo.value",
- FT_UINT16, BASE_HEX, 0, 0xf000,
+ {&hf_ieee80211_ff_block_ack_params,
+ {"Block Ack Parameters", "wlan.fixed.baparams",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_request_type,
- {"Block Ack Request Type", "wlan.bar.type",
- FT_UINT8, BASE_HEX, VALS(ieee80211_block_ack_request_type_flags), 0x06,
- "Block Ack Request (BAR) Type", HFILL }},
+ {&hf_ieee80211_ff_block_ack_params_amsdu_permitted,
+ {"A-MSDUs", "wlan.fixed.baparams.amsdu",
+ FT_BOOLEAN, 16, TFS(&ff_block_ack_params_amsdu_permitted_flag), 0x0001,
+ "A-MSDU Permitted in QoS Data MPDUs", HFILL }},
- {&hf_ieee80211_block_ack_type,
- {"Block Ack Type", "wlan.ba.type",
- FT_UINT8, BASE_HEX, VALS(ieee80211_block_ack_type_flags), 0x06,
+ {&hf_ieee80211_ff_block_ack_params_policy,
+ {"Block Ack Policy", "wlan.fixed.baparams.policy",
+ FT_BOOLEAN, 16, TFS(&ff_block_ack_params_policy_flag), 0x0002,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_bitmap,
- {"Block Ack Bitmap", "wlan.ba.bm",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_block_ack_params_tid,
+ {"Traffic Identifier", "wlan.fixed.baparams.tid",
+ FT_UINT16, BASE_HEX, NULL, 0x003C,
NULL, HFILL }},
- /* Used for Extended compressed BlockAck */
- {&hf_ieee80211_block_ack_RBUFCAP,
- {"Block Ack RBUFCAP", "wlan.ba.RBUFCAP",
- FT_BOOLEAN, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_block_ack_params_buffer_size,
+ {"Number of Buffers (1 Buffer = 2304 Bytes)", "wlan.fixed.baparams.buffersize",
+ FT_UINT16, BASE_DEC, NULL, 0xFFC0,
+ "Number of Buffers", HFILL }},
+
+ {&hf_ieee80211_ff_block_ack_timeout,
+ {"Block Ack Timeout", "wlan.fixed.batimeout",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_block_ack_bitmap_missing_frame,
- {"Missing frame", "wlan.ba.bm.missing_frame",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_block_ack_ssc,
+ {"Block Ack Starting Sequence Control (SSC)", "wlan.fixed.ssc",
+ FT_UINT16, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_beamform_feedback_seg_retrans_bitmap,
- {"Feedback segment Retansmission Bitmap", "wlan.beamform.feedback_seg_retrans_bitmap",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_block_ack_ssc_fragment,
+ {"Fragment", "wlan.fixed.ssc.fragment",
+ FT_UINT16, BASE_DEC, 0, 0x000f,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_token,
- {"Sounding Dialog Token", "wlan.vht_ndp.token",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_block_ack_ssc_sequence,
+ {"Starting Sequence Number", "wlan.fixed.ssc.sequence",
+ FT_UINT16, BASE_DEC, 0, 0xfff0,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_token_number,
- {"Sounding Dialog Token Number", "wlan.vht_ndp.token.number",
- FT_UINT8, BASE_DEC, NULL, 0xFC,
+ {&hf_ieee80211_ff_delba_param,
+ {"Delete Block Ack (DELBA) Parameter Set", "wlan.fixed.delba.param",
+ FT_UINT16, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_token_reserved,
- {"Reserved", "wlan.vht_ndp.token.reserved",
- FT_UINT8, BASE_HEX, NULL, 0x03,
+ {&hf_ieee80211_ff_delba_param_reserved,
+ {"Reserved", "wlan.fixed.delba.param.reserved",
+ FT_UINT16, BASE_HEX, 0, 0x07ff,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_sta_info,
- {"STA Info", "wlan.vht_ndp.sta_info",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_delba_param_init,
+ {"Initiator", "wlan.fixed.delba.param.initiator",
+ FT_BOOLEAN, 16, 0, 0x0800,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_sta_info_aid12,
- {"AID12", "wlan.vht_ndp.sta_info.aid12",
- FT_UINT16, BASE_HEX, NULL, 0x0FFF,
- "12 least significant bits of the AID of the target STA", HFILL }},
+ {&hf_ieee80211_ff_delba_param_tid,
+ {"TID", "wlan.fixed.delba.param.tid",
+ FT_UINT16, BASE_HEX, 0, 0xf000,
+ "Traffic Identifier (TID)", HFILL }},
- {&hf_ieee80211_vht_ndp_annc_sta_info_feedback_type,
- {"Feedback Type", "wlan.vht_ndp.sta_info.feedback_type",
- FT_BOOLEAN, 16, TFS(&vht_ndp_annc_sta_info_feedback_type), 0x1000,
+ {&hf_ieee80211_ff_max_reg_pwr,
+ {"Maximum Regulation Power", "wlan.fixed.maxregpwr",
+ FT_UINT16, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_sta_info_nc_index,
- {"Nc Index", "wlan.vht_ndp.sta_info.nc_index",
- FT_UINT16, BASE_DEC, VALS(num_plus_one_3bit_flag), 0xE000,
+ {&hf_ieee80211_ff_measurement_pilot_int,
+ {"Measurement Pilot Interval", "wlan.fixed.msmtpilotint",
+ FT_UINT8, BASE_HEX, 0, 0,
+ "Measurement Pilot Interval Fixed Field", HFILL }},
+
+ {&hf_ieee80211_ff_country_str,
+ {"Country String", "wlan.fixed.country",
+ FT_STRING, BASE_NONE, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_vht_ndp_annc_sta_info_reserved,
- {"Reserved", "wlan.vht_ndp.sta_info.reserved",
- FT_UINT16, BASE_HEX, NULL, 0xE000,
+ {&hf_ieee80211_ff_max_tx_pwr,
+ {"Maximum Transmit Power", "wlan.fixed.maxtxpwr",
+ FT_UINT8, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_data_encap_payload_type,
- {"Payload Type", "wlan.data_encap.payload_type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_data_encap_payload_types), 0,
+ {&hf_ieee80211_ff_tx_pwr_used,
+ {"Transmit Power Used", "wlan.fixed.txpwr",
+ FT_UINT8, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_tdls_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tdls_action_codes_ext, 0,
- "Management action code", HFILL }},
-
- {&hf_ieee80211_ff_target_channel,
- {"Target Channel", "wlan.fixed.target_channel",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_transceiver_noise_floor,
+ {"Transceiver Noise Floor", "wlan.fixed.tnoisefloor",
+ FT_UINT8, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_operating_class,
- {"Operating Class", "wlan.fixed.operating_class",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_channel_width,
+ {"Supported Channel Width", "wlan.fixed.chanwidth",
+ FT_UINT8, BASE_HEX, VALS(ff_channel_width_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_wnm_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &wnm_action_codes_ext, 0,
- "Management action code", HFILL }},
-
- {&hf_ieee80211_ff_unprotected_wnm_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &unprotected_wnm_action_codes_ext, 0,
- "Management action code", HFILL }},
+ {&hf_ieee80211_ff_qos_info_ap,
+ {"QoS Information (AP)", "wlan.fixed.qosinfo.ap",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_key_data,
- {"Key Data", "wlan.fixed.key_data",
- FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ff_qos_info_ap_edca_param_set_counter,
+ {"EDCA Parameter Set Update Count", "wlan.fixed.qosinfo.ap.edcaupdate",
+ FT_UINT8, BASE_HEX, NULL, 0x0F,
+ "Enhanced Distributed Channel Access (EDCA) Parameter Set Update Count", HFILL }},
- {&hf_ieee80211_ff_key_data_length,
- {"Key Data Length", "wlan.fixed.key_data_length",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ff_qos_info_ap_q_ack,
+ {"Q-Ack", "wlan.fixed.qosinfo.ap.qack",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_q_ack_flag), 0x10,
+ "QoS Ack", HFILL }},
- {&hf_ieee80211_ff_wnm_notification_type,
- {"WNM-Notification type", "wlan.fixed.wnm_notification_type",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &wnm_notification_types_ext, 0,
+ {&hf_ieee80211_ff_qos_info_ap_queue_req,
+ {"Queue Request", "wlan.fixed.qosinfo.ap.queue_req",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_queue_req_flag), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_ff_rm_action_code,
- {"Action code", "wlan.rm.action_code",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &rm_action_codes_ext, 0,
- "Radio Measurement Action", HFILL }},
+ {&hf_ieee80211_ff_qos_info_ap_txop_request,
+ {"TXOP Request", "wlan.fixed.qosinfo.ap.txopreq",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_txop_request_flag), 0x40,
+ "Transmit Opportunity (TXOP) Request", HFILL }},
- {&hf_ieee80211_ff_rm_dialog_token,
- {"Dialog token", "wlan.rm.dialog_token",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Non-zero Dialog Token identifies request/report transaction", HFILL }},
+ {&hf_ieee80211_ff_qos_info_ap_reserved,
+ {"Reserved", "wlan.fixed.qosinfo.ap.reserved",
+ FT_BOOLEAN, 8, NULL, 0x80,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_rm_repetitions,
- {"Repetitions", "wlan.rm.repetitions",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Numer of Repetitions, 65535 indicates repeat until cancellation", HFILL }},
+ {&hf_ieee80211_ff_qos_info_sta,
+ {"QoS Information (STA)", "wlan.fixed.qosinfo.sta",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "TCLAS Processing", HFILL }},
- {&hf_ieee80211_ff_rm_tx_power,
- {"Transmit Power Used", "wlan.rm.tx_power",
- FT_INT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_qos_info_sta_ac_vo,
+ {"AC_VO U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_vo",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_ff_rm_max_tx_power,
- {"Max Transmit Power", "wlan.rm.max_tx_power",
- FT_INT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_qos_info_sta_ac_vi,
+ {"AC_VI U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_vi",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_ff_tpc,
- {"TPC Report", "wlan.rm.tpc",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_qos_info_sta_ac_bk,
+ {"AC_BK U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_bk",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_ff_tpc_element_id,
- {"TPC Element ID", "wlan.rm.tpc.element_id",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_qos_info_sta_ac_be,
+ {"AC_BE U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_be",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_ff_tpc_length,
- {"TPC Length", "wlan.rm.tpc.length",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Length of TPC Report element (always 2)", HFILL }},
+ {&hf_ieee80211_ff_qos_info_sta_q_ack,
+ {"Q-Ack", "wlan.fixed.qosinfo.sta.qack",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_q_ack_flag), 0x10,
+ "QoS Ack", HFILL }},
- {&hf_ieee80211_ff_tpc_tx_power,
- {"TPC Transmit Power", "wlan.rm.tpc.tx_power",
- FT_INT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_qos_info_sta_max_sp_length,
+ {"Max SP Length", "wlan.fixed.qosinfo.sta.max_sp_length",
+ FT_UINT8, BASE_HEX, VALS(ff_qos_info_sta_max_sp_len_flags) , 0x60,
NULL, HFILL }},
- {&hf_ieee80211_ff_tpc_link_margin,
- {"TPC Link Margin", "wlan.rm.tpc.link_margin",
- FT_INT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_qos_info_sta_more_data_ack,
+ {"More Data Ack", "wlan.fixed.qosinfo.sta.more_data_ack",
+ FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_more_data_ack_flag), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_ff_rm_rx_antenna_id,
- {"Receive Antenna ID", "wlan.rm.rx_antenna_id",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_sm_pwr_save,
+ {"Spatial Multiplexing (SM) Power Control", "wlan.fixed.sm.powercontrol",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_rm_tx_antenna_id,
- {"Transmit Antenna ID", "wlan.rm.tx_antenna_id",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_sm_pwr_save_enabled,
+ {"SM Power Save", "wlan.fixed.sm.powercontrol.enabled",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ "Spatial Multiplexing (SM) Power Save", HFILL }},
- {&hf_ieee80211_ff_rm_rcpi,
- {"Received Channel Power", "wlan.rm.rcpi",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_sm_pwr_save_sm_mode,
+ {"SM Mode", "wlan.fixed.sm.powercontrol.mode",
+ FT_BOOLEAN, 8, TFS(&ff_sm_pwr_save_sm_mode_flag), 0x02,
+ "Spatial Multiplexing (SM) Mode", HFILL }},
- {&hf_ieee80211_ff_rm_rsni,
- {"Received Signal to noise indication", "wlan.rm.rsni",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_sm_pwr_save_reserved,
+ {"Reserved", "wlan.fixed.sm.powercontrol.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xFC,
NULL, HFILL }},
- {&hf_ieee80211_ff_request_mode_pref_cand,
- {"Preferred Candidate List Included", "wlan.fixed.request_mode.pref_cand",
- FT_UINT8, BASE_DEC, NULL, 0x01,
+ {&hf_ieee80211_ff_pco_phase_cntrl,
+ {"Phased Coexistence Operation (PCO) Phase Control", "wlan.fixed.pco.phasecntrl",
+ FT_BOOLEAN, BASE_NONE, TFS(&ff_pco_phase_cntrl_flag), 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_request_mode_abridged,
- {"Abridged", "wlan.fixed.request_mode.abridged",
- FT_UINT8, BASE_DEC, NULL, 0x02,
+ {&hf_ieee80211_ff_psmp_param_set,
+ {"Power Save Multi-Poll (PSMP) Parameter Set", "wlan.fixed.psmp.paramset",
+ FT_UINT16, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_request_mode_disassoc_imminent,
- {"Disassociation Imminent", "wlan.fixed.request_mode.disassoc_imminent",
- FT_UINT8, BASE_DEC, NULL, 0x04,
+ {&hf_ieee80211_ff_psmp_param_set_n_sta,
+ {"Number of STA Info Fields Present", "wlan.fixed.psmp.paramset.nsta",
+ FT_UINT16, BASE_HEX, 0, 0x000F,
NULL, HFILL }},
- {&hf_ieee80211_ff_request_mode_bss_term_included,
- {"BSS Termination Included", "wlan.fixed.request_mode.bss_term_included",
- FT_UINT8, BASE_DEC, NULL, 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_psmp_param_set_more_psmp,
+ {"More PSMP", "wlan.fixed.psmp.paramset.more",
+ FT_BOOLEAN, 16, TFS(&ff_psmp_param_set_more_psmp_flag), 0x0010,
+ "More Power Save Multi-Poll (PSMP)", HFILL }},
- {&hf_ieee80211_ff_request_mode_ess_disassoc_imminent,
- {"ESS Disassociation Imminent", "wlan.fixed.request_mode.ess_disassoc_imminent",
- FT_UINT8, BASE_DEC, NULL, 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_psmp_param_set_psmp_sequence_duration,
+ {"PSMP Sequence Duration [us]", "wlan.fixed.psmp.paramset.seqduration",
+ FT_UINT16, BASE_DEC, 0, 0xFFE0,
+ "Power Save Multi-Poll (PSMP) Sequence Duration", HFILL }},
- {&hf_ieee80211_ff_disassoc_timer,
- {"Disassociation Timer", "wlan.fixed.disassoc_timer",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl,
+ {"MIMO Control", "wlan.fixed.mimo.control",
+ FT_BYTES, BASE_NONE, 0, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bss_termination_delay,
- {"BSS Termination Delay", "wlan.fixed.bss_termination_delay",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_nc_index,
+ {"Nc Index", "wlan.fixed.mimo.control.ncindex",
+ FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_nc_index_flags), 0x0003,
+ "Number of Columns Less One", HFILL }},
+
+ {&hf_ieee80211_ff_mimo_cntrl_nr_index,
+ {"Nr Index", "wlan.fixed.mimo.control.nrindex",
+ FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_nr_index_flags), 0x000C,
+ "Number of Rows Less One", HFILL }},
+
+ {&hf_ieee80211_ff_mimo_cntrl_channel_width,
+ {"Channel Width", "wlan.fixed.mimo.control.chanwidth",
+ FT_BOOLEAN, 16, TFS(&ff_mimo_cntrl_channel_width_flag), 0x0010,
NULL, HFILL }},
- {&hf_ieee80211_ff_bss_transition_status_code,
- {"BSS Transition Status Code", "wlan.fixed.bss_transition_status_code",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_grouping,
+ {"Grouping (Ng)", "wlan.fixed.mimo.control.grouping",
+ FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_grouping_flags), 0x0060,
NULL, HFILL }},
- {&hf_ieee80211_ff_validity_interval,
- {"Validity Interval", "wlan.fixed.validity_interval",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_coefficient_size,
+ {"Coefficient Size (Nb)", "wlan.fixed.mimo.control.cosize",
+ FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_coefficient_size_flags), 0x0180,
NULL, HFILL }},
- {&hf_ieee80211_ff_bss_termination_duration,
- {"BSS Termination Duration", "wlan.fixed.bss_termination_duration",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_codebook_info,
+ {"Codebook Information", "wlan.fixed.mimo.control.codebookinfo",
+ FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_codebook_info_flags), 0x0600,
NULL, HFILL }},
- {&hf_ieee80211_ff_url_len,
- {"Session Information URL Length",
- "wlan.fixed.session_information.url_length",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment,
+ {"Remaining Matrix Segment", "wlan.fixed.mimo.control.matrixseg",
+ FT_UINT16, BASE_HEX, 0, 0x3800,
NULL, HFILL }},
- {&hf_ieee80211_ff_url,
- {"Session Information URL", "wlan.fixed.session_information.url",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_reserved,
+ {"Reserved", "wlan.fixed.mimo.control.reserved",
+ FT_UINT16, BASE_HEX, 0, 0xC000,
NULL, HFILL }},
- {&hf_ieee80211_ff_target_bss,
- {"BSS Transition Target BSS", "wlan.fixed.bss_transition_target_bss",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_mimo_cntrl_sounding_timestamp,
+ {"Sounding Timestamp", "wlan.fixed.mimo.control.soundingtime",
+ FT_UINT32, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bss_transition_query_reason,
- {"BSS Transition Query Reason", "wlan.fixed.bss_transition_query_reason",
- FT_UINT8, BASE_DEC, VALS(ieee80211_transition_reasons), 0,
+ {&hf_ieee80211_ff_psmp_sta_info,
+ {"Power Save Multi-Poll (PSMP) Station Information", "wlan.fixed.psmp.stainfo",
+ FT_UINT64, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bss_transition_candidate_list_entries,
- {"BSS Transition Candidate List Entries", "wlan.fixed.bss_transition_candidate_list_entries",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_psmp_sta_info_type,
+ {"Sta Info Type", "wlan.fixed.psmp.stainfo.type",
+ FT_UINT32, BASE_HEX, VALS(ff_psmp_sta_info_flags), PSMP_STA_INFO_FLAG_TYPE,
NULL, HFILL }},
-/* 802.11ad */
- {&hf_ieee80211_cf_response_offset,
- {"Response Offset", "wlan.res_offset",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_psmp_sta_info_dtt_start_offset,
+ {"DTT Start Offset", "wlan.fixed.psmp.stainfo.dttstart",
+ FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_DTT_START,
NULL, HFILL }},
- {&hf_ieee80211_grant_ack_reserved,
- {"Reserved", "wlan.grant_ack.reserved",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ff_psmp_sta_info_dtt_duration,
+ {"DTT Duration", "wlan.fixed.psmp.stainfo.dttduration",
+ FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_DTT_DURATION,
NULL, HFILL }},
- {&hf_ieee80211_ff_dynamic_allocation,
- {"Dynamic Allocation", "wlan.dynamic_allocation",
- FT_UINT40, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_psmp_sta_info_sta_id,
+ {"Target Station ID", "wlan.fixed.psmp.stainfo.staid",
+ FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_STA_ID,
NULL, HFILL }},
- {&hf_ieee80211_ff_TID,
- {"TID", "wlan.dynamic_allocation.tid",
- FT_UINT40, BASE_DEC, NULL, 0x000000000F,
+ {&hf_ieee80211_ff_psmp_sta_info_utt_start_offset,
+ {"UTT Start Offset", "wlan.fixed.psmp.stainfo.uttstart",
+ FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_UTT_START,
NULL, HFILL }},
- {&hf_ieee80211_ff_alloc_type,
- {"Allocation Type", "wlan.dynamic_allocation.alloc_type",
- FT_UINT40, BASE_DEC, NULL, 0x000000070,
+ {&hf_ieee80211_ff_psmp_sta_info_utt_duration,
+ {"UTT Duration", "wlan.fixed.psmp.stainfo.uttduration",
+ FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_UTT_DURATION,
NULL, HFILL }},
- {&hf_ieee80211_ff_src_aid,
- {"Source AID", "wlan.dynamic_allocation.src_aid",
- FT_UINT40, BASE_DEC, NULL, 0x0000007F80,
+ {&hf_ieee80211_ff_psmp_sta_info_reserved_small,
+ {"Reserved", "wlan.fixed.psmp.stainfo.reserved",
+ FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_IA_RESERVED,
NULL, HFILL }},
- {&hf_ieee80211_ff_dest_aid,
- {"Destination AID", "wlan.dynamic_allocation.dest_aid",
- FT_UINT40, BASE_DEC, NULL, 0x00007f8000,
+ {&hf_ieee80211_ff_psmp_sta_info_reserved_large,
+ {"Reserved", "wlan.fixed.psmp.stainfo.reserved64",
+ FT_UINT64, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_alloc_duration,
- {"Allocation Duration", "wlan.dynamic_allocation.alloc_duration",
- FT_UINT40, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0x7FFF800000,
+ {&hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id,
+ {"Power Save Multi-Poll (PSMP) Multicast ID", "wlan.fixed.psmp.stainfo.multicastid",
+ FT_UINT64, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_b39,
- {"Reserved (b39)", "wlan.dynamic_allocation.b39",
- FT_UINT40, BASE_HEX, NULL, 0x8000000000,
+ {&hf_ieee80211_ff_ant_selection,
+ {"Antenna Selection", "wlan.fixed.antsel",
+ FT_UINT8, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_ssw,
- {"Sector Sweep", "wlan.ssw",
- FT_UINT24, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_ant_selection_0,
+ {"Antenna 0", "wlan.fixed.antsel.ant0",
+ FT_UINT8, BASE_HEX, 0, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_ff_ssw_direction,
- {"Sector Sweep Direction", "wlan.ssw.direction",
- FT_BOOLEAN, 24, TFS(&ieee80211_cf_ssw_direction), 0x000001,
- NULL, HFILL}},
+ {&hf_ieee80211_ff_ant_selection_1,
+ {"Antenna 1", "wlan.fixed.antsel.ant1",
+ FT_UINT8, BASE_HEX, 0, 0x02,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_ssw_cdown,
- {"Sector Sweep CDOWN", "wlan.ssw.cdown",
- FT_UINT24, BASE_DEC, NULL, 0x0003fe,
+ {&hf_ieee80211_ff_ant_selection_2,
+ {"Antenna 2", "wlan.fixed.antsel.ant2",
+ FT_UINT8, BASE_HEX, 0, 0x04,
NULL, HFILL }},
- {&hf_ieee80211_ff_ssw_sector_id,
- {"Sector Sweep Sector ID", "wlan.ssw.sector_id",
- FT_UINT24, BASE_DEC, NULL, 0x00fc00,
+ {&hf_ieee80211_ff_ant_selection_3,
+ {"Antenna 3", "wlan.fixed.antsel.ant3",
+ FT_UINT8, BASE_HEX, 0, 0x08,
NULL, HFILL }},
- {&hf_ieee80211_ff_ssw_dmg_ant_id,
- {"Sector Sweep DMG Antenna ID", "wlan.ssw.dmg_ant_id",
- FT_UINT24, BASE_DEC, NULL, 0x030000,
+ {&hf_ieee80211_ff_ant_selection_4,
+ {"Antenna 4", "wlan.fixed.antsel.ant4",
+ FT_UINT8, BASE_HEX, 0, 0x10,
NULL, HFILL }},
- {&hf_ieee80211_ff_ssw_rxss_len,
- {"Sector Sweep RXSS Length", "wlan.ssw.rxss_len",
- FT_UINT24, BASE_DEC, NULL, 0xfc0000,
+ {&hf_ieee80211_ff_ant_selection_5,
+ {"Antenna 5", "wlan.fixed.antsel.ant5",
+ FT_UINT8, BASE_HEX, 0, 0x20,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf,
- {"Beam Forming", "wlan.bf",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_ant_selection_6,
+ {"Antenna 6", "wlan.fixed.antsel.ant6",
+ FT_UINT8, BASE_HEX, 0, 0x40,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_train,
- {"Beam Forming Training", "wlan.bf.train",
- FT_BOOLEAN, 16, NULL, 0x0001,
+ {&hf_ieee80211_ff_ant_selection_7,
+ {"Antenna 7", "wlan.fixed.antsel.ant7",
+ FT_UINT8, BASE_HEX, 0, 0x80,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_is_init,
- {"Beam Forming Is InitiatorTXSS", "wlan.bf.isInit",
- FT_BOOLEAN, 16, NULL, 0x0002,
+ {&hf_ieee80211_ff_ext_channel_switch_announcement,
+ {"Extended Channel Switch Announcement", "wlan.fixed.extchansw",
+ FT_UINT32, BASE_HEX, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_is_resp,
- {"Beam Forming Is ResponderTXSS", "wlan.bf.isResp",
- FT_BOOLEAN, 16, NULL, 0x0004,
+ {&hf_ieee80211_ff_ext_channel_switch_announcement_switch_mode,
+ {"Channel Switch Mode", "wlan.fixed.extchansw.switchmode",
+ FT_UINT32, BASE_HEX, VALS(ieee80211_tag_ext_channel_switch_announcement_switch_mode_flags), 0x000000FF,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_rxss_len,
- {"Beam Forming RXSS Length", "wlan.bf.rxss_len",
- FT_UINT16, BASE_DEC, NULL, 0x01f8,
+ {&hf_ieee80211_ff_ext_channel_switch_announcement_new_ope_class,
+ {"New Operating Class", "wlan.fixed.extchansw.new.opeclass",
+ FT_UINT32, BASE_HEX, NULL, 0x0000FF00,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_rxss_rate,
- {"Beam Forming RXSS Rate", "wlan.bf.rxss_rate",
- FT_BOOLEAN, 16, NULL, 0x0200,
+ {&hf_ieee80211_ff_ext_channel_switch_announcement_new_chan_number,
+ {"New Channel Number", "wlan.fixed.extchansw.new.channumber",
+ FT_UINT32, BASE_HEX, NULL, 0x00FF0000,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_b10b15,
- {"Reserved (B10-B15)", "wlan.bf.reserved",
- FT_UINT16, BASE_DEC, NULL, 0xFC00,
+ {&hf_ieee80211_ff_ext_channel_switch_announcement_switch_count,
+ {"Channel Switch Count", "wlan.extchanswitch.switchcount",
+ FT_UINT32, BASE_HEX, NULL, 0xFF000000,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_num_sectors,
- {"Beam Forming Total Number of Sectors", "wlan.bf.num_sectors",
- FT_UINT16, BASE_DEC, NULL, 0x03f8,
+ {&hf_ieee80211_ff_ht_info,
+ {"HT Information", "wlan.fixed.extchansw",
+ FT_UINT8, BASE_HEX, 0, 0,
+ "HT Information Fixed Field", HFILL }},
+
+ {&hf_ieee80211_ff_ht_info_information_request,
+ {"Information Request", "wlan.fixed.mimo.control.chanwidth",
+ FT_BOOLEAN, 8, TFS(&ff_ht_info_information_request_flag), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_num_rx_dmg_ants,
- {"Beam Forming Number of DMG Antennas", "wlan.bf.num_dmg_ants",
- FT_UINT16, BASE_DEC, NULL, 0x0c00,
+ {&hf_ieee80211_ff_ht_info_40_mhz_intolerant,
+ {"40 MHz Intolerant", "wlan.fixed.mimo.control.chanwidth",
+ FT_BOOLEAN, 8, TFS(&ff_ht_info_40_mhz_intolerant_flag), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_ff_bf_b12b15,
- {"Reserved (B12-B15)", "wlan.bf.reserved",
- FT_UINT16, BASE_DEC, NULL, 0xF000,
+ {&hf_ieee80211_ff_ht_info_sta_chan_width,
+ {"Station Channel Width", "wlan.fixed.mimo.control.chanwidth",
+ FT_BOOLEAN, 8, TFS(&ff_ht_info_sta_chan_width_flag), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_addr_nav_da,
- {"Destination address of STA that caused NAV update", "wlan.nav_da",
- FT_ETHER, BASE_NONE, NULL, 0,
- "DMG Destination Hardware Address", HFILL }},
+ {&hf_ieee80211_ff_ht_info_reserved,
+ {"Reserved", "wlan.fixed.extchansw",
+ FT_UINT8, BASE_HEX, 0, 0xF8,
+ "Reserved Field", HFILL }},
- {&hf_ieee80211_addr_nav_sa,
- {"Source address of STA that caused NAV update", "wlan.nav_sa",
- FT_ETHER, BASE_NONE, NULL, 0,
- "DMG Source Hardware Address", HFILL }},
+ {&hf_ieee80211_ff_ht_action,
+ {"HT Action", "wlan.fixed.htact",
+ FT_UINT8, BASE_HEX, VALS(ff_ht_action_flags), 0,
+ "HT Action Code", HFILL }},
- {&hf_ieee80211_ff_sswf,
- {"Sector Sweep Feedback", "wlan.sswf",
- FT_UINT24, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_mimo_csi_snr,
+ {"Signal to Noise Ratio (SNR)", "wlan.mimo.csimatrices.snr",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_sswf_total_sectors,
- {"Sector Sweep Feedback total number of sectors", "wlan.sswf.num_sectors",
- FT_UINT24, BASE_DEC, NULL, 0x0001ff,
+ {&hf_ieee80211_ff_mimo_csi_matrices,
+ {"CSI Matrices", "wlan.mimo.csimatrices",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_sswf_num_rx_dmg_ants,
- {"Sector Sweep Feedback Number of receive DMG Antennas", "wlan.sswf.num_dmg_ants",
- FT_UINT24, BASE_DEC, NULL, 0x000600,
+ {&hf_ieee80211_ff_mimo_csi_bf_matrices,
+ {"Beamforming Feedback Matrices", "wlan.mimo.csimatrices.bf",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_sswf_poll_required,
- {"Sector Sweep Feedback Poll required", "wlan.sswf.poll",
- FT_BOOLEAN, 24, NULL, 0x010000,
+ {&hf_ieee80211_ff_mimo_csi_cbf_matrices,
+ {"Compressed Beamforming Feedback Matrices", "wlan.mimo.csimatrices.cbf",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
+ {&hf_ieee80211_ff_public_action,
+ {"Public Action", "wlan.fixed.publicact",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ff_pa_action_codes_ext, 0,
+ "Public Action Code", HFILL }},
- {&hf_ieee80211_ff_sswf_reserved1,
- {"Sector Sweep Feedback Reserved", "wlan.sswf.reserved",
- FT_UINT24, BASE_HEX, NULL, 0x00F800,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_protected_public_action,
+ {"Protected Public Action", "wlan.fixed.publicact",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ff_ppa_action_codes_ext, 0,
+ "Protected Public Action Code", HFILL }},
- {&hf_ieee80211_ff_sswf_reserved2,
- {"Sector Sweep Feedback Reserved", "wlan.sswf.reserved",
- FT_UINT24, BASE_HEX, NULL, 0xFE0000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_capture,
+ {"Capabilities Information", "wlan.fixed.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Capability information", HFILL }},
- {&hf_ieee80211_ff_sswf_sector_select,
- {"Sector Sweep Feedback Sector Select", "wlan.sswf.sector_select",
- FT_UINT24, BASE_DEC, NULL, 0x00003F,
+ {&hf_ieee80211_ff_cf_ess,
+ {"ESS capabilities", "wlan.fixed.capabilities.ess",
+ FT_BOOLEAN, 16, TFS(&cf_ess_flags), 0x0001,
NULL, HFILL }},
- {&hf_ieee80211_ff_sswf_dmg_antenna_select,
- {"Sector Sweep Feedback DMG Antenna Select", "wlan.sswf.dmg_antenna_select",
- FT_UINT24, BASE_DEC, NULL, 0x0000C0,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_cf_ibss,
+ {"IBSS status", "wlan.fixed.capabilities.ibss",
+ FT_BOOLEAN, 16, TFS(&cf_ibss_flags), 0x0002,
+ "IBSS participation", HFILL }},
- {&hf_ieee80211_ff_sswf_snr_report,
- {"Sector Sweep Feedback SNR Report", "wlan.sswf.snr_report",
- FT_UINT24, BASE_DEC, NULL, 0x00FF00,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_cf_sta_poll,
+ {"CFP participation capabilities", "wlan.fixed.capabilities.cfpoll.sta",
+ FT_UINT16, BASE_HEX, VALS(sta_cf_pollable), 0x020C,
+ "CF-Poll capabilities for a STA", HFILL }},
+
+ {&hf_ieee80211_ff_cf_ap_poll,
+ {"CFP participation capabilities", "wlan.fixed.capabilities.cfpoll.ap",
+ FT_UINT16, BASE_HEX, VALS(ap_cf_pollable), 0x020C,
+ "CF-Poll capabilities for an AP", HFILL }},
+ {&hf_ieee80211_ff_cf_privacy,
+ {"Privacy", "wlan.fixed.capabilities.privacy",
+ FT_BOOLEAN, 16, TFS(&cf_privacy_flags), 0x0010,
+ "WEP support", HFILL }},
- {&hf_ieee80211_ff_brp,
- {"BRP Request", "wlan.brp",
- FT_UINT32, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_cf_preamble,
+ {"Short Preamble", "wlan.fixed.capabilities.preamble",
+ FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x0020,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_L_RX,
- {"BRP Request L-RX", "wlan.brp.l_rx",
- FT_UINT32, BASE_DEC, NULL, 0x0000001f,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_cf_pbcc,
+ {"PBCC", "wlan.fixed.capabilities.pbcc",
+ FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x0040,
+ "PBCC Modulation", HFILL }},
- {&hf_ieee80211_ff_brp_TX_TRN_REQ,
- {"BRP Request TX-TRN-REQ", "wlan.brp.tx_trn_req",
- FT_BOOLEAN, 32, NULL, 0x00000020,
+ {&hf_ieee80211_ff_cf_agility,
+ {"Channel Agility", "wlan.fixed.capabilities.agility",
+ FT_BOOLEAN, 16, TFS(&tfs_inuse_not_inuse), 0x0080,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_MID_REQ,
- {"BRP Request MID-REQ", "wlan.brp.mid_req",
- FT_BOOLEAN, 32, NULL, 0x00000040,
+ {&hf_ieee80211_ff_cf_spec_man,
+ {"Spectrum Management", "wlan.fixed.capabilities.spec_man",
+ FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0100,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_BC_REQ,
- {"BRP Request BC-REQ", "wlan.brp.bc_req",
- FT_BOOLEAN, 32, NULL, 0x00000080,
+ {&hf_ieee80211_ff_short_slot_time,
+ {"Short Slot Time", "wlan.fixed.capabilities.short_slot_time",
+ FT_BOOLEAN, 16, TFS(&tfs_inuse_not_inuse), 0x0400,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_MID_GRANT,
- {"BRP Request MID-GRANT", "wlan.brp.mid_grant",
- FT_BOOLEAN, 32, NULL, 0x00000100,
+ {&hf_ieee80211_ff_cf_apsd,
+ {"Automatic Power Save Delivery", "wlan.fixed.capabilities.apsd",
+ FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0800,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_BC_GRANT,
- {"BRP Request BC-GRANT", "wlan.brp.bc_grant",
- FT_BOOLEAN, 32, NULL, 0x00000200,
+ {&hf_ieee80211_ff_radio_measurement,
+ {"Radio Measurement", "wlan.fixed.capabilities.radio_measurement",
+ FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x1000,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_chan_FBCK_CAP,
- {"BRP Request Chan FBCK-CAP", "wlan.brp.chan_fbck_cap",
- FT_BOOLEAN, 32, NULL, 0x00000400,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_dsss_ofdm,
+ {"DSSS-OFDM", "wlan.fixed.capabilities.dsss_ofdm",
+ FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x2000,
+ "DSSS-OFDM Modulation", HFILL }},
- {&hf_ieee80211_ff_brp_tx_sector,
- {"BRP Request TX Sector ID", "wlan.brp.tx_sector_id",
- FT_UINT32, BASE_DEC, NULL, 0x0001f800,
+ {&hf_ieee80211_ff_cf_del_blk_ack,
+ {"Delayed Block Ack", "wlan.fixed.capabilities.del_blk_ack",
+ FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x4000,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_other_aid,
- {"BRP Request Other AID", "wlan.brp.other_aid",
- FT_UINT32, BASE_DEC, NULL, 0x01fe0000,
+ {&hf_ieee80211_ff_cf_imm_blk_ack,
+ {"Immediate Block Ack", "wlan.fixed.capabilities.imm_blk_ack",
+ FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x8000,
NULL, HFILL }},
- {&hf_ieee80211_ff_brp_tx_antenna,
- {"BRP Request TX Antenna ID", "wlan.brp.tx_antenna_id",
- FT_UINT32, BASE_DEC, NULL, 0x06000000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_auth_seq,
+ {"Authentication SEQ", "wlan.fixed.auth_seq",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Authentication Sequence Number", HFILL }},
- {&hf_ieee80211_ff_brp_reserved,
- {"BRP Request Reserved", "wlan.brp.reserved",
- FT_UINT32, BASE_HEX, NULL, 0xF8000000,
+ {&hf_ieee80211_ff_assoc_id,
+ {"Association ID", "wlan.fixed.aid",
+ FT_UINT16, BASE_HEX, NULL, 0x3FFF,
NULL, HFILL }},
- {&hf_ieee80211_ff_blm,
- {"Beamformed Link Maintenance", "wlan.blm",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_listen_ival,
+ {"Listen Interval", "wlan.fixed.listen_ival",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_blm_unit_index,
- {"BeamLink Maintenance Uint Index", "wlan.blm.uint_index",
- FT_BOOLEAN, 8, NULL, 0x01,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_current_ap,
+ {"Current AP", "wlan.fixed.current_ap",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "MAC address of current AP", HFILL }},
- {&hf_ieee80211_ff_blm_maint_value,
- {"BeamLink Maintenance Value", "wlan.blm.value",
- FT_UINT8, BASE_DEC, NULL, 0x7e,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_reason,
+ {"Reason code", "wlan.fixed.reason_code",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_reason_code_ext, 0,
+ "Reason for unsolicited notification", HFILL }},
- {&hf_ieee80211_ff_blm_is_master,
- {"BeamLink Is Master", "wlan.blm.is_master",
- FT_BOOLEAN, 8, NULL, 0x80,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_status_code,
+ {"Status code", "wlan.fixed.status_code",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
+ "Status of requested event", HFILL }},
- {&hf_ieee80211_ff_bic,
- {"Beacon Interval Control", "wlan.bic",
- FT_UINT48, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_category_code,
+ {"Category code", "wlan.fixed.category_code",
+ FT_UINT16, BASE_DEC|BASE_EXT_STRING, &category_codes_ext, 0,
+ "Management action category", HFILL }},
- {&hf_ieee80211_ff_bic_cc_present,
- {"Clustering Control Present", "wlan.bic.cc",
- FT_BOOLEAN, 48, NULL, 0x000000000001,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT16, BASE_DEC, VALS(action_codes), 0,
+ "Management action code", HFILL }},
- {&hf_ieee80211_ff_bic_discovery_mode,
- {"Discovery Mode", "wlan.bic.discovery_mode",
- FT_BOOLEAN, 48, NULL, 0x000000000002,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_dialog_token,
+ {"Dialog token", "wlan.fixed.dialog_token",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Management action dialog token", HFILL }},
- {&hf_ieee80211_ff_bic_next_beacon,
- {"Next Beacon", "wlan.bic.next_beacon",
- FT_UINT48, BASE_DEC, NULL, 0x00000000003c,
+ {&hf_ieee80211_ff_followup_dialog_token,
+ {"Followup Dialog token", "wlan.fixed.followup_dialog_token",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Management action followup dialog token", HFILL }},
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_action_type,
+ {"Marvell Action type", "wlan.fixed.mrvl_action_type",
+ FT_UINT8, BASE_DEC, VALS(vendor_action_types_mrvl), 0,
+ "Vendor Specific Action Type (Marvell)", HFILL }},
- {&hf_ieee80211_ff_bic_ati_present,
- {"ATI Present", "wlan.bic.ati",
- FT_BOOLEAN, 48, NULL, 0x000000000040,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_action_code,
+ {"Mesh action(Marvell)", "wlan.fixed.mrvl_mesh_action",
+ FT_UINT8, BASE_HEX, VALS(mesh_mgt_action_codes_mrvl), 0,
+ "Mesh action code(Marvell)", HFILL }},
- {&hf_ieee80211_ff_bic_abft_len,
- {"A-BFT length", "wlan.bic.abft_len",
- FT_UINT48, BASE_DEC, NULL, 0x000000000380,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_length,
+ {"Message Length", "wlan.fixed.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_fss,
- {"FSS", "wlan.bic.fss",
- FT_UINT48, BASE_DEC, NULL, 0x000000003c00,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_mode,
+ {"Message Mode", "wlan.fixed.mode",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_is_resp,
- {"Is TXSS Responder", "wlan.bic.is_responder",
- FT_BOOLEAN, 48, NULL, 0x000000004000,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_ttl,
+ {"Message TTL", "wlan.fixed.ttl",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_next_abft,
- {"Next A-BFT", "wlan.bic.next_abft",
- FT_UINT48, BASE_DEC, NULL, 0x000000078000,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_dstcount,
+ {"Destination Count", "wlan.fixed.dstcount",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_frag_txss,
- {"Fragmented TXSS", "wlan.bic.frag_txss",
- FT_BOOLEAN, 48, NULL, 0x000000080000,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_hopcount,
+ {"Hop Count", "wlan.fixed.hopcount",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_txss_span,
- {"TXSS span", "wlan.bic.txss_span",
- FT_UINT48, BASE_DEC, NULL, 0x000007f00000,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_rreqid,
+ {"RREQ ID", "wlan.fixed.rreqid",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_NBI_abft,
- {"Number of Beacon Intervals that are needed to allocate A-BFT", "wlan.bic.NBI_abft",
- FT_UINT48, BASE_DEC, NULL, 0x00078000000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_sa,
+ {"Source Address", "wlan.fixed.sa",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Source MAC address", HFILL }},
- {&hf_ieee80211_ff_bic_abft_count,
- {"A-BFT Count", "wlan.bic.abft_count",
- FT_UINT48, BASE_DEC, NULL, 0x001f80000000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_ssn,
+ {"SSN", "wlan.fixed.ssn",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Source Sequence Number", HFILL }},
- {&hf_ieee80211_ff_bic_nabft,
- {"Number of A-BFT's received from each Antenna", "wlan.bic.nabft",
- FT_UINT48, BASE_DEC, NULL, 0x07e000000000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_metric,
+ {"Metric", "wlan.fixed.metric",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Route Metric", HFILL }},
- {&hf_ieee80211_ff_bic_pcp,
- {"PCP Association Ready", "wlan.bic.pcp",
- FT_BOOLEAN, 48, NULL, 0x080000000000,
+ {&hf_ieee80211_ff_marvell_mesh_mgt_flags,
+ {"RREQ Flags", "wlan.fixed.hopcount",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_bic_reserved,
- {"Reserved", "wlan.bic.reserved",
- FT_UINT48, BASE_HEX, NULL, 0xF00000000000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_da,
+ {"Destination Address", "wlan.fixed.da",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Destination MAC address", HFILL }},
- {&hf_ieee80211_ff_dmg_params,
- {"DMG Parameters", "wlan.dmg_params",
- FT_UINT8, BASE_HEX , NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_dsn,
+ {"DSN", "wlan.fixed.dsn",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Destination Sequence Number", HFILL }},
- {&hf_ieee80211_ff_dmg_params_bss,
- {"BSS Type", "wlan.dmg_params.bss",
- FT_UINT8, BASE_DEC, VALS(bss_type), 0x03,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_marvell_mesh_mgt_lifetime,
+ {"Lifetime", "wlan.fixed.lifetime",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Route Lifetime", HFILL }},
- {&hf_ieee80211_ff_dmg_params_cbap_only,
- {"CBAP Only", "wlan.dmp_params.cbap_only",
- FT_BOOLEAN, 8, NULL, 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_wme_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT16, BASE_HEX, VALS(wme_action_codes), 0,
+ "Management notification action code", HFILL }},
- {&hf_ieee80211_ff_dmg_params_cbap_src,
- {"CBAP Source", "wlan.dmp_params.cbap_src",
- FT_BOOLEAN, 8, NULL, 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_wme_status_code,
+ {"Status code", "wlan.fixed.status_code",
+ FT_UINT16, BASE_HEX, VALS(wme_status_codes), 0,
+ "Management notification setup response status code", HFILL }},
- {&hf_ieee80211_ff_dmg_params_privacy,
- {"DMG Privacy", "wlan.dmp_params.privacy",
- FT_BOOLEAN, 8, NULL, 0x10,
+ {&hf_ieee80211_ff_mesh_action,
+ {"Mesh Action code", "wlan.fixed.mesh_action",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &mesh_action_ext, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_dmg_params_policy,
- {"ECPAC Policy Enforced", "wlan.dmp_params.policy",
- FT_BOOLEAN, 8, NULL, 0x20,
+ {&hf_ieee80211_ff_multihop_action,
+ {"Multihop Action code", "wlan.fixed.multihop_action",
+ FT_UINT8, BASE_HEX, VALS(multihop_action), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cc,
- {"Clustering Control", "wlan.cc",
- FT_UINT64, BASE_HEX , NULL, 0,
+ {&hf_ieee80211_ff_mesh_flags,
+ {"Mesh Flags", "wlan.fixed.mesh_flags",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cc_abft_resp_addr,
- {"A-BFT Responder Address", "wlan.cc.abft_resp_addr",
- FT_ETHER, BASE_NONE , NULL, 0,
+ {&hf_ieee80211_ff_mesh_ttl,
+ {"Mesh TTL", "wlan.fixed.mesh_ttl",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cc_sp_duration,
- {"Beacon SP Duration", "wlan.cc.sp_duration",
- FT_UINT8, BASE_DEC , NULL, 0,
+ {&hf_ieee80211_ff_mesh_sequence,
+ {"Sequence Number", "wlan.fixed.mesh_sequence",
+ FT_UINT32, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cc_cluster_id,
- {"Cluster ID", "wlan.cc.cluster_id",
- FT_UINT64, BASE_DEC , NULL, 0,
+ {&hf_ieee80211_ff_mesh_addr4,
+ {"Mesh Extended Address 4", "wlan.fixed.mesh_addr4",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cc_role,
- {"Cluster Member Role", "wlan.cc.rold",
- FT_UINT8, BASE_DEC , NULL, 0,
+ {&hf_ieee80211_ff_mesh_addr5,
+ {"Mesh Extended Address 5", "wlan.fixed.mesh_addr5",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cc_max_mem,
- {"Cluster MaxMem", "wlan.cc.max_mem",
- FT_UINT8, BASE_DEC , NULL, 0,
+ {&hf_ieee80211_ff_mesh_addr6,
+ {"Mesh Extended Address 6", "wlan.fixed.mesh_addr6",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_relay_support,
- {"Relay Supportability", "wlan.relay_capabilities.relay_support",
- FT_BOOLEAN, 8, NULL, 0x01,
+ {&hf_ieee80211_ff_selfprot_action,
+ {"Self-protected Action code", "wlan.fixed.selfprot_action",
+ FT_UINT8, BASE_HEX, VALS(selfprot_action), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_relay_use,
- {"Relay Usability", "wlan.relay_capabilities.relay_use",
- FT_BOOLEAN, 8, NULL, 0x02,
+ {&hf_ieee80211_mesh_peering_proto,
+ {"Mesh Peering Protocol ID", "wlan.peering.proto",
+ FT_UINT16, BASE_HEX, VALS(mesh_peering_proto_ids), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_relay_permission,
- {"Relay Permission", "wlan.relay_capabilities.relay_permission",
- FT_BOOLEAN, 8, NULL, 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_peering_local_link_id,
+ {"Local Link ID", "wlan.peering.local_id",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Mesh Peering Management Local Link ID", HFILL }},
- {&hf_ieee80211_tag_AC_power,
- {"A/C Power", "wlan.relay_capabilities.AC_power",
- FT_BOOLEAN, 8, NULL, 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_peering_peer_link_id,
+ {"Peer Link ID", "wlan.peering.peer_id",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Mesh Peering Management Peer Link ID", HFILL }},
- {&hf_ieee80211_tag_relay_prefer,
- {"Relay Preference", "wlan.relay_capabilities.relay_prefer",
- FT_BOOLEAN, 8, NULL, 0x10,
+ {&hf_ieee80211_ff_hwmp_flags,
+ {"HWMP Flags", "wlan.hwmp.flags",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_duplex,
- {"Duplex", "wlan.relay_capabilities.duplex",
- FT_UINT8, BASE_DEC, NULL, 0x60,
+ {&hf_ieee80211_ff_hwmp_hopcount,
+ {"HWMP Hop Count", "wlan.hwmp.hopcount",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_cooperation,
- {"Cooperation", "wlan.relay_capabilities.cooperation",
- FT_BOOLEAN, 8, NULL, 0x80,
+ {&hf_ieee80211_ff_hwmp_ttl,
+ {"HWMP TTL", "wlan.hwmp.ttl",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
-#if 0
- {&hf_ieee80211_ff_rcsi,
- {"Relay Capable STA Info", "wlan.rcsi",
- FT_UINT24, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_ff_hwmp_pdid,
+ {"HWMP Path Discovery ID", "wlan.hwmp.pdid",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_rcsi_aid,
- {"AID", "wlan.rcsi.aid",
- FT_UINT8, BASE_DEC, NULL, 0xff,
+ {&hf_ieee80211_ff_hwmp_orig_sta,
+ {"Originator STA Address", "wlan.hwmp.orig_sta",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
-#endif
- {&hf_ieee80211_ff_band_id,
- {"Band ID", "wlan.band_id",
- FT_UINT8, BASE_DEC, VALS(band_id), 0xff,
+ {&hf_ieee80211_ff_hwmp_orig_sn,
+ {"HWMP Originator Sequence Number", "wlan.hwmp.orig_sn",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL}},
+
+ {&hf_ieee80211_ff_hwmp_orig_ext,
+ {"Originator External Address", "wlan.hwmp.orig_ext",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_move,
- {"Move", "wlan.dmg_bss_param_change.move",
- FT_BOOLEAN, 8, NULL, 0x01,
+ {&hf_ieee80211_ff_hwmp_lifetime,
+ {"HWMP Lifetime", "wlan.hwmp.lifetime",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_size,
- {"Size", "wlan.dmg_bss_param_change.size",
- FT_BOOLEAN, 8, NULL, 0x02,
+ {&hf_ieee80211_ff_hwmp_metric,
+ {"HWMP Metric", "wlan.hwmp.metric",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tbtt_offset,
- {"TBTT Offset", "wlan.dmg_bss_param_change.tbtt_offset",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0xffffffff,
+ {&hf_ieee80211_ff_hwmp_targ_count,
+ {"HWMP Target Count", "wlan.hwmp.targ_count",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bi_duration,
- {"BI Duration", "wlan.dmg_bss_param_change.bi_duration",
- FT_UINT16, BASE_DEC, NULL, 0xffff,
+ {&hf_ieee80211_ff_hwmp_targ_flags,
+ {"HWMP Per-Target Flags", "wlan.hwmp.targ_flags",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_dmg_capa_sta_addr,
- {"STA Address", "wlan.dmg_capa.sta_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "STA_Address", HFILL }},
+ {&hf_ieee80211_ff_hwmp_targ_to_flags,
+ {"TO Flag", "wlan.hwmp.to_flag",
+ FT_BOOLEAN, 8, TFS(&hwmp_targ_to_flags), 0x01,
+ "Target Only Flag", HFILL }},
- {&hf_ieee80211_tag_dmg_capa_aid,
- {"AID", "wlan.dmg_capa.aid",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
-/* 8.4.2.127.2 DMG STA Capability Information field */
- {&hf_ieee80211_tag_reverse_direction, /* DMG STA capa, bits [0] */
- {"Reverse Direction", "wlan.dmg_capa.reverse_direction",
- FT_BOOLEAN, 24, NULL, GENMASK(0, 0),
- NULL, HFILL }},
+ {&hf_ieee80211_ff_hwmp_targ_usn_flags,
+ {"USN Flag", "wlan.hwmp.usn_flag",
+ FT_BOOLEAN, 8, TFS(&hwmp_targ_usn_flags), 0x04,
+ "Unknown Target HWMP Sequence Number Flag", HFILL }},
- {&hf_ieee80211_tag_hlts, /* DMG STA capa, bits [1] */
- {"Higher Layer Timer Synchronization", "wlan.dmg_capa.htls",
- FT_BOOLEAN, 24, NULL, GENMASK(1, 1),
+ {&hf_ieee80211_ff_hwmp_targ_sta,
+ {"Target STA Address", "wlan.hwmp.targ_sta",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tpc, /* DMG STA capa, bits [2] */
- {"TPC", "wlan.dmg_capa.tpc",
- FT_BOOLEAN, 24, NULL, GENMASK(2, 2),
+ {&hf_ieee80211_ff_hwmp_targ_ext,
+ {"Target External Address", "wlan.hwmp.targ_ext",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_spsh, /* DMG STA capa, bits [3] */
- {"SPSH and Interference Mitigation", "wlan.dmg_capa.spsh",
- FT_BOOLEAN, 24, NULL, GENMASK(3, 3),
+ {&hf_ieee80211_ff_hwmp_targ_sn,
+ {"Target HWMP Sequence Number", "wlan.hwmp.targ_sn",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rx_antenna, /* DMG STA capa, bits [4..5] */
- {"Number of RX DMG Antennas", "wlan.dmg_capa.num_rx",
- FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), GENMASK(5, 4),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_path_sel_protocol,
+ {"Path Selection Protocol", "wlan.mesh.config.ps_protocol",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Path Selection Protocol", HFILL }},
- {&hf_ieee80211_tag_fast_link, /* DMG STA capa, bits [6] */
- {"Fast Link Adaptation", "wlan.dmg_capa.fast_link",
- FT_BOOLEAN, 24, NULL, GENMASK(6, 6),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_path_sel_metric,
+ {"Path Selection Metric", "wlan.mesh.config.ps_metric",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Path Selection Metric", HFILL }},
- {&hf_ieee80211_tag_num_sectors, /* DMG STA capa, bits [7..13] */
- {"Total Number of Sectors", "wlan.dmg_capa.num_sectors",
- FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_base_custom), GENMASK(13, 7),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_congestion_control,
+ {"Congestion Control", "wlan.mesh.config.cong_ctl",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Congestion Control", HFILL }},
- {&hf_ieee80211_tag_rxss_length, /* DMG STA capa, bits [14..19] */
- {"RXSS Length", "wlan.dmg_capa.rxss_len",
- FT_UINT24, BASE_CUSTOM, CF_FUNC(extra_one_mul_two_base_custom), GENMASK(19, 14),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_sync_method,
+ {"Synchronization Method", "wlan.mesh.config.sync_method",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Synchronization Method", HFILL }},
- {&hf_ieee80211_tag_reciprocity, /* DMG STA capa, bits [20] */
- {"DMG Antenna Reciprocity", "wlan.dmg_capa.reciprocity",
- FT_BOOLEAN, 24, NULL, GENMASK(20, 20),
- NULL, HFILL }},
-/* DMG STA capa, A-MPDU params, bits [21..26] */
- {&hf_ieee80211_tag_max_ampdu_exp, /* DMG STA capa, bits [21..23] */
- {"Maximum A-MPDU Length Exponent", "wlan.dmg_capa.max_ampdu_exp",
- FT_UINT24, BASE_DEC, NULL, GENMASK(23, 21),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_auth_protocol,
+ {"Authentication Protocol", "wlan.mesh.config.auth_protocol",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Authentication Protocol", HFILL }},
- {&hf_ieee80211_tag_min_mpdu_spacing, /* DMG STA capa, bits [24..26] */
- {"Minimum MPDU Start Spacing", "wlan.dmg_capa.min_mpdu_spacing",
- FT_UINT24, BASE_DEC, NULL, GENMASK(26-24, 24-24),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_formation_info,
+ {"Formation Info", "wlan.mesh.config.formation_info",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Formation Info", HFILL }},
- {&hf_ieee80211_tag_ba_flow_control , /* DMG STA capa, bits [27] */
- {"BA with Flow Control", "wlan.dmg_capa.bs_flow_ctrl",
- FT_BOOLEAN, 24, NULL, GENMASK(27-24, 27-24),
- NULL, HFILL }},
-/* DMG STA capa, supported MCS set, bits [28..51] */
- {&hf_ieee80211_tag_max_sc_rx_mcs, /* DMG STA capa, bits [28..32] */
- {"Maximum SC Rx MCS", "wlan.dmg_capa.max_sc_rx_mcs",
- FT_UINT24, BASE_DEC, NULL, GENMASK(32-24, 28-24),
+ {&hf_ieee80211_mesh_form_info_num_of_peerings,
+ {"Number of Peerings", "wlan.mesh.config.formation_info.num_peers",
+ FT_UINT8, BASE_DEC, NULL, 0x7E,
NULL, HFILL }},
- {&hf_ieee80211_tag_max_ofdm_rx_mcs, /* DMG STA capa, bits [33..37] */
- {"Maximum OFDM Rx MCS", "wlan.dmg_capa.max_ofdm_rx_mcs",
- FT_UINT24, BASE_DEC, NULL, GENMASK(37-24, 33-24),
- NULL, HFILL }},
+ {&hf_ieee80211_mesh_config_capability,
+ {"Capability", "wlan.mesh.config.cap",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Mesh Configuration Capability", HFILL }},
- {&hf_ieee80211_tag_max_sc_tx_mcs, /* DMG STA capa, bits [38..42] */
- {"Maximum SC Tx MCS", "wlan.dmg_capa.max_sc_tx_mcs",
- FT_UINT24, BASE_DEC, NULL, GENMASK(42-24, 38-24),
+ {&hf_ieee80211_mesh_config_cap_accepting,
+ {"Accepting Additional Mesh Peerings", "wlan.mesh.config.cap.accept",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_tag_max_ofdm_tx_mcs, /* DMG STA capa, bits [43..47] */
- {"Maximum OFDM Tx MCS", "wlan.dmg_capa.max_ofdm_tx_mcs",
- FT_UINT24, BASE_DEC, NULL, GENMASK(47-24, 43-24),
+ {&hf_ieee80211_mesh_config_cap_mcca_support,
+ {"MCCA Support", "wlan.mesh.config.cap.mcca_support",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_tag_low_power_supported, /* DMG STA capa, bits [48] */
- {"Low Power SC PHY Supported", "wlan.dmg_capa.low_power_suuported",
- FT_BOOLEAN, 16, NULL, GENMASK(48-48, 48-48),
+ {&hf_ieee80211_mesh_config_cap_mcca_enabled,
+ {"MCCA Enabled", "wlan.mesh.config.cap.mcca_enabled",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_tag_code_rate, /* DMG STA capa, bits [49] */
- {"Code Rate 13/16", "wlan.dmg_capa.code_rate",
- FT_BOOLEAN, 16, NULL, GENMASK(49-48, 49-48),
+ {&hf_ieee80211_mesh_config_cap_forwarding,
+ {"Mesh Forwarding", "wlan.mesh.config.cap.forwarding",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_tag_dtp, /* DMG STA capa, bits [52] */
- {"DTP Supported", "wlan.dmg_capa.dtp",
- FT_BOOLEAN, 16, NULL, GENMASK(52-48, 52-48),
+ {&hf_ieee80211_mesh_config_cap_mbca_enabled,
+ {"MBCA Enabled", "wlan.mesh.config.cap.mbca_enabled",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_tag_appdu_supp, /* DMG STA capa, bits [53] */
- {"A-PPDU Supported", "wlan.dmg_capa.appdu_supp",
- FT_BOOLEAN, 16, NULL, GENMASK(53-48, 53-48),
+ {&hf_ieee80211_mesh_config_cap_tbtt_adjusting,
+ {"TBTT Adjustment", "wlan.mesh.config.cap.tbtt_adjusting",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_tag_heartbeat, /* DMG STA capa, bits [54] */
- {"HeartBeat", "wlan.dmg_capa.heartbeat",
- FT_BOOLEAN, 16, NULL, GENMASK(54-48, 54-48),
+ {&hf_ieee80211_mesh_config_cap_power_save_level,
+ {"Power Save", "wlan.mesh.config.cap.power_save_level",
+ FT_BOOLEAN, 8, TFS(&mesh_config_cap_power_save_level_flags), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_tag_other_aid, /* DMG STA capa, bits [55] */
- {"Supports Other_AID", "wlan.dmg_capa.other_aid",
- FT_BOOLEAN, 16, NULL, GENMASK(55-48, 55-48),
+ {&hf_ieee80211_mesh_id,
+ {"Mesh ID", "wlan.mesh.id",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_pattern_recip, /* DMG STA capa, bits [56] */
- {"Antenna Pattern Reciprocity", "wlan.dmg_capa.pattern_recip",
- FT_BOOLEAN, 16, NULL, GENMASK(56-48, 56-48),
- NULL, HFILL }},
+ {&hf_ieee80211_rann_flags,
+ {"RANN Flags", "wlan.rann.flags",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Root Announcement Flags", HFILL }},
- {&hf_ieee80211_tag_heartbeat_elapsed, /* DMG STA capa, bits [57..59] */
- {"Heartbeat Elapsed Indication", "wlan.dmg_capa.heartbeat_elapsed",
- FT_UINT16, BASE_DEC, NULL, GENMASK(59-48, 57-48),
- NULL, HFILL }},
+ {&hf_ieee80211_rann_root_sta,
+ {"Root STA Address", "wlan.rann.root_sta", FT_ETHER, BASE_NONE, NULL, 0,
+ "Root Mesh STA Address", HFILL }},
- {&hf_ieee80211_tag_grant_ack_supp, /* DMG STA capa, bits [60] */
- {"Grant ACK Supported", "wlan.dmg_capa.grant_ack_supp",
- FT_BOOLEAN, 16, NULL, GENMASK(60-48, 60-48),
- NULL, HFILL }},
+ {&hf_ieee80211_rann_sn,
+ {"Root STA Sequence Number", "wlan.rann.rann_sn",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Root Mesh STA Sequence Number", HFILL }},
- {&hf_ieee80211_tag_RXSSTxRate_supp, /* DMG STA capa, bits [61] */
- {"RXSSTxRate Supported", "wlan.dmg_capa.RXSSTxRate",
- FT_BOOLEAN, 16, NULL, GENMASK(61-48, 61-48),
- NULL, HFILL }},
-/* 8.4.2.127.3 DMG PCP/AP Capability Information field */
- {&hf_ieee80211_tag_pcp_tddti, /* DMG PCP/AP capa, bits [0] */
- {"TDDTI", "wlan.dmg_capa.pcp_tdtti",
- FT_BOOLEAN, 16, NULL, GENMASK(0, 0),
- NULL, HFILL }},
+ {&hf_ieee80211_rann_interval,
+ {"RANN Interval", "wlan.rann.interval",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Root Announcement Interval", HFILL }},
- {&hf_ieee80211_tag_pcp_PSA, /* DMG PCP/AP capa, bits [1] */
- {"Pseudo-static Allocations", "wlan.dmg_capa.pcp_psa",
- FT_BOOLEAN, 16, NULL, GENMASK(1, 1),
- NULL, HFILL }},
+ {&hf_ieee80211_ff_qos_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT16, BASE_HEX, VALS(qos_action_codes), 0,
+ "QoS management action code", HFILL }},
- {&hf_ieee80211_tag_pcp_handover, /* DMG PCP/AP capa, bits [2] */
- {"PDP Handover", "wlan.dmg_capa.pcp_handover",
- FT_BOOLEAN, 16, NULL, GENMASK(2, 2),
- NULL, HFILL }},
+ {&hf_ieee80211_ff_ba_action,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT8, BASE_HEX, VALS(ba_action_codes), 0,
+ "Block Ack action code", HFILL }},
- {&hf_ieee80211_tag_pcp_max_assoc, /* DMG PCP/AP capa, bits [3..10] */
- {"Max Associated STA Number", "wlan.dmg_capa.pcp_max_assoc",
- FT_UINT16, BASE_DEC, NULL, GENMASK(10, 3),
- NULL, HFILL }},
+ {&hf_ieee80211_ff_check_beacon,
+ {"Check Beacon", "wlan.fixed.check_beacon",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Unprotected WNM Check Beacon", HFILL }},
- {&hf_ieee80211_tag_pcp_power_src, /* DMG PCP/AP capa, bits [11] */
- {"Power Source", "wlan.dmg_capa.pcp_power_src",
- FT_BOOLEAN, 16, NULL, GENMASK(11, 11),
- NULL, HFILL }},
+ {&hf_ieee80211_ff_tod,
+ {"TOD", "wlan.fixed.tod",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Previous TS of transmit antenna port", HFILL }},
- {&hf_ieee80211_tag_pcp_decenter, /* DMG PCP/AP capa, bits [12] */
- {"Decentralized PCP/AP Clustering", "wlan.dmg_capa.pcp_decenter",
- FT_BOOLEAN, 16, NULL, GENMASK(12, 12),
- NULL, HFILL }},
+ {&hf_ieee80211_ff_toa,
+ {"TOA", "wlan.fixed.toa",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Previous TS of receive antenna port", HFILL }},
- {&hf_ieee80211_tag_pcp_forwarding, /* DMG PCP/AP capa, bits [13] */
- {"PCP Forwarding", "wlan.dmg_capa.pcp_forwarding",
- FT_BOOLEAN, 16, NULL, GENMASK(13, 13),
+ {&hf_ieee80211_ff_max_tod_err,
+ {"MAX TOD ERROR", "wlan.fixed.max_tod_err",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Maximal Error at Previous TS of transmit antenna port", HFILL }},
+
+ {&hf_ieee80211_ff_max_toa_err,
+ {"MAX TOA ERROR", "wlan.fixed.max_toa_err",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Maximal Error at Previous TS of receive antenna port", HFILL }},
+
+ {&hf_ieee80211_ff_dls_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT16, BASE_HEX, VALS(dls_action_codes), 0,
+ "DLS management action code", HFILL }},
+
+ {&hf_ieee80211_ff_dst_mac_addr,
+ {"Destination address", "wlan.fixed.dst_mac_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Destination MAC address", HFILL }},
+
+ {&hf_ieee80211_ff_src_mac_addr,
+ {"Source address", "wlan.fixed.src_mac_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Source MAC address", HFILL }},
+
+ {&hf_ieee80211_ff_req_ap_addr,
+ {"RequesterAP address", "wlan.fixed.req_ap_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_pcp_center, /* DMG PCP/AP capa, bits [14] */
- {"Centralized PCP/AP Clustering", "wlan.dmg_capa.pcp_center",
- FT_BOOLEAN, 16, NULL, GENMASK(14, 14),
+ {&hf_ieee80211_ff_res_ap_addr,
+ {"ResponderAP address", "wlan.fixed.res_ap_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_PSRSI,
- {"PS Request Suspension Interval", "wlan.dmg_oper.psrsi",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_ft_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT8, BASE_DEC, VALS(ft_action_codes), 0,
+ "Management action code", HFILL }},
+
+ {&hf_ieee80211_ff_sta_address,
+ {"STA Address", "wlan.fixed.sta_address",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_min_BHI_duration,
- {"Min BHI Duration", "wlan.dmg_oper.min_BHI_duration",
+ {&hf_ieee80211_ff_target_ap_address,
+ {"Target AP Address", "wlan.fixed.target_ap_address",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Target AP MAC address", HFILL }},
+
+ {&hf_ieee80211_ff_gas_comeback_delay,
+ {"GAS Comeback Delay", "wlan.fixed.gas_comeback_delay",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_brdct_sta_info_dur,
- {"Broadcast STA Info Duration", "wlan.dmg_oper.brdcst_sta_info_dur",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_gas_fragment_id,
+ {"GAS Query Response Fragment ID", "wlan.fixed.gas_fragment_id",
+ FT_UINT8, BASE_DEC, NULL, 0x7f,
NULL, HFILL }},
- {&hf_ieee80211_tag_assoc_resp_confirm_time,
- {"Associated Response Confirm Time", "wlan.dmg_oper.assoc_resp_confirm_time",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_more_gas_fragments,
+ {"More GAS Fragments", "wlan.fixed.more_gas_fragments",
+ FT_UINT8, BASE_DEC, NULL, 0x80,
NULL, HFILL }},
- {&hf_ieee80211_tag_min_pp_duration,
- {"Min PP Duration", "wlan.dmg_oper.min_pp_duration",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_query_request_length,
+ {"Query Request Length", "wlan.fixed.query_request_length",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_SP_idle_timeout,
- {"SP Idle Timeout", "wlan.dmg_oper.SP_idle_timeout",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_query_request,
+ {"Query Request", "wlan.fixed.query_request",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_max_lost_beacons,
- {"Max Lost Beacons", "wlan.dmg_oper.max_lost_beacons",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_query_response_length,
+ {"Query Response Length", "wlan.fixed.query_response_length",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_type,
- {"Type", "wlan.sctor_id.type",
- FT_UINT32, BASE_HEX, NULL, 0x0000000f,
+ {&hf_ieee80211_ff_query_response,
+ {"Query Response", "wlan.fixed.query_response",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tap1,
- {"Tap 1", "wlan.sctor_id.tap1",
- FT_UINT32, BASE_HEX, NULL, 0x000003f0,
- NULL, HFILL }},
+ {&hf_ieee80211_gas_resp_fragments,
+ {"GAS Query Response fragments", "wlan.fixed.fragments",
+ FT_NONE, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
- {&hf_ieee80211_tag_state1,
- {"State 1", "wlan.sctor_id.state1",
- FT_UINT32, BASE_HEX, NULL, 0x0000fc00,
- NULL, HFILL }},
+ {&hf_ieee80211_gas_resp_fragment,
+ {"GAS Query Response fragment", "wlan.fixed.fragment",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
- {&hf_ieee80211_tag_tap2,
- {"Tap 2", "wlan.sctor_id.tap2",
- FT_UINT32, BASE_HEX, NULL, 0x00ff0000,
- NULL, HFILL }},
+ {&hf_ieee80211_gas_resp_fragment_overlap,
+ {"GAS Query Response fragment overlap", "wlan.fixed.fragment.overlap",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
+
+ {&hf_ieee80211_gas_resp_fragment_overlap_conflict,
+ {"GAS Query Response fragment overlapping with conflicting data", "wlan.fixed.fragment.overlap.conflicts",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
+
+ {&hf_ieee80211_gas_resp_fragment_multiple_tails,
+ {"GAS Query Response has multiple tail fragments", "wlan.fixed.fragment.multiple_tails",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
+
+ {&hf_ieee80211_gas_resp_fragment_too_long_fragment,
+ {"GAS Query Response fragment too long", "wlan.fixed.fragment.too_long_fragment",
+ FT_BOOLEAN, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
+
+ {&hf_ieee80211_gas_resp_fragment_error,
+ {"GAS Query Response reassembly error", "wlan.fixed.fragment.error",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
- {&hf_ieee80211_tag_state2,
- {"State 2", "wlan.sctor_id.state2",
- FT_UINT32, BASE_HEX, NULL, 0xff000000,
- NULL, HFILL }},
+ {&hf_ieee80211_gas_resp_fragment_count,
+ {"GAS Query Response fragment count", "wlan.fixed.fragment.count",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ NULL, HFILL } },
- {&hf_ieee80211_tag_allocation_id,
- {"Allocation ID", "wlan.ext_sched.alloc_id",
- FT_UINT16, BASE_DEC, NULL, 0x000f,
- NULL, HFILL }},
+ {&hf_ieee80211_gas_resp_reassembled_in,
+ {"Reassembled in", "wlan.fixed.reassembled.in",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x00,
+ NULL, HFILL } },
- {&hf_ieee80211_tag_allocation_type,
- {"Allocation Type", "wlan.ext_sched.alloc_type",
- FT_UINT16, BASE_DEC, VALS(allocation_type), 0x0070,
- NULL, HFILL }},
+ {&hf_ieee80211_gas_resp_reassembled_length,
+ {"Reassembled length", "wlan.fixed.reassembled.length",
+ FT_UINT32, BASE_DEC, NULL, 0x00,
+ NULL, HFILL } },
- {&hf_ieee80211_tag_pseudo_static,
- {"Pseudo-static", "wlan.ext_sched.p_static",
- FT_BOOLEAN, 16, NULL, 0x0080,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_info_id,
+ {"Info ID", "wlan.fixed.anqp.info_id",
+ FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
+ "Access Network Query Protocol Info ID", HFILL }},
- {&hf_ieee80211_tag_truncatable,
- {"Truncatable", "wlan.ext_sched.truncatable",
- FT_BOOLEAN, 16, NULL, 0x0100,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_info_length,
+ {"Length", "wlan.fixed.anqp.info_length",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Access Network Query Protocol Length", HFILL }},
- {&hf_ieee80211_tag_extendable,
- {"Extenedable", "wlan.ext_sched.extendable",
- FT_BOOLEAN, 16, NULL, 0x0200,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_info,
+ {"Information", "wlan.fixed.anqp.info",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Access Network Query Protocol Information", HFILL }},
- {&hf_ieee80211_tag_pcp_active,
- {"PCP Active", "wlan.ext_sched.pcp_active",
- FT_BOOLEAN, 16, NULL, 0x0400,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_query_id,
+ {"ANQP Query ID", "wlan.fixed.anqp.query_id",
+ FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
+ "Access Network Query Protocol Query ID", HFILL }},
- {&hf_ieee80211_tag_lp_sc_used,
- {"LP SC Used", "wlan.ext_sched.lp_sc_used",
- FT_BOOLEAN, 16, NULL, 0x0800,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_capability,
+ {"ANQP Capability", "wlan.fixed.anqp.capability",
+ FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
+ "Access Network Query Protocol Query ID", HFILL }},
- {&hf_ieee80211_tag_src_aid,
- {"Source AID", "wlan.ext_sched.src_id",
- FT_UINT8, BASE_DEC, NULL, 0xff,
+ {&hf_ieee80211_ff_anqp_capability_vlen,
+ {"Vendor-specific Capability Length", "wlan.fixed.anqp.capability_vlen",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_dest_aid,
- {"Destination AID", "wlan.ext_sched.dest_id",
- FT_UINT8, BASE_DEC, NULL, 0xff,
+ {&hf_ieee80211_ff_anqp_capability_vendor,
+ {"Vendor-specific Capability", "wlan.fixed.anqp.capability_vendor",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_alloc_start,
- {"Allocation Start", "wlan.ext_sched.alloc_start",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_venue_info_group,
+ {"Venue Group", "wlan.fixed.venue_info.group",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &venue_group_vals_ext, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_alloc_block_duration,
- {"Allocation Block Duration", "wlan.ext_sched.block_duration",
- FT_UINT16, BASE_DEC, NULL, 0xffff,
+ {&hf_ieee80211_ff_venue_info_type,
+ {"Venue Type", "wlan.fixed.venue_info.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_num_blocks,
- {"Number of Blocks", "wlan.ext_sched.num_blocks",
- FT_UINT8, BASE_DEC, NULL, 0xff,
+ {&hf_ieee80211_ff_anqp_venue_length,
+ {"Venue Name Duple Length", "wlan.fixed.anqp.venue.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_alloc_block_period,
- {"Allocation Block Period", "wlan.ext_sched.alloc_block_period",
- FT_UINT16, BASE_DEC, NULL, 0xffff,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_venue_language,
+ {"Language Code", "wlan.fixed.anqp.venue.language",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Venue Name Language Code", HFILL }},
- {&hf_ieee80211_tag_aid,
- {"AID", "wlan.sta_avail.aid",
- FT_UINT16, BASE_DEC, NULL, 0x00ff,
+ {&hf_ieee80211_ff_anqp_venue_name,
+ {"Venue Name", "wlan.fixed.anqp.venue.name",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_cbap,
- {"CBAP", "wlan.sta_avail.cbap",
- FT_BOOLEAN, 16, NULL, 0x0100,
+ {&hf_ieee80211_ff_anqp_nw_auth_type_indicator,
+ {"Network Authentication Type Indicator", "wlan.fixed.anqp.nw_auth_type.indicator",
+ FT_UINT8, BASE_DEC, VALS(nw_auth_type_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_pp_avail,
- {"PP Available", "wlan.sta_avail.pp_avail",
- FT_BOOLEAN, 16, NULL, 0x0200,
+ {&hf_ieee80211_ff_anqp_nw_auth_type_url_len,
+ {"Re-direct URL Length", "wlan.fixed.anqp.nw_auth_type.url_len",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_next_ati_start_time,
- {"Start Time", "wlan.next_ati.start_time",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_ff_anqp_nw_auth_type_url,
+ {"Re-direct URL", "wlan.fixed.anqp.nw_auth_type_url",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_next_ati_duration,
- {"ATI Duration", "wlan.next_ati.duration",
- FT_UINT16, BASE_DEC, NULL, 0xffff,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_anqp_roaming_consortium_oi_len,
+ {"OI Length", "wlan.fixed.anqp.roaming_consortium.oi_len",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Roaming Consortium OI Length", HFILL }},
- {&hf_ieee80211_tag_old_bssid,
- {"Old BSSID", "wlan.pcp_handover.old_bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
- "OLD_BSSID", HFILL }},
+ {&hf_ieee80211_ff_anqp_roaming_consortium_oi,
+ {"OI", "wlan.fixed.anqp.roaming_consortium.oi",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Roaming Consortium OI", HFILL }},
- {&hf_ieee80211_tag_new_pcp_addr,
- {"New PCP Address", "wlan.pcp_handover.new_pcp_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "New_PCP_Address", HFILL }},
+ {&hf_ieee80211_ff_anqp_ip_addr_avail_ipv6,
+ {"IPv6 Address", "wlan.fixed.anqp.ip_addr_availability.ipv6",
+ FT_UINT8, BASE_DEC, VALS(ip_addr_avail_ipv6_vals), 0x03,
+ "IP Address Type Availability information for IPv6", HFILL }},
- {&hf_ieee80211_tag_bssid,
- {"BSSID", "wlan.quiet_res.bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
- "BSS-ID", HFILL }},
+ {&hf_ieee80211_ff_anqp_ip_addr_avail_ipv4,
+ {"IPv4 Address", "wlan.fixed.anqp.ip_addr_availability.ipv4",
+ FT_UINT8, BASE_DEC, VALS(ip_addr_avail_ipv4_vals), 0xfc,
+ "IP Address Type Availability information for IPv4", HFILL }},
- {&hf_ieee80211_tag_duplex_relay,
- {"Duplex", "wlan.relay_capabilities.duplex",
- FT_UINT8, BASE_DEC, NULL, 0x01,
+ {&hf_ieee80211_ff_anqp_nai_realm_count,
+ {"NAI Realm Count", "wlan.fixed.anqp.nai_realm_list.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_cooperation_relay,
- {"Cooperation", "wlan.relay_capabilities.cooperation",
- FT_BOOLEAN, 8, NULL, 0x02,
+ {&hf_ieee80211_ff_anqp_nai_field_len,
+ {"NAI Realm Data Field Length", "wlan.fixed.anqp.nai_realm_list.field_len",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tx_mode,
- {"TX-Mode", "wlan.realy_trans_param.tx_mode",
- FT_BOOLEAN, 8, NULL, 0x04,
+ {&hf_ieee80211_ff_anqp_nai_realm_encoding,
+ {"NAI Realm Encoding", "wlan.fixed.naqp_nai_realm_list.encoding",
+ FT_UINT8, BASE_DEC, VALS(nai_realm_encoding_vals), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_tag_link_change_interval,
- {"Link Change Interval", "wlan.realy_trans_param.link_change_interval",
- FT_UINT8, BASE_CUSTOM, CF_FUNC(allocation_duration_base_custom), 0xff,
+ {&hf_ieee80211_ff_anqp_nai_realm_length,
+ {"NAI Realm Length", "wlan.fixed.naqp_nai_realm_list.realm_length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_data_sensing_time,
- {"Data Sensing Time", "wlan.realy_trans_param.data_sensing_time",
- FT_UINT8, BASE_DEC, NULL, 0xff,
+ {&hf_ieee80211_ff_anqp_nai_realm,
+ {"NAI Realm", "wlan.fixed.naqp_nai_realm_list.realm",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_first_period,
- {"First Period", "wlan.realy_trans_param.first_period",
- FT_UINT16, BASE_DEC, NULL, 0xffff,
+ {&hf_ieee80211_ff_anqp_nai_realm_eap_count,
+ {"EAP Method Count", "wlan.fixed.naqp_nai_realm_list.eap_method_count",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_second_period,
- {"Second Period", "wlan.realy_trans_param.second_period",
- FT_UINT16, BASE_DEC, NULL, 0xffff,
+ {&hf_ieee80211_ff_anqp_nai_realm_eap_len,
+ {"EAP Method subfield Length", "wlan.fixed.naqp_nai_realm_list.eap_method_len",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_initiator,
- {"Initiator", "wlan.beam_refine.initiator",
- FT_BOOLEAN, 40, NULL, 0x0000000001,
+ {&hf_ieee80211_ff_anqp_nai_realm_eap_method,
+ {"EAP Method", "wlan.fixed.naqp_nai_realm_list.eap_method",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &eap_type_vals_ext, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tx_train_res,
- {"TX-train-response", "wlan.beam_refine.tx_train_res",
- FT_BOOLEAN, 40, NULL, 0x0000000002,
+ {&hf_ieee80211_ff_anqp_nai_realm_auth_param_count,
+ {"Authentication Parameter Count", "wlan.fixed.naqp_nai_realm_list.auth_param_count",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rx_train_res,
- {"RX-train-response", "wlan.beam_refine.rx_train_res",
- FT_BOOLEAN, 40, NULL, 0x0000000004,
+ {&hf_ieee80211_ff_anqp_nai_realm_auth_param_id,
+ {"Authentication Parameter ID", "wlan.fixed.naqp_nai_realm_list.auth_param_id",
+ FT_UINT8, BASE_DEC, VALS(nai_realm_auth_param_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tx_trn_ok,
- {"TX-TRN-OK", "wlan.beam_refine.tx_trn_ok",
- FT_BOOLEAN, 40, NULL, 0x0000000008,
+ {&hf_ieee80211_ff_anqp_nai_realm_auth_param_len,
+ {"Authentication Parameter Length", "wlan.fixed.naqp_nai_realm_list.auth_param_len",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_txss_fbck_req,
- {"TXSS-FBCK-REQ", "wlan.beam_refine.txss_fbck_req",
- FT_BOOLEAN, 40, NULL, 0x0000000010,
+ {&hf_ieee80211_ff_anqp_nai_realm_auth_param_value,
+ {"Authentication Parameter Value", "wlan.fixed.naqp_nai_realm_list.auth_param_value",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bs_fbck,
- {"BS-FBCK", "wlan.beam_refine.bs_fbck",
- FT_UINT40, BASE_DEC, NULL, 0x00000007e0,
- NULL, HFILL }},
+ {&hf_ieee80211_3gpp_gc_gud,
+ {"GUD", "wlan.fixed.anqp.3gpp_cellular_info.gud",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Generic container User Data", HFILL }},
- {&hf_ieee80211_tag_bs_fbck_antenna_id,
- {"BS-FBCK Anetenna ID", "wlan.beam_refine.bs_fbck_antenna_id",
- FT_UINT40, BASE_DEC, NULL, 0x0000001800,
- NULL, HFILL }},
+ {&hf_ieee80211_3gpp_gc_udhl,
+ {"UDHL", "wlan.fixed.anqp.3gpp_cellular_info.udhl",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "User Data Header Length", HFILL }},
+
+ {&hf_ieee80211_3gpp_gc_iei,
+ {"IEI", "wlan.fixed.anqp.3gpp_cellular_info.iei",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Information Element Identity", HFILL }},
+
+ {&hf_ieee80211_3gpp_gc_plmn_len,
+ {"PLMN Length", "wlan.fixed.anqp.3gpp_cellular_info.plmn_len",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Length of PLMN List value contents", HFILL }},
- {&hf_ieee80211_tag_snr_requested,
- {"SNR Requested", "wlan.beam_refine.snr_req",
- FT_BOOLEAN, 40, NULL, 0x0000002000,
+ {&hf_ieee80211_3gpp_gc_num_plmns,
+ {"Number of PLMNs", "wlan.fixed.anqp.3gpp_cellular_info.num_plmns",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_channel_measurement_requested,
- {"Channel Measurement Requested", "wlan.beam_refine.ch_measure_req",
- FT_BOOLEAN, 40, NULL, 0x0000004000,
- NULL, HFILL }},
+ {&hf_ieee80211_3gpp_gc_plmn,
+ {"PLMN", "wlan.fixed.anqp.3gpp_cellular_info.plmn_info",
+ FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_number_of_taps_requested,
- {"Number of Taps Requested", "wlan.beam_refine.taps_req",
- FT_UINT40, BASE_DEC | BASE_VAL64_STRING, VALS64(number_of_taps_values), 0x0000018000,
+ {&hf_ieee80211_ff_anqp_domain_name_len,
+ {"Domain Name Length", "wlan.fixed.anqp.domain_name_list.len",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_sector_id_order_req,
- {"Sector ID Order Requested", "wlan.beam_refine.sector_id_req",
- FT_BOOLEAN, 40, NULL, 0x0000020000,
+ {&hf_ieee80211_ff_anqp_domain_name,
+ {"Domain Name", "wlan.fixed.anqp.domain_name_list.name",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_snr_present,
- {"SNR Present", "wlan.beam_refine.snr_present",
- FT_BOOLEAN, 40, NULL, 0x0000040000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_dls_timeout,
+ {"DLS timeout", "wlan.fixed.dls_timeout",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "DLS timeout value", HFILL }},
- {&hf_ieee80211_tag_channel_measurement_present,
- {"Channel Measurement Present", "wlan.beam_refine.ch_measure_present",
- FT_BOOLEAN, 40, NULL, 0x0000080000,
- NULL, HFILL }},
+ {&hf_ieee80211_ff_sa_query_action_code,
+ {"Action code", "wlan.fixed.action_code",
+ FT_UINT8, BASE_DEC, VALS(sa_query_action_codes), 0,
+ "Management action code", HFILL }},
- {&hf_ieee80211_tag_tap_delay_present,
- {"Tap Delay Present", "wlan.beam_refine.tap_delay_present",
- FT_BOOLEAN, 40, NULL, 0x0000100000,
+ {&hf_ieee80211_ff_transaction_id,
+ {"Transaction Id", "wlan.fixed.transaction_id",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_number_of_taps_present,
- {"Number of Taps Present", "wlan.beam_refine.taps_present",
- FT_UINT40, BASE_DEC | BASE_VAL64_STRING, VALS64(number_of_taps_values), 0x0000600000,
+ {&hf_ieee80211_ff_send_confirm,
+ {"Send-Confirm", "wlan.fixed.send_confirm",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_number_of_measurement,
- {"Number of Measurements", "wlan.beam_refine.num_measurement",
- FT_UINT40, BASE_DEC, NULL, 0x003f800000,
+ {&hf_ieee80211_ff_anti_clogging_token,
+ {"Anti-Clogging Token", "wlan.fixed.anti_clogging_token",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_sector_id_order_present,
- {"Sector ID Order Present", "wlan.beam_refine.sector_id_present",
- FT_BOOLEAN, 40, NULL, 0x0040000000,
+ {&hf_ieee80211_ff_scalar,
+ {"Scalar", "wlan.fixed.scalar",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_number_of_beams,
- {"Number of Beams", "wlan.beam_refine.num_beams",
- FT_UINT40, BASE_DEC, NULL, 0x0f80000000,
+ {&hf_ieee80211_ff_finite_field_element,
+ {"Finite Field Element", "wlan.fixed.finite_field_element",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_mid_extension,
- {"MID Extension", "wlan.beam_refine.mid_ext",
- FT_BOOLEAN, 40, NULL, 0x1000000000,
+ {&hf_ieee80211_ff_confirm,
+ {"Confirm", "wlan.fixed.confirm",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_capability_request,
- {"Capability Request", "wlan.beam_refine.cap_req",
- FT_BOOLEAN, 40, NULL, 0x2000000000,
+ {&hf_ieee80211_ff_finite_cyclic_group,
+ {"Group Id", "wlan.fixed.finite_cyclic_group",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_beam_refine_reserved,
- {"Reserved", "wlan.beam_refine.reserved",
- FT_UINT40, BASE_DEC, NULL, 0xc000000000,
- NULL, HFILL }},
+ {&hf_ieee80211_anqp_wfa_subtype,
+ {"WFA Subtype", "wlan.anqp.wfa.subtype",
+ FT_UINT8, BASE_DEC, VALS(wfa_subtype_vals), 0, NULL, HFILL }},
- {&hf_ieee80211_tag_nextpcp_list,
- {"AID of NextPCP", "wlan.next_pcp.list",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_dpp_subtype,
+ {"DPP Subtype", "wlan.wfa.dpp.subtype",
+ FT_UINT8, BASE_DEC, VALS(dpp_subtype_vals), 0, NULL, HFILL }},
- {&hf_ieee80211_tag_nextpcp_token,
- {"NextPCP List Token", "wlan.next_pcp.token",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_indication_dgaf_disabled,
+ {"DGAF Disabled", "wlan.hs20.indication.dgaf_disabled",
+ FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
- {&hf_ieee80211_tag_reamaining_BI,
- {"Remaining BI's", "wlan.pcp_handover.remaining_BIs",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_indication_pps_mo_id_present,
+ {"PPS MO ID Present", "wlan.hs20.indication.pps_mo_id_present",
+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, NULL, HFILL }},
- {&hf_ieee80211_tag_request_token,
- {"Request Token", "wlan.request_token",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_indication_anqp_domain_id_present,
+ {"ANQP Domain ID Present", "wlan.hs20.indication.anqp_domain_id_present",
+ FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL }},
- {&hf_ieee80211_tag_bi_start_time,
- {"BI Start Time", "wlan.bi_start_time",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_reserved,
+ { "Reserved", "wlan.hs20.indication.reserved",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80, NULL, HFILL }},
- {&hf_ieee80211_tag_sleep_cycle,
- {"Sleep Cycle", "wlan.sleep_cycle",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_indication_release_number,
+ {"Release Number", "wlan.hs20.indication.release_number",
+ FT_UINT8, BASE_DEC, VALS(hs20_indication_release_number_vals), 0xF0, NULL, HFILL }},
- {&hf_ieee80211_tag_num_awake_bis,
- {"Number of Awake/Doze BIs", "wlan.num_awake_bis",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_indication_pps_mo_id,
+ {"PPS MO ID", "wlan.hs20.indication.pps_mo_id",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_dmg_action_code,
- {"DMG Action", "wlan.fixed.dmg_act",
- FT_UINT8, BASE_HEX, VALS(ff_dmg_action_flags), 0,
- "Action Code", HFILL }},
+ {&hf_hs20_indication_anqp_domain_id,
+ {"ANQP Domain ID", "wlan.hs20.indication.domain_id",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_unprotected_dmg_action_code,
- {"Unprotected DMG Action", "wlan.fixed.unprotected_dmg_act",
- FT_UINT8, BASE_HEX, VALS(ff_unprotected_dmg_action_flags), 0,
- "Action Code", HFILL }},
+ {&hf_hs20_anqp_subtype,
+ {"Subtype", "wlan.hs20.anqp.subtype",
+ FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
+ "Hotspot 2.0 ANQP Subtype", HFILL }},
- {&hf_ieee80211_ff_dmg_pwr_mgmt,
- {"DMG Power Management", "wlan.dmg.pwr_mgmt",
- FT_BOOLEAN, 8, NULL, 0x01,
- NULL, HFILL }},
+ {&hf_hs20_anqp_reserved,
+ {"Reserved", "wlan.hs20.anqp.reserved",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_subject_address,
- {"Subject Address", "wlan.dmg.subject_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "MAC address of requested STA", HFILL }},
+ {&hf_hs20_anqp_payload,
+ {"Payload", "wlan.hs20.anqp.payload",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Hotspot 2.0 ANQP Payload", HFILL }},
- {&hf_ieee80211_ff_handover_reason,
- {"Handover Reason", "wlan.dmg.handover_reason",
- FT_UINT8, BASE_DEC, NULL, 0x03,
- NULL, HFILL }},
+ {&hf_hs20_anqp_hs_query_list,
+ {"Queried Subtype", "wlan.hs20.anqp.hs_query_list",
+ FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
+ "Queried HS 2.0 Element Subtype", HFILL }},
- {&hf_ieee80211_ff_handover_remaining_bi,
- {"Handover Remaining BI", "wlan.dmg.handover_remaining_bi",
- FT_UINT8, BASE_DEC, NULL, 0x01,
- NULL, HFILL }},
+ {&hf_hs20_anqp_hs_capability_list,
+ {"Capability", "wlan.hs20.anqp.hs_capability_list",
+ FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
+ "Hotspot 2.0 ANQP Subtype Capability", HFILL }},
- {&hf_ieee80211_ff_handover_result,
- {"Handover Result", "wlan.dmg.handover_result",
- FT_UINT8, BASE_DEC, NULL, 0x01,
- NULL, HFILL }},
+ {&hf_hs20_anqp_ofn_length,
+ {"Length", "wlan.hs20.anqp.ofn.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Operator Friendly Name Length", HFILL }},
- {&hf_ieee80211_ff_handover_reject_reason,
- {"Handover Reject Reason", "wlan.dmg.handover_reject_reason",
- FT_UINT8, BASE_DEC, NULL, 0x03,
- NULL, HFILL }},
+ {&hf_hs20_anqp_ofn_language,
+ {"Language Code", "wlan.hs20.anqp.ofn.language",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Operator Friendly Name Language Code", HFILL }},
- {&hf_ieee80211_ff_destination_reds_aid,
- {"Destination REDS AID", "wlan.dmg.destination_reds_aid",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_ofn_name,
+ {"Operator Friendly Name", "wlan.hs20.anqp.ofn.name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_destination_aid,
- {"Destination AID", "wlan.dmg.destination_aid",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_link_status,
+ {"Link Status", "wlan.hs20.anqp.wan_metrics.link_status",
+ FT_UINT8, BASE_DEC, VALS(hs20_wm_link_status_vals), 0x03, NULL, HFILL }},
- {&hf_ieee80211_ff_realy_aid,
- {"Relay AID", "wlan.dmg.realy_aid",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_symmetric_link,
+ {"Symmetric Link", "wlan.hs20.anqp.wan_metrics.symmetric_link",
+ FT_UINT8, BASE_DEC, NULL, 0x04, NULL, HFILL }},
- {&hf_ieee80211_ff_source_aid,
- {"Source AID", "wlan.dmg.source_aid",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_at_capacity,
+ {"At Capacity", "wlan.hs20.anqp.wan_metrics.at_capacity",
+ FT_UINT8, BASE_DEC, NULL, 0x08, NULL, HFILL }},
- {&hf_ieee80211_ff_timing_offset,
- {"Timing Offset", "wlan.dmg.timing_offset",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_reserved,
+ {"Reserved", "wlan.hs20.anqp.wan_metrics.reserved",
+ FT_UINT8, BASE_DEC, NULL, 0xf0, NULL, HFILL }},
- {&hf_ieee80211_ff_sampling_frequency_offset,
- {"Sampling Frequency Offset", "wlan.dmg.sampling_frequency_offset",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_downlink_speed,
+ {"Downlink Speed", "wlan.hs20.anqp.wan_metrics.downlink_speed",
+ FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_relay_operation_type,
- {"Relay Operation Type", "wlan.dmg.relay_operation_type",
- FT_UINT8, BASE_DEC, NULL, 0x03,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_uplink_speed,
+ {"Uplink Speed", "wlan.hs20.anqp.wan_metrics.uplink_speed",
+ FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_peer_sta_aid,
- {"Peer STA AID", "wlan.dmg.peer_sta_aid",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_downlink_load,
+ {"Downlink Load", "wlan.hs20.anqp.wan_metrics.downlink_load",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_snr,
- {"SNR", "wlan.dmg.snr",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_uplink_load,
+ {"Uplink Load", "wlan.hs20.anqp.wan_metrics.uplink_load",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_internal_angle,
- {"Internal Angle", "wlan.dmg.internal_angle",
- FT_UINT8, BASE_DEC, NULL, 0xfe,
- NULL, HFILL }},
+ {&hf_hs20_anqp_wan_metrics_lmd,
+ {"LMD", "wlan.hs20.anqp.wan_metrics.lmd",
+ FT_UINT16, BASE_DEC, NULL, 0, "Load Measurement Duration", HFILL }},
- {&hf_ieee80211_ff_recommend,
- {"Recommend", "wlan.dmg.recommend",
- FT_UINT8, BASE_DEC, NULL, 0x01,
- NULL, HFILL }},
+ {&hf_hs20_anqp_cc_proto_ip_proto,
+ {"IP Protocol", "wlan.hs20.anqp.cc.ip_proto",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "ProtoPort Tuple - IP Protocol", HFILL }},
- {&hf_ieee80211_ff_fst_action_code,
- {"FST Action Code", "wlan.fst.action_code",
- FT_UINT8, BASE_HEX, VALS(ff_fst_action_flags), 0,
- "Action Code", HFILL }},
+ {&hf_hs20_anqp_cc_proto_port_num,
+ {"Port Number", "wlan.hs20.anqp.cc.port_num",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "ProtoPort Tuple - Port Number", HFILL }},
- {&hf_ieee80211_ff_llt,
- {"Link Loss Timeout", "wlan.fst.llt",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_cc_proto_status,
+ {"Status", "wlan.hs20.anqp.cc.status",
+ FT_UINT8, BASE_DEC, VALS(hs20_cc_status_vals), 0,
+ "ProtoPort Tuple - Status", HFILL }},
- {&hf_ieee80211_ff_fsts_id,
- {"FSTS ID", "wlan.session_trans.fsts_id",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_nai_hrq_count,
+ {"NAI Home Realm Count", "wlan.hs20.anqp.nai_hrq.count",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_mmpdu_len,
- {"MMPDU Length", "wlan.fst.mmpdu_length",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_nai_hrq_encoding_type,
+ {"NAI Home Realm Encoding Type",
+ "wlan.hs20.anqp.nai_hrq.encoding_type",
+ FT_UINT8, BASE_DEC, VALS(nai_realm_encoding_vals),
+ 0x01, NULL, HFILL }},
- {&hf_ieee80211_ff_mmpdu_ctrl,
- {"MMPDU Control", "wlan.fst.mmpdu_ctrl",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_nai_hrq_length,
+ {"NAI Home Realm Name Length", "wlan.hs20.anqp.nai_hrq.length",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_oct_mmpdu,
- {"OCT MMPDU", "wlan.fst.oct_mmpdu",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_nai_hrq_realm_name,
+ {"NAI Home Realm Name", "wlan.hs20.anqp.nai_hrq.name",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl,
- {"VHT MIMO Control", "wlan.vht.mimo_control.control",
- FT_UINT24, BASE_HEX, NULL, 0x0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_oper_class_indic,
+ {"Operating Class", "wlan.hs20.anqp.oper_class_indic.oper_class",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_nc_index,
- {"Nc Index", "wlan.vht.mimo_control.ncindex",
- FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_nc_index_vals), 0x000007,
- "Number of Columns Less One", HFILL }},
+ {&hf_hs20_osu_friendly_names_len,
+ {"OSU Friendly Name Length", "wlan.hs20.osu_friendly_names_len",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_nr_index,
- {"Nr Index", "wlan.vht.mimo_control.nrindex",
- FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_nr_index_vals), 0x000038,
- "Number of Rows Less One", HFILL }},
+ {&hf_hs20_osu_friendly_name_length,
+ {"Length", "wlan.hs20.osu_friendly_name.len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_channel_width,
- {"Channel Width", "wlan.vht.mimo_control.chanwidth",
- FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_channel_width_vals), 0x0000C0,
- NULL, HFILL }},
+ {&hf_hs20_osu_friendly_name_language,
+ {"Language Code", "wlan.hs20.osu_friendly_name.language",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_grouping,
- {"Grouping (Ng)", "wlan.vht.mimo_control.grouping",
- FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_grouping_vals), 0x000300,
- NULL, HFILL }},
+ {&hf_hs20_osu_friendly_name_name,
+ {"OSU Friendly Name", "wlan.hs20.osu_friendly_name.name",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_codebook_info,
- {"Codebook Information", "wlan.vht.mimo_control.codebookinfo",
- FT_UINT24, BASE_HEX, NULL, 0x000400,
- NULL, HFILL }},
+ {&hf_hs20_osu_server_uri_len,
+ {"OSU Server URI Length", "wlan.hs20.osu_server_uri_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_feedback_type,
- {"Feedback Type", "wlan.vht.mimo_control.feedbacktype",
- FT_UINT24, BASE_HEX, VALS(ff_vht_mimo_cntrl_feedback_vals), 0x000800,
- NULL, HFILL }},
+ {&hf_hs20_osu_server_uri,
+ {"OSU Server URI", "wlan.hs20.osu_server_uri",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_remaining_feedback_seg,
- {"Remaining Feedback Segments", "wlan.vht.mimo_control.remainingfeedbackseg",
- FT_UINT24, BASE_HEX, NULL, 0x007000,
- NULL, HFILL }},
+ {&hf_hs20_osu_method_list_len,
+ {"OSU Method List Length", "wlan.hs20.osu_method_list_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_first_feedback_seg,
- {"First Feedback Segments", "wlan.vht.mimo_control.firstfeedbackseg",
- FT_UINT24, BASE_HEX, NULL, 0x008000,
- NULL, HFILL }},
+ {&hf_hs20_osu_method_val,
+ {"OSU Method", "wlan.hs20.osu_method_list.method",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_reserved,
- {"Reserved", "wlan.vht.mimo_control.reserved",
- FT_UINT24, BASE_HEX, NULL, 0x030000,
- NULL, HFILL }},
+ {&hf_hs20_icons_avail_len,
+ {"Icons Available Length", "wlan.hs20.osu_icons_avail_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_mimo_cntrl_sounding_dialog_token_number,
- {"Sounding Dialog Toker Number", "wlan.vht.mimo_control.soundingdialogtocketnbr",
- FT_UINT24, BASE_HEX, NULL, 0xFC0000,
- NULL, HFILL }},
+ {&hf_hs20_osu_providers_list_ssid_len,
+ {"SSID Length", "wlan.hs20.anqp_osu_prov_list.ssid_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_ff_vht_action,
- {"VHT Action", "wlan.vht.action",
- FT_UINT8, BASE_DEC, VALS(vht_action_vals), 0,
- NULL, HFILL }},
+ {&hf_hs20_osu_providers_ssid,
+ {"SSID", "wlan.hs20.anqp_osu_prov_list.ssid",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_compressed_beamforming_report,
- {"VHT Compressed Beamforming Report", "wlan.vht.compressed_beamforming_report",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_osu_providers_count,
+ {"Number of OSU Providers", "wlan.hs20.anqp_osu_prov_list.number",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_mu_exclusive_beamforming_report,
- {"VHT MU Exclusive Beamforming Report","wlan.vht.exclusive_beamforming_report",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_osu_prov_length,
+ {"OSU Provider Length", "wlan.hs20.anqp_osu_prov.len",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_compressed_beamforming_report_snr,
- {"Signal to Noise Ratio (SNR)", "wlan.vht.compressed_beamforming_report.snr",
- FT_INT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_icon_request_filename,
+ {"Icon Filename", "wlan.hs20.anqp_icon_request.icon_filename",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_compressed_beamforming_phi_angle,
- {"PHI", "wlan.vht.compressed_beamforming_report.phi",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_width,
+ {"Icon Width", "wlan.hs20.osu_icons_avail.icon_width",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_compressed_beamforming_psi_angle,
- {"PSI", "wlan.vht.compressed_beamforming_report.psi",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_height,
+ {"Icon Height", "wlan.hs20.osu_icons_avail.icon_height",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_compressed_beamforming_feedback_matrix,
- {"Compressed Beamforming Feedback Matrix", "wlan.vht.compressed_beamforming_report.feedback_matrix",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_lang_code,
+ {"Language Code", "wlan.hs20.osu_icons_avail.lang_code",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_mu_Exclusive_beamforming_delta_snr,
- {"Delta SNR for space-time stream Nc for subcarrier k", "wlan.vht.exclusive_beamforming_report.delta_snr",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_icon_type_len,
+ {"Icon Type Length", "wlan.hs20.osu_icons_avail.icon_type_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_group_id_management,
- {"Group ID Management", "wlan.vht.group_id_management",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_icon_type,
+ {"Icon Type", "wlan.hs20.osu_icons_avail.icon_type",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_membership_status_array,
- {"Membership Status Array", "wlan.vht.membership_status_array",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_filename_len,
+ {"Icon Filename Length", "wlan.hs20.osu_icons_avail.icon_filename_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_user_position_array,
- {"User Position Array", "wlan.vht.user_position_array",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osu_icon_avail_filename,
+ {"Icon Filename", "wlan.hs20.osu_icons_avail.icon_filename",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_membership_status_field,
- {"Membership Status Field", "wlan.vht.membership_status_array.field",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_osu_nai_len,
+ {"OSU_NAI Length", "wlan.hs20.osu_nai.len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_user_position_field,
- {"User Position Field", "wlan.vht.user_position_array.field",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_osu_nai,
+ {"OSU_NAI", "wlan.hs20.osu_nai",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vht_operation_mode_notification,
- {"Operation Mode Notification", "wlan.vht.operation_mode_notification",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_osu_service_desc_len,
+ {"OSU Service Desctription Length", "wlan.hs20.osu_service_desc_len",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_allocation_id,
- {"Allocation ID", "wlan.dmg_tspec.allocation_id",
- FT_UINT24, BASE_DEC, NULL, 0x00000f,
- NULL, HFILL }},
+ {&hf_hs20_osu_service_desc_duple_len,
+ {"Length", "wlan.hs20.osu_service_desc.duple.len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_allocation_type,
- {"Allocation Type", "wlan.dmg_tspec.allocation_type",
- FT_UINT24, BASE_DEC, NULL, 0x000070,
- NULL, HFILL }},
+ {&hf_hs20_osu_service_desc_lang,
+ {"Language Code", "wlan.hs20.osu_service_desc.duple.lang",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_allocation_format,
- {"Allocation Format", "wlan.dmg_tspec.allocation_format",
- FT_BOOLEAN, 24, NULL, 0x000080,
- NULL, HFILL }},
+ {&hf_hs20_osu_service_desc,
+ {"OSU Service Description", "wlan.hs20.osu_service_desc.duple.desc",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_pseudo_static,
- {"Pseudo Static", "wlan.dmg_tspec.pseudo_static",
- FT_BOOLEAN, 24, NULL, 0x000100,
- NULL, HFILL }},
+ {&hf_hs20_icon_binary_file_status,
+ {"Download Status Code", "wlan.hs20.anqp_icon_request.download_status",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_truncatable,
- {"Truncatable", "wlan.dmg_tspec.truncatable",
- FT_BOOLEAN, 24, NULL, 0x000200,
- NULL, HFILL }},
+ {&hf_hs20_icon_type_length,
+ {"Icon Type Length", "wlan.hs20.anqp_icon_request.icon_type_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_extendable,
- {"Extendable", "wlan.dmg_tspec.extendable",
- FT_BOOLEAN, 24, NULL, 0x000400,
- NULL, HFILL }},
+ {&hf_hs20_icon_type,
+ {"Icon Type", "wlan.hs20.anqp_icon_request.icon_type",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_lp_sc_used,
- {"LP SC Usec", "wlan.dmg_tspec.lp_sc_used",
- FT_BOOLEAN, 24, NULL, 0x000800,
- NULL, HFILL }},
+ {&hf_hs20_icon_binary_data_len,
+ {"Icon Binary Data Length", "wlan.anqp_icon_request.icon_binary_data_len",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_up,
- {"UP", "wlan.dmg_tspec.up",
- FT_UINT24, BASE_HEX, NULL, 0x007000,
- NULL, HFILL }},
+ {&hf_hs20_icon_binary_data,
+ {"Icon Binary Data", "wlan.h220.anqp_icon_request.icon_binary_data",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_dest_aid,
- {"Destination AID", "wlan.dmg_tspec.dest_aid",
- FT_UINT24, BASE_HEX, NULL, 0x7f8000,
- NULL, HFILL }},
+ {&hf_hs20_subscription_remediation_url_len,
+ {"Server URL Length", "wlan.hs20.subs_remediation.server_url_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_allocation_period,
- {"Allocation Period", "wlan.dmg_tspec.allocation_period",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_subscription_remediation_server_url,
+ {"Server URL", "wlan.hs20.subs_remediation.server_url",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_min_allocation,
- {"Minimal Allocation", "wlan.dmg_tspec.min_allocation",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_subscription_remediation_server_method,
+ {"Server Method", "wlan.hs20.subs_remediation.server_method",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_max_allocation,
- {"Maximal Allocation", "wlan.dmg_tspec.max_allocation",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_deauth_reason_code,
+ {"De-Auth Reason Code", "wlan.hs20.deauth.reason_code",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_min_duration,
- {"Minimal Duration", "wlan.dmg_tspec.min_duration",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_reauth_delay,
+ {"Re-Auth Delay", "wlan.hs20.deauth.reauth_delay",
+ FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_seconds, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_num_of_constraints,
- {"Number Of Constraints", "wlan.dmg_tspec.num_of_constraints",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_deauth_reason_url_len,
+ {"Reason URL Length", "wlan.hs20.deauth.reason_url_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_tsconst_start_time,
- {"TS Constraint Start Time", "wlan.dmg_tspec.tsconst.start_time",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_deauth_imminent_reason_url,
+ {"Reason URL", "wlan.hs20.deauth.reason_url",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_tsconst_duration,
- {"TS Constraint Duration", "wlan.dmg_tspec.tsconst.duration",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_venue_url_length,
+ {"Length", "wlan.hs20.venue_url.len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_tsconst_period,
- {"TS Constraint Period", "wlan.dmg_tspec.tsconst.period",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_venue_number,
+ {"Venue number", "wlan.hs20.venue_url.venue_num",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_tspec_tsconst_interferer_mac,
- {"TS Constraint Interferer MAC Address", "wlan.dmg_tspec.tsconst.interferer_mac",
- FT_ETHER, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_venue_url,
+ {"Venue URL", "wlan.hs20.venue_url.url",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_channel_measurement_feedback_realtive_I,
- {"Channel Measurement Feedback Relative I", "wlan.ch_meas_fb.realtive_I",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_advice_of_charge_length,
+ {"Length", "wlan.hs20.advice_of_charge.len",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_channel_measurement_feedback_realtive_Q,
- {"Channel Measurement Feedback Relative Q", "wlan.ch_meas_fb.realtive_Q",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_advice_of_charge_type,
+ {"Advice of Charge Type", "wlan.hs20.advice_of_charge.type",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_channel_measurement_feedback_tap_delay,
- {"Channel Measurement Feedback Tap Delay", "wlan.ch_meas_fb.tap_delay",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_nai_realm_encoding,
+ {"NAI Realm Encoding", "wlan.hs20.advice_of_charge.nai_realm_enc",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_channel_measurement_feedback_sector_id,
- {"Channel Measurement Feedback Secotr ID", "wlan.ch_meas_fb.sector_id",
- FT_UINT8, BASE_DEC, NULL, 0xfc,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_nai_realm_len,
+ {"NAI Realm Length", "wlan.hs20.advice_of_charge.nai_realm_len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_channel_measurement_feedback_antenna_id,
- {"Channel Measurement Feedback Antenna ID", "wlan.ch_meas_fb.antenna_id",
- FT_UINT8, BASE_DEC, NULL, 0x03,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_nai_realm,
+ {"NAI Realm", "wlan.hs20.advice_of_charge.nai_realm",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_awake_window,
- {"Awake Window", "wlan.awake_window",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_plan_len,
+ {"Plan length", "wlan.hs20.advice_of_charge.plan_info_tuples.plan_len",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_addba_ext_no_frag,
- {"ADDBA No Fragmentation", "wlan.addba.no_frag",
- FT_BOOLEAN, 8, NULL, 0x80,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_plan_lang,
+ {"Plan language", "wlan.hs20.advice_of_charge.plan_info_tuples.plan_lang",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_multi_band_ctrl_sta_role,
- {"STA Rold", "wlan.multi_band.ctrl_sta_role",
- FT_UINT8, BASE_DEC, NULL, 0xe0,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_plan_curcy,
+ {"Plan currency", "wlan.hs20.advice_of_charge.plan_info_tuples.plan_curcy",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_multi_band_ctrl_addr_present,
- {"STA MAC Address Present", "wlan.multi_band.ctrl_addr_present",
- FT_BOOLEAN, 8, NULL, 0x10,
- NULL, HFILL }},
+ {&hf_hs20_anqp_aoc_plan_information,
+ {"Plan information", "wlan.hs20.advice_of_charge.plan_info_tuples.info",
+ FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_multi_band_ctrl_cipher_present,
- {"PCS Present", "wlan.multi_band.ctrl_cipher_present",
- FT_BOOLEAN, 8, NULL, 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_tag,
+ {"Tag", "wlan.tag",
+ FT_NONE, BASE_NONE, 0x0, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_multi_band_oper_class,
- {"Operating Class", "wlan.multi_band.oper_class",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_number,
+ {"Tag Number", "wlan.tag.number",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
+ "Element ID", HFILL }},
- {&hf_ieee80211_tag_multi_band_channel_number,
- {"Channel Number", "wlan.multi_band.channel_number",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_length,
+ {"Tag length", "wlan.tag.length",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Length of tag", HFILL }},
- {&hf_ieee80211_tag_multi_band_tsf_offset,
- {"TSF Offset", "wlan.multi_band.tsf_offset",
- FT_UINT64, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_interpretation,
+ {"Tag interpretation", "wlan.tag.interpretation",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Interpretation of tag", HFILL }},
- {&hf_ieee80211_tag_multi_band_conn_ap,
- {"Connection Capability AP", "wlan.multi_band.conn_ap",
- FT_BOOLEAN, 8, NULL, 0x80,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_data,
+ {"Tag Data", "wlan.tag.data",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Data Interpretation of tag", HFILL }},
- {&hf_ieee80211_tag_multi_band_conn_pcp,
- {"Connection Capability PCP", "wlan.multi_band.conn_pcp",
- FT_BOOLEAN, 8, NULL, 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_oui,
+ {"OUI", "wlan.tag.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
+ "OUI of vendor specific IE", HFILL }},
- {&hf_ieee80211_tag_multi_band_conn_dls,
- {"Connection Capability DLS", "wlan.multi_band.conn_dls",
- FT_BOOLEAN, 8, NULL, 0x20,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_oui_wfa_subtype,
+ {"WFA Subtype", "wlan.tag.oui.wfa_subtype",
+ FT_UINT8, BASE_DEC, VALS(wfa_subtype_vals), 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_multi_band_conn_tdls,
- {"Connection Capability TDLS", "wlan.multi_band.conn_tdls",
- FT_BOOLEAN, 8, NULL, 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_ds_param_channel,
+ {"Current Channel", "wlan.ds.current_channel",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "DS Parameter Set - Current Channel", HFILL }},
- {&hf_ieee80211_tag_multi_band_conn_ibss,
- {"Connection Capability IBSS", "wlan.multi_band.conn_ibss",
- FT_BOOLEAN, 8, NULL, 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_cfp_count,
+ {"CFP Count", "wlan.cfp.count",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Indicates how many delivery traffic indication messages (DTIMs)", HFILL }},
- {&hf_ieee80211_tag_multi_band_fst_timeout,
- {"FST Session Timeout", "wlan.multi_band.fst_timeout",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_cfp_period,
+ {"CFP Period", "wlan.cfp.period",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Indicates the number of DTIM intervals between the start of CFPs", HFILL }},
- {&hf_ieee80211_tag_multi_band_sta_mac,
- {"Transmitting STA MAC Address", "wlan.multi_band.sta_mac",
- FT_ETHER, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_cfp_max_duration,
+ {"CFP Max Duration", "wlan.cfp.max_duration",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the maximum duration (in TU) of the CFP that may be generated by this PCF", HFILL }},
- {&hf_ieee80211_tag_activity,
- {"Activity", "wlan.activity",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_cfp_dur_remaining,
+ {"CFP Dur Remaining", "wlan.cfp.dur_remaining",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the maximum time (in TU) remaining in the present CFP", HFILL }},
- {&hf_ieee80211_tag_dmg_link_adapt_mcs,
- {"MCS", "wlan.dmg_link_adapt.mcs",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_vendor_oui_type,
+ {"Vendor Specific OUI Type", "wlan.tag.vendor.oui.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_dmg_link_adapt_link_margin,
- {"Link Margin", "wlan.dmg_link_adapt.link_margin",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_vendor_data,
+ {"Vendor Specific Data", "wlan.tag.vendor.data",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Unknown/undecoded Vendor Specific Data", HFILL }},
- {&hf_ieee80211_tag_ref_timestamp,
- {"Reference Timestamp", "wlan.ref_timestamp",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_dtim_count,
+ {"DTIM count", "wlan.tim.dtim_count",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Indicates how many Beacon frames (including the current frame) appear before the next DTIM", HFILL }},
- {&hf_ieee80211_tag_switching_stream_non_qos,
- {"Non-Qos Data Frames", "wlan.switching_stream.non_qos",
- FT_BOOLEAN, 8, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_dtim_period,
+ {"DTIM period", "wlan.tim.dtim_period",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Indicates the number of beacon intervals between successive DTIMs", HFILL }},
- {&hf_ieee80211_tag_switching_stream_param_num,
- {"Number Of Switching Stream Elements", "wlan.switching_stream.param_num",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_bmapctl,
+ {"Bitmap control", "wlan.tim.bmapctl",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_switching_stream_old_tid,
- {"Old Band TID", "wlan.switching_stream.old_tid",
- FT_UINT16, BASE_DEC, NULL, 0xf000,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_bmapctl_mcast,
+ {"Multicast", "wlan.tim.bmapctl.multicast",
+ FT_BOOLEAN, 8, NULL, 0x1,
+ "Contains the Traffic Indicator bit associated with Association ID 0", HFILL }},
- {&hf_ieee80211_tag_switching_stream_old_direction,
- {"Old Band Direction", "wlan.switching_stream.old_direction",
- FT_BOOLEAN, 16, NULL, 0x0800,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_bmapctl_offset,
+ {"Bitmap Offset", "wlan.tim.bmapctl.offset",
+ FT_UINT8, BASE_HEX, NULL, 0xFE,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_switching_stream_new_tid,
- {"New Band TID", "wlan.switching_stream.new_tid",
- FT_UINT16, BASE_DEC, NULL, 0x0780,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_partial_virtual_bitmap,
+ {"Partial Virtual Bitmap", "wlan.tim.partial_virtual_bitmap",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_switching_stream_new_direction,
- {"New Band Direction", "wlan.switching_stream.new_direction",
- FT_BOOLEAN, 16, NULL, 0x0040,
- NULL, HFILL }},
+ {&hf_ieee80211_tim_aid,
+ {"Association ID", "wlan.tim.aid",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_switching_stream_new_valid_id,
- {"Stream ID in New Band Valid", "wlan.switching_stream.new_valid_id",
- FT_BOOLEAN, 16, NULL, 0x0020,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_ibss_atim_window,
+ {"Atim Windows", "wlan.ibss.atim_windows",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Contains the ATIM Window length in TU", HFILL }},
- {&hf_ieee80211_tag_switching_stream_llt_type,
- {"LLT Type", "wlan.switching_stream.llt_type",
- FT_BOOLEAN, 16, NULL, 0x0010,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_country_info_code,
+ {"Code", "wlan.country_info.code",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_timestamp,
- {"Timestamp", "wlan.fixed.timestamp",
- FT_UINT64, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_country_info_env,
+ {"Environment", "wlan.country_info.environment",
+ FT_UINT8, BASE_HEX, VALS(environment_vals), 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_auth_alg,
- {"Authentication Algorithm", "wlan.fixed.auth.alg",
- FT_UINT16, BASE_DEC, VALS(auth_alg), 0,
+ {&hf_ieee80211_tag_country_info_pad,
+ {"Padding", "wlan.country_info.padding",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_beacon_interval,
- {"Beacon Interval", "wlan.fixed.beacon",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
+ {&hf_ieee80211_tag_country_info_fnm,
+ {"Country Info", "wlan.country_info.fnm",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_country_info_fnm_fcn,
+ {"First Channel Number", "wlan.country_info.fnm.fcn",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_fixed_parameters,
- {"Fixed parameters", "wlan.fixed.all",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_country_info_fnm_nc,
+ {"Number of Channels", "wlan.country_info.fnm.nc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_tagged_parameters,
- {"Tagged parameters", "wlan.tagged.all",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_country_info_fnm_mtpl,
+ {"Maximum Transmit Power Level", "wlan.country_info.fnm.mtpl",
+ FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_ssid,
- {"SSID", "wlan.ssid",
- FT_STRING, BASE_NONE, NULL, 0,
- "Indicates the identity of an ESS or IBSS", HFILL }},
-
- {&hf_ieee80211_tag_supp_rates,
- {"Supported Rates", "wlan.supported_rates",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_supported_rates_vals_ext, 0x0,
- "In Mbit/sec, (B) for Basic Rates", HFILL }},
+ {&hf_ieee80211_tag_country_info_rrc,
+ {"Country Info", "wlan.country_info.rrc",
+ FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_fh_dwell_time,
- {"Dwell Time", "wlan.fh.dwell_time",
- FT_UINT16, BASE_HEX, NULL, 0x0,
- "In Time Unit (TU)", HFILL }},
+ {&hf_ieee80211_tag_country_info_rrc_oei,
+ {"Operating Extension Identifier", "wlan.country_info.rrc.oei",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_fh_hop_set,
- {"Hop Set", "wlan.fh.hop_set",
+ {&hf_ieee80211_tag_country_info_rrc_oc,
+ {"Operating Class", "wlan.country_info.rrc.oc",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_tag_fh_hop_pattern,
- {"Hop Pattern", "wlan.fh.hop_pattern",
+ {&hf_ieee80211_tag_country_info_rrc_cc,
+ {"Coverage Class", "wlan.country_info.rrc.cc",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_tag_fh_hop_index,
- {"Hop Index", "wlan.fh.hop_index",
+ {&hf_ieee80211_tag_fh_hopping_parameter_prime_radix,
+ {"Prime Radix", "wlan.fh_hopping.parameter.prime_radix",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_block_ack_params,
- {"Block Ack Parameters", "wlan.fixed.baparams",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_fh_hopping_parameter_nb_channels,
+ {"Number of Channels", "wlan.fh_hopping.parameter.nb_channels",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_block_ack_params_amsdu_permitted,
- {"A-MSDUs", "wlan.fixed.baparams.amsdu",
- FT_BOOLEAN, 16, TFS(&ff_block_ack_params_amsdu_permitted_flag), 0x0001,
- "A-MSDU Permitted in QoS Data MPDUs", HFILL }},
+ {&hf_ieee80211_tag_fh_hopping_table_flag,
+ {"Flag", "wlan.fh_hopping.table.flag",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Indicates that a Random Table is present when the value is 1", HFILL }},
- {&hf_ieee80211_ff_block_ack_params_policy,
- {"Block Ack Policy", "wlan.fixed.baparams.policy",
- FT_BOOLEAN, 16, TFS(&ff_block_ack_params_policy_flag), 0x0002,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_fh_hopping_table_number_of_sets,
+ {"Number of Sets", "wlan.fh_hopping.table.number_of_sets",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Indicates the total number of sets within the hopping patterns", HFILL }},
- {&hf_ieee80211_ff_block_ack_params_tid,
- {"Traffic Identifier", "wlan.fixed.baparams.tid",
- FT_UINT16, BASE_HEX, NULL, 0x003C,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_fh_hopping_table_modulus,
+ {"Modulus", "wlan.fh_hopping.table.modulus",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Indicate the values to be used in the equations to create a hopping sequence from the Random Table information", HFILL }},
- {&hf_ieee80211_ff_block_ack_params_buffer_size,
- {"Number of Buffers (1 Buffer = 2304 Bytes)", "wlan.fixed.baparams.buffersize",
- FT_UINT16, BASE_DEC, NULL, 0xFFC0,
- "Number of Buffers", HFILL }},
+ {&hf_ieee80211_tag_fh_hopping_table_offset,
+ {"Offset", "wlan.fh_hopping.table.offset",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Indicate the values to be used in the equations to create a hopping sequence from the Random Table information", HFILL }},
- {&hf_ieee80211_ff_block_ack_timeout,
- {"Block Ack Timeout", "wlan.fixed.batimeout",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_fh_hopping_random_table,
+ {"Random Table", "wlan.fh_hopping.table.random_table",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "It is a vector of single octet values that indicate the random sequence to be followed during a hopping sequence", HFILL }},
- {&hf_ieee80211_ff_block_ack_ssc,
- {"Block Ack Starting Sequence Control (SSC)", "wlan.fixed.ssc",
- FT_UINT16, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_request,
+ {"Requested Element ID", "wlan.tag.request",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
+ "The list of elements that are to be included in the responding STA Probe Response frame", HFILL }},
- {&hf_ieee80211_ff_block_ack_ssc_fragment,
- {"Fragment", "wlan.fixed.ssc.fragment",
- FT_UINT16, BASE_DEC, 0, 0x000f,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_up,
+ {"User Priority", "wlan.tclas.user_priority",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Contains the value of the UP of the associated MSDUs", HFILL }},
- {&hf_ieee80211_ff_block_ack_ssc_sequence,
- {"Starting Sequence Number", "wlan.fixed.ssc.sequence",
- FT_UINT16, BASE_DEC, 0, 0xfff0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_type,
+ {"Classifier Type", "wlan.tclas.class_type",
+ FT_UINT8, BASE_DEC, VALS(classifier_type), 0,
+ "Specifies the type of classifier parameters", HFILL }},
- {&hf_ieee80211_ff_delba_param,
- {"Delete Block Ack (DELBA) Parameter Set", "wlan.fixed.delba.param",
- FT_UINT16, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask,
+ {"Classifier Mask", "wlan.tclas.class_mask",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Specifies a bitmap where bits that are set to 1 identify a subset of the classifier parameters", HFILL }},
- {&hf_ieee80211_ff_delba_param_reserved,
- {"Reserved", "wlan.fixed.delba.param.reserved",
- FT_UINT16, BASE_HEX, 0, 0x07ff,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask0_src_addr,
+ {"Source Address", "wlan.tclas.class_mask.src_addr",
+ FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
- {&hf_ieee80211_ff_delba_param_init,
- {"Initiator", "wlan.fixed.delba.param.initiator",
- FT_BOOLEAN, 16, 0, 0x0800,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask0_dst_addr,
+ {"Destination Address", "wlan.tclas.class_mask.dst_addr",
+ FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
- {&hf_ieee80211_ff_delba_param_tid,
- {"TID", "wlan.fixed.delba.param.tid",
- FT_UINT16, BASE_HEX, 0, 0xf000,
- "Traffic Identifier (TID)", HFILL }},
+ {&hf_ieee80211_tclas_class_mask0_type,
+ {"Type", "wlan.tclas.class_mask.type",
+ FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
- {&hf_ieee80211_ff_max_reg_pwr,
- {"Maximum Regulation Power", "wlan.fixed.maxregpwr",
- FT_UINT16, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask1_ver,
+ {"Version", "wlan.tclas.class_mask.version",
+ FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
- {&hf_ieee80211_ff_measurement_pilot_int,
- {"Measurement Pilot Interval", "wlan.fixed.msmtpilotint",
- FT_UINT8, BASE_HEX, 0, 0,
- "Measurement Pilot Interval Fixed Field", HFILL }},
+ {&hf_ieee80211_tclas_class_mask1_src_ip,
+ {"Source IP Address", "wlan.tclas.class_mask.src_ip",
+ FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
- {&hf_ieee80211_ff_country_str,
- {"Country String", "wlan.fixed.country",
- FT_STRING, BASE_NONE, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask1_dst_ip,
+ {"Destination IP Address", "wlan.tclas.class_mask.dst_ip",
+ FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
- {&hf_ieee80211_ff_max_tx_pwr,
- {"Maximum Transmit Power", "wlan.fixed.maxtxpwr",
- FT_UINT8, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask1_src_port,
+ {"Source Port", "wlan.tclas.class_mask.src_port",
+ FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL }},
- {&hf_ieee80211_ff_tx_pwr_used,
- {"Transmit Power Used", "wlan.fixed.txpwr",
- FT_UINT8, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask1_dst_port,
+ {"Destination Port", "wlan.tclas.class_mask.dst_port",
+ FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL }},
- {&hf_ieee80211_ff_transceiver_noise_floor,
- {"Transceiver Noise Floor", "wlan.fixed.tnoisefloor",
- FT_UINT8, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tclas_class_mask1_ipv4_dscp,
+ {"DSCP", "wlan.tclas.class_mask.dscp",
+ FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
- {&hf_ieee80211_ff_channel_width,
- {"Supported Channel Width", "wlan.fixed.chanwidth",
- FT_UINT8, BASE_HEX, VALS(ff_channel_width_vals), 0,
+ {&hf_ieee80211_tclas_class_mask1_ipv4_proto,
+ {"Protocol", "wlan.tclas.class_mask.proto",
+ FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL }},
+
+ {&hf_ieee80211_tclas_class_mask1_ipv6_flow,
+ {"Flow Label", "wlan.tclas.class_mask.flow_label",
+ FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
+
+ {&hf_ieee80211_tclas_class_mask2_tci,
+ {"802.1Q CLAN TCI", "wlan.tclas.class_mask.tci",
+ FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
+
+ {&hf_ieee80211_tclas_src_mac_addr,
+ {"Source address", "wlan.tclas.src_mac_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Classifier Parameters Ethernet Type", HFILL }},
+
+ {&hf_ieee80211_tclas_dst_mac_addr,
+ {"Destination address", "wlan.tclas.dat_mac_addr",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_ap,
- {"QoS Information (AP)", "wlan.fixed.qosinfo.ap",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tclas_ether_type,
+ {"Ethernet Type", "wlan.tclas.ether_type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_ap_edca_param_set_counter,
- {"EDCA Parameter Set Update Count", "wlan.fixed.qosinfo.ap.edcaupdate",
- FT_UINT8, BASE_HEX, NULL, 0x0F,
- "Enhanced Distributed Channel Access (EDCA) Parameter Set Update Count", HFILL }},
+ {&hf_ieee80211_tclas_version,
+ {"IP Version", "wlan.tclas.version",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_ap_q_ack,
- {"Q-Ack", "wlan.fixed.qosinfo.ap.qack",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_q_ack_flag), 0x10,
- "QoS Ack", HFILL }},
+ {&hf_ieee80211_tclas_ipv4_src,
+ {"IPv4 Src Addr", "wlan.tclas.ipv4_src",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_ap_queue_req,
- {"Queue Request", "wlan.fixed.qosinfo.ap.queue_req",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_queue_req_flag), 0x20,
+ {&hf_ieee80211_tclas_ipv4_dst,
+ {"IPv4 Dst Addr", "wlan.tclas.ipv4_dst",
+ FT_IPv4, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_ap_txop_request,
- {"TXOP Request", "wlan.fixed.qosinfo.ap.txopreq",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_ap_txop_request_flag), 0x40,
- "Transmit Opportunity (TXOP) Request", HFILL }},
+ {&hf_ieee80211_tclas_src_port,
+ {"Source Port", "wlan.tclas.src_port",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_ap_reserved,
- {"Reserved", "wlan.fixed.qosinfo.ap.reserved",
- FT_BOOLEAN, 8, NULL, 0x80,
+ {&hf_ieee80211_tclas_dst_port,
+ {"Destination Port", "wlan.tclas.dst_port",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_sta,
- {"QoS Information (STA)", "wlan.fixed.qosinfo.sta",
+ {&hf_ieee80211_tclas_dscp,
+ {"IPv4 DSCP", "wlan.tclas.dscp",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "IPv4 Differentiated Services Code Point (DSCP) Field", HFILL }},
+
+ {&hf_ieee80211_tclas_protocol,
+ {"Protocol", "wlan.tclas.protocol",
FT_UINT8, BASE_HEX, NULL, 0,
- "TCLAS Processing", HFILL }},
+ "IPv4 Protocol", HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_ac_vo,
- {"AC_VO U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_vo",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x01,
+ {&hf_ieee80211_tclas_ipv6_src,
+ {"IPv6 Src Addr", "wlan.tclas.ipv6_src",
+ FT_IPv6, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_ac_vi,
- {"AC_VI U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_vi",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x02,
+ {&hf_ieee80211_tclas_ipv6_dst,
+ {"IPv6 Dst Addr", "wlan.tclas.ipv6_dst",
+ FT_IPv6, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_ac_bk,
- {"AC_BK U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_bk",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x04,
+ {&hf_ieee80211_tclas_flow,
+ {"Flow Label", "wlan.tclas.flow",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ "IPv6 Flow Label", HFILL }},
+
+ {&hf_ieee80211_tclas_tag_type,
+ {"802.1Q Tag Type", "wlan.tclas.tag_type",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_ac_be,
- {"AC_BE U-APSD Flag", "wlan.fixed.qosinfo.sta.ac_be",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_ac_flag), 0x08,
+ {&hf_ieee80211_tag_challenge_text,
+ {"Challenge Text", "wlan.tag.challenge_text",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_q_ack,
- {"Q-Ack", "wlan.fixed.qosinfo.sta.qack",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_q_ack_flag), 0x10,
- "QoS Ack", HFILL }},
+ {&hf_ieee80211_rsn_version,
+ {"RSN Version", "wlan.rsn.version",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the version number of the RSNA protocol", HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_max_sp_length,
- {"Max SP Length", "wlan.fixed.qosinfo.sta.max_sp_length",
- FT_UINT8, BASE_HEX, VALS(ff_qos_info_sta_max_sp_len_flags) , 0x60,
- NULL, HFILL }},
+ {&hf_ieee80211_rsn_gcs,
+ {"Group Cipher Suite", "wlan.rsn.gcs",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_gcs_base_custom), 0,
+ "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }},
- {&hf_ieee80211_ff_qos_info_sta_more_data_ack,
- {"More Data Ack", "wlan.fixed.qosinfo.sta.more_data_ack",
- FT_BOOLEAN, 8, TFS(&ff_qos_info_sta_more_data_ack_flag), 0x80,
+ {&hf_ieee80211_rsn_gcs_oui,
+ {"Group Cipher Suite OUI", "wlan.rsn.gcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_sm_pwr_save,
- {"Spatial Multiplexing (SM) Power Control", "wlan.fixed.sm.powercontrol",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_rsn_gcs_type,
+ {"Group Cipher Suite type", "wlan.rsn.gcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_sm_pwr_save_enabled,
- {"SM Power Save", "wlan.fixed.sm.powercontrol.enabled",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
- "Spatial Multiplexing (SM) Power Save", HFILL }},
+ {&hf_ieee80211_rsn_gcs_80211_type,
+ {"Group Cipher Suite type", "wlan.rsn.gcs.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_sm_pwr_save_sm_mode,
- {"SM Mode", "wlan.fixed.sm.powercontrol.mode",
- FT_BOOLEAN, 8, TFS(&ff_sm_pwr_save_sm_mode_flag), 0x02,
- "Spatial Multiplexing (SM) Mode", HFILL }},
+ {&hf_ieee80211_rsn_pcs_count,
+ {"Pairwise Cipher Suite Count", "wlan.rsn.pcs.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the number of pairwise cipher suite selectors that are contained in the Pairwise Cipher Suite List", HFILL }},
- {&hf_ieee80211_ff_sm_pwr_save_reserved,
- {"Reserved", "wlan.fixed.sm.powercontrol.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xFC,
- NULL, HFILL }},
+ {&hf_ieee80211_rsn_pcs_list,
+ {"Pairwise Cipher Suite List", "wlan.rsn.pcs.list",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "Contains a series of cipher suite selectors that indicate the pairwisecipher suites", HFILL }},
- {&hf_ieee80211_ff_pco_phase_cntrl,
- {"Phased Coexistence Operation (PCO) Phase Control", "wlan.fixed.pco.phasecntrl",
- FT_BOOLEAN, BASE_NONE, TFS(&ff_pco_phase_cntrl_flag), 0x0,
+ {&hf_ieee80211_rsn_pcs,
+ {"Pairwise Cipher Suite", "wlan.rsn.pcs",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_pcs_base_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_param_set,
- {"Power Save Multi-Poll (PSMP) Parameter Set", "wlan.fixed.psmp.paramset",
- FT_UINT16, BASE_HEX, 0, 0,
+ {&hf_ieee80211_rsn_pcs_oui,
+ {"Pairwise Cipher Suite OUI", "wlan.rsn.pcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_param_set_n_sta,
- {"Number of STA Info Fields Present", "wlan.fixed.psmp.paramset.nsta",
- FT_UINT16, BASE_HEX, 0, 0x000F,
+ {&hf_ieee80211_rsn_pcs_type,
+ {"Pairwise Cipher Suite type", "wlan.rsn.pcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_param_set_more_psmp,
- {"More PSMP", "wlan.fixed.psmp.paramset.more",
- FT_BOOLEAN, 16, TFS(&ff_psmp_param_set_more_psmp_flag), 0x0010,
- "More Power Save Multi-Poll (PSMP)", HFILL }},
-
- {&hf_ieee80211_ff_psmp_param_set_psmp_sequence_duration,
- {"PSMP Sequence Duration [us]", "wlan.fixed.psmp.paramset.seqduration",
- FT_UINT16, BASE_DEC, 0, 0xFFE0,
- "Power Save Multi-Poll (PSMP) Sequence Duration", HFILL }},
-
- {&hf_ieee80211_ff_mimo_cntrl,
- {"MIMO Control", "wlan.fixed.mimo.control",
- FT_BYTES, BASE_NONE, 0, 0x0,
+ {&hf_ieee80211_rsn_pcs_80211_type,
+ {"Pairwise Cipher Suite type", "wlan.rsn.pcs.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_nc_index,
- {"Nc Index", "wlan.fixed.mimo.control.ncindex",
- FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_nc_index_flags), 0x0003,
- "Number of Columns Less One", HFILL }},
+ {&hf_ieee80211_rsn_akms_count,
+ {"Auth Key Management (AKM) Suite Count", "wlan.rsn.akms.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the number of Auth Key Management suite selectors that are contained in the Auth Key Management Suite List", HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_nr_index,
- {"Nr Index", "wlan.fixed.mimo.control.nrindex",
- FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_nr_index_flags), 0x000C,
- "Number of Rows Less One", HFILL }},
+ {&hf_ieee80211_rsn_akms_list,
+ {"Auth Key Management (AKM) List", "wlan.rsn.akms.list",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_channel_width,
- {"Channel Width", "wlan.fixed.mimo.control.chanwidth",
- FT_BOOLEAN, 16, TFS(&ff_mimo_cntrl_channel_width_flag), 0x0010,
+ {&hf_ieee80211_rsn_akms,
+ {"Auth Key Management (AKM) Suite", "wlan.rsn.akms",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_akms_base_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_grouping,
- {"Grouping (Ng)", "wlan.fixed.mimo.control.grouping",
- FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_grouping_flags), 0x0060,
+ {&hf_ieee80211_rsn_akms_oui,
+ {"Auth Key Management (AKM) OUI", "wlan.rsn.akms.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_coefficient_size,
- {"Coefficient Size (Nb)", "wlan.fixed.mimo.control.cosize",
- FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_coefficient_size_flags), 0x0180,
+ {&hf_ieee80211_rsn_akms_type,
+ {"Auth Key Management (AKM) type", "wlan.rsn.akms.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_codebook_info,
- {"Codebook Information", "wlan.fixed.mimo.control.codebookinfo",
- FT_UINT16, BASE_HEX, VALS(ff_mimo_cntrl_codebook_info_flags), 0x0600,
+ {&hf_ieee80211_rsn_akms_80211_type,
+ {"Auth Key Management (AKM) type", "wlan.rsn.akms.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_keymgmt_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_remaining_matrix_segment,
- {"Remaining Matrix Segment", "wlan.fixed.mimo.control.matrixseg",
- FT_UINT16, BASE_HEX, 0, 0x3800,
- NULL, HFILL }},
+ {&hf_ieee80211_rsn_cap,
+ {"RSN Capabilities", "wlan.rsn.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "RSN Capability information", HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_reserved,
- {"Reserved", "wlan.fixed.mimo.control.reserved",
- FT_UINT16, BASE_HEX, 0, 0xC000,
+ {&hf_ieee80211_rsn_cap_preauth,
+ {"RSN Pre-Auth capabilities", "wlan.rsn.capabilities.preauth",
+ FT_BOOLEAN, 16, TFS(&rsn_preauth_flags), 0x0001,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_cntrl_sounding_timestamp,
- {"Sounding Timestamp", "wlan.fixed.mimo.control.soundingtime",
- FT_UINT32, BASE_HEX, 0, 0,
+ {&hf_ieee80211_rsn_cap_no_pairwise,
+ {"RSN No Pairwise capabilities", "wlan.rsn.capabilities.no_pairwise",
+ FT_BOOLEAN, 16, TFS(&rsn_no_pairwise_flags), 0x0002,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info,
- {"Power Save Multi-Poll (PSMP) Station Information", "wlan.fixed.psmp.stainfo",
- FT_UINT64, BASE_HEX, 0, 0,
+ {&hf_ieee80211_rsn_cap_ptksa_replay_counter,
+ {"RSN PTKSA Replay Counter capabilities", "wlan.rsn.capabilities.ptksa_replay_counter",
+ FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x000C,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_type,
- {"Sta Info Type", "wlan.fixed.psmp.stainfo.type",
- FT_UINT32, BASE_HEX, VALS(ff_psmp_sta_info_flags), PSMP_STA_INFO_FLAG_TYPE,
+ {&hf_ieee80211_rsn_cap_gtksa_replay_counter,
+ {"RSN GTKSA Replay Counter capabilities", "wlan.rsn.capabilities.gtksa_replay_counter",
+ FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x0030,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_dtt_start_offset,
- {"DTT Start Offset", "wlan.fixed.psmp.stainfo.dttstart",
- FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_DTT_START,
+ {&hf_ieee80211_rsn_cap_mfpr,
+ {"Management Frame Protection Required", "wlan.rsn.capabilities.mfpr",
+ FT_BOOLEAN, 16, NULL, 0x0040,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_dtt_duration,
- {"DTT Duration", "wlan.fixed.psmp.stainfo.dttduration",
- FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_DTT_DURATION,
+ {&hf_ieee80211_rsn_cap_mfpc,
+ {"Management Frame Protection Capable", "wlan.rsn.capabilities.mfpc",
+ FT_BOOLEAN, 16, NULL, 0x0080,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_sta_id,
- {"Target Station ID", "wlan.fixed.psmp.stainfo.staid",
- FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_STA_ID,
+ {&hf_ieee80211_rsn_cap_jmr,
+ {"Joint Multi-band RSNA", "wlan.rsn.capabilities.jmr",
+ FT_BOOLEAN, 16, NULL, 0x0100,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_utt_start_offset,
- {"UTT Start Offset", "wlan.fixed.psmp.stainfo.uttstart",
- FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_UTT_START,
+ {&hf_ieee80211_rsn_cap_peerkey,
+ {"PeerKey Enabled", "wlan.rsn.capabilities.peerkey",
+ FT_BOOLEAN, 16, NULL, 0x0200,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_utt_duration,
- {"UTT Duration", "wlan.fixed.psmp.stainfo.uttduration",
- FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_UTT_DURATION,
- NULL, HFILL }},
+ {&hf_ieee80211_rsn_pmkid_count,
+ {"PMKID Count", "wlan.rsn.pmkid.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the number of PMKID selectors that are contained in the PMKID Suite List", HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_reserved_small,
- {"Reserved", "wlan.fixed.psmp.stainfo.reserved",
- FT_UINT32, BASE_HEX, 0, PSMP_STA_INFO_FLAG_IA_RESERVED,
- NULL, HFILL }},
+ {&hf_ieee80211_rsn_pmkid_list,
+ {"PMKID List", "wlan.rsn.pmkid.list",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_reserved_large,
- {"Reserved", "wlan.fixed.psmp.stainfo.reserved64",
- FT_UINT64, BASE_HEX, 0, 0,
+ {&hf_ieee80211_rsn_pmkid,
+ {"PMKID", "wlan.pmkid.akms",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_psmp_sta_info_psmp_multicast_id,
- {"Power Save Multi-Poll (PSMP) Multicast ID", "wlan.fixed.psmp.stainfo.multicastid",
- FT_UINT64, BASE_HEX, 0, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_rsn_gmcs,
+ {"Group Management Cipher Suite", "wlan.rsn.gmcs",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_gmcs_base_custom), 0,
+ "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }},
- {&hf_ieee80211_ff_ant_selection,
- {"Antenna Selection", "wlan.fixed.antsel",
- FT_UINT8, BASE_HEX, 0, 0,
+ {&hf_ieee80211_rsn_gmcs_oui,
+ {"Group Management Cipher Suite OUI", "wlan.rsn.gmcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_0,
- {"Antenna 0", "wlan.fixed.antsel.ant0",
- FT_UINT8, BASE_HEX, 0, 0x01,
+ {&hf_ieee80211_rsn_gmcs_type,
+ {"Group Management Cipher Suite type", "wlan.rsn.gmcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_1,
- {"Antenna 1", "wlan.fixed.antsel.ant1",
- FT_UINT8, BASE_HEX, 0, 0x02,
+ {&hf_ieee80211_rsn_gmcs_80211_type,
+ {"Group Management Cipher Suite type", "wlan.rsn.gmcs.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_2,
- {"Antenna 2", "wlan.fixed.antsel.ant2",
- FT_UINT8, BASE_HEX, 0, 0x04,
+ {&hf_ieee80211_ht_pren_type,
+ {"802.11n (Pre) Type", "wlan.vs.pren.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_ht_pren_type_vals), 0,
+ "Vendor Specific HT Type", HFILL }},
+ {&hf_ieee80211_ht_pren_unknown,
+ {"802.11n (Pre) Unknown Data", "wlan.vs.pren.unknown_data",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_3,
- {"Antenna 3", "wlan.fixed.antsel.ant3",
- FT_UINT8, BASE_HEX, 0, 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_ht_cap,
+ {"HT Capabilities Info", "wlan.ht.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "HT Capabilities information", HFILL }},
- {&hf_ieee80211_ff_ant_selection_4,
- {"Antenna 4", "wlan.fixed.antsel.ant4",
- FT_UINT8, BASE_HEX, 0, 0x10,
+ {&hf_ieee80211_ht_vs_cap,
+ {"HT Capabilities Info (VS)", "wlan.vs.ht.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Vendor Specific HT Capabilities information", HFILL }},
+
+ {&hf_ieee80211_ht_ldpc_coding,
+ {"HT LDPC coding capability", "wlan.ht.capabilities.ldpccoding",
+ FT_BOOLEAN, 16, TFS(&ht_ldpc_coding_flag), 0x0001,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_5,
- {"Antenna 5", "wlan.fixed.antsel.ant5",
- FT_UINT8, BASE_HEX, 0, 0x20,
+ {&hf_ieee80211_ht_chan_width,
+ {"HT Support channel width", "wlan.ht.capabilities.width",
+ FT_BOOLEAN, 16, TFS(&ht_chan_width_flag), 0x0002,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_6,
- {"Antenna 6", "wlan.fixed.antsel.ant6",
- FT_UINT8, BASE_HEX, 0, 0x40,
+ {&hf_ieee80211_ht_sm_pwsave,
+ {"HT SM Power Save", "wlan.ht.capabilities.sm",
+ FT_UINT16, BASE_HEX, VALS(ht_sm_pwsave_flag), 0x000c,
NULL, HFILL }},
- {&hf_ieee80211_ff_ant_selection_7,
- {"Antenna 7", "wlan.fixed.antsel.ant7",
- FT_UINT8, BASE_HEX, 0, 0x80,
+ {&hf_ieee80211_ht_green,
+ {"HT Green Field", "wlan.ht.capabilities.green",
+ FT_BOOLEAN, 16, TFS(&ht_green_flag), 0x0010,
NULL, HFILL }},
- {&hf_ieee80211_ff_ext_channel_switch_announcement,
- {"Extended Channel Switch Announcement", "wlan.fixed.extchansw",
- FT_UINT32, BASE_HEX, 0, 0,
+ {&hf_ieee80211_ht_short20,
+ {"HT Short GI for 20MHz", "wlan.ht.capabilities.short20",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020,
NULL, HFILL }},
- {&hf_ieee80211_ff_ext_channel_switch_announcement_switch_mode,
- {"Channel Switch Mode", "wlan.fixed.extchansw.switchmode",
- FT_UINT32, BASE_HEX, VALS(ieee80211_tag_ext_channel_switch_announcement_switch_mode_flags), 0x000000FF,
+ {&hf_ieee80211_ht_short40,
+ {"HT Short GI for 40MHz", "wlan.ht.capabilities.short40",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040,
NULL, HFILL }},
- {&hf_ieee80211_ff_ext_channel_switch_announcement_new_ope_class,
- {"New Operating Class", "wlan.fixed.extchansw.new.opeclass",
- FT_UINT32, BASE_HEX, NULL, 0x0000FF00,
+ {&hf_ieee80211_ht_tx_stbc,
+ {"HT Tx STBC", "wlan.ht.capabilities.txstbc",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080,
NULL, HFILL }},
- {&hf_ieee80211_ff_ext_channel_switch_announcement_new_chan_number,
- {"New Channel Number", "wlan.fixed.extchansw.new.channumber",
- FT_UINT32, BASE_HEX, NULL, 0x00FF0000,
+ {&hf_ieee80211_ht_rx_stbc,
+ {"HT Rx STBC", "wlan.ht.capabilities.rxstbc",
+ FT_UINT16, BASE_HEX, VALS(ht_rx_stbc_flag), 0x0300,
+ "HT Tx STBC", HFILL }},
+
+ {&hf_ieee80211_ht_delayed_block_ack,
+ {"HT Delayed Block ACK", "wlan.ht.capabilities.delayedblockack",
+ FT_BOOLEAN, 16, TFS(&ht_delayed_block_ack_flag), 0x0400,
NULL, HFILL }},
- {&hf_ieee80211_ff_ext_channel_switch_announcement_switch_count,
- {"Channel Switch Count", "wlan.extchanswitch.switchcount",
- FT_UINT32, BASE_HEX, NULL, 0xFF000000,
+ {&hf_ieee80211_ht_max_amsdu,
+ {"HT Max A-MSDU length", "wlan.ht.capabilities.amsdu",
+ FT_BOOLEAN, 16, TFS(&ht_max_amsdu_flag), 0x0800,
NULL, HFILL }},
- {&hf_ieee80211_ff_ht_info,
- {"HT Information", "wlan.fixed.extchansw",
- FT_UINT8, BASE_HEX, 0, 0,
- "HT Information Fixed Field", HFILL }},
+ {&hf_ieee80211_ht_dss_cck_40,
+ {"HT DSSS/CCK mode in 40MHz", "wlan.ht.capabilities.dsscck",
+ FT_BOOLEAN, 16, TFS(&ht_dss_cck_40_flag), 0x1000,
+ "HT DSS/CCK mode in 40MHz", HFILL }},
- {&hf_ieee80211_ff_ht_info_information_request,
- {"Information Request", "wlan.fixed.mimo.control.chanwidth",
- FT_BOOLEAN, 8, TFS(&ff_ht_info_information_request_flag), 0x01,
+ {&hf_ieee80211_ht_psmp,
+ {"HT PSMP Support", "wlan.ht.capabilities.psmp",
+ FT_BOOLEAN, 16, TFS(&ht_psmp_flag), 0x2000,
NULL, HFILL }},
- {&hf_ieee80211_ff_ht_info_40_mhz_intolerant,
- {"40 MHz Intolerant", "wlan.fixed.mimo.control.chanwidth",
- FT_BOOLEAN, 8, TFS(&ff_ht_info_40_mhz_intolerant_flag), 0x02,
+ {&hf_ieee80211_ht_40_mhz_intolerant,
+ {"HT Forty MHz Intolerant", "wlan.ht.capabilities.40mhzintolerant",
+ FT_BOOLEAN, 16, TFS(&ht_40_mhz_intolerant_flag), 0x4000,
NULL, HFILL }},
- {&hf_ieee80211_ff_ht_info_sta_chan_width,
- {"Station Channel Width", "wlan.fixed.mimo.control.chanwidth",
- FT_BOOLEAN, 8, TFS(&ff_ht_info_sta_chan_width_flag), 0x04,
+ {&hf_ieee80211_ht_l_sig,
+ {"HT L-SIG TXOP Protection support", "wlan.ht.capabilities.lsig",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x8000,
NULL, HFILL }},
- {&hf_ieee80211_ff_ht_info_reserved,
- {"Reserved", "wlan.fixed.extchansw",
- FT_UINT8, BASE_HEX, 0, 0xF8,
- "Reserved Field", HFILL }},
-
- {&hf_ieee80211_ff_ht_action,
- {"HT Action", "wlan.fixed.htact",
- FT_UINT8, BASE_HEX, VALS(ff_ht_action_flags), 0,
- "HT Action Code", HFILL }},
+ {&hf_ieee80211_ext_bss_mu_mimo_capable_sta_count,
+ {"MU-MIMO Capable STA Count", "wlan.ext_bss.mu_mimo_capable_sta_count",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_csi_snr,
- {"Signal to Noise Ratio (SNR)", "wlan.mimo.csimatrices.snr",
+ {&hf_ieee80211_ext_bss_ss_underutilization,
+ {"Spatial Stream Underutilization", "wlan.ext_bss.ss_underutilization",
FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_csi_matrices,
- {"CSI Matrices", "wlan.mimo.csimatrices",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ext_bss_observable_sec_20mhz_utilization,
+ {"Observable Secondary 20MHz Utilization", "wlan.ext_bss.observable_sec_20mhz_utilization",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_csi_bf_matrices,
- {"Beamforming Feedback Matrices", "wlan.mimo.csimatrices.bf",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ext_bss_observable_sec_40mhz_utilization,
+ {"Observable Secondary 40MHz Utilization", "wlan.ext_bss.observable_sec_40mhz_utilization",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mimo_csi_cbf_matrices,
- {"Compressed Beamforming Feedback Matrices", "wlan.mimo.csimatrices.cbf",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ext_bss_observable_sec_80mhz_utilization,
+ {"Observable Secondary 80MHz Utilization", "wlan.ext_bss.observable_sec_80mhz_utilization",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_public_action,
- {"Public Action", "wlan.fixed.publicact",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ff_pa_action_codes_ext, 0,
- "Public Action Code", HFILL }},
-
- {&hf_ieee80211_ff_protected_public_action,
- {"Protected Public Action", "wlan.fixed.publicact",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ff_ppa_action_codes_ext, 0,
- "Protected Public Action Code", HFILL }},
- {&hf_ieee80211_ff_capture,
- {"Capabilities Information", "wlan.fixed.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Capability information", HFILL }},
-
- {&hf_ieee80211_ff_cf_ess,
- {"ESS capabilities", "wlan.fixed.capabilities.ess",
- FT_BOOLEAN, 16, TFS(&cf_ess_flags), 0x0001,
+ {&hf_ieee80211_wide_bw_new_channel_width,
+ {"New Channel Width", "wlan.wide_bw.new_channel_width",
+ FT_UINT8, BASE_HEX, VALS(vht_operation_info_channel_width), 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cf_ibss,
- {"IBSS status", "wlan.fixed.capabilities.ibss",
- FT_BOOLEAN, 16, TFS(&cf_ibss_flags), 0x0002,
- "IBSS participation", HFILL }},
-
- {&hf_ieee80211_ff_cf_sta_poll,
- {"CFP participation capabilities", "wlan.fixed.capabilities.cfpoll.sta",
- FT_UINT16, BASE_HEX, VALS(sta_cf_pollable), 0x020C,
- "CF-Poll capabilities for a STA", HFILL }},
-
- {&hf_ieee80211_ff_cf_ap_poll,
- {"CFP participation capabilities", "wlan.fixed.capabilities.cfpoll.ap",
- FT_UINT16, BASE_HEX, VALS(ap_cf_pollable), 0x020C,
- "CF-Poll capabilities for an AP", HFILL }},
-
- {&hf_ieee80211_ff_cf_privacy,
- {"Privacy", "wlan.fixed.capabilities.privacy",
- FT_BOOLEAN, 16, TFS(&cf_privacy_flags), 0x0010,
- "WEP support", HFILL }},
-
- {&hf_ieee80211_ff_cf_preamble,
- {"Short Preamble", "wlan.fixed.capabilities.preamble",
- FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x0020,
+ {&hf_ieee80211_wide_bw_new_channel_center_freq_segment0,
+ {"New Channel Center Frequency Segment 0", "wlan.wide_bw.new_channel_center_freq_segment0",
+ FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cf_pbcc,
- {"PBCC", "wlan.fixed.capabilities.pbcc",
- FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x0040,
- "PBCC Modulation", HFILL }},
-
- {&hf_ieee80211_ff_cf_agility,
- {"Channel Agility", "wlan.fixed.capabilities.agility",
- FT_BOOLEAN, 16, TFS(&tfs_inuse_not_inuse), 0x0080,
+ {&hf_ieee80211_wide_bw_new_channel_center_freq_segment1,
+ {"New Channel Center Frequency Segment 1", "wlan.wide_bw.new_channel_center_freq_segment1",
+ FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cf_spec_man,
- {"Spectrum Management", "wlan.fixed.capabilities.spec_man",
- FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0100,
+ {&hf_ieee80211_operat_notification_mode,
+ {"Operating Mode Notification", "wlan.operat_notification_mode",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_ff_short_slot_time,
- {"Short Slot Time", "wlan.fixed.capabilities.short_slot_time",
- FT_BOOLEAN, 16, TFS(&tfs_inuse_not_inuse), 0x0400,
+ {&hf_ieee80211_operat_mode_field_channel_width,
+ {"Channel Width", "wlan.operat_mode_field.channelwidth",
+ FT_UINT8, BASE_HEX, VALS(operating_mode_field_channel_width), 0x03,
NULL, HFILL }},
- {&hf_ieee80211_ff_cf_apsd,
- {"Automatic Power Save Delivery", "wlan.fixed.capabilities.apsd",
- FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x0800,
+ {&hf_ieee80211_operat_mode_field_reserved,
+ {"Reserved", "wlan.operat_mode_field.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x0C,
NULL, HFILL }},
- {&hf_ieee80211_ff_radio_measurement,
- {"Radio Measurement", "wlan.fixed.capabilities.radio_measurement",
- FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x1000,
+ {&hf_ieee80211_operat_mode_field_rxnss,
+ {"Rx NSS", "wlan.operat_mode_field.rxnss",
+ FT_UINT8, BASE_HEX, VALS(operat_mode_field_rxnss), 0x70,
NULL, HFILL }},
- {&hf_ieee80211_ff_dsss_ofdm,
- {"DSSS-OFDM", "wlan.fixed.capabilities.dsss_ofdm",
- FT_BOOLEAN, 16, TFS(&tfs_allowed_not_allowed), 0x2000,
- "DSSS-OFDM Modulation", HFILL }},
+ {&hf_ieee80211_operat_mode_field_rxnsstype,
+ {"Rx NSS Type", "wlan.operat_mode_field.rxnsstype",
+ FT_UINT8, BASE_HEX, NULL, 0x80,
+ "Indicate that the Rx NSS subfield carries the maximum number of spatial streams that the STA can receive", HFILL }},
- {&hf_ieee80211_ff_cf_del_blk_ack,
- {"Delayed Block Ack", "wlan.fixed.capabilities.del_blk_ack",
- FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x4000,
+ {&hf_ieee80211_ampduparam,
+ {"A-MPDU Parameters", "wlan.ht.ampduparam",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_cf_imm_blk_ack,
- {"Immediate Block Ack", "wlan.fixed.capabilities.imm_blk_ack",
- FT_BOOLEAN, 16, TFS(&tfs_implemented_not_implemented), 0x8000,
+ {&hf_ieee80211_ampduparam_vs,
+ {"A-MPDU Parameters (VS)", "wlan.vs.ht.ampduparam",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Vendor Specific A-MPDU Parameters", HFILL }},
+
+ {&hf_ieee80211_ampduparam_mpdu,
+ {"Maximum Rx A-MPDU Length", "wlan.ht.ampduparam.maxlength",
+ FT_UINT8, BASE_HEX, 0, 0x03,
NULL, HFILL }},
- {&hf_ieee80211_ff_auth_seq,
- {"Authentication SEQ", "wlan.fixed.auth_seq",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Authentication Sequence Number", HFILL }},
+ {&hf_ieee80211_ampduparam_mpdu_start_spacing,
+ {"MPDU Density", "wlan.ht.ampduparam.mpdudensity",
+ FT_UINT8, BASE_HEX, VALS(ampduparam_mpdu_start_spacing_flags), 0x1c,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_assoc_id,
- {"Association ID", "wlan.fixed.aid",
- FT_UINT16, BASE_HEX, NULL, 0x3FFF,
+ {&hf_ieee80211_ampduparam_reserved,
+ {"Reserved", "wlan.ht.ampduparam.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xE0,
NULL, HFILL }},
- {&hf_ieee80211_ff_listen_ival,
- {"Listen Interval", "wlan.fixed.listen_ival",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_mcsset,
+ {"Rx Supported Modulation and Coding Scheme Set", "wlan.ht.mcsset",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_current_ap,
- {"Current AP", "wlan.fixed.current_ap",
- FT_ETHER, BASE_NONE, NULL, 0,
- "MAC address of current AP", HFILL }},
+ {&hf_ieee80211_mcsset_vs,
+ {"Rx Supported Modulation and Coding Scheme Set (VS)", "wlan.vs.ht.mcsset",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Vendor Specific Rx Supported Modulation and Coding Scheme Set", HFILL }},
- {&hf_ieee80211_ff_reason,
- {"Reason code", "wlan.fixed.reason_code",
- FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_reason_code_ext, 0,
- "Reason for unsolicited notification", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask,
+ {"Rx Modulation and Coding Scheme (One bit per modulation)", "wlan.ht.mcsset.rxbitmask",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "One bit per modulation", HFILL }},
- {&hf_ieee80211_ff_status_code,
- {"Status code", "wlan.fixed.status_code",
- FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
- "Status of requested event", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_0to7,
+ {"Rx Bitmask Bits 0-7", "wlan.ht.mcsset.rxbitmask.0to7",
+ FT_UINT32, BASE_HEX, 0, 0x000000ff,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_category_code,
- {"Category code", "wlan.fixed.category_code",
- FT_UINT16, BASE_DEC|BASE_EXT_STRING, &category_codes_ext, 0,
- "Management action category", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_8to15,
+ {"Rx Bitmask Bits 8-15", "wlan.ht.mcsset.rxbitmask.8to15",
+ FT_UINT32, BASE_HEX, 0, 0x0000ff00,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT16, BASE_DEC, VALS(action_codes), 0,
- "Management action code", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_16to23,
+ {"Rx Bitmask Bits 16-23", "wlan.ht.mcsset.rxbitmask.16to23",
+ FT_UINT32, BASE_HEX, 0, 0x00ff0000,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_dialog_token,
- {"Dialog token", "wlan.fixed.dialog_token",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Management action dialog token", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_24to31,
+ {"Rx Bitmask Bits 24-31", "wlan.ht.mcsset.rxbitmask.24to31",
+ FT_UINT32, BASE_HEX, 0, 0xff000000,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_followup_dialog_token,
- {"Followup Dialog token", "wlan.fixed.followup_dialog_token",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Management action followup dialog token", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_32,
+ {"Rx Bitmask Bit 32", "wlan.ht.mcsset.rxbitmask.32",
+ FT_UINT32, BASE_HEX, 0, 0x000001,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_action_type,
- {"Marvell Action type", "wlan.fixed.mrvl_action_type",
- FT_UINT8, BASE_DEC, VALS(vendor_action_types_mrvl), 0,
- "Vendor Specific Action Type (Marvell)", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_33to38,
+ {"Rx Bitmask Bits 33-38", "wlan.ht.mcsset.rxbitmask.33to38",
+ FT_UINT32, BASE_HEX, 0, 0x00007e,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_action_code,
- {"Mesh action(Marvell)", "wlan.fixed.mrvl_mesh_action",
- FT_UINT8, BASE_HEX, VALS(mesh_mgt_action_codes_mrvl), 0,
- "Mesh action code(Marvell)", HFILL }},
+ {&hf_ieee80211_mcsset_rx_bitmask_39to52,
+ {"Rx Bitmask Bits 39-52", "wlan.ht.mcsset.rxbitmask.39to52",
+ FT_UINT32, BASE_HEX, 0, 0x1fff80,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_length,
- {"Message Length", "wlan.fixed.length",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_mcsset_rx_bitmask_53to76,
+ {"Rx Bitmask Bits 53-76", "wlan.ht.mcsset.rxbitmask.53to76",
+ FT_UINT32, BASE_HEX, 0, 0x1fffffe0,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_mode,
- {"Message Mode", "wlan.fixed.mode",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_mcsset_highest_data_rate,
+ {"Highest Supported Data Rate", "wlan.ht.mcsset.highestdatarate",
+ FT_UINT16, BASE_HEX, 0, 0x03ff,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_ttl,
- {"Message TTL", "wlan.fixed.ttl",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_mcsset_tx_mcs_set_defined,
+ {"Tx Supported MCS Set", "wlan.ht.mcsset.txsetdefined",
+ FT_BOOLEAN, 16, TFS(&tfs_defined_not_defined), 0x0001,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_dstcount,
- {"Destination Count", "wlan.fixed.dstcount",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal,
+ {"Tx and Rx MCS Set", "wlan.ht.mcsset.txrxmcsnotequal",
+ FT_BOOLEAN, 16, TFS(&mcsset_tx_rx_mcs_set_not_equal_flag), 0x0002,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_hopcount,
- {"Hop Count", "wlan.fixed.hopcount",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_mcsset_tx_max_spatial_streams,
+ {"Maximum Number of Tx Spatial Streams Supported", "wlan.ht.mcsset.txmaxss",
+ FT_UINT16, BASE_HEX, 0 , 0x000c,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_rreqid,
- {"RREQ ID", "wlan.fixed.rreqid",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_mcsset_tx_unequal_modulation,
+ {"Unequal Modulation", "wlan.ht.mcsset.txunequalmod",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_sa,
- {"Source Address", "wlan.fixed.sa",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Source MAC address", HFILL }},
+ {&hf_ieee80211_htex_cap,
+ {"HT Extended Capabilities", "wlan.htex.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "HT Extended Capability information", HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_ssn,
- {"SSN", "wlan.fixed.ssn",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Source Sequence Number", HFILL }},
+ {&hf_ieee80211_htex_vs_cap,
+ {"HT Extended Capabilities (VS)", "wlan.vs.htex.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Vendor Specific HT Extended Capability information", HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_metric,
- {"Metric", "wlan.fixed.metric",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Route Metric", HFILL }},
+ {&hf_ieee80211_htex_pco,
+ {"Transmitter supports PCO", "wlan.htex.capabilities.pco",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_flags,
- {"RREQ Flags", "wlan.fixed.hopcount",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_htex_transtime,
+ {"Time needed to transition between 20MHz and 40MHz", "wlan.htex.capabilities.transtime",
+ FT_UINT16, BASE_HEX, VALS(htex_transtime_flags), 0x0006,
NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_da,
- {"Destination Address", "wlan.fixed.da",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Destination MAC address", HFILL }},
+ {&hf_ieee80211_htex_mcs,
+ {"MCS Feedback capability", "wlan.htex.capabilities.mcs",
+ FT_UINT16, BASE_HEX, VALS(htex_mcs_flags), 0x0300,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_dsn,
- {"DSN", "wlan.fixed.dsn",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Destination Sequence Number", HFILL }},
+ {&hf_ieee80211_htex_htc_support,
+ {"High Throughput", "wlan.htex.capabilities.htc",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_marvell_mesh_mgt_lifetime,
- {"Lifetime", "wlan.fixed.lifetime",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Route Lifetime", HFILL }},
+ {&hf_ieee80211_htex_rd_responder,
+ {"Reverse Direction Responder", "wlan.htex.capabilities.rdresponder",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_wme_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT16, BASE_HEX, VALS(wme_action_codes), 0,
- "Management notification action code", HFILL }},
+ {&hf_ieee80211_txbf,
+ {"Transmit Beam Forming (TxBF) Capabilities", "wlan.txbf",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_wme_status_code,
- {"Status code", "wlan.fixed.status_code",
- FT_UINT16, BASE_HEX, VALS(wme_status_codes), 0,
- "Management notification setup response status code", HFILL }},
+ {&hf_ieee80211_txbf_vs,
+ {"Transmit Beam Forming (TxBF) Capabilities (VS)", "wlan.vs.txbf",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "Vendor Specific Transmit Beam Forming (TxBF) Capabilities", HFILL }},
- {&hf_ieee80211_ff_mesh_action,
- {"Mesh Action code", "wlan.fixed.mesh_action",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &mesh_action_ext, 0,
+ {&hf_ieee80211_txbf_cap,
+ {"Transmit Beamforming", "wlan.txbf.txbf",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000001,
NULL, HFILL }},
- {&hf_ieee80211_ff_multihop_action,
- {"Multihop Action code", "wlan.fixed.multihop_action",
- FT_UINT8, BASE_HEX, VALS(multihop_action), 0,
+ {&hf_ieee80211_txbf_rcv_ssc,
+ {"Receive Staggered Sounding", "wlan.txbf.rxss",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000002,
NULL, HFILL }},
- {&hf_ieee80211_ff_mesh_flags,
- {"Mesh Flags", "wlan.fixed.mesh_flags",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_txbf_tx_ssc,
+ {"Transmit Staggered Sounding", "wlan.txbf.txss",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000004,
NULL, HFILL }},
- {&hf_ieee80211_ff_mesh_ttl,
- {"Mesh TTL", "wlan.fixed.mesh_ttl",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_txbf_rcv_ndp,
+ {"Receive Null Data packet (NDP)", "wlan.txbf.rxndp",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000008,
NULL, HFILL }},
- {&hf_ieee80211_ff_mesh_sequence,
- {"Sequence Number", "wlan.fixed.mesh_sequence",
- FT_UINT32, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_txbf_tx_ndp,
+ {"Transmit Null Data packet (NDP)", "wlan.txbf.txndp",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
NULL, HFILL }},
- {&hf_ieee80211_ff_mesh_addr4,
- {"Mesh Extended Address 4", "wlan.fixed.mesh_addr4",
- FT_ETHER, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_txbf_impl_txbf,
+ {"Implicit TxBF capable", "wlan.txbf.impltxbf",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
+ "Implicit Transmit Beamforming (TxBF) capable", HFILL }},
- {&hf_ieee80211_ff_mesh_addr5,
- {"Mesh Extended Address 5", "wlan.fixed.mesh_addr5",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_txbf_calib,
+ {"Calibration", "wlan.txbf.calibration",
+ FT_UINT32, BASE_HEX, VALS(txbf_calib_flag), 0x000000c0,
NULL, HFILL }},
- {&hf_ieee80211_ff_mesh_addr6,
- {"Mesh Extended Address 6", "wlan.fixed.mesh_addr6",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_txbf_expl_csi,
+ {"STA can apply TxBF using CSI explicit feedback", "wlan.txbf.csi",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000100,
+ "Station can apply TxBF using CSI explicit feedback", HFILL }},
+
+ {&hf_ieee80211_txbf_expl_uncomp_fm,
+ {"STA can apply TxBF using uncompressed beamforming feedback matrix", "wlan.txbf.fm.uncompressed.tbf",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000200,
+ "Station can apply TxBF using uncompressed beamforming feedback matrix", HFILL }},
+
+ {&hf_ieee80211_txbf_expl_comp_fm,
+ {"STA can apply TxBF using compressed beamforming feedback matrix", "wlan.txbf.fm.compressed.tbf",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000400,
+ "Station can apply TxBF using compressed beamforming feedback matrix", HFILL }},
+
+ {&hf_ieee80211_txbf_expl_bf_csi,
+ {"Receiver can return explicit CSI feedback", "wlan.txbf.rcsi",
+ FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00001800,
NULL, HFILL }},
- {&hf_ieee80211_ff_selfprot_action,
- {"Self-protected Action code", "wlan.fixed.selfprot_action",
- FT_UINT8, BASE_HEX, VALS(selfprot_action), 0,
+ {&hf_ieee80211_txbf_expl_uncomp_fm_feed,
+ {"Receiver can return explicit uncompressed Beamforming Feedback Matrix", "wlan.txbf.fm.uncompressed.rbf",
+ FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00006000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_peering_proto,
- {"Mesh Peering Protocol ID", "wlan.peering.proto",
- FT_UINT16, BASE_HEX, VALS(mesh_peering_proto_ids), 0,
+ {&hf_ieee80211_txbf_expl_comp_fm_feed,
+ {"STA can compress and use compressed Beamforming Feedback Matrix", "wlan.txbf.fm.compressed.bf",
+ FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00018000,
+ "Station can compress and use compressed Beamforming Feedback Matrix", HFILL }},
+
+ {&hf_ieee80211_txbf_min_group,
+ {"Minimal grouping used for explicit feedback reports", "wlan.txbf.mingroup",
+ FT_UINT32, BASE_HEX, VALS(txbf_min_group_flags), 0x00060000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_peering_local_link_id,
- {"Local Link ID", "wlan.peering.local_id",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Mesh Peering Management Local Link ID", HFILL }},
+ {&hf_ieee80211_vht_cap,
+ {"VHT Capabilities Info", "wlan.vht.capabilities",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "VHT Capabilities information", HFILL }},
- {&hf_ieee80211_mesh_peering_peer_link_id,
- {"Peer Link ID", "wlan.peering.peer_id",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Mesh Peering Management Peer Link ID", HFILL }},
+ {&hf_ieee80211_vht_max_mpdu_length,
+ {"Maximum MPDU Length", "wlan.vht.capabilities.maxmpdulength",
+ FT_UINT32, BASE_HEX, VALS(vht_max_mpdu_length_flag), 0x00000003,
+ "In Octets unit", HFILL }},
- {&hf_ieee80211_ff_hwmp_flags,
- {"HWMP Flags", "wlan.hwmp.flags",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_vht_supported_chan_width_set,
+ {"Supported Channel Width Set", "wlan.vht.capabilities.supportedchanwidthset",
+ FT_UINT32, BASE_HEX, VALS(vht_supported_chan_width_set_flag), 0x0000000c,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_hopcount,
- {"HWMP Hop Count", "wlan.hwmp.hopcount",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_rx_ldpc,
+ {"Rx LDPC", "wlan.vht.capabilities.rxldpc",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_ttl,
- {"HWMP TTL", "wlan.hwmp.ttl",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_short_gi_for_80,
+ {"Short GI for 80MHz/TVHT_MODE_4C", "wlan.vht.capabilities.short80",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_pdid,
- {"HWMP Path Discovery ID", "wlan.hwmp.pdid",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_short_gi_for_160,
+ {"Short GI for 160MHz and 80+80MHz", "wlan.vht.capabilities.short160",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000040,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_orig_sta,
- {"Originator STA Address", "wlan.hwmp.orig_sta",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_tx_stbc,
+ {"Tx STBC", "wlan.vht.capabilities.txstbc",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000080,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_orig_sn,
- {"HWMP Originator Sequence Number", "wlan.hwmp.orig_sn",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL}},
-
- {&hf_ieee80211_ff_hwmp_orig_ext,
- {"Originator External Address", "wlan.hwmp.orig_ext",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_rx_stbc,
+ {"Rx STBC", "wlan.vht.capabilities.rxstbc",
+ FT_UINT32, BASE_HEX, VALS(vht_rx_stbc_flag), 0x00000700,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_lifetime,
- {"HWMP Lifetime", "wlan.hwmp.lifetime",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_su_beamformer_cap,
+ {"SU Beamformer Capable", "wlan.vht.capabilities.subeamformer",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000800,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_metric,
- {"HWMP Metric", "wlan.hwmp.metric",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_su_beamformee_cap,
+ {"SU Beamformee Capable", "wlan.vht.capabilities.subeamformee",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00001000,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_targ_count,
- {"HWMP Target Count", "wlan.hwmp.targ_count",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_beamformer_antennas,
+ {"Beamformee STS Capability", "wlan.vht.capabilities.beamformee_sts_cap",
+ FT_UINT32, BASE_HEX, VALS(num_plus_one_3bit_flag), 0x0000e000,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_targ_flags,
- {"HWMP Per-Target Flags", "wlan.hwmp.targ_flags",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_vht_sounding_dimensions,
+ {"Number of Sounding Dimensions", "wlan.vht.capabilities.soundingdimensions",
+ FT_UINT32, BASE_HEX, VALS(num_plus_one_3bit_flag), 0x00070000,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_targ_to_flags,
- {"TO Flag", "wlan.hwmp.to_flag",
- FT_BOOLEAN, 8, TFS(&hwmp_targ_to_flags), 0x01,
- "Target Only Flag", HFILL }},
-
- {&hf_ieee80211_ff_hwmp_targ_usn_flags,
- {"USN Flag", "wlan.hwmp.usn_flag",
- FT_BOOLEAN, 8, TFS(&hwmp_targ_usn_flags), 0x04,
- "Unknown Target HWMP Sequence Number Flag", HFILL }},
-
- {&hf_ieee80211_ff_hwmp_targ_sta,
- {"Target STA Address", "wlan.hwmp.targ_sta",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mu_beamformer_cap,
+ {"MU Beamformer Capable", "wlan.vht.capabilities.mubeamformer",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00080000,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_targ_ext,
- {"Target External Address", "wlan.hwmp.targ_ext",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mu_beamformee_cap,
+ {"MU Beamformee Capable", "wlan.vht.capabilities.mubeamformee",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00100000,
NULL, HFILL }},
- {&hf_ieee80211_ff_hwmp_targ_sn,
- {"Target HWMP Sequence Number", "wlan.hwmp.targ_sn",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_txop_ps,
+ {"TXOP PS", "wlan.vht.capabilities.vhttxopps",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00200000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_path_sel_protocol,
- {"Path Selection Protocol", "wlan.mesh.config.ps_protocol",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Path Selection Protocol", HFILL }},
-
- {&hf_ieee80211_mesh_config_path_sel_metric,
- {"Path Selection Metric", "wlan.mesh.config.ps_metric",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Path Selection Metric", HFILL }},
-
- {&hf_ieee80211_mesh_config_congestion_control,
- {"Congestion Control", "wlan.mesh.config.cong_ctl",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Congestion Control", HFILL }},
-
- {&hf_ieee80211_mesh_config_sync_method,
- {"Synchronization Method", "wlan.mesh.config.sync_method",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Synchronization Method", HFILL }},
-
- {&hf_ieee80211_mesh_config_auth_protocol,
- {"Authentication Protocol", "wlan.mesh.config.auth_protocol",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Authentication Protocol", HFILL }},
-
- {&hf_ieee80211_mesh_config_formation_info,
- {"Formation Info", "wlan.mesh.config.formation_info",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Formation Info", HFILL }},
-
- {&hf_ieee80211_mesh_form_info_num_of_peerings,
- {"Number of Peerings", "wlan.mesh.config.formation_info.num_peers",
- FT_UINT8, BASE_DEC, NULL, 0x7E,
+ {&hf_ieee80211_vht_var_htc_field,
+ {"+HTC-VHT Capable", "wlan.vht.capabilities.vhthtc",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00400000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_capability,
- {"Capability", "wlan.mesh.config.cap",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Mesh Configuration Capability", HFILL }},
+ {&hf_ieee80211_vht_max_ampdu,
+ {"Max A-MPDU Length Exponent", "wlan.vht.capabilities.maxampdu",
+ FT_UINT32, BASE_HEX, VALS(vht_max_ampdu_flag), 0x03800000,
+ "In Octets unit", HFILL }},
- {&hf_ieee80211_mesh_config_cap_accepting,
- {"Accepting Additional Mesh Peerings", "wlan.mesh.config.cap.accept",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
+ {&hf_ieee80211_vht_link_adaptation_cap,
+ {"VHT Link Adaptation", "wlan.vht.capabilities.linkadapt",
+ FT_UINT32, BASE_HEX, VALS(vht_link_adapt_flag), 0x0c000000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_cap_mcca_support,
- {"MCCA Support", "wlan.mesh.config.cap.mcca_support",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
+ {&hf_ieee80211_vht_rx_pattern,
+ {"Rx Antenna Pattern Consistency", "wlan.vht.capabilities.rxpatconsist",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x10000000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_cap_mcca_enabled,
- {"MCCA Enabled", "wlan.mesh.config.cap.mcca_enabled",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
+ {&hf_ieee80211_vht_tx_pattern,
+ {"Tx Antenna Pattern Consistency", "wlan.vht.capabilities.txpatconsist",
+ FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x20000000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_cap_forwarding,
- {"Mesh Forwarding", "wlan.mesh.config.cap.forwarding",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
+ {&hf_ieee80211_vht_ext_nss_bw_support,
+ {"Extended NSS BW Support", "wlan.vht.capabilities.ext_nss_bw_support",
+ FT_UINT32, BASE_HEX, NULL, 0xc0000000,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_cap_mbca_enabled,
- {"MBCA Enabled", "wlan.mesh.config.cap.mbca_enabled",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
+ {&hf_ieee80211_vht_mcsset,
+ {"VHT Supported MCS Set", "wlan.vht.mcsset",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_cap_tbtt_adjusting,
- {"TBTT Adjustment", "wlan.mesh.config.cap.tbtt_adjusting",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
+ {&hf_ieee80211_vht_mcsset_rx_mcs_map,
+ {"Rx MCS Map", "wlan.vht.mcsset.rxmcsmap",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_config_cap_power_save_level,
- {"Power Save", "wlan.mesh.config.cap.power_save_level",
- FT_BOOLEAN, 8, TFS(&mesh_config_cap_power_save_level_flags), 0x40,
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss,
+ {"Rx 1 SS", "wlan.vht.mcsset.rxmcsmap.ss1",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
NULL, HFILL }},
- {&hf_ieee80211_mesh_id,
- {"Mesh ID", "wlan.mesh.id",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss,
+ {"Rx 2 SS", "wlan.vht.mcsset.rxmcsmap.ss2",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
NULL, HFILL }},
- {&hf_ieee80211_rann_flags,
- {"RANN Flags", "wlan.rann.flags",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Root Announcement Flags", HFILL }},
-
- {&hf_ieee80211_rann_root_sta,
- {"Root STA Address", "wlan.rann.root_sta", FT_ETHER, BASE_NONE, NULL, 0,
- "Root Mesh STA Address", HFILL }},
-
- {&hf_ieee80211_rann_sn,
- {"Root STA Sequence Number", "wlan.rann.rann_sn",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Root Mesh STA Sequence Number", HFILL }},
-
- {&hf_ieee80211_rann_interval,
- {"RANN Interval", "wlan.rann.interval",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Root Announcement Interval", HFILL }},
-
- {&hf_ieee80211_ff_qos_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT16, BASE_HEX, VALS(qos_action_codes), 0,
- "QoS management action code", HFILL }},
-
- {&hf_ieee80211_ff_ba_action,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT8, BASE_HEX, VALS(ba_action_codes), 0,
- "Block Ack action code", HFILL }},
-
- {&hf_ieee80211_ff_check_beacon,
- {"Check Beacon", "wlan.fixed.check_beacon",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Unprotected WNM Check Beacon", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss,
+ {"Rx 3 SS", "wlan.vht.mcsset.rxmcsmap.ss3",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_tod,
- {"TOD", "wlan.fixed.tod",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Previous TS of transmit antenna port", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss,
+ {"Rx 4 SS", "wlan.vht.mcsset.rxmcsmap.ss4",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_toa,
- {"TOA", "wlan.fixed.toa",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Previous TS of receive antenna port", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss,
+ {"Rx 5 SS", "wlan.vht.mcsset.rxmcsmap.ss5",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_max_tod_err,
- {"MAX TOD ERROR", "wlan.fixed.max_tod_err",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Maximal Error at Previous TS of transmit antenna port", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss,
+ {"Rx 6 SS", "wlan.vht.mcsset.rxmcsmap.ss6",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_max_toa_err,
- {"MAX TOA ERROR", "wlan.fixed.max_toa_err",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Maximal Error at Previous TS of receive antenna port", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss,
+ {"Rx 7 SS", "wlan.vht.mcsset.rxmcsmap.ss7",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_dls_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT16, BASE_HEX, VALS(dls_action_codes), 0,
- "DLS management action code", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss,
+ {"Rx 8 SS", "wlan.vht.mcsset.rxmcsmap.ss8",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_dst_mac_addr,
- {"Destination address", "wlan.fixed.dst_mac_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Destination MAC address", HFILL }},
+ {&hf_ieee80211_vht_mcsset_max_nsts_total,
+ {"MaX NSTS Total", "wlan.vht.mcsset.max_nsts_total",
+ FT_UINT16, BASE_DEC, NULL, 0xe000, NULL, HFILL }},
- {&hf_ieee80211_ff_src_mac_addr,
- {"Source address", "wlan.fixed.src_mac_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Source MAC address", HFILL }},
+ {&hf_ieee80211_vht_mcsset_rx_highest_long_gi,
+ {"Rx Highest Long GI Data Rate (in Mb/s, 0 = subfield not in use)", "wlan.vht.mcsset.rxhighestlonggirate",
+ FT_UINT16, BASE_HEX, NULL, 0x1fff,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_req_ap_addr,
- {"RequesterAP address", "wlan.fixed.req_ap_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_tx_mcs_map,
+ {"Tx MCS Map", "wlan.vht.mcsset.txmcsmap",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_res_ap_addr,
- {"ResponderAP address", "wlan.fixed.res_ap_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss,
+ {"Tx 1 SS", "wlan.vht.mcsset.txmcsmap.ss1",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
NULL, HFILL }},
- {&hf_ieee80211_ff_ft_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT8, BASE_DEC, VALS(ft_action_codes), 0,
- "Management action code", HFILL }},
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss,
+ {"Tx 2 SS", "wlan.vht.mcsset.txmcsmap.ss2",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_sta_address,
- {"STA Address", "wlan.fixed.sta_address",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss,
+ {"Tx 3 SS", "wlan.vht.mcsset.txmcsmap.ss3",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
NULL, HFILL }},
- {&hf_ieee80211_ff_target_ap_address,
- {"Target AP Address", "wlan.fixed.target_ap_address",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Target AP MAC address", HFILL }},
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss,
+ {"Tx 4 SS", "wlan.vht.mcsset.txmcsmap.ss4",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_gas_comeback_delay,
- {"GAS Comeback Delay", "wlan.fixed.gas_comeback_delay",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss,
+ {"Tx 5 SS", "wlan.vht.mcsset.txmcsmap.ss5",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
NULL, HFILL }},
- {&hf_ieee80211_ff_gas_fragment_id,
- {"GAS Query Response Fragment ID", "wlan.fixed.gas_fragment_id",
- FT_UINT8, BASE_DEC, NULL, 0x7f,
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss,
+ {"Tx 6 SS", "wlan.vht.mcsset.txmcsmap.ss6",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
NULL, HFILL }},
- {&hf_ieee80211_ff_more_gas_fragments,
- {"More GAS Fragments", "wlan.fixed.more_gas_fragments",
- FT_UINT8, BASE_DEC, NULL, 0x80,
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss,
+ {"Tx 7 SS", "wlan.vht.mcsset.txmcsmap.ss7",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
NULL, HFILL }},
- {&hf_ieee80211_ff_query_request_length,
- {"Query Request Length", "wlan.fixed.query_request_length",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss,
+ {"Tx 8 SS", "wlan.vht.mcsset.txmcsmap.ss8",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
NULL, HFILL }},
- {&hf_ieee80211_ff_query_request,
- {"Query Request", "wlan.fixed.query_request",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_tx_highest_long_gi,
+ {"Tx Highest Long GI Data Rate (in Mb/s, 0 = subfield not in use)", "wlan.vht.mcsset.txhighestlonggirate",
+ FT_UINT16, BASE_HEX, NULL, 0x1fff,
NULL, HFILL }},
- {&hf_ieee80211_ff_query_response_length,
- {"Query Response Length", "wlan.fixed.query_response_length",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_mcsset_ext_nss_bw_cap,
+ {"Extended NSS BW Capable", "wlan.vht.ncsset.ext_nss_bw_cap",
+ FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x2000, NULL, HFILL }},
+
+ {&hf_ieee80211_vht_mcsset_reserved,
+ {"Reserved", "wlan.vht.ncsset.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xc000, NULL, HFILL }},
+
+ {&hf_ieee80211_vht_op,
+ {"VHT Operation Info", "wlan.vht.op",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_query_response,
- {"Query Response", "wlan.fixed.query_response",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_op_channel_width,
+ {"Channel Width", "wlan.vht.op.channelwidth",
+ FT_UINT8, BASE_HEX, VALS(vht_op_channel_width_flag), 0,
NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragments,
- {"GAS Query Response fragments", "wlan.fixed.fragments",
- FT_NONE, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_channel_center0,
+ {"Channel Center Segment 0", "wlan.vht.op.channelcenter0",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment,
- {"GAS Query Response fragment", "wlan.fixed.fragment",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_channel_center1,
+ {"Channel Center Segment 1", "wlan.vht.op.channelcenter1",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment_overlap,
- {"GAS Query Response fragment overlap", "wlan.fixed.fragment.overlap",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_basic_mcs_map,
+ {"Basic MCS Map", "wlan.vht.op.basicmcsmap",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment_overlap_conflict,
- {"GAS Query Response fragment overlapping with conflicting data", "wlan.fixed.fragment.overlap.conflicts",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_1_ss,
+ {"Basic 1 SS", "wlan.vht.op.basicmcsmap.ss1",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment_multiple_tails,
- {"GAS Query Response has multiple tail fragments", "wlan.fixed.fragment.multiple_tails",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_2_ss,
+ {"Basic 2 SS", "wlan.vht.op.basicmcsmap.ss2",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment_too_long_fragment,
- {"GAS Query Response fragment too long", "wlan.fixed.fragment.too_long_fragment",
- FT_BOOLEAN, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_3_ss,
+ {"Basic 3 SS", "wlan.vht.op.basicmcsmap.ss3",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment_error,
- {"GAS Query Response reassembly error", "wlan.fixed.fragment.error",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_4_ss,
+ {"Basic 4 SS", "wlan.vht.op.basicmcsmap.ss4",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_fragment_count,
- {"GAS Query Response fragment count", "wlan.fixed.fragment.count",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_5_ss,
+ {"Basic 5 SS", "wlan.vht.op.basicmcsmap.ss5",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_reassembled_in,
- {"Reassembled in", "wlan.fixed.reassembled.in",
- FT_FRAMENUM, BASE_NONE, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_6_ss,
+ {"Basic 6 SS", "wlan.vht.op.basicmcsmap.ss6",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
+ NULL, HFILL }},
- {&hf_ieee80211_gas_resp_reassembled_length,
- {"Reassembled length", "wlan.fixed.reassembled.length",
- FT_UINT32, BASE_DEC, NULL, 0x00,
- NULL, HFILL } },
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_7_ss,
+ {"Basic 7 SS", "wlan.vht.op.basicmcsmap.ss7",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_info_id,
- {"Info ID", "wlan.fixed.anqp.info_id",
- FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
- "Access Network Query Protocol Info ID", HFILL }},
+ {&hf_ieee80211_vht_op_max_basic_mcs_for_8_ss,
+ {"Basic 8 SS", "wlan.vht.op.basicmcsmap.ss8",
+ FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_info_length,
- {"Length", "wlan.fixed.anqp.info_length",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Access Network Query Protocol Length", HFILL }},
+ {&hf_ieee80211_vht_tpe_pwr_info,
+ {"Tx Pwr Info", "wlan.vht.tpe.pwr_info",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_info,
- {"Information", "wlan.fixed.anqp.info",
- FT_BYTES, BASE_NONE, NULL, 0,
- "Access Network Query Protocol Information", HFILL }},
+ {&hf_ieee80211_vht_tpe_pwr_info_count,
+ {"Max Tx Pwr Count", "wlan.vht.tpe.pwr_info.count",
+ FT_UINT8, BASE_DEC, NULL , 0x07,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_query_id,
- {"ANQP Query ID", "wlan.fixed.anqp.query_id",
- FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
- "Access Network Query Protocol Query ID", HFILL }},
+ {&hf_ieee80211_vht_tpe_pwr_info_unit,
+ {"Max Tx Pwr Unit Interpretation", "wlan.vht.tpe.pwr_info.unit",
+ FT_UINT8, BASE_DEC, VALS(vht_tpe_pwr_units) , 0x38,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_capability,
- {"ANQP Capability", "wlan.fixed.anqp.capability",
- FT_UINT16, BASE_DEC|BASE_EXT_STRING, &anqp_info_id_vals_ext, 0,
- "Access Network Query Protocol Query ID", HFILL }},
+ {&hf_ieee80211_vht_tpe_pwr_info_reserved,
+ {"Reserved", "wlan.vht.tpe.pwr_info.reserved",
+ FT_UINT8, BASE_DEC, NULL , 0xC0,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_capability_vlen,
- {"Vendor-specific Capability Length", "wlan.fixed.anqp.capability_vlen",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_tpe_pwr_constr_20,
+ {"Local Max Tx Pwr Constraint 20MHz", "wlan.vht.tpe.pwr_constr_20",
+ FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_capability_vendor,
- {"Vendor-specific Capability", "wlan.fixed.anqp.capability_vendor",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vht_tpe_pwr_constr_40,
+ {"Local Max Tx Pwr Constraint 40MHz", "wlan.vht.tpe.pwr_constr_40",
+ FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_venue_info_group,
- {"Venue Group", "wlan.fixed.venue_info.group",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &venue_group_vals_ext, 0,
+ {&hf_ieee80211_vht_tpe_pwr_constr_80,
+ {"Local Max Tx Pwr Constraint 80MHz", "wlan.vht.tpe.pwr_constr_80",
+ FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_venue_info_type,
- {"Venue Type", "wlan.fixed.venue_info.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_vht_tpe_pwr_constr_160,
+ {"Local Max Tx Pwr Constraint 160MHz/80+80 MHz", "wlan.vht.tpe.pwr_constr_160",
+ FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_venue_length,
- {"Venue Name Duple Length", "wlan.fixed.anqp.venue.length",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_txbf_csi_num_bf_ant,
+ {"Max antennae STA can support when CSI feedback required", "wlan.txbf.csinumant",
+ FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x00180000,
+ "Max antennae station can support when CSI feedback required", HFILL }},
- {&hf_ieee80211_ff_anqp_venue_language,
- {"Language Code", "wlan.fixed.anqp.venue.language",
- FT_STRING, BASE_NONE, NULL, 0,
- "Venue Name Language Code", HFILL }},
+ {&hf_ieee80211_txbf_uncomp_sm_bf_ant,
+ {"Max antennae STA can support when uncompressed Beamforming feedback required", "wlan.txbf.fm.uncompressed.maxant",
+ FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x00600000,
+ "Max antennae station can support when uncompressed Beamforming feedback required", HFILL }},
- {&hf_ieee80211_ff_anqp_venue_name,
- {"Venue Name", "wlan.fixed.anqp.venue.name",
- FT_STRING, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_txbf_comp_sm_bf_ant,
+ {"Max antennae STA can support when compressed Beamforming feedback required", "wlan.txbf.fm.compressed.maxant",
+ FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x01800000,
+ "Max antennae station can support when compressed Beamforming feedback required", HFILL }},
- {&hf_ieee80211_ff_anqp_nw_auth_type_indicator,
- {"Network Authentication Type Indicator", "wlan.fixed.anqp.nw_auth_type.indicator",
- FT_UINT8, BASE_DEC, VALS(nw_auth_type_vals), 0,
+ {&hf_ieee80211_txbf_csi_max_rows_bf,
+ {"Maximum number of rows of CSI explicit feedback", "wlan.txbf.csi.maxrows",
+ FT_UINT32, BASE_HEX, VALS(txbf_csi_max_rows_bf_flags), 0x06000000,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nw_auth_type_url_len,
- {"Re-direct URL Length", "wlan.fixed.anqp.nw_auth_type.url_len",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_txbf_chan_est,
+ {"Maximum number of space time streams for which channel dimensions can be simultaneously estimated", "wlan.txbf.channelest",
+ FT_UINT32, BASE_HEX, VALS(txbf_chan_est_flags), 0x18000000,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nw_auth_type_url,
- {"Re-direct URL", "wlan.fixed.anqp.nw_auth_type_url",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_txbf_resrv,
+ {"Reserved", "wlan.txbf.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xe0000000,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_roaming_consortium_oi_len,
- {"OI Length", "wlan.fixed.anqp.roaming_consortium.oi_len",
+ {&hf_ieee80211_hta_cc,
+ {"HT Control Channel", "wlan.hta.control_channel",
FT_UINT8, BASE_DEC, NULL, 0,
- "Roaming Consortium OI Length", HFILL }},
-
- {&hf_ieee80211_ff_anqp_roaming_consortium_oi,
- {"OI", "wlan.fixed.anqp.roaming_consortium.oi",
- FT_BYTES, BASE_NONE, NULL, 0,
- "Roaming Consortium OI", HFILL }},
+ NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_ip_addr_avail_ipv6,
- {"IPv6 Address", "wlan.fixed.anqp.ip_addr_availability.ipv6",
- FT_UINT8, BASE_DEC, VALS(ip_addr_avail_ipv6_vals), 0x03,
- "IP Address Type Availability information for IPv6", HFILL }},
+ {&hf_ieee80211_hta_cap1,
+ {"HT Additional Capabilities", "wlan.hta.capabilities",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "HT Additional Capability information", HFILL }},
- {&hf_ieee80211_ff_anqp_ip_addr_avail_ipv4,
- {"IPv4 Address", "wlan.fixed.anqp.ip_addr_availability.ipv4",
- FT_UINT8, BASE_DEC, VALS(ip_addr_avail_ipv4_vals), 0xfc,
- "IP Address Type Availability information for IPv4", HFILL }},
+ {&hf_ieee80211_hta_cap2,
+ {"HT Additional Capabilities", "wlan.hta.capabilities",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "HT Additional Capability information", HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_count,
- {"NAI Realm Count", "wlan.fixed.anqp.nai_realm_list.count",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_hta_ext_chan_offset,
+ {"Extension Channel Offset", "wlan.hta.capabilities.ext_chan_offset",
+ FT_UINT16, BASE_HEX, VALS(hta_ext_chan_offset_flag), 0x0003,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_field_len,
- {"NAI Realm Data Field Length", "wlan.fixed.anqp.nai_realm_list.field_len",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_hta_rec_tx_width,
+ {"Recommended Tx Channel Width", "wlan.hta.capabilities.rec_tx_width",
+ FT_BOOLEAN, 16, TFS(&hta_rec_tx_width_flag), 0x0004,
+ "Recommended Transmit Channel Width", HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_encoding,
- {"NAI Realm Encoding", "wlan.fixed.naqp_nai_realm_list.encoding",
- FT_UINT8, BASE_DEC, VALS(nai_realm_encoding_vals), 0x01,
+ {&hf_ieee80211_hta_rifs_mode,
+ {"Reduced Interframe Spacing (RIFS) Mode", "wlan.hta.capabilities.rifs_mode",
+ FT_BOOLEAN, 16, TFS(&hta_rifs_mode_flag), 0x0008,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_length,
- {"NAI Realm Length", "wlan.fixed.naqp_nai_realm_list.realm_length",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_hta_controlled_access,
+ {"Controlled Access Only", "wlan.hta.capabilities.controlled_access",
+ FT_BOOLEAN, 16, TFS(&hta_controlled_access_flag), 0x0010,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm,
- {"NAI Realm", "wlan.fixed.naqp_nai_realm_list.realm",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_hta_service_interval,
+ {"Service Interval Granularity", "wlan.hta.capabilities.service_interval",
+ FT_UINT16, BASE_HEX, VALS(hta_service_interval_flag), 0x00E0,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_eap_count,
- {"EAP Method Count", "wlan.fixed.naqp_nai_realm_list.eap_method_count",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_hta_operating_mode,
+ {"Operating Mode", "wlan.hta.capabilities.operating_mode",
+ FT_UINT16, BASE_HEX, VALS(hta_operating_mode_flag), 0x0003,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_eap_len,
- {"EAP Method subfield Length", "wlan.fixed.naqp_nai_realm_list.eap_method_len",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_hta_non_gf_devices,
+ {"Non Greenfield (GF) devices Present", "wlan.hta.capabilities.non_gf_devices",
+ FT_BOOLEAN, 16, TFS(&hta_non_gf_devices_flag), 0x0004,
+ "on Greenfield (GF) devices Present", HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_eap_method,
- {"EAP Method", "wlan.fixed.naqp_nai_realm_list.eap_method",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &eap_type_vals_ext, 0,
+ {&hf_ieee80211_hta_basic_stbc_mcs,
+ {"Basic STB Modulation and Coding Scheme (MCS)", "wlan.hta.capabilities.basic_stbc_mcs",
+ FT_UINT16, BASE_HEX, NULL , 0x007f,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_auth_param_count,
- {"Authentication Parameter Count", "wlan.fixed.naqp_nai_realm_list.auth_param_count",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_hta_dual_stbc_protection,
+ {"Dual Clear To Send (CTS) Protection", "wlan.hta.capabilities.dual_stbc_protection",
+ FT_BOOLEAN, 16, TFS(&hta_dual_stbc_protection_flag), 0x0080,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_auth_param_id,
- {"Authentication Parameter ID", "wlan.fixed.naqp_nai_realm_list.auth_param_id",
- FT_UINT8, BASE_DEC, VALS(nai_realm_auth_param_id_vals), 0,
+ {&hf_ieee80211_hta_secondary_beacon,
+ {"Secondary Beacon", "wlan.hta.capabilities.secondary_beacon",
+ FT_BOOLEAN, 16, TFS(&hta_secondary_beacon_flag), 0x0100,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_auth_param_len,
- {"Authentication Parameter Length", "wlan.fixed.naqp_nai_realm_list.auth_param_len",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_hta_lsig_txop_protection,
+ {"L-SIG TXOP Protection Support", "wlan.hta.capabilities.lsig_txop_protection",
+ FT_BOOLEAN, 16, TFS(&hta_lsig_txop_protection_flag), 0x0200,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_nai_realm_auth_param_value,
- {"Authentication Parameter Value", "wlan.fixed.naqp_nai_realm_list.auth_param_value",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_hta_pco_active,
+ {"Phased Coexistence Operation (PCO) Active", "wlan.hta.capabilities.pco_active",
+ FT_BOOLEAN, 16, TFS(&hta_pco_active_flag), 0x0400,
NULL, HFILL }},
- {&hf_ieee80211_3gpp_gc_gud,
- {"GUD", "wlan.fixed.anqp.3gpp_cellular_info.gud",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Generic container User Data", HFILL }},
-
- {&hf_ieee80211_3gpp_gc_udhl,
- {"UDHL", "wlan.fixed.anqp.3gpp_cellular_info.udhl",
- FT_UINT8, BASE_DEC, NULL, 0,
- "User Data Header Length", HFILL }},
+ {&hf_ieee80211_hta_pco_phase,
+ {"Phased Coexistence Operation (PCO) Phase", "wlan.hta.capabilities.pco_phase",
+ FT_BOOLEAN, 16, TFS(&hta_pco_phase_flag), 0x0800,
+ NULL, HFILL }},
- {&hf_ieee80211_3gpp_gc_iei,
- {"IEI", "wlan.fixed.anqp.3gpp_cellular_info.iei",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Information Element Identity", HFILL }},
+ {&hf_ieee80211_antsel,
+ {"Antenna Selection (ASEL) Capabilities", "wlan.asel",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_3gpp_gc_plmn_len,
- {"PLMN Length", "wlan.fixed.anqp.3gpp_cellular_info.plmn_len",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Length of PLMN List value contents", HFILL }},
+ {&hf_ieee80211_antsel_vs,
+ {"Antenna Selection (ASEL) Capabilities (VS)", "wlan.vs.asel",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Vendor Specific Antenna Selection (ASEL) Capabilities", HFILL }},
- {&hf_ieee80211_3gpp_gc_num_plmns,
- {"Number of PLMNs", "wlan.fixed.anqp.3gpp_cellular_info.num_plmns",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_antsel_b0,
+ {"Antenna Selection Capable", "wlan.asel.capable",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_domain_name_len,
- {"Domain Name Length", "wlan.fixed.anqp.domain_name_list.len",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_antsel_b1,
+ {"Explicit CSI Feedback Based Tx ASEL", "wlan.asel.txcsi",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_ff_anqp_domain_name,
- {"Domain Name", "wlan.fixed.anqp.domain_name_list.name",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_antsel_b2,
+ {"Antenna Indices Feedback Based Tx ASEL", "wlan.asel.txif",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_ff_dls_timeout,
- {"DLS timeout", "wlan.fixed.dls_timeout",
- FT_UINT16, BASE_HEX, NULL, 0,
- "DLS timeout value", HFILL }},
-
- {&hf_ieee80211_ff_sa_query_action_code,
- {"Action code", "wlan.fixed.action_code",
- FT_UINT8, BASE_DEC, VALS(sa_query_action_codes), 0,
- "Management action code", HFILL }},
+ {&hf_ieee80211_antsel_b3,
+ {"Explicit CSI Feedback", "wlan.asel.csi",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
+ NULL, HFILL }},
- {&hf_ieee80211_ff_transaction_id,
- {"Transaction Id", "wlan.fixed.transaction_id",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_antsel_b4,
+ {"Antenna Indices Feedback", "wlan.asel.if",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_anqp_wfa_subtype,
- {"WFA Subtype", "wlan.anqp.wfa.subtype",
- FT_UINT8, BASE_DEC, VALS(wfa_subtype_vals), 0, NULL, HFILL }},
+ {&hf_ieee80211_antsel_b5,
+ {"Rx ASEL", "wlan.asel.rx",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
+ NULL, HFILL }},
- {&hf_ieee80211_dpp_subtype,
- {"DPP Subtype", "wlan.wfa.dpp.subtype",
- FT_UINT8, BASE_DEC, VALS(dpp_subtype_vals), 0, NULL, HFILL }},
+ {&hf_ieee80211_antsel_b6,
+ {"Tx Sounding PPDUs", "wlan.asel.sppdu",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+ NULL, HFILL }},
- {&hf_hs20_indication_dgaf_disabled,
- {"DGAF Disabled", "wlan.hs20.indication.dgaf_disabled",
- FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
+ {&hf_ieee80211_antsel_b7,
+ {"Reserved", "wlan.asel.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x80,
+ NULL, HFILL }},
- {&hf_hs20_indication_pps_mo_id_present,
- {"PPS MO ID Present", "wlan.hs20.indication.pps_mo_id_present",
- FT_UINT8, BASE_DEC, NULL, 0x02, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_delimiter1,
+ {"HT Information Subset (1 of 3)", "wlan.ht.info.delim1",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_hs20_indication_anqp_domain_id_present,
- {"ANQP Domain ID Present", "wlan.hs20.indication.anqp_domain_id_present",
- FT_UINT8, BASE_DEC, NULL, 0x04, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_primary_channel,
+ {"Primary Channel", "wlan.ht.info.primarychannel",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_hs20_indication_release_number,
- {"Release Number", "wlan.hs20.indication.release_number",
- FT_UINT8, BASE_DEC, VALS(hs20_indication_release_number_vals), 0xF0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_secondary_channel_offset,
+ {"Secondary channel offset", "wlan.ht.info.secchanoffset",
+ FT_UINT8, BASE_HEX, VALS(ht_info_secondary_channel_offset_flags), 0x03,
+ NULL, HFILL }},
- {&hf_hs20_anqp_subtype,
- {"Subtype", "wlan.hs20.anqp.subtype",
- FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
- "Hotspot 2.0 ANQP Subtype", HFILL }},
+ {&hf_ieee80211_ht_info_sta_channel_width,
+ {"Supported channel width", "wlan.ht.info.chanwidth",
+ FT_BOOLEAN, 8, TFS(&ht_info_channel_sta_width_flag), 0x04,
+ NULL, HFILL }},
- {&hf_hs20_anqp_reserved,
- {"Reserved", "wlan.hs20.anqp.reserved",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_rifs_mode,
+ {"Reduced Interframe Spacing (RIFS)", "wlan.ht.info.rifs",
+ FT_BOOLEAN, 8, TFS(&ht_info_rifs_mode_flag), 0x08,
+ NULL, HFILL }},
- {&hf_hs20_anqp_payload,
- {"Payload", "wlan.hs20.anqp.payload",
- FT_BYTES, BASE_NONE, NULL, 0,
- "Hotspot 2.0 ANQP Payload", HFILL }},
+ {&hf_ieee80211_ht_info_reserved_b4_b7,
+ {"Reserved", "wlan.ht.info.reserved_b4_b7",
+ FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL }},
- {&hf_hs20_anqp_hs_query_list,
- {"Queried Subtype", "wlan.hs20.anqp.hs_query_list",
- FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
- "Queried HS 2.0 Element Subtype", HFILL }},
+ {&hf_ieee80211_ht_info_delimiter2,
+ {"HT Information Subset (2 of 3)", "wlan.ht.info.delim2",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_hs_capability_list,
- {"Capability", "wlan.hs20.anqp.hs_capability_list",
- FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
- "Hotspot 2.0 ANQP Subtype Capability", HFILL }},
+ {&hf_ieee80211_ht_info_protection,
+ {"HT Protection", "wlan.ht.info.ht_protection",
+ FT_UINT16, BASE_HEX, VALS(ht_info_operating_protection_mode_flags), 0x0003,
+ NULL, HFILL }},
- {&hf_hs20_anqp_ofn_length,
- {"Length", "wlan.hs20.anqp.ofn.length",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Operator Friendly Name Length", HFILL }},
+ {&hf_ieee80211_ht_info_non_greenfield_sta_present,
+ {"Non-greenfield STAs present", "wlan.ht.info.greenfield",
+ FT_BOOLEAN, 16, TFS(&ht_info_non_greenfield_sta_present_flag), 0x0004,
+ NULL, HFILL }},
- {&hf_hs20_anqp_ofn_language,
- {"Language Code", "wlan.hs20.anqp.ofn.language",
- FT_STRING, BASE_NONE, NULL, 0,
- "Operator Friendly Name Language Code", HFILL }},
+ {&hf_ieee80211_ht_info_reserved_b11,
+ {"Reserved", "wlan.ht.info.reserved_b11",
+ FT_UINT16, BASE_HEX, NULL, 0x0008, NULL, HFILL }},
- {&hf_hs20_anqp_ofn_name,
- {"Operator Friendly Name", "wlan.hs20.anqp.ofn.name",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ht_info_obss_non_ht_stas_present,
+ {"OBSS non-HT STAs present", "wlan.ht.info.obssnonht",
+ FT_BOOLEAN, 16, TFS(&ht_info_obss_non_ht_stas_present_flag), 0x0010,
NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_link_status,
- {"Link Status", "wlan.hs20.anqp.wan_metrics.link_status",
- FT_UINT8, BASE_DEC, VALS(hs20_wm_link_status_vals), 0x03, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_channel_center_freq_seg_2,
+ {"Channel Center Frequency Segment 2", "wlan.ht.info.chan_center_freq_seg_2",
+ FT_UINT16, BASE_DEC, NULL, 0x1fe0, NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_symmetric_link,
- {"Symmetric Link", "wlan.hs20.anqp.wan_metrics.symmetric_link",
- FT_UINT8, BASE_DEC, NULL, 0x04, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_reserved_b21_b23,
+ {"Reserved", "wlan.ht.info.reserved_b21_b23",
+ FT_UINT16, BASE_HEX, NULL, 0xe000,
+ NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_at_capacity,
- {"At Capacity", "wlan.hs20.anqp.wan_metrics.at_capacity",
- FT_UINT8, BASE_DEC, NULL, 0x08, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_delimiter3,
+ {"HT Information Subset (3 of 3)", "wlan.ht.info.delim3",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_reserved,
- {"Reserved", "wlan.hs20.anqp.wan_metrics.reserved",
- FT_UINT8, BASE_DEC, NULL, 0xf0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_reserved_b24_b29,
+ {"Reserved", "wlan.ht.info.reserved_b24_b29",
+ FT_UINT16, BASE_HEX, NULL, 0x003f, NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_downlink_speed,
- {"Downlink Speed", "wlan.hs20.anqp.wan_metrics.downlink_speed",
- FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_dual_beacon,
+ {"Dual beacon", "wlan.ht.info.dualbeacon",
+ FT_BOOLEAN, 16, TFS(&ht_info_dual_beacon_flag), 0x0040,
+ NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_uplink_speed,
- {"Uplink Speed", "wlan.hs20.anqp.wan_metrics.uplink_speed",
- FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_dual_cts_protection,
+ {"Dual Clear To Send (CTS) protection", "wlan.ht.info.dualcts",
+ FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0080,
+ NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_downlink_load,
- {"Downlink Load", "wlan.hs20.anqp.wan_metrics.downlink_load",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_secondary_beacon,
+ {"Beacon ID", "wlan.ht.info.secondarybeacon",
+ FT_BOOLEAN, 16, TFS(&ht_info_secondary_beacon_flag), 0x0100,
+ NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_uplink_load,
- {"Uplink Load", "wlan.hs20.anqp.wan_metrics.uplink_load",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_ht_info_lsig_txop_protection_full_support,
+ {"L-SIG TXOP Protection Full Support", "wlan.ht.info.lsigprotsupport",
+ FT_BOOLEAN, 16, TFS(&ht_info_lsig_txop_protection_full_support_flag), 0x0200,
+ NULL, HFILL }},
- {&hf_hs20_anqp_wan_metrics_lmd,
- {"LMD", "wlan.hs20.anqp.wan_metrics.lmd",
- FT_UINT16, BASE_DEC, NULL, 0, "Load Measurement Duration", HFILL }},
+ {&hf_ieee80211_ht_info_pco_active,
+ {"Phased Coexistence Operation (PCO)", "wlan.ht.info.pco.active",
+ FT_BOOLEAN, 16, TFS(&tfs_active_inactive), 0x0400,
+ NULL, HFILL }},
- {&hf_hs20_anqp_cc_proto_ip_proto,
- {"IP Protocol", "wlan.hs20.anqp.cc.ip_proto",
- FT_UINT8, BASE_DEC, NULL, 0,
- "ProtoPort Tuple - IP Protocol", HFILL }},
+ {&hf_ieee80211_ht_info_pco_phase,
+ {"Phased Coexistence Operation (PCO) Phase", "wlan.ht.info.pco.phase",
+ FT_BOOLEAN, 16, TFS(&ht_info_pco_phase_flag), 0x0800,
+ NULL, HFILL }},
- {&hf_hs20_anqp_cc_proto_port_num,
- {"Port Number", "wlan.hs20.anqp.cc.port_num",
- FT_UINT16, BASE_DEC, NULL, 0,
- "ProtoPort Tuple - Port Number", HFILL }},
+ {&hf_ieee80211_ht_info_reserved_b36_b39,
+ {"Reserved", "wlan.ht.info.reserved_b36_b39",
+ FT_UINT16, BASE_HEX, NULL, 0xf000,
+ NULL, HFILL }},
- {&hf_hs20_anqp_cc_proto_status,
- {"Status", "wlan.hs20.anqp.cc.status",
- FT_UINT8, BASE_DEC, VALS(hs20_cc_status_vals), 0,
- "ProtoPort Tuple - Status", HFILL }},
+ {&hf_ieee80211_tag_ap_channel_report_operating_class,
+ {"Operating Class", "wlan.ap_channel_report.operating_class",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_nai_hrq_count,
- {"NAI Home Realm Count", "wlan.hs20.anqp.nai_hrq.count",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_tag_ap_channel_report_channel_list,
+ {"Channel List", "wlan.ap_channel_report.channel_list",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_nai_hrq_encoding_type,
- {"NAI Home Realm Encoding Type",
- "wlan.hs20.anqp.nai_hrq.encoding_type",
- FT_UINT8, BASE_DEC, VALS(nai_realm_encoding_vals),
- 0x01, NULL, HFILL }},
+ {&hf_ieee80211_tag_secondary_channel_offset,
+ {"Secondary Channel Offset", "wlan.secchanoffset",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_tag_secondary_channel_offset_flags), 0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_nai_hrq_length,
- {"NAI Home Realm Name Length", "wlan.hs20.anqp.nai_hrq.length",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_ap_avg_access_delay,
+ {"AP Average Access Delay", "wlan.bss_ap_avg_access_delay",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_nai_hrq_realm_name,
- {"NAI Home Realm Name", "wlan.hs20.anqp.nai_hrq.name",
- FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_tag_antenna_id,
+ {"Antenna ID", "wlan.antenna.id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_hs20_anqp_oper_class_indic,
- {"Operating Class", "wlan.hs20.anqp.oper_class_indic.oper_class",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_tag_rsni,
+ {"RSNI", "wlan.rsni",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(rsni_base_custom), 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag,
- {"Tag", "wlan.tag",
- FT_NONE, BASE_NONE, 0x0, 0,
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask,
+ {"Available Admission Capacity Bitmask", "wlan.bss_avb_adm_cap.bitmask",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0,
+ {"UP0 (bit0)", "wlan.bss_avb_adm_cap.bitmask.up0",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1,
+ {"UP1 (bit1)", "wlan.bss_avb_adm_cap.bitmask.up1",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP1,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2,
+ {"UP2 (bit2)", "wlan.bss_avb_adm_cap.bitmask.up2",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP2,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3,
+ {"UP3 (bit3)", "wlan.bss_avb_adm_cap.bitmask.up3",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP3,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4,
+ {"UP4 (bit4)", "wlan.bss_avb_adm_cap.bitmask.up4",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP4,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5,
+ {"UP5 (bit5)", "wlan.bss_avb_adm_cap.bitmask.up5",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP5,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6,
+ {"UP0 (bit6)", "wlan.bss_avb_adm_cap.bitmask.up6",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP6,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7,
+ {"UP7 (bit7)", "wlan.bss_avb_adm_cap.bitmask.up7",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP7,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0,
+ {"AC0 (bit8)", "wlan.bss_avb_adm_cap.bitmask.ac0",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1,
+ {"AC1 (bit9)", "wlan.bss_avb_adm_cap.bitmask.AC1",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC1,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2,
+ {"AC2 (bit10)", "wlan.bss_avb_adm_cap.bitmask.ac2",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC2,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3,
+ {"AC3 (bit11)", "wlan.bss_avb_adm_cap.bitmask.ac3",
+ FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC3,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv,
+ {"Reserved", "wlan.bss_avb_adm_cap.bitmask.rsv",
+ FT_UINT16, BASE_HEX, NULL, BSS_BITMASK_RSV,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up0,
+ {"UP0", "wlan.bss_avb_adm_cap.up0",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up1,
+ {"UP1", "wlan.bss_avb_adm_cap.up1",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up2,
+ {"UP2", "wlan.bss_avb_adm_cap.up2",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up3,
+ {"UP3", "wlan.bss_avb_adm_cap.up3",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up4,
+ {"UP4", "wlan.bss_avb_adm_cap.up4",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up5,
+ {"UP5", "wlan.bss_avb_adm_cap.up5",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up6,
+ {"UP6", "wlan.bss_avb_adm_cap.up6",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_up7,
+ {"UP7", "wlan.bss_avb_adm_cap.up7",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_number,
- {"Tag Number", "wlan.tag.number",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
- "Element ID", HFILL }},
-
- {&hf_ieee80211_tag_length,
- {"Tag length", "wlan.tag.length",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Length of tag", HFILL }},
-
- {&hf_ieee80211_tag_interpretation,
- {"Tag interpretation", "wlan.tag.interpretation",
- FT_STRING, BASE_NONE, NULL, 0,
- "Interpretation of tag", HFILL }},
-
- {&hf_ieee80211_tag_data,
- {"Tag Data", "wlan.tag.data",
- FT_BYTES, BASE_NONE, NULL, 0,
- "Data Interpretation of tag", HFILL }},
-
- {&hf_ieee80211_tag_oui,
- {"OUI", "wlan.tag.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
- "OUI of vendor specific IE", HFILL }},
-
- {&hf_ieee80211_tag_oui_wfa_subtype,
- {"WFA Subtype", "wlan.tag.oui.wfa_subtype",
- FT_UINT8, BASE_DEC, VALS(wfa_subtype_vals), 0,
+ {&hf_ieee80211_tag_bss_avb_adm_cap_ac0,
+ {"AC0", "wlan.bss_avb_adm_cap.ac0",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_ds_param_channel,
- {"Current Channel", "wlan.ds.current_channel",
- FT_UINT8, BASE_DEC, NULL, 0,
- "DS Parameter Set - Current Channel", HFILL }},
-
- {&hf_ieee80211_tag_cfp_count,
- {"CFP Count", "wlan.cfp.count",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Indicates how many delivery traffic indication messages (DTIMs)", HFILL }},
-
- {&hf_ieee80211_tag_cfp_period,
- {"CFP Period", "wlan.cfp.period",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Indicates the number of DTIM intervals between the start of CFPs", HFILL }},
-
- {&hf_ieee80211_tag_cfp_max_duration,
- {"CFP Max Duration", "wlan.cfp.max_duration",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the maximum duration (in TU) of the CFP that may be generated by this PCF", HFILL }},
-
- {&hf_ieee80211_tag_cfp_dur_remaining,
- {"CFP Dur Remaining", "wlan.cfp.dur_remaining",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the maximum time (in TU) remaining in the present CFP", HFILL }},
-
- {&hf_ieee80211_tag_vendor_oui_type,
- {"Vendor Specific OUI Type", "wlan.tag.vendor.oui.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_bss_avb_adm_cap_ac1,
+ {"AC1", "wlan.bss_avb_adm_cap.ac1",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_ac2,
+ {"AC2", "wlan.bss_avb_adm_cap.ac2",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avb_adm_cap_ac3,
+ {"AC3", "wlan.bss_avb_adm_cap.ac3",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_tag_vendor_data,
- {"Vendor Specific Data", "wlan.tag.vendor.data",
- FT_BYTES, BASE_NONE, NULL, 0,
- "Unknown/undecoded Vendor Specific Data", HFILL }},
-
- {&hf_ieee80211_tim_dtim_count,
- {"DTIM count", "wlan.tim.dtim_count",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Indicates how many Beacon frames (including the current frame) appear before the next DTIM", HFILL }},
+ {&hf_ieee80211_tag_bss_avg_ac_access_delay_be,
+ {"AC Average Access Delay for Best Effort", "wlan.bss_avg_ac_access_delay.be",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avg_ac_access_delay_bk,
+ {"AC Average Access Delay for Best Background", "wlan.bss_avg_ac_access_delay.bk",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avg_ac_access_delay_vi,
+ {"AC Average Access Delay for Video", "wlan.bss_avg_ac_access_delay_vi",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_bss_avg_ac_access_delay_vo,
+ {"AC Average Access Delay for Voice", "wlan.bss_avg_ac_access_delay_vo",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
- {&hf_ieee80211_tim_dtim_period,
- {"DTIM period", "wlan.tim.dtim_period",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Indicates the number of beacon intervals between successive DTIMs", HFILL }},
- {&hf_ieee80211_tim_bmapctl,
- {"Bitmap control", "wlan.tim.bmapctl",
+ /* 802.11-2012 Table 8-119-RM Enabled Capabilities definition */
+ {&hf_ieee80211_tag_rm_enabled_capabilities,
+ {"RM Capabilities", "wlan.rmcap",
FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
-
- {&hf_ieee80211_tim_bmapctl_mcast,
- {"Multicast", "wlan.tim.bmapctl.multicast",
- FT_BOOLEAN, 8, NULL, 0x1,
- "Contains the Traffic Indicator bit associated with Association ID 0", HFILL }},
+ "Signals support for radio measurements in a device", HFILL }},
- {&hf_ieee80211_tim_bmapctl_offset,
- {"Bitmap Offset", "wlan.tim.bmapctl.offset",
- FT_UINT8, BASE_HEX, NULL, 0xFE,
+ /* RM Enabled Capability octet 1 */
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b0,
+ {"Link Measurement", "wlan.rmcap.b0",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
NULL, HFILL }},
-
- {&hf_ieee80211_tim_partial_virtual_bitmap,
- {"Partial Virtual Bitmap", "wlan.tim.partial_virtual_bitmap",
- FT_BYTES, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b1,
+ {"Neighbor Report", "wlan.rmcap.b1",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
NULL, HFILL }},
-
- {&hf_ieee80211_tim_aid,
- {"Association ID", "wlan.tim.aid",
- FT_UINT8, BASE_HEX, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b2,
+ {"Parallel Measurements", "wlan.rmcap.b2",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_ibss_atim_window,
- {"Atim Windows", "wlan.ibss.atim_windows",
- FT_UINT16, BASE_HEX, NULL, 0x0,
- "Contains the ATIM Window length in TU", HFILL }},
-
- {&hf_ieee80211_tag_country_info_code,
- {"Code", "wlan.country_info.code",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b3,
+ {"Repeated Measurements", "wlan.rmcap.b3",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_country_info_env,
- {"Environment", "wlan.country_info.environment",
- FT_UINT8, BASE_HEX, VALS(environment_vals), 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b4,
+ {"Beacon Passive Measurement", "wlan.rmcap.b4",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_country_info_pad,
- {"Padding", "wlan.country_info.padding",
- FT_BYTES, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b5,
+ {"Beacon Active Measurement", "wlan.rmcap.b5",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_country_info_fnm,
- {"Country Info", "wlan.country_info.fnm",
- FT_NONE, BASE_NONE, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b6,
+ {"Beacon Table Measurement", "wlan.rmcap.b6",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_country_info_fnm_fcn,
- {"First Channel Number", "wlan.country_info.fnm.fcn",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b7,
+ {"Beacon Measurement Reporting Conditions", "wlan.rmcap.b7",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_tag_country_info_fnm_nc,
- {"Number of Channels", "wlan.country_info.fnm.nc",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ /* RM Enabled Capability octet 2 */
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b8,
+ {"Frame Measurement", "wlan.rmcap.b8",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b9,
+ {"Channel Load Measurement", "wlan.rmcap.b9",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b10,
+ {"Noise Histogram Measurement", "wlan.rmcap.b10",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b11,
+ {"Statistics Measurement", "wlan.rmcap.b11",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b12,
+ {"LCI Measurement", "wlan.rmcap.b12",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b13,
+ {"LCI Azimuth capability", "wlan.rmcap.b13",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b14,
+ {"Transmit Stream/Category Measurement", "wlan.rmcap.b14",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b15,
+ {"Triggered Transmit Stream/Category Measurement", "wlan.rmcap.b15",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_tag_country_info_fnm_mtpl,
- {"Maximum Transmit Power Level (in dBm)", "wlan.country_info.fnm.mtpl",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ /* RM Enabled Capability octet 3 */
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b16,
+ {"AP Channel Report capability", "wlan.rmcap.b16",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b17,
+ {"RM MIB capability", "wlan.rmcap.b17",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b18to20,
+ {"Operating Channel Max Measurement Duration", "wlan.rmcap.b18to20",
+ FT_UINT8, BASE_DEC, NULL, 0x1C,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b21to23,
+ {"Nonoperating Channel Max Measurement Duration", "wlan.rmcap.b21to23",
+ FT_UINT8, BASE_DEC, NULL, 0xE0,
NULL, HFILL }},
- {&hf_ieee80211_tag_country_info_rrc,
- {"Country Info", "wlan.country_info.rrc",
- FT_NONE, BASE_NONE, NULL, 0x0,
+ /* RM Enabled Capability octet 4 */
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b24to26,
+ {"Measurement Pilotcapability", "wlan.rmcap.b24to26",
+ FT_UINT8, BASE_DEC, NULL, 0x07,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b27,
+ {"Measurement Pilot Transmission Information", "wlan.rmcap.b27",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b28,
+ {"Neighbor Report TSF Offset", "wlan.rmcap.b28",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b29,
+ {"RCPI Measurement capability", "wlan.rmcap.b29",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b30,
+ {"RSNI Measurement capability", "wlan.rmcap.b30",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b31,
+ {"BSS Average Access Delay capability", "wlan.rmcap.b31",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_tag_country_info_rrc_oei,
- {"Operating Extension Identifier", "wlan.country_info.rrc.oei",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ /* RM Enabled Capability octet 5 */
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b32,
+ {"BSS Available Admission Capacity capability", "wlan.rmcap.b32",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_country_info_rrc_oc,
- {"Operating Class", "wlan.country_info.rrc.oc",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_tag_rm_enabled_capabilities_b33,
+ {"Antenna capability", "wlan.rmcap.b33",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
NULL, HFILL }},
+ {&hf_ieee80211_tag_rm_enabled_capabilities_o5,
+ {"Reserved", "wlan.rmcap.o5",
+ FT_UINT8, BASE_HEX, NULL, 0xFC,
+ "Must be zero", HFILL }},
- {&hf_ieee80211_tag_country_info_rrc_cc,
- {"Coverage Class", "wlan.country_info.rrc.cc",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ /* 20/40 BSS Coexistence */
+ {&hf_ieee80211_tag_20_40_bc,
+ {"20/40 BSS Coexistence Flags", "wlan.20_40_bc",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_fh_hopping_parameter_prime_radix,
- {"Prime Radix", "wlan.fh_hopping.parameter.prime_radix",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_tag_20_40_bc_information_request,
+ {"Information Request", "wlan.20_40_bc.information_request",
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_fh_hopping_parameter_nb_channels,
- {"Number of Channels", "wlan.fh_hopping.parameter.nb_channels",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant,
+ {"Forty MHz Intolerant", "wlan.20_40_bc.forty_mhz_intolerant",
+ FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }},
+ {&hf_ieee80211_tag_20_40_bc_20_mhz_bss_witdh_request,
+ {"20 MHz BSS Witdh Request", "wlan.20_40_bc.20_mhz_bss_witdh_request",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request,
+ {"OBSS Scanning Exemption Request", "wlan.20_40_bc.obss_scanning_exemption_request",
+ FT_BOOLEAN, 8, NULL, 0x08,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant,
+ {"OBSS Scanning Exemption Grant", "wlan.20_40_bc.obss_scanning_exemption_grant",
+ FT_BOOLEAN, 8, NULL, 0x10,
+ NULL, HFILL }},
+ {&hf_ieee80211_tag_20_40_bc_reserved,
+ {"Reserved", "wlan.20_40_bc.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xE0,
+ "Must be zero", HFILL }},
- {&hf_ieee80211_tag_fh_hopping_table_flag,
- {"Flag", "wlan.fh_hopping.table.flag",
- FT_UINT8, BASE_HEX, NULL, 0x0,
- "Indicates that a Random Table is present when the value is 1", HFILL }},
-
- {&hf_ieee80211_tag_fh_hopping_table_number_of_sets,
- {"Number of Sets", "wlan.fh_hopping.table.number_of_sets",
- FT_UINT8, BASE_DEC, NULL, 0x0,
- "Indicates the total number of sets within the hopping patterns", HFILL }},
-
- {&hf_ieee80211_tag_fh_hopping_table_modulus,
- {"Modulus", "wlan.fh_hopping.table.modulus",
- FT_UINT8, BASE_HEX, NULL, 0x0,
- "Indicate the values to be used in the equations to create a hopping sequence from the Random Table information", HFILL }},
-
- {&hf_ieee80211_tag_fh_hopping_table_offset,
- {"Offset", "wlan.fh_hopping.table.offset",
- FT_UINT8, BASE_HEX, NULL, 0x0,
- "Indicate the values to be used in the equations to create a hopping sequence from the Random Table information", HFILL }},
-
- {&hf_ieee80211_tag_fh_hopping_random_table,
- {"Random Table", "wlan.fh_hopping.table.random_table",
- FT_UINT16, BASE_HEX, NULL, 0x0,
- "It is a vector of single octet values that indicate the random sequence to be followed during a hopping sequence", HFILL }},
-
- {&hf_ieee80211_tag_request,
- {"Requested Element ID", "wlan.tag.request",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_ext, 0,
- "The list of elements that are to be included in the responding STA Probe Response frame", HFILL }},
- {&hf_ieee80211_tclas_up,
- {"User Priority", "wlan.tclas.user_priority",
+ {&hf_ieee80211_tag_power_constraint_local,
+ {"Local Power Constraint", "wlan.powercon.local",
FT_UINT8, BASE_DEC, NULL, 0,
- "Contains the value of the UP of the associated MSDUs", HFILL }},
-
- {&hf_ieee80211_tclas_class_type,
- {"Classifier Type", "wlan.tclas.class_type",
- FT_UINT8, BASE_DEC, VALS(classifier_type), 0,
- "Specifies the type of classifier parameters", HFILL }},
-
- {&hf_ieee80211_tclas_class_mask,
- {"Classifier Mask", "wlan.tclas.class_mask",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Specifies a bitmap where bits that are set to 1 identify a subset of the classifier parameters", HFILL }},
-
- {&hf_ieee80211_tclas_class_mask0_src_addr,
- {"Source Address", "wlan.tclas.class_mask.src_addr",
- FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask0_dst_addr,
- {"Destination Address", "wlan.tclas.class_mask.dst_addr",
- FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask0_type,
- {"Type", "wlan.tclas.class_mask.type",
- FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask1_ver,
- {"Version", "wlan.tclas.class_mask.version",
- FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask1_src_ip,
- {"Source IP Address", "wlan.tclas.class_mask.src_ip",
- FT_UINT8, BASE_HEX, NULL, 0x02, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask1_dst_ip,
- {"Destination IP Address", "wlan.tclas.class_mask.dst_ip",
- FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask1_src_port,
- {"Source Port", "wlan.tclas.class_mask.src_port",
- FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask1_dst_port,
- {"Destination Port", "wlan.tclas.class_mask.dst_port",
- FT_UINT8, BASE_HEX, NULL, 0x10, NULL, HFILL }},
-
- {&hf_ieee80211_tclas_class_mask1_ipv4_dscp,
- {"DSCP", "wlan.tclas.class_mask.dscp",
- FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
+ "Value that allows the mitigation requirements to be satisfied in the current channel", HFILL }},
- {&hf_ieee80211_tclas_class_mask1_ipv4_proto,
- {"Protocol", "wlan.tclas.class_mask.proto",
- FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL }},
+ {&hf_ieee80211_tag_power_capability_min,
+ {"Minimum Transmit Power", "wlan.powercap.min",
+ FT_INT8, BASE_DEC, NULL, 0,
+ "The nominal minimum transmit power with which the STA is capable of transmitting in the current channel", HFILL }},
- {&hf_ieee80211_tclas_class_mask1_ipv6_flow,
- {"Flow Label", "wlan.tclas.class_mask.flow_label",
- FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
+ {&hf_ieee80211_tag_power_capability_max,
+ {"Maximum Transmit Power", "wlan.powercap.max",
+ FT_INT8, BASE_DEC, NULL, 0,
+ "The nominal maximum transmit power with which the STA is capable of transmitting in the current channel", HFILL }},
- {&hf_ieee80211_tclas_class_mask2_tci,
- {"802.1Q CLAN TCI", "wlan.tclas.class_mask.tci",
- FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL }},
+ {&hf_ieee80211_tag_tpc_report_trsmt_pow,
+ {"Transmit Power", "wlan.tcprep.trsmt_pow",
+ FT_INT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tclas_src_mac_addr,
- {"Source address", "wlan.tclas.src_mac_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Classifier Parameters Ethernet Type", HFILL }},
+ {&hf_ieee80211_tag_tpc_report_link_mrg,
+ {"Link Margin", "wlan.tcprep.link_mrg",
+ FT_INT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tclas_dst_mac_addr,
- {"Destination address", "wlan.tclas.dat_mac_addr",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_supported_channels,
+ {"Supported Channels Set", "wlan.supchan",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tclas_ether_type,
- {"Ethernet Type", "wlan.tclas.ether_type",
+ {&hf_ieee80211_tag_supported_channels_first,
+ {"First Supported Channel", "wlan.supchan.first",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tclas_version,
- {"IP Version", "wlan.tclas.version",
+ {&hf_ieee80211_tag_supported_channels_range,
+ {"Supported Channel Range", "wlan.supchan.range",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tclas_ipv4_src,
- {"IPv4 Src Addr", "wlan.tclas.ipv4_src",
- FT_IPv4, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_csa_channel_switch_mode,
+ {"Channel Switch Mode", "wlan.csa.channel_switch_mode",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Indicates any restrictions on transmission until a channel switch", HFILL }},
- {&hf_ieee80211_tclas_ipv4_dst,
- {"IPv4 Dst Addr", "wlan.tclas.ipv4_dst",
- FT_IPv4, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_csa_new_channel_number,
+ {"New Channel Number", "wlan.csa.new_channel_number",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Set to the number of the channel to which the STA is moving", HFILL }},
- {&hf_ieee80211_tclas_src_port,
- {"Source Port", "wlan.tclas.src_port",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_csa_channel_switch_count,
+ {"Channel Switch Count", "wlan.csa.channel_switch.count",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Set to the number of TBTTs until the STA sending the Channel Switch Announcement element switches to the new channel or shall be set to 0", HFILL }},
- {&hf_ieee80211_tclas_dst_port,
- {"Destination Port", "wlan.tclas.dst_port",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_mesh_channel_switch_ttl,
+ {"Mesh Channel Switch TTL", "wlan.csa.mesh_channel_switch.ttl",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tclas_dscp,
- {"IPv4 DSCP", "wlan.tclas.dscp",
- FT_UINT8, BASE_HEX, NULL, 0,
- "IPv4 Differentiated Services Code Point (DSCP) Field", HFILL }},
-
- {&hf_ieee80211_tclas_protocol,
- {"Protocol", "wlan.tclas.protocol",
+ {&hf_ieee80211_mesh_channel_switch_flag,
+ {"Mesh Channel Switch Flag", "wlan.csa.mesh_channel_switch.flag",
FT_UINT8, BASE_HEX, NULL, 0,
- "IPv4 Protocol", HFILL }},
+ NULL, HFILL }},
- {&hf_ieee80211_tclas_ipv6_src,
- {"IPv6 Src Addr", "wlan.tclas.ipv6_src",
- FT_IPv6, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_mesh_chswitch_flag_txrestrict,
+ {"CSA Tx Restrict", "wlan.csa.mesh_channel_switch.flag.txrestrict",
+ FT_BOOLEAN, 16, TFS(&csa_txrestrict_flags), 0x0001,
NULL, HFILL }},
- {&hf_ieee80211_tclas_ipv6_dst,
- {"IPv6 Dst Addr", "wlan.tclas.ipv6_dst",
- FT_IPv6, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_mesh_chswitch_flag_initiator,
+ {"CSA Initiator", "wlan.csa.mesh_channel_switch.flag.initiator",
+ FT_BOOLEAN, 16, TFS(&csa_initiator_flags), 0x0002,
NULL, HFILL }},
- {&hf_ieee80211_tclas_flow,
- {"Flow Label", "wlan.tclas.flow",
- FT_UINT24, BASE_HEX, NULL, 0,
- "IPv6 Flow Label", HFILL }},
+ {&hf_ieee80211_mesh_channel_switch_reason_code,
+ {"Mesh Channel Switch Reason Code", "wlan.csa.mesh_channel_switch.reason_code",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_reason_code_ext, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tclas_tag_type,
- {"802.1Q Tag Type", "wlan.tclas.tag_type",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_mesh_channel_switch_precedence_value,
+ {"Mesh Channel Switch Precedence Value", "wlan.csa.mesh_channel_switch.pre_value",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_challenge_text,
- {"Challenge Text", "wlan.tag.challenge_text",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_mesh_awake_window,
+ {"Mesh Awake Window", "wlan.mesh.mesh_awake_window",
+ FT_UINT16, BASE_CUSTOM, CF_FUNC(mesh_active_window_base_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_version,
- {"RSN Version", "wlan.rsn.version",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the version number of the RSNA protocol", HFILL }},
+ {&hf_ieee80211_tag_measure_request_token,
+ {"Measurement Token", "wlan.measure.req.token",
+ FT_UINT8, BASE_HEX, NULL, 0xff,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_gcs,
- {"Group Cipher Suite", "wlan.rsn.gcs",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_gcs_base_custom), 0,
- "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }},
+ {&hf_ieee80211_tag_measure_request_mode,
+ {"Measurement Request Mode", "wlan.measure.req.mode",
+ FT_UINT8, BASE_HEX, NULL, 0xff,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_gcs_oui,
- {"Group Cipher Suite OUI", "wlan.rsn.gcs.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_mode_parallel,
+ {"Parallel", "wlan.measure.req.reqmode.parallel",
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_rsn_gcs_type,
- {"Group Cipher Suite type", "wlan.rsn.gcs.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_mode_enable,
+ {"Measurement Request Mode Field", "wlan.measure.req.reqmode.enable",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_rsn_gcs_80211_type,
- {"Group Cipher Suite type", "wlan.rsn.gcs.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
+ {&hf_ieee80211_tag_measure_request_mode_request,
+ {"Measurement Reports", "wlan.measure.req.reqmode.request",
+ FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_rsn_pcs_count,
- {"Pairwise Cipher Suite Count", "wlan.rsn.pcs.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the number of pairwise cipher suite selectors that are contained in the Pairwise Cipher Suite List", HFILL }},
+ {&hf_ieee80211_tag_measure_request_mode_report,
+ {"Autonomous Measurement Reports", "wlan.measure.req.reqmode.report",
+ FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x08,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_pcs_list,
- {"Pairwise Cipher Suite List", "wlan.rsn.pcs.list",
- FT_NONE, BASE_NONE, NULL, 0,
- "Contains a series of cipher suite selectors that indicate the pairwisecipher suites", HFILL }},
+ {&hf_ieee80211_tag_measure_request_mode_duration_mandatory,
+ {"Duration Mandatory", "wlan.measure.req.reqmode.duration_mandatory",
+ FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x10,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_pcs,
- {"Pairwise Cipher Suite", "wlan.rsn.pcs",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_pcs_base_custom), 0,
+ {&hf_ieee80211_tag_measure_request_mode_reserved,
+ {"Reserved", "wlan.measure.req.reqmode.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xE0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_pcs_oui,
- {"Pairwise Cipher Suite OUI", "wlan.rsn.pcs.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_type,
+ {"Measurement Request Type", "wlan.measure.req.reqtype",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_request_type_flags_ext, 0x00,
NULL, HFILL }},
- {&hf_ieee80211_rsn_pcs_type,
- {"Pairwise Cipher Suite type", "wlan.rsn.pcs.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_channel_number,
+ {"Measurement Channel Number", "wlan.measure.req.channelnumber",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_pcs_80211_type,
- {"Pairwise Cipher Suite type", "wlan.rsn.pcs.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
+ {&hf_ieee80211_tag_measure_request_start_time,
+ {"Measurement Start Time", "wlan.measure.req.starttime",
+ FT_UINT64, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_akms_count,
- {"Auth Key Management (AKM) Suite Count", "wlan.rsn.akms.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the number of Auth Key Management suite selectors that are contained in the Auth Key Management Suite List", HFILL }},
+ {&hf_ieee80211_tag_measure_request_duration,
+ {"Measurement Duration", "wlan.measure.req.channelnumber",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "in TU (1 TU = 1024 us)", HFILL }},
- {&hf_ieee80211_rsn_akms_list,
- {"Auth Key Management (AKM) List", "wlan.rsn.akms.list",
- FT_NONE, BASE_NONE, NULL, 0,
- "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
+ {&hf_ieee80211_tag_measure_request_operating_class,
+ {"Operating Class", "wlan.measure.req.operatingclass",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_akms,
- {"Auth Key Management (AKM) Suite", "wlan.rsn.akms",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_akms_base_custom), 0,
+ {&hf_ieee80211_tag_measure_request_randomization_interval,
+ {"Randomization Interval", "wlan.measure.req.randint",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "in TU (1 TU = 1024 us)", HFILL }},
+
+ {&hf_ieee80211_tag_measure_request_measurement_mode,
+ {"Measurement Mode", "wlan.measure.req.measurementmode",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_measurement_mode_flags), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_akms_oui,
- {"Auth Key Management (AKM) OUI", "wlan.rsn.akms.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_bssid,
+ {"BSSID", "wlan.measure.req.bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_akms_type,
- {"Auth Key Management (AKM) type", "wlan.rsn.akms.type",
+ {&hf_ieee80211_tag_measure_request_subelement_length,
+ {"Length", "wlan.measure.req.sub.length",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_akms_80211_type,
- {"Auth Key Management (AKM) type", "wlan.rsn.akms.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_keymgmt_vals), 0,
+ {&hf_ieee80211_tag_measure_request_beacon_sub_id,
+ {"SubElement ID", "wlan.measure.req.beacon.sub.id",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_beacon_sub_id_flags), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap,
- {"RSN Capabilities", "wlan.rsn.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "RSN Capability information", HFILL }},
-
- {&hf_ieee80211_rsn_cap_preauth,
- {"RSN Pre-Auth capabilities", "wlan.rsn.capabilities.preauth",
- FT_BOOLEAN, 16, TFS(&rsn_preauth_flags), 0x0001,
+ {&hf_ieee80211_tag_measure_request_beacon_sub_ssid,
+ {"SSID", "wlan.measure.req.beacon.sub.ssid",
+ FT_STRING, BASE_NONE, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_no_pairwise,
- {"RSN No Pairwise capabilities", "wlan.rsn.capabilities.no_pairwise",
- FT_BOOLEAN, 16, TFS(&rsn_no_pairwise_flags), 0x0002,
+ {&hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition,
+ {"Reporting Condition", "wlan.measure.req.beacon.sub.bri.repcond",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition_flags), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_ptksa_replay_counter,
- {"RSN PTKSA Replay Counter capabilities", "wlan.rsn.capabilities.ptksa_replay_counter",
- FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x000C,
+ {&hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset,
+ {"Threshold/Offset", "wlan.measure.req.beacon.sub.bri.threshold_offset",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_gtksa_replay_counter,
- {"RSN GTKSA Replay Counter capabilities", "wlan.rsn.capabilities.gtksa_replay_counter",
- FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x0030,
+ {&hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail,
+ {"Reporting Detail", "wlan.measure.req.beacon.sub.bri.reporting_detail",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_beacon_sub_reporting_detail_flags), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_mfpr,
- {"Management Frame Protection Required", "wlan.rsn.capabilities.mfpr",
- FT_BOOLEAN, 16, NULL, 0x0040,
+ {&hf_ieee80211_tag_measure_request_beacon_sub_request,
+ {"Request", "wlan.measure.req.beacon.sub.request",
+ FT_UINT8, BASE_DEC, 0, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_mfpc,
- {"Management Frame Protection Capable", "wlan.rsn.capabilities.mfpc",
- FT_BOOLEAN, 16, NULL, 0x0080,
+ {&hf_ieee80211_tag_measure_request_beacon_unknown,
+ {"Unknown Data", "wlan.measure.req.beacon.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "(not interpreted)", HFILL }},
+
+ {&hf_ieee80211_tag_measure_request_channel_load_sub_id,
+ {"SubElement ID", "wlan.measure.req.channel_load.sub.id",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_channel_load_sub_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_jmr,
- {"Joint Multi-band RSNA", "wlan.rsn.capabilities.jmr",
- FT_BOOLEAN, 16, NULL, 0x0100,
+ {&hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition,
+ {"Reporting Condition", "wlan.measure.req.channel_load.sub.repcond",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_channel_load_sub_reporting_condition_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_cap_peerkey,
- {"PeerKey Enabled", "wlan.rsn.capabilities.peerkey",
- FT_BOOLEAN, 16, NULL, 0x0200,
+ {&hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref,
+ {"Reference Value", "wlan.measure.req.channel_load.sub.ref",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_pmkid_count,
- {"PMKID Count", "wlan.rsn.pmkid.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the number of PMKID selectors that are contained in the PMKID Suite List", HFILL }},
- {&hf_ieee80211_rsn_pmkid_list,
- {"PMKID List", "wlan.rsn.pmkid.list",
- FT_NONE, BASE_NONE, NULL, 0,
- "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
+ {&hf_ieee80211_tag_measure_request_noise_histogram_sub_id,
+ {"SubElement ID", "wlan.measure.req.noise_histogram.sub.id",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_noise_histogram_sub_id_vals), 0,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_pmkid,
- {"PMKID", "wlan.pmkid.akms",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition,
+ {"Reporting Condition", "wlan.measure.reqnoise_histogram.sub.repcond",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_gmcs,
- {"Group Management Cipher Suite", "wlan.rsn.gmcs",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(rsn_gmcs_base_custom), 0,
- "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }},
+ {&hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref,
+ {"ANPI Reference Value", "wlan.measure.req.noise_histogram.sub.anpiref",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_rsn_gmcs_oui,
- {"Group Management Cipher Suite OUI", "wlan.rsn.gmcs.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
+
+ {&hf_ieee80211_tag_measure_request_frame_request_type,
+ {"Frame Request Type", "wlan.measure.req.frame_request_type",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_gmcs_type,
- {"Group Management Cipher Suite type", "wlan.rsn.gmcs.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_measure_request_mac_address,
+ {"MAC Address", "wlan.measure.req.mac_address",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_gmcs_80211_type,
- {"Group Management Cipher Suite type", "wlan.rsn.gmcs.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_rsn_cipher_vals), 0,
+ {&hf_ieee80211_tag_measure_request_peer_mac_address,
+ {"Peer MAC Address", "wlan.measure.req.peer_mac_address",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_pren_type,
- {"802.11n (Pre) Type", "wlan.vs.pren.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_ht_pren_type_vals), 0,
- "Vendor Specific HT Type", HFILL }},
- {&hf_ieee80211_ht_pren_unknown,
- {"802.11n (Pre) Unknown Data", "wlan.vs.pren.unknown_data",
+ {&hf_ieee80211_tag_measure_request_group_id,
+ {"Group ID", "wlan.measure.req.groupid",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_request_group_id_flags_ext, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_measure_request_unknown,
+ {"Unknown Data", "wlan.measure.req.unknown",
FT_BYTES, BASE_NONE, NULL, 0,
+ "(not interpreted)", HFILL }},
+
+ {&hf_ieee80211_tag_measure_report_measurement_token,
+ {"Measurement Token", "wlan.measure.req.token",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_cap,
- {"HT Capabilities Info", "wlan.ht.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "HT Capabilities information", HFILL }},
+ {&hf_ieee80211_tag_measure_report_mode,
+ {"Measurement Report Mode", "wlan.measure.req.mode",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ht_vs_cap,
- {"HT Capabilities Info (VS)", "wlan.vs.ht.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Vendor Specific HT Capabilities information", HFILL }},
+ {&hf_ieee80211_tag_measure_report_mode_late,
+ {"Measurement Report Mode Field", "wlan.measure.rep.repmode.late",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ NULL, HFILL }},
- {&hf_ieee80211_ht_ldpc_coding,
- {"HT LDPC coding capability", "wlan.ht.capabilities.ldpccoding",
- FT_BOOLEAN, 16, TFS(&ht_ldpc_coding_flag), 0x0001,
+ {&hf_ieee80211_tag_measure_report_mode_incapable,
+ {"Measurement Reports", "wlan.measure.rep.repmode.incapable",
+ FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_ht_chan_width,
- {"HT Support channel width", "wlan.ht.capabilities.width",
- FT_BOOLEAN, 16, TFS(&ht_chan_width_flag), 0x0002,
+ {&hf_ieee80211_tag_measure_report_mode_refused,
+ {"Autonomous Measurement Reports", "wlan.measure.rep.repmode.refused",
+ FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_ht_sm_pwsave,
- {"HT SM Power Save", "wlan.ht.capabilities.sm",
- FT_UINT16, BASE_HEX, VALS(ht_sm_pwsave_flag), 0x000c,
+ {&hf_ieee80211_tag_measure_report_mode_reserved,
+ {"Reserved", "wlan.measure.rep.repmode.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xf8,
NULL, HFILL }},
- {&hf_ieee80211_ht_green,
- {"HT Green Field", "wlan.ht.capabilities.green",
- FT_BOOLEAN, 16, TFS(&ht_green_flag), 0x0010,
+ {&hf_ieee80211_tag_measure_report_type,
+ {"Measurement Report Type", "wlan.measure.rep.reptype",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_report_type_flags_ext, 0x00,
NULL, HFILL }},
- {&hf_ieee80211_ht_short20,
- {"HT Short GI for 20MHz", "wlan.ht.capabilities.short20",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0020,
+ {&hf_ieee80211_tag_measure_report_channel_number,
+ {"Measurement Channel Number", "wlan.measure.rep.channelnumber",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_short40,
- {"HT Short GI for 40MHz", "wlan.ht.capabilities.short40",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0040,
+ {&hf_ieee80211_tag_measure_report_start_time,
+ {"Measurement Start Time", "wlan.measure.rep.starttime",
+ FT_UINT64, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_tx_stbc,
- {"HT Tx STBC", "wlan.ht.capabilities.txstbc",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0080,
+ {&hf_ieee80211_tag_measure_report_duration,
+ {"Measurement Duration", "wlan.measure.rep.channelnumber",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_rx_stbc,
- {"HT Rx STBC", "wlan.ht.capabilities.rxstbc",
- FT_UINT16, BASE_HEX, VALS(ht_rx_stbc_flag), 0x0300,
- "HT Tx STBC", HFILL }},
+ {&hf_ieee80211_tag_measure_cca_busy_fraction,
+ {"CCA Busy Fraction", "wlan.measure.rep.ccabusy",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_ht_delayed_block_ack,
- {"HT Delayed Block ACK", "wlan.ht.capabilities.delayedblockack",
- FT_BOOLEAN, 16, TFS(&ht_delayed_block_ack_flag), 0x0400,
+ {&hf_ieee80211_tag_measure_basic_map_field,
+ {"Map Field", "wlan.measure.rep.mapfield",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_max_amsdu,
- {"HT Max A-MSDU length", "wlan.ht.capabilities.amsdu",
- FT_BOOLEAN, 16, TFS(&ht_max_amsdu_flag), 0x0800,
+ {&hf_ieee80211_tag_measure_map_field_bss,
+ {"BSS", "wlan.measure.rep.repmode.mapfield.bss",
+ FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_map_field_bss_flag), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_ht_dss_cck_40,
- {"HT DSSS/CCK mode in 40MHz", "wlan.ht.capabilities.dsscck",
- FT_BOOLEAN, 16, TFS(&ht_dss_cck_40_flag), 0x1000,
- "HT DSS/CCK mode in 40MHz", HFILL }},
+ {&hf_ieee80211_tag_measure_map_field_odfm,
+ {"Orthogonal Frequency Division Multiplexing (ODFM) Preamble", "wlan.measure.rep.repmode.mapfield.bss",
+ FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02,
+ NULL, HFILL }},
- {&hf_ieee80211_ht_psmp,
- {"HT PSMP Support", "wlan.ht.capabilities.psmp",
- FT_BOOLEAN, 16, TFS(&ht_psmp_flag), 0x2000,
+ {&hf_ieee80211_tag_measure_map_field_unident_signal,
+ {"Unidentified Signal", "wlan.measure.rep.repmode.mapfield.unidentsig",
+ FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_ht_40_mhz_intolerant,
- {"HT Forty MHz Intolerant", "wlan.ht.capabilities.40mhzintolerant",
- FT_BOOLEAN, 16, TFS(&ht_40_mhz_intolerant_flag), 0x4000,
+ {&hf_ieee80211_tag_measure_map_field_radar,
+ {"Radar", "wlan.measure.rep.repmode.mapfield.radar",
+ FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_ht_l_sig,
- {"HT L-SIG TXOP Protection support", "wlan.ht.capabilities.lsig",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x8000,
+ {&hf_ieee80211_tag_measure_map_field_unmeasured,
+ {"Unmeasured", "wlan.measure.rep.repmode.mapfield.unmeasured",
+ FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_ext_bss_mu_mimo_capable_sta_count,
- {"MU-MIMO Capable STA Count", "wlan.ext_bss.mu_mimo_capable_sta_count",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_measure_map_field_reserved,
+ {"Reserved", "wlan.measure.rep.repmode.mapfield.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xe0,
NULL, HFILL }},
- {&hf_ieee80211_ext_bss_ss_underutilization,
- {"Spatial Stream Underutilization", "wlan.ext_bss.ss_underutilization",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_measure_rpi_histogram_report,
+ {"Receive Power Indicator (RPI) Histogram Report", "wlan.measure.rep.rpi.histogram_report",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ext_bss_observable_sec_20mhz_utilization,
- {"Observable Secondary 20MHz Utilization", "wlan.ext_bss.observable_sec_20mhz_utilization",
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_0,
+ {"RPI 0 Density", "wlan.measure.rep.rpi.rpi0density",
FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ "Receive Power Indicator (RPI) 0 Density", HFILL }},
- {&hf_ieee80211_ext_bss_observable_sec_40mhz_utilization,
- {"Observable Secondary 40MHz Utilization", "wlan.ext_bss.observable_sec_40mhz_utilization",
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_1,
+ {"RPI 1 Density", "wlan.measure.rep.rpi.rpi1density",
FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ "Receive Power Indicator (RPI) 1 Density", HFILL }},
- {&hf_ieee80211_ext_bss_observable_sec_80mhz_utilization,
- {"Observable Secondary 80MHz Utilization", "wlan.ext_bss.observable_sec_80mhz_utilization",
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_2,
+ {"RPI 2 Density", "wlan.measure.rep.rpi.rpi2density",
FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ "Receive Power Indicator (RPI) 2 Density", HFILL }},
- {&hf_ieee80211_wide_bw_new_channel_width,
- {"New Channel Width", "wlan.wide_bw.new_channel_width",
- FT_UINT8, BASE_HEX, VALS(vht_operation_info_channel_width), 0x0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_3,
+ {"RPI 3 Density", "wlan.measure.rep.rpi.rpi3density",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Receive Power Indicator (RPI) 3 Density", HFILL }},
- {&hf_ieee80211_wide_bw_new_channel_center_freq_segment0,
- {"New Channel Center Frequency Segment 0", "wlan.wide_bw.new_channel_center_freq_segment0",
- FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_4,
+ {"RPI 4 Density", "wlan.measure.rep.rpi.rpi4density",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Receive Power Indicator (RPI) 4 Density", HFILL }},
- {&hf_ieee80211_wide_bw_new_channel_center_freq_segment1,
- {"New Channel Center Frequency Segment 1", "wlan.wide_bw.new_channel_center_freq_segment1",
- FT_UINT8, BASE_HEX_DEC, NULL, 0x0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_5,
+ {"RPI 5 Density", "wlan.measure.rep.rpi.rpi5density",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Receive Power Indicator (RPI) 5 Density", HFILL }},
- {&hf_ieee80211_operat_notification_mode,
- {"Operating Mode Notification", "wlan.operat_notification_mode",
- FT_UINT8, BASE_HEX, NULL, 0x0,
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_6,
+ {"RPI 6 Density", "wlan.measure.rep.rpi.rpi6density",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Receive Power Indicator (RPI) 6 Density", HFILL }},
+
+ {&hf_ieee80211_tag_measure_rpi_histogram_report_7,
+ {"RPI 7 Density", "wlan.measure.rep.rpi.rpi7density",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Receive Power Indicator (RPI) 7 Density", HFILL }},
+
+ {&hf_ieee80211_tag_measure_report_operating_class,
+ {"Operating Class", "wlan.measure.rep.operatingclass",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_operat_mode_field_channel_width,
- {"Channel Width", "wlan.operat_mode_field.channelwidth",
- FT_UINT8, BASE_HEX, VALS(operating_mode_field_channel_width), 0x03,
+ {&hf_ieee80211_tag_measure_report_channel_load,
+ {"Channel Load", "wlan.measure.rep.chanload",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_operat_mode_field_reserved,
- {"Reserved", "wlan.operat_mode_field.reserved",
- FT_UINT8, BASE_HEX, NULL, 0x0C,
+ {&hf_ieee80211_tag_measure_report_frame_info,
+ {"Reported Frame Information", "wlan.measure.rep.frameinfo",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_operat_mode_field_rxnss,
- {"Rx NSS", "wlan.operat_mode_field.rxnss",
- FT_UINT8, BASE_HEX, VALS(operat_mode_field_rxnss), 0x70,
+ {&hf_ieee80211_tag_measure_report_frame_info_phy_type,
+ {"Condensed PHY", "wlan.measure.rep.frameinfo.phytype",
+ FT_UINT8, BASE_HEX, NULL, 0x7F,
NULL, HFILL }},
- {&hf_ieee80211_operat_mode_field_rxnsstype,
- {"Rx NSS Type", "wlan.operat_mode_field.rxnsstype",
- FT_UINT8, BASE_HEX, NULL, 0x80,
- "Indicate that the Rx NSS subfield carries the maximum number of spatial streams that the STA can receive", HFILL }},
+ {&hf_ieee80211_tag_measure_report_frame_info_frame_type,
+ {"Reported Frame Type", "wlan.measure.rep.frameinfo.frametype",
+ FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_report_frame_info_frame_type_flag), 0x80,
+ NULL, HFILL }},
- {&hf_ieee80211_ampduparam,
- {"A-MPDU Parameters", "wlan.ht.ampduparam",
+ {&hf_ieee80211_tag_measure_report_rcpi,
+ {"Received Channel Power Indicator (RCPI)", "wlan.measure.rep.rcpi",
FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ "in dBm", HFILL }},
- {&hf_ieee80211_ampduparam_vs,
- {"A-MPDU Parameters (VS)", "wlan.vs.ht.ampduparam",
+ {&hf_ieee80211_tag_measure_report_rsni,
+ {"Received Signal to Noise Indicator (RSNI)", "wlan.measure.rep.rsni",
FT_UINT8, BASE_HEX, NULL, 0,
- "Vendor Specific A-MPDU Parameters", HFILL }},
+ "in dB", HFILL }},
- {&hf_ieee80211_ampduparam_mpdu,
- {"Maximum Rx A-MPDU Length", "wlan.ht.ampduparam.maxlength",
- FT_UINT8, BASE_HEX, 0, 0x03,
+ {&hf_ieee80211_tag_measure_report_bssid,
+ {"BSSID Being Reported", "wlan.measure.rep.bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ampduparam_mpdu_start_spacing,
- {"MPDU Density", "wlan.ht.ampduparam.mpdudensity",
- FT_UINT8, BASE_HEX, VALS(ampduparam_mpdu_start_spacing_flags), 0x1c,
+ {&hf_ieee80211_tag_measure_report_ant_id,
+ {"Antenna ID", "wlan.measure.rep.antid",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ampduparam_reserved,
- {"Reserved", "wlan.ht.ampduparam.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xE0,
+ {&hf_ieee80211_tag_measure_report_anpi,
+ {"ANPI", "wlan.measure.rep.anpi",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset,
- {"Rx Supported Modulation and Coding Scheme Set", "wlan.ht.mcsset",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_measure_report_ipi_density_0,
+ {"IPI Density 0", "wlan.measure.rep.ipi_density0",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_vs,
- {"Rx Supported Modulation and Coding Scheme Set (VS)", "wlan.vs.ht.mcsset",
- FT_STRING, BASE_NONE, NULL, 0,
- "Vendor Specific Rx Supported Modulation and Coding Scheme Set", HFILL }},
-
- {&hf_ieee80211_mcsset_rx_bitmask,
- {"Rx Modulation and Coding Scheme (One bit per modulation)", "wlan.ht.mcsset.rxbitmask",
- FT_NONE, BASE_NONE, NULL, 0,
- "One bit per modulation", HFILL }},
+ {&hf_ieee80211_tag_measure_report_ipi_density_1,
+ {"IPI Density 1", "wlan.measure.rep.ipi_density1",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_0to7,
- {"Rx Bitmask Bits 0-7", "wlan.ht.mcsset.rxbitmask.0to7",
- FT_UINT32, BASE_HEX, 0, 0x000000ff,
+ {&hf_ieee80211_tag_measure_report_ipi_density_2,
+ {"IPI Density 2", "wlan.measure.rep.ipi_density2",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_8to15,
- {"Rx Bitmask Bits 8-15", "wlan.ht.mcsset.rxbitmask.8to15",
- FT_UINT32, BASE_HEX, 0, 0x0000ff00,
+ {&hf_ieee80211_tag_measure_report_ipi_density_3,
+ {"IPI Density 3", "wlan.measure.rep.ipi_density3",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_16to23,
- {"Rx Bitmask Bits 16-23", "wlan.ht.mcsset.rxbitmask.16to23",
- FT_UINT32, BASE_HEX, 0, 0x00ff0000,
+ {&hf_ieee80211_tag_measure_report_ipi_density_4,
+ {"IPI Density 4", "wlan.measure.rep.ipi_density4",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_24to31,
- {"Rx Bitmask Bits 24-31", "wlan.ht.mcsset.rxbitmask.24to31",
- FT_UINT32, BASE_HEX, 0, 0xff000000,
+ {&hf_ieee80211_tag_measure_report_ipi_density_5,
+ {"IPI Density 5", "wlan.measure.rep.ipi_density5",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_32,
- {"Rx Bitmask Bit 32", "wlan.ht.mcsset.rxbitmask.32",
- FT_UINT32, BASE_HEX, 0, 0x000001,
+ {&hf_ieee80211_tag_measure_report_ipi_density_6,
+ {"IPI Density 6", "wlan.measure.rep.ipi_density6",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_33to38,
- {"Rx Bitmask Bits 33-38", "wlan.ht.mcsset.rxbitmask.33to38",
- FT_UINT32, BASE_HEX, 0, 0x00007e,
+ {&hf_ieee80211_tag_measure_report_ipi_density_7,
+ {"IPI Density 7", "wlan.measure.rep.ipi_density7",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_39to52,
- {"Rx Bitmask Bits 39-52", "wlan.ht.mcsset.rxbitmask.39to52",
- FT_UINT32, BASE_HEX, 0, 0x1fff80,
+ {&hf_ieee80211_tag_measure_report_ipi_density_8,
+ {"IPI Density 8", "wlan.measure.rep.ipi_density8",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_rx_bitmask_53to76,
- {"Rx Bitmask Bits 53-76", "wlan.ht.mcsset.rxbitmask.53to76",
- FT_UINT32, BASE_HEX, 0, 0x1fffffe0,
+ {&hf_ieee80211_tag_measure_report_ipi_density_9,
+ {"IPI Density 9", "wlan.measure.rep.ipi_density9",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_highest_data_rate,
- {"Highest Supported Data Rate", "wlan.ht.mcsset.highestdatarate",
- FT_UINT16, BASE_HEX, 0, 0x03ff,
+ {&hf_ieee80211_tag_measure_report_ipi_density_10,
+ {"IPI Density 10", "wlan.measure.rep.ipi_density10",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_tx_mcs_set_defined,
- {"Tx Supported MCS Set", "wlan.ht.mcsset.txsetdefined",
- FT_BOOLEAN, 16, TFS(&tfs_defined_not_defined), 0x0001,
+ {&hf_ieee80211_tag_measure_report_parent_tsf,
+ {"Parent Timing Synchronization Function (TSF)", "wlan.measure.rep.parenttsf",
+ FT_UINT32, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_tx_rx_mcs_set_not_equal,
- {"Tx and Rx MCS Set", "wlan.ht.mcsset.txrxmcsnotequal",
- FT_BOOLEAN, 16, TFS(&mcsset_tx_rx_mcs_set_not_equal_flag), 0x0002,
+ {&hf_ieee80211_tag_measure_report_subelement_length,
+ {"Length", "wlan.measure.req.sub.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_tx_max_spatial_streams,
- {"Maximum Number of Tx Spatial Streams Supported", "wlan.ht.mcsset.txmaxss",
- FT_UINT16, BASE_HEX, 0 , 0x000c,
+ {&hf_ieee80211_tag_measure_report_beacon_sub_id,
+ {"SubElement ID", "wlan.measure.req.beacon.sub.id",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_report_beacon_sub_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_mcsset_tx_unequal_modulation,
- {"Unequal Modulation", "wlan.ht.mcsset.txunequalmod",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0010,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_measure_report_unknown,
+ {"Unknown Data", "wlan.measure.rep.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "(not interpreted)", HFILL }},
- {&hf_ieee80211_htex_cap,
- {"HT Extended Capabilities", "wlan.htex.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "HT Extended Capability information", HFILL }},
+ {&hf_ieee80211_tag_quiet_count,
+ {"Count", "wlan.quiet.count",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Set to the number of TBTTs until the beacon interval during which the next quiet interval shall start", HFILL }},
- {&hf_ieee80211_htex_vs_cap,
- {"HT Extended Capabilities (VS)", "wlan.vs.htex.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Vendor Specific HT Extended Capability information", HFILL }},
+ {&hf_ieee80211_tag_quiet_period,
+ {"Period", "wlan.quiet.period",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Set to the number of beacon intervals between the start of regularly scheduled quiet intervals", HFILL }},
- {&hf_ieee80211_htex_pco,
- {"Transmitter supports PCO", "wlan.htex.capabilities.pco",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0001,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_quiet_duration,
+ {"Duration", "wlan.quiet.duration",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Set to the duration of the quiet interval", HFILL }},
- {&hf_ieee80211_htex_transtime,
- {"Time needed to transition between 20MHz and 40MHz", "wlan.htex.capabilities.transtime",
- FT_UINT16, BASE_HEX, VALS(htex_transtime_flags), 0x0006,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_quiet_offset,
+ {"Offset", "wlan.quiet.offset",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Set to the offset of the start of the quiet interval from the TBTT", HFILL }},
- {&hf_ieee80211_htex_mcs,
- {"MCS Feedback capability", "wlan.htex.capabilities.mcs",
- FT_UINT16, BASE_HEX, VALS(htex_mcs_flags), 0x0300,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_dfs_owner,
+ {"Owner", "wlan.dfs.owner",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Set to the individual IEEE MAC address of the STA that is the currently known DFS Owner in the IBSS", HFILL }},
- {&hf_ieee80211_htex_htc_support,
- {"High Throughput", "wlan.htex.capabilities.htc",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_dfs_recovery_interval,
+ {"Recovery Interval", "wlan.dfs.recovery_interval",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "Indicates the time interval that shall be used for DFS owner recovery", HFILL }},
- {&hf_ieee80211_htex_rd_responder,
- {"Reverse Direction Responder", "wlan.htex.capabilities.rdresponder",
- FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_dfs_channel_map,
+ {"Channel Map", "wlan.dfs.channel_map",
+ FT_NONE, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf,
- {"Transmit Beam Forming (TxBF) Capabilities", "wlan.txbf",
- FT_UINT32, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_dfs_channel_number,
+ {"Channel Number", "wlan.dfs.channel_number",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_vs,
- {"Transmit Beam Forming (TxBF) Capabilities (VS)", "wlan.vs.txbf",
- FT_UINT32, BASE_HEX, NULL, 0,
- "Vendor Specific Transmit Beam Forming (TxBF) Capabilities", HFILL }},
+ {&hf_ieee80211_tag_dfs_map,
+ {"Map", "wlan.dfs.map",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_cap,
- {"Transmit Beamforming", "wlan.txbf.txbf",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000001,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_erp_info,
+ {"ERP Information", "wlan.erp_info",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_rcv_ssc,
- {"Receive Staggered Sounding", "wlan.txbf.rxss",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000002,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_erp_info_erp_present,
+ {"Non ERP Present", "wlan.erp_info.erp_present",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_tx_ssc,
- {"Transmit Staggered Sounding", "wlan.txbf.txss",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000004,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_erp_info_use_protection,
+ {"Use Protection", "wlan.erp_info.use_protection",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_rcv_ndp,
- {"Receive Null Data packet (NDP)", "wlan.txbf.rxndp",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000008,
+ {&hf_ieee80211_tag_erp_info_barker_preamble_mode,
+ {"Barker Preamble Mode", "wlan.erp_info.barker_preamble_mode",
+ FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_erp_info_reserved,
+ {"Reserved", "wlan.erp_info.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0xF8,
+ NULL, HFILL }},
+
+ /* IEEE Std 802.11 2016 */
+ /* Table 9-135-Extended Capabilities field */
+ {&hf_ieee80211_tag_extended_capabilities,
+ {"Extended Capabilities", "wlan.extcap",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_txbf_tx_ndp,
- {"Transmit Null Data packet (NDP)", "wlan.txbf.txndp",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
+ /* Extended Capability octet 1 */
+ {&hf_ieee80211_tag_extended_capabilities_b0,
+ {"20/40 BSS Coexistence Management Support", "wlan.extcap.b0",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
+ "HT Information Exchange Support", HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b1,
+ {"Reserved (was On-demand beacon)", "wlan.extcap.b1",
+ FT_UINT8, BASE_HEX, NULL, 0x02,
+ "Must be zero", HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b2,
+ {"Extended Channel Switching", "wlan.extcap.b2",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_txbf_impl_txbf,
- {"Implicit TxBF capable", "wlan.txbf.impltxbf",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
- "Implicit Transmit Beamforming (TxBF) capable", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b3,
+ {"Reserved (was WAVE indication)", "wlan.extcap.b3",
+ FT_UINT8, BASE_HEX, NULL, 0x08,
+ "Must be zero", HFILL }},
- {&hf_ieee80211_txbf_calib,
- {"Calibration", "wlan.txbf.calibration",
- FT_UINT32, BASE_HEX, VALS(txbf_calib_flag), 0x000000c0,
+ {&hf_ieee80211_tag_extended_capabilities_b4,
+ {"PSMP Capability", "wlan.extcap.b4",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_txbf_expl_csi,
- {"STA can apply TxBF using CSI explicit feedback", "wlan.txbf.csi",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000100,
- "Station can apply TxBF using CSI explicit feedback", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b5,
+ {"Reserved", "wlan.extcap.b5",
+ FT_UINT8, BASE_HEX, NULL, 0x20,
+ "Must be zero", HFILL }},
- {&hf_ieee80211_txbf_expl_uncomp_fm,
- {"STA can apply TxBF using uncompressed beamforming feedback matrix", "wlan.txbf.fm.uncompressed.tbf",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000200,
- "Station can apply TxBF using uncompressed beamforming feedback matrix", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b6,
+ {"S-PSMP Support", "wlan.extcap.b6",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_expl_comp_fm,
- {"STA can apply TxBF using compressed beamforming feedback matrix", "wlan.txbf.fm.compressed.tbf",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000400,
- "Station can apply TxBF using compressed beamforming feedback matrix", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b7,
+ {"Event", "wlan.extcap.b7",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_expl_bf_csi,
- {"Receiver can return explicit CSI feedback", "wlan.txbf.rcsi",
- FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00001800,
+
+ /* Extended Capability octet 2 */
+ {&hf_ieee80211_tag_extended_capabilities_b8,
+ {"Diagnostics", "wlan.extcap.b8",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_txbf_expl_uncomp_fm_feed,
- {"Receiver can return explicit uncompressed Beamforming Feedback Matrix", "wlan.txbf.fm.uncompressed.rbf",
- FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00006000,
+ {&hf_ieee80211_tag_extended_capabilities_b9,
+ {"Multicast Diagnostics", "wlan.extcap.b9",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_txbf_expl_comp_fm_feed,
- {"STA can compress and use compressed Beamforming Feedback Matrix", "wlan.txbf.fm.compressed.bf",
- FT_UINT32, BASE_HEX, VALS(txbf_feedback_flags), 0x00018000,
- "Station can compress and use compressed Beamforming Feedback Matrix", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b10,
+ {"Location Tracking", "wlan.extcap.b10",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_min_group,
- {"Minimal grouping used for explicit feedback reports", "wlan.txbf.mingroup",
- FT_UINT32, BASE_HEX, VALS(txbf_min_group_flags), 0x00060000,
+ {&hf_ieee80211_tag_extended_capabilities_b11,
+ {"FMS", "wlan.extcap.b11",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vht_cap,
- {"VHT Capabilities Info", "wlan.vht.capabilities",
- FT_UINT32, BASE_HEX, NULL, 0,
- "VHT Capabilities information", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b12,
+ {"Proxy ARP Service", "wlan.extcap.b12",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
+ NULL, HFILL }},
- {&hf_ieee80211_vht_max_mpdu_length,
- {"Maximum MPDU Length", "wlan.vht.capabilities.maxmpdulength",
- FT_UINT32, BASE_HEX, VALS(vht_max_mpdu_length_flag), 0x00000003,
- "In Octets unit", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b13,
+ {"Collocated Interference Reporting", "wlan.extcap.b13",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
+ NULL, HFILL }},
- {&hf_ieee80211_vht_supported_chan_width_set,
- {"Supported Channel Width Set", "wlan.vht.capabilities.supportedchanwidthset",
- FT_UINT32, BASE_HEX, VALS(vht_supported_chan_width_set_flag), 0x0000000c,
+ {&hf_ieee80211_tag_extended_capabilities_b14,
+ {"Civic Location", "wlan.extcap.b14",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_rx_ldpc,
- {"Rx LDPC", "wlan.vht.capabilities.rxldpc",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000010,
+ {&hf_ieee80211_tag_extended_capabilities_b15,
+ {"Geospatial Location", "wlan.extcap.b15",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_vht_short_gi_for_80,
- {"Short GI for 80MHz", "wlan.vht.capabilities.short80",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000020,
+
+ /* Extended Capability octet 3 */
+ {&hf_ieee80211_tag_extended_capabilities_b16,
+ {"TFS", "wlan.extcap.b16",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_vht_short_gi_for_160,
- {"Short GI for 160MHz and 80+80MHz", "wlan.vht.capabilities.short160",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000040,
+ {&hf_ieee80211_tag_extended_capabilities_b17,
+ {"WNM Sleep Mode", "wlan.extcap.b17",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vht_tx_stbc,
- {"Tx STBC", "wlan.vht.capabilities.txstbc",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000080,
+ {&hf_ieee80211_tag_extended_capabilities_b18,
+ {"TIM Broadcast", "wlan.extcap.b18",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vht_rx_stbc,
- {"Rx STBC", "wlan.vht.capabilities.rxstbc",
- FT_UINT32, BASE_HEX, VALS(vht_rx_stbc_flag), 0x00000700,
+ {&hf_ieee80211_tag_extended_capabilities_b19,
+ {"BSS Transition", "wlan.extcap.b19",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vht_su_beamformer_cap,
- {"SU Beam-former Capable", "wlan.vht.capabilities.subeamformer",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00000800,
+ {&hf_ieee80211_tag_extended_capabilities_b20,
+ {"QoS Traffic Capability", "wlan.extcap.b20",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_vht_su_beamformee_cap,
- {"SU Beam-formee Capable", "wlan.vht.capabilities.subeamformee",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00001000,
+ {&hf_ieee80211_tag_extended_capabilities_b21,
+ {"AC Station Count", "wlan.extcap.b21",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_beamformer_antennas,
- {"Compressed Steering Number of Beamformer Antennas Supported", "wlan.vht.capabilities.beamformerants",
- FT_UINT32, BASE_HEX, VALS(num_plus_one_3bit_flag), 0x0000e000,
+ {&hf_ieee80211_tag_extended_capabilities_b22,
+ {"Multiple BSSID", "wlan.extcap.b22",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_sounding_dimensions,
- {"Number of Sounding Dimensions", "wlan.vht.capabilities.soundingdimensions",
- FT_UINT32, BASE_HEX, VALS(num_plus_one_3bit_flag), 0x00070000,
+ {&hf_ieee80211_tag_extended_capabilities_b23,
+ {"Timing Measurement", "wlan.extcap.b23",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_vht_mu_beamformer_cap,
- {"MU Beam-former Capable", "wlan.vht.capabilities.mubeamformer",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00080000,
+
+ /* Extended Capability octet 4 */
+ {&hf_ieee80211_tag_extended_capabilities_b24,
+ {"Channel Usage", "wlan.extcap.b24",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_vht_mu_beamformee_cap,
- {"MU Beam-formee Capable", "wlan.vht.capabilities.mubeamformee",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00100000,
+ {&hf_ieee80211_tag_extended_capabilities_b25,
+ {"SSID List", "wlan.extcap.b25",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vht_txop_ps,
- {"VHT TXOP PS", "wlan.vht.capabilities.vhttxopps",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00200000,
+ {&hf_ieee80211_tag_extended_capabilities_b26,
+ {"DMS", "wlan.extcap.b26",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vht_var_htc_field,
- {"+HTC-VHT Capable (VHT variant HT Control field)", "wlan.vht.capabilities.vhthtc",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x00400000,
+ {&hf_ieee80211_tag_extended_capabilities_b27,
+ {"UTC TSF Offset", "wlan.extcap.b27",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vht_max_ampdu,
- {"Max A-MPDU Length", "wlan.vht.capabilities.maxampdu",
- FT_UINT32, BASE_HEX, VALS(vht_max_ampdu_flag), 0x03800000,
- "In Octets unit", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b28,
+ {"TPU Buffer STA Support", "wlan.extcap.b28",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
+ NULL, HFILL }},
- {&hf_ieee80211_vht_link_adaptation_cap,
- {"VHT Link Adaptation", "wlan.vht.capabilities.linkadapt",
- FT_UINT32, BASE_HEX, VALS(vht_link_adapt_flag), 0x0c000000,
+ {&hf_ieee80211_tag_extended_capabilities_b29,
+ {"TDLS Peer PSM Support", "wlan.extcap.b29",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_rx_pattern,
- {"Rx Antenna Pattern Consistency", "wlan.vht.capabilities.rxpatconsist",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x10000000,
+ {&hf_ieee80211_tag_extended_capabilities_b30,
+ {"TDLS channel switching", "wlan.extcap.b30",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_tx_pattern,
- {"Tx Antenna Pattern Consistency", "wlan.vht.capabilities.txpatconsist",
- FT_BOOLEAN, 32, TFS(&tfs_supported_not_supported), 0x20000000,
+ {&hf_ieee80211_tag_extended_capabilities_b31,
+ {"Interworking", "wlan.extcap.b31",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_vht_reserv,
- {"Reserved", "wlan.vht.reserved",
- FT_BOOLEAN, 32, NULL, 0xc0000000,
+
+ /* Extended Capability octet 5 */
+ {&hf_ieee80211_tag_extended_capabilities_b32,
+ {"QoS Map", "wlan.extcap.b32",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset,
- {"VHT Supported MCS Set", "wlan.vht.mcsset",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b33,
+ {"EBR", "wlan.extcap.b33",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_mcs_map,
- {"Rx MCS Map", "wlan.vht.mcsset.rxmcsmap",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b34,
+ {"SSPN Interface", "wlan.extcap.b34",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_1_ss,
- {"Rx 1 SS", "wlan.vht.mcsset.rxmcsmap.ss1",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
+ {&hf_ieee80211_tag_extended_capabilities_b35,
+ {"Reserved", "wlan.extcap.b35",
+ FT_UINT8, BASE_HEX, NULL, 0x08,
+ "Must be zero", HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b36,
+ {"MSGCF Capability", "wlan.extcap.b36",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_2_ss,
- {"Rx 2 SS", "wlan.vht.mcsset.rxmcsmap.ss2",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
+ {&hf_ieee80211_tag_extended_capabilities_b37,
+ {"TDLS Support", "wlan.extcap.b37",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_3_ss,
- {"Rx 3 SS", "wlan.vht.mcsset.rxmcsmap.ss3",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
+ {&hf_ieee80211_tag_extended_capabilities_b38,
+ {"TDLS Prohibited", "wlan.extcap.b38",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_4_ss,
- {"Rx 4 SS", "wlan.vht.mcsset.rxmcsmap.ss4",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
+ {&hf_ieee80211_tag_extended_capabilities_b39,
+ {"TDLS Channel Switching Prohibited", "wlan.extcap.b39",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_5_ss,
- {"Rx 5 SS", "wlan.vht.mcsset.rxmcsmap.ss5",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
+ /* Extended Capability octet 6 */
+ {&hf_ieee80211_tag_extended_capabilities_b40,
+ {"Reject Unadmitted Frame", "wlan.extcap.b40",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_6_ss,
- {"Rx 6 SS", "wlan.vht.mcsset.rxmcsmap.ss6",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
+ {&hf_ieee80211_tag_extended_capabilities_serv_int_granularity,
+ {"Service Interval Granularity",
+ "wlan.extcap.serv_int_granularity",
+ FT_UINT8, BASE_DEC, VALS(service_interval_granularity_vals), 0x0e,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_7_ss,
- {"Rx 7 SS", "wlan.vht.mcsset.rxmcsmap.ss7",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
+ {&hf_ieee80211_tag_extended_capabilities_b44,
+ {"Identifier Location", "wlan.extcap.b44",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_max_mcs_for_8_ss,
- {"Rx 8 SS", "wlan.vht.mcsset.rxmcsmap.ss8",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
+ {&hf_ieee80211_tag_extended_capabilities_b45,
+ {"U-APSD Coexistence", "wlan.extcap.b45",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_rx_highest_long_gi,
- {"Rx Highest Long GI Data Rate (in Mb/s, 0 = subfield not in use)", "wlan.vht.mcsset.rxhighestlonggirate",
- FT_UINT16, BASE_HEX, NULL, 0x1fff,
+ {&hf_ieee80211_tag_extended_capabilities_b46,
+ {"WNM Notification", "wlan.extcap.b46",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_mcs_map,
- {"Tx MCS Map", "wlan.vht.mcsset.txmcsmap",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b47,
+ {"QAB Capability", "wlan.extcap.b47",
+ FT_UINT8, BASE_HEX, NULL, 0x80,
+ "AP supports QAB", HFILL }},
+
+ /* Extended Capability octet 7 */
+ {&hf_ieee80211_tag_extended_capabilities_b48,
+ {"UTF-8 SSID", "wlan.extcap.b48",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
+ "The SSID in this BSS is interpreted using UTF-8 encoding", HFILL }},
+
+ {&hf_ieee80211_tag_extended_capabilities_b49,
+ {"QMFActivated", "wlan.extcap.b49",
+ FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_1_ss,
- {"Tx 1 SS", "wlan.vht.mcsset.txmcsmap.ss1",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
+ {&hf_ieee80211_tag_extended_capabilities_b50,
+ {"QMFReconfigurationActivated", "wlan.extcap.b50",
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_2_ss,
- {"Tx 2 SS", "wlan.vht.mcsset.txmcsmap.ss2",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
+ {&hf_ieee80211_tag_extended_capabilities_b51,
+ {"Robust AV Streaming", "wlan.extcap.b51",
+ FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_3_ss,
- {"Tx 3 SS", "wlan.vht.mcsset.txmcsmap.ss3",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
+ {&hf_ieee80211_tag_extended_capabilities_b52,
+ {"Advanced GCR", "wlan.extcap.b52",
+ FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_4_ss,
- {"Tx 4 SS", "wlan.vht.mcsset.txmcsmap.ss4",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
+ {&hf_ieee80211_tag_extended_capabilities_b53,
+ {"Mesh GCR", "wlan.extcap.b53",
+ FT_BOOLEAN, 8, NULL, 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_5_ss,
- {"Tx 5 SS", "wlan.vht.mcsset.txmcsmap.ss5",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
+ {&hf_ieee80211_tag_extended_capabilities_b54,
+ {"SCS", "wlan.extcap.b54",
+ FT_BOOLEAN, 8, NULL, 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_6_ss,
- {"Tx 6 SS", "wlan.vht.mcsset.txmcsmap.ss6",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
+ {&hf_ieee80211_tag_extended_capabilities_b55,
+ {"QLoad Report", "wlan.extcap.b55",
+ FT_BOOLEAN, 8, NULL, 0x80,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_7_ss,
- {"Tx 7 SS", "wlan.vht.mcsset.txmcsmap.ss7",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
+ /* Extended Capability octet 8 */
+ {&hf_ieee80211_tag_extended_capabilities_b56,
+ {"Alternate EDCA", "wlan.extcap.b56",
+ FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_max_mcs_for_8_ss,
- {"Tx 8 SS", "wlan.vht.mcsset.txmcsmap.ss8",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
+ {&hf_ieee80211_tag_extended_capabilities_b57,
+ {"Unprotected TXOP Negotiation", "wlan.extcap.b57",
+ FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vht_mcsset_tx_highest_long_gi,
- {"Tx Highest Long GI Data Rate (in Mb/s, 0 = subfield not in use)", "wlan.vht.mcsset.txhighestlonggirate",
- FT_UINT16, BASE_HEX, NULL, 0x1fff,
+ {&hf_ieee80211_tag_extended_capabilities_b58,
+ {"Protected TXOP Negotiation", "wlan.extcap.b58",
+ FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vht_op,
- {"VHT Operation Info", "wlan.vht.op",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b59,
+ {"Reserved", "wlan.extcap.b59",
+ FT_UINT8, BASE_HEX, NULL, 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_channel_width,
- {"Channel Width", "wlan.vht.op.channelwidth",
- FT_UINT8, BASE_HEX, VALS(vht_op_channel_width_flag), 0,
+ {&hf_ieee80211_tag_extended_capabilities_b60,
+ {"Protected QLoad Report", "wlan.extcap.b61",
+ FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_channel_center0,
- {"Channel Center Segment 0", "wlan.vht.op.channelcenter0",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b61,
+ {"TDLS Wider Bandwidth", "wlan.extcap.b61",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_channel_center1,
- {"Channel Center Segment 1", "wlan.vht.op.channelcenter1",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b62,
+ {"Operating Mode Notification", "wlan.extcap.b62",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_basic_mcs_map,
- {"Basic MCS Map", "wlan.vht.op.basicmcsmap",
+ {&hf_ieee80211_tag_extended_capabilities_b63,
+ {"Max Number Of MSDUs In A-MSDU", "wlan.extcap.b63",
+ FT_UINT8, BASE_DEC, NULL, 0x80,
+ "Part 1 (bit63)", HFILL }},
+
+ /* Extended Capability octets 8 & 9 */
+ {&hf_ieee80211_tag_extended_capabilities_2,
+ {"Extended Capabilities", "wlan.extcap",
FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_1_ss,
- {"Basic 1 SS", "wlan.vht.op.basicmcsmap.ss1",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0003,
+ {&hf_ieee80211_tag_extended_capabilities_b56_2,
+ {"Alternate EDCA", "wlan.extcap.b56",
+ FT_BOOLEAN, 16, NULL, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_2_ss,
- {"Basic 2 SS", "wlan.vht.op.basicmcsmap.ss2",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x000c,
+ {&hf_ieee80211_tag_extended_capabilities_b57_2,
+ {"Unprotected TXOP Negotiation", "wlan.extcap.b57",
+ FT_BOOLEAN, 16, NULL, 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_3_ss,
- {"Basic 3 SS", "wlan.vht.op.basicmcsmap.ss3",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0030,
+ {&hf_ieee80211_tag_extended_capabilities_b58_2,
+ {"Protected TXOP Negotiation", "wlan.extcap.b58",
+ FT_BOOLEAN, 16, NULL, 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_4_ss,
- {"Basic 4 SS", "wlan.vht.op.basicmcsmap.ss4",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x00c0,
+ {&hf_ieee80211_tag_extended_capabilities_b59_2,
+ {"Reserved", "wlan.extcap.b59",
+ FT_UINT16, BASE_HEX, NULL, 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_5_ss,
- {"Basic 5 SS", "wlan.vht.op.basicmcsmap.ss5",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0300,
+ {&hf_ieee80211_tag_extended_capabilities_b60_2,
+ {"Protected QLoad Report", "wlan.extcap.b61",
+ FT_BOOLEAN, 16, NULL, 0x10,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_6_ss,
- {"Basic 6 SS", "wlan.vht.op.basicmcsmap.ss6",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x0c00,
+ {&hf_ieee80211_tag_extended_capabilities_b61_2,
+ {"TDLS Wider Bandwidth", "wlan.extcap.b61",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x20,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_7_ss,
- {"Basic 7 SS", "wlan.vht.op.basicmcsmap.ss7",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0x3000,
+ {&hf_ieee80211_tag_extended_capabilities_b62_2,
+ {"Operating Mode Notification", "wlan.extcap.b62",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x40,
NULL, HFILL }},
- {&hf_ieee80211_vht_op_max_basic_mcs_for_8_ss,
- {"Basic 8 SS", "wlan.vht.op.basicmcsmap.ss8",
- FT_UINT16, BASE_HEX, VALS(vht_supported_mcs_flag), 0xc000,
+ {&hf_ieee80211_tag_extended_capabilities_max_num_msdus,
+ {"Max Number Of MSDUs In A-MSDU", "wlan.extcap.b63",
+ FT_UINT16, BASE_DEC, VALS(vht_max_mpdu_in_amsdu), 0x0180,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_info,
- {"Tx Pwr Info", "wlan.vht.tpe.pwr_info",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b65_2,
+ {"Channel Schedule Management", "wlan.extcap.b65",
+ FT_BOOLEAN, 16, NULL, 0x0200,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_info_count,
- {"Max Tx Pwr Count", "wlan.vht.tpe.pwr_info.count",
- FT_UINT8, BASE_DEC, NULL , 0x07,
+ {&hf_ieee80211_tag_extended_capabilities_b66_2,
+ {"Geodatabase Inband Enabling Signal", "wlan.extcap.b66",
+ FT_BOOLEAN, 16, NULL, 0x0400,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_info_unit,
- {"Max Tx Pwr Unit Interpretation", "wlan.vht.tpe.pwr_info.unit",
- FT_UINT8, BASE_DEC, VALS(vht_tpe_pwr_units) , 0x38,
+ {&hf_ieee80211_tag_extended_capabilities_b67_2,
+ {"Network Channel Control", "wlan.extcap.b67",
+ FT_BOOLEAN, 16, NULL, 0x0800,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_info_reserved,
- {"Reserved", "wlan.vht.tpe.pwr_info.reserved",
- FT_UINT8, BASE_DEC, NULL , 0xC0,
+ {&hf_ieee80211_tag_extended_capabilities_b68_2,
+ {"White Space Map", "wlan.extcap.b68",
+ FT_BOOLEAN, 16, NULL, 0x1000,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_constr_20,
- {"Local Max Tx Pwr Constraint 20MHz", "wlan.vht.tpe.pwr_constr_20",
- FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
+ {&hf_ieee80211_tag_extended_capabilities_b69_2,
+ {"Channel Availability Query", "wlan.extcap.b69",
+ FT_BOOLEAN, 16, NULL, 0x2000,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_constr_40,
- {"Local Max Tx Pwr Constraint 40MHz", "wlan.vht.tpe.pwr_constr_40",
- FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
+ {&hf_ieee80211_tag_extended_capabilities_b70_2,
+ {"Fine Timing Measurement Responder", "wlan.extcap.b70",
+ FT_BOOLEAN, 16, NULL, 0x4000,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_constr_80,
- {"Local Max Tx Pwr Constraint 80MHz", "wlan.vht.tpe.pwr_constr_80",
- FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
+ {&hf_ieee80211_tag_extended_capabilities_b71_2,
+ {"Fine Timing Measurement Initiator", "wlan.extcap.b71",
+ FT_BOOLEAN, 16, NULL, 0x8000,
NULL, HFILL }},
- {&hf_ieee80211_vht_tpe_pwr_constr_160,
- {"Local Max Tx Pwr Constraint 160MHz/80+80 MHz", "wlan.vht.tpe.pwr_constr_160",
- FT_INT8, BASE_CUSTOM, CF_FUNC(vht_tpe_custom), 0,
+ /* Extended Capability Octet 10 */
+ {&hf_ieee80211_tag_extended_capabilities_b72,
+ {"Reserved", "wlan.extcap.b72",
+ FT_UINT8, BASE_HEX, NULL, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_txbf_csi_num_bf_ant,
- {"Max antennae STA can support when CSI feedback required", "wlan.txbf.csinumant",
- FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x00180000,
- "Max antennae station can support when CSI feedback required", HFILL }},
-
- {&hf_ieee80211_txbf_uncomp_sm_bf_ant,
- {"Max antennae STA can support when uncompressed Beamforming feedback required", "wlan.txbf.fm.uncompressed.maxant",
- FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x00600000,
- "Max antennae station can support when uncompressed Beamforming feedback required", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b73,
+ {"Extended Spectrum Management Capable", "wlan.extcap.b73",
+ FT_BOOLEAN, 8, NULL, 0x02,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_comp_sm_bf_ant,
- {"Max antennae STA can support when compressed Beamforming feedback required", "wlan.txbf.fm.compressed.maxant",
- FT_UINT32, BASE_HEX, VALS(txbf_antenna_flags), 0x01800000,
- "Max antennae station can support when compressed Beamforming feedback required", HFILL }},
+ {&hf_ieee80211_tag_extended_capabilities_b74,
+ {"Future Channel Capable", "wlan.extcap.b74",
+ FT_BOOLEAN, 8, NULL, 0x04,
+ NULL, HFILL }},
- {&hf_ieee80211_txbf_csi_max_rows_bf,
- {"Maximum number of rows of CSI explicit feedback", "wlan.txbf.csi.maxrows",
- FT_UINT32, BASE_HEX, VALS(txbf_csi_max_rows_bf_flags), 0x06000000,
+ {&hf_ieee80211_tag_extended_capabilities_b75,
+ {"Reserved", "wlan.extcap.b75",
+ FT_UINT8, BASE_HEX, NULL, 0x08,
NULL, HFILL }},
- {&hf_ieee80211_txbf_chan_est,
- {"Maximum number of space time streams for which channel dimensions can be simultaneously estimated", "wlan.txbf.channelest",
- FT_UINT32, BASE_HEX, VALS(txbf_chan_est_flags), 0x18000000,
+ {&hf_ieee80211_tag_extended_capabilities_b76,
+ {"Reserved", "wlan.extcap.b76",
+ FT_UINT8, BASE_HEX, NULL, 0x10,
NULL, HFILL }},
- {&hf_ieee80211_txbf_resrv,
- {"Reserved", "wlan.txbf.reserved",
- FT_UINT32, BASE_HEX, NULL, 0xe0000000,
+ {&hf_ieee80211_tag_extended_capabilities_b77,
+ {"TWT Requester Support", "wlan.extcap.b77",
+ FT_BOOLEAN, 16, NULL, 0x20,
NULL, HFILL }},
- {&hf_ieee80211_hta_cc,
- {"HT Control Channel", "wlan.hta.control_channel",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_extended_capabilities_b78,
+ {"TWT Responder Support", "wlan.extcap.b78",
+ FT_BOOLEAN, 16, NULL, 0x40,
NULL, HFILL }},
- {&hf_ieee80211_hta_cap1,
- {"HT Additional Capabilities", "wlan.hta.capabilities",
- FT_UINT8, BASE_HEX, NULL, 0,
- "HT Additional Capability information", 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_hta_cap2,
- {"HT Additional Capabilities", "wlan.hta.capabilities",
- FT_UINT16, BASE_HEX, NULL, 0,
- "HT Additional Capability information", HFILL }},
- {&hf_ieee80211_hta_ext_chan_offset,
- {"Extension Channel Offset", "wlan.hta.capabilities.ext_chan_offset",
- FT_UINT16, BASE_HEX, VALS(hta_ext_chan_offset_flag), 0x0003,
+ {&hf_ieee80211_tag_cisco_ccx1_unknown,
+ {"Unknown", "wlan.cisco.ccx1.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_hta_rec_tx_width,
- {"Recommended Tx Channel Width", "wlan.hta.capabilities.rec_tx_width",
- FT_BOOLEAN, 16, TFS(&hta_rec_tx_width_flag), 0x0004,
- "Recommended Transmit Channel Width", HFILL }},
+ {&hf_ieee80211_tag_cisco_ccx1_name,
+ {"Name", "wlan.cisco.ccx1.name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_hta_rifs_mode,
- {"Reduced Interframe Spacing (RIFS) Mode", "wlan.hta.capabilities.rifs_mode",
- FT_BOOLEAN, 16, TFS(&hta_rifs_mode_flag), 0x0008,
+ {&hf_ieee80211_tag_cisco_ccx1_clients,
+ {"Clients", "wlan.cisco.ccx1.clients",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_hta_controlled_access,
- {"Controlled Access Only", "wlan.hta.capabilities.controlled_access",
- FT_BOOLEAN, 16, TFS(&hta_controlled_access_flag), 0x0010,
+ {&hf_ieee80211_tag_cisco_ccx1_unknown2,
+ {"Unknown2", "wlan.cisco.ccx1.unknown2",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_hta_service_interval,
- {"Service Interval Granularity", "wlan.hta.capabilities.service_interval",
- FT_UINT16, BASE_HEX, VALS(hta_service_interval_flag), 0x00E0,
+ {&hf_ieee80211_tag_neighbor_report_bssid,
+ {"BSSID", "wlan.nreport.bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_hta_operating_mode,
- {"Operating Mode", "wlan.hta.capabilities.operating_mode",
- FT_UINT16, BASE_HEX, VALS(hta_operating_mode_flag), 0x0003,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info,
+ {"BSSID Information", "wlan.nreport.bssid.info",
+ FT_UINT32, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_hta_non_gf_devices,
- {"Non Greenfield (GF) devices Present", "wlan.hta.capabilities.non_gf_devices",
- FT_BOOLEAN, 16, TFS(&hta_non_gf_devices_flag), 0x0004,
- "on Greenfield (GF) devices Present", HFILL }},
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_reachability,
+ {"AP Reachability", "wlan.nreport.bssid.info.reachability",
+ FT_UINT32, BASE_HEX, VALS(ieee80211_neighbor_report_bssid_info_reachability_vals), 0x00000003,
+ "Indicates whether the AP identified by this BSSID is reachable by the STA that requested the neighbor report", HFILL }},
- {&hf_ieee80211_hta_basic_stbc_mcs,
- {"Basic STB Modulation and Coding Scheme (MCS)", "wlan.hta.capabilities.basic_stbc_mcs",
- FT_UINT16, BASE_HEX, NULL , 0x007f,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_security,
+ {"Security", "wlan.nreport.bssid.info.security",
+ FT_BOOLEAN, 32, NULL, 0x00000004,
+ "Indicates that the AP identified by this BSSID supports the same security provisioning as used by the STA in its current association", HFILL }},
+
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_key_scope,
+ {"Key Scope", "wlan.nreport.bssid.info.keyscope",
+ FT_BOOLEAN, 32, NULL, 0x00000008,
+ "indicates the AP indicated by this BSSID has the same authenticator as the AP sending the report", HFILL }},
+
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability,
+ {"Capability", "wlan.nreport.bssid.info.capability",
+ FT_UINT32, BASE_HEX, NULL, 0x000003F0,
+ "Contains selected capability information for the AP indicated by this BSSID", HFILL }},
+
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng,
+ {"Spectrum Management", "wlan.nreport.bssid.info.capability.specmngt",
+ FT_BOOLEAN, 32, NULL, 0x00000010,
NULL, HFILL }},
- {&hf_ieee80211_hta_dual_stbc_protection,
- {"Dual Clear To Send (CTS) Protection", "wlan.hta.capabilities.dual_stbc_protection",
- FT_BOOLEAN, 16, TFS(&hta_dual_stbc_protection_flag), 0x0080,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos,
+ {"QoS", "wlan.nreport.bssid.info.capability.qos",
+ FT_BOOLEAN, 32, NULL, 0x00000020,
NULL, HFILL }},
- {&hf_ieee80211_hta_secondary_beacon,
- {"Secondary Beacon", "wlan.hta.capabilities.secondary_beacon",
- FT_BOOLEAN, 16, TFS(&hta_secondary_beacon_flag), 0x0100,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd,
+ {"APSD", "wlan.nreport.bssid.info.capability.apsd",
+ FT_BOOLEAN, 32, NULL, 0x00000040,
NULL, HFILL }},
- {&hf_ieee80211_hta_lsig_txop_protection,
- {"L-SIG TXOP Protection Support", "wlan.hta.capabilities.lsig_txop_protection",
- FT_BOOLEAN, 16, TFS(&hta_lsig_txop_protection_flag), 0x0200,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt,
+ {"Radio Measurement", "wlan.nreport.bssid.info.capability.radiomsnt",
+ FT_BOOLEAN, 32, NULL, 0x00000080,
NULL, HFILL }},
- {&hf_ieee80211_hta_pco_active,
- {"Phased Coexistence Operation (PCO) Active", "wlan.hta.capabilities.pco_active",
- FT_BOOLEAN, 16, TFS(&hta_pco_active_flag), 0x0400,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback,
+ {"Delayed Block Ack", "wlan.nreport.bssid.info.capability.dback",
+ FT_BOOLEAN, 32, NULL, 0x000000100,
NULL, HFILL }},
- {&hf_ieee80211_hta_pco_phase,
- {"Phased Coexistence Operation (PCO) Phase", "wlan.hta.capabilities.pco_phase",
- FT_BOOLEAN, 16, TFS(&hta_pco_phase_flag), 0x0800,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback,
+ {"Immediate Block Ack", "wlan.nreport.bssid.info.capability.iback",
+ FT_BOOLEAN, 32, NULL, 0x00000200,
NULL, HFILL }},
- {&hf_ieee80211_antsel,
- {"Antenna Selection (ASEL) Capabilities", "wlan.asel",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain,
+ {"Mobility Domain", "wlan.nreport.bssid.info.mobilitydomain",
+ FT_BOOLEAN, 32, NULL, 0x00000400,
+ "", HFILL }},
+
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput,
+ {"High Throughput Control (+HTC)", "wlan.nreport.bssid.info.hthoughput",
+ FT_BOOLEAN, 32, NULL, 0x00000800,
NULL, HFILL }},
- {&hf_ieee80211_antsel_vs,
- {"Antenna Selection (ASEL) Capabilities (VS)", "wlan.vs.asel",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Vendor Specific Antenna Selection (ASEL) Capabilities", HFILL }},
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput,
+ {"Very High Throughput (+VHT)", "wlan.nreport.bssid.info.vht",
+ FT_BOOLEAN, 32, NULL, 0x00001000,
+ NULL, HFILL }},
- {&hf_ieee80211_antsel_b0,
- {"Antenna Selection Capable", "wlan.asel.capable",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_ftm,
+ {"Fine Timing Measurement (FTM)", "wlan.nreport.bssid.info.ftm",
+ FT_BOOLEAN, 32, NULL, 0x00002000,
NULL, HFILL }},
- {&hf_ieee80211_antsel_b1,
- {"Explicit CSI Feedback Based Tx ASEL", "wlan.asel.txcsi",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
+ {&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_antsel_b2,
- {"Antenna Indices Feedback Based Tx ASEL", "wlan.asel.txif",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
+ {&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_antsel_b3,
- {"Explicit CSI Feedback", "wlan.asel.csi",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
+ {&hf_ieee80211_tag_neighbor_report_bssid_info_reserved,
+ {"Reserved", "wlan.nreport.bssid.info.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
+ "Must be zero", HFILL }},
+
+ {&hf_ieee80211_tag_neighbor_report_ope_class,
+ {"Operating Class", "wlan.nreport.opeclass",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_antsel_b4,
- {"Antenna Indices Feedback", "wlan.asel.if",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
+ {&hf_ieee80211_tag_neighbor_report_channel_number,
+ {"Channel Number", "wlan.nreport.channumber",
+ FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_antsel_b5,
- {"Rx ASEL", "wlan.asel.rx",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
+ {&hf_ieee80211_tag_neighbor_report_phy_type,
+ {"PHY Type", "wlan.nreport.phytype",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_antsel_b6,
- {"Tx Sounding PPDUs", "wlan.asel.sppdu",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+ {&hf_ieee80211_tag_neighbor_report_subelement_id,
+ {"Subelement ID", "wlan.nreport.subelement_id",
+ FT_UINT8, BASE_HEX, VALS(ieee80211_neighbor_report_subelement_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_antsel_b7,
- {"Reserved", "wlan.asel.reserved",
- FT_UINT8, BASE_HEX, NULL, 0x80,
+ {&hf_ieee80211_tag_neighbor_report_subelement_length,
+ {"Length", "wlan.nreport.subelement_length",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_delimiter1,
- {"HT Information Subset (1 of 3)", "wlan.ht.info.delim1",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_neighbor_report_subelement_data,
+ {"Subelement Data", "wlan.nreport.subelement_data",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_primary_channel,
- {"Primary Channel", "wlan.ht.info.primarychannel",
+ {&hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref,
+ {"Preference", "wlan.nreport.subelement.bss_trn_can_pref",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_secondary_channel_offset,
- {"Secondary channel offset", "wlan.ht.info.secchanoffset",
- FT_UINT8, BASE_HEX, VALS(ht_info_secondary_channel_offset_flags), 0x03,
+ {&hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf,
+ {"BSS Termination TSF", "wlan.nreport.subelement.bss_ter_tsf",
+ FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_channel_width,
- {"Supported channel width", "wlan.ht.info.chanwidth",
- FT_BOOLEAN, 8, TFS(&ht_info_channel_width_flag), 0x04,
+ {&hf_ieee80211_tag_neighbor_report_subelement_bss_dur,
+ {"Duration", "wlan.nreport.subelement.bss_dur",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_rifs_mode,
- {"Reduced Interframe Spacing (RIFS)", "wlan.ht.info.rifs",
- FT_BOOLEAN, 8, TFS(&ht_info_rifs_mode_flag), 0x08,
+ {&hf_ieee80211_tag_supported_ope_classes_current,
+ {"Current Operating Class", "wlan.supopeclass.current",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_psmp_stas_only,
- {"Power Save Multi-Poll (PSMP) stations only", "wlan.ht.info.psmponly",
- FT_BOOLEAN, 8, TFS(&ht_info_psmp_stas_only_flag), 0x10,
+ {&hf_ieee80211_tag_supported_ope_classes_alternate,
+ {"Alternate Operating Classes", "wlan.supopeclass.alt",
+ FT_NONE, BASE_NONE, 0x0, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_service_interval_granularity,
- {"Shortest service interval", "wlan.ht.info",
- FT_UINT8, BASE_HEX, VALS(ht_info_service_interval_granularity_flags), 0xe0,
+ {&hf_ieee80211_wfa_ie_type,
+ {"Type", "wlan.wfa.ie.type",
+ FT_UINT8, BASE_HEX, VALS(ieee802111_wfa_ie_type_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_delimiter2,
- {"HT Information Subset (2 of 3)", "wlan.ht.info.delim2",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_wfa_ie_wpa_version,
+ {"WPA Version", "wlan.wfa.ie.wpa.version",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_operating_mode,
- {"Operating mode of BSS", "wlan.ht.info.operatingmode",
- FT_UINT16, BASE_HEX, VALS(ht_info_operating_mode_flags), 0x0003,
- NULL, HFILL }},
+ {&hf_ieee80211_wfa_ie_wpa_mcs,
+ {"Multicast Cipher Suite", "wlan.wfa.ie.wpa.mcs",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_mcs_base_custom), 0,
+ "Contains the cipher suite selector used by the BSS to protect broadcast/multicasttraffic", HFILL }},
- {&hf_ieee80211_ht_info_non_greenfield_sta_present,
- {"Non-greenfield STAs present", "wlan.ht.info.greenfield",
- FT_BOOLEAN, 16, TFS(&ht_info_non_greenfield_sta_present_flag), 0x0004,
+ {&hf_ieee80211_wfa_ie_wpa_mcs_oui,
+ {"Multicast Cipher Suite OUI", "wlan.wfa.ie.wpa.mcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_transmit_burst_limit,
- {"Transmit burst limit", "wlan.ht.info.burstlim",
- FT_BOOLEAN, 16, TFS(&ht_info_transmit_burst_limit_flag), 0x0008,
+ {&hf_ieee80211_wfa_ie_wpa_mcs_type,
+ {"Multicast Cipher Suite type", "wlan.wfa.ie.wpa.mcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_obss_non_ht_stas_present,
- {"OBSS non-HT STAs present", "wlan.ht.info.obssnonht",
- FT_BOOLEAN, 16, TFS(&ht_info_obss_non_ht_stas_present_flag), 0x0010,
+ {&hf_ieee80211_wfa_ie_wpa_mcs_wfa_type,
+ {"Multicast Cipher Suite type", "wlan.wfa.ie.wpa.mcs.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_cipher_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_reserved_1,
- {"Reserved", "wlan.ht.info.reserved1",
- FT_UINT16, BASE_HEX, NULL, 0xffe0,
- NULL, HFILL }},
+ {&hf_ieee80211_wfa_ie_wpa_ucs_count,
+ {"Unicast Cipher Suite Count", "wlan.wfa.ie.wpa.ucs.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the number of pairwise cipher suite selectors that are contained in the Unicast Cipher Suite List", HFILL }},
- {&hf_ieee80211_ht_info_delimiter3,
- {"HT Information Subset (3 of 3)", "wlan.ht.info.delim3",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_wfa_ie_wpa_ucs_list,
+ {"Unicast Cipher Suite List", "wlan.wfa.ie.wpa.ucs.list",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "Contains a series of cipher suite selectors that indicate the Unicast cipher suites", HFILL }},
- {&hf_ieee80211_ht_info_reserved_2,
- {"Reserved", "wlan.ht.info.reserved2",
- FT_UINT16, BASE_HEX, NULL, 0x003f,
+ {&hf_ieee80211_wfa_ie_wpa_ucs,
+ {"Unicast Cipher Suite", "wlan.wfa.ie.wpa.ucs",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_ucs_base_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_dual_beacon,
- {"Dual beacon", "wlan.ht.info.dualbeacon",
- FT_BOOLEAN, 16, TFS(&ht_info_dual_beacon_flag), 0x0040,
+ {&hf_ieee80211_wfa_ie_wpa_ucs_oui,
+ {"Unicast Cipher Suite OUI", "wlan.wfa.ie.wpau.cs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_dual_cts_protection,
- {"Dual Clear To Send (CTS) protection", "wlan.ht.info.dualcts",
- FT_BOOLEAN, 16, TFS(&ht_info_dual_cts_protection_flag), 0x0080,
+ {&hf_ieee80211_wfa_ie_wpa_ucs_type,
+ {"Unicast Cipher Suite type", "wlan.wfa.ie.wpa.ucs.type",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_secondary_beacon,
- {"Beacon ID", "wlan.ht.info.secondarybeacon",
- FT_BOOLEAN, 16, TFS(&ht_info_secondary_beacon_flag), 0x0100,
+ {&hf_ieee80211_wfa_ie_wpa_ucs_wfa_type,
+ {"Unicast Cipher Suite type", "wlan.wfa.ie.wpa.ucs.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_cipher_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_lsig_txop_protection_full_support,
- {"L-SIG TXOP Protection Full Support", "wlan.ht.info.lsigprotsupport",
- FT_BOOLEAN, 16, TFS(&ht_info_lsig_txop_protection_full_support_flag), 0x0200,
- NULL, HFILL }},
+ {&hf_ieee80211_wfa_ie_wpa_akms_count,
+ {"Auth Key Management (AKM) Suite Count", "wlan.wfa.ie.wpa.akms.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Indicates the number of Auth Key Management suite selectors that are contained in the Auth Key Management Suite List", HFILL }},
- {&hf_ieee80211_ht_info_pco_active,
- {"Phased Coexistence Operation (PCO)", "wlan.ht.info.pco.active",
- FT_BOOLEAN, 16, TFS(&tfs_active_inactive), 0x0400,
- NULL, HFILL }},
+ {&hf_ieee80211_wfa_ie_wpa_akms_list,
+ {"Auth Key Management (AKM) List", "wlan.wfa.ie.wpa.akms.list",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
- {&hf_ieee80211_ht_info_pco_phase,
- {"Phased Coexistence Operation (PCO) Phase", "wlan.ht.info.pco.phase",
- FT_BOOLEAN, 16, TFS(&ht_info_pco_phase_flag), 0x0800,
+ {&hf_ieee80211_wfa_ie_wpa_akms,
+ {"Auth Key Management (AKM) Suite", "wlan.wfa.ie.wpa.akms",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_akms_base_custom), 0,
NULL, HFILL }},
- {&hf_ieee80211_ht_info_reserved_3,
- {"Reserved", "wlan.ht.info.reserved3",
- FT_UINT16, BASE_HEX, NULL, 0xf000,
+ {&hf_ieee80211_wfa_ie_wpa_akms_oui,
+ {"Auth Key Management (AKM) OUI", "wlan.wfa.ie.wpa.akms.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_ap_channel_report_operating_class,
- {"Operating Class", "wlan.ap_channel_report.operating_class",
+ {&hf_ieee80211_wfa_ie_wpa_akms_type,
+ {"Auth Key Management (AKM) type", "wlan.wfa.ie.wpa.akms.type",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_ap_channel_report_channel_list,
- {"Channel List", "wlan.ap_channel_report.channel_list",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_wfa_ie_wpa_akms_wfa_type,
+ {"Auth Key Management (AKM) type", "wlan.wfa.ie.wpa.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_keymgmt_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_secondary_channel_offset,
- {"Secondary Channel Offset", "wlan.secchanoffset",
- FT_UINT8, BASE_HEX, VALS(ieee80211_tag_secondary_channel_offset_flags), 0,
+ {&hf_ieee80211_wfa_ie_wme_subtype,
+ {"WME Subtype", "wlan.wfa.ie.wme.subtype",
+ FT_UINT8, BASE_DEC, VALS(ieee802111_wfa_ie_wme_type), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_ap_avg_access_delay,
- {"AP Average Access Delay", "wlan.bss_ap_avg_access_delay",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_wfa_ie_wme_version,
+ {"WME Version", "wlan.wfa.ie.wme.version",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_antenna_id,
- {"Antenna ID", "wlan.antenna.id",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_wfa_ie_wme_qos_info,
+ {"WME QoS Info", "wlan.wfa.ie.wme.qos_info",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rsni,
- {"RSNI", "wlan.rsni",
- FT_UINT8, BASE_CUSTOM, CF_FUNC(rsni_base_custom), 0x0,
+ {&hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length,
+ {"Max SP Length", "wlan.wfa.ie.wme.qos_info.sta.max_sp_length",
+ FT_UINT8, BASE_HEX, VALS(ieee802111_wfa_ie_wme_qos_info_sta_max_sp_length_vals), 0x60,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask,
- {"Available Admission Capacity Bitmask", "wlan.bss_avb_adm_cap.bitmask",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up0,
- {"UP0 (bit0)", "wlan.bss_avb_adm_cap.bitmask.up0",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP0,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up1,
- {"UP1 (bit1)", "wlan.bss_avb_adm_cap.bitmask.up1",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP1,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up2,
- {"UP2 (bit2)", "wlan.bss_avb_adm_cap.bitmask.up2",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP2,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up3,
- {"UP3 (bit3)", "wlan.bss_avb_adm_cap.bitmask.up3",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP3,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up4,
- {"UP4 (bit4)", "wlan.bss_avb_adm_cap.bitmask.up4",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP4,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up5,
- {"UP5 (bit5)", "wlan.bss_avb_adm_cap.bitmask.up5",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP5,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up6,
- {"UP0 (bit6)", "wlan.bss_avb_adm_cap.bitmask.up6",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP6,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_up7,
- {"UP7 (bit7)", "wlan.bss_avb_adm_cap.bitmask.up7",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_UP7,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac0,
- {"AC0 (bit8)", "wlan.bss_avb_adm_cap.bitmask.ac0",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC0,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac1,
- {"AC1 (bit9)", "wlan.bss_avb_adm_cap.bitmask.AC1",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC1,
- NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac2,
- {"AC2 (bit10)", "wlan.bss_avb_adm_cap.bitmask.ac2",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC2,
+ {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be,
+ {"AC_BE", "wlan.wfa.ie.wme.qos_info.sta.ac_be",
+ FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x08,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_ac3,
- {"AC3 (bit11)", "wlan.bss_avb_adm_cap.bitmask.ac3",
- FT_BOOLEAN, 16, TFS(&tfs_set_notset), BSS_BITMASK_AC3,
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk,
+ {"AC_BK", "wlan.wfa.ie.wme.qos_info.sta.ac_bk",
+ FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x04,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_bitmask_rsv,
- {"Reserved", "wlan.bss_avb_adm_cap.bitmask.rsv",
- FT_UINT16, BASE_HEX, NULL, BSS_BITMASK_RSV,
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi,
+ {"AC_VI", "wlan.wfa.ie.wme.qos_info.sta.ac_vi",
+ FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x02,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up0,
- {"UP0", "wlan.bss_avb_adm_cap.up0",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo,
+ {"AC_VO", "wlan.wfa.ie.wme.qos_info.sta.ac_vo",
+ FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up1,
- {"UP1", "wlan.bss_avb_adm_cap.up1",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved,
+ {"Reserved", "wlan.wfa.ie.wme.qos_info.sta.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x90,
+ "Must Be Zero", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd,
+ {"U-APSD", "wlan.wfa.ie.wme.qos_info.ap.u_apsd",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
+ "Indicates the WMM AP is currently supporting unscheduled automatic power save delivery", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count,
+ {"Parameter Set Count", "wlan.wfa.ie.wme.qos_info.ap.parameter_set_count",
+ FT_UINT8, BASE_HEX, NULL, 0x0F,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up2,
- {"UP2", "wlan.bss_avb_adm_cap.up2",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved,
+ {"Reserved", "wlan.wfa.ie.wme.qos_info.ap.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x70,
+ "Must Be Zero", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_reserved,
+ {"Reserved", "wlan.wfa.ie.wme.reserved",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Must Be Zero", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_ac_parameters,
+ {"Ac Parameters", "wlan.wfa.ie.wme.acp",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up3,
- {"UP3", "wlan.bss_avb_adm_cap.up3",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_aci_aifsn,
+ {"ACI / AIFSN Field", "wlan.wfa.ie.wme.acp.aci_aifsn",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up4,
- {"UP4", "wlan.bss_avb_adm_cap.up4",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_aci,
+ {"ACI", "wlan.wfa.ie.wme.acp.aci",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up5,
- {"UP5", "wlan.bss_avb_adm_cap.up5",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_acm,
+ {"Admission Control Mandatory", "wlan.wfa.ie.wme.acp.acm",
+ FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up6,
- {"UP6", "wlan.bss_avb_adm_cap.up6",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_aifsn,
+ {"AIFSN", "wlan.wfa.ie.wme.acp.aifsn",
+ FT_UINT8, BASE_DEC, NULL, 0x0F,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_up7,
- {"UP7", "wlan.bss_avb_adm_cap.up7",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_reserved,
+ {"Reserved", "wlan.wfa.ie.wme.acp.reserved",
+ FT_UINT8, BASE_DEC, NULL, 0x80,
+ "Must be Zero", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_acp_ecw,
+ {"ECW", "wlan.wfa.ie.wme.acp.ecw",
+ FT_UINT8, BASE_HEX, NULL, 0x00,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_ac0,
- {"AC0", "wlan.bss_avb_adm_cap.ac0",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_ecw_max,
+ {"ECW Max", "wlan.wfa.ie.wme.acp.ecw.max",
+ FT_UINT8, BASE_DEC, NULL, 0xF0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_ac1,
- {"AC1", "wlan.bss_avb_adm_cap.ac1",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_ecw_min,
+ {"ECW Min", "wlan.wfa.ie.wme.acp.ecw.min",
+ FT_UINT8, BASE_DEC, NULL, 0x0F,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_ac2,
- {"AC2", "wlan.bss_avb_adm_cap.ac2",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_cw_max,
+ {"CW Max", "wlan.wfa.ie.wme.acp.cw.max",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avb_adm_cap_ac3,
- {"AC3", "wlan.bss_avb_adm_cap.ac3",
- FT_UINT16, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_acp_cw_min,
+ {"CW Min", "wlan.wfa.ie.wme.acp.cw.min",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avg_ac_access_delay_be,
- {"AC Average Access Delay for Best Effort", "wlan.bss_avg_ac_access_delay.be",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+ {&hf_ieee80211_wfa_ie_wme_acp_txop_limit,
+ {"TXOP Limit", "wlan.wfa.ie.wme.acp.txop_limit",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avg_ac_access_delay_bk,
- {"AC Average Access Delay for Best Background", "wlan.bss_avg_ac_access_delay.bk",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo,
+ {"TS Info", "wlan.wfa.ie.wme.tspec.ts_info",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ "Traffic Stream (TS) Info", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid,
+ {"TID", "wlan.wfa.ie.wme.tspec.ts_info.tid",
+ FT_UINT24, BASE_DEC, NULL, 0x00001E,
+ "Traffic Stream Info ID (TID)", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction,
+ {"Direction", "wlan.wfa.ie.wme.tspec.ts_info.dir",
+ FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_direction_vals), 0x000060,
+ "Traffic Stream (TS) Info Direction", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb,
+ {"PSB", "wlan.wfa.ie.wme.tspec.ts_info.psb",
+ FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_psb_vals), 0x000400,
+ "Traffic Stream (TS) Info Power Save Behavior (PSB)", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up,
+ {"UP", "wlan.wfa.ie.wme.tspec.ts_info.up",
+ FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_up_vals), 0x003800,
+ "Traffic Stream (TS) Info User Priority (UP)", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved,
+ {"Reserved", "wlan.wfa.ie.wme.tspec.ts_info.reserved",
+ FT_UINT24, BASE_HEX, NULL, 0xFFC381,
+ "Must be Zero", HFILL }},
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_nor_msdu,
+ {"Normal MSDU Size", "wlan.wfa.ie.wme.tspec.nor_msdu",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avg_ac_access_delay_vi,
- {"AC Average Access Delay for Video", "wlan.bss_avg_ac_access_delay_vi",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_max_msdu,
+ {"Maximum MSDU Size", "wlan.wfa.ie.wme.tspec.max_msdu",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_bss_avg_ac_access_delay_vo,
- {"AC Average Access Delay for Voice", "wlan.bss_avg_ac_access_delay_vo",
- FT_UINT8, BASE_DEC, NULL, 0x0,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_min_srv,
+ {"Minimum Service Interval", "wlan.wfa.ie.wme.tspec.min_srv",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
+ {&hf_ieee80211_wfa_ie_wme_tspec_max_srv,
+ {"Maximum Service Interval", "wlan.wfa.ie.wme.tspec.max_srv",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* 802.11-2012 Table 8-119-RM Enabled Capabilities definition */
- {&hf_ieee80211_tag_rm_enabled_capabilities,
- {"RM Capabilities", "wlan.rmcap",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Signals support for radio measurements in a device", HFILL }},
+ {&hf_ieee80211_wfa_ie_wme_tspec_inact_int,
+ {"Inactivity Interval", "wlan.wfa.ie.wme.tspec.inact_int",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- /* RM Enabled Capability octet 1 */
- {&hf_ieee80211_tag_rm_enabled_capabilities_b0,
- {"Link Measurement", "wlan.rmcap.b0",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ {&hf_ieee80211_wfa_ie_wme_tspec_susp_int,
+ {"Suspension Interval", "wlan.wfa.ie.wme.tspec.susp_int",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b1,
- {"Neighbor Report", "wlan.rmcap.b1",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_srv_start,
+ {"Service Start Time", "wlan.wfa.ie.wme.tspec.srv_start",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b2,
- {"Parallel Measurements", "wlan.rmcap.b2",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_min_data,
+ {"Minimum Data Rate", "wlan.wfa.ie.wme.tspec.min_data",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b3,
- {"Repeated Measurements", "wlan.rmcap.b3",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_mean_data,
+ {"Mean Data Rate", "wlan.wfa.ie.wme.tspec.mean_data",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b4,
- {"Beacon Passive Measurement", "wlan.rmcap.b4",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_peak_data,
+ {"Peak Data Rate", "wlan.wfa.ie.wme.tspec.peak_data",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b5,
- {"Beacon Active Measurement", "wlan.rmcap.b5",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_burst_size,
+ {"Burst Size", "wlan.wfa.ie.wme.tspec.burst_size",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b6,
- {"Beacon Table Measurement", "wlan.rmcap.b6",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_delay_bound,
+ {"Delay Bound", "wlan.wfa.ie.wme.tspec.delay_bound",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b7,
- {"Beacon Measurement Reporting Conditions", "wlan.rmcap.b7",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_min_phy,
+ {"Minimum PHY Rate", "wlan.wfa.ie.wme.tspec.min_phy",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- /* RM Enabled Capability octet 2 */
- {&hf_ieee80211_tag_rm_enabled_capabilities_b8,
- {"Frame Measurement", "wlan.rmcap.b8",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ {&hf_ieee80211_wfa_ie_wme_tspec_surplus,
+ {"Surplus Bandwidth Allowance", "wlan.wfa.ie.wme.tspec.surplus",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b9,
- {"Channel Load Measurement", "wlan.rmcap.b9",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+
+ {&hf_ieee80211_wfa_ie_wme_tspec_medium,
+ {"Medium Time", "wlan.wfa.ie.wme.tspec.medium",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b10,
- {"Noise Histogram Measurement", "wlan.rmcap.b10",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04,
+
+ {&hf_ieee80211_rsn_ie_pmkid,
+ {"RSN PMKID", "wlan.rsn.ie.pmkid",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b11,
- {"Statistics Measurement", "wlan.rmcap.b11",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
+
+ {&hf_ieee80211_rsn_ie_unknown,
+ {"RSN Unknown", "wlan.rsn.ie.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b12,
- {"LCI Measurement", "wlan.rmcap.b12",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
+
+ {&hf_ieee80211_marvell_ie_type,
+ {"Type", "wlan.marvell.ie.type",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b13,
- {"LCI Azimuth capability", "wlan.rmcap.b13",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
+
+ {&hf_ieee80211_marvell_ie_mesh_subtype,
+ {"Subtype", "wlan.marvell.ie.subtype",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b14,
- {"Transmit Stream/Category Measurement", "wlan.rmcap.b14",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+
+ {&hf_ieee80211_marvell_ie_mesh_version,
+ {"Version", "wlan.marvell.ie.version",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b15,
- {"Triggered Transmit Stream/Category Measurement", "wlan.rmcap.b15",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
+
+ {&hf_ieee80211_marvell_ie_mesh_active_proto_id,
+ {"Path Selection Protocol", "wlan.marvell.ie.proto_id",
+ FT_UINT8, BASE_HEX, VALS(mesh_path_selection_codes), 0,
NULL, HFILL }},
- /* RM Enabled Capability octet 3 */
- {&hf_ieee80211_tag_rm_enabled_capabilities_b16,
- {"AP Channel Report capability", "wlan.rmcap.b16",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ {&hf_ieee80211_marvell_ie_mesh_active_metric_id,
+ {"Path Selection Metric", "wlan.marvell.ie.metric_id",
+ FT_UINT8, BASE_HEX, VALS(mesh_metric_codes), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b17,
- {"RM MIB capability", "wlan.rmcap.b17",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+
+ {&hf_ieee80211_marvell_ie_mesh_cap,
+ {"Mesh Capabilities", "wlan.marvell.ie.cap",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b18to20,
- {"Operating Channel Max Measurement Duration", "wlan.rmcap.b18to20",
- FT_UINT8, BASE_DEC, NULL, 0x1C,
+
+ {&hf_ieee80211_marvell_ie_data,
+ { "Marvell IE data", "wlan.marvell.data",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_atheros_ie_type,
+ {"Type", "wlan.atheros.ie.type",
+ FT_UINT8, BASE_HEX, VALS(atheros_ie_type_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b21to23,
- {"Nonoperating Channel Max Measurement Duration", "wlan.rmcap.b21to23",
- FT_UINT8, BASE_DEC, NULL, 0xE0,
+
+ {&hf_ieee80211_atheros_ie_subtype,
+ {"Subtype", "wlan.atheros.ie.subtype",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- /* RM Enabled Capability octet 4 */
- {&hf_ieee80211_tag_rm_enabled_capabilities_b24to26,
- {"Measurement Pilotcapability", "wlan.rmcap.b24to26",
- FT_UINT8, BASE_DEC, NULL, 0x07,
+ {&hf_ieee80211_atheros_ie_version,
+ {"Version", "wlan.atheros.ie.version",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b27,
- {"Measurement Pilot Transmission Information", "wlan.rmcap.b27",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
+
+ {&hf_ieee80211_atheros_ie_cap_f_turbop,
+ {"Turbo Prime", "wlan.ie.atheros.capabilities.turbop",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_TURBOP,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b28,
- {"Neighbor Report TSF Offset", "wlan.rmcap.b28",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10,
+
+ {&hf_ieee80211_atheros_ie_cap_f_comp,
+ {"Compression", "wlan.ie.atheros.capabilities.comp",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_COMP,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b29,
- {"RCPI Measurement capability", "wlan.rmcap.b29",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
+
+ {&hf_ieee80211_atheros_ie_cap_f_ff,
+ {"Fast Frames", "wlan.ie.atheros.capabilities.ff",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_FF,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b30,
- {"RSNI Measurement capability", "wlan.rmcap.b30",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
+
+ {&hf_ieee80211_atheros_ie_cap_f_xr,
+ {"eXtended Range", "wlan.ie.atheros.capabilities.xr",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_XR,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b31,
- {"BSS Average Access Delay capability", "wlan.rmcap.b31",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
+
+ {&hf_ieee80211_atheros_ie_cap_f_ar,
+ {"Advanced Radar", "wlan.ie.atheros.capabilities.ar",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_AR,
NULL, HFILL }},
- /* RM Enabled Capability octet 5 */
- {&hf_ieee80211_tag_rm_enabled_capabilities_b32,
- {"BSS Available Admission Capacity capability", "wlan.rmcap.b32",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ {&hf_ieee80211_atheros_ie_cap_f_burst,
+ {"Burst", "wlan.ie.atheros.capabilities.burst",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_BURST,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_b33,
- {"Antenna capability", "wlan.rmcap.b33",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+
+ {&hf_ieee80211_atheros_ie_cap_f_wme,
+ {"CWMin tuning", "wlan.ie.atheros.capabilities.wme",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_WME,
NULL, HFILL }},
- {&hf_ieee80211_tag_rm_enabled_capabilities_o5,
- {"Reserved", "wlan.rmcap.o5",
- FT_UINT8, BASE_HEX, NULL, 0xFC,
- "Must be zero", HFILL }},
- /* 20/40 BSS Coexistence */
- {&hf_ieee80211_tag_20_40_bc,
- {"20/40 BSS Coexistence Flags", "wlan.20_40_bc",
- FT_UINT8, BASE_HEX, NULL, 0x0,
+ {&hf_ieee80211_atheros_ie_cap_f_boost,
+ {"Boost", "wlan.ie.atheros.capabilities.boost",
+ FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_BOOST,
NULL, HFILL }},
- {&hf_ieee80211_tag_20_40_bc_information_request,
- {"Information Request", "wlan.20_40_bc.information_request",
- FT_BOOLEAN, 8, NULL, 0x01,
+
+ {&hf_ieee80211_atheros_ie_advcap_cap,
+ {"Capabilities", "wlan.atheros.ie.advcap.cap",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant,
- {"Forty MHz Intolerant", "wlan.20_40_bc.forty_mhz_intolerant",
- FT_BOOLEAN, 8, NULL, 0x02,
+
+ {&hf_ieee80211_atheros_ie_advcap_defkey,
+ {"Default key index", "wlan.atheros.ie.advcap.defkey",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_20_40_bc_20_mhz_bss_witdh_request,
- {"20 MHz BSS Witdh Request", "wlan.20_40_bc.20_mhz_bss_witdh_request",
- FT_BOOLEAN, 8, NULL, 0x04,
+
+ {&hf_ieee80211_atheros_ie_xr_info,
+ {"Info", "wlan.atheros.ie.xr.info",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_request,
- {"OBSS Scanning Exemption Request", "wlan.20_40_bc.obss_scanning_exemption_request",
- FT_BOOLEAN, 8, NULL, 0x08,
+
+ {&hf_ieee80211_atheros_ie_xr_base_bssid,
+ {"Base BSS Id", "wlan.atheros.ie.xr.base_bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_20_40_bc_obss_scanning_exemption_grant,
- {"OBSS Scanning Exemption Grant", "wlan.20_40_bc.obss_scanning_exemption_grant",
- FT_BOOLEAN, 8, NULL, 0x10,
+
+ {&hf_ieee80211_atheros_ie_xr_xr_bssid,
+ {"XR BSS Id", "wlan.atheros.ie.xr.xr_bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_20_40_bc_reserved,
- {"Reserved", "wlan.20_40_bc.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xE0,
- "Must be zero", HFILL }},
+ {&hf_ieee80211_atheros_ie_xr_xr_beacon,
+ {"XR Beacon Interval", "wlan.atheros.ie.xr.xr_beacon",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_power_constraint_local,
- {"Local Power Constraint", "wlan.powercon.local",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Value that allows the mitigation requirements to be satisfied in the current channel", HFILL }},
+ {&hf_ieee80211_atheros_ie_xr_base_cap,
+ {"Base capabilities", "wlan.atheros.ie.xr.base_cap",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_power_capability_min,
- {"Minimum Transmit Power", "wlan.powercap.min",
- FT_UINT8, BASE_DEC_HEX, NULL, 0,
- "The nominal minimum transmit power with which the STA is capable of transmitting in the current channel", HFILL }},
+ {&hf_ieee80211_atheros_ie_xr_xr_cap,
+ {"XR capabilities", "wlan.atheros.ie.xr.xr_cap",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_power_capability_max,
- {"Maximum Transmit Power", "wlan.powercap.max",
- FT_UINT8, BASE_DEC_HEX, NULL, 0,
- "The nominal maximum transmit power with which the STA is capable of transmitting in the current channel", HFILL }},
+ {&hf_ieee80211_atheros_ie_data,
+ {"Atheros IE data", "wlan.atheros.data",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_tpc_report_trsmt_pow,
- {"Transmit Power", "wlan.tcprep.trsmt_pow",
- FT_INT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_aironet_ie_type,
+ {"Aironet IE type", "wlan.aironet.type",
+ FT_UINT8, BASE_DEC, VALS(aironet_ie_type_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_tpc_report_link_mrg,
- {"Link Margin", "wlan.tcprep.link_mrg",
- FT_INT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_aironet_ie_dtpc,
+ {"Aironet IE CCX DTCP", "wlan.aironet.dtpc",
+ FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_supported_channels,
- {"Supported Channels Set", "wlan.supchan",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_aironet_ie_dtpc_unknown,
+ {"Aironet IE CCX DTCP Unknown", "wlan.aironet.dtpc_unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_supported_channels_first,
- {"First Supported Channel", "wlan.supchan.first",
+ {&hf_ieee80211_aironet_ie_version,
+ {"Aironet IE CCX version", "wlan.aironet.version",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_supported_channels_range,
- {"Supported Channel Range", "wlan.supchan.range",
+ {&hf_ieee80211_aironet_ie_data,
+ { "Aironet IE data", "wlan.aironet.data",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_qbss_version,
+ {"QBSS Version", "wlan.qbss.version",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_csa_channel_switch_mode,
- {"Channel Switch Mode", "wlan.csa.channel_switch_mode",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Indicates any restrictions on transmission until a channel switch", HFILL }},
+ {&hf_ieee80211_qbss_scount,
+ {"Station Count", "wlan.qbss.scount",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_csa_new_channel_number,
- {"New Channel Number", "wlan.csa.new_channel_number",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Set to the number of the channel to which the STA is moving", HFILL }},
+ {&hf_ieee80211_qbss_cu,
+ {"Channel Utilization", "wlan.qbss.cu",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_csa_channel_switch_count,
- {"Channel Switch Count", "wlan.csa.channel_switch.count",
+ {&hf_ieee80211_qbss_adc,
+ {"Available Admission Capacity", "wlan.qbss.adc",
FT_UINT8, BASE_DEC, NULL, 0,
- "Set to the number of TBTTs until the STA sending the Channel Switch Announcement element switches to the new channel or shall be set to 0", HFILL }},
+ NULL, HFILL }},
- {&hf_ieee80211_mesh_channel_switch_ttl,
- {"Mesh Channel Switch TTL", "wlan.csa.mesh_channel_switch.ttl",
+ {&hf_ieee80211_qbss2_cu,
+ {"Channel Utilization", "wlan.qbss2.cu",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_channel_switch_flag,
- {"Mesh Channel Switch Flag", "wlan.csa.mesh_channel_switch.flag",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_qbss2_gl,
+ {"G.711 CU Quantum", "wlan.qbss2.glimit",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_chswitch_flag_txrestrict,
- {"CSA Tx Restrict", "wlan.csa.mesh_channel_switch.flag.txrestrict",
- FT_BOOLEAN, 16, TFS(&csa_txrestrict_flags), 0x0001,
+ {&hf_ieee80211_qbss2_cal,
+ {"Call Admission Limit", "wlan.qbss2.cal",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_chswitch_flag_initiator,
- {"CSA Initiator", "wlan.csa.mesh_channel_switch.flag.initiator",
- FT_BOOLEAN, 16, TFS(&csa_initiator_flags), 0x0002,
+ {&hf_ieee80211_qbss2_scount,
+ {"Station Count", "wlan.qbss2.scount",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_channel_switch_reason_code,
- {"Mesh Channel Switch Reason Code", "wlan.csa.mesh_channel_switch.reason_code",
- FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_reason_code_ext, 0,
+ {&hf_ieee80211_aironet_ie_qos_reserved,
+ {"Aironet IE QoS reserved", "wlan.aironet.qos.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_channel_switch_precedence_value,
- {"Mesh Channel Switch Precedence Value", "wlan.csa.mesh_channel_switch.pre_value",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_aironet_ie_qos_paramset,
+ {"Aironet IE QoS paramset", "wlan.aironet.qos.paramset",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_aironet_ie_qos_val,
+ {"Aironet IE QoS valueset", "wlan.aironet.qos.val",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_mesh_awake_window,
- {"Mesh Awake Window", "wlan.mesh.mesh_awake_window",
- FT_UINT16, BASE_CUSTOM, CF_FUNC(mesh_active_window_base_custom), 0,
+ {&hf_ieee80211_aironet_ie_clientmfp,
+ {"Aironet IE Client MFP", "wlan.aironet.clientmfp",
+ FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_token,
- {"Measurement Token", "wlan.measure.req.token",
- FT_UINT8, BASE_HEX, NULL, 0xff,
+ /* Vendor Specific : Nintendo */
+ {&hf_ieee80211_vs_nintendo_type,
+ {"Type", "wlan.vs.nintendo.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_vs_nintendo_type_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode,
- {"Measurement Request Mode", "wlan.measure.req.mode",
- FT_UINT8, BASE_HEX, NULL, 0xff,
+ {&hf_ieee80211_vs_nintendo_length,
+ {"Length", "wlan.vs.nintendo.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode_parallel,
- {"Parallel", "wlan.measure.req.reqmode.parallel",
- FT_BOOLEAN, 8, NULL, 0x01,
+ {&hf_ieee80211_vs_nintendo_servicelist,
+ {"Servicelist", "wlan.vs.nintendo.servicelist",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode_enable,
- {"Measurement Request Mode Field", "wlan.measure.req.reqmode.enable",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
+ {&hf_ieee80211_vs_nintendo_service,
+ {"Service", "wlan.vs.nintendo.service",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode_request,
- {"Measurement Reports", "wlan.measure.req.reqmode.request",
- FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x04,
+ {&hf_ieee80211_vs_nintendo_consoleid,
+ {"Console ID", "wlan.vs.nintendo.consoleid",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode_report,
- {"Autonomous Measurement Reports", "wlan.measure.req.reqmode.report",
- FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x08,
+ {&hf_ieee80211_vs_nintendo_unknown,
+ {"Unknown", "wlan.vs.nintendo.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode_duration_mandatory,
- {"Duration Mandatory", "wlan.measure.req.reqmode.duration_mandatory",
- FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x10,
+ /* Vendor Specific : Aruba Networks */
+ {&hf_ieee80211_vs_aruba_subtype,
+ {"Subtype", "wlan.vs.aruba.subtype",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_vs_aruba_subtype_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_mode_reserved,
- {"Reserved", "wlan.measure.req.reqmode.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xE0,
+ {&hf_ieee80211_vs_aruba_apname,
+ {"AP Name", "wlan.vs.aruba.ap_name",
+ FT_STRINGZ, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_type,
- {"Measurement Request Type", "wlan.measure.req.reqtype",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_request_type_flags_ext, 0x00,
+ {&hf_ieee80211_vs_aruba_data,
+ {"Data", "wlan.vs.aruba.data",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_channel_number,
- {"Measurement Channel Number", "wlan.measure.req.channelnumber",
- FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
+ {&hf_ieee80211_vs_mikrotik_unknown,
+ {"Unknown", "wlan.vs.mikrotik.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_start_time,
- {"Measurement Start Time", "wlan.measure.req.starttime",
- FT_UINT64, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_vs_mikrotik_subitem,
+ {"Sub IE", "wlan.vs.mikrotik.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_duration,
- {"Measurement Duration", "wlan.measure.req.channelnumber",
- FT_UINT16, BASE_HEX, NULL, 0,
- "in TU (1 TU = 1024 us)", HFILL }},
+ {&hf_ieee80211_vs_mikrotik_subtype,
+ {"Subtype", "wlan.vs.mikrotik.subtype",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_operating_class,
- {"Operating Class", "wlan.measure.req.operatingclass",
+ {&hf_ieee80211_vs_mikrotik_sublength,
+ {"Sublength", "wlan.vs.mikrotik.sublength",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_randomization_interval,
- {"Randomization Interval", "wlan.measure.req.randint",
- FT_UINT16, BASE_HEX, NULL, 0,
- "in TU (1 TU = 1024 us)", HFILL }},
+ {&hf_ieee80211_vs_mikrotik_subdata,
+ {"Subdata", "wlan.vs.mikrotik.subdata",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_measurement_mode,
- {"Measurement Mode", "wlan.measure.req.measurementmode",
- FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_measurement_mode_flags), 0,
+ /* Vendor Specific : Meru (Fortinet) */
+ {&hf_ieee80211_vs_meru_subitem,
+ {"Sub IE", "wlan.vs.meru.unknown",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_bssid,
- {"BSSID", "wlan.measure.req.bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_vs_meru_subtype,
+ {"Subtype", "wlan.vs.meru.subtype",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_subelement_length,
- {"Length", "wlan.measure.req.sub.length",
+ {&hf_ieee80211_vs_meru_sublength,
+ {"Sublength", "wlan.vs.meru.sublength",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_sub_id,
- {"SubElement ID", "wlan.measure.req.beacon.sub.id",
- FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_beacon_sub_id_flags), 0,
+ {&hf_ieee80211_vs_meru_subdata,
+ {"Subdata", "wlan.vs.meru.subdata",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_sub_ssid,
- {"SSID", "wlan.measure.req.beacon.sub.ssid",
- FT_STRING, BASE_NONE, 0, 0,
+ /* Vendor Specific : Extreme (Zebra) */
+ {&hf_ieee80211_vs_extreme_subtype,
+ {"Subtype", "wlan.vs.extreme.subtype",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_vs_extreme_subtype_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition,
- {"Reporting Condition", "wlan.measure.req.beacon.sub.bri.repcond",
- FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_beacon_sub_bri_reporting_condition_flags), 0,
+ {&hf_ieee80211_vs_extreme_subdata,
+ {"Subdata", "wlan.vs.extreme.subdata",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_sub_bri_threshold_offset,
- {"Threshold/Offset", "wlan.measure.req.beacon.sub.bri.threshold_offset",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_vs_extreme_unknown,
+ {"Unknown", "wlan.vs.extreme.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_sub_reporting_detail,
- {"Reporting Detail", "wlan.measure.req.beacon.sub.bri.reporting_detail",
- FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_beacon_sub_reporting_detail_flags), 0,
+ {&hf_ieee80211_vs_extreme_ap_length,
+ {"AP Length", "wlan.vs.extreme.ap_length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_sub_request,
- {"Request", "wlan.measure.req.beacon.sub.request",
- FT_UINT8, BASE_DEC, 0, 0,
+ {&hf_ieee80211_vs_extreme_ap_name,
+ {"AP Name", "wlan.vs.extreme.ap_name",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_beacon_unknown,
- {"Unknown Data", "wlan.measure.req.beacon.unknown",
+ /* Vendor Specific : Aerohive */
+ {&hf_ieee80211_vs_aerohive_unknown,
+ {"Unknown", "wlan.vs.aerohive.unknown",
FT_BYTES, BASE_NONE, NULL, 0,
- "(not interpreted)", HFILL }},
-
- {&hf_ieee80211_tag_measure_request_channel_load_sub_id,
- {"SubElement ID", "wlan.measure.req.channel_load.sub.id",
- FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_channel_load_sub_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_channel_load_sub_reporting_condition,
- {"Reporting Condition", "wlan.measure.req.channel_load.sub.repcond",
- FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_channel_load_sub_reporting_condition_vals), 0,
+ {&hf_ieee80211_vs_aerohive_hostname_length,
+ {"Host Name Length", "wlan.vs.aerohive.hostname_length",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_channel_load_sub_reporting_ref,
- {"Reference Value", "wlan.measure.req.channel_load.sub.ref",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_vs_aerohive_hostname,
+ {"Host Name", "wlan.vs.aerohive.hostname",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
-
- {&hf_ieee80211_tag_measure_request_noise_histogram_sub_id,
- {"SubElement ID", "wlan.measure.req.noise_histogram.sub.id",
- FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_request_noise_histogram_sub_id_vals), 0,
+ {&hf_ieee80211_vs_aerohive_data,
+ {"Data", "wlan.vs.aerohive.data",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition,
- {"Reporting Condition", "wlan.measure.reqnoise_histogram.sub.repcond",
- FT_UINT8, BASE_HEX, VALS(ieee80211_tag_measure_request_noise_histogram_sub_reporting_condition_vals), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo,
+ {"Traffic Stream (TS) Info", "wlan.ts_info",
+ FT_UINT24, BASE_HEX, NULL, 0,
+ "Traffic Stream (TS) Info field", HFILL }},
- {&hf_ieee80211_tag_measure_request_noise_histogram_sub_reporting_anpi_ref,
- {"ANPI Reference Value", "wlan.measure.req.noise_histogram.sub.anpiref",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_type,
+ {"Traffic Type", "wlan.ts_info.type",
+ FT_UINT24, BASE_DEC, VALS(tsinfo_type), 0x000001,
+ "Traffic Stream (TS) Info Traffic Type", HFILL }},
+ {&hf_ieee80211_tsinfo_tsid,
+ {"Traffic Stream ID (TSID)", "wlan.ts_info.tsid",
+ FT_UINT24, BASE_DEC, NULL, 0x00001E,
+ "Traffic Stream ID (TSID) Info TSID", HFILL }},
- {&hf_ieee80211_tag_measure_request_frame_request_type,
- {"Frame Request Type", "wlan.measure.req.frame_request_type",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_dir,
+ {"Direction", "wlan.ts_info.dir",
+ FT_UINT24, BASE_DEC, VALS(tsinfo_direction), 0x000060,
+ "Traffic Stream (TS) Info Direction", HFILL }},
- {&hf_ieee80211_tag_measure_request_mac_address,
- {"MAC Address", "wlan.measure.req.mac_address",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_access,
+ {"Access Policy", "wlan.ts_info.dir",
+ FT_UINT24, BASE_DEC, VALS(tsinfo_access), 0x000180,
+ "Traffic Stream (TS) Info Access Policy", HFILL }},
- {&hf_ieee80211_tag_measure_request_peer_mac_address,
- {"Peer MAC Address", "wlan.measure.req.peer_mac_address",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_agg,
+ {"Aggregation", "wlan.ts_info.agg",
+ FT_UINT24, BASE_DEC, NULL, 0x000200,
+ "Traffic Stream (TS) Info Access Policy", HFILL }},
- {&hf_ieee80211_tag_measure_request_group_id,
- {"Group ID", "wlan.measure.req.groupid",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_request_group_id_flags_ext, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_apsd,
+ {"Automatic Power-Save Delivery (APSD)", "wlan.ts_info.apsd",
+ FT_UINT24, BASE_DEC, NULL, 0x000400,
+ "Traffic Stream (TS) Info Automatic Power-Save Delivery (APSD)", HFILL }},
- {&hf_ieee80211_tag_measure_request_unknown,
- {"Unknown Data", "wlan.measure.req.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
- "(not interpreted)", HFILL }},
+ {&hf_ieee80211_tsinfo_up,
+ {"User Priority", "wlan.ts_info.up",
+ FT_UINT24, BASE_DEC, VALS(qos_up), 0x003800,
+ "Traffic Stream (TS) Info User Priority", HFILL }},
- {&hf_ieee80211_tag_measure_report_measurement_token,
- {"Measurement Token", "wlan.measure.req.token",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_ack,
+ {"Ack Policy", "wlan.ts_info.ack",
+ FT_UINT24, BASE_DEC, VALS(ack_policy), 0x00C000,
+ "Traffic Stream (TS) Info Ack Policy", HFILL }},
- {&hf_ieee80211_tag_measure_report_mode,
- {"Measurement Report Mode", "wlan.measure.req.mode",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tsinfo_sched,
+ {"Schedule", "wlan.ts_info.sched",
+ FT_UINT24, BASE_DEC, NULL, 0x010000,
+ "Traffic Stream (TS) Info Schedule", HFILL }},
- {&hf_ieee80211_tag_measure_report_mode_late,
- {"Measurement Report Mode Field", "wlan.measure.rep.repmode.late",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ {&hf_ieee80211_tsinfo_rsv,
+ {"Reserved", "wlan.ts_info.rsv",
+ FT_UINT24, BASE_HEX, NULL, 0xFE0000,
+ "Must be Zero", HFILL }},
+
+ {&hf_ieee80211_tspec_nor_msdu,
+ {"Normal MSDU Size", "wlan.tspec.nor_msdu",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_mode_incapable,
- {"Measurement Reports", "wlan.measure.rep.repmode.incapable",
- FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x02,
+ {&hf_ieee80211_tspec_max_msdu,
+ {"Maximum MSDU Size", "wlan.tspec.max_msdu",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_mode_refused,
- {"Autonomous Measurement Reports", "wlan.measure.rep.repmode.refused",
- FT_BOOLEAN, 8, TFS(&tfs_accepted_not_accepted), 0x04,
+ {&hf_ieee80211_tspec_min_srv,
+ {"Minimum Service Interval", "wlan.tspec.min_srv",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_mode_reserved,
- {"Reserved", "wlan.measure.rep.repmode.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xf8,
+ {&hf_ieee80211_tspec_max_srv,
+ {"Maximum Service Interval", "wlan.tspec.max_srv",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_type,
- {"Measurement Report Type", "wlan.measure.rep.reptype",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_tag_measure_report_type_flags_ext, 0x00,
+ {&hf_ieee80211_tspec_inact_int,
+ {"Inactivity Interval", "wlan.tspec.inact_int",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_channel_number,
- {"Measurement Channel Number", "wlan.measure.rep.channelnumber",
- FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
+ {&hf_ieee80211_tspec_susp_int,
+ {"Suspension Interval", "wlan.tspec.susp_int",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_start_time,
- {"Measurement Start Time", "wlan.measure.rep.starttime",
- FT_UINT64, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tspec_srv_start,
+ {"Service Start Time", "wlan.tspec.srv_start",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_duration,
- {"Measurement Duration", "wlan.measure.rep.channelnumber",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tspec_min_data,
+ {"Minimum Data Rate", "wlan.tspec.min_data",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_cca_busy_fraction,
- {"CCA Busy Fraction", "wlan.measure.rep.ccabusy",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tspec_mean_data,
+ {"Mean Data Rate", "wlan.tspec.mean_data",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_basic_map_field,
- {"Map Field", "wlan.measure.rep.mapfield",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tspec_peak_data,
+ {"Peak Data Rate", "wlan.tspec.peak_data",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_map_field_bss,
- {"BSS", "wlan.measure.rep.repmode.mapfield.bss",
- FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_map_field_bss_flag), 0x01,
+ {&hf_ieee80211_tspec_burst_size,
+ {"Burst Size", "wlan.tspec.burst_size",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_map_field_odfm,
- {"Orthogonal Frequency Division Multiplexing (ODFM) Preamble", "wlan.measure.rep.repmode.mapfield.bss",
- FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02,
+ {&hf_ieee80211_tspec_delay_bound,
+ {"Delay Bound", "wlan.tspec.delay_bound",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_map_field_unident_signal,
- {"Unidentified Signal", "wlan.measure.rep.repmode.mapfield.unidentsig",
- FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x04,
+ {&hf_ieee80211_tspec_min_phy,
+ {"Minimum PHY Rate", "wlan.tspec.min_phy",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_map_field_radar,
- {"Radar", "wlan.measure.rep.repmode.mapfield.radar",
- FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x08,
+ {&hf_ieee80211_tspec_surplus,
+ {"Surplus Bandwidth Allowance", "wlan.tspec.surplus",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_map_field_unmeasured,
- {"Unmeasured", "wlan.measure.rep.repmode.mapfield.unmeasured",
- FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10,
+ {&hf_ieee80211_tspec_medium,
+ {"Medium Time", "wlan.tspec.medium",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_map_field_reserved,
- {"Reserved", "wlan.measure.rep.repmode.mapfield.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xe0,
+ {&hf_ieee80211_tspec_dmg,
+ {"DMG attributes", "wlan.tspec.dmg",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_rpi_histogram_report,
- {"Receive Power Indicator (RPI) Histogram Report", "wlan.measure.rep.rpi.histogram_report",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ts_delay,
+ {"Traffic Stream (TS) Delay", "wlan.ts_delay",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_rpi_histogram_report_0,
- {"RPI 0 Density", "wlan.measure.rep.rpi.rpi0density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 0 Density", HFILL }},
-
- {&hf_ieee80211_tag_measure_rpi_histogram_report_1,
- {"RPI 1 Density", "wlan.measure.rep.rpi.rpi1density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 1 Density", HFILL }},
-
- {&hf_ieee80211_tag_measure_rpi_histogram_report_2,
- {"RPI 2 Density", "wlan.measure.rep.rpi.rpi2density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 2 Density", HFILL }},
-
- {&hf_ieee80211_tag_measure_rpi_histogram_report_3,
- {"RPI 3 Density", "wlan.measure.rep.rpi.rpi3density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 3 Density", HFILL }},
-
- {&hf_ieee80211_tag_measure_rpi_histogram_report_4,
- {"RPI 4 Density", "wlan.measure.rep.rpi.rpi4density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 4 Density", HFILL }},
+ {&hf_ieee80211_tclas_process,
+ {"Processing", "wlan.tclas_proc.processing",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_tclas_process_flag), 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_measure_rpi_histogram_report_5,
- {"RPI 5 Density", "wlan.measure.rep.rpi.rpi5density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 5 Density", HFILL }},
+ {&hf_ieee80211_tag_ext_supp_rates,
+ {"Extended Supported Rates", "wlan.extended_supported_rates",
+ FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_supported_rates_vals_ext, 0x0,
+ "In Mbit/sec, (B) for Basic Rates", HFILL }},
- {&hf_ieee80211_tag_measure_rpi_histogram_report_6,
- {"RPI 6 Density", "wlan.measure.rep.rpi.rpi6density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 6 Density", HFILL }},
+ {&hf_ieee80211_sched_info,
+ {"Schedule Info", "wlan.sched.sched_info",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ "Schedule Info field", HFILL }},
- {&hf_ieee80211_tag_measure_rpi_histogram_report_7,
- {"RPI 7 Density", "wlan.measure.rep.rpi.rpi7density",
- FT_UINT8, BASE_HEX, NULL, 0,
- "Receive Power Indicator (RPI) 7 Density", HFILL }},
+ {&hf_ieee80211_sched_info_agg,
+ {"Schedule Aggregation", "wlan.sched_info.agg",
+ FT_UINT16, BASE_DEC, NULL, 0x0001,
+ "Traffic Stream (TS) Info Access Policy", HFILL }},
- {&hf_ieee80211_tag_measure_report_operating_class,
- {"Operating Class", "wlan.measure.rep.operatingclass",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_sched_info_tsid,
+ {"Schedule Traffic Stream ID (TSID)", "wlan.sched_info.tsid",
+ FT_UINT16, BASE_DEC, NULL, 0x001E,
+ "Traffic Stream ID (TSID) Info TSID", HFILL }},
- {&hf_ieee80211_tag_measure_report_channel_load,
- {"Channel Load", "wlan.measure.rep.chanload",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_sched_info_dir,
+ {"Schedule Direction", "wlan.sched_info.dir",
+ FT_UINT16, BASE_DEC, VALS(tsinfo_direction), 0x0060,
+ "Traffic Stream (TS) Info Direction", HFILL }},
- {&hf_ieee80211_tag_measure_report_frame_info,
- {"Reported Frame Information", "wlan.measure.rep.frameinfo",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_sched_srv_start,
+ {"Service Start Time", "wlan.sched.srv_start",
+ FT_UINT32, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_frame_info_phy_type,
- {"Condensed PHY", "wlan.measure.rep.frameinfo.phytype",
- FT_UINT8, BASE_HEX, NULL, 0x7F,
+ {&hf_ieee80211_sched_srv_int,
+ {"Service Interval", "wlan.sched.srv_int",
+ FT_UINT32, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_frame_info_frame_type,
- {"Reported Frame Type", "wlan.measure.rep.frameinfo.frametype",
- FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_report_frame_info_frame_type_flag), 0x80,
+ {&hf_ieee80211_sched_spec_int,
+ {"Specification Interval", "wlan.sched.spec_int",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_rcpi,
- {"Received Channel Power Indicator (RCPI)", "wlan.measure.rep.rcpi",
- FT_UINT8, BASE_HEX, NULL, 0,
- "in dBm", HFILL }},
-
- {&hf_ieee80211_tag_measure_report_rsni,
- {"Received Signal to Noise Indicator (RSNI)", "wlan.measure.rep.rsni",
- FT_UINT8, BASE_HEX, NULL, 0,
- "in dB", HFILL }},
+ {&hf_ieee80211_aruba,
+ {"Aruba Type", "wlan.aruba.type",
+ FT_UINT16, BASE_DEC|BASE_EXT_STRING, &aruba_mgt_typevals_ext, 0,
+ "Aruba Management", HFILL }},
- {&hf_ieee80211_tag_measure_report_bssid,
- {"BSSID Being Reported", "wlan.measure.rep.bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_aruba_hb_seq,
+ {"Aruba Heartbeat Sequence", "wlan.aruba.heartbeat_sequence",
+ FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ant_id,
- {"Antenna ID", "wlan.measure.rep.antid",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_aruba_mtu,
+ {"Aruba MTU Size", "wlan.aruba.mtu_size",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_anpi,
- {"ANPI", "wlan.measure.rep.anpi",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ /* Start: HT Control (+HTC) */
+ {&hf_ieee80211_htc,
+ {"HT Control (+HTC)", "wlan.htc",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "High Throughput Control (+HTC)", HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_0,
- {"IPI Density 0", "wlan.measure.rep.ipi_density0",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_vht,
+ {"VHT", "wlan.htc.vht",
+ FT_BOOLEAN, 32, NULL, HTC_VHT,
+ "High Throughput Control HT/VHT flag", HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_1,
- {"IPI Density 1", "wlan.measure.rep.ipi_density1",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_he,
+ {"HE", "wlan.htc.he",
+ FT_BOOLEAN, 32, NULL, HTC_HE,
+ "High Efficiency Control HE flag", HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_2,
- {"IPI Density 2", "wlan.measure.rep.ipi_density2",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, 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_tag_measure_report_ipi_density_3,
- {"IPI Density 3", "wlan.measure.rep.ipi_density3",
- FT_UINT8, BASE_HEX, 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_UINT32, BASE_DEC, NULL, 0x0000001f, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_4,
- {"IPI Density 4", "wlan.measure.rep.ipi_density4",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_umrs_ru_allocation,
+ {"RU Allocation", "wlan.htc.he.a_control.umrs.ru_allocation",
+ FT_UINT32, BASE_HEX, NULL, 0x00001fe0, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_5,
- {"IPI Density 5", "wlan.measure.rep.ipi_density5",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_dl_tx_power,
+ {"DL Tx Power", "wlan.htc.he.a_control.umrs.dl_tx_power",
+ FT_UINT32, BASE_HEX, NULL, 0x0003e000, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_6,
- {"IPI Density 6", "wlan.measure.rep.ipi_density6",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_ul_target_rssi,
+ {"UL Target RSSI", "wlan.htc.he.a_control.umrs.ul_target_rssi",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(ul_target_rssi_base_custom),
+ 0x007c0000, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_7,
- {"IPI Density 7", "wlan.measure.rep.ipi_density7",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_ul_mcs,
+ {"UL MCS", "wlan.htc.he.a_control.umrs.ul_mcs",
+ FT_UINT32, BASE_HEX, NULL, 0x01800000, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_8,
- {"IPI Density 8", "wlan.measure.rep.ipi_density8",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_ul_reserved,
+ {"reserved", "wlan.htc.he.a_control.umrs.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0x02000000, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_9,
- {"IPI Density 9", "wlan.measure.rep.ipi_density9",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_om_rx_nss,
+ {"Rx NSS", "wlan.htc.he.a_control.om.rx_nss",
+ FT_UINT16, BASE_DEC, NULL, 0x0007, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_ipi_density_10,
- {"IPI Density 10", "wlan.measure.rep.ipi_density10",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_om_channel_width,
+ {"Channel Width", "wlan.htc.he.a_control.om.channel_width",
+ FT_UINT16, BASE_DEC, NULL, 0x0018, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_parent_tsf,
- {"Parent Timing Synchronization Function (TSF)", "wlan.measure.rep.parenttsf",
- FT_UINT32, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_om_ul_mu_disable,
+ {"UL MU Disable", "wlan.htc.he.a_control.om.ul_mu_disable",
+ FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_subelement_length,
- {"Length", "wlan.measure.req.sub.length",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_om_tx_nsts,
+ {"Tx NSTS", "wlan.htc.he.a_control.om.tx_nsts",
+ FT_UINT16, BASE_DEC, NULL, 0x01c0, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_beacon_sub_id,
- {"SubElement ID", "wlan.measure.req.beacon.sub.id",
- FT_UINT8, BASE_DEC, VALS(ieee80211_tag_measure_report_beacon_sub_id_vals), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_om_reserved,
+ {"Reserved", "wlan.htc.he.a_control.om.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0x0e00, NULL, HFILL }},
- {&hf_ieee80211_tag_measure_report_unknown,
- {"Unknown Data", "wlan.measure.rep.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
- "(not interpreted)", HFILL }},
+ {&hf_ieee80211_he_hla_unsolicited_mfb,
+ {"Unsolicited MFB", "wlan.htc.he.a_control.hla.unsolicited_mfb",
+ FT_BOOLEAN, 32, NULL, 0x00000001, NULL, HFILL }},
- {&hf_ieee80211_tag_quiet_count,
- {"Count", "wlan.quiet.count",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Set to the number of TBTTs until the beacon interval during which the next quiet interval shall start", HFILL }},
+ {&hf_ieee80211_he_hla_mrq,
+ {"MRQ", "wlan.htc.he.a_control.hla.mrq",
+ FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL }},
- {&hf_ieee80211_tag_quiet_period,
- {"Period", "wlan.quiet.period",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Set to the number of beacon intervals between the start of regularly scheduled quiet intervals", HFILL }},
+ {&hf_ieee80211_he_hla_nss,
+ {"NSS", "wlan.htc.he.a_control.hla.NSS",
+ FT_UINT32, BASE_DEC, NULL, 0x0000001c, NULL, HFILL }},
- {&hf_ieee80211_tag_quiet_duration,
- {"Duration", "wlan.quiet.duration",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Set to the duration of the quiet interval", HFILL }},
+ {&hf_ieee80211_he_hla_he_mcs,
+ {"HE-MCS", "wlan.htc.he.a_control.hla.he_mcs",
+ FT_UINT32, BASE_DEC, NULL, 0x000001e0, NULL, HFILL }},
- {&hf_ieee80211_tag_quiet_offset,
- {"Offset", "wlan.quiet.offset",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Set to the offset of the start of the quiet interval from the TBTT", HFILL }},
+ {&hf_ieee80211_he_hla_dcm,
+ {"DCM", "wlan.htc.he.a_control.hla.dcm",
+ FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL }},
- {&hf_ieee80211_tag_dfs_owner,
- {"Owner", "wlan.dfs.owner",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Set to the individual IEEE MAC address of the STA that is the currently known DFS Owner in the IBSS", HFILL }},
+ {&hf_ieee80211_he_hla_ru,
+ {"RU", "wlan.htc.he.a_control.hla.ru",
+ FT_UINT32, BASE_DEC, NULL, 0x0003fc00, NULL, HFILL }},
- {&hf_ieee80211_tag_dfs_recovery_interval,
- {"Recovery Interval", "wlan.dfs.recovery_interval",
- FT_UINT8, BASE_DEC, NULL, 0,
- "Indicates the time interval that shall be used for DFS owner recovery", HFILL }},
+ {&hf_ieee80211_he_hla_bw,
+ {"BW", "wlan.htc.he.a_control.hla.bw",
+ FT_UINT32, BASE_DEC, NULL, 0x000c0000, NULL, HFILL }},
- {&hf_ieee80211_tag_dfs_channel_map,
- {"Channel Map", "wlan.dfs.channel_map",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_hla_msi_ppdu_type,
+ {"MSI/PPDU Type", "wlan.htc.he.a_control.hla.msi_ppdu_type",
+ FT_UINT32, BASE_DEC, NULL, 0x00700000, NULL, HFILL }},
- {&hf_ieee80211_tag_dfs_channel_number,
- {"Channel Number", "wlan.dfs.channel_number",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_hla_tx_bf,
+ {"Tx BF", "wlan.htc.he.a_control.hla.tx_bf",
+ FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL }},
- {&hf_ieee80211_tag_dfs_map,
- {"Map", "wlan.dfs.map",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_hla_reserved,
+ {"Reserved", "wlan.htc.he.a_control.hla.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0x03000000, NULL, HFILL }},
- {&hf_ieee80211_tag_erp_info,
- {"ERP Information", "wlan.erp_info",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_bsr_aci_bitmap,
+ {"ACI Bitmap", "wlan.htc.he.a_control.bsr.aci_bitmap",
+ FT_UINT32, BASE_HEX, NULL, 0x0000000f, NULL, HFILL }},
- {&hf_ieee80211_tag_erp_info_erp_present,
- {"Non ERP Present", "wlan.erp_info.erp_present",
- FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
- NULL, HFILL }},
+ {&hf_ieee80211_he_bsr_delta_tid,
+ {"Delta TID", "wlan.htc.he.a_control.bsr.delta_tid",
+ FT_UINT32, BASE_HEX, NULL, 0x00000030, NULL, HFILL }},
- {&hf_ieee80211_tag_erp_info_use_protection,
- {"Use Protection", "wlan.erp_info.use_protection",
- FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
- NULL, HFILL }},
+ {&hf_ieee80211_he_bsr_aci_high,
+ {"ACI High", "wlan.htc.he.a_control.bsr.aci_high",
+ FT_UINT32, BASE_HEX, NULL, 0x000000c0, NULL, HFILL }},
- {&hf_ieee80211_tag_erp_info_barker_preamble_mode,
- {"Barker Preamble Mode", "wlan.erp_info.barker_preamble_mode",
- FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_he_bsr_scaling_factor,
+ {"Scaling Factor", "wlan.htc.he.a_control.bsr.scaling_factor",
+ FT_UINT32, BASE_HEX, NULL, 0x00000300, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_queue_size_high,
+ {"Queue Size High", "wlan.htc.he.a_control.bsr.queue_size_high",
+ FT_UINT32, BASE_HEX, NULL, 0x0003fc00, NULL, HFILL }},
+
+ {&hf_ieee80211_he_bsr_queue_size_all,
+ {"Queue Size All", "wlan.htc.he.a_control.bsr.queue_size_all",
+ FT_UINT32, BASE_HEX, NULL, 0x03fc0000, 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, 0x00000001f, 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, 8, NULL, 0x00000020, NULL, HFILL }},
- {&hf_ieee80211_tag_erp_info_reserved,
- {"Reserved", "wlan.erp_info.reserved",
- FT_UINT8, BASE_HEX, NULL, 0xF8,
- NULL, HFILL }},
+ {&hf_ieee80211_he_uph_reserved,
+ {"Reserved", "wlan.htc.he.a_control.uph.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x000000c0, NULL, HFILL }},
- /* Table 8-103-Capabilities field */
- {&hf_ieee80211_tag_extended_capabilities,
- {"Extended Capabilities", "wlan.extcap",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_he_btc_avail_chan,
+ {"Available Channel Bitmap", "wlan.htc.he.a_control.bqr.avail_chan_bitmap",
+ FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
- /* P802.11n/D6.0 */
- /* Extended Capability octet 1 */
- {&hf_ieee80211_tag_extended_capabilities_b0,
- {"20/40 BSS Coexistence Management Support", "wlan.extcap.b0",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
- "HT Information Exchange Support", HFILL }},
+ {&hf_ieee80211_he_btc_reserved,
+ {"Reserved", "wlan.htc.he.a_control.bqr.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
- /* P802.11p/D4.0 */
- {&hf_ieee80211_tag_extended_capabilities_b1,
- {"On-demand beacon", "wlan.extcap.b1",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
- NULL, HFILL }},
+ {&hf_ieee80211_he_cci_ac_constraint,
+ {"AC Constraint", "wlan.htc.he.a_control.cci.ac_constraint",
+ FT_BOOLEAN, 32, NULL, 0x01, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b2,
- {"Extended Channel Switching", "wlan.extcap.b2",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_he_cci_rdg_more_ppdu,
+ {"RDG/More PPDU", "wlan.htc.he.a_control.cci.rdg_more_ppdu",
+ FT_BOOLEAN, 32, NULL, 0x02, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b3,
- {"WAVE indication", "wlan.extcap.b3",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
- NULL, HFILL }},
- /*End: P802.11p/D4.0 */
+ {&hf_ieee80211_he_cci_sr_ppdu_indic,
+ {"SR PPDU Indication", "wlan.htc.he.a_control.cci.sr_ppdu_indic",
+ FT_BOOLEAN, 32, NULL, 0x04, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b4,
- {"PSMP Capability", "wlan.extcap.b4",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_he_cci_reserved,
+ {"Reserved", "wlan.htc.htc.a_control.cci.reserved",
+ FT_UINT32, BASE_HEX, NULL, 0xF8, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b5,
- {"Reserved", "wlan.extcap.b5",
- FT_UINT8, BASE_HEX, NULL, 0x20,
- "Must be zero", HFILL }},
+ {&hf_ieee80211_he_trigger_common_info,
+ {"HE Trigger Common Info", "wlan.trigger.he.common_info",
+ FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b6,
- {"S-PSMP Support", "wlan.extcap.b6",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_type,
+ {"Trigger Type", "wlan.trigger.he.trigger_type",
+ FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(trigger_type_vals),
+ 0x000000000000000F, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_length,
+ {"L-SIG Length", "wlan.trigger.he.l_sig_length",
+ FT_UINT64, BASE_DEC, NULL, 0x000000000000FFF0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_cascade_indication,
+ {"Cascade Indication", "wlan.trigger.he.cascade_indication",
+ FT_BOOLEAN, 64, NULL, 0x0000000000010000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_cs_required,
+ {"CS Required", "wlan.trigger.he.cs_required",
+ FT_BOOLEAN, 64, NULL, 0x0000000000020000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_bw,
+ {"BW", "wlan.trigger.he.bw",
+ FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(bw_subfield_vals), 0x00000000000C0000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_gi_and_ltf_type,
+ {"GI And LTF Type", "wlan.trigger.he.gi_and_ltf_type",
+ FT_UINT64, BASE_DEC|BASE_VAL64_STRING, VALS64(gi_and_ltf_type_subfield_vals), 0x0000000000300000,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_mu_mimo_ltf_mode,
+ {"MU-MIMO LTF Mode", "wlan.trigger.he.mu_mimo_ltf_mode",
+ FT_BOOLEAN, 64, TFS(&mu_mimo_ltf_mode_tfs), 0x0000000000400000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_num_he_ltf_syms_etc,
+ {"Number of HE-LTF Symbols and Midamble Periodicity",
+ "wlan.trigger.he.num_he_ltf_syms_and_midamble_per",
+ FT_UINT64, BASE_HEX, NULL, 0x0000000003800000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_stbc,
+ {"STBC", "wlan.trigger.he.stbc",
+ FT_BOOLEAN, 64, NULL, 0x0000000004000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_ldpc_extra_sym_seg,
+ {"LDPC Extra Symbol Segment", "wlan.trigger.he.ldpc_extra_symbol_segment",
+ FT_BOOLEAN, 64, NULL, 0x0000000008000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_ap_tx_power,
+ {"AP TX Power", "wlan.trigger.he.ap_tx_power",
+ FT_UINT64, BASE_DEC, NULL, 0x00000003F0000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_packet_extension,
+ {"Packet Extension", "wlan.trigger.he.packet_extension",
+ FT_UINT64, BASE_HEX, NULL, 0x0000001C00000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_spatial_reuse,
+ {"Spatial Reuse", "wlan.trigger.he.spatial_reuse",
+ FT_UINT64, BASE_HEX, NULL, 0x001FFFE000000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_doppler,
+ {"Doppler", "wlan.trigger.he.doppler",
+ FT_BOOLEAN, 64, NULL, 0x0020000000000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_he_sig_a_reserved,
+ {"HE-SIG-A Reserved", "wlan.trigger.he.he_sig_a_reserved",
+ FT_UINT64, BASE_HEX, NULL, 0x7FC0000000000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_reserved,
+ {"Reserved", "wlan.trigger.he.reserved",
+ FT_UINT64, BASE_HEX, NULL, 0x8000000000000000, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_bar_ctrl,
+ {"BAR Control", "wlan.trigger.he.common_info.bar_ctrl",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_he_trigger_bar_ctrl_ba_ack_policy,
+ {"BA Ack Policy", "wlan.trigger.he.common_info.bar_ctrl.ba_ack_policy",
+ FT_BOOLEAN, 16, TFS(&ieee80211_block_ack_control_ack_policy_flag), 0x0001,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b7,
- {"Event", "wlan.extcap.b7",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_bar_ctrl_ba_type,
+ {"BA Type", "wlan.trigger.he.common_info.bar_ctrl.ba_type",
+ FT_UINT16, BASE_HEX, VALS(block_ack_type_vals), 0x001e, NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_bar_ctrl_reserved,
+ {"Reserved", "wlan.trigger.he.common_info.bar_ctrl.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0x0FE0, NULL, HFILL }},
- /* Extended Capability octet 2 */
- {&hf_ieee80211_tag_extended_capabilities_b8,
- {"Diagnostics", "wlan.extcap.b8",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_bar_ctrl_tid_info,
+ {"TID_INFO", "wlan.trigger.he.common_info.bar_ctrl.tid_info",
+ FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b9,
- {"Multicast Diagnostics", "wlan.extcap.b9",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_bar_info,
+ {"BAR Information", "wlan.trigger.he.common_info.bar_info",
+ FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b10,
- {"Location Tracking", "wlan.extcap.b10",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_bar_info_blk_ack_seq_ctrl,
+ {"Block Ack Starting Sequence Control",
+ "wlan.trigger.he.common_info.bar_info.blk_ack_starting_seq_ctrl",
+ FT_UINT16, BASE_HEX, NULL, 0xFFFF, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b11,
- {"FMS", "wlan.extcap.b11",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_user_info,
+ {"User Info", "wlan.trigger.he.user_info",
+ FT_UINT40, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b12,
- {"Proxy ARP Service", "wlan.extcap.b12",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_mpdu_mu_spacing,
+ {"MPDU MU Spacing Factor", "wlan.trigger.he.mpdu_mu_spacing_factor",
+ FT_UINT8, BASE_DEC, NULL, 0x03, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b13,
- {"Collocated Interference Reporting", "wlan.extcap.b13",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_tid_aggregation_limit,
+ {"TID Aggregation Limit", "wlan.trigger.he.tid_aggregation_limit",
+ FT_UINT8, BASE_DEC, NULL, 0x1C, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b14,
- {"Civic Location", "wlan.extcap.b14",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_dependent_reserved1,
+ {"Reserved", "wlan.trigger.he.reserved1",
+ FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b15,
- {"Geospatial Location", "wlan.extcap.b15",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_preferred_ac,
+ {"Preferred AC", "wlan.trigger.he.preferred_ac",
+ FT_UINT8, BASE_HEX, VALS(preferred_ac_vals), 0xC0, NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_dep_basic_user_info,
+ {"Basic Trigger Dependent User Info", "wlan.trigger.he.basic_user_info",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
- /* Extended Capability octet 3 */
- {&hf_ieee80211_tag_extended_capabilities_b16,
- {"TFS", "wlan.extcap.b16",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_starting_aid,
+ {"Starting AID", "wlan.trigger.he.starting_aid",
+ FT_UINT40, BASE_HEX, NULL, 0x0000000FFF, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b17,
- {"WNM-Sleep Mode", "wlan.extcap.b17",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_dependent_reserved2,
+ {"Reserved", "wlan.trigger.he.reserved2",
+ FT_UINT40, BASE_HEX, NULL, 0x00001FF000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b18,
- {"TIM Broadcast", "wlan.extcap.b18",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_feedback_type,
+ {"Feedback Type", "wlan.trigger.he.feedback_type",
+ FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b19,
- {"BSS Transition", "wlan.extcap.b19",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_dependent_reserved3,
+ {"Reserved", "wlan.trigger.he.reserved3",
+ FT_UINT40, BASE_HEX, NULL, 0x00FE000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b20,
- {"QoS Traffic Capability", "wlan.extcap.b20",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_nfrp_target_rssi,
+ {"Target RSSI", "wlan.trigger.he.target_rssi",
+ FT_UINT40, BASE_CUSTOM, CF_FUNC(target_rssi_base_custom), 0x7F00000000,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b21,
- {"AC Station Count", "wlan.extcap.b21",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_multiplexing_flag,
+ {"Multiplexing Flag", "wlan.trigger.he.multiplexing_flag",
+ FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b22,
- {"Multiple BSSID", "wlan.extcap.b22",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_dep_nfrp_user_info,
+ {"NFRP Trigger Dependent User Unfo", "wlan.trigger.he.nfrp_user_info",
+ FT_UINT40, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b23,
- {"Timing Measurement", "wlan.extcap.b23",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_feedback_seg_retrans_bm,
+ {"Feedback Segment Retransmission Bitmap", "wlan.trigger.he.feedback_bm",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_aid12,
+ {"AID12", "wlan.trigger.he.user_info.aid12",
+ FT_UINT40, BASE_HEX, NULL, 0x0000000FFF, NULL, HFILL }},
- /* Extended Capability octet 4 */
- {&hf_ieee80211_tag_extended_capabilities_b24,
- {"Channel Usage", "wlan.extcap.b24",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_ru_allocation,
+ {"RU Allocation", "wlan.trigger.he.ru_allocation",
+ FT_UINT40, BASE_HEX, NULL, 0x00000FF000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b25,
- {"SSID List", "wlan.extcap.b25",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_coding_type,
+ {"Coding Type", "wlan.trigger.he.coding_type",
+ FT_BOOLEAN, 40, TFS(&he_trigger_coding_type_tfs), 0x0000100000,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b26,
- {"DMS", "wlan.extcap.b26",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_mcs,
+ {"MCS", "wlan.trigger.he.mcs",
+ FT_UINT40, BASE_HEX, NULL, 0x0001E00000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b27,
- {"UTC TSF Offset", "wlan.extcap.b27",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_dcm,
+ {"DCM", "wlan.trigger.he.dcm",
+ FT_BOOLEAN, 40, NULL, 0x0002000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b28,
- {"Peer U-APSD Buffer STA Support", "wlan.extcap.b28",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_ss_allocation,
+ {"SS Alloc/Random Access RU Info", "wlan.trigger.he.ss_alloc",
+ FT_UINT40, BASE_HEX, NULL, 0x00FC000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b29,
- {"TDLS Peer PSM Support", "wlan.extcap.b29",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_target_rssi,
+ {"Target RSSI", "wlan.trigger.he.target_rssi",
+ FT_UINT40, BASE_CUSTOM, CF_FUNC(target_rssi_base_custom), 0x7F00000000,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b30,
- {"TDLS channel switching", "wlan.extcap.b30",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_he_trigger_user_reserved,
+ {"Reserved", "wlan.trigger.he.user_reserved",
+ FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b31,
- {"Interworking", "wlan.extcap.b31",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
+ {&hf_he_ndp_sounding_dialog_token_number,
+ {"Sounding Dialog Token Number", "wlan.he_ndp.token.number",
+ FT_UINT8, BASE_DEC, NULL, 0xFC,
NULL, HFILL }},
+ {&hf_he_ndp_annc_he_subfield,
+ {"HE", "wlan.vht_he.token.he",
+ FT_BOOLEAN, 8, TFS(&he_ndp_annc_he_subfield_vals), 0x02, NULL, HFILL }},
- /* Extended Capability octet 5 */
- {&hf_ieee80211_tag_extended_capabilities_b32,
- {"QoS Map", "wlan.extcap.b32",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
+ {&hf_he_ndp_annc_reserved,
+ {"Reserved", "wlan.he_ndp.token.reserved",
+ FT_UINT8, BASE_HEX, NULL, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b33,
- {"EBR", "wlan.extcap.b33",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
- NULL, HFILL }},
+ {&hf_ieee80211_he_ndp_annc_token,
+ {"Sounding Dialog Token", "wlan.he_ndp.token",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b34,
- {"SSPN Interface", "wlan.extcap.b34",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x04,
- NULL, HFILL }},
+ {&hf_ieee80211_he_ndp_annc_sta,
+ {"STA Info", "wlan.he_ndp.sta_info",
+ FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b35,
- {"Reserved", "wlan.extcap.b35",
- FT_UINT8, BASE_HEX, NULL, 0x08,
- "Must be zero", HFILL }},
+ {&hf_he_ndp_annc_aid11,
+ {"AID11", "wlan.he_ndp.sta_info.aid11",
+ FT_UINT32, BASE_HEX, NULL, 0x000007FF, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b36,
- {"MSGCF Capability", "wlan.extcap.b36",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
- NULL, HFILL }},
+ {&hf_he_ndp_annc_partial_bw_info,
+ {"Partial BW Info", "wlan.he_ndp.sta_info.partial_bw_info",
+ FT_UINT32, BASE_CUSTOM, CF_FUNC(partial_bw_info_base_custom), 0x01FFF800,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b37,
- {"TDLS support", "wlan.extcap.b37",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
- NULL, HFILL }},
+ {&hf_he_ndp_annc_feedback_type_and_ng,
+ {"Feedback Type and Ng", "wlan.he_ndp.sta_info.feedback_type_and_ng",
+ FT_UINT32, BASE_HEX, NULL, 0x06000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b38,
- {"TDLS Prohibited", "wlan.extcap.b38",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_he_ndp_annc_disambiguation,
+ {"Disambiguation", "wlan.he_ndp.sta_info.disambiguation",
+ FT_UINT32, BASE_HEX, NULL, 0x08000000, NULL, HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b39,
- {"TDLS Channel Switching Prohibited", "wlan.extcap.b39",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x80,
- NULL, HFILL }},
+ {&hf_he_ndp_annc_codebook_size,
+ {"Codebook Size", "wlan.he_ndp.sta_info.codebook_size",
+ FT_UINT32, BASE_HEX, NULL, 0x10000000, NULL, HFILL }},
+
+ {&hf_he_ndp_annc_nc,
+ {"Nc", "wlan.he_ndp.sta_info.nc",
+ FT_UINT32, BASE_HEX, NULL, 0xE0000000, 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 }},
+
+ {&hf_ieee80211_htc_lac_trq,
+ {"Training Request (TRQ)", "wlan.htc.lac.trq",
+ FT_BOOLEAN, 16, TFS(&htc_lac_trq_flag), 0x0002,
+ "High Throughput Control Link Adaptation Control Training Request (TRQ)", HFILL }},
- /* Extended Capability octet 6 */
- {&hf_ieee80211_tag_extended_capabilities_b40,
- {"Reject Unadmitted Frame", "wlan.extcap.b40",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_lac_mai_aseli,
+ {"Antenna Selection Indication (ASELI)", "wlan.htc.lac.mai.aseli",
+ FT_UINT16, BASE_HEX, NULL, 0x003C,
+ "High Throughput Control Link Adaptation Control MAI Antenna Selection Indication", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_serv_int_granularity,
- {"Service Interval Granularity",
- "wlan.extcap.serv_int_granularity",
- FT_UINT8, BASE_DEC, VALS(service_interval_granularity_vals), 0x0e,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_lac_mai_mrq,
+ {"MCS Request (MRQ)", "wlan.htc.lac.mai.mrq",
+ FT_BOOLEAN, 16, TFS(&htc_lac_mai_mrq_flag), 0x0004,
+ "High Throughput Control Link Adaptation Control MAI MCS Request", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b44,
- {"Identifier Location", "wlan.extcap.b44",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x10,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_lac_mai_msi,
+ {"MCS Request Sequence Identifier (MSI)", "wlan.htc.lac.mai.msi",
+ FT_UINT16, BASE_HEX, NULL, 0x0038,
+ "High Throughput Control Link Adaptation Control MAI MCS Request Sequence Identifier", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b45,
- {"U-APSD Coexistence", "wlan.extcap.b45",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_lac_mai_reserved,
+ {"Reserved", "wlan.htc.lac.mai.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0x0038,
+ "High Throughput Control Link Adaptation Control MAI Reserved", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b46,
- {"WNM-Notification", "wlan.extcap.b46",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_lac_mfsi,
+ {"MCS Feedback Sequence Identifier (MFSI)", "wlan.htc.lac.mfsi",
+ FT_UINT16, BASE_DEC, NULL, 0x01C0,
+ "High Throughput Control Link Adaptation Control MCS Feedback Sequence Identifier (MSI)", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b47,
- {"QAB Capability", "wlan.extcap.b47",
- FT_UINT8, BASE_HEX, NULL, 0x80,
- "AP supports QAB", HFILL }},
+ {&hf_ieee80211_htc_lac_asel_command,
+ {"Antenna Selection (ASEL) Command", "wlan.htc.lac.asel.command",
+ FT_UINT16, BASE_HEX, VALS(ieee80211_htc_lac_asel_command_flags), 0x0E00,
+ "High Throughput Control Link Adaptation Control Antenna Selection (ASEL) Command", HFILL }},
- /* Extended Capability octet 7 */
- {&hf_ieee80211_tag_extended_capabilities_b48,
- {"UTF-8 SSID", "wlan.extcap.b48",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
- "The SSID in this BSS is interpreted using UTF-8 encoding", HFILL }},
+ {&hf_ieee80211_htc_lac_asel_data,
+ {"Antenna Selection (ASEL) Data", "wlan.htc.lac.asel.data",
+ FT_UINT16, BASE_HEX, NULL, 0xF000,
+ "High Throughput Control Link Adaptation Control Antenna Selection (ASEL) Data", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_o7,
- {"Reserved", "wlan.extcap.o7",
- FT_UINT8, BASE_HEX, NULL, 0xfe,
- "Must be zero", HFILL }},
+ {&hf_ieee80211_htc_lac_mfb,
+ {"MCS Feedback (MFB)", "wlan.htc.lac.mfb",
+ FT_UINT16, BASE_HEX, NULL, 0xFE00,
+ "High Throughput Control Link Adaptation Control MCS Feedback", HFILL }},
- /* Extended Capability octet 8 */
- {&hf_ieee80211_tag_extended_capabilities_b61,
- {"TDLS Wider Bandwidth", "wlan.extcap.b61",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x20,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_cal_pos,
+ {"Calibration Position", "wlan.htc.cal.pos",
+ FT_UINT32, BASE_DEC, VALS(ieee80211_htc_cal_pos_flags), 0x00030000,
+ "High Throughput Control Calibration Position", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b62,
- {"Operating Mode Notification", "wlan.extcap.b62",
- FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x40,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_cal_seq,
+ {"Calibration Sequence Identifier", "wlan.htc.cal.seq",
+ FT_UINT32, BASE_DEC, NULL, 0x000C0000,
+ "High Throughput Control Calibration Sequence Identifier", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_b63,
- {"Max Number Of MSDUs In A-MSDU", "wlan.extcap.b63",
- FT_UINT8, BASE_DEC, NULL, 0x80,
- "Part 1 (bit63)", HFILL }},
+ {&hf_ieee80211_htc_reserved1,
+ {"Reserved", "wlan.htc.reserved1",
+ FT_UINT32, BASE_HEX, NULL, 0x00300000,
+ "High Throughput Control Reserved", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_o8,
- {"Reserved", "wlan.extcap.o8",
- FT_UINT8, BASE_HEX, NULL, 0x1f,
- "Must be zero", HFILL }},
+ {&hf_ieee80211_htc_csi_steering,
+ {"CSI/Steering", "wlan.htc.csi_steering",
+ FT_UINT32, BASE_DEC, VALS(ieee80211_htc_csi_steering_flags), 0x00C00000,
+ "High Throughput Control CSI/Steering", HFILL }},
- /* Extended Capability octet 9 */
- {&hf_ieee80211_tag_extended_capabilities_b64,
- {"Max Number Of MSDUs In A-MSDU64", "wlan.extcap.b64",
- FT_UINT8, BASE_DEC, NULL, 0x01,
- "Part 2 (bit64)", HFILL }},
+ {&hf_ieee80211_htc_ndp_announcement,
+ {"NDP Announcement", "wlan.htc.ndp_announcement",
+ FT_BOOLEAN, 32, TFS(&ieee80211_htc_ndp_announcement_flag), 0x01000000,
+ "High Throughput Control NDP Announcement", HFILL }},
- {&hf_ieee80211_tag_extended_capabilities_o9,
- {"Reserved", "wlan.extcap.o9",
- FT_UINT8, BASE_HEX, NULL, 0xfe,
- "Must be zero", HFILL }},
+ {&hf_ieee80211_htc_reserved2,
+ {"Reserved", "wlan.htc.reserved2",
+ FT_UINT32, BASE_HEX, NULL, 0x3E000000,
+ "High Throughput Control Reserved", HFILL }},
- {&hf_ieee80211_tag_cisco_ccx1_unknown,
- {"Unknown", "wlan.cisco.ccx1.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_mrq,
+ {"MRQ", "wlan.htc.mrq",
+ FT_BOOLEAN, 32, NULL, HTC_MRQ,
+ "VHT-MCS feedback request", HFILL }},
- {&hf_ieee80211_tag_cisco_ccx1_name,
- {"Name", "wlan.cisco.ccx1.name",
- FT_STRING, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_msi,
+ {"MSI", "wlan.htc.msi",
+ FT_UINT32, BASE_DEC, NULL, 0x00000038,
+ "MRQ sequence number", HFILL }},
- {&hf_ieee80211_tag_cisco_ccx1_clients,
- {"Clients", "wlan.cisco.ccx1.clients",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_htc_msi_stbc_reserved,
+ {"Reserved", "wlan.htc.msi_stbc_reserved",
+ FT_UINT32, BASE_HEX, NULL, 0x00000038,
NULL, HFILL }},
- {&hf_ieee80211_tag_cisco_ccx1_unknown2,
- {"Unknown2", "wlan.cisco.ccx1.unknown2",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_htc_compressed_msi,
+ {"Compressed MSI", "wlan.htc.compressed_msi",
+ FT_UINT32, BASE_DEC, NULL, 0x00000018,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid,
- {"BSSID", "wlan.nreport.bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_htc_ppdu_stbc_encoded,
+ {"PPDU was STBC encoded", "wlan.htc.ppdu_stbc_encoded",
+ FT_BOOLEAN, 32, NULL, 0x00000020,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info,
- {"BSSID Information", "wlan.nreport.bssid.info",
- FT_UINT32, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_mfsi,
+ {"MFSI", "wlan.htc.mfsi",
+ FT_BOOLEAN, 32, NULL, 0x000001C0,
+ "MFB sequence identifier", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_reachability,
- {"AP Reachability", "wlan.nreport.bssid.info.reachability",
- FT_UINT32, BASE_HEX, VALS(ieee80211_neighbor_report_bssid_info_reachability_vals), 0x00000003,
- "Indicates whether the AP identified by this BSSID is reachable by the STA that requested the neighbor report", HFILL }},
+ {&hf_ieee80211_htc_gid_l,
+ {"GID-L", "wlan.htc.gid_l",
+ FT_BOOLEAN, 32, NULL, 0x000001C0,
+ "LSBs of group ID", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_security,
- {"Security", "wlan.nreport.bssid.info.security",
- FT_BOOLEAN, 32, NULL, 0x00000004,
- "Indicates that the AP identified by this BSSID supports the same security provisioning as used by the STA in its current association", HFILL }},
+ {&hf_ieee80211_htc_mfb,
+ {"MFB", "wlan.htc.mfb",
+ FT_UINT32, BASE_HEX, NULL, 0x00FFFE00,
+ "Recommended MFB", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_key_scope,
- {"Key Scope", "wlan.nreport.bssid.info.keyscope",
- FT_BOOLEAN, 32, NULL, 0x00000008,
- "indicates the AP indicated by this BSSID has the same authenticator as the AP sending the report", HFILL }},
+ {&hf_ieee80211_htc_num_sts,
+ {"NUM_STS", "wlan.htc.num_sts",
+ FT_UINT32, BASE_DEC, NULL, 0x00000E00,
+ "Recommended NUM_STS", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability,
- {"Capability", "wlan.nreport.bssid.info.capability",
- FT_UINT32, BASE_HEX, NULL, 0x000003F0,
- "Contains selected capability information for the AP indicated by this BSSID", HFILL }},
+ {&hf_ieee80211_htc_vht_mcs,
+ {"VHT-MCS", "wlan.htc.vht_mcs",
+ FT_UINT32, BASE_DEC, NULL, 0x0000F000,
+ "Recommended VHT-MCS", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_spec_mng,
- {"Spectrum Management", "wlan.nreport.bssid.info.capability.specmngt",
- FT_BOOLEAN, 32, NULL, 0x00000010,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_bw,
+ {"BW", "wlan.htc.bw",
+ FT_UINT32, BASE_DEC, VALS(ieee80211_htc_bw_recommended_vht_mcs_vals), 0x00030000,
+ "Bandwidth for recommended VHT-MCS", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_qos,
- {"QoS", "wlan.nreport.bssid.info.capability.qos",
- FT_BOOLEAN, 32, NULL, 0x00000020,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_snr,
+ {"SNR", "wlan.htc.snr",
+ FT_INT32, BASE_DEC, NULL, 0x00FC0000,
+ "Average SNR + 22", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_apsd,
- {"APSD", "wlan.nreport.bssid.info.capability.apsd",
- FT_BOOLEAN, 32, NULL, 0x00000040,
+ {&hf_ieee80211_htc_reserved3,
+ {"Reserved", "wlan.htc.reserved3",
+ FT_UINT32, BASE_HEX, NULL, 0x1F000000,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_radio_msnt,
- {"Radio Measurement", "wlan.nreport.bssid.info.capability.radiomsnt",
- FT_BOOLEAN, 32, NULL, 0x00000080,
+ {&hf_ieee80211_htc_gid_h,
+ {"GID-H", "wlan.htc.gid_h",
+ FT_UINT32, BASE_DEC, NULL, 0x07000000,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_dback,
- {"Delayed Block Ack", "wlan.nreport.bssid.info.capability.dback",
- FT_BOOLEAN, 32, NULL, 0x000000100,
+ {&hf_ieee80211_htc_coding_type,
+ {"Coding type", "wlan.htc.coding_type",
+ FT_UINT32, BASE_DEC, VALS(ieee80211_htc_coding_type_vals), 0x08000000,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_capability_iback,
- {"Immediate Block Ack", "wlan.nreport.bssid.info.capability.iback",
- FT_BOOLEAN, 32, NULL, 0x00000200,
+ {&hf_ieee80211_htc_fb_tx_type,
+ {"FB Tx type", "wlan.htc.fb_tx_type",
+ FT_UINT32, BASE_DEC, VALS(ieee80211_htc_fb_tx_type_vals), 0x10000000,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_mobility_domain,
- {"Mobility Domain", "wlan.nreport.bssid.info.mobilitydomain",
- FT_BOOLEAN, 32, NULL, 0x00000400,
- "", HFILL }},
-
- {&hf_ieee80211_tag_neighbor_report_bssid_info_high_throughput,
- {"High Throughput Control (+HTC)", "wlan.nreport.bssid.info.hthoughput",
- FT_BOOLEAN, 32, NULL, 0x00000800,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_unsolicited_mfb,
+ {"Unsolicited MFB", "wlan.htc.unsolicited_mfb",
+ FT_BOOLEAN, 32, NULL, HTC_UNSOLICITED_MFB,
+ "High Throughput Control Unsolicited MFB", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_very_high_throughput,
- {"Very High Throughput (+VHT)", "wlan.nreport.bssid.info.vht",
- FT_BOOLEAN, 32, NULL, 0x00001000,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_ac_constraint,
+ {"AC Constraint", "wlan.htc.ac_constraint",
+ FT_BOOLEAN, 32, NULL, 0x40000000,
+ "High Throughput Control AC Constraint", HFILL }},
- {&hf_ieee80211_tag_neighbor_report_bssid_info_ftm,
- {"Fine Timing Measurement (FTM)", "wlan.nreport.bssid.info.ftm",
- FT_BOOLEAN, 32, NULL, 0x00002000,
- NULL, HFILL }},
+ {&hf_ieee80211_htc_rdg_more_ppdu,
+ {"RDG/More PPDU", "wlan.htc.rdg_more_ppdu",
+ FT_BOOLEAN, 32, NULL, 0x80000000,
+ "High Throughput Control RDG/More PPDU", HFILL }},
+ /* End: HT Control (+HTC) */
- {&hf_ieee80211_tag_neighbor_report_bssid_info_reserved,
- {"Reserved", "wlan.nreport.bssid.info.reserved",
- FT_UINT32, BASE_HEX, NULL, 0xFFFFC000,
- "Must be zero", HFILL }},
+ /* MDIE */
+ {&hf_ieee80211_tag_mobility_domain_mdid,
+ {"Mobility Domain Identifier", "wlan.mobility_domain.mdid",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_ope_class,
- {"Operating Class", "wlan.nreport.opeclass",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_mobility_domain_ft_capab,
+ {"FT Capability and Policy", "wlan.mobility_domain.ft_capab",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_channel_number,
- {"Channel Number", "wlan.nreport.channumber",
- FT_UINT8, BASE_CUSTOM, CF_FUNC(channel_number_custom), 0,
+ {&hf_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds,
+ {"Fast BSS Transition over DS",
+ "wlan.mobility_domain.ft_capab.ft_over_ds",
+ FT_UINT8, BASE_HEX, NULL, 0x01,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_phy_type,
- {"PHY Type", "wlan.nreport.phytype",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_mobility_domain_ft_capab_resource_req,
+ {"Resource Request Protocol Capability",
+ "wlan.mobility_domain.ft_capab.resource_req",
+ FT_UINT8, BASE_HEX, NULL, 0x02,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_subelement_id,
- {"Subelement ID", "wlan.nreport.subelement_id",
- FT_UINT8, BASE_HEX, VALS(ieee80211_neighbor_report_subelement_id_vals), 0,
+ /* FTIE */
+ {&hf_ieee80211_tag_ft_mic_control,
+ {"MIC Control", "wlan.ft.mic_control",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_subelement_length,
- {"Length", "wlan.nreport.subelement_length",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_ft_element_count,
+ {"Element Count", "wlan.ft.element_count",
+ FT_UINT16, BASE_DEC, NULL, 0xff00,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_subelement_data,
- {"Subelement Data", "wlan.nreport.subelement_data",
+ {&hf_ieee80211_tag_ft_mic,
+ {"MIC", "wlan.ft.mic",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref,
- {"Preference", "wlan.nreport.subelement.bss_trn_can_pref",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_ft_anonce,
+ {"ANonce", "wlan.ft.anonce",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf,
- {"BSS Termination TSF", "wlan.nreport.subelement.bss_ter_tsf",
- FT_UINT64, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_ft_snonce,
+ {"SNonce", "wlan.ft.snonce",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_neighbor_report_subelement_bss_dur,
- {"Duration", "wlan.nreport.subelement.bss_dur",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_ft_subelem_id,
+ {"Subelement ID", "wlan.ft.subelem.id",
+ FT_UINT8, BASE_DEC, VALS(ft_subelem_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_supported_ope_classes_current,
- {"Current Operating Class", "wlan.supopeclass.current",
+ {&hf_ieee80211_tag_ft_subelem_len,
+ {"Length", "wlan.ft.subelem.len",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_tag_supported_ope_classes_alternate,
- {"Alternate Operating Classes", "wlan.supopeclass.alt",
- FT_NONE, BASE_NONE, 0x0, 0,
+ {&hf_ieee80211_tag_ft_subelem_data,
+ {"Data", "wlan.ft.subelem.data",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_type,
- {"Type", "wlan.wfa.ie.type",
- FT_UINT8, BASE_HEX, VALS(ieee802111_wfa_ie_type_vals), 0,
+ {&hf_ieee80211_tag_ft_subelem_r1kh_id,
+ {"PMK-R1 key holder identifier (R1KH-ID)", "wlan.ft.subelem.r1kh_id",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_version,
- {"WPA Version", "wlan.wfa.ie.wpa.version",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_ft_subelem_gtk_key_info,
+ {"Key Info", "wlan.ft.subelem.gtk.key_info",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_mcs,
- {"Multicast Cipher Suite", "wlan.wfa.ie.wpa.mcs",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_mcs_base_custom), 0,
- "Contains the cipher suite selector used by the BSS to protect broadcast/multicasttraffic", HFILL }},
-
- {&hf_ieee80211_wfa_ie_wpa_mcs_oui,
- {"Multicast Cipher Suite OUI", "wlan.wfa.ie.wpa.mcs.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
+ {&hf_ieee80211_tag_ft_subelem_gtk_key_id,
+ {"Key ID", "wlan.ft.subelem.gtk.key_id",
+ FT_UINT16, BASE_DEC, NULL, 0x0003,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_mcs_type,
- {"Multicast Cipher Suite type", "wlan.wfa.ie.wpa.mcs.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_ft_subelem_gtk_key_length,
+ {"Key Length", "wlan.ft.subelem.gtk.key_length",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_mcs_wfa_type,
- {"Multicast Cipher Suite type", "wlan.wfa.ie.wpa.mcs.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_cipher_vals), 0,
+ {&hf_ieee80211_tag_ft_subelem_gtk_rsc,
+ {"RSC", "wlan.ft.subelem.gtk.rsc",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_ucs_count,
- {"Unicast Cipher Suite Count", "wlan.wfa.ie.wpa.ucs.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the number of pairwise cipher suite selectors that are contained in the Unicast Cipher Suite List", HFILL }},
-
- {&hf_ieee80211_wfa_ie_wpa_ucs_list,
- {"Unicast Cipher Suite List", "wlan.wfa.ie.wpa.ucs.list",
- FT_NONE, BASE_NONE, NULL, 0,
- "Contains a series of cipher suite selectors that indicate the Unicast cipher suites", HFILL }},
+ {&hf_ieee80211_tag_ft_subelem_gtk_key,
+ {"GTK", "wlan.ft.subelem.gtk.key",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_ucs,
- {"Unicast Cipher Suite", "wlan.wfa.ie.wpa.ucs",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_ucs_base_custom), 0,
+ {&hf_ieee80211_tag_ft_subelem_r0kh_id,
+ {"PMK-R0 key holder identifier (R0KH-ID)", "wlan.ft.subelem.r0kh_id",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_ucs_oui,
- {"Unicast Cipher Suite OUI", "wlan.wfa.ie.wpau.cs.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
+ {&hf_ieee80211_tag_ft_subelem_igtk_key_id,
+ {"Key ID", "wlan.ft.subelem.igtk.key_id",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_ucs_type,
- {"Unicast Cipher Suite type", "wlan.wfa.ie.wpa.ucs.type",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_ft_subelem_igtk_ipn,
+ {"IPN", "wlan.ft.subelem.igtk.ipn",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_ucs_wfa_type,
- {"Unicast Cipher Suite type", "wlan.wfa.ie.wpa.ucs.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_cipher_vals), 0,
+ {&hf_ieee80211_tag_ft_subelem_igtk_key_length,
+ {"Key Length", "wlan.ft.subelem.igtk.key_length",
+ FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_akms_count,
- {"Auth Key Management (AKM) Suite Count", "wlan.wfa.ie.wpa.akms.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- "Indicates the number of Auth Key Management suite selectors that are contained in the Auth Key Management Suite List", HFILL }},
+ {&hf_ieee80211_tag_ft_subelem_igtk_key,
+ {"Wrapped Key (IGTK)", "wlan.ft.subelem.igtk.key",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_akms_list,
- {"Auth Key Management (AKM) List", "wlan.wfa.ie.wpa.akms.list",
- FT_NONE, BASE_NONE, NULL, 0,
- "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }},
+ /* RIC Data IE: 802.11-2012: 8.4.2.52 */
+ {&hf_ieee80211_tag_ric_data_id,
+ {"Resource Handshake Identifier", "wlan.ric_data.id",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_akms,
- {"Auth Key Management (AKM) Suite", "wlan.wfa.ie.wpa.akms",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(wpa_akms_base_custom), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_ric_data_desc_cnt,
+ {"Resource Descriptor Count", "wlan.ric_data.desc_cnt",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_akms_oui,
- {"Auth Key Management (AKM) OUI", "wlan.wfa.ie.wpa.akms.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_ric_data_status_code,
+ {"Status Code", "wlan.ric_data.status_code",
+ FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
+ "Status of requested Resource", HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_akms_type,
- {"Auth Key Management (AKM) type", "wlan.wfa.ie.wpa.akms.type",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ /* OBSS IE: 802.11-2012: 8.4.2.61 */
+ {&hf_ieee80211_tag_obss_spd,
+ {"Scan Passive Dwell", "wlan.obss.spd",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wpa_akms_wfa_type,
- {"Auth Key Management (AKM) type", "wlan.wfa.ie.wpa.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wpa_keymgmt_vals), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_obss_sad,
+ {"Scan Active Dwell", "wlan.obss.sad",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_subtype,
- {"WME Subtype", "wlan.wfa.ie.wme.subtype",
- FT_UINT8, BASE_DEC, VALS(ieee802111_wfa_ie_wme_type), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_obss_cwtsi,
+ {"Channel Width Trigger Scan Interval", "wlan.obss.cwtsi",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_version,
- {"WME Version", "wlan.wfa.ie.wme.version",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_obss_sptpc,
+ {"Scan Passive Total Per Channel", "wlan.obss.sptpc",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info,
- {"WME QoS Info", "wlan.wfa.ie.wme.qos_info",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_obss_satpc,
+ {"Scan Active Total Per Channel", "wlan.obss.satpc",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_sta_max_sp_length,
- {"Max SP Length", "wlan.wfa.ie.wme.qos_info.sta.max_sp_length",
- FT_UINT8, BASE_HEX, VALS(ieee802111_wfa_ie_wme_qos_info_sta_max_sp_length_vals), 0x60,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_obss_wctdf,
+ {"Width Channel Transition Delay Factor", "wlan.obss.wctdf",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_be,
- {"AC_BE", "wlan.wfa.ie.wme.qos_info.sta.ac_be",
- FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x08,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_obss_sat,
+ {"Scan Activity Threshold", "wlan.obss.sat",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_bk,
- {"AC_BK", "wlan.wfa.ie.wme.qos_info.sta.ac_bk",
- FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x04,
- NULL, HFILL }},
+ /* Group Data Cypher Suite: 802.11-2012: 8.4.2.25.1 */
+ {&hf_group_data_cipher_suite_oui,
+ {"Group Data Cypher Suite OUI", "wlan.osen.gdcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vi,
- {"AC_VI", "wlan.wfa.ie.wme.qos_info.sta.ac_vi",
- FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x02,
- NULL, HFILL }},
+ /* TODO: List the suite names ... */
+ {&hf_group_data_cipher_suite_type,
+ {"Group Data Cypher Suite type", "wlan.osen.gdcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_sta_ac_vo,
- {"AC_VO", "wlan.wfa.ie.wme.qos_info.sta.ac_vo",
- FT_BOOLEAN, 8, TFS(&ieee802111_wfa_ie_wme_qos_info_sta_ac_tfs), 0x01,
- NULL, HFILL }},
+ {&hf_osen_pcs_count,
+ {"OSEN Pairwise Cipher Suite Count", "wlan.osen.pwcs.count",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_sta_reserved,
- {"Reserved", "wlan.wfa.ie.wme.qos_info.sta.reserved",
- FT_UINT8, BASE_HEX, NULL, 0x90,
- "Must Be Zero", HFILL }},
+ {&hf_osen_pairwise_cipher_suite_oui,
+ {"OSEN Pairwise Cypher Suite OUI", "wlan.osen.pwcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_ap_u_apsd,
- {"U-APSD", "wlan.wfa.ie.wme.qos_info.ap.u_apsd",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
- "Indicates the WMM AP is currently supporting unscheduled automatic power save delivery", HFILL }},
+ {&hf_osen_pairwise_cipher_suite_type,
+ {"OSEN Pairwise Cypher Suite type", "wlan.osen.pwcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_ap_parameter_set_count,
- {"Parameter Set Count", "wlan.wfa.ie.wme.qos_info.ap.parameter_set_count",
- FT_UINT8, BASE_HEX, NULL, 0x0F,
- NULL, HFILL }},
+ {&hf_osen_akm_count,
+ {"OSEN AKM Cipher Suite Count", "wlan.osen.akms.count",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_qos_info_ap_reserved,
- {"Reserved", "wlan.wfa.ie.wme.qos_info.ap.reserved",
- FT_UINT8, BASE_HEX, NULL, 0x70,
- "Must Be Zero", HFILL }},
+ {&hf_osen_akm_cipher_suite_oui,
+ {"OSEN AKM Cipher Suite OUI", "wlan.osen.akms.oui",
+ FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
+
+ {&hf_osen_akm_cipher_suite_type,
+ {"OSEN AKM Cipher Suite Type", "wlan.osen.akms.type",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_osen_rsn_cap_preauth,
+ {"RSN Pre-Auth capabilities", "wlan.osen.rsn.capabilities.preauth",
+ FT_BOOLEAN, 16, TFS(&rsn_preauth_flags), 0x0001, NULL, HFILL }},
+
+ {&hf_osen_rsn_cap_no_pairwise,
+ {"RSN No Pairwise capabilities", "wlan.osen.rsn.capabilities.no_pairwise",
+ FT_BOOLEAN, 16, TFS(&rsn_no_pairwise_flags), 0x0002, NULL, HFILL }},
+
+ {&hf_osen_rsn_cap_ptksa_replay_counter,
+ {"RSN PTKSA Replay Counter capabilities",
+ "wlan.osen.rsn.capabilities.ptksa_replay_counter",
+ FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_reserved,
- {"Reserved", "wlan.wfa.ie.wme.reserved",
- FT_BYTES, BASE_NONE, NULL, 0,
- "Must Be Zero", HFILL }},
+ {&hf_osen_rsn_cap_gtksa_replay_counter,
+ {"RSN GTKSA Replay Counter capabilities",
+ "wlan.osen.rsn.capabilities.gtksa_replay_counter",
+ FT_UINT16, BASE_HEX, VALS(rsn_cap_replay_counter), 0x0030, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_ac_parameters,
- {"Ac Parameters", "wlan.wfa.ie.wme.acp",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_osen_group_management_cipher_suite_oui,
+ {"OSEN Group Management Cipher Suite OUI", "wlan.osen.gmcs.oui",
+ FT_UINT24, BASE_OUI, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_aci_aifsn,
- {"ACI / AIFSN Field", "wlan.wfa.ie.wme.acp.aci_aifsn",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_osen_group_management_cipher_suite_type,
+ {"OSEN Group Management Cipher Suite Type", "wlan.osen.gmcs.type",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_aci,
- {"ACI", "wlan.wfa.ie.wme.acp.aci",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wfa_ie_wme_acs_vals), 0x60,
- NULL, HFILL }},
+ {&hf_osen_rsn_cap_mfpr,
+ {"Management Frame Protection Required", "wlan.osen.rsn.capabilities.mfpr",
+ FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0040, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_acm,
- {"Admission Control Mandatory", "wlan.wfa.ie.wme.acp.acm",
- FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
- NULL, HFILL }},
+ {&hf_osen_rsn_cap_mfpc,
+ {"Management Frame Protection Capable", "wlan.osen.rsn.capabilities.mfpc",
+ FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x0080, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_aifsn,
- {"AIFSN", "wlan.wfa.ie.wme.acp.aifsn",
- FT_UINT8, BASE_DEC, NULL, 0x0F,
- NULL, HFILL }},
+ {&hf_osen_rsn_cap_jmr,
+ {"Joint Multi-band RSNA", "wlan.osen.rsn.capabilities.jmr",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_reserved,
- {"Reserved", "wlan.wfa.ie.wme.acp.reserved",
- FT_UINT8, BASE_DEC, NULL, 0x80,
- "Must be Zero", HFILL }},
+ {&hf_osen_rsn_cap_peerkey,
+ {"PeerKey Enabled", "wlan.osen.rsn.capabilities.peerkey",
+ FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), 0x200, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_ecw,
- {"ECW", "wlan.wfa.ie.wme.acp.ecw",
- FT_UINT8, BASE_HEX, NULL, 0x00,
- NULL, HFILL }},
+ {&hf_osen_rsn_cap_flags,
+ {"RSN Capability Flags", "wlan.osen.rsn.cabailities.flags",
+ FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_ecw_max,
- {"ECW Max", "wlan.wfa.ie.wme.acp.ecw.max",
- FT_UINT8, BASE_DEC, NULL, 0xF0,
- NULL, HFILL }},
+ {&hf_osen_rsn_spp_a_msdu_capable,
+ {"SPP A-MSDU Capable", "wlan.osen.rsn.capabilities.spp_a_msdu_cap",
+ FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x0400, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_ecw_min,
- {"ECW Min", "wlan.wfa.ie.wme.acp.ecw.min",
- FT_UINT8, BASE_DEC, NULL, 0x0F,
- NULL, HFILL }},
+ {&hf_osen_rsn_spp_a_msdu_required,
+ {"SPP A-MSDU Required", "wlan.osen.rsn.capabilities.spp_a_msdu_req",
+ FT_BOOLEAN, 16, TFS(&tfs_required_not_required), 0x0800, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_cw_max,
- {"CW Max", "wlan.wfa.ie.wme.acp.cw.max",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_osen_rsn_pbac,
+ {"Protected Block Ack Agreement Capable", "wlan.osen.rsn.capabilities.pbac",
+ FT_BOOLEAN, 16, TFS(&tfs_capable_not_capable), 0x1000, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_cw_min,
- {"CW Min", "wlan.wfa.ie.wme.acp.cw.min",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_osen_extended_key_id_iaf,
+ {"Extended Key ID for Individually Addressed Frames",
+ "wlan.osn.rsn.extended_key_id_iaf",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_acp_txop_limit,
- {"TXOP Limit", "wlan.wfa.ie.wme.acp.txop_limit",
- FT_UINT16, BASE_DEC, NULL, 0x00,
- NULL, HFILL }},
+ {&hf_osen_reserved,
+ {"Reserved", "wlan.osen.rsn.capabilities.reserved",
+ FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo,
- {"TS Info", "wlan.wfa.ie.wme.tspec.ts_info",
- FT_UINT24, BASE_HEX, NULL, 0,
- "Traffic Stream (TS) Info", HFILL }},
+ {&hf_osen_pmkid_count,
+ {"OSEN PMKID Count", "wlan.osen.pmkid.count",
+ FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_tid,
- {"TID", "wlan.wfa.ie.wme.tspec.ts_info.tid",
- FT_UINT24, BASE_DEC, NULL, 0x00001E,
- "Traffic Stream Info ID (TID)", HFILL }},
+ {&hf_osen_pmkid,
+ {"OSEN PKMID", "wlan.osen.pmkid.bytes",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_direction,
- {"Direction", "wlan.wfa.ie.wme.tspec.ts_info.dir",
- FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_direction_vals), 0x000060,
- "Traffic Stream (TS) Info Direction", HFILL }},
+ /* RIC Descriptor IE: 802.11-2012: 8.4.2.53 */
+ {&hf_ieee80211_tag_ric_desc_rsrc_type,
+ {"Resource Type", "wlan.ric_desc.rsrc_type",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_psb,
- {"PSB", "wlan.wfa.ie.wme.tspec.ts_info.psb",
- FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_psb_vals), 0x000400,
- "Traffic Stream (TS) Info Power Save Behavior (PSB)", HFILL }},
+ {&hf_ieee80211_tag_ric_desc_var_params,
+ {"Variable Params", "wlan.ric_desc.var_params",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_up,
- {"UP", "wlan.wfa.ie.wme.tspec.ts_info.up",
- FT_UINT24, BASE_DEC, VALS(ieee80211_wfa_ie_wme_tspec_tsinfo_up_vals), 0x003800,
- "Traffic Stream (TS) Info User Priority (UP)", HFILL }},
+ /* MMIE */
+ {&hf_ieee80211_tag_mmie_keyid,
+ {"KeyID", "wlan.mmie.keyid",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_tsinfo_reserved,
- {"Reserved", "wlan.wfa.ie.wme.tspec.ts_info.reserved",
- FT_UINT24, BASE_HEX, NULL, 0xFFC381,
- "Must be Zero", HFILL }},
+ {&hf_ieee80211_tag_mmie_ipn,
+ {"IPN", "wlan.mmie.ipn",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_nor_msdu,
- {"Normal MSDU Size", "wlan.wfa.ie.wme.tspec.nor_msdu",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_mmie_mic,
+ {"MIC", "wlan.mmie.mic",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_max_msdu,
- {"Maximum MSDU Size", "wlan.wfa.ie.wme.tspec.max_msdu",
+ /* WAPI Parameter Set*/
+ {&hf_ieee80211_tag_wapi_param_set_version,
+ {"Version", "wlan.wapi.version",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_min_srv,
- {"Minimum Service Interval", "wlan.wfa.ie.wme.tspec.min_srv",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
-
- {&hf_ieee80211_wfa_ie_wme_tspec_max_srv,
- {"Maximum Service Interval", "wlan.wfa.ie.wme.tspec.max_srv",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_akm_suite_count,
+ {"AKM Suite Count", "wlan.wapi.akm_suite.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_inact_int,
- {"Inactivity Interval", "wlan.wfa.ie.wme.tspec.inact_int",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_akm_suite_oui,
+ {"AKM Suite OUI", "wlan.wapi.akm_suite.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_susp_int,
- {"Suspension Interval", "wlan.wfa.ie.wme.tspec.susp_int",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_akm_suite_type,
+ {"AKM Suite Type", "wlan.wapi.akm_suite.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_suite_type) , 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_srv_start,
- {"Service Start Time", "wlan.wfa.ie.wme.tspec.srv_start",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count,
+ {"Unicast Cipher Suite Count", "wlan.wapi.unicast_cipher.suite.count",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_min_data,
- {"Minimum Data Rate", "wlan.wfa.ie.wme.tspec.min_data",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui,
+ {"Unicast Cipher Suite OUI", "wlan.wapi.unicast_cipher.suite.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_mean_data,
- {"Mean Data Rate", "wlan.wfa.ie.wme.tspec.mean_data",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type,
+ {"Unicast Cipher Suite Type", "wlan.wapi.unicast_cipher.suite.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_cipher_type) , 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_peak_data,
- {"Peak Data Rate", "wlan.wfa.ie.wme.tspec.peak_data",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui,
+ {"Multicast Cipher Suite OUI", "wlan.wapi.multicast_cipher.suite.oui",
+ FT_UINT24, BASE_OUI, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_burst_size,
- {"Burst Size", "wlan.wfa.ie.wme.tspec.burst_size",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type,
+ {"Multicast Cipher Suite Type", "wlan.wapi.multicast_cipher.suite.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_cipher_type) , 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_delay_bound,
- {"Delay Bound", "wlan.wfa.ie.wme.tspec.delay_bound",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_capab,
+ {"WAPI Capability Info", "wlan.wapi.capab",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_min_phy,
- {"Minimum PHY Rate", "wlan.wfa.ie.wme.tspec.min_phy",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_capab_preauth,
+ {"Supports Preauthentication?", "wlan.wapi.capab.preauth",
+ FT_BOOLEAN, 16 , NULL, 0x0001,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_surplus,
- {"Surplus Bandwidth Allowance", "wlan.wfa.ie.wme.tspec.surplus",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_wapi_param_set_capab_rsvd,
+ {"Reserved", "wlan.wapi.capab.rsvd",
+ FT_UINT16, BASE_DEC , NULL, 0xFFFE,
NULL, HFILL }},
- {&hf_ieee80211_wfa_ie_wme_tspec_medium,
- {"Medium Time", "wlan.wfa.ie.wme.tspec.medium",
+ {&hf_ieee80211_tag_wapi_param_set_bkid_count,
+ {"No of BKID's", "wlan.wapi.bkid.count",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_ie_pmkid,
- {"RSN PMKID", "wlan.rsn.ie.pmkid",
+ {&hf_ieee80211_tag_wapi_param_set_bkid_list,
+ {"BKID", "wlan.wapi.bkid",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_rsn_ie_unknown,
- {"RSN Unknown", "wlan.rsn.ie.unknown",
+ /* BSS Max Idle Period */
+ {&hf_ieee80211_tag_bss_max_idle_period,
+ {"BSS Max Idle Period (1000 TUs)", "wlan.bss_max_idle.period",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_ieee80211_tag_bss_max_idle_options_protected,
+ {"BSS Max Idle Period Options: Protected Keep-Alive Required",
+ "wlan.bss_max_idle.options.protected",
+ FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
+
+ /* TFS Request */
+ {&hf_ieee80211_tag_tfs_request_id,
+ {"TFS ID", "wlan.tfs_request.id",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+
+ {&hf_ieee80211_tag_tfs_request_ac_delete_after_match,
+ {"TFS Action Code - Delete after match",
+ "wlan.tfs_request.action_code.delete_after_match",
+ FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
+
+ {&hf_ieee80211_tag_tfs_request_ac_notify,
+ {"TFS Action Code - Notify",
+ "wlan.tfs_request.action_code.notify",
+ FT_UINT8, BASE_DEC, NULL, 0x02, NULL, HFILL }},
+
+ {&hf_ieee80211_tag_tfs_request_subelem_id,
+ {"Subelement ID", "wlan.tfs_request.subelem.id",
+ FT_UINT8, BASE_DEC, VALS(tfs_request_subelem_ids), 0,
+ "TFS Request Subelement ID", HFILL }},
+
+ {&hf_ieee80211_tag_tfs_request_subelem_len,
+ {"Length", "wlan.tfs_request.subelem.len",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "TFS Request Subelement Length", HFILL }},
+
+ {&hf_ieee80211_tag_tfs_request_subelem,
+ {"Subelement Data", "wlan.tfs_request.subelem",
FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ "TFS Request Subelement Data", HFILL }},
- {&hf_ieee80211_marvell_ie_type,
- {"Type", "wlan.marvell.ie.type",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ /* TFS Response */
+ {&hf_ieee80211_tag_tfs_response_subelem_id,
+ {"Subelement ID", "wlan.tfs_response.subelem.id",
+ FT_UINT8, BASE_DEC, VALS(tfs_response_subelem_ids), 0,
+ "TFS Response Subelement ID", HFILL }},
- {&hf_ieee80211_marvell_ie_mesh_subtype,
- {"Subtype", "wlan.marvell.ie.subtype",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tfs_response_subelem_len,
+ {"Length", "wlan.tfs_response.subelem.len",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ "TFS Response Subelement Length", HFILL }},
- {&hf_ieee80211_marvell_ie_mesh_version,
- {"Version", "wlan.marvell.ie.version",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tfs_response_subelem,
+ {"Subelement Data", "wlan.tfs_response.subelem",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "TFS Response Subelement Data", HFILL }},
- {&hf_ieee80211_marvell_ie_mesh_active_proto_id,
- {"Path Selection Protocol", "wlan.marvell.ie.proto_id",
- FT_UINT8, BASE_HEX, VALS(mesh_path_selection_codes), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tfs_response_status,
+ {"TFS Response Status", "wlan.tfs_response.status",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_marvell_ie_mesh_active_metric_id,
- {"Path Selection Metric", "wlan.marvell.ie.metric_id",
- FT_UINT8, BASE_HEX, VALS(mesh_metric_codes), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_tfs_response_id,
+ {"TFS ID", "wlan.tfs_response.tfs_id",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_marvell_ie_mesh_cap,
- {"Mesh Capabilities", "wlan.marvell.ie.cap",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ /* WNM-Sleep Mode */
+ {&hf_ieee80211_tag_wnm_sleep_mode_action_type,
+ {"Action Type", "wlan.wnm_sleep_mode.action_type",
+ FT_UINT8, BASE_DEC, VALS(wnm_sleep_mode_action_types), 0,
+ "WNM-Sleep Mode Action Type", HFILL }},
- {&hf_ieee80211_marvell_ie_data,
- { "Marvell IE data", "wlan.marvell.data",
- FT_BYTES, BASE_NONE, NULL, 0x0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_wnm_sleep_mode_response_status,
+ {"WNM-Sleep Mode Response Status",
+ "wlan.wnm_sleep_mode.response_status",
+ FT_UINT8, BASE_DEC, VALS(wnm_sleep_mode_response_status_vals), 0, NULL,
+ HFILL }},
- {&hf_ieee80211_atheros_ie_type,
- {"Type", "wlan.atheros.ie.type",
- FT_UINT8, BASE_HEX, VALS(atheros_ie_type_vals), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_wnm_sleep_mode_interval,
+ {"WNM-Sleep Interval", "wlan.wnm_sleep_mode.interval",
+ FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_subtype,
- {"Subtype", "wlan.atheros.ie.subtype",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_wnm_sub_elt_id,
+ {"Subelement ID", "wlan.wnm_subelt.id",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_version,
- {"Version", "wlan.atheros.ie.version",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_wnm_sub_elt_len,
+ {"Subelement len", "wlan.wnm_subelt.len",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_turbop,
- {"Turbo Prime", "wlan.ie.atheros.capabilities.turbop",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_TURBOP,
+ /* Time Advertisement */
+ {&hf_ieee80211_tag_time_adv_timing_capab,
+ {"Timing capabilities", "wlan.time_adv.timing_capab",
+ FT_UINT8, BASE_DEC, VALS(time_adv_timing_capab_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_comp,
- {"Compression", "wlan.ie.atheros.capabilities.comp",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_COMP,
+ {&hf_ieee80211_tag_time_adv_time_value,
+ {"Time Value", "wlan.time_adv.time_value",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_ff,
- {"Fast Frames", "wlan.ie.atheros.capabilities.ff",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_FF,
+ {&hf_ieee80211_tag_time_adv_time_value_year,
+ {"Time Value: Year", "wlan.time_adv.time_value.year",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_xr,
- {"eXtended Range", "wlan.ie.atheros.capabilities.xr",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_XR,
+ {&hf_ieee80211_tag_time_adv_time_value_month,
+ {"Time Value: Month", "wlan.time_adv.time_value.month",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_ar,
- {"Advanced Radar", "wlan.ie.atheros.capabilities.ar",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_AR,
+ {&hf_ieee80211_tag_time_adv_time_value_day,
+ {"Time Value: Day", "wlan.time_adv.time_value.month",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_burst,
- {"Burst", "wlan.ie.atheros.capabilities.burst",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_BURST,
+ {&hf_ieee80211_tag_time_adv_time_value_hours,
+ {"Time Value: Hours", "wlan.time_adv.time_value.hours",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_wme,
- {"CWMin tuning", "wlan.ie.atheros.capabilities.wme",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_WME,
+ {&hf_ieee80211_tag_time_adv_time_value_minutes,
+ {"Time Value: Minutes", "wlan.time_adv.time_value.minutes",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_cap_f_boost,
- {"Boost", "wlan.ie.atheros.capabilities.boost",
- FT_BOOLEAN, 8, NULL, ATHEROS_IE_CAP_BOOST,
+ {&hf_ieee80211_tag_time_adv_time_value_seconds,
+ {"Time Value: Seconds", "wlan.time_adv.time_value.seconds",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_advcap_cap,
- {"Capabilities", "wlan.atheros.ie.advcap.cap",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_time_adv_time_value_milliseconds,
+ {"Time Value: Milliseconds", "wlan.time_adv.time_value.milliseconds",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_advcap_defkey,
- {"Default key index", "wlan.atheros.ie.advcap.defkey",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_time_adv_time_value_reserved,
+ {"Time Value: Reserved", "wlan.time_adv.time_value.reserved",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_xr_info,
- {"Info", "wlan.atheros.ie.xr.info",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_time_adv_time_error,
+ {"Time Error", "wlan.time_adv.time_error",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_xr_base_bssid,
- {"Base BSS Id", "wlan.atheros.ie.xr.base_bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_time_adv_time_update_counter,
+ {"Time Update Counter", "wlan.time_adv.time_update_counter",
+ FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_xr_xr_bssid,
- {"XR BSS Id", "wlan.atheros.ie.xr.xr_bssid",
- FT_ETHER, BASE_NONE, NULL, 0,
+ /* Time Zone */
+ {&hf_ieee80211_tag_time_zone,
+ {"Time Zone", "wlan.time_zone",
+ FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_xr_xr_beacon,
- {"XR Beacon Interval", "wlan.atheros.ie.xr.xr_beacon",
- FT_UINT32, BASE_CUSTOM, CF_FUNC(beacon_interval_base_custom), 0,
+ /* Interworking */
+ {&hf_ieee80211_tag_interworking_access_network_type,
+ {"Access Network Type", "wlan.interworking.access_network_type",
+ FT_UINT8, BASE_DEC, VALS(access_network_type_vals), 0x0f,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_xr_base_cap,
- {"Base capabilities", "wlan.atheros.ie.xr.base_cap",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_interworking_internet,
+ {"Internet", "wlan.interworking.internet",
+ FT_UINT8, BASE_DEC, NULL, 0x10,
NULL, HFILL }},
- {&hf_ieee80211_atheros_ie_xr_xr_cap,
- {"XR capabilities", "wlan.atheros.ie.xr.xr_cap",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_interworking_asra,
+ {"ASRA", "wlan.interworking.asra",
+ FT_UINT8, BASE_DEC, NULL, 0x20,
+ "Additional Step Required for Access", HFILL }},
- {&hf_ieee80211_atheros_ie_data,
- {"Atheros IE data", "wlan.atheros.data",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_interworking_esr,
+ {"ESR", "wlan.interworking.esr",
+ FT_UINT8, BASE_DEC, NULL, 0x40,
+ "Emergency services reachable", HFILL }},
- {&hf_ieee80211_aironet_ie_type,
- {"Aironet IE type", "wlan.aironet.type",
- FT_UINT8, BASE_DEC, VALS(aironet_ie_type_vals), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_interworking_uesa,
+ {"UESA", "wlan.interworking.uesa",
+ FT_UINT8, BASE_DEC, NULL, 0x80,
+ "Unauthenticated emergency service accessible", HFILL }},
- {&hf_ieee80211_aironet_ie_dtpc,
- {"Aironet IE CCX DTCP", "wlan.aironet.dtpc",
- FT_INT8, BASE_DEC|BASE_UNIT_STRING, &units_dbm, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_interworking_hessid,
+ {"HESSID", "wlan.interworking.hessid",
+ FT_ETHER, BASE_NONE, NULL, 0,
+ "Homogeneous ESS identifier", HFILL }},
- {&hf_ieee80211_aironet_ie_dtpc_unknown,
- {"Aironet IE CCX DTCP Unknown", "wlan.aironet.dtpc_unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ /* QoS Map Set element */
+ {&hf_ieee80211_tag_qos_map_set_dscp_exc,
+ {"DSCP Exception", "wlan.qos_map_set.dscp_exception",
+ FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_aironet_ie_version,
- {"Aironet IE CCX version", "wlan.aironet.version",
+ {&hf_ieee80211_tag_qos_map_set_dscp_exc_val,
+ {"DSCP Value", "wlan.qos_map_set.dscp_value",
FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
-
- {&hf_ieee80211_aironet_ie_data,
- { "Aironet IE data", "wlan.aironet.data",
- FT_BYTES, BASE_NONE, NULL, 0x0,
- NULL, HFILL }},
+ "DSCP Exception - DSCP Value", HFILL }},
- {&hf_ieee80211_qbss_version,
- {"QBSS Version", "wlan.qbss.version",
+ {&hf_ieee80211_tag_qos_map_set_dscp_exc_up,
+ {"User Priority", "wlan.qos_map_set.up",
FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ "DSCP Exception - User Priority", HFILL }},
- {&hf_ieee80211_qbss_scount,
- {"Station Count", "wlan.qbss.scount",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_ieee80211_tag_qos_map_set_range,
+ {"DSCP Range description", "wlan.qos_map_set.range",
+ FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_qbss_cu,
- {"Channel Utilization", "wlan.qbss.cu",
+ {&hf_ieee80211_tag_qos_map_set_low,
+ {"DSCP Low Value", "wlan.qos_map_set.dscp_low_value",
FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ "DSCP Range description - DSCP Low Value", HFILL }},
- {&hf_ieee80211_qbss_adc,
- {"Available Admission Capacity", "wlan.qbss.adc",
+ {&hf_ieee80211_tag_qos_map_set_high,
+ {"DSCP High Value", "wlan.qos_map_set.dscp_high_value",
FT_UINT8, BASE_DEC, NULL, 0,
+ "DSCP Range description - DSCP High Value", HFILL }},
+
+ /* Advertisement Protocol */
+ {&hf_ieee80211_tag_adv_proto_resp_len_limit,
+ {"Query Response Length Limit", "wlan.adv_proto.resp_len_limit",
+ FT_UINT8, BASE_DEC, NULL, 0x7f,
NULL, HFILL }},
- {&hf_ieee80211_qbss2_cu,
- {"Channel Utilization", "wlan.qbss2.cu",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_adv_proto_pame_bi,
+ {"PAME-BI", "wlan.adv_proto.pame_bi",
+ FT_UINT8, BASE_DEC, NULL, 0x80,
+ "Pre-Association Message Xchange BSSID Independent (PAME-BI)", HFILL }},
+
+ {&hf_ieee80211_tag_adv_proto_id,
+ {"Advertisement Protocol ID", "wlan.adv_proto.id",
+ FT_UINT8, BASE_DEC, VALS(adv_proto_id_vals), 0,
NULL, HFILL }},
- {&hf_ieee80211_qbss2_gl,
- {"G.711 CU Quantum", "wlan.qbss2.glimit",
+ {&hf_ieee80211_tag_adv_vs_len,
+ {"Advertisement Protocol Vendor Specific length", "wlan.adv_proto.vs_len",
FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL}},
+#if 0
+ {&hf_ieee80211_tag_adv_proto_vs_info,
+ {"Advertisement Protocol Vendor Specific info", "wlan.adv_proto.vs_info",
+ FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL }},
+#endif
- {&hf_ieee80211_qbss2_cal,
- {"Call Admission Limit", "wlan.qbss2.cal",
+ /* Roaming Consortium */
+ {&hf_ieee80211_tag_roaming_consortium_num_anqp_oi,
+ {"Number of ANQP OIs", "wlan.roaming_consortium.num_anqp_oi",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_qbss2_scount,
- {"Station Count", "wlan.qbss2.scount",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_roaming_consortium_oi1_len,
+ {"OI #1 Length", "wlan.roaming_consortium.oi1_len",
+ FT_UINT8, BASE_DEC, NULL, 0x0f,
NULL, HFILL }},
- {&hf_ieee80211_aironet_ie_qos_reserved,
- {"Aironet IE QoS reserved", "wlan.aironet.qos.reserved",
- FT_UINT8, BASE_HEX, NULL, 0,
+ {&hf_ieee80211_tag_roaming_consortium_oi2_len,
+ {"OI #2 Length", "wlan.roaming_consortium.oi2_len",
+ FT_UINT8, BASE_DEC, NULL, 0xf0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_tag_roaming_consortium_oi1,
+ {"OI #1", "wlan.roaming_consortium.oi1",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_aironet_ie_qos_paramset,
- {"Aironet IE QoS paramset", "wlan.aironet.qos.paramset",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_roaming_consortium_oi2,
+ {"OI #2", "wlan.roaming_consortium.oi2",
+ FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_aironet_ie_qos_val,
- {"Aironet IE QoS valueset", "wlan.aironet.qos.val",
+ {&hf_ieee80211_tag_roaming_consortium_oi3,
+ {"OI #3", "wlan.roaming_consortium.oi3",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_aironet_ie_clientmfp,
- {"Aironet IE Client MFP", "wlan.aironet.clientmfp",
- FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
+ /* Timeout Interval */
+ {&hf_ieee80211_tag_timeout_int_type,
+ {"Timeout Interval Type", "wlan.timeout_int.type",
+ FT_UINT8, BASE_DEC, VALS(timeout_int_types), 0,
NULL, HFILL }},
- /* Vendor Specific : Nintendo */
- {&hf_ieee80211_vs_nintendo_type,
- {"Type", "wlan.vs.nintendo.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_vs_nintendo_type_vals), 0,
+ {&hf_ieee80211_tag_timeout_int_value,
+ {"Timeout Interval Value", "wlan.timeout_int.value",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_nintendo_length,
- {"Length", "wlan.vs.nintendo.length",
- FT_UINT8, BASE_DEC, NULL, 0,
+ /* Link Identifier */
+ {&hf_ieee80211_tag_link_id_bssid,
+ {"BSSID", "wlan.link_id.bssid",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_nintendo_servicelist,
- {"Servicelist", "wlan.vs.nintendo.servicelist",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_link_id_init_sta,
+ {"TDLS initiator STA Address", "wlan.link_id.init_sta",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_nintendo_service,
- {"Service", "wlan.vs.nintendo.service",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_link_id_resp_sta,
+ {"TDLS responder STA Address", "wlan.link_id.resp_sta",
+ FT_ETHER, BASE_NONE, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_nintendo_consoleid,
- {"Console ID", "wlan.vs.nintendo.consoleid",
- FT_BYTES, BASE_NONE, NULL, 0,
+ /* Wakeup Schedule */
+ {&hf_ieee80211_tag_wakeup_schedule_offset,
+ {"Offset", "wlan.wakeup_schedule.offset",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_nintendo_unknown,
- {"Unknown", "wlan.vs.nintendo.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_wakeup_schedule_interval,
+ {"Interval", "wlan.wakeup_schedule.interval",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- /* Vendor Specific : Aruba Networks */
- {&hf_ieee80211_vs_aruba_subtype,
- {"Subtype", "wlan.vs.aruba.subtype",
- FT_UINT8, BASE_DEC, VALS(ieee80211_vs_aruba_subtype_vals), 0,
+ {&hf_ieee80211_tag_wakeup_schedule_awake_window_slots,
+ {"Awake Window Slots", "wlan.wakeup_schedule.awake_window_slots",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_aruba_apname,
- {"AP Name", "wlan.vs.aruba.ap_name",
- FT_STRINGZ, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_wakeup_schedule_max_awake_dur,
+ {"Maximum Awake Window Duration", "wlan.wakeup_schedule.max_awake_dur",
+ FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_aruba_data,
- {"Data", "wlan.vs.aruba.data",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_wakeup_schedule_idle_count,
+ {"Idle Count", "wlan.wakeup_schedule.idle_count",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_mikrotik_unknown,
- {"Unknown", "wlan.vs.mikrotik.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
+ /* Channel Switch Timing */
+ {&hf_ieee80211_tag_channel_switch_timing_switch_time,
+ {"Switch Time", "wlan.channel_switch_timing.switch_time",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_mikrotik_subitem,
- {"Sub IE", "wlan.vs.mikrotik.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_channel_switch_timing_switch_timeout,
+ {"Switch Timeout", "wlan.channel_switch_timing.switch_timeout",
+ FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_mikrotik_subtype,
- {"Subtype", "wlan.vs.mikrotik.subtype",
+ /* PTI Control */
+ {&hf_ieee80211_tag_pti_control_tid,
+ {"TID", "wlan.pti_control.tid",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_mikrotik_sublength,
- {"Sublength", "wlan.vs.mikrotik.sublength",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_pti_control_sequence_control,
+ {"Sequence Control", "wlan.pti_control.sequence_control",
+ FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_mikrotik_subdata,
- {"Subdata", "wlan.vs.mikrotik.subdata",
- FT_BYTES, BASE_NONE, NULL, 0,
+ /* PU Buffer Status */
+ {&hf_ieee80211_tag_pu_buffer_status_ac_bk,
+ {"AC_BK traffic available", "wlan.pu_buffer_status.ac_bk",
+ FT_UINT8, BASE_DEC, NULL, 0x01,
NULL, HFILL }},
- /* Vendor Specific : Meru (Fortinet) */
- {&hf_ieee80211_vs_meru_subitem,
- {"Sub IE", "wlan.vs.meru.unknown",
- FT_NONE, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_tag_pu_buffer_status_ac_be,
+ {"AC_BE traffic available", "wlan.pu_buffer_status.ac_be",
+ FT_UINT8, BASE_DEC, NULL, 0x02,
NULL, HFILL }},
- {&hf_ieee80211_vs_meru_subtype,
- {"Subtype", "wlan.vs.meru.subtype",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_pu_buffer_status_ac_vi,
+ {"AC_VI traffic available", "wlan.pu_buffer_status.ac_vi",
+ FT_UINT8, BASE_DEC, NULL, 0x04,
NULL, HFILL }},
- {&hf_ieee80211_vs_meru_sublength,
- {"Sublength", "wlan.vs.meru.sublength",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_tag_pu_buffer_status_ac_vo,
+ {"AC_VO traffic available", "wlan.pu_buffer_status.ac_vo",
+ FT_UINT8, BASE_DEC, NULL, 0x08,
NULL, HFILL }},
- {&hf_ieee80211_vs_meru_subdata,
- {"Subdata", "wlan.vs.meru.subdata",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_mysterious_olpc_stuff,
+ {"Mysterious OLPC stuff", "wlan.mysterious_olpc_stuff",
+ FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
- /* Vendor Specific : Extreme (Zebra) */
- {&hf_ieee80211_vs_extreme_subtype,
- {"Subtype", "wlan.vs.extreme.subtype",
- FT_UINT8, BASE_DEC, VALS(ieee80211_vs_extreme_subtype_vals), 0,
- NULL, HFILL }},
+ {&hf_ieee80211_estimated_service_params,
+ {"Estimated Service Parameters", "wlan.ext_tag.estimated_service_params",
+ FT_UINT24, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_vs_extreme_subdata,
- {"Subdata", "wlan.vs.extreme.subdata",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_esp_access_category,
+ {"Access Category", "wlan.ext_tag.estimated_service_params.access_category",
+ FT_UINT24, BASE_DEC, VALS(esp_access_category_vals), 0x000003,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_esp_reserved,
+ {"Reserved", "wlan.ext_tag.estimated_service_params.reserved",
+ FT_UINT24, BASE_HEX, NULL, 0x000004, NULL, HFILL }},
+
+ {&hf_ieee80211_esp_data_format,
+ {"Data Format", "wlan.ext_tag.estimated_service_params.data_format",
+ FT_UINT24, BASE_DEC, VALS(esp_data_format_vals), 0x000018,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_esp_ba_windows_size,
+ {"BA Window Size", "wlan.ext_tag.estimated_service_params.ba_window_size",
+ FT_UINT24, BASE_DEC, VALS(esp_ba_window_size_vals), 0x0000E0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_esp_est_air_time_frac,
+ {"Estimated Air Time Fraction", "wlan.ext_tag.estimated_service_params.air_time_frac",
+ FT_UINT24, BASE_DEC, NULL, 0x00FF00, NULL, HFILL }},
+
+ {&hf_ieee80211_esp_data_ppdu_duration_target,
+ {"Data PPDU Duration Target", "wlan.ext_tag.estimated_service_params.data_ppdu_dur_target",
+ FT_UINT24, BASE_DEC, NULL, 0x00FF00, NULL, HFILL }},
+
+ {&hf_ieee80211_fcg_new_channel_number,
+ {"New Channel Number", "wlan.ext_tag.future_channel_guidance.new_chan_num",
+ FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_fcg_extra_info,
+ {"Extra bytes", "wlan.ext_tag.future_channel_guidance.extra_bytes",
+ FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+
+ {&hf_ieee80211_ext_tag,
+ {"Ext Tag", "wlan.ext_tag",
+ FT_NONE, BASE_NONE, 0x0, 0,
NULL, HFILL }},
- {&hf_ieee80211_vs_extreme_unknown,
- {"Unknown", "wlan.vs.extreme.unknown",
- FT_BYTES, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_ext_tag_number,
+ {"Ext Tag Number", "wlan.ext_tag.number",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_eid_ext_ext, 0,
+ "Element ID", HFILL }},
+
+ {&hf_ieee80211_ext_tag_length,
+ {"Ext Tag length", "wlan.ext_tag.length",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "Length of tag", HFILL }},
+
+ {&hf_ieee80211_fils_session,
+ {"FILS Session", "wlan.ext_tag.fils.session",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_vs_extreme_ap_length,
- {"AP Length", "wlan.vs.extreme.ap_length",
- FT_UINT8, BASE_DEC, NULL, 0,
+ {&hf_ieee80211_fils_wrapped_data,
+ {"FILS Wrapped Data", "wlan.ext_tag.fils.wrapped_data",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_vs_extreme_ap_name,
- {"AP Name", "wlan.vs.extreme.ap_name",
- FT_STRING, BASE_NONE, NULL, 0,
+ {&hf_ieee80211_fils_nonce,
+ {"FILS Nonce", "wlan.ext_tag.fils.nonce",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
- {&hf_ieee80211_tsinfo,
- {"Traffic Stream (TS) Info", "wlan.ts_info",
- FT_UINT24, BASE_HEX, NULL, 0,
- "Traffic Stream (TS) Info field", HFILL }},
+ {&hf_he_mac_capabilities,
+ {"HE MAC Capabilities Information", "wlan.ext_tag.he_mac_caps",
+ FT_UINT40, BASE_HEX, NULL, 0x0, NULL, HFILL }},
- {&hf_ieee80211_tsinfo_type,
- {"Traffic Type", "wlan.ts_info.type",
- FT_UINT24, BASE_DEC, VALS(tsinfo_type), 0x000001,
- "Traffic Stream (TS) Info Traffic Type", 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_ieee80211_tsinfo_tsid,
- {"Traffic Stream ID (TSID)", "wlan.ts_info.tsid",
- FT_UINT24, BASE_DEC, NULL, 0x00001E,
- "Traffic Stream ID (TSID) Info TSID", 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_ieee80211_tsinfo_dir,
- {"Direction", "wlan.ts_info.dir",
- FT_UINT24, BASE_DEC, VALS(tsinfo_direction), 0x000060,
- "Traffic Stream (TS) Info Direction", 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_ieee80211_tsinfo_access,
- {"Access Policy", "wlan.ts_info.dir",
- FT_UINT24, BASE_DEC, VALS(tsinfo_access), 0x000180,
- "Traffic Stream (TS) Info Access Policy", 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_ieee80211_tsinfo_agg,
- {"Aggregation", "wlan.ts_info.agg",
- FT_UINT24, BASE_DEC, NULL, 0x000200,
- "Traffic Stream (TS) Info Access Policy", 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_ieee80211_tsinfo_apsd,
- {"Automatic Power-Save Delivery (APSD)", "wlan.ts_info.apsd",
- FT_UINT24, BASE_DEC, NULL, 0x000400,
- "Traffic Stream (TS) Info Automatic Power-Save Delivery (APSD)", 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_ieee80211_tsinfo_up,
- {"User Priority", "wlan.ts_info.up",
- FT_UINT24, BASE_DEC, VALS(qos_up), 0x003800,
- "Traffic Stream (TS) Info User Priority", 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_ieee80211_tsinfo_ack,
- {"Ack Policy", "wlan.ts_info.ack",
- FT_UINT24, BASE_DEC, VALS(ack_policy), 0x00C000,
- "Traffic Stream (TS) Info Ack Policy", 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_ieee80211_tsinfo_sched,
- {"Schedule", "wlan.ts_info.sched",
- FT_UINT24, BASE_DEC, NULL, 0x010000,
- "Traffic Stream (TS) Info Schedule", HFILL }},
+ {&hf_he_he_link_adaptation_support,
+ {"HE Link Adaptation Support", "wlan.ext_tag.he_mac_cap.he_link_adaptation_support",
+ FT_UINT40, BASE_DEC|BASE_VAL64_STRING,
+ VALS64(he_link_adaptation_support_vals), 0x0000018000,
+ NULL, HFILL }},
- {&hf_ieee80211_tsinfo_rsv,
- {"Reserved", "wlan.ts_info.rsv",
- FT_UINT24, BASE_HEX, NULL, 0xFE0000,
- "Must be Zero", 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_ieee80211_tspec_nor_msdu,
- {"Normal MSDU Size", "wlan.tspec.nor_msdu",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_max_msdu,
- {"Maximum MSDU Size", "wlan.tspec.max_msdu",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_min_srv,
- {"Minimum Service Interval", "wlan.tspec.min_srv",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_max_srv,
- {"Maximum Service Interval", "wlan.tspec.max_srv",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_inact_int,
- {"Inactivity Interval", "wlan.tspec.inact_int",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_susp_int,
- {"Suspension Interval", "wlan.tspec.susp_int",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_srv_start,
- {"Service Start Time", "wlan.tspec.srv_start",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_min_data,
- {"Minimum Data Rate", "wlan.tspec.min_data",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_mean_data,
- {"Mean Data Rate", "wlan.tspec.mean_data",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_peak_data,
- {"Peak Data Rate", "wlan.tspec.peak_data",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_burst_size,
- {"Burst Size", "wlan.tspec.burst_size",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_delay_bound,
- {"Delay Bound", "wlan.tspec.delay_bound",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_min_phy,
- {"Minimum PHY Rate", "wlan.tspec.min_phy",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_surplus,
- {"Surplus Bandwidth Allowance", "wlan.tspec.surplus",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_medium,
- {"Medium Time", "wlan.tspec.medium",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tspec_dmg,
- {"DMG attributes", "wlan.tspec.dmg",
- FT_UINT16, BASE_DEC, NULL, 0,
+ {&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_ieee80211_ts_delay,
- {"Traffic Stream (TS) Delay", "wlan.ts_delay",
- FT_UINT32, BASE_DEC, NULL, 0,
+ {&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_ieee80211_tclas_process,
- {"Processing", "wlan.tclas_proc.processing",
- FT_UINT8, BASE_DEC, VALS(ieee80211_tclas_process_flag), 0,
+ {&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_ieee80211_tag_ext_supp_rates,
- {"Extended Supported Rates", "wlan.extended_supported_rates",
- FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ieee80211_supported_rates_vals_ext, 0x0,
- "In Mbit/sec, (B) for Basic Rates", HFILL }},
+ {&hf_he_reserved,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_39",
+ FT_UINT40, BASE_HEX, NULL, 0x8000000000, NULL, HFILL }},
- {&hf_ieee80211_sched_info,
- {"Schedule Info", "wlan.sched.sched_info",
- FT_UINT16, BASE_HEX, NULL, 0,
- "Schedule Info field", 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_ieee80211_sched_info_agg,
- {"Schedule Aggregation", "wlan.sched_info.agg",
- FT_UINT16, BASE_DEC, NULL, 0x0001,
- "Traffic Stream (TS) Info Access Policy", 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_ieee80211_sched_info_tsid,
- {"Schedule Traffic Stream ID (TSID)", "wlan.sched_info.tsid",
- FT_UINT16, BASE_DEC, NULL, 0x001E,
- "Traffic Stream ID (TSID) Info TSID", HFILL }},
+ {&hf_he_reserved_bits_15_16,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bits_15_16",
+ FT_UINT40, BASE_HEX, NULL, 0x0000018000, NULL, HFILL }},
- {&hf_ieee80211_sched_info_dir,
- {"Schedule Direction", "wlan.sched_info.dir",
- FT_UINT16, BASE_DEC, VALS(tsinfo_direction), 0x0060,
- "Traffic Stream (TS) Info Direction", HFILL }},
+ {&hf_he_reserved_bit_18,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_18",
+ FT_UINT40, BASE_HEX, NULL, 0x0000040000, NULL, HFILL }},
- {&hf_ieee80211_sched_srv_start,
- {"Service Start Time", "wlan.sched.srv_start",
- FT_UINT32, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_reserved_bit_19,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_19",
+ FT_UINT40, BASE_HEX, NULL, 0x0000080000, NULL, HFILL }},
- {&hf_ieee80211_sched_srv_int,
- {"Service Interval", "wlan.sched.srv_int",
- FT_UINT32, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_reserved_bit_25,
+ {"Reserved", "wlan.ext_tag.he_mac_cap.reserved_bit_25",
+ FT_UINT40, BASE_HEX, NULL, 0x0002000000, NULL, HFILL }},
- {&hf_ieee80211_sched_spec_int,
- {"Specification Interval", "wlan.sched.spec_int",
- FT_UINT16, BASE_HEX, NULL, 0,
+ {&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_ieee80211_aruba,
- {"Aruba Type", "wlan.aruba.type",
- FT_UINT16, BASE_DEC|BASE_EXT_STRING, &aruba_mgt_typevals_ext, 0,
- "Aruba Management", 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_ieee80211_aruba_hb_seq,
- {"Aruba Heartbeat Sequence", "wlan.aruba.heartbeat_sequence",
- FT_UINT64, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_40mhz_channel_2_4ghz,
+ {"40MHz in 2.4GHz band", "wlan.ext_tag.he_phy_cap.chan_width_set.40mhz_in_2_4ghz",
+ FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02, NULL, HFILL }},
- {&hf_ieee80211_aruba_mtu,
- {"Aruba MTU Size", "wlan.aruba.mtu_size",
- FT_UINT16, BASE_DEC, NULL, 0,
- 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 }},
- /* Start: HT Control (+HTC) */
- {&hf_ieee80211_htc,
- {"HT Control (+HTC)", "wlan.htc",
- FT_UINT32, BASE_HEX, NULL, 0,
- "High Throughput Control (+HTC)", 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_ieee80211_htc_vht,
- {"VHT", "wlan.htc.lac.vht",
- FT_BOOLEAN, 32, NULL, HTC_VHT,
- "High Throughput Control HT/VHT flag", 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_ieee80211_htc_lac,
- {"Link Adaptation Control (LAC)", "wlan.htc.lac",
- FT_UINT32, BASE_HEX, NULL, 0x0000FFFE,
- "High Throughput Control Link Adaptation Control (LAC)", 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_ieee80211_htc_lac_trq,
- {"Training Request (TRQ)", "wlan.htc.lac.trq",
- FT_BOOLEAN, 16, TFS(&htc_lac_trq_flag), 0x0002,
- "High Throughput Control Link Adaptation Control Training Request (TRQ)", 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_ieee80211_htc_lac_mai_aseli,
- {"Antenna Selection Indication (ASELI)", "wlan.htc.lac.mai.aseli",
- FT_UINT16, BASE_HEX, NULL, 0x003C,
- "High Throughput Control Link Adaptation Control MAI Antenna Selection Indication", 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_ieee80211_htc_lac_mai_mrq,
- {"MCS Request (MRQ)", "wlan.htc.lac.mai.mrq",
- FT_BOOLEAN, 16, TFS(&htc_lac_mai_mrq_flag), 0x0004,
- "High Throughput Control Link Adaptation Control MAI MCS Request", 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_ieee80211_htc_lac_mai_msi,
- {"MCS Request Sequence Identifier (MSI)", "wlan.htc.lac.mai.msi",
- FT_UINT16, BASE_HEX, NULL, 0x0038,
- "High Throughput Control Link Adaptation Control MAI MCS Request Sequence Identifier", 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_ieee80211_htc_lac_mai_reserved,
- {"Reserved", "wlan.htc.lac.mai.reserved",
- FT_UINT16, BASE_HEX, NULL, 0x0038,
- "High Throughput Control Link Adaptation Control MAI Reserved", 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_ieee80211_htc_lac_mfsi,
- {"MCS Feedback Sequence Identifier (MFSI)", "wlan.htc.lac.mfsi",
- FT_UINT16, BASE_DEC, NULL, 0x01C0,
- "High Throughput Control Link Adaptation Control MCS Feedback Sequence Identifier (MSI)", 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_ieee80211_htc_lac_asel_command,
- {"Antenna Selection (ASEL) Command", "wlan.htc.lac.asel.command",
- FT_UINT16, BASE_HEX, VALS(ieee80211_htc_lac_asel_command_flags), 0x0E00,
- "High Throughput Control Link Adaptation Control Antenna Selection (ASEL) Command", 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_ieee80211_htc_lac_asel_data,
- {"Antenna Selection (ASEL) Data", "wlan.htc.lac.asel.data",
- FT_UINT16, BASE_HEX, NULL, 0xF000,
- "High Throughput Control Link Adaptation Control Antenna Selection (ASEL) Data", 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_ieee80211_htc_lac_mfb,
- {"MCS Feedback (MFB)", "wlan.htc.lac.mfb",
- FT_UINT16, BASE_HEX, NULL, 0xFE00,
- "High Throughput Control Link Adaptation Control MCS Feedback", 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_ieee80211_htc_cal_pos,
- {"Calibration Position", "wlan.htc.cal.pos",
- FT_UINT32, BASE_DEC, VALS(ieee80211_htc_cal_pos_flags), 0x00030000,
- "High Throughput Control Calibration Position", HFILL }},
+ {&hf_he_phy_cap_stbc_tx_lt_80mhz,
+ {"STBC Tx <= 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.stbc_tx_lt_80mhz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
- {&hf_ieee80211_htc_cal_seq,
- {"Calibration Sequence Identifier", "wlan.htc.cal.seq",
- FT_UINT32, BASE_DEC, NULL, 0x000C0000,
- "High Throughput Control Calibration Sequence Identifier", HFILL }},
+ {&hf_he_phy_cap_stbc_rx_lt_80mhz,
+ {"STBC Rx <= 80 MHz", "wlan.ext_tag.he_phy_cap.nbytes.stbc_rx_lt_80mhz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
- {&hf_ieee80211_htc_reserved1,
- {"Reserved", "wlan.htc.reserved1",
- FT_UINT32, BASE_HEX, NULL, 0x00300000,
- "High Throughput Control Reserved", HFILL }},
+ {&hf_he_phy_cap_doppler_tx,
+ {"Doppler Tx", "wlan.ext_tag.he_phy_cap.nbytes.doppler_tx",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
- {&hf_ieee80211_htc_csi_steering,
- {"CSI/Steering", "wlan.htc.csi_steering",
- FT_UINT32, BASE_DEC, VALS(ieee80211_htc_csi_steering_flags), 0x00C00000,
- "High Throughput Control CSI/Steering", HFILL }},
+ {&hf_he_phy_cap_doppler_rx,
+ {"Doppler Rx", "wlan.ext_tag.he_phy_cap.nbytes.doppler_rx",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x2000, NULL, HFILL }},
- {&hf_ieee80211_htc_ndp_announcement,
- {"NDP Announcement", "wlan.htc.ndp_announcement",
- FT_BOOLEAN, 32, TFS(&ieee80211_htc_ndp_announcement_flag), 0x01000000,
- "High Throughput Control NDP Announcement", 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_ieee80211_htc_reserved2,
- {"Reserved", "wlan.htc.reserved2",
- FT_UINT32, BASE_HEX, NULL, 0x3E000000,
- "High Throughput Control Reserved", 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_ieee80211_htc_mrq,
- {"MRQ", "wlan.htc.mrq",
- FT_BOOLEAN, 32, NULL, HTC_MRQ,
- "VHT-MCS feedback request", 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_ieee80211_htc_msi,
- {"MSI", "wlan.htc.msi",
- FT_UINT32, BASE_DEC, NULL, 0x00000038,
- "MRQ sequence number", 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_ieee80211_htc_msi_stbc_reserved,
- {"Reserved", "wlan.htc.msi_stbc_reserved",
- FT_UINT32, BASE_HEX, NULL, 0x00000038,
- 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_ieee80211_htc_compressed_msi,
- {"Compressed MSI", "wlan.htc.compressed_msi",
- FT_UINT32, BASE_DEC, NULL, 0x00000018,
- 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_ieee80211_htc_ppdu_stbc_encoded,
- {"PPDU was STBC encoded", "wlan.htc.ppdu_stbc_encoded",
- FT_BOOLEAN, 32, NULL, 0x00000020,
- 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_ieee80211_htc_mfsi,
- {"MFSI", "wlan.htc.mfsi",
- FT_BOOLEAN, 32, NULL, 0x000001C0,
- "MFB sequence identifier", 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_ieee80211_htc_gid_l,
- {"GID-L", "wlan.htc.gid_l",
- FT_BOOLEAN, 32, NULL, 0x000001C0,
- "LSBs of group ID", 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_ieee80211_htc_mfb,
- {"MFB", "wlan.htc.mfb",
- FT_UINT32, BASE_HEX, NULL, 0x00FFFE00,
- "Recommended MFB", 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_ieee80211_htc_num_sts,
- {"NUM_STS", "wlan.htc.num_sts",
- FT_UINT32, BASE_DEC, NULL, 0x00000E00,
- "Recommended NUM_STS", 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_ieee80211_htc_vht_mcs,
- {"VHT-MCS", "wlan.htc.vht_mcs",
- FT_UINT32, BASE_DEC, NULL, 0x0000F000,
- "Recommended VHT-MCS", 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_ieee80211_htc_bw,
- {"BW", "wlan.htc.bw",
- FT_UINT32, BASE_DEC, VALS(ieee80211_htc_bw_recommended_vht_mcs_vals), 0x00030000,
- "Bandwidth for recommended VHT-MCS", 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_ieee80211_htc_snr,
- {"SNR", "wlan.htc.snr",
- FT_INT32, BASE_DEC, NULL, 0x00FC0000,
- "Average SNR + 22", 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_ieee80211_htc_reserved3,
- {"Reserved", "wlan.htc.reserved3",
- FT_UINT32, BASE_HEX, NULL, 0x1F000000,
- 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_ieee80211_htc_gid_h,
- {"GID-H", "wlan.htc.gid_h",
- FT_UINT32, BASE_DEC, NULL, 0x07000000,
- 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_gt_80",
+ FT_UINT16, BASE_DEC, NULL, 0x0038, NULL, HFILL }},
- {&hf_ieee80211_htc_coding_type,
- {"Coding type", "wlan.htc.coding_type",
- FT_UINT32, BASE_DEC, VALS(ieee80211_htc_coding_type_vals), 0x08000000,
- 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_ieee80211_htc_fb_tx_type,
- {"FB Tx type", "wlan.htc.fb_tx_type",
- FT_UINT32, BASE_DEC, VALS(ieee80211_htc_fb_tx_type_vals), 0x10000000,
- 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_ieee80211_htc_unsolicited_mfb,
- {"Unsolicited MFB", "wlan.htc.unsolicited_mfb",
- FT_BOOLEAN, 32, NULL, HTC_UNSOLICITED_MFB,
- "High Throughput Control Unsolicited MFB", 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_ieee80211_htc_ac_constraint,
- {"AC Constraint", "wlan.htc.ac_constraint",
- FT_BOOLEAN, 32, NULL, 0x40000000,
- "High Throughput Control AC Constraint", 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_ieee80211_htc_rdg_more_ppdu,
- {"RDG/More PPDU", "wlan.htc.rdg_more_ppdu",
- FT_BOOLEAN, 32, NULL, 0x80000000,
- "High Throughput Control RDG/More PPDU", HFILL }},
- /* End: HT Control (+HTC) */
+ {&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 }},
- /* MDIE */
- {&hf_ieee80211_tag_mobility_domain_mdid,
- {"Mobility Domain Identifier", "wlan.mobility_domain.mdid",
- FT_UINT16, BASE_HEX, NULL, 0,
- 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_ieee80211_tag_mobility_domain_ft_capab,
- {"FT Capability and Policy", "wlan.mobility_domain.ft_capab",
- FT_UINT8, BASE_HEX, NULL, 0,
- 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_ieee80211_tag_mobility_domain_ft_capab_ft_over_ds,
- {"Fast BSS Transition over DS",
- "wlan.mobility_domain.ft_capab.ft_over_ds",
- FT_UINT8, BASE_HEX, NULL, 0x01,
- 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_ieee80211_tag_mobility_domain_ft_capab_resource_req,
- {"Resource Request Protocol Capability",
- "wlan.mobility_domain.ft_capab.resource_req",
- FT_UINT8, BASE_HEX, NULL, 0x02,
- NULL, HFILL }},
+ {&hf_he_phy_cap_partial_bw_dl_mu_mimo,
+ {"Partial Bandwidth 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 }},
- /* FTIE */
- {&hf_ieee80211_tag_ft_mic_control,
- {"MIC Control", "wlan.ft.mic_control",
- FT_UINT16, BASE_HEX, NULL, 0,
- 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_ieee80211_tag_ft_element_count,
- {"Element Count", "wlan.ft.element_count",
- FT_UINT16, BASE_DEC, NULL, 0xff00,
- 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_ieee80211_tag_ft_mic,
- {"MIC", "wlan.ft.mic",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_anonce,
- {"ANonce", "wlan.ft.anonce",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_snonce,
- {"SNonce", "wlan.ft.snonce",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_subelem_id,
- {"Subelement ID", "wlan.ft.subelem.id",
- FT_UINT8, BASE_DEC, VALS(ft_subelem_id_vals), 0,
- 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_ieee80211_tag_ft_subelem_len,
- {"Length", "wlan.ft.subelem.len",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_ft_subelem_data,
- {"Data", "wlan.ft.subelem.data",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_subelem_r1kh_id,
- {"PMK-R1 key holder identifier (R1KH-ID)", "wlan.ft.subelem.r1kh_id",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_subelem_gtk_key_info,
- {"Key Info", "wlan.ft.subelem.gtk.key_info",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_phy_cap_20mhz_in_40mhz_24ghz_band,
+ {"20 MHz In 40 MHz HE PPDU In 2.4GHz Band", "wlan.ext_tag.he_phy_cap.nbytes.20_mhz_in_40_in_2_4ghz",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0200, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_gtk_key_id,
- {"Key ID", "wlan.ft.subelem.gtk.key_id",
- FT_UINT16, BASE_DEC, NULL, 0x0003,
- 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_ppdu",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0400, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_gtk_key_length,
- {"Key Length", "wlan.ft.subelem.gtk.key_length",
- FT_UINT8, BASE_HEX, NULL, 0,
- 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_ppdu",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0800, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_gtk_rsc,
- {"RSC", "wlan.ft.subelem.gtk.rsc",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_1xxx_gi",
+ FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x1000, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_gtk_key,
- {"GTK", "wlan.ft.subelem.gtk.key",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_subelem_r0kh_id,
- {"PMK-R0 key holder identifier (R0KH-ID)", "wlan.ft.subelem.r0kh_id",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_ft_subelem_igtk_key_id,
- {"Key ID", "wlan.ft.subelem.igtk.key_id",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_1_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_igtk_ipn,
- {"IPN", "wlan.ft.subelem.igtk.ipn",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_2_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_igtk_key_length,
- {"Key Length", "wlan.ft.subelem.igtk.key_length",
- FT_UINT8, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_3_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
- {&hf_ieee80211_tag_ft_subelem_igtk_key,
- {"Wrapped Key (IGTK)", "wlan.ft.subelem.igtk.key",
- FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_4_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
- /* RIC Data IE: 802.11-2012: 8.4.2.52 */
- {&hf_ieee80211_tag_ric_data_id,
- {"Resource Handshake Identifier", "wlan.ric_data.id",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_5_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
- {&hf_ieee80211_tag_ric_data_desc_cnt,
- {"Resource Descriptor Count", "wlan.ric_data.desc_cnt",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_6_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
- {&hf_ieee80211_tag_ric_data_status_code,
- {"Status Code", "wlan.ric_data.status_code",
- FT_UINT16, BASE_HEX|BASE_EXT_STRING, &ieee80211_status_code_ext, 0,
- "Status of requested Resource", HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_7_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
- /* OBSS IE: 802.11-2012: 8.4.2.61 */
- {&hf_ieee80211_tag_obss_spd,
- {"Scan Passive Dwell", "wlan.obss.spd",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_rx_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_rx_8_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
- {&hf_ieee80211_tag_obss_sad,
- {"Scan Active Dwell", "wlan.obss.sad",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_1_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
- {&hf_ieee80211_tag_obss_cwtsi,
- {"Channel Width Trigger Scan Interval", "wlan.obss.cwtsi",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_2_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_tag_obss_sptpc,
- {"Scan Passive Total Per Channel", "wlan.obss.sptpc",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_3_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
- {&hf_ieee80211_tag_obss_satpc,
- {"Scan Active Total Per Channel", "wlan.obss.satpc",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_4_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
- {&hf_ieee80211_tag_obss_wctdf,
- {"Width Channel Transition Delay Factor", "wlan.obss.wctdf",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_5_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
- {&hf_ieee80211_tag_obss_sat,
- {"Scan Activity Threshold", "wlan.obss.sat",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_6_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
- /* RIC Descriptor IE: 802.11-2012: 8.4.2.53 */
- {&hf_ieee80211_tag_ric_desc_rsrc_type,
- {"Resource Type", "wlan.ric_desc.rsrc_type",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_7_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
- {&hf_ieee80211_tag_ric_desc_var_params,
- {"Variable Params", "wlan.ric_desc.var_params",
- FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80_tx_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80_tx_8_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
- /* MMIE */
- {&hf_ieee80211_tag_mmie_keyid,
- {"KeyID", "wlan.mmie.keyid",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_1_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
- {&hf_ieee80211_tag_mmie_ipn,
- {"IPN", "wlan.mmie.ipn",
- FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_2_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_tag_mmie_mic,
- {"MIC", "wlan.mmie.mic",
- FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_3_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
- /* WAPI Parameter Set*/
- {&hf_ieee80211_tag_wapi_param_set_version,
- {"Version", "wlan.wapi.version",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_4_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_akm_suite_count,
- {"AKM Suite Count", "wlan.wapi.akm_suite.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_5_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_akm_suite_oui,
- {"AKM Suite OUI", "wlan.wapi.akm_suite.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_6_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_akm_suite_type,
- {"AKM Suite Type", "wlan.wapi.akm_suite.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_suite_type) , 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_7_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_count,
- {"Unicast Cipher Suite Count", "wlan.wapi.unicast_cipher.suite.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_rx_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_rx_8_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_oui,
- {"Unicast Cipher Suite OUI", "wlan.wapi.unicast_cipher.suite.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_1_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_ucast_cipher_suite_type,
- {"Unicast Cipher Suite Type", "wlan.wapi.unicast_cipher.suite.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_cipher_type) , 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_2_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_oui,
- {"Multicast Cipher Suite OUI", "wlan.wapi.multicast_cipher.suite.oui",
- FT_UINT24, BASE_OUI, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_3_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_mcast_cipher_suite_type,
- {"Multicast Cipher Suite Type", "wlan.wapi.multicast_cipher.suite.type",
- FT_UINT8, BASE_DEC, VALS(ieee80211_wapi_cipher_type) , 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_4_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_capab,
- {"WAPI Capability Info", "wlan.wapi.capab",
- FT_UINT16, BASE_HEX, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_5_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_capab_preauth,
- {"Supports Preauthentication?", "wlan.wapi.capab.preauth",
- FT_BOOLEAN, 16 , NULL, 0x0001,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_6_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_capab_rsvd,
- {"Reserved", "wlan.wapi.capab.rsvd",
- FT_UINT16, BASE_DEC , NULL, 0xFFFE,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_7_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_bkid_count,
- {"No of BKID's", "wlan.wapi.bkid.count",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_80p80_tx_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_80p80_tx_8_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
- {&hf_ieee80211_tag_wapi_param_set_bkid_list,
- {"BKID", "wlan.wapi.bkid",
- FT_BYTES, BASE_NONE, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_1_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
- /* BSS Max Idle Period */
- {&hf_ieee80211_tag_bss_max_idle_period,
- {"BSS Max Idle Period (1000 TUs)", "wlan.bss_max_idle.period",
- FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_2_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_tag_bss_max_idle_options_protected,
- {"BSS Max Idle Period Options: Protected Keep-Alive Required",
- "wlan.bss_max_idle.options.protected",
- FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_3_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
- /* TFS Request */
- {&hf_ieee80211_tag_tfs_request_id,
- {"TFS ID", "wlan.tfs_request.id",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_4_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_request_ac_delete_after_match,
- {"TFS Action Code - Delete after match",
- "wlan.tfs_request.action_code.delete_after_match",
- FT_UINT8, BASE_DEC, NULL, 0x01, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_5_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_request_ac_notify,
- {"TFS Action Code - Notify",
- "wlan.tfs_request.action_code.notify",
- FT_UINT8, BASE_DEC, NULL, 0x02, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_6_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_request_subelem_id,
- {"Subelement ID", "wlan.tfs_request.subelem.id",
- FT_UINT8, BASE_DEC, VALS(tfs_request_subelem_ids), 0,
- "TFS Request Subelement ID", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_7_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_request_subelem_len,
- {"Length", "wlan.tfs_request.subelem.len",
- FT_UINT8, BASE_DEC, NULL, 0,
- "TFS Request Subelement Length", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_rx_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_rx_8_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_request_subelem,
- {"Subelement Data", "wlan.tfs_request.subelem",
- FT_BYTES, BASE_NONE, NULL, 0,
- "TFS Request Subelement Data", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_1_ss,
+ {"Max HE-MCS for 1 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_1_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0003, NULL, HFILL }},
- /* TFS Response */
- {&hf_ieee80211_tag_tfs_response_subelem_id,
- {"Subelement ID", "wlan.tfs_response.subelem.id",
- FT_UINT8, BASE_DEC, VALS(tfs_response_subelem_ids), 0,
- "TFS Response Subelement ID", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_2_ss,
+ {"Max HE-MCS for 2 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_2_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x000C, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_response_subelem_len,
- {"Length", "wlan.tfs_response.subelem.len",
- FT_UINT8, BASE_DEC, NULL, 0,
- "TFS Response Subelement Length", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_3_ss,
+ {"Max HE-MCS for 3 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_3_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0030, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_response_subelem,
- {"Subelement Data", "wlan.tfs_response.subelem",
- FT_BYTES, BASE_NONE, NULL, 0,
- "TFS Response Subelement Data", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_4_ss,
+ {"Max HE-MCS for 4 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_4_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x00C0, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_response_status,
- {"TFS Response Status", "wlan.tfs_response.status",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_5_ss,
+ {"Max HE-MCS for 5 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_5_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0300, NULL, HFILL }},
- {&hf_ieee80211_tag_tfs_response_id,
- {"TFS ID", "wlan.tfs_response.tfs_id",
- FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_6_ss,
+ {"Max HE-MCS for 6 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_6_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x0C00, NULL, HFILL }},
- /* WNM-Sleep Mode */
- {&hf_ieee80211_tag_wnm_sleep_mode_action_type,
- {"Action Type", "wlan.wnm_sleep_mode.action_type",
- FT_UINT8, BASE_DEC, VALS(wnm_sleep_mode_action_types), 0,
- "WNM-Sleep Mode Action Type", HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_7_ss,
+ {"Max HE-MCS for 7 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_7_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0x3000, NULL, HFILL }},
- {&hf_ieee80211_tag_wnm_sleep_mode_response_status,
- {"WNM-Sleep Mode Response Status",
- "wlan.wnm_sleep_mode.response_status",
- FT_UINT8, BASE_DEC, VALS(wnm_sleep_mode_response_status_vals), 0, NULL,
- HFILL }},
+ {&hf_he_mcs_max_he_mcs_160_tx_8_ss,
+ {"Max HE-MCS for 8 SS", "wlan.ext_tag.he_mcs_map.max_he_mcs_160_tx_8_ss",
+ FT_UINT16, BASE_HEX, VALS(he_mcs_map_vals), 0xC000, NULL, HFILL }},
- {&hf_ieee80211_tag_wnm_sleep_mode_interval,
- {"WNM-Sleep Interval", "wlan.wnm_sleep_mode.interval",
- FT_UINT16, BASE_DEC, NULL, 0, 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 }},
- /* Time Advertisement */
- {&hf_ieee80211_tag_time_adv_timing_capab,
- {"Timing capabilities", "wlan.time_adv.timing_capab",
- FT_UINT8, BASE_DEC, VALS(time_adv_timing_capab_vals), 0,
- 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_ieee80211_tag_time_adv_time_value,
- {"Time Value", "wlan.time_adv.time_value",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_time_adv_time_value_year,
- {"Time Value: Year", "wlan.time_adv.time_value.year",
- FT_UINT16, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_time_adv_time_value_month,
- {"Time Value: Month", "wlan.time_adv.time_value.month",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_time_adv_time_value_day,
- {"Time Value: Day", "wlan.time_adv.time_value.month",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_ppe_thresholds_nss,
+ {"NSS", "wlan.ext_tag.he_ppe_thresholds.nss",
+ FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
- {&hf_ieee80211_tag_time_adv_time_value_hours,
- {"Time Value: Hours", "wlan.time_adv.time_value.hours",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_time_adv_time_value_minutes,
- {"Time Value: Minutes", "wlan.time_adv.time_value.minutes",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_time_adv_time_value_seconds,
- {"Time Value: Seconds", "wlan.time_adv.time_value.seconds",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_time_adv_time_value_milliseconds,
- {"Time Value: Milliseconds", "wlan.time_adv.time_value.milliseconds",
- FT_UINT16, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_operation_parameter,
+ {"HE Operation Parameters", "wlan.ext_tag.he_operation.params",
+ FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }},
- {&hf_ieee80211_tag_time_adv_time_value_reserved,
- {"Time Value: Reserved", "wlan.time_adv.time_value.reserved",
- FT_UINT8, BASE_DEC, 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_ieee80211_tag_time_adv_time_error,
- {"Time Error", "wlan.time_adv.time_error",
- FT_BYTES, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_time_adv_time_update_counter,
- {"Time Update Counter", "wlan.time_adv.time_update_counter",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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 }},
- /* Time Zone */
- {&hf_ieee80211_tag_time_zone,
- {"Time Zone", "wlan.time_zone",
- FT_STRING, BASE_NONE, NULL, 0,
- 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 }},
- /* Interworking */
- {&hf_ieee80211_tag_interworking_access_network_type,
- {"Access Network Type", "wlan.interworking.access_network_type",
- FT_UINT8, BASE_DEC, VALS(access_network_type_vals), 0x0f,
- 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_ieee80211_tag_interworking_internet,
- {"Internet", "wlan.interworking.internet",
- FT_UINT8, BASE_DEC, NULL, 0x10,
- 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_ieee80211_tag_interworking_asra,
- {"ASRA", "wlan.interworking.asra",
- FT_UINT8, BASE_DEC, NULL, 0x20,
- "Additional Step Required for Access", 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_ieee80211_tag_interworking_esr,
- {"ESR", "wlan.interworking.esr",
- FT_UINT8, BASE_DEC, NULL, 0x40,
- "Emergency services reachable", 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_ieee80211_tag_interworking_uesa,
- {"UESA", "wlan.interworking.uesa",
- FT_UINT8, BASE_DEC, NULL, 0x80,
- "Unauthenticated emergency service accessible", 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_ieee80211_tag_interworking_hessid,
- {"HESSID", "wlan.interworking.hessid",
- FT_ETHER, BASE_NONE, NULL, 0,
- "Homogeneous ESS identifier", 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 }},
- /* QoS Map Set element */
- {&hf_ieee80211_tag_qos_map_set_dscp_exc,
- {"DSCP Exception", "wlan.qos_map_set.dscp_exception",
- FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_he_operation_reserved_b31,
+ {"Reserved", "wlan.ext_tag.he_operation.reserved_b31",
+ FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL }},
- {&hf_ieee80211_tag_qos_map_set_dscp_exc_val,
- {"DSCP Value", "wlan.qos_map_set.dscp_value",
- FT_UINT8, BASE_DEC, NULL, 0,
- "DSCP Exception - DSCP Value", 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_ieee80211_tag_qos_map_set_dscp_exc_up,
- {"User Priority", "wlan.qos_map_set.up",
- FT_UINT8, BASE_DEC, NULL, 0,
- "DSCP Exception - User Priority", 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_ieee80211_tag_qos_map_set_range,
- {"DSCP Range description", "wlan.qos_map_set.range",
- FT_NONE, BASE_NONE, NULL, 0, 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_ieee80211_tag_qos_map_set_low,
- {"DSCP Low Value", "wlan.qos_map_set.dscp_low_value",
- FT_UINT8, BASE_DEC, NULL, 0,
- "DSCP Range description - DSCP Low Value", 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_ieee80211_tag_qos_map_set_high,
- {"DSCP High Value", "wlan.qos_map_set.dscp_high_value",
- FT_UINT8, BASE_DEC, NULL, 0,
- "DSCP Range description - DSCP High Value", 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 }},
- /* Advertisement Protocol */
- {&hf_ieee80211_tag_adv_proto_resp_len_limit,
- {"Query Response Length Limit", "wlan.adv_proto.resp_len_limit",
- FT_UINT8, BASE_DEC, NULL, 0x7f,
- 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_ieee80211_tag_adv_proto_pame_bi,
- {"PAME-BI", "wlan.adv_proto.pame_bi",
- FT_UINT8, BASE_DEC, NULL, 0x80,
- "Pre-Association Message Xchange BSSID Independent (PAME-BI)", 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_ieee80211_tag_adv_proto_id,
- {"Advertisement Protocol ID", "wlan.adv_proto.id",
- FT_UINT8, BASE_DEC, VALS(adv_proto_id_vals), 0,
- 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_ieee80211_tag_adv_vs_len,
- {"Advertisement Protocol Vendor Specific length", "wlan.adv_proto.vs_len",
- FT_UINT8, BASE_DEC, NULL, 0,
- NULL, HFILL}},
-#if 0
- {&hf_ieee80211_tag_adv_proto_vs_info,
- {"Advertisement Protocol Vendor Specific info", "wlan.adv_proto.vs_info",
- FT_NONE, BASE_NONE, NULL, 0,
- NULL, HFILL }},
-#endif
+ {&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 }},
- /* Roaming Consortium */
- {&hf_ieee80211_tag_roaming_consortium_num_anqp_oi,
- {"Number of ANQP OIs", "wlan.roaming_consortium.num_anqp_oi",
- FT_UINT8, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_roaming_consortium_oi1_len,
- {"OI #1 Length", "wlan.roaming_consortium.oi1_len",
- FT_UINT8, BASE_DEC, NULL, 0x0f,
- 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_ieee80211_tag_roaming_consortium_oi2_len,
- {"OI #2 Length", "wlan.roaming_consortium.oi2_len",
- FT_UINT8, BASE_DEC, NULL, 0xf0,
- 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_ieee80211_tag_roaming_consortium_oi1,
- {"OI #1", "wlan.roaming_consortium.oi1",
- FT_BYTES, BASE_NONE, 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_ieee80211_tag_roaming_consortium_oi2,
- {"OI #2", "wlan.roaming_consortium.oi2",
- FT_BYTES, BASE_NONE, 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_ieee80211_tag_roaming_consortium_oi3,
- {"OI #3", "wlan.roaming_consortium.oi3",
- FT_BYTES, BASE_NONE, 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 }},
- /* Timeout Interval */
- {&hf_ieee80211_tag_timeout_int_type,
- {"Timeout Interval Type", "wlan.timeout_int.type",
- FT_UINT8, BASE_DEC, VALS(timeout_int_types), 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_ieee80211_tag_timeout_int_value,
- {"Timeout Interval Value", "wlan.timeout_int.value",
- FT_UINT32, BASE_DEC, 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 }},
- /* Link Identifier */
- {&hf_ieee80211_tag_link_id_bssid,
- {"BSSID", "wlan.link_id.bssid",
- FT_ETHER, BASE_NONE, 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_ieee80211_tag_link_id_init_sta,
- {"TDLS initiator STA Address", "wlan.link_id.init_sta",
- FT_ETHER, BASE_NONE, NULL, 0,
- 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_ieee80211_tag_link_id_resp_sta,
- {"TDLS responder STA Address", "wlan.link_id.resp_sta",
- FT_ETHER, BASE_NONE, NULL, 0,
- 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 }},
- /* Wakeup Schedule */
- {&hf_ieee80211_tag_wakeup_schedule_offset,
- {"Offset", "wlan.wakeup_schedule.offset",
- FT_UINT32, BASE_DEC, NULL, 0,
- NULL, HFILL }},
+ {&hf_he_srg_information_present,
+ {"SRG Information Present", "wlan.ext_tag.spatial_reuse.sr_control.srg_info_present",
+ FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL }},
- {&hf_ieee80211_tag_wakeup_schedule_interval,
- {"Interval", "wlan.wakeup_schedule.interval",
- FT_UINT32, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_wakeup_schedule_awake_window_slots,
- {"Awake Window Slots", "wlan.wakeup_schedule.awake_window_slots",
- FT_UINT32, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_wakeup_schedule_max_awake_dur,
- {"Maximum Awake Window Duration", "wlan.wakeup_schedule.max_awake_dur",
- FT_UINT32, BASE_DEC, NULL, 0,
- 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_ieee80211_tag_wakeup_schedule_idle_count,
- {"Idle Count", "wlan.wakeup_schedule.idle_count",
- FT_UINT16, 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 }},
- /* Channel Switch Timing */
- {&hf_ieee80211_tag_channel_switch_timing_switch_time,
- {"Switch Time", "wlan.channel_switch_timing.switch_time",
- FT_UINT16, 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_ieee80211_tag_channel_switch_timing_switch_timeout,
- {"Switch Timeout", "wlan.channel_switch_timing.switch_timeout",
- FT_UINT16, 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 }},
- /* PTI Control */
- {&hf_ieee80211_tag_pti_control_tid,
- {"TID", "wlan.pti_control.tid",
- FT_UINT8, BASE_DEC, 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_ieee80211_tag_pti_control_sequence_control,
- {"Sequence Control", "wlan.pti_control.sequence_control",
- FT_UINT16, BASE_HEX, 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 }},
- /* PU Buffer Status */
- {&hf_ieee80211_tag_pu_buffer_status_ac_bk,
- {"AC_BK traffic available", "wlan.pu_buffer_status.ac_bk",
- FT_UINT8, BASE_DEC, NULL, 0x01,
- 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_ieee80211_tag_pu_buffer_status_ac_be,
- {"AC_BE traffic available", "wlan.pu_buffer_status.ac_be",
- FT_UINT8, BASE_DEC, NULL, 0x02,
- 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_ieee80211_tag_pu_buffer_status_ac_vi,
- {"AC_VI traffic available", "wlan.pu_buffer_status.ac_vi",
- FT_UINT8, BASE_DEC, NULL, 0x04,
- 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_ieee80211_tag_pu_buffer_status_ac_vo,
- {"AC_VO traffic available", "wlan.pu_buffer_status.ac_vo",
- FT_UINT8, BASE_DEC, NULL, 0x08,
- 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_ieee80211_mysterious_olpc_stuff,
- {"Mysterious OLPC stuff", "wlan.mysterious_olpc_stuff",
- FT_NONE, BASE_NONE, NULL, 0x0,
- 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_ieee80211_ext_tag,
- {"Ext Tag", "wlan.ext_tag",
- FT_NONE, BASE_NONE, 0x0, 0,
- 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_ieee80211_ext_tag_number,
- {"Ext Tag Number", "wlan.ext_tag.number",
- FT_UINT8, BASE_DEC|BASE_EXT_STRING, &tag_num_vals_eid_ext_ext, 0,
- "Element ID", 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_ieee80211_ext_tag_length,
- {"Ext Tag length", "wlan.ext_tag.length",
- FT_UINT32, BASE_DEC, NULL, 0,
- "Length of tag", 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_ieee80211_fils_session,
- {"FILS Session", "wlan.ext_tag.fils.session",
- FT_BYTES, BASE_NONE, NULL, 0x0,
- 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_ieee80211_fils_wrapped_data,
- {"FILS Wrapped Data", "wlan.ext_tag.fils.wrapped_data",
- FT_BYTES, BASE_NONE, NULL, 0x0,
- NULL, HFILL }},
+ {&hf_he_uora_eocwmin,
+ {"EOCWmin", "wlan.ext_tag.uora_parameter_set.eocwmin",
+ FT_UINT8, BASE_DEC, NULL, 0x07, NULL, HFILL }},
- {&hf_ieee80211_fils_nonce,
- {"FILS Nonce", "wlan.ext_tag.fils.nonce",
- FT_BYTES, BASE_NONE, NULL, 0x0,
- 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[] = {
&ett_fragments,
&ett_fragment,
&ett_block_ack,
+ &ett_block_ack_tid,
+ &ett_block_ack_request_control,
&ett_block_ack_bitmap,
+ &ett_block_ack_request_multi_sta_aid_tid,
+ &ett_multi_sta_block_ack,
&ett_ath_cap_tree,
&ett_80211_mgt,
&ett_hta_cap2_tree,
&ett_htc_tree,
+ &ett_htc_he_a_control,
&ett_mfb_subtree,
&ett_lac_subtree,
+ &ett_ieee80211_umrs_control,
+ &ett_ieee80211_om_control,
+ &ett_ieee80211_hla_control,
+ &ett_ieee80211_buffer_status_report,
+ &ett_ieee80211_control_uph,
+ &ett_ieee80211_bqr_control,
+ &ett_ieee80211_control_cci,
&ett_vht_cap_tree,
&ett_vht_mcsset_tree,
&ett_vht_op_tree,
&ett_vht_tpe_info_tree,
- &ett_vht_ndp_annc_token_tree,
+ &ett_vht_ndp_annc,
&ett_vht_ndp_annc_sta_info_tree,
+ &ett_vht_ndp_annc_sta_list,
+
+ &ett_he_mimo_control,
&ett_ff_vhtmimo_cntrl,
&ett_ff_vhtmimo_beamforming_report,
&ett_tag_ex_cap6,
&ett_tag_ex_cap7,
&ett_tag_ex_cap8,
- &ett_tag_ex_cap9,
+ &ett_tag_ex_cap89,
+ &ett_tag_ex_cap10,
&ett_tag_rm_cap1,
&ett_tag_rm_cap2,
&ett_fcs,
+ &ett_hs20_osu_providers_list,
+ &ett_hs20_osu_provider_tree,
+ &ett_hs20_friendly_names_list,
+ &ett_hs20_friendly_name_tree,
+ &ett_hs20_osu_provider_method_list,
+ &ett_osu_icons_avail_list,
+ &ett_hs20_osu_icon_tree,
+ &ett_hs20_osu_service_desc_list,
+ &ett_hs20_osu_service_desc_tree,
+ &ett_hs20_venue_url,
+ &ett_hs20_advice_of_charge,
+ &ett_hs20_aoc_plan,
+
+ &ett_hs20_ofn_tree,
+
&ett_adv_proto,
&ett_adv_proto_tuple,
&ett_gas_query,
&ett_tag_ric_data_desc_ie,
&ett_anqp_vendor_capab,
+ &ett_osen_group_data_cipher_suite,
+ &ett_osen_pairwise_cipher_suites,
+ &ett_osen_pairwise_cipher_suite,
+ &ett_osen_akm_cipher_suites,
+ &ett_osen_akm_cipher_suite,
+ &ett_osen_rsn_cap_tree,
+ &ett_osen_pmkid_list,
+ &ett_osen_pmkid_tree,
+
&ett_hs20_cc_proto_port_tuple,
&ett_ssid_list,
&ett_allocation_tree,
&ett_sta_info,
+ &ett_ieee80211_esp,
+
&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,
+ &ett_he_trigger_common_info,
+ &ett_he_trigger_base_common_info,
+ &ett_he_trigger_bar_ctrl,
+ &ett_he_trigger_bar_info,
+ &ett_he_trigger_user_info,
+ &ett_he_trigger_base_user_info,
+ &ett_he_trigger_dep_basic_user_info,
+ &ett_he_trigger_dep_nfrp_user_info,
+ &ett_he_ndp_annc,
+ &ett_he_ndp_annc_sta_list,
+ &ett_he_ndp_annc_sta_item,
+ &ett_he_ndp_annc_sta_info,
+ &ett_ieee80211_3gpp_plmn,
};
static ei_register_info ei[] = {
proto_register_field_array(proto_aggregate, aggregate_fields, array_length(aggregate_fields));
proto_wlan = proto_register_protocol("IEEE 802.11 wireless LAN", "IEEE 802.11", "wlan");
+
+ heur_subdissector_list = register_heur_dissector_list("wlan_data", proto_wlan);
+
/* Created to remove Decode As confusion */
proto_centrino = proto_register_protocol("IEEE 802.11 wireless LAN (Centrino)", "IEEE 802.11 (Centrino)", "wlan_centrino");
proto_register_field_array(proto_wlan, hf, array_length(hf));
"and some also leave the IV (initialization vector).",
&wlan_ignore_prot, wlan_ignore_prot_options, TRUE);
+ prefs_register_uint_preference(wlan_module, "wpa_key_mic_len",
+ "WPA Key MIC Length override",
+ "Some Key MIC lengths are greater than 16 bytes, so set the length you require",
+ 10, &wlan_key_mic_len);
+
prefs_register_obsolete_preference(wlan_module, "wep_keys");
prefs_register_bool_preference(wlan_module, "enable_decryption",
{
static hf_register_info hf[] = {
+ {&hf_wlan_rsna_eapol_wpa_keydes_msgnr,
+ {"Message number", "wlan_rsna_eapol.keydes.msgnr",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
{&hf_wlan_rsna_eapol_wpa_keydes_keyinfo,
{"Key Information", "wlan_rsna_eapol.keydes.key_info",
FT_UINT16, BASE_HEX, NULL, 0x0,
capture_dissector_add_uint("ppi", 105 /* DLT_DLT_IEEE802_11 */, ieee80211_cap_handle);
/* Register handoff to Aruba GRE */
- dissector_add_uint("gre.proto", GRE_ARUBA_8200, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8210, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8220, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8230, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8240, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8250, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8260, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8270, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8280, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8290, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_82A0, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_82B0, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_82C0, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_82D0, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_82E0, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_82F0, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8300, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8310, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8320, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8330, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8340, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8350, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8360, ieee80211_handle);
- dissector_add_uint("gre.proto", GRE_ARUBA_8370, ieee80211_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8200, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8210, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8220, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8230, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8240, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8250, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8260, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8270, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8280, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8290, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_82A0, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_82B0, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_82C0, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_82D0, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_82E0, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_82F0, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8300, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8310, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8320, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8330, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8340, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8350, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8360, wlan_withoutfcs_handle);
+ dissector_add_uint("gre.proto", GRE_ARUBA_8370, wlan_withoutfcs_handle);
data_encap_handle = create_dissector_handle(dissect_data_encap, proto_wlan);
dissector_add_uint("ethertype", ETHERTYPE_IEEE80211_DATA_ENCAP,
dissector_add_uint("wlan.anqp.vendor_specific", OUI_WFA, create_dissector_handle(dissect_vendor_wifi_alliance_anqp, -1));
dissector_add_uint("wlan.anqp.wifi_alliance.subtype", WFA_SUBTYPE_HS20_ANQP, create_dissector_handle(dissect_hs20_anqp, -1));
+ dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_SUBSCRIPTION_REMEDIATION, create_dissector_handle(dissect_hs20_subscription_remediation, -1));
+ dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_DEAUTHENTICATION_IMMINENT, create_dissector_handle(dissect_hs20_deauthentication_imminent, -1));
dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_HS20_INDICATION, create_dissector_handle(dissect_hs20_indication, -1));
+ dissector_add_uint("wlan.ie.wifi_alliance.subtype", WFA_SUBTYPE_OSEN, create_dissector_handle(dissect_hs20_osen, -1));
}
/*