X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/7de355927bb4dac90db045d52a69bf95c841b807..refs/heads/mcr-macro-update-1:/print-dtp.c diff --git a/print-dtp.c b/print-dtp.c index 14ac6916..4c3d6c78 100644 --- a/print-dtp.c +++ b/print-dtp.c @@ -12,24 +12,21 @@ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * - * Dynamic Trunk Protocol (DTP) - * * Original code by Carles Kishimoto */ +/* \summary: Dynamic Trunking Protocol (DTP) printer */ + #ifdef HAVE_CONFIG_H -#include "config.h" +#include #endif -#include +#include "netdissect-stdinc.h" -#include -#include - -#include "interface.h" +#include "netdissect.h" #include "addrtoname.h" -#include "extract.h" -#include "nlpid.h" +#include "extract.h" + #define DTP_HEADER_LEN 1 #define DTP_DOMAIN_TLV 0x0001 @@ -46,27 +43,27 @@ static const struct tok dtp_tlv_values[] = { }; void -dtp_print (const u_char *pptr, u_int length) +dtp_print(netdissect_options *ndo, const u_char *pptr, u_int length) { int type, len; const u_char *tptr; + ndo->ndo_protocol = "dtp"; if (length < DTP_HEADER_LEN) goto trunc; - tptr = pptr; + tptr = pptr; - if (!TTEST2(*tptr, DTP_HEADER_LEN)) - goto trunc; + ND_TCHECK_LEN(tptr, DTP_HEADER_LEN); - printf("DTPv%u, length %u", - (*tptr), + ND_PRINT("DTPv%u, length %u", + GET_U_1(tptr), length); /* * In non-verbose mode, just print version. */ - if (vflag < 1) { + if (ndo->ndo_vflag < 1) { return; } @@ -74,50 +71,51 @@ dtp_print (const u_char *pptr, u_int length) while (tptr < (pptr+length)) { - if (!TTEST2(*tptr, 4)) - goto trunc; - - type = EXTRACT_16BITS(tptr); - len = EXTRACT_16BITS(tptr+2); - - /* infinite loop check */ - if (type == 0 || len == 0) { + ND_TCHECK_4(tptr); + type = GET_BE_U_2(tptr); + len = GET_BE_U_2(tptr + 2); + /* XXX: should not be but sometimes it is, see the test captures */ + if (type == 0) return; - } - - printf("\n\t%s (0x%04x) TLV, length %u", + ND_PRINT("\n\t%s (0x%04x) TLV, length %u", tok2str(dtp_tlv_values, "Unknown", type), type, len); + /* infinite loop check */ + if (len < 4) + goto invalid; + ND_TCHECK_LEN(tptr, len); + switch (type) { case DTP_DOMAIN_TLV: - printf(", %s", tptr+4); + ND_PRINT(", "); + nd_printzp(ndo, tptr+4, len-4, pptr+length); break; - case DTP_STATUS_TLV: + case DTP_STATUS_TLV: case DTP_DTP_TYPE_TLV: - printf(", 0x%x", *(tptr+4)); + if (len < 5) + goto invalid; + ND_PRINT(", 0x%x", GET_U_1(tptr + 4)); break; case DTP_NEIGHBOR_TLV: - printf(", %s", etheraddr_string(tptr+4)); + if (len < 10) + goto invalid; + ND_PRINT(", %s", GET_ETHERADDR_STRING(tptr+4)); break; default: break; - } + } tptr += len; } return; + invalid: + nd_print_invalid(ndo); + return; trunc: - printf("[|dtp]"); + nd_print_trunc(ndo); } - -/* - * Local Variables: - * c-style: whitesmith - * c-basic-offset: 4 - * End: - */