X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/ad92d9ae65dd4ff385abd7a68d467d61a6dd417f..c39d40a767a1ae36171e5bcbf6f157ff3e80fb6c:/print-zep.c diff --git a/print-zep.c b/print-zep.c index deb99c60..e10ecb35 100644 --- a/print-zep.c +++ b/print-zep.c @@ -19,13 +19,15 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +/* \summary: ZigBee Encapsulation Protocol (ZEP) printer */ #ifdef HAVE_CONFIG_H #include #endif -#include +#include "netdissect-stdinc.h" +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "extract.h" @@ -42,7 +44,6 @@ *********************************************************************** * * ZEP v1 Header will have the following format: - * * |Preamble|Version|Channel ID|Device ID|CRC/LQI Mode|LQI Val|Reserved|Length| * |2 bytes |1 byte | 1 byte | 2 bytes | 1 byte |1 byte |7 bytes |1 byte| * @@ -56,7 +57,6 @@ *------------------------------------------------------------ */ -#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */ #define JAN_1970 2208988800U /* Print timestamp */ @@ -67,8 +67,8 @@ static void zep_print_ts(netdissect_options *ndo, const u_char *p) uint32_t f; float ff; - i = EXTRACT_BE_U_4(p); - uf = EXTRACT_BE_U_4(p + 4); + i = GET_BE_U_4(p); + uf = GET_BE_U_4(p + 4); ff = (float) uf; if (ff < 0.0) /* some compilers are buggy */ ff += FMAXINT; @@ -104,57 +104,59 @@ zep_print(netdissect_options *ndo, uint8_t version, inner_len; uint32_t seq_no; - ndo->ndo_protocol ="ZEP"; - - ND_PRINT("ZEP"); + ndo->ndo_protocol = "zep"; - ND_TCHECK_LEN(bp, 8); + nd_print_protocol_caps(ndo); - if (EXTRACT_U_1(bp) != 'E' || EXTRACT_U_1(bp + 1) != 'X') - goto trunc; + /* Preamble Code (must be "EX") */ + if (GET_U_1(bp) != 'E' || GET_U_1(bp + 1) != 'X') { + ND_PRINT(" [Preamble Code: "); + fn_print_char(ndo, GET_U_1(bp)); + fn_print_char(ndo, GET_U_1(bp + 1)); + ND_PRINT("]"); + nd_print_invalid(ndo); + return; + } - version = EXTRACT_U_1(bp + 2); - ND_PRINT("v%d ", version); + version = GET_U_1(bp + 2); + ND_PRINT("v%u ", version); if (version == 1) { /* ZEP v1 packet. */ - ND_TCHECK_LEN(bp, 16); - ND_PRINT("Channel ID %d, Device ID 0x%04x, ", - EXTRACT_U_1(bp + 3), EXTRACT_BE_U_2(bp + 4)); - if (EXTRACT_U_1(bp + 6)) + ND_PRINT("Channel ID %u, Device ID 0x%04x, ", + GET_U_1(bp + 3), GET_BE_U_2(bp + 4)); + if (GET_U_1(bp + 6)) ND_PRINT("CRC, "); else - ND_PRINT("LQI %d, ", EXTRACT_U_1(bp + 7)); - inner_len = EXTRACT_U_1(bp + 15); - ND_PRINT("inner len = %d", inner_len); + ND_PRINT("LQI %u, ", GET_U_1(bp + 7)); + inner_len = GET_U_1(bp + 15); + ND_PRINT("inner len = %u", inner_len); bp += 16; len -= 16; } else { /* ZEP v2 packet. */ - if (EXTRACT_U_1(bp + 3) == 2) { + if (GET_U_1(bp + 3) == 2) { /* ZEP v2 ack. */ - seq_no = EXTRACT_BE_U_4(bp + 4); - ND_PRINT("ACK, seq# = %d", seq_no); + seq_no = GET_BE_U_4(bp + 4); + ND_PRINT("ACK, seq# = %u", seq_no); inner_len = 0; bp += 8; len -= 8; } else { /* ZEP v2 data, or some other. */ - ND_TCHECK_LEN(bp, 32); - - ND_PRINT("Type %d, Channel ID %d, Device ID 0x%04x, ", - EXTRACT_U_1(bp + 3), EXTRACT_U_1(bp + 4), - EXTRACT_BE_U_2(bp + 5)); - if (EXTRACT_U_1(bp + 7)) + ND_PRINT("Type %u, Channel ID %u, Device ID 0x%04x, ", + GET_U_1(bp + 3), GET_U_1(bp + 4), + GET_BE_U_2(bp + 5)); + if (GET_U_1(bp + 7)) ND_PRINT("CRC, "); else - ND_PRINT("LQI %d, ", EXTRACT_U_1(bp + 8)); + ND_PRINT("LQI %u, ", GET_U_1(bp + 8)); zep_print_ts(ndo, bp + 9); - seq_no = EXTRACT_BE_U_4(bp + 17); - inner_len = EXTRACT_U_1(bp + 31); - ND_PRINT(", seq# = %d, inner len = %d", + seq_no = GET_BE_U_4(bp + 17); + inner_len = GET_U_1(bp + 31); + ND_PRINT(", seq# = %u, inner len = %u", seq_no, inner_len); bp += 32; len -= 32; @@ -165,6 +167,7 @@ zep_print(netdissect_options *ndo, /* Call 802.15.4 dissector. */ ND_PRINT("\n\t"); if (ieee802_15_4_print(ndo, bp, inner_len)) { + ND_TCHECK_LEN(bp, len); bp += len; len = 0; } @@ -172,8 +175,4 @@ zep_print(netdissect_options *ndo, if (!ndo->ndo_suppress_default_print) ND_DEFAULTPRINT(bp, len); - - return; - trunc: - ND_PRINT(" [|ZEP]"); }