From 1d7c05c8984cb16e4d0fadec14537977ef29d789 Mon Sep 17 00:00:00 2001 From: Anders Broman Date: Mon, 7 Feb 2011 20:50:13 +0000 Subject: [PATCH] From Alexis La Goutte: Cleanup 802.11 Dissector : Enhance add_tagged_field (and sub tagged field dissector) https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5660 svn path=/trunk/; revision=35863 --- epan/dissectors/packet-ieee80211.c | 479 +++++++++++++++++++++-------- 1 file changed, 358 insertions(+), 121 deletions(-) diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index ad3b898358..29168b4890 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -1649,6 +1649,23 @@ static int hf_ieee80211_antsel_b5 = -1; static int hf_ieee80211_antsel_b6 = -1; static int hf_ieee80211_antsel_b7 = -1; +static int hf_ieee80211_rsn_version = -1; +static int hf_ieee80211_rsn_gcs = -1; +static int hf_ieee80211_rsn_gcs_oui = -1; +static int hf_ieee80211_rsn_gcs_type = -1; +static int hf_ieee80211_rsn_gcs_80211_type = -1; +static int hf_ieee80211_rsn_pcs_count = -1; +static int hf_ieee80211_rsn_pcs_list = -1; +static int hf_ieee80211_rsn_pcs = -1; +static int hf_ieee80211_rsn_pcs_oui = -1; +static int hf_ieee80211_rsn_pcs_80211_type = -1; +static int hf_ieee80211_rsn_pcs_type = -1; +static int hf_ieee80211_rsn_akms_count = -1; +static int hf_ieee80211_rsn_akms_list = -1; +static int hf_ieee80211_rsn_akms = -1; +static int hf_ieee80211_rsn_akms_oui = -1; +static int hf_ieee80211_rsn_akms_80211_type = -1; +static int hf_ieee80211_rsn_akms_type = -1; static int hf_ieee80211_rsn_cap = -1; static int hf_ieee80211_rsn_cap_preauth = -1; static int hf_ieee80211_rsn_cap_no_pairwise = -1; @@ -1657,6 +1674,13 @@ static int hf_ieee80211_rsn_cap_gtksa_replay_counter = -1; static int hf_ieee80211_rsn_cap_mfpr = -1; static int hf_ieee80211_rsn_cap_mfpc = -1; static int hf_ieee80211_rsn_cap_peerkey = -1; +static int hf_ieee80211_rsn_pmkid_count = -1; +static int hf_ieee80211_rsn_pmkid_list = -1; +static int hf_ieee80211_rsn_pmkid = -1; +static int hf_ieee80211_rsn_gmcs = -1; +static int hf_ieee80211_rsn_gmcs_oui = -1; +static int hf_ieee80211_rsn_gmcs_type = -1; +static int hf_ieee80211_rsn_gmcs_80211_type = -1; static int hf_ieee80211_aironet_ie_type = -1; static int hf_ieee80211_aironet_ie_version = -1; @@ -1799,7 +1823,14 @@ static gint ett_msh_parameters = -1; static gint ett_msh_dest_flags_tree = -1; #endif /* MESH_OVERRIDES */ +static gint ett_rsn_gcs_tree = -1; +static gint ett_rsn_pcs_tree = -1; +static gint ett_rsn_sub_pcs_tree = -1; +static gint ett_rsn_akms_tree = -1; +static gint ett_rsn_sub_akms_tree = -1; static gint ett_rsn_cap_tree = -1; +static gint ett_rsn_pmkid_tree = -1; +static gint ett_rsn_gmcs_tree = -1; static gint ett_ht_cap_tree = -1; static gint ett_ampduparam_tree = -1; @@ -4121,6 +4152,114 @@ static const value_string wpa_cipher_vals[] = {0, NULL} }; +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"}, + {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 = get_manuf_name_if_known(p_oui); + if (manuf_name == NULL) { + /* Could not find an OUI. */ + g_snprintf(result, ITEM_LABEL_LENGTH, "%.2x-%.2x-%.2x", p_oui[0], p_oui[1], p_oui[2] ); + } + else { + /* Found an address string. */ + g_snprintf(result, ITEM_LABEL_LENGTH, "%s", manuf_name ); + } +} +static void +rsn_gcs_base_custom(gchar *result, guint32 gcs) +{ + gchar *oui_result=NULL; + oui_result = ep_alloc(SHORT_STR); + oui_result[0] = '\0'; + oui_base_custom(oui_result, gcs >>8); + g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, val_to_str( gcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d") ); +} + +static void +rsn_pcs_base_custom(gchar *result, guint32 pcs) +{ + gchar *oui_result=NULL; + oui_result = ep_alloc(SHORT_STR); + oui_result[0] = '\0'; + oui_base_custom(oui_result, pcs >>8); + g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, val_to_str( pcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d") ); + +} +static void +rsn_akms_base_custom(gchar *result, guint32 akms) +{ + gchar *oui_result=NULL; + oui_result = ep_alloc(SHORT_STR); + oui_result[0] = '\0'; + oui_base_custom(oui_result, akms >>8); + g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, val_to_str( akms & 0xFF, ieee80211_rsn_keymgmt_vals, "Unknown %d") ); +} + +static gchar * +rsn_pcs_return(guint32 pcs) +{ + gchar *result=NULL; + result = ep_alloc(SHORT_STR); + result[0] = '\0'; + rsn_pcs_base_custom(result, pcs); + + return result; +} + +static gchar * +rsn_akms_return(guint32 akms) +{ + gchar *result=NULL; + result = ep_alloc(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=NULL; + oui_result = ep_alloc(SHORT_STR); + oui_result[0] = '\0'; + oui_base_custom(oui_result, gmcs >>8); + g_snprintf(result, ITEM_LABEL_LENGTH, "%s %s", oui_result, val_to_str( gmcs & 0xFF, ieee80211_rsn_cipher_vals, "Unknown %d") ); +} + static const value_string wpa_keymgmt_vals[] = { {0, "NONE"}, @@ -4504,131 +4643,125 @@ dissect_vendor_ie_aironet(proto_item * aironet_item, proto_tree * ietree, val_to_str(type, aironet_ie_type_vals, "Unknown")); } } - +/* 7.3.2.25 RSN information element */ static void -dissect_rsn_ie(proto_tree * tree, tvbuff_t * tag_tvb) +dissect_rsn_ie(proto_tree * tree, tvbuff_t * tvb, int offset, guint32 tag_len) { - guint tag_off = 0; - guint tag_len = tvb_length(tag_tvb); - char out_buff[SHORT_STR]; - int i, count; - proto_item *cap_item; - proto_tree *cap_tree; + proto_item *rsn_gcs_item, *rsn_pcs_item, *rsn_akms_item, *rsn_cap_item, *rsn_pmkid_item, *rsn_gmcs_item; + proto_item *rsn_sub_pcs_item, *rsn_sub_akms_item; + proto_tree *rsn_gcs_tree, *rsn_pcs_tree, *rsn_akms_tree, *rsn_cap_tree, *rsn_pmkid_tree, *rsn_gmcs_tree; + proto_tree *rsn_sub_pcs_tree, *rsn_sub_akms_tree; + guint16 i, pcs_count, akms_count, pmkid_count; + int tag_end = offset + tag_len; - if (tag_off + 2 > tag_len) { - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, tag_len, - "Not interpreted"); + proto_tree_add_item(tree, hf_ieee80211_rsn_version, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + + /* 7.3.2.25.1 Cipher suites */ + rsn_gcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gcs, tvb, offset, 4, FALSE); + 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, FALSE); + /* Check if OUI is 00:0F:AC (ieee80211) */ + if(tvb_get_ntoh24(tvb, offset) == 0x000FAC) + { + proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_80211_type, tvb, offset + 3, 1, FALSE); + } else { + proto_tree_add_item(rsn_gcs_tree, hf_ieee80211_rsn_gcs_type, tvb, offset + 3, 1, FALSE); + } + offset += 4; + + 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; + + rsn_pcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pcs_list, tvb, offset, pcs_count * 4, FALSE); + rsn_pcs_tree = proto_item_add_subtree(rsn_pcs_item, ett_rsn_pcs_tree); + for(i=1; i <= pcs_count; i++) + { + rsn_sub_pcs_item = proto_tree_add_item(rsn_pcs_tree, hf_ieee80211_rsn_pcs, tvb, offset, 4, FALSE); + 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, FALSE); + /* Check if OUI is 00:0F:AC (ieee80211) */ + if(tvb_get_ntoh24(tvb, offset) == 0x000FAC) + { + proto_tree_add_item(rsn_sub_pcs_tree, hf_ieee80211_rsn_pcs_80211_type, tvb, offset+3, 1, FALSE); + 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, FALSE); + } + offset += 4; + } + + /* 7.3.2.25.2 AKM suites */ + 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; + + rsn_akms_item = proto_tree_add_item(tree, hf_ieee80211_rsn_akms_list, tvb, offset, akms_count * 4, FALSE); + rsn_akms_tree = proto_item_add_subtree(rsn_akms_item, ett_rsn_akms_tree); + for(i=1; i <= akms_count; i++) + { + rsn_sub_akms_item = proto_tree_add_item(rsn_akms_tree, hf_ieee80211_rsn_akms, tvb, offset, 4, FALSE); + 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, FALSE); + + /* Check if OUI is 00:0F:AC (ieee80211) */ + if(tvb_get_ntoh24(tvb, offset) == 0x000FAC) + { + proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_80211_type, tvb, offset+3, 1, FALSE); + proto_item_append_text(rsn_akms_item, " %s", rsn_akms_return(tvb_get_ntohl(tvb, offset))); + } else { + proto_tree_add_item(rsn_sub_akms_tree, hf_ieee80211_rsn_akms_type, tvb, offset+3, 1, FALSE); + } + offset += 4; + } + + /* 7.3.2.25.3 RSN capabilities */ + rsn_cap_item = proto_tree_add_item(tree, hf_ieee80211_rsn_cap, tvb, offset, 2, ENC_LITTLE_ENDIAN); + rsn_cap_tree = proto_item_add_subtree(rsn_cap_item, ett_rsn_cap_tree); + + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_preauth, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_no_pairwise, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_ptksa_replay_counter, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_gtksa_replay_counter, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_mfpr, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_mfpc, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_item(rsn_cap_tree, hf_ieee80211_rsn_cap_peerkey, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + if(offset >= tag_end) + { return; } + /* 7.3.2.25.4 PMKID */ + 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; - g_snprintf(out_buff, SHORT_STR, "RSN IE, version %u", - tvb_get_letohs(tag_tvb, tag_off)); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 2, out_buff); - - tag_off += 2; - - if (tag_off + 4 > tag_len) - goto done; - - /* multicast cipher suite */ - if (!tvb_memeql(tag_tvb, tag_off, RSN_OUI, 3)) { - g_snprintf(out_buff, SHORT_STR, "Multicast cipher suite: %s", - val_to_str(tvb_get_guint8(tag_tvb, tag_off + 3), - wpa_cipher_vals, "UNKNOWN")); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 4, out_buff); - tag_off += 4; + rsn_pmkid_item = proto_tree_add_item(tree, hf_ieee80211_rsn_pmkid_list, tvb, offset, pmkid_count * 16, FALSE); + rsn_pmkid_tree = proto_item_add_subtree(rsn_pmkid_item, ett_rsn_pmkid_tree); + for(i=1; i <= pmkid_count; i++) + { + proto_tree_add_item(rsn_pmkid_tree, hf_ieee80211_rsn_pmkid, tvb, offset, 16, FALSE); + offset +=16; } - if (tag_off + 2 > tag_len) - goto done; - - /* unicast cipher suites */ - count = tvb_get_letohs(tag_tvb, tag_off); - g_snprintf(out_buff, SHORT_STR, "# of unicast cipher suites: %u", count); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 2, out_buff); - tag_off += 2; - i = 1; - while (tag_off + 4 <= tag_len && i <= count) { - if (tvb_memeql(tag_tvb, tag_off, RSN_OUI, 3) != 0) - goto done; - g_snprintf(out_buff, SHORT_STR, "Unicast cipher suite %u: %s", - i, val_to_str(tvb_get_guint8(tag_tvb, tag_off + 3), - wpa_cipher_vals, "UNKNOWN")); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 4, out_buff); - tag_off += 4; - i++; + if(offset >= tag_end) + { + return; } - - if (i <= count || tag_off + 2 > tag_len) - goto done; - - /* authenticated key management suites */ - count = tvb_get_letohs(tag_tvb, tag_off); - g_snprintf(out_buff, SHORT_STR, "# of auth key management suites: %u", count); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 2, out_buff); - tag_off += 2; - i = 1; - while (tag_off + 4 <= tag_len && i <= count) { - if (tvb_memeql(tag_tvb, tag_off, RSN_OUI, 3) != 0) - goto done; - g_snprintf(out_buff, SHORT_STR, "auth key management suite %u: %s", - i, val_to_str(tvb_get_guint8(tag_tvb, tag_off + 3), - wpa_keymgmt_vals, "UNKNOWN")); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 4, out_buff); - tag_off += 4; - i++; + /* Group Management Cipher Suite (802.11w)*/ + rsn_gmcs_item = proto_tree_add_item(tree, hf_ieee80211_rsn_gmcs, tvb, offset, 4, FALSE); + 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, FALSE); + /* Check if OUI is 00:0F:AC (ieee80211) */ + if(tvb_get_ntoh24(tvb, offset) == 0x000FAC) + { + proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_80211_type, tvb, offset + 3, 1, FALSE); + } else { + proto_tree_add_item(rsn_gmcs_tree, hf_ieee80211_rsn_gmcs_type, tvb, offset + 3, 1, FALSE); } + offset += 4; - if (i <= count || tag_off + 2 > tag_len) - goto done; - - cap_item = proto_tree_add_item(tree, hf_ieee80211_rsn_cap, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - cap_tree = proto_item_add_subtree(cap_item, ett_rsn_cap_tree); - - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_preauth, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_no_pairwise, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_ptksa_replay_counter, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_gtksa_replay_counter, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_mfpr, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_mfpc, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - proto_tree_add_item(cap_tree, hf_ieee80211_rsn_cap_peerkey, tag_tvb, tag_off, 2, ENC_LITTLE_ENDIAN); - tag_off += 2; - - if (tag_off + 2 > tag_len) - goto done; - - count = tvb_get_letohs(tag_tvb, tag_off); - g_snprintf(out_buff, SHORT_STR, "# of PMKIDs: %u", count); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 2, out_buff); - tag_off += 2; - - /* PMKID List (16 * n octets) */ - for (i = 0; i < count; i++) { - if (tag_off + PMKID_LEN > tag_len) - break; - g_snprintf(out_buff, SHORT_STR, "PMKID %u: %s", i, - tvb_bytes_to_str(tag_tvb, tag_off, PMKID_LEN)); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, - PMKID_LEN, out_buff); - tag_off += PMKID_LEN; - } - - if (tag_off + 4 > tag_len) - goto done; - - if (!tvb_memeql(tag_tvb, tag_off, RSN_OUI, 3)) { - g_snprintf(out_buff, SHORT_STR, "Group management cipher suite: %s", - val_to_str(tvb_get_guint8(tag_tvb, tag_off + 3), - wpa_cipher_vals, "UNKNOWN")); - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, 4, - out_buff); - tag_off += 4; - } - -done: - if (tag_off < tag_len) - proto_tree_add_string(tree, hf_ieee80211_tag_interpretation, tag_tvb, tag_off, - tag_len - tag_off, "Not interpreted"); } static void @@ -6231,8 +6364,8 @@ add_tagged_field (packet_info * pinfo, proto_tree * tree, tvbuff_t * tvb, int of break; case TAG_RSN_IE: - tag_tvb = tvb_new_subset(tvb, offset + 2, tag_len, tag_len); - dissect_rsn_ie(tree, tag_tvb); + /* Add Expert Info to check tag_len ? */ + dissect_rsn_ie(tree, tvb, offset + 2, tag_len); break; case TAG_MOBILITY_DOMAIN: @@ -12310,30 +12443,98 @@ proto_register_ieee80211 (void) FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }}, + {&hf_ieee80211_rsn_version, + {"RSN Version", "wlan_mgt.rsn.version", FT_UINT16, BASE_DEC, + NULL, 0, "Indicates the version number of the RSNA protocol", HFILL }}, + + {&hf_ieee80211_rsn_gcs, + {"Group Cipher Suite", "wlan_mgt.rsn.gcs", FT_UINT32, BASE_CUSTOM, + rsn_gcs_base_custom, 0, "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }}, + + {&hf_ieee80211_rsn_gcs_oui, + {"Group Cipher Suite OUI", "wlan_mgt.rsn.gcs.oui", FT_UINT24, BASE_CUSTOM, + oui_base_custom, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_gcs_type, + {"Group Cipher Suite type", "wlan_mgt.rsn.gcs.type", FT_UINT8, BASE_DEC, + NULL, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_gcs_80211_type, + {"Group Cipher Suite type", "wlan_mgt.rsn.gcs.type", FT_UINT8, BASE_DEC, + VALS(ieee80211_rsn_cipher_vals), 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_pcs_count, + {"Pairwise Cipher Suite Count", "wlan_mgt.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_rsn_pcs_list, + {"Pairwise Cipher Suite List", "wlan_mgt.rsn.pcs.list", FT_NONE, BASE_NONE, + NULL, 0, "Contains a series of cipher suite selectors that indicate the pairwisecipher suites", HFILL }}, + + {&hf_ieee80211_rsn_pcs, + {"Pairwise Cipher Suite", "wlan_mgt.rsn.pcs", FT_UINT32, BASE_CUSTOM, + rsn_pcs_base_custom, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_pcs_oui, + {"Pairwise Cipher Suite OUI", "wlan_mgt.rsn.pcs.oui", FT_UINT24, BASE_CUSTOM, + oui_base_custom, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_pcs_type, + {"Pairwise Cipher Suite type", "wlan_mgt.rsn.pcs.type", FT_UINT8, BASE_DEC, + NULL, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_pcs_80211_type, + {"Pairwise Cipher Suite type", "wlan_mgt.rsn.pcs.type", FT_UINT8, BASE_DEC, + VALS(ieee80211_rsn_cipher_vals), 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_akms_count, + {"Auth Key Management (AKM) Suite Count", "wlan_mgt.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_rsn_akms_list, + {"Auth Key Management (AKM) List", "wlan_mgt.rsn.akms.list", FT_NONE, BASE_NONE, + NULL, 0, "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }}, + + {&hf_ieee80211_rsn_akms, + {"Auth Key Management (AKM) Suite", "wlan_mgt.rsn.akms", FT_UINT32, BASE_CUSTOM, + rsn_akms_base_custom, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_akms_oui, + {"Auth Key Management (AKM) OUI", "wlan_mgt.rsn.akms.oui", FT_UINT24, BASE_CUSTOM, + oui_base_custom, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_akms_type, + {"Auth Key Management (AKM) type", "wlan_mgt.rsn.akms.type", FT_UINT8, BASE_DEC, + NULL, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_akms_80211_type, + {"Auth Key Management (AKM) type", "wlan_mgt.rsn.akms.type", FT_UINT8, BASE_DEC, + VALS(ieee80211_rsn_keymgmt_vals), 0, NULL, HFILL }}, + {&hf_ieee80211_rsn_cap, {"RSN Capabilities", "wlan_mgt.rsn.capabilities", FT_UINT16, BASE_HEX, NULL, 0, "RSN Capability information", HFILL }}, {&hf_ieee80211_rsn_cap_preauth, {"RSN Pre-Auth capabilities", "wlan_mgt.rsn.capabilities.preauth", - FT_BOOLEAN, 16, TFS (&rsn_preauth_flags), 0x0001, + FT_BOOLEAN, 16, TFS(&rsn_preauth_flags), 0x0001, NULL, HFILL }}, {&hf_ieee80211_rsn_cap_no_pairwise, {"RSN No Pairwise capabilities", "wlan_mgt.rsn.capabilities.no_pairwise", - FT_BOOLEAN, 16, TFS (&rsn_no_pairwise_flags), 0x0002, + FT_BOOLEAN, 16, TFS(&rsn_no_pairwise_flags), 0x0002, NULL, HFILL }}, {&hf_ieee80211_rsn_cap_ptksa_replay_counter, {"RSN PTKSA Replay Counter capabilities", "wlan_mgt.rsn.capabilities.ptksa_replay_counter", - FT_UINT16, BASE_HEX, VALS (&rsn_cap_replay_counter), 0x000C, + FT_UINT16, BASE_HEX, VALS(&rsn_cap_replay_counter), 0x000C, NULL, HFILL }}, {&hf_ieee80211_rsn_cap_gtksa_replay_counter, {"RSN GTKSA Replay Counter capabilities", "wlan_mgt.rsn.capabilities.gtksa_replay_counter", - FT_UINT16, BASE_HEX, VALS (&rsn_cap_replay_counter), 0x0030, + FT_UINT16, BASE_HEX, VALS(&rsn_cap_replay_counter), 0x0030, NULL, HFILL }}, {&hf_ieee80211_rsn_cap_mfpr, @@ -12351,6 +12552,35 @@ proto_register_ieee80211 (void) "wlan_mgt.rsn.capabilities.peerkey", FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL }}, + {&hf_ieee80211_rsn_pmkid_count, + {"PMKID Count", "wlan_mgt.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_mgt.rsn.pmkid.list", FT_NONE, BASE_NONE, + NULL, 0, "Contains a series of cipher suite selectors that indicate the AKM suites", HFILL }}, + + {&hf_ieee80211_rsn_pmkid, + {"PMKID", "wlan_mgt.pmkid.akms", FT_BYTES, BASE_NONE, + NULL, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_gmcs, + {"Group Managemement Cipher Suite", "wlan_mgt.rsn.gmcs", FT_UINT32, BASE_CUSTOM, + rsn_gmcs_base_custom, 0, "Contains the cipher suite selector used by the BSS to protect broadcast/multicast traffic", HFILL }}, + + {&hf_ieee80211_rsn_gmcs_oui, + {"Group Managemement Cipher Suite OUI", "wlan_mgt.rsn.gmcs.oui", FT_UINT24, BASE_CUSTOM, + oui_base_custom, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_gmcs_type, + {"Group Managemement Cipher Suite type", "wlan_mgt.rsn.gmcs.type", FT_UINT8, BASE_DEC, + NULL, 0, NULL, HFILL }}, + + {&hf_ieee80211_rsn_gmcs_80211_type, + {"Group Managemement Cipher Suite type", "wlan_mgt.rsn.gmcs.type", FT_UINT8, BASE_DEC, + VALS(ieee80211_rsn_cipher_vals), 0, NULL, HFILL }}, + + {&hf_ieee80211_ht_cap, {"HT Capabilities Info", "wlan_mgt.ht.capabilities", FT_UINT16, BASE_HEX, NULL, 0, "HT Capability information", HFILL }}, @@ -13803,7 +14033,14 @@ proto_register_ieee80211 (void) &ett_msh_dest_flags_tree, #endif /* MESH_OVERRIDES */ &ett_cap_tree, - &ett_rsn_cap_tree, + &ett_rsn_gcs_tree, + &ett_rsn_pcs_tree, + &ett_rsn_sub_pcs_tree, + &ett_rsn_akms_tree, + &ett_rsn_sub_akms_tree, + &ett_rsn_cap_tree, + &ett_rsn_pmkid_tree, + &ett_rsn_gmcs_tree, &ett_ht_cap_tree, &ett_ff_ba_param_tree, &ett_ff_qos_info,