ieee80211: Add support for some elements of 802.11k.

These elements were folded into 802.11-2012 and thus are also in
802.11-2016.

The code was contributed by George Baltatanu with some minor changes
by me.

Change-Id: Ieea61dea9d333a43dded16d7634c7fc325374e8e
Reviewed-on: https://code.wireshark.org/review/29283
Petri-Dish: Richard Sharpe <realrichardsharpe@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Richard Sharpe 2018-08-25 09:57:00 -07:00 committed by Anders Broman
parent 708c1ae794
commit 7dd68fce89
1 changed files with 341 additions and 45 deletions

View File

@ -1502,8 +1502,8 @@ static const true_false_string ieee80211_tag_measure_report_frame_info_frame_typ
};
static const true_false_string ieee80211_tag_measure_map_field_bss_flag = {
"At least one MPDU was received by another BSS or IBSS in the measurement period.",
"No MPDUs were received from another BSS or IBSS in the measurement period."
"At least one valid MPDU was received by another BSS or IBSS during the measurement period.",
"No valid MPDUs were received from another BSS or IBSS during the measurement period."
};
static const value_string ieee80211_tag_measure_request_measurement_mode_flags[] = {
@ -4000,6 +4000,13 @@ static int hf_ieee80211_tag_rm_enabled_capabilities_b32 = -1;
static int hf_ieee80211_tag_rm_enabled_capabilities_b33 = -1;
static int hf_ieee80211_tag_rm_enabled_capabilities_o5 = -1;
static int hf_ieee80211_tag_rcpi = -1;
static int hf_ieee80211_tag_multiple_bssid = -1;
static int hf_ieee80211_tag_multiple_bssid_subelem_id = -1;
static int hf_ieee80211_tag_multiple_bssid_subelem_len = -1;
static int hf_ieee80211_tag_multiple_bssid_subelem_reserved = -1;
static int hf_ieee80211_tag_multiple_bssid_subelem_nontrans_profile = -1;
static int hf_ieee80211_tag_20_40_bc = -1;
static int hf_ieee80211_tag_20_40_bc_information_request = -1;
static int hf_ieee80211_tag_20_40_bc_forty_mhz_intolerant = -1;
@ -4054,7 +4061,7 @@ static int hf_ieee80211_tag_measure_report_duration = -1;
static int hf_ieee80211_tag_measure_basic_map_field = -1;
static int hf_ieee80211_tag_measure_map_field_bss = -1;
static int hf_ieee80211_tag_measure_map_field_odfm = -1;
static int hf_ieee80211_tag_measure_map_field_ofdm = -1;
static int hf_ieee80211_tag_measure_map_field_unident_signal = -1;
static int hf_ieee80211_tag_measure_map_field_radar = -1;
static int hf_ieee80211_tag_measure_map_field_unmeasured = -1;
@ -4110,6 +4117,12 @@ static int hf_ieee80211_tag_dfs_recovery_interval = -1;
static int hf_ieee80211_tag_dfs_channel_map = -1;
static int hf_ieee80211_tag_dfs_channel_number = -1;
static int hf_ieee80211_tag_dfs_map = -1;
static int hf_ieee80211_tag_dfs_map_bss = -1;
static int hf_ieee80211_tag_dfs_map_ofdm_preamble = -1;
static int hf_ieee80211_tag_dfs_map_unidentified_signal = -1;
static int hf_ieee80211_tag_dfs_map_radar = -1;
static int hf_ieee80211_tag_dfs_map_unmeasured = -1;
static int hf_ieee80211_tag_dfs_map_reserved = -1;
static int hf_ieee80211_tag_erp_info = -1;
static int hf_ieee80211_tag_erp_info_erp_present = -1;
@ -4383,6 +4396,9 @@ static int hf_ieee80211_tag_neighbor_report_subelement_data = -1;
static int hf_ieee80211_tag_neighbor_report_subelement_bss_trn_can_pref = -1;
static int hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf = -1;
static int hf_ieee80211_tag_neighbor_report_subelement_bss_dur = -1;
static int hf_ieee80211_tag_neighbor_report_subelement_tsf_offset = -1;
static int hf_ieee80211_tag_neighbor_report_subelement_beacon_interval = -1;
static int hf_ieee80211_tag_neighbor_report_subelement_country_code = -1;
static int hf_ieee80211_tag_supported_ope_classes_current = -1;
static int hf_ieee80211_tag_supported_ope_classes_alternate = -1;
@ -5670,6 +5686,7 @@ static gint ett_tag_measure_report_frame_tree = -1;
static gint ett_tag_measure_reported_frame_tree = -1;
static gint ett_tag_bss_bitmask_tree = -1;
static gint ett_tag_dfs_map_tree = -1;
static gint ett_tag_dfs_map_flags_tree = -1;
static gint ett_tag_erp_info_tree = -1;
static gint ett_tag_ex_cap1 = -1;
static gint ett_tag_ex_cap2 = -1;
@ -5688,6 +5705,7 @@ static gint ett_tag_rm_cap3 = -1;
static gint ett_tag_rm_cap4 = -1;
static gint ett_tag_rm_cap5 = -1;
static gint ett_tag_multiple_bssid_subelem_tree = -1;
static gint ett_tag_20_40_bc = -1;
static gint ett_tag_tclas_mask_tree = -1;
@ -5696,6 +5714,7 @@ static gint ett_tag_supported_channels = -1;
static gint ett_tag_neighbor_report_bssid_info_tree = -1;
static gint ett_tag_neighbor_report_bssid_info_capability_tree = -1;
static gint ett_tag_neighbor_report_subelement_tree = -1;
static gint ett_tag_neighbor_report_sub_tag_tree = -1;
static gint ett_tag_wapi_param_set_akm_tree = -1;
@ -6132,6 +6151,24 @@ extra_one_mul_two_base_custom(gchar *result, guint32 value)
g_snprintf(result, ITEM_LABEL_LENGTH, "%d", (value+1)*2);
}
static void
rcpi_and_power_level_custom(gchar *result, guint8 value)
{
/* 802.11-2016 section 9.4.2.38
RCPI = |2 x (P + 110)| in steps of 0.5 dB */
if (value == 0)
g_snprintf(result, ITEM_LABEL_LENGTH, "%d (P < -109.5 dBm)", value);
else if (value == 220)
g_snprintf(result, ITEM_LABEL_LENGTH, "%d (P >= 0 dBm)", value);
else if (value < 220)
g_snprintf(result, ITEM_LABEL_LENGTH, "%d (P = %.1f dBm)", value, ((double)value) / 2 - 110);
else if (value < 255)
g_snprintf(result, ITEM_LABEL_LENGTH, "%d (Reserved)", value);
else
g_snprintf(result, ITEM_LABEL_LENGTH, "%d (Measurement not available)", value);
}
/* ************************************************************************* */
/* Mesh Control field helper functions
*
@ -15132,6 +15169,27 @@ dissect_secondary_channel_offset_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tre
return tvb_captured_length(tvb);
}
/* RCPI (53) */
static int
dissect_rcpi_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,
"RCPI length %u wrong, must = 1", tag_len);
return 1;
}
proto_tree_add_item(tree, hf_ieee80211_tag_rcpi, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
return 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)
@ -15452,6 +15510,89 @@ dissect_rm_enabled_capabilities_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree
return offset;
}
/* Multiple BSSID (71) */
enum multiple_bssid_subelem_id {
MULTIPLE_BSSID_SUBELEM_NO_BSSID_PROFILE = 0,
MULTIPLE_BSSID_SUBELEM_VENDOR_SPECIFIC = 221
};
static const value_string multiple_bssid_subelem_ids[] = {
{ MULTIPLE_BSSID_SUBELEM_NO_BSSID_PROFILE, "Nontransmitted BSSID Profile" },
{ MULTIPLE_BSSID_SUBELEM_VENDOR_SPECIFIC, "Vendor Specific" },
{ 0, NULL }
};
static int
dissect_multiple_bssid_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
guint tag_len = tvb_reported_length(tvb);
ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
guint offset = 0;
guint8 sub_tag_id, sub_tag_len;
const gchar *sub_tag_name;
proto_tree *sub_tag_tree;
const guint8 ids[] = { TAG_VENDOR_SPECIFIC_IE };
if (tag_len < 1)
{
expert_add_info_format(pinfo, field_data->item_tag_length, &ei_ieee80211_tag_length, "Multiple BSSID length %u wrong, must be at least 1", tag_len);
return 1;
}
proto_tree_add_item(tree, hf_ieee80211_tag_multiple_bssid, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset++;
/* Optional sub-elements */
while (offset + 1 < tag_len) {
sub_tag_id = tvb_get_guint8(tvb, offset);
sub_tag_len = tvb_get_guint8(tvb, offset + 1);
sub_tag_name = val_to_str(sub_tag_id, multiple_bssid_subelem_ids, "Unknown");
sub_tag_tree = proto_tree_add_subtree_format(tree, tvb, offset, sub_tag_len + 2, ett_tag_multiple_bssid_subelem_tree, NULL, "Subelement: %s", sub_tag_name);
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_len, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
if (offset + sub_tag_len > tag_len) {
expert_add_info_format(pinfo, tree, &ei_ieee80211_tag_length, "Not enough data for subelement");
break;
}
switch (sub_tag_id)
{
case MULTIPLE_BSSID_SUBELEM_NO_BSSID_PROFILE:
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_nontrans_profile, tvb, offset, sub_tag_len, ENC_NA);
break;
case MULTIPLE_BSSID_SUBELEM_VENDOR_SPECIFIC:
/*
* add_tagged_field will insert expert info if there is a problem so
* we ignore the return value.
*/
add_tagged_field(pinfo, sub_tag_tree, tvb, offset, 0, ids, G_N_ELEMENTS(ids), NULL);
break;
default:
/* RESERVED */
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_multiple_bssid_subelem_reserved, tvb, offset, sub_tag_len, ENC_NA);
break;
}
offset += sub_tag_len;
}
if (offset < tag_len) {
proto_tree_add_expert_format(tree, pinfo, &ei_ieee80211_extra_data,
tvb, offset, tag_len - offset, "Extra data after subelements");
}
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)
@ -16570,7 +16711,8 @@ dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
ieee80211_tagged_field_data_t* field_data = (ieee80211_tagged_field_data_t*)data;
int offset = 0;
guint8 sub_tag_id;
guint32 sub_tag_length;
guint32 sub_tag_len;
const gchar *sub_tag_name;
proto_item *parent_item;
proto_tree *bssid_info_subtree, *bssid_info_cap_subtree, *sub_tag_tree;
tvbuff_t *sub_tag_tvb = NULL;
@ -16625,64 +16767,63 @@ dissect_neighbor_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
while (offset < tag_len)
{
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);
sub_tag_len = tvb_get_guint8(tvb, offset + 1);
sub_tag_name = val_to_str(sub_tag_id, ieee80211_neighbor_report_subelement_id_vals, "Unknown");
sub_tag_tree = proto_tree_add_subtree_format(tree, tvb, offset, sub_tag_len + 2, ett_tag_neighbor_report_subelement_tree, NULL, "Subelement: %s", sub_tag_name);
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
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);
proto_tree_add_item(sub_tag_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);
proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_data, tvb, offset, sub_tag_length, ENC_NA);
sub_tag_tvb = tvb_new_subset_length(tvb, offset, sub_tag_len);
switch (sub_tag_id) {
case NR_SUB_ID_TSF_INFO:
/* TODO */
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_tsf_offset, tvb, offset, 2, ENC_NA);
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_beacon_interval, tvb, offset + 2, 2, ENC_NA);
break;
case NR_SUB_ID_MEASUREMENT_PILOT_INFO:
/* TODO */
dissect_measurement_pilot_trans_ie(sub_tag_tvb, pinfo, sub_tag_tree, data);
break;
case NR_SUB_ID_CON_COU_STR:
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_country_code, tvb, offset, 2, ENC_ASCII | ENC_NA);
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);
proto_tree_add_item(sub_tag_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);
proto_tree_add_item(tree, hf_ieee80211_tag_neighbor_report_subelement_bss_dur, tvb, offset+8, 2, ENC_NA);
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf, tvb, offset, 8, ENC_NA);
proto_tree_add_item(sub_tag_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);
dissect_ht_capability_ie_common(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len, 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_HT_MULTIPLE_BSSID:
dissect_multiple_bssid_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);
dissect_he_capabilities(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
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);
dissect_he_operation(sub_tag_tvb, pinfo, sub_tag_tree, 0, sub_tag_len);
break;
case NR_SUB_ID_VENDOR_SPECIFIC:
default:
proto_tree_add_item(sub_tag_tree, hf_ieee80211_tag_neighbor_report_subelement_data, tvb, offset, sub_tag_len, ENC_NA);
break;
}
offset += sub_tag_length;
offset += sub_tag_len;
}
return offset;
@ -17889,7 +18030,7 @@ ieee80211_tag_measure_rep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, v
};
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_ofdm,
&hf_ieee80211_tag_measure_map_field_unident_signal,
&hf_ieee80211_tag_measure_map_field_radar,
&hf_ieee80211_tag_measure_map_field_unmeasured,
@ -18217,6 +18358,16 @@ ieee80211_tag_ibss_dfs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
int offset = 0;
proto_item *ti_sup_map;
proto_tree *sub_map_tree;
static const int *ieee80211_tag_dfs_map_flags[] = {
&hf_ieee80211_tag_dfs_map_bss,
&hf_ieee80211_tag_dfs_map_ofdm_preamble,
&hf_ieee80211_tag_dfs_map_unidentified_signal,
&hf_ieee80211_tag_dfs_map_radar,
&hf_ieee80211_tag_dfs_map_unmeasured,
&hf_ieee80211_tag_dfs_map_reserved,
NULL
};
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);
@ -18234,9 +18385,14 @@ ieee80211_tag_ibss_dfs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
{
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;
offset += 1;
proto_tree_add_bitmask_with_flags(sub_map_tree, tvb, offset, hf_ieee80211_tag_dfs_map,
ett_tag_dfs_map_flags_tree, ieee80211_tag_dfs_map_flags,
ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
offset += 1;
}
return tvb_captured_length(tvb);
}
@ -26293,8 +26449,8 @@ proto_register_ieee80211(void)
{&hf_ieee80211_ff_measurement_pilot_int,
{"Measurement Pilot Interval", "wlan.fixed.msmtpilotint",
FT_UINT8, BASE_HEX, 0, 0,
"Measurement Pilot Interval Fixed Field", HFILL }},
FT_UINT8, BASE_DEC, 0, 0,
"Measurement Pilot Interval Fixed Field (in TUs)", HFILL }},
{&hf_ieee80211_ff_country_str,
{"Country String", "wlan.fixed.country",
@ -29374,102 +29530,127 @@ proto_register_ieee80211(void)
{"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_bss_avb_adm_cap_ac0,
{"AC0", "wlan.bss_avb_adm_cap.ac0",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{&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,
@ -29479,14 +29660,17 @@ proto_register_ieee80211(void)
{"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,
@ -29504,30 +29688,37 @@ proto_register_ieee80211(void)
{"Link Measurement", "wlan.rmcap.b0",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
NULL, HFILL }},
{&hf_ieee80211_tag_rm_enabled_capabilities_b1,
{"Neighbor Report", "wlan.rmcap.b1",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02,
NULL, HFILL }},
{&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_rm_enabled_capabilities_b3,
{"Repeated Measurements", "wlan.rmcap.b3",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08,
NULL, HFILL }},
{&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_rm_enabled_capabilities_b5,
{"Beacon Active Measurement", "wlan.rmcap.b5",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x20,
NULL, HFILL }},
{&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_rm_enabled_capabilities_b7,
{"Beacon Measurement Reporting Conditions", "wlan.rmcap.b7",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x80,
@ -29538,30 +29729,37 @@ proto_register_ieee80211(void)
{"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,
@ -29572,14 +29770,17 @@ proto_register_ieee80211(void)
{"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,
@ -29590,22 +29791,27 @@ proto_register_ieee80211(void)
{"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,
@ -29616,40 +29822,79 @@ proto_register_ieee80211(void)
{"BSS Available Admission Capacity capability", "wlan.rmcap.b32",
FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01,
NULL, HFILL }},
{&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_rcpi,
{"RCPI", "wlan.rcpi",
FT_UINT8, BASE_CUSTOM, CF_FUNC(rcpi_and_power_level_custom), 0,
"Received channel power indicator", HFILL }},
/* Multiple BSSID */
{&hf_ieee80211_tag_multiple_bssid,
{"Max BSSID Indicator", "wlan.multiple_bssid",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{&hf_ieee80211_tag_multiple_bssid_subelem_id,
{"Subelement ID", "wlan.multiple_bssid.subelem.id",
FT_UINT8, BASE_DEC, VALS(multiple_bssid_subelem_ids), 0x0,
NULL, HFILL }},
{&hf_ieee80211_tag_multiple_bssid_subelem_len,
{"Length", "wlan.multiple_bssid.subelem.len",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{&hf_ieee80211_tag_multiple_bssid_subelem_reserved,
{"Reserved", "wlan.multiple_bssid.subelem.reserved",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_multiple_bssid_subelem_nontrans_profile,
{"Nontransmitted Profile", "wlan.multiple_bssid.subelem.nontrans_profile",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, 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,
NULL, HFILL }},
{&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_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,
@ -29988,8 +30233,8 @@ proto_register_ieee80211(void)
FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_map_field_bss_flag), 0x01,
NULL, HFILL }},
{&hf_ieee80211_tag_measure_map_field_odfm,
{"Orthogonal Frequency Division Multiplexing (ODFM) Preamble", "wlan.measure.rep.repmode.mapfield.bss",
{&hf_ieee80211_tag_measure_map_field_ofdm,
{"Orthogonal Frequency Division Multiplexing (OFDM) Preamble", "wlan.measure.rep.repmode.mapfield.ofdm_preamble",
FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02,
NULL, HFILL }},
@ -30228,6 +30473,36 @@ proto_register_ieee80211(void)
FT_UINT8, BASE_HEX, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_dfs_map_bss,
{"BSS", "wlan.dfs.map.bss",
FT_BOOLEAN, 8, TFS(&ieee80211_tag_measure_map_field_bss_flag), 0x01,
NULL, HFILL }},
{&hf_ieee80211_tag_dfs_map_ofdm_preamble,
{"Orthogonal Frequency Division Multiplexing (ODFM) Preamble", "wlan.dfs.map.ofdm_preamble",
FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02,
NULL, HFILL }},
{&hf_ieee80211_tag_dfs_map_unidentified_signal,
{"Unidentified Signal", "wlan.dfs.map.unidentsig",
FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x04,
NULL, HFILL }},
{&hf_ieee80211_tag_dfs_map_radar,
{"Radar", "wlan.dfs.map.radar",
FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x08,
NULL, HFILL }},
{&hf_ieee80211_tag_dfs_map_unmeasured,
{"Unmeasured", "wlan.dfs.map.unmeasured",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10,
NULL, HFILL }},
{&hf_ieee80211_tag_dfs_map_reserved,
{"Reserved", "wlan.dfs.map.reserved",
FT_UINT8, BASE_HEX, NULL, 0xE0,
NULL, HFILL }},
{&hf_ieee80211_tag_erp_info,
{"ERP Information", "wlan.erp_info",
FT_UINT8, BASE_HEX, NULL, 0,
@ -30837,35 +31112,50 @@ proto_register_ieee80211(void)
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,
{"ID", "wlan.nreport.subelem.id",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_neighbor_report_subelement_length,
{"Length", "wlan.nreport.subelement_length",
FT_UINT8, BASE_HEX, NULL, 0,
{"Length", "wlan.nreport.subelem.len",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_neighbor_report_subelement_data,
{"Subelement Data", "wlan.nreport.subelement_data",
{"Data", "wlan.nreport.subelem.data",
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",
{"Preference", "wlan.nreport.subelem.bss_trn_can_pref",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_neighbor_report_subelement_bss_ter_tsf,
{"BSS Termination TSF", "wlan.nreport.subelement.bss_ter_tsf",
{"BSS Termination TSF", "wlan.nreport.subelem.bss_ter_tsf",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_neighbor_report_subelement_bss_dur,
{"Duration", "wlan.nreport.subelement.bss_dur",
{"Duration", "wlan.nreport.subelem.bss_dur",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL }},
{&hf_ieee80211_tag_neighbor_report_subelement_tsf_offset,
{"TSF Offset", "wlan.nreport.subelem.tsf_offset",
FT_UINT16, BASE_DEC, NULL, 0,
"TSF Offset in TU units", HFILL } },
{&hf_ieee80211_tag_neighbor_report_subelement_beacon_interval,
{"Beacon Interval", "wlan.nreport.subelem.beacon_interval",
FT_UINT16, BASE_DEC, NULL, 0,
"Beacon Interval in TUs", HFILL } },
{&hf_ieee80211_tag_neighbor_report_subelement_country_code,
{"Country Code", "wlan.nreport.subelem.country_code",
FT_STRING, BASE_NONE, NULL, 0x0,
"ISO 3166-1 Alpha-2 Country Code", HFILL }},
{&hf_ieee80211_tag_supported_ope_classes_current,
{"Current Operating Class", "wlan.supopeclass.current",
FT_UINT8, BASE_DEC, NULL, 0,
@ -34270,6 +34560,7 @@ proto_register_ieee80211(void)
&ett_tag_measure_reported_frame_tree,
&ett_tag_bss_bitmask_tree,
&ett_tag_dfs_map_tree,
&ett_tag_dfs_map_flags_tree,
&ett_tag_erp_info_tree,
&ett_tag_ex_cap1,
&ett_tag_ex_cap2,
@ -34288,6 +34579,8 @@ proto_register_ieee80211(void)
&ett_tag_rm_cap4,
&ett_tag_rm_cap5,
&ett_tag_multiple_bssid_subelem_tree,
&ett_tag_20_40_bc,
&ett_tag_tclas_mask_tree,
@ -34296,6 +34589,7 @@ proto_register_ieee80211(void)
&ett_tag_neighbor_report_bssid_info_tree,
&ett_tag_neighbor_report_bssid_info_capability_tree,
&ett_tag_neighbor_report_subelement_tree,
&ett_tag_neighbor_report_sub_tag_tree,
&ett_tag_wapi_param_set_akm_tree,
@ -35003,6 +35297,7 @@ proto_reg_handoff_ieee80211(void)
dissector_add_uint("wlan.tag.number", TAG_HT_CAPABILITY, create_dissector_handle(dissect_ht_capability_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_HT_INFO, create_dissector_handle(dissect_ht_info_ie_1_1, -1));
dissector_add_uint("wlan.tag.number", TAG_SECONDARY_CHANNEL_OFFSET, create_dissector_handle(dissect_secondary_channel_offset_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_RCPI, create_dissector_handle(dissect_rcpi_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_BSS_AVG_ACCESS_DELAY, create_dissector_handle(dissect_bss_avg_access_delay_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_ANTENNA, create_dissector_handle(dissect_antenna_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_RSNI, create_dissector_handle(dissect_rsni_ie, -1));
@ -35015,6 +35310,7 @@ proto_reg_handoff_ieee80211(void)
dissector_add_uint("wlan.tag.number", TAG_WNM_SLEEP_MODE, create_dissector_handle(dissect_wnm_sleep_mode, -1));
dissector_add_uint("wlan.tag.number", TAG_TIME_ADV, create_dissector_handle(dissect_time_adv, -1));
dissector_add_uint("wlan.tag.number", TAG_RM_ENABLED_CAPABILITY, create_dissector_handle(dissect_rm_enabled_capabilities_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_MULTIPLE_BSSID, create_dissector_handle(dissect_multiple_bssid_ie, -1));
dissector_add_uint("wlan.tag.number", TAG_20_40_BSS_CO_EX, create_dissector_handle(dissect_20_40_bss_coexistence, -1));
dissector_add_uint("wlan.tag.number", TAG_OVERLAP_BSS_SCAN_PAR, create_dissector_handle(dissect_overlap_bss_scan_par, -1));
dissector_add_uint("wlan.tag.number", TAG_RIC_DESCRIPTOR, create_dissector_handle(dissect_ric_descriptor, -1));