diff options
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-ieee802154.c | 382 | ||||
-rw-r--r-- | epan/dissectors/packet-ieee802154.h | 71 |
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 |