From 31320e7271493004b17df833fed8d5076d821175 Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Thu, 2 May 2013 13:08:31 +0000 Subject: [PATCH] Dissect SSID List element. From Jouni Malinen, bug 8613 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8613) svn path=/trunk/; revision=49137 --- epan/dissectors/packet-ieee80211.c | 40 +++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index f4f05e4476..a99e3a32dd 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -4195,6 +4195,8 @@ static gint ett_anqp_vendor_capab = -1; static gint ett_hs20_cc_proto_port_tuple = -1; +static gint ett_ssid_list = -1; + static const fragment_items frag_items = { &ett_fragment, &ett_fragments, @@ -8978,6 +8980,37 @@ dissect_mmie(proto_tree *tree, tvbuff_t *tvb, int offset, guint32 tag_len) ENC_NA); } +static void +dissect_ssid_list(proto_tree *tree, tvbuff_t *tvb, int offset, guint32 tag_len) +{ + int end = offset + tag_len; + proto_item *ssid; + proto_tree *entry; + gboolean first = TRUE; + + while (offset + 1 <= end) { + guint8 len = tvb_get_guint8(tvb, offset + 1); + guint8 *str; + + if (offset + 2 + len > end) + break; + + str = tvb_get_ephemeral_string(tvb, offset + 2, len); + proto_item_append_text(tree, "%c %s", (first ? ':' : ','), str); + first = FALSE; + ssid = proto_tree_add_text(tree, tvb, offset, 2 + len, "SSID: %s", str); + entry = proto_item_add_subtree(ssid, ett_ssid_list); + proto_tree_add_item(entry, hf_ieee80211_tag_number, tvb, offset, 1, + ENC_BIG_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; + } +} + static void dissect_link_identifier(proto_tree *tree, tvbuff_t *tvb, int offset, guint32 tag_len) @@ -12114,6 +12147,10 @@ add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset dissect_mmie(tree, tvb, offset + 2, tag_len); break; + case TAG_SSID_LIST: + dissect_ssid_list(tree, tvb, offset + 2, tag_len); + break; + case TAG_TIME_ZONE: dissect_time_zone(tree, tvb, offset + 2, tag_len); break; @@ -20603,7 +20640,8 @@ proto_register_ieee80211 (void) &ett_nai_realm_eap, &ett_tag_ric_data_desc_ie, &ett_anqp_vendor_capab, - &ett_hs20_cc_proto_port_tuple + &ett_hs20_cc_proto_port_tuple, + &ett_ssid_list }; module_t *wlan_module;