aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ieee80211.c
diff options
context:
space:
mode:
authorJörg Mayer <jmayer@loplof.de>2013-07-22 08:01:10 +0000
committerJörg Mayer <jmayer@loplof.de>2013-07-22 08:01:10 +0000
commitfb5a3b90d1bef00cf213cf6f9addf6f27df7920e (patch)
treee42c38d61a734dae4dd23e35b42a0b13e2eaee81 /epan/dissectors/packet-ieee80211.c
parent39518faa36445ac6fbe9ae822a9aad7696e391e0 (diff)
Beginnings of Nintendo StreetProtocol support
svn path=/trunk/; revision=50783
Diffstat (limited to 'epan/dissectors/packet-ieee80211.c')
-rw-r--r--epan/dissectors/packet-ieee80211.c128
1 files changed, 127 insertions, 1 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c
index ea2d0eaec1..f0b9aa9919 100644
--- a/epan/dissectors/packet-ieee80211.c
+++ b/epan/dissectors/packet-ieee80211.c
@@ -3854,6 +3854,13 @@ static int hf_ieee80211_aironet_ie_qos_reserved = -1;
static int hf_ieee80211_aironet_ie_qos_paramset = -1;
static int hf_ieee80211_aironet_ie_qos_val = -1;
+static int hf_ieee80211_vs_nintendo_type = -1;
+static int hf_ieee80211_vs_nintendo_length = -1;
+static int hf_ieee80211_vs_nintendo_servicelist = -1;
+static int hf_ieee80211_vs_nintendo_service = -1;
+static int hf_ieee80211_vs_nintendo_consoleid = -1;
+static int hf_ieee80211_vs_nintendo_unknown = -1;
+
static int hf_ieee80211_vs_aruba_subtype = -1;
static int hf_ieee80211_vs_aruba_apname = -1;
static int hf_ieee80211_vs_aruba_data = -1;
@@ -4212,6 +4219,8 @@ static gint ett_hs20_cc_proto_port_tuple = -1;
static gint ett_ssid_list = -1;
+static gint ett_nintendo = -1;
+
static const fragment_items frag_items = {
&ett_fragment,
&ett_fragments,
@@ -8358,6 +8367,88 @@ dissect_vendor_ie_aruba(proto_item *item, proto_tree *ietree,
}
}
+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;
+ }
+ }
+}
+
/* 802.11e 7.3.2.33 QoS Capability element */
static int
dissect_qos_capability(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
@@ -12205,6 +12296,9 @@ add_tagged_field(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset
case OUI_ARUBA:
dissect_vendor_ie_aruba(ti, tree, tvb, offset, tag_vs_len);
break;
+ case OUI_NINTENDO:
+ dissect_vendor_ie_nintendo(ti, tree, tvb, offset, tag_vs_len);
+ break;
default:
proto_tree_add_item(tree, hf_ieee80211_tag_vendor_data, tvb, offset, tag_vs_len, ENC_NA);
break;
@@ -19705,6 +19799,37 @@ proto_register_ieee80211 (void)
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
+ /* Vendor Specific : Nintendo */
+ {&hf_ieee80211_vs_nintendo_type,
+ {"Type", "wlan_mgt.vs.nintendo.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_vs_nintendo_type_vals), 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vs_nintendo_length,
+ {"Length", "wlan_mgt.vs.nintendo.length",
+ FT_UINT8, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vs_nintendo_servicelist,
+ {"Servicelist", "wlan_mgt.vs.nintendo.servicelist",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vs_nintendo_service,
+ {"Service", "wlan_mgt.vs.nintendo.service",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vs_nintendo_consoleid,
+ {"Console ID", "wlan_mgt.vs.nintendo.consoleid",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ {&hf_ieee80211_vs_nintendo_unknown,
+ {"Unknown", "wlan_mgt.vs.nintendo.unknown",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
/* Vendor Specific : Aruba Networks */
{&hf_ieee80211_vs_aruba_subtype,
{"Subtype", "wlan_mgt.vs.aruba.subtype",
@@ -20760,7 +20885,8 @@ proto_register_ieee80211 (void)
&ett_tag_ric_data_desc_ie,
&ett_anqp_vendor_capab,
&ett_hs20_cc_proto_port_tuple,
- &ett_ssid_list
+ &ett_ssid_list,
+ &ett_nintendo
};
module_t *wlan_module;