aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ieee80211.c
diff options
context:
space:
mode:
authorMathis Marion <mathis.marion@silabs.com>2023-03-04 00:19:49 +0100
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2023-03-06 15:36:58 +0000
commit2ae0c1eadcf1288a63a7ca89ecf0b93f8c4d1b86 (patch)
treeea851586a17f89c961003307ece1227302703367 /epan/dissectors/packet-ieee80211.c
parent54abe7f3288421237678542d5309aec37a3bb742 (diff)
Add Wi-SUN IEEE 802.11 KDE dissector
This adds the following KDEs defined by the Wi-SUN FAN specification: - Pairwise Transient Key KDE (PTKID) - Group Transient Key Liveness KDE (GTKL) - Node Role KDE (NR) - LFN Group Transient Key KDE (LGTK) - LFN Group Transient Key Liveness KDE (LGTKL)
Diffstat (limited to 'epan/dissectors/packet-ieee80211.c')
-rw-r--r--epan/dissectors/packet-ieee80211.c170
1 files changed, 169 insertions, 1 deletions
diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c
index b209f33e34..cc6148b24a 100644
--- a/epan/dissectors/packet-ieee80211.c
+++ b/epan/dissectors/packet-ieee80211.c
@@ -6204,6 +6204,22 @@ static int hf_ieee80211_vs_arista_subtype = -1;
static int hf_ieee80211_vs_arista_apname = -1;
static int hf_ieee80211_vs_arista_data = -1;
+static int hf_ieee80211_vs_wisun_type = -1;
+static int hf_ieee80211_vs_wisun_ptkid = -1;
+static int hf_ieee80211_vs_wisun_gtkl = -1;
+static int hf_ieee80211_vs_wisun_gtkl_gtk0 = -1;
+static int hf_ieee80211_vs_wisun_gtkl_gtk1 = -1;
+static int hf_ieee80211_vs_wisun_gtkl_gtk2 = -1;
+static int hf_ieee80211_vs_wisun_gtkl_gtk3 = -1;
+static int hf_ieee80211_vs_wisun_nr = -1;
+static int hf_ieee80211_vs_wisun_lgtkl = -1;
+static int hf_ieee80211_vs_wisun_lgtkl_lgtk0 = -1;
+static int hf_ieee80211_vs_wisun_lgtkl_lgtk1 = -1;
+static int hf_ieee80211_vs_wisun_lgtkl_lgtk2 = -1;
+static int hf_ieee80211_vs_wisun_lgtk_key_id = -1;
+static int hf_ieee80211_vs_wisun_lgtk_lgtk = -1;
+static int hf_ieee80211_vs_wisun_data = -1;
+
static int hf_ieee80211_rsn_ie_ptk_keyid = -1;
static int hf_ieee80211_rsn_ie_gtk_kde_data_type = -1;
@@ -7754,6 +7770,9 @@ static gint ett_routerboard = -1;
static gint ett_meru = -1;
+static gint ett_wisun_gtkl = -1;
+static gint ett_wisun_lgtkl = -1;
+
static gint ett_qos_map_set_exception = -1;
static gint ett_qos_map_set_range = -1;
@@ -18751,6 +18770,101 @@ dissect_vendor_ie_arista(proto_item *item, proto_tree *ietree,
}
}
+#define WISUN_PTKID 1
+#define WISUN_GTKL 2
+#define WISUN_NR 3
+#define WISUN_LGTKL 4
+#define WISUN_LGTK 5
+
+static const value_string ieee80211_vs_wisun_type_vals[] = {
+ { WISUN_PTKID, "PTKID" },
+ { WISUN_GTKL, "GTKL" },
+ { WISUN_NR, "NR" },
+ { WISUN_LGTKL, "LGTKL" },
+ { WISUN_LGTK, "LGTK" },
+ { 0, NULL }
+};
+
+#define WISUN_GTKL_GTK0 0x01
+#define WISUN_GTKL_GTK1 0x02
+#define WISUN_GTKL_GTK2 0x04
+#define WISUN_GTKL_GTK3 0x08
+
+#define WISUN_NR_BR 0
+#define WISUN_NR_ROUTER 1
+#define WISUN_NR_LFN 2
+
+static const value_string ieee80211_vs_wisun_nr_vals[] = {
+ { WISUN_NR_BR, "Border Router" },
+ { WISUN_NR_ROUTER, "Router" },
+ { WISUN_NR_LFN, "LFN" },
+ { 0, NULL }
+};
+
+#define WISUN_LGTKL_LGTK0 0x01
+#define WISUN_LGTKL_LGTK1 0x02
+#define WISUN_LGTKL_LGTK2 0x04
+
+static void
+dissect_vendor_ie_wisun(proto_item *item, proto_tree *ietree,
+ tvbuff_t *tvb, int offset, guint32 tag_len)
+{
+ guint32 type;
+
+ proto_tree_add_item_ret_uint(ietree, hf_ieee80211_vs_wisun_type, tvb, offset, 1, ENC_LITTLE_ENDIAN, &type);
+ proto_item_append_text(item, ": %s", val_to_str_const(type, ieee80211_vs_wisun_type_vals, "Unknown"));
+ offset += 1;
+ tag_len -= 1;
+
+ switch(type) {
+ case WISUN_PTKID:
+ proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_ptkid, tvb, offset, 16, ENC_NA);
+ break;
+ case WISUN_GTKL: {
+ static int * const wisun_gtkl[] = {
+ &hf_ieee80211_vs_wisun_gtkl_gtk0,
+ &hf_ieee80211_vs_wisun_gtkl_gtk1,
+ &hf_ieee80211_vs_wisun_gtkl_gtk2,
+ &hf_ieee80211_vs_wisun_gtkl_gtk3,
+ NULL,
+ };
+
+ proto_tree_add_bitmask(ietree, tvb, offset, hf_ieee80211_vs_wisun_gtkl,
+ ett_wisun_gtkl, wisun_gtkl, ENC_LITTLE_ENDIAN);
+ break;
+ }
+ case WISUN_NR:
+ proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_nr, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ break;
+ case WISUN_LGTKL: {
+ static int * const wisun_lgtkl[] = {
+ &hf_ieee80211_vs_wisun_lgtkl_lgtk0,
+ &hf_ieee80211_vs_wisun_lgtkl_lgtk1,
+ &hf_ieee80211_vs_wisun_lgtkl_lgtk2,
+ NULL,
+ };
+
+ proto_tree_add_bitmask(ietree, tvb, offset, hf_ieee80211_vs_wisun_lgtkl,
+ ett_wisun_lgtkl, wisun_lgtkl, ENC_LITTLE_ENDIAN);
+ break;
+ }
+ case WISUN_LGTK:
+ proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_lgtk_key_id, tvb,
+ offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ tag_len -= 2;
+ proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_lgtk_lgtk, tvb,
+ offset, tag_len, ENC_NA);
+ break;
+ default:
+ proto_tree_add_item(ietree, hf_ieee80211_vs_wisun_data, tvb, offset, tag_len, ENC_NA);
+ if (tag_len > 0)
+ proto_item_append_text(item, " (Data: %s)", tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, tag_len));
+ break;
+ }
+}
+
/* 802.11-2012 8.4.2.37 QoS Capability element */
static int
dissect_qos_capability(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, int offset, int ftype)
@@ -28163,7 +28277,9 @@ ieee80211_tag_vendor_specific_ie(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
case OUI_MOJO_ARISTA:
dissect_vendor_ie_arista(field_data->item_tag, tree, tvb, offset, tag_vs_len);
break;
-
+ case OUI_WISUN:
+ dissect_vendor_ie_wisun(field_data->item_tag, 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;
@@ -48327,6 +48443,55 @@ proto_register_ieee80211(void)
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
+ /* Vendor Specific : Wi-SUN */
+ {&hf_ieee80211_vs_wisun_type,
+ {"Data Type", "wlan.vs.wisun.type",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_vs_wisun_type_vals), 0,
+ NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_ptkid,
+ {"PTK ID", "wlan.vs.wisun.ptkid",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_gtkl,
+ {"GTK Liveness", "wlan.vs.wisun.gtkl",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_gtkl_gtk0,
+ {"GTK[0]", "wlan.vs.wisun.gtkl.gtk0",
+ FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK0, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_gtkl_gtk1,
+ {"GTK[1]", "wlan.vs.wisun.gtkl.gtk1",
+ FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK1, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_gtkl_gtk2,
+ {"GTK[2]", "wlan.vs.wisun.gtkl.gtk2",
+ FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK2, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_gtkl_gtk3,
+ {"GTK[3]", "wlan.vs.wisun.gtkl.gtk3",
+ FT_UINT8, BASE_HEX, NULL, WISUN_GTKL_GTK3, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_nr,
+ {"Node Role", "wlan.vs.wisun.nr",
+ FT_UINT8, BASE_DEC, VALS(ieee80211_vs_wisun_nr_vals), 0,
+ NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_lgtkl,
+ {"LGTK Liveness", "wlan.vs.wisun.lgtkl",
+ FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_lgtkl_lgtk0,
+ {"LGTK[0]", "wlan.vs.wisun.lgtkl.lgtk0",
+ FT_UINT8, BASE_HEX, NULL, WISUN_LGTKL_LGTK0, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_lgtkl_lgtk1,
+ {"LGTK[1]", "wlan.vs.wisun.lgtkl.lgtk1",
+ FT_UINT8, BASE_HEX, NULL, WISUN_LGTKL_LGTK1, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_lgtkl_lgtk2,
+ {"LGTK[2]", "wlan.vs.wisun.lgtkl.lgtk2",
+ FT_UINT8, BASE_HEX, NULL, WISUN_LGTKL_LGTK2, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_lgtk_key_id,
+ {"Key ID", "wlan.vs.wisun.lgtk.key_id",
+ FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_lgtk_lgtk,
+ {"LGTK", "wlan.vs.wisun.lgtk.lgtk",
+ FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ {&hf_ieee80211_vs_wisun_data,
+ {"Data", "wlan.vs.wisun.data",
+ FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL }},
+
{&hf_ieee80211_tsinfo,
{"Traffic Stream (TS) Info", "wlan.ts_info",
FT_UINT24, BASE_HEX, NULL, 0,
@@ -52348,6 +52513,9 @@ proto_register_ieee80211(void)
&ett_meru,
+ &ett_wisun_gtkl,
+ &ett_wisun_lgtkl,
+
&ett_qos_map_set_exception,
&ett_qos_map_set_range,