aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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