From: Tero Kivinen Date: Tue, 28 Mar 2017 15:44:46 +0000 (+0300) Subject: Added 802.15.9 and IETF IE parser. X-Git-Tag: tcpdump-4.99-bp~886^2^2~5 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/5a8eef488300874fdf2bd52eff4e84814f430bdf Added 802.15.9 and IETF IE parser. --- diff --git a/print-802_15_4.c b/print-802_15_4.c index 181c683f..abb8b2e9 100644 --- a/print-802_15_4.c +++ b/print-802_15_4.c @@ -188,7 +188,7 @@ static const char *p_ie_names[] = { "Vendor Specific Nested IE", /* 0x02 */ "Multiplexed IE (802.15.9)", /* 0x03 */ "Omnibus Payload Group IE", /* 0x04 */ - "Reserved 0x05", /* 0x05 */ + "IETF IE", /* 0x05 */ "Reserved 0x06", /* 0x06 */ "Reserved 0x07", /* 0x07 */ "Reserved 0x08", /* 0x08 */ @@ -1277,6 +1277,107 @@ ieee802_15_4_print_payload_ie_list(netdissect_options *ndo, } } break; + case 0x3: /* Multiplexed IE (802.15.9) */ + if (ie_len < 1) { + ND_PRINT((ndo, "[ERROR: Transaction control byte missing]")); + } else { + int transfer_type, tid, fragment_number, data_start; + transfer_type = EXTRACT_LE_8BITS(p) & 0x7; + tid = EXTRACT_LE_8BITS(p) >> 3; + switch (transfer_type) { + case 0x00: /* Full upper layer frame. */ + case 0x01: /* Full upper layer frame with small Multiplex ID. */ + data_start = 1; + ND_PRINT((ndo, "Type = Full upper layer fragment%s, ", + (transfer_type == 0x01 ? + " with small Multiplex ID" : ""))); + if (transfer_type == 0x00) { + if (ie_len < 3) { + ND_PRINT((ndo, "[ERROR: Multiplex ID missing]")); + } else { + data_start = 3; + ND_PRINT((ndo, "tid = 0x%02x, Multiplex ID = 0x%04x, ", + tid, EXTRACT_LE_16BITS(p + 1))); + } + } else { + ND_PRINT((ndo, "Multiplex ID = 0x%04x, ", tid)); + } + ND_PRINT((ndo, "Upper layer data = ")); + for(i = data_start; i < ie_len; i++) { + ND_PRINT((ndo, "%02x ", EXTRACT_LE_8BITS(p + i))); + } + break; + case 0x02: /* First, or middle, Fragments */ + case 0x04: /* Last fragment */ + if (ie_len < 2) { + ND_PRINT((ndo, "[ERROR: fragment number missing]")); + } else { + fragment_number = EXTRACT_LE_8BITS(p + 1); + ND_PRINT((ndo, "Type = %s, tid = 0x%02x, fragment = 0x%02x, ", + (transfer_type == 0x02 ? + (fragment_number == 0 ? + "First fragment" : "Middle fragment") : + "Last fragment"), tid, + fragment_number)); + data_start = 2; + if (fragment_number == 0) { + if (ie_len < 6) { + ND_PRINT((ndo, "[ERROR: Total upper layer size or multiplex ID missing]")); + } else { + int total_size, multiplex_id; + total_size = EXTRACT_LE_16BITS(p + 2); + multiplex_id = EXTRACT_LE_16BITS(p + 4); + ND_PRINT((ndo, "Total upper layer size = 0x%04x, Multiplex ID = 0x%04x, ", + total_size, multiplex_id)); + } + data_start = 6; + } + ND_PRINT((ndo, "Upper layer data = ")); + for(i = data_start; i < ie_len; i++) { + ND_PRINT((ndo, "%02x ", EXTRACT_LE_8BITS(p + i))); + } + } + break; + case 0x06: /* Abort code */ + if (ie_len == 1) { + ND_PRINT((ndo, "Type = Abort, tid = 0x%02x, no max size given", + tid)); + } else if (ie_len == 3) { + ND_PRINT((ndo, "Type = Abort, tid = 0x%02x, max size = 0x%04x", + tid, EXTRACT_LE_16BITS(p + 1))); + } else { + ND_PRINT((ndo, "Type = Abort, tid = 0x%02x, invalid length = %d (not 1 or 3)", + tid, ie_len)); + ND_PRINT((ndo, "Abort data = ")); + for(i = 1; i < ie_len; i++) { + ND_PRINT((ndo, "%02x ", EXTRACT_LE_8BITS(p + i))); + } + } + break; + case 0x03: /* Reserved */ + case 0x05: /* Reserved */ + case 0x07: /* Reserved */ + ND_PRINT((ndo, "Type = %d (Reserved), tid = 0x%02x, ", + transfer_type, tid)); + ND_PRINT((ndo, "Upper layer data = ")); + for(i = 1; i < ie_len; i++) { + ND_PRINT((ndo, "%02x ", EXTRACT_LE_8BITS(p + i))); + } + break; + } + } + break; + case 0x5: /* IETF IE */ + if (ie_len < 1) { + ND_PRINT((ndo, "[ERROR: Subtype ID missing]")); + } else { + ND_PRINT((ndo, "Subtype ID = 0x%02x, Subtype content = ", + EXTRACT_LE_8BITS(p))); + for(i = 1; i < ie_len; i++) { + ND_PRINT((ndo, "%02x ", EXTRACT_LE_8BITS(p + i))); + } + } + break; default: ND_PRINT((ndo, "IE Data = ")); for(i = 0; i < ie_len; i++) {