X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/546558eabd81cfc36a81a4df728fdfea0d83b41a..5ef0bcb5edd748de9d9af13c40da0395dfdd94e8:/print-cdp.c diff --git a/print-cdp.c b/print-cdp.c index 1e1d66ab..0ab646e5 100644 --- a/print-cdp.c +++ b/print-cdp.c @@ -21,7 +21,7 @@ * Code by Gert Doering, SpaceNet GmbH, gert@space.net * * Reference documentation: - * http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.htm + * https://web.archive.org/web/20000914194913/http://www.cisco.com/univercd/cc/td/doc/product/lan/trsrb/frames.pdf */ /* \summary: Cisco Discovery Protocol (CDP) printer */ @@ -39,7 +39,6 @@ #include "extract.h" #include "nlpid.h" -static const char tstr[] = "[|cdp]"; #define CDP_HEADER_LEN 4 #define CDP_HEADER_VERSION_OFFSET 0 @@ -88,34 +87,37 @@ static const struct tok cdp_capability_values[] = { static int cdp_print_addr(netdissect_options *, const u_char *, u_int); static int cdp_print_prefixes(netdissect_options *, const u_char *, u_int); -static unsigned int cdp_get_number(const u_char *, u_int); +static unsigned int cdp_get_number(netdissect_options *, const u_char *, u_int); void cdp_print(netdissect_options *ndo, const u_char *pptr, u_int length, u_int caplen) { - u_int type, len, i, j; + u_int type, len, i; const u_char *tptr; ndo->ndo_protocol = "cdp"; if (caplen < CDP_HEADER_LEN) { - ND_PRINT("%s", tstr); + nd_print_trunc(ndo); return; } tptr = pptr; /* temporary pointer */ ND_TCHECK_LEN(tptr, CDP_HEADER_LEN); - ND_PRINT("CDPv%u, ttl: %us", EXTRACT_U_1((tptr + CDP_HEADER_VERSION_OFFSET)), - EXTRACT_U_1(tptr + CDP_HEADER_TTL_OFFSET)); + ND_PRINT("CDPv%u, ttl: %us", + GET_U_1((tptr + CDP_HEADER_VERSION_OFFSET)), + GET_U_1(tptr + CDP_HEADER_TTL_OFFSET)); if (ndo->ndo_vflag) - ND_PRINT(", checksum: 0x%04x (unverified), length %u", EXTRACT_BE_U_2(tptr + CDP_HEADER_CHECKSUM_OFFSET), length); + ND_PRINT(", checksum: 0x%04x (unverified), length %u", + GET_BE_U_2(tptr + CDP_HEADER_CHECKSUM_OFFSET), + length); tptr += CDP_HEADER_LEN; while (tptr < (pptr+length)) { ND_TCHECK_LEN(tptr, CDP_TLV_HEADER_LEN); /* read out Type and Length */ - type = EXTRACT_BE_U_2(tptr + CDP_TLV_TYPE_OFFSET); - len = EXTRACT_BE_U_2(tptr + CDP_TLV_LEN_OFFSET); /* object length includes the 4 bytes header length */ + type = GET_BE_U_2(tptr + CDP_TLV_TYPE_OFFSET); + len = GET_BE_U_2(tptr + CDP_TLV_LEN_OFFSET); /* object length includes the 4 bytes header length */ if (len < CDP_TLV_HEADER_LEN) { if (ndo->ndo_vflag) ND_PRINT("\n\t%s (0x%02x), TLV length: %u byte%s (too short)", @@ -149,7 +151,7 @@ cdp_print(netdissect_options *ndo, if (!ndo->ndo_vflag) ND_PRINT(", Device-ID "); ND_PRINT("'"); - (void)fn_printn(ndo, tptr, len, NULL); + (void)nd_printn(ndo, tptr, len, NULL); ND_PRINT("'"); break; case 0x02: /* Address */ @@ -158,30 +160,32 @@ cdp_print(netdissect_options *ndo, break; case 0x03: /* Port-ID */ ND_PRINT("'"); - (void)fn_printn(ndo, tptr, len, NULL); + (void)nd_printn(ndo, tptr, len, NULL); ND_PRINT("'"); break; case 0x04: /* Capabilities */ if (len < 4) goto trunc; ND_PRINT("(0x%08x): %s", - EXTRACT_BE_U_4(tptr), - bittok2str(cdp_capability_values, "none", EXTRACT_BE_U_4(tptr))); + GET_BE_U_4(tptr), + bittok2str(cdp_capability_values, "none", GET_BE_U_4(tptr))); break; case 0x05: /* Version */ ND_PRINT("\n\t "); for (i=0;i 1) { ND_PRINT("/"); - (void)fn_printn(ndo, tptr + 1, len - 1, NULL); + (void)nd_printn(ndo, tptr + 1, len - 1, NULL); } break; default: @@ -279,7 +285,7 @@ cdp_print(netdissect_options *ndo, return; trunc: - ND_PRINT("%s", tstr); + nd_print_trunc(ndo); } /* @@ -306,23 +312,23 @@ cdp_print_addr(netdissect_options *ndo, ND_TCHECK_4(p); if (p + 4 > endp) goto trunc; - num = EXTRACT_BE_U_4(p); + num = GET_BE_U_4(p); p += 4; while (p < endp && num != 0) { ND_TCHECK_2(p); if (p + 2 > endp) goto trunc; - pt = EXTRACT_U_1(p); /* type of "protocol" field */ - pl = EXTRACT_U_1(p + 1); /* length of "protocol" field */ + pt = GET_U_1(p); /* type of "protocol" field */ + pl = GET_U_1(p + 1); /* length of "protocol" field */ p += 2; ND_TCHECK_2(p + pl); if (p + pl + 2 > endp) goto trunc; - al = EXTRACT_BE_U_2(p + pl); /* address length */ + al = GET_BE_U_2(p + pl); /* address length */ - if (pt == PT_NLPID && pl == 1 && EXTRACT_U_1(p) == NLPID_IP && + if (pt == PT_NLPID && pl == 1 && GET_U_1(p) == NLPID_IP && al == 4) { /* * IPv4: protocol type = NLPID, protocol length = 1 @@ -331,10 +337,9 @@ cdp_print_addr(netdissect_options *ndo, */ p += 3; - ND_TCHECK_4(p); if (p + 4 > endp) goto trunc; - ND_PRINT("IPv4 (%u) %s", num, ipaddr_string(ndo, p)); + ND_PRINT("IPv4 (%u) %s", num, GET_IPADDR_STRING(p)); p += 4; } else if (pt == PT_IEEE_802_2 && pl == 8 && @@ -350,7 +355,7 @@ cdp_print_addr(netdissect_options *ndo, if (p + al > endp) goto trunc; - ND_PRINT("IPv6 (%u) %s", num, ip6addr_string(ndo, p)); + ND_PRINT("IPv6 (%u) %s", num, GET_IP6ADDR_STRING(p)); p += al; } else { @@ -360,10 +365,12 @@ cdp_print_addr(netdissect_options *ndo, ND_TCHECK_LEN(p, pl); if (p + pl > endp) goto trunc; - ND_PRINT("pt=0x%02x, pl=%u, pb=", EXTRACT_U_1((p - 2)), pl); - while (pl-- > 0) { - ND_PRINT(" %02x", EXTRACT_U_1(p)); + ND_PRINT("pt=0x%02x, pl=%u, pb=", GET_U_1((p - 2)), + pl); + while (pl != 0) { + ND_PRINT(" %02x", GET_U_1(p)); p++; + pl--; } ND_TCHECK_2(p); if (p + 2 > endp) @@ -373,9 +380,10 @@ cdp_print_addr(netdissect_options *ndo, ND_TCHECK_LEN(p, al); if (p + al > endp) goto trunc; - while (al-- > 0) { - ND_PRINT(" %02x", EXTRACT_U_1(p)); + while (al != 0) { + ND_PRINT(" %02x", GET_U_1(p)); p++; + al--; } } num--; @@ -401,8 +409,8 @@ cdp_print_prefixes(netdissect_options *ndo, while (l > 0) { ND_PRINT(" %u.%u.%u.%u/%u", - EXTRACT_U_1(p), EXTRACT_U_1(p + 1), EXTRACT_U_1(p + 2), - EXTRACT_U_1(p + 3), EXTRACT_U_1(p + 4)); + GET_U_1(p), GET_U_1(p + 1), GET_U_1(p + 2), + GET_U_1(p + 3), GET_U_1(p + 4)); l -= 5; p += 5; } @@ -416,12 +424,13 @@ trunc: /* read in a -byte number, MSB first * (of course this can handle max sizeof(int)) */ -static unsigned int cdp_get_number(const u_char * p, u_int l) +static unsigned int +cdp_get_number(netdissect_options *ndo, const u_char * p, u_int l) { unsigned int res=0; while( l>0 ) { - res = (res<<8) + EXTRACT_U_1(p); + res = (res<<8) + GET_U_1(p); p++; l--; } return res;