aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorChris Brandson <chris.brandson@gmail.com>2016-02-18 18:23:13 -0800
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2016-02-29 22:33:40 +0000
commitbe3af7c9643d502e4d2a9f2aa20ff2f3dc1fa75a (patch)
treeb4c9c4654ca89cc12cda58f5f4840e82c9dbb9d2 /epan
parentd679d1137d884e651b214d8b6e3fb8af2972ad46 (diff)
802.15.4 Minimal support for MLME Payload IE with Enhanced Beacon Filter IE
Minimal support has been added for the MLME Payload IE and the Enhanced Beacon Filter Sub-IE. Dissection of Payload IEs and Sub-IEs is supported making it easy to add dissection for specific applications once this is known. Change-Id: I3a4f237e17413ec3e7bbfd32ded0625fc97da11b Reviewed-on: https://code.wireshark.org/review/13999 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-ieee802154.c382
-rw-r--r--epan/dissectors/packet-ieee802154.h71
2 files changed, 423 insertions, 30 deletions
diff --git a/epan/dissectors/packet-ieee802154.c b/epan/dissectors/packet-ieee802154.c
index 78faba7895..2c4fd7c975 100644
--- a/epan/dissectors/packet-ieee802154.c
+++ b/epan/dissectors/packet-ieee802154.c
@@ -171,6 +171,7 @@ static void dissect_ieee802154_common (tvbuff_t *, packet_info *, proto_tr
/* Information Elements */
static void dissect_ieee802154_header_ie (tvbuff_t *, packet_info *, proto_tree *, guint *, ieee802154_packet *);
+static void dissect_ieee802154_payload_mlme_sub_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint *offset);
static void dissect_ieee802154_payload_ie (tvbuff_t *, packet_info *, proto_tree *, guint *);
/* Sub-dissector helpers. */
@@ -235,6 +236,23 @@ static int hf_ieee802154_payload_ie_id = -1;
static int hf_ieee802154_payload_ie_length = -1;
static int hf_ieee802154_payload_ie_data = -1;
static int hf_ieee802154_payload_ie_vendor_oui = -1;
+static int hf_ieee802154_mlme_ie_data = -1;
+static int hf_ieee802154_psie_short = -1;
+static int hf_ieee802154_psie_type_short = -1;
+static int hf_ieee802154_psie_id_short = -1;
+static int hf_ieee802154_psie_length_short = -1;
+static int hf_ieee802154_psie_long = -1;
+static int hf_ieee802154_psie_type_long = -1;
+static int hf_ieee802154_psie_id_long = -1;
+static int hf_ieee802154_psie_length_long = -1;
+static int hf_ieee802154_psie_eb_filter = -1;
+static int hf_ieee802154_psie_eb_filter_pjoin = -1;
+static int hf_ieee802154_psie_eb_filter_lqi = -1;
+static int hf_ieee802154_psie_eb_filter_lqi_min = -1;
+static int hf_ieee802154_psie_eb_filter_percent = -1;
+static int hf_ieee802154_psie_eb_filter_percent_prob = -1;
+static int hf_ieee802154_psie_eb_filter_attr_id = -1;
+static int hf_ieee802154_psie_eb_filter_attr_id_bitmap = -1;
static int proto_zboss = -1;
static int zboss_direction = -1;
@@ -320,6 +338,12 @@ static gint ett_ieee802154_header = -1;
static gint ett_ieee802154_header_ie = -1;
static gint ett_ieee802154_payload = -1;
static gint ett_ieee802154_payload_ie = -1;
+static gint ett_ieee802154_psie_short = -1;
+static gint ett_ieee802154_psie_short_bitmap= -1;
+static gint ett_ieee802154_psie_long = -1;
+static gint ett_ieee802154_psie_long_bitmap = -1;
+static gint ett_ieee802154_psie_enh_beacon_flt = -1;
+static gint ett_ieee802154_psie_enh_beacon_flt_bitmap = -1;
static gint ett_ieee802154_zboss = -1;
static expert_field ei_ieee802154_invalid_addressing = EI_INIT;
@@ -331,6 +355,7 @@ static expert_field ei_ieee802154_src = EI_INIT;
static expert_field ei_ieee802154_frame_ver = EI_INIT;
static expert_field ei_ieee802154_frame_type = EI_INIT;
static expert_field ei_ieee802154_seqno_suppression = EI_INIT;
+static expert_field ei_ieee802154_ie_format_invalid = EI_INIT;
static int ieee802_15_4_short_address_type = -1;
/*
@@ -442,24 +467,83 @@ static const value_string ieee802154_ie_types[] = {
{ 0, NULL }
};
+static const value_string ieee802154_psie_types[] = {
+ { 0, "Short" },
+ { IEEE802154_PSIE_TYPE_MASK, "Long" },
+ { 0, NULL }
+};
+
static const value_string ieee802154_header_ie_names[] = {
- { IEEE802154_HEADER_IE_EID_TERM1, "Header Termination 1" },
- { IEEE802154_HEADER_IE_EID_TERM2, "Header Termination 2" },
+ { IEEE802154_HEADER_VENDOR_SPECIFIC, "Vendor Specific IE" },
+ { IEEE802154_HEADER_IE_CSL, "CSL IE" },
+ { IEEE802154_HEADER_IE_RIT, "RIT IE" },
+ { IEEE802154_HEADER_IE_DSME_PAN, "DSME PAN descriptor IE" },
+ { IEEE802154_HEADER_IE_RENDEZVOUS, "Rendezvous Time IE" },
+ { IEEE802154_HEADER_IE_TIME_CORR, "Time Correction IE" },
+ { IEEE802154_HEADER_IE_EXT_DSME_PAN, "Extended DSME PAN descriptor IE" },
+ { IEEE802154_HEADER_IE_FSCD, "Fragment Sequence Context Description (FSCD) IE" },
+ { IEEE802154_HEADER_IE_SMPL_SUPER_FRM, "Simplified Superframe Specification IE" },
+ { IEEE802154_HEADER_IE_SMPL_GTS, "Simplified GTS Specification IE" },
+ { IEEE802154_HEADER_IE_LECIM, "LECIM Capabilities IE" },
+ { IEEE802154_HEADER_IE_TRLE, "TRLE Descriptor" },
+ { IEEE802154_HEADER_IE_RCC_CAP, "RCC Capabilities IE" },
+ { IEEE802154_HEADER_IE_RCCN, "RCCN Descriptor IE" },
+ { IEEE802154_HEADER_IE_GLOBAL_TIME, "Global Time IE" },
+ { IEEE802154_HEADER_IE_DA_IE, "DA IE" },
+ { IEEE802154_HEADER_IE_EID_TERM1, "Header Termination 1" },
+ { IEEE802154_HEADER_IE_EID_TERM2, "Header Termination 2" },
{ 0, NULL }
};
static const value_string ieee802154_payload_ie_names[] = {
- { IEEE802154_PAYLOAD_IE_ESDU, "ESDU IE" },
- { IEEE802154_PAYLOAD_IE_MLME, "MLME IE" },
- { IEEE802154_PAYLOAD_IE_VENDOR, "Vendor Specific IE" },
- { IEEE802154_PAYLOAD_IE_GID_TERM, "Payload Termination IE" },
+ { IEEE802154_PAYLOAD_IE_ESDU, "ESDU IE" },
+ { IEEE802154_PAYLOAD_IE_MLME, "MLME IE" },
+ { IEEE802154_PAYLOAD_IE_VENDOR, "Vendor Specific IE" },
+ { IEEE802154_PAYLOAD_IE_GID_TERM, "Payload Termination IE" },
+ { 0, NULL }
+};
+
+static const value_string ieee802154_vendor_oui_names[] = {
+ { IEEE802154_VENDOR_OUI_ZIGBEE, "ZigBee" },
+ { 0, NULL }
+};
+
+static const value_string ieee802154_psie_names[] = {
+ { IEEE802154_MLME_SUBIE_TSCH_SYNCH, "TSCH Synchronization IE" },
+ { IEEE802154_MLME_SUBIE_TSCH_SLOTFR_LINK, "TSCH Slotframe and Link IE" },
+ { IEEE802154_MLME_SUBIE_TSCH_TIMESLOT, "TSCH Timeslot IE" },
+ { IEEE802154_MLME_SUBIE_HOPPING_TIMING, "Hopping Timing IE" },
+ { IEEE802154_MLME_SUBIE_ENHANCED_BEACON_FILTER, "Enhanced Beacon Filter IE" },
+ { IEEE802154_MLME_SUBIE_MAC_METRICS, "MAC Metrics IE" },
+ { IEEE802154_MLME_SUBIE_ALL_MAC_METRICS, "All MAC Metrics IE" },
+ { IEEE802154_MLME_SUBIE_COEXISTENCE_SPEC, "Coexistence Specification IE" },
+ { IEEE802154_MLME_SUBIE_SUN_DEVICE_CAPABILITIES, "SUN Device Capabilities IE" },
+ { IEEE802154_MLME_SUBIE_SUN_FSK_GEN_PHY, "SUN FSK Generic PHY IE" },
+ { IEEE802154_MLME_SUBIE_MODE_SWITCH_PARAMETER, "Mode Switch Parameter IE" },
+ { IEEE802154_MLME_SUBIE_PHY_PARAMETER_CHANGE, "PHY Parameter Change IE" },
+ { IEEE802154_MLME_SUBIE_O_QPSK_PHY_MODE, "O-QPSY PHY Mode IE" },
+ { IEEE802154_MLME_SUBIE_PCA_ALLOCATION, "PCA Allocation IE" },
+ { IEEE802154_MLME_SUBIE_DSSS_OPER_MODE, "LECIM DSSS Operating Mode IE"},
+ { IEEE802154_MLME_SUBIE_FSK_OPER_MODE, "LECIM FSK Operating Mode IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_PHY_OPE_MODE, "TVWS PHY Operating Mode Description IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_DEVICE_CAPAB, "TVWS Device Capabilities IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_DEVICE_CATEG, "TVWS Device Category IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_DEVICE_IDENTIF, "TVWS Device Identification IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_DEVICE_LOCATION, "TVWS Device Location IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_CH_INFOR_QUERY, "TVWS Channel Information Query IE" },
+ { IEEE802154_MLME_SUBIE_TVWS_CH_INFOR_SOURCE, "TVWS Channel Information Source IE" },
+ { IEEE802154_MLME_SUBIE_CTM, "CTM IE" },
+ { IEEE802154_MLME_SUBIE_TIMESTAMP, "Timestamp IE" },
+ { IEEE802154_MLME_SUBIE_TIMESTAMP_DIFF, "Timestamp Difference IE"},
+ { IEEE802154_MLME_SUBIE_TMCP_SPECIFICATION, "TMCTP Specification IE" },
+ { IEEE802154_MLME_SUBIE_RCC_PHY_OPER_MODE, "RCC PHY Operating Mode IE" },
{ 0, NULL }
};
static const value_string zboss_direction_names[] = {
- { 0, "IN" },
- { 1, "OUT" },
- { 0, NULL }
+ { 0, "IN" },
+ { 1, "OUT" },
+ { 0, NULL }
};
/* Preferences for 2003 security */
@@ -1659,7 +1743,155 @@ dissect_ieee802154_header_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *
} /* dissect_ieee802154_header_ie */
/**
- *Subdissector command for Header IEs (Information Elements)
+ *Subdissector command for MLME Payload Sub IEs (Information Elements)
+ *
+ *@param tvb pointer to buffer containing raw packet.
+ *@param pinfo pointer to packet information fields (unused).
+ *@param tree pointer to command subtree.
+ *@param offset offset into the tvbuff to begin dissection.
+*/
+static void
+dissect_ieee802154_payload_mlme_sub_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint *offset)
+{
+
+ proto_tree *subtree;
+ guint16 psie_ie;
+ guint16 psie_id;
+ guint psie_remaining = 0;
+
+ static const int * fields_short[] = {
+ &hf_ieee802154_psie_type_short,
+ &hf_ieee802154_psie_id_short,
+ &hf_ieee802154_psie_length_short,
+ NULL
+ };
+
+ static const int * fields_long[] = {
+ &hf_ieee802154_psie_type_long,
+ &hf_ieee802154_psie_id_long,
+ &hf_ieee802154_psie_length_long,
+ NULL
+ };
+
+
+ static const int * fields_eb_filter[] = {
+ &hf_ieee802154_psie_eb_filter_pjoin,
+ &hf_ieee802154_psie_eb_filter_lqi,
+ &hf_ieee802154_psie_eb_filter_percent,
+ &hf_ieee802154_psie_eb_filter_attr_id,
+ /* reserved 5-7 */
+ NULL
+ };
+
+ psie_ie = tvb_get_letohs(tvb, *offset);
+ if (psie_ie & IEEE802154_PSIE_TYPE_MASK) { /* long format */
+ psie_id = (psie_ie & IEEE802154_PSIE_ID_MASK_LONG) >> 11;
+ psie_remaining = psie_ie & IEEE802154_PSIE_LENGTH_MASK_LONG;
+ subtree = proto_tree_add_subtree(tree, tvb, *offset, 1, ett_ieee802154_psie_long, NULL, "Nested Sub IE (long)");
+ proto_tree_add_bitmask(subtree, tvb, *offset, hf_ieee802154_psie_long,
+ ett_ieee802154_psie_long_bitmap, fields_long, ENC_LITTLE_ENDIAN);
+ }
+ else { /* short format */
+ psie_id = (psie_ie & IEEE802154_PSIE_ID_MASK_SHORT) >> 8;
+ psie_remaining = psie_ie & IEEE802154_PSIE_LENGTH_MASK_SHORT;
+ subtree = proto_tree_add_subtree(tree, tvb, *offset, 1, ett_ieee802154_psie_short, NULL, "Nested Sub IE (short)");
+ proto_tree_add_bitmask(subtree, tvb, *offset, hf_ieee802154_psie_short,
+ ett_ieee802154_psie_short_bitmap, fields_short, ENC_LITTLE_ENDIAN);
+ }
+ proto_item_append_text(subtree, ", Sub IE: %s, Length: %d", val_to_str_const(psie_id, ieee802154_psie_names, "Unknown IE"), psie_remaining);
+ *offset += 2;
+
+ switch (psie_id) {
+ case IEEE802154_MLME_SUBIE_ENHANCED_BEACON_FILTER:
+ {
+ guint8 filter;
+ guint8 attr_len;
+ guint32 attr_bitmap;
+
+ if (psie_remaining == 0) {
+ expert_add_info(pinfo, tree, &ei_ieee802154_ie_format_invalid);
+ return;
+ }
+
+ filter = tvb_get_guint8(tvb, *offset);
+ proto_tree_add_bitmask(subtree, tvb, *offset, hf_ieee802154_psie_eb_filter,
+ ett_ieee802154_psie_enh_beacon_flt_bitmap, fields_eb_filter,
+ ENC_NA);
+ *offset += 1;
+
+ if (filter & IEEE802154_MLME_PSIE_EB_FLT_LQI) {
+ proto_tree_add_item(subtree, hf_ieee802154_psie_eb_filter_lqi_min, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+ }
+
+ if (filter & IEEE802154_MLME_PSIE_EB_FLT_PERCENT) {
+ proto_tree_add_item(subtree, hf_ieee802154_psie_eb_filter_percent_prob, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+ }
+
+ attr_len = (filter & IEEE802154_MLME_PSIE_EB_FLT_ATTR_LEN) >> 3;
+ if (attr_len) {
+ switch(attr_len) {
+ case 1:
+ attr_bitmap = (guint32)tvb_get_guint8(tvb, *offset);
+ break;
+ case 2:
+ attr_bitmap = (guint32)tvb_get_ntohs(tvb, *offset);
+ break;
+ case 3:
+ attr_bitmap = tvb_get_ntoh24(tvb, *offset);
+ break;
+ /* default: not reached, attr len is only 2 bits: 0x18 */
+ }
+
+ /* just display in hex until we know how to decode */
+ proto_tree_add_uint(subtree, hf_ieee802154_psie_eb_filter_attr_id_bitmap, tvb, *offset,
+ attr_len, attr_bitmap);
+ *offset += attr_len;
+ }
+ }
+ break;
+
+ case IEEE802154_MLME_SUBIE_TSCH_SYNCH:
+ case IEEE802154_MLME_SUBIE_TSCH_SLOTFR_LINK:
+ case IEEE802154_MLME_SUBIE_TSCH_TIMESLOT:
+ case IEEE802154_MLME_SUBIE_HOPPING_TIMING:
+ case IEEE802154_MLME_SUBIE_MAC_METRICS:
+ case IEEE802154_MLME_SUBIE_ALL_MAC_METRICS:
+ case IEEE802154_MLME_SUBIE_COEXISTENCE_SPEC:
+ case IEEE802154_MLME_SUBIE_SUN_DEVICE_CAPABILITIES:
+ case IEEE802154_MLME_SUBIE_SUN_FSK_GEN_PHY:
+ case IEEE802154_MLME_SUBIE_MODE_SWITCH_PARAMETER:
+ case IEEE802154_MLME_SUBIE_PHY_PARAMETER_CHANGE:
+ case IEEE802154_MLME_SUBIE_O_QPSK_PHY_MODE:
+ case IEEE802154_MLME_SUBIE_PCA_ALLOCATION:
+ case IEEE802154_MLME_SUBIE_DSSS_OPER_MODE:
+ case IEEE802154_MLME_SUBIE_FSK_OPER_MODE:
+ case IEEE802154_MLME_SUBIE_TVWS_PHY_OPE_MODE:
+ case IEEE802154_MLME_SUBIE_TVWS_DEVICE_CAPAB:
+ case IEEE802154_MLME_SUBIE_TVWS_DEVICE_CATEG:
+ case IEEE802154_MLME_SUBIE_TVWS_DEVICE_IDENTIF:
+ case IEEE802154_MLME_SUBIE_TVWS_DEVICE_LOCATION:
+ case IEEE802154_MLME_SUBIE_TVWS_CH_INFOR_QUERY:
+ case IEEE802154_MLME_SUBIE_TVWS_CH_INFOR_SOURCE:
+ case IEEE802154_MLME_SUBIE_CTM:
+ case IEEE802154_MLME_SUBIE_TIMESTAMP:
+ case IEEE802154_MLME_SUBIE_TIMESTAMP_DIFF:
+ case IEEE802154_MLME_SUBIE_TMCP_SPECIFICATION:
+ case IEEE802154_MLME_SUBIE_RCC_PHY_OPER_MODE:
+ default:
+ /* display bytes */
+ if (psie_remaining) {
+ proto_tree_add_item(subtree, hf_ieee802154_mlme_ie_data, tvb, *offset, psie_remaining, ENC_NA);
+ *offset += psie_remaining;
+ }
+ break;
+ }
+
+}
+
+/**
+ *Subdissector command for Payload IEs (Information Elements)
*
*@param tvb pointer to buffer containing raw packet.
*@param pinfo pointer to packet information fields (unused).
@@ -1671,8 +1903,9 @@ dissect_ieee802154_payload_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
{
proto_tree *subtree;
guint16 payload_ie;
- guint16 id;
- guint16 length;
+ guint16 pie_id;
+ guint pie_remaining;
+ guint pie_offset_end;
guint32 vendor_oui;
GByteArray *gba = g_byte_array_new();
@@ -1684,33 +1917,47 @@ dissect_ieee802154_payload_ie(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
};
do {
- payload_ie = tvb_get_letohs(tvb, *offset);
- id = (payload_ie & IEEE802154_PAYLOAD_IE_ID_MASK) >> 11;
- length = payload_ie & IEEE802154_PAYLOAD_IE_LENGTH_MASK;
+ payload_ie = tvb_get_letohs(tvb, *offset);
+ pie_id = (payload_ie & IEEE802154_PAYLOAD_IE_ID_MASK) >> 11;
+ pie_remaining = payload_ie & IEEE802154_PAYLOAD_IE_LENGTH_MASK;
/* Create a subtree for this command frame. */
subtree = proto_tree_add_subtree(tree, tvb, *offset, 1, ett_ieee802154_payload, NULL, "Payload IE");
- proto_item_append_text(subtree, ", Group ID: %s, Length: %d", val_to_str_const(id, ieee802154_payload_ie_names, "Unknown IE"), length);
+ proto_item_append_text(subtree, ", %s, Length: %d", val_to_str_const(pie_id, ieee802154_payload_ie_names, "Unknown IE"), pie_remaining);
proto_tree_add_bitmask(subtree, tvb, *offset, hf_ieee802154_payload_ie,
ett_ieee802154_payload_ie, fields, ENC_LITTLE_ENDIAN);
*offset += 2;
- if (id == IEEE802154_PAYLOAD_IE_VENDOR) {
- vendor_oui = tvb_get_letoh24(tvb, *offset);
- proto_item_append_text(subtree, ", Vendor OUI: %06X", vendor_oui);
- proto_tree_add_uint(subtree, hf_ieee802154_payload_ie_vendor_oui, tvb, *offset, 3, vendor_oui);
- *offset += 3;
- length -= 3;
- }
+ switch (pie_id) {
+ case IEEE802154_PAYLOAD_IE_MLME:
+ pie_offset_end = *offset + pie_remaining;
+ while (*offset < pie_offset_end) {
+ dissect_ieee802154_payload_mlme_sub_ie(tvb, pinfo, subtree, offset);
+ }
+ break;
- /* until the Header IEs are finalized, just use the data dissector */
- if (length > 0) {
- proto_tree_add_bytes_item(subtree, hf_ieee802154_payload_ie_data, tvb, *offset, length, ENC_NA, gba, NULL, NULL);
- *offset += length;
+ case IEEE802154_PAYLOAD_IE_VENDOR:
+ vendor_oui = tvb_get_letoh24(tvb, *offset);
+ proto_item_append_text(subtree, ", Vendor OUI: %06X (%s)", vendor_oui,
+ val_to_str_const(vendor_oui, ieee802154_vendor_oui_names, "unknown"));
+ proto_tree_add_uint(subtree, hf_ieee802154_payload_ie_vendor_oui, tvb, *offset, 3, vendor_oui);
+ *offset += 3;
+ pie_remaining -= 3;
+ if (pie_remaining > 0) { /* just use the data dissector */
+ proto_tree_add_bytes_item(subtree, hf_ieee802154_payload_ie_data, tvb, *offset, pie_remaining, ENC_NA, gba, NULL, NULL);
+ *offset += pie_remaining;
+ }
+ break;
+
+ default: /* just use the data dissector */
+ if (pie_remaining > 0) {
+ proto_tree_add_bytes_item(subtree, hf_ieee802154_payload_ie_data, tvb, *offset, pie_remaining, ENC_NA, gba, NULL, NULL);
+ *offset += pie_remaining;
+ }
}
- } while ((tvb_reported_length(tvb) > 1) && (id != IEEE802154_PAYLOAD_IE_GID_TERM));
+ } while ((tvb_reported_length(tvb) > 1) && (pie_id != IEEE802154_PAYLOAD_IE_GID_TERM));
}
static const true_false_string tfs_cinfo_device_type = { "FFD", "RFD" };
@@ -2838,7 +3085,7 @@ void proto_register_ieee802154(void)
/* Payload IEs */
{ &hf_ieee802154_payload_ie,
- { "Payload IE", "wpan.payload_ie", FT_UINT16, BASE_HEX, NULL,
+ { "Payload IE Header", "wpan.payload_ie", FT_UINT16, BASE_HEX, NULL,
0x0, NULL, HFILL }},
{ &hf_ieee802154_payload_ie_type,
@@ -2853,13 +3100,80 @@ void proto_register_ieee802154(void)
{ "Length", "wpan.payload_ie.length", FT_UINT16, BASE_DEC, NULL,
IEEE802154_PAYLOAD_IE_LENGTH_MASK, NULL, HFILL }},
+ { &hf_ieee802154_psie_short,
+ { "Payload Sub IE (short)", "wpan.payload_sub_ie.short", FT_UINT16, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_type_short,
+ { "Type", "wpan.payload_sub_ie.type_short", FT_UINT16, BASE_DEC, VALS(ieee802154_psie_types),
+ IEEE802154_PSIE_TYPE_MASK, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_id_short,
+ { "Sub Id (Short)", "wpan.payload_sub_ie.id_short", FT_UINT16, BASE_HEX, VALS(ieee802154_psie_names),
+ IEEE802154_PSIE_ID_MASK_SHORT, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_length_short,
+ { "Length", "wpan.payload_sub_ie.length_short", FT_UINT16, BASE_DEC, NULL,
+ IEEE802154_PSIE_LENGTH_MASK_SHORT, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_long,
+ { "Payload Sub IE (long)", "wpan.payload_sub_ie.long", FT_UINT16, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_type_long,
+ { "Type", "wpan.payload_sub_ie.type_long", FT_UINT16, BASE_DEC, VALS(ieee802154_psie_types),
+ IEEE802154_PSIE_TYPE_MASK, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_id_long,
+ { "Sub Id (Long)", "wpan.payload_sub_ie.id_long", FT_UINT16, BASE_HEX, NULL,
+ IEEE802154_PSIE_ID_MASK_LONG, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_length_long,
+ { "Length", "wpan.payload_sub_ie.length_long", FT_UINT16, BASE_DEC, NULL,
+ IEEE802154_PSIE_LENGTH_MASK_LONG, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter,
+ { "Enhanced Beacon Filter", "wpan.payload_sub_ie.eb_filter", FT_UINT8, BASE_HEX, NULL,
+ 0, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_pjoin,
+ { "Permit Join Filter", "wpan.payload_sub_ie.eb_filter.pjoin", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
+ IEEE802154_MLME_PSIE_EB_FLT_PJOIN, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_lqi,
+ { "LQI Filter", "wpan.payload_sub_ie.eb_filter.lqi", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
+ IEEE802154_MLME_PSIE_EB_FLT_LQI, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_lqi_min,
+ { "Minimum LQI", "wpan.payload_sub_ie.eb_filter.lqi_minimum", FT_UINT8, BASE_DEC, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_percent,
+ { "Probability to Respond", "wpan.payload_sub_ie.eb_filter.contains_prob", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
+ IEEE802154_MLME_PSIE_EB_FLT_PERCENT, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_percent_prob,
+ { "Response Probability Percentage", "wpan.payload_sub_ie.eb_filter.prob", FT_UINT8, BASE_DEC, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_attr_id,
+ { "Requested Attribute Length", "wpan.payload_sub_ie.eb_filter.attr_id", FT_UINT8, BASE_DEC, NULL,
+ IEEE802154_MLME_PSIE_EB_FLT_ATTR_LEN, NULL, HFILL }},
+
+ { &hf_ieee802154_psie_eb_filter_attr_id_bitmap,
+ { "Attribute ID Bitmap", "wpan.payload_sub_ie.eb_filter.attr_id_bits", FT_UINT24, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
{ &hf_ieee802154_payload_ie_data,
- { "Data", "wpan.payload_ie.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { "Data", "wpan.payload_ie.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
{ &hf_ieee802154_payload_ie_vendor_oui,
{ "Vendor OUI", "wpan.payload_ie.vendor_oui", FT_UINT24, BASE_HEX, NULL,
0x0, NULL, HFILL }},
+ { &hf_ieee802154_mlme_ie_data,
+ { "Data", "wpan.mlme_sub_ie.data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+
/*
* Command Frame Specific Fields
*/
@@ -3067,6 +3381,12 @@ void proto_register_ieee802154(void)
&ett_ieee802154_header_ie,
&ett_ieee802154_payload,
&ett_ieee802154_payload_ie,
+ &ett_ieee802154_psie_short,
+ &ett_ieee802154_psie_short_bitmap,
+ &ett_ieee802154_psie_long,
+ &ett_ieee802154_psie_long_bitmap,
+ &ett_ieee802154_psie_enh_beacon_flt,
+ &ett_ieee802154_psie_enh_beacon_flt_bitmap,
&ett_ieee802154_zboss,
};
@@ -3089,6 +3409,8 @@ void proto_register_ieee802154(void)
"Bad FCS", EXPFILL }},
{ &ei_ieee802154_seqno_suppression, { "wpan.seqno_supression_invalid", PI_MALFORMED, PI_WARN,
"Sequence Number Suppression invalid for 802.15.4-2003 and 2006", EXPFILL }},
+ { &ei_ieee802154_ie_format_invalid, { "wpan.ie_format_invalid", PI_MALFORMED, PI_WARN,
+ "802.15.4-2015 Information Element (IE) format is invalid", EXPFILL }},
};
/* Preferences. */
diff --git a/epan/dissectors/packet-ieee802154.h b/epan/dissectors/packet-ieee802154.h
index e6510c0516..5ab2334b15 100644
--- a/epan/dissectors/packet-ieee802154.h
+++ b/epan/dissectors/packet-ieee802154.h
@@ -159,6 +159,19 @@
#define IEEE802154_PAYLOAD_IE_ID_MASK 0x7800
#define IEEE802154_PAYLOAD_IE_LENGTH_MASK 0x07FF
+/* Payload (Nested) Sub IE Fields */
+#define IEEE802154_PSIE_TYPE_MASK 0x8000
+#define IEEE802154_PSIE_ID_MASK_SHORT 0x7F00
+#define IEEE802154_PSIE_LENGTH_MASK_SHORT 0x00FF
+#define IEEE802154_PSIE_ID_MASK_LONG 0x7800
+#define IEEE802154_PSIE_LENGTH_MASK_LONG 0x07FF
+
+/* Enhanced Beacon Filter IE */
+#define IEEE802154_MLME_PSIE_EB_FLT_PJOIN 0x01
+#define IEEE802154_MLME_PSIE_EB_FLT_LQI 0x02
+#define IEEE802154_MLME_PSIE_EB_FLT_PERCENT 0x04
+#define IEEE802154_MLME_PSIE_EB_FLT_ATTR_LEN 0x18
+
/* Bit-masks for CC24xx style FCS */
#define IEEE802154_CC24xx_CORRELATION 0x7F00
#define IEEE802154_CC24xx_CRC_OK 0x8000
@@ -197,8 +210,29 @@ typedef enum {
} ieee802154_key_id_mode;
/* Header IE Element ID */
+#define IEEE802154_HEADER_VENDOR_SPECIFIC 0x00
+/* Reserved 0x01-0x19 */
+#define IEEE802154_HEADER_IE_CSL 0x1a
+#define IEEE802154_HEADER_IE_RIT 0x1b
+#define IEEE802154_HEADER_IE_DSME_PAN 0x1c
+#define IEEE802154_HEADER_IE_RENDEZVOUS 0x1d
+#define IEEE802154_HEADER_IE_TIME_CORR 0x1e
+/* Reserved 0x1f-0x20 */
+#define IEEE802154_HEADER_IE_EXT_DSME_PAN 0x21
+#define IEEE802154_HEADER_IE_FSCD 0x22
+#define IEEE802154_HEADER_IE_SMPL_SUPER_FRM 0x23
+#define IEEE802154_HEADER_IE_SMPL_GTS 0x24
+#define IEEE802154_HEADER_IE_LECIM 0x25
+#define IEEE802154_HEADER_IE_TRLE 0x26
+#define IEEE802154_HEADER_IE_RCC_CAP 0x27
+#define IEEE802154_HEADER_IE_RCCN 0x28
+#define IEEE802154_HEADER_IE_GLOBAL_TIME 0x29
+/* Assigned to External Organization: 0x2a */
+#define IEEE802154_HEADER_IE_DA_IE 0x2b
+/* Reserved 0x2c-0x7d */
#define IEEE802154_HEADER_IE_EID_TERM1 0x7e
#define IEEE802154_HEADER_IE_EID_TERM2 0x7f
+/* Reserved 0x80-0xff */
/* Payload IE Group ID */
#define IEEE802154_PAYLOAD_IE_ESDU 0x0 /* Encapsulated Service Data Unit */
@@ -207,6 +241,43 @@ typedef enum {
/* Reserved 0x3-0xe */
#define IEEE802154_PAYLOAD_IE_GID_TERM 0xf
+/* Vendor OUIs */
+#define IEEE802154_VENDOR_OUI_ZIGBEE 0xacde48
+
+/* Payload IE (Nested) Sub ID */
+/* 0x00 - 0x0f Reserved for Long Format */
+/* 0x10 - 0x19 Short Format Reserved */
+#define IEEE802154_MLME_SUBIE_TSCH_SYNCH 0x1A
+#define IEEE802154_MLME_SUBIE_TSCH_SLOTFR_LINK 0x1B
+#define IEEE802154_MLME_SUBIE_TSCH_TIMESLOT 0x1C
+#define IEEE802154_MLME_SUBIE_HOPPING_TIMING 0x1D
+#define IEEE802154_MLME_SUBIE_ENHANCED_BEACON_FILTER 0x1E
+#define IEEE802154_MLME_SUBIE_MAC_METRICS 0x1F
+#define IEEE802154_MLME_SUBIE_ALL_MAC_METRICS 0x20
+#define IEEE802154_MLME_SUBIE_COEXISTENCE_SPEC 0x21
+#define IEEE802154_MLME_SUBIE_SUN_DEVICE_CAPABILITIES 0x22
+#define IEEE802154_MLME_SUBIE_SUN_FSK_GEN_PHY 0x23
+#define IEEE802154_MLME_SUBIE_MODE_SWITCH_PARAMETER 0x24
+#define IEEE802154_MLME_SUBIE_PHY_PARAMETER_CHANGE 0x25
+#define IEEE802154_MLME_SUBIE_O_QPSK_PHY_MODE 0x26
+#define IEEE802154_MLME_SUBIE_PCA_ALLOCATION 0x27
+#define IEEE802154_MLME_SUBIE_DSSS_OPER_MODE 0x28
+#define IEEE802154_MLME_SUBIE_FSK_OPER_MODE 0x29
+#define IEEE802154_MLME_SUBIE_TVWS_PHY_OPE_MODE 0x2B
+#define IEEE802154_MLME_SUBIE_TVWS_DEVICE_CAPAB 0x2C
+#define IEEE802154_MLME_SUBIE_TVWS_DEVICE_CATEG 0x2D
+#define IEEE802154_MLME_SUBIE_TVWS_DEVICE_IDENTIF 0x2E
+#define IEEE802154_MLME_SUBIE_TVWS_DEVICE_LOCATION 0x2F
+#define IEEE802154_MLME_SUBIE_TVWS_CH_INFOR_QUERY 0x30
+#define IEEE802154_MLME_SUBIE_TVWS_CH_INFOR_SOURCE 0x31
+#define IEEE802154_MLME_SUBIE_CTM 0x32
+#define IEEE802154_MLME_SUBIE_TIMESTAMP 0x33
+#define IEEE802154_MLME_SUBIE_TIMESTAMP_DIFF 0x34
+#define IEEE802154_MLME_SUBIE_TMCP_SPECIFICATION 0x35
+#define IEEE802154_MLME_SUBIE_RCC_PHY_OPER_MODE 0x36
+/* 0x37-0x7f Reserved */
+
+
/* IEEE 802.15.4 cipher block size. */
#define IEEE802154_CIPHER_SIZE 16