WIP:ieee80211: HotSpot 2.0 fixes.

This bring the IEEE802.11 dissector further into conformance with the
HS2.0 spec.

I have concerns at how complex the handling of
dissect_advertisement_protocol_common has become.

I also have some bugs reported by the WFA to deal with.

Change-Id: I69caca7d568562b752a70e5f73a7fa395364bc23
Reviewed-on: https://code.wireshark.org/review/26279
Petri-Dish: Richard Sharpe <realrichardsharpe@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: ronnie sahlberg <ronniesahlberg@gmail.com>
This commit is contained in:
Richard Sharpe 2018-03-06 10:27:01 -08:00 committed by ronnie sahlberg
parent 6db59affd9
commit 37723968d2
2 changed files with 581 additions and 25 deletions

View File

@ -730,9 +730,12 @@ static const value_string tag_num_vals_eid_ext[] = {
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 }
@ -4324,6 +4327,33 @@ static int hf_ieee80211_tag_obss_satpc = -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;
@ -4383,6 +4413,9 @@ static int hf_ieee80211_tag_wnm_sleep_mode_action_type = -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;
@ -4756,7 +4789,10 @@ static int hf_ieee80211_dpp_subtype = -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;
@ -4784,6 +4820,14 @@ 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_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_cf_response_offset = -1;
@ -5450,6 +5494,16 @@ static gint ett_nai_realm_eap = -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;
@ -5463,6 +5517,8 @@ static gint ett_meru = -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 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;
@ -6379,12 +6435,18 @@ dissect_vendor_action_wifi_alliance(tvbuff_t *tvb, packet_info *pinfo, proto_tre
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;
@ -6396,8 +6458,16 @@ dissect_advertisement_protocol_common(packet_info *pinfo, proto_tree *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);
@ -6415,7 +6485,8 @@ dissect_advertisement_protocol_common(packet_info *pinfo, proto_tree *tree,
}
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");
@ -6471,7 +6542,7 @@ dissect_advertisement_protocol_common(packet_info *pinfo, proto_tree *tree,
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);
}
@ -6926,13 +6997,70 @@ dissect_venue_url_list(proto_tree *tree, tvbuff_t *tvb, int offset, int end)
}
}
#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, 0);
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 tvb_captured_length(tvb);
}
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 tvb_captured_length(tvb);
}
#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
static const value_string hs20_anqp_subtype_vals[] = {
{ HS20_ANQP_HS_QUERY_LIST, "HS Query list" },
@ -6942,6 +7070,9 @@ static const value_string hs20_anqp_subtype_vals[] = {
{ 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" },
{ 0, NULL }
};
@ -7044,7 +7175,7 @@ dissect_hs20_anqp_connection_capability(proto_tree *tree, tvbuff_t *tvb,
"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++;
@ -7109,11 +7240,11 @@ dissect_hs20_anqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat
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)"));
"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,
"Unknown (%u)"));
"Reserved (%u)"));
} else if (anqp_data->idx == 1) {
col_append_str(pinfo->cinfo, COL_INFO, ", ..");
}
@ -9163,12 +9294,65 @@ wnm_tfs_resp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
return offset - start;
}
#define AP_DESCRIPTOR 0
#define FIRMWARE_VERSION_CURRENT 1
#define FIRMWARE_VERSION_NEW 2
static guint
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);
proto_tree_add_item(tree, hf_ieee80211_wnm_sub_elt_id, tvb, offset, 1, ENC_NA);
offset++;
proto_tree_add_item(tree, hf_ieee80211_wnm_sub_elt_len, tvb, offset, 1, ENC_NA);
offset++;
switch (sub_elt_id) {
case AP_DESCRIPTOR:
break;
case FIRMWARE_VERSION_CURRENT:
break;
case FIRMWARE_VERSION_NEW:
break;
}
offset += sub_elt_len;
return offset;
}
static guint
wnm_notification_req(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset)
{
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) {
while (len > 0) {
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;
}
@ -11301,6 +11485,184 @@ dissect_vendor_ie_wpawme(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, in
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 is 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++;
}
}
offset = dissect_group_data_cipher_suite(tvb, pinfo, tree, offset, gmcs_array,
ett_osen_group_management_cipher_suite,
"OSEN Group Management Cipher Suite");
return tvb_captured_length(tvb);
}
static const value_string hs20_indication_release_number_vals[] = {
{ 0, "Release 1" },
{ 1, "Release 2" },
@ -11314,12 +11676,31 @@ dissect_hs20_indication(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
&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);
guint8 indic = tvb_get_guint8(tvb, 0);
int offset = 0;
proto_tree_add_bitmask_list(tree, tvb, 0, 1, ieee80211_hs20_indication, ENC_LITTLE_ENDIAN);
return tvb_captured_length(tvb);
proto_tree_add_bitmask_list(tree, tvb, offset, 1, ieee80211_hs20_indication,
ENC_LITTLE_ENDIAN);
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_BIG_ENDIAN);
offset += 2;
}
if ((len >= (offset + 2)) && (indic & 0x04)) {
proto_tree_add_item(tree, hf_hs20_indication_anqp_domain_id, tvb, offset,
2, ENC_BIG_ENDIAN);
offset += 2;
}
return len;
}
static void
@ -11921,7 +12302,10 @@ dissect_qos_capability(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int
return offset;
}
/* 7.3.2.25 RSN information element */
/*
* 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)
@ -25732,16 +26116,28 @@ proto_register_ieee80211(void)
{&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 }},
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02, 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 }},
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04, NULL, HFILL }},
{&hf_hs20_reserved,
{ "Reserved", "wlan.hs20.indication.reserved",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x80, 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_hs20_indication_pps_mo_id,
{"PPS MO ID", "wlan.hs20.indication.pps_mo_id",
FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
{&hf_hs20_indication_anqp_domain_id,
{"ANQP Domain ID", "wlan.hs20.indication.domain_id",
FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL }},
{&hf_hs20_anqp_subtype,
{"Subtype", "wlan.hs20.anqp.subtype",
FT_UINT8, BASE_DEC, VALS(hs20_anqp_subtype_vals), 0,
@ -25854,6 +26250,34 @@ proto_register_ieee80211(void)
{"Operating Class", "wlan.hs20.anqp.oper_class_indic.oper_class",
FT_UINT8, BASE_DEC, NULL, 0, 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_hs20_subscription_remediation_server_url,
{"Server URL", "wlan.hs20.subs_remediation.server_url",
FT_STRING, BASE_NONE, 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_hs20_deauth_reason_code,
{"De-Auth Reason Code", "wlan.hs20.deauth.reason_code",
FT_UINT8, 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_hs20_deauth_reason_url_len,
{"Reason URL Length", "wlan.hs20.deauth.reason_url_len",
FT_UINT8, 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,
{"Tag", "wlan.tag",
FT_NONE, BASE_NONE, 0x0, 0,
@ -30447,6 +30871,115 @@ proto_register_ieee80211(void)
{"Scan Activity Threshold", "wlan.obss.sat",
FT_UINT16, BASE_DEC, NULL, 0, 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 }},
/* 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_osen_pcs_count,
{"OSEN Pairwise Cipher Suite Count", "wlan.osen.pwcs.count",
FT_UINT16, BASE_DEC, NULL, 0, NULL, 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_osen_pairwise_cipher_suite_type,
{"OSEN Pairwise Cypher Suite type", "wlan.osen.pwcs.type",
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
{&hf_osen_akm_count,
{"OSEN AKM Cipher Suite Count", "wlan.osen.akms.count",
FT_UINT8, BASE_DEC, NULL, 0, NULL, 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_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_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_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_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_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_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_osen_rsn_cap_peerkey,
{"PeerKey Enabled", "wlan.osen.rsn.capabilities.peerkey",
FT_BOOLEAN, 16, TFS(&tfs_enabled_disabled), 0x200, NULL, HFILL }},
{&hf_osen_rsn_cap_flags,
{"RSN Capability Flags", "wlan.osen.rsn.cabailities.flags",
FT_UINT16, BASE_HEX, NULL, 0, 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_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_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_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_osen_reserved,
{"Reserved", "wlan.osen.rsn.capabilities.reserved",
FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL }},
{&hf_osen_pmkid_count,
{"OSEN PMKID Count", "wlan.osen.pmkid.count",
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{&hf_osen_pmkid,
{"OSEN PKMID", "wlan.osen.pmkid.bytes",
FT_BYTES, BASE_NONE, NULL, 0, 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",
@ -30620,6 +31153,14 @@ proto_register_ieee80211(void)
{"WNM-Sleep Interval", "wlan.wnm_sleep_mode.interval",
FT_UINT16, BASE_DEC, 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_wnm_sub_elt_len,
{"Subelement len", "wlan.wnm_subelt.len",
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL }},
/* Time Advertisement */
{&hf_ieee80211_tag_time_adv_timing_capab,
{"Timing capabilities", "wlan.time_adv.timing_capab",
@ -31884,6 +32425,15 @@ proto_register_ieee80211(void)
&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,
@ -32563,7 +33113,10 @@ proto_reg_handoff_ieee80211(void)
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));
}
/*

View File

@ -267,12 +267,15 @@ typedef struct anqp_info_dissector_data {
} anqp_info_dissector_data_t;
/* WFA vendor specific subtypes */
#define WFA_SUBTYPE_P2P 9
#define WFA_SUBTYPE_WIFI_DISPLAY 10
#define WFA_SUBTYPE_HS20_INDICATION 16
#define WFA_SUBTYPE_HS20_ANQP 17
#define WFA_SUBTYPE_DPP 26
#define WFA_SUBTYPE_IEEE1905_MULTI_AP 27 /* ox1B */
#define WFA_SUBTYPE_SUBSCRIPTION_REMEDIATION 0
#define WFA_SUBTYPE_DEAUTHENTICATION_IMMINENT 1
#define WFA_SUBTYPE_P2P 9
#define WFA_SUBTYPE_WIFI_DISPLAY 10
#define WFA_SUBTYPE_HS20_INDICATION 16
#define WFA_SUBTYPE_HS20_ANQP 17
#define WFA_SUBTYPE_OSEN 18
#define WFA_SUBTYPE_DPP 26
#define WFA_SUBTYPE_IEEE1905_MULTI_AP 27 /* ox1B */
/*
* Editor modelines