- if ( i+len > caplen ) {
- printf("[!cdp]");
- return;
- }
-
- switch( type )
- {
- case 0x01:
- printf( " DevID '%.*s'", len-4, p+i+4 );
- break;
- case 0x02:
- printf( " Addr" );
- cdp_print_addr( p+i+4, len-4 );
- break;
- case 0x03:
- printf( " PortID '%.*s'", len-4, p+i+4 );
- break;
- case 0x04:
- printf( " CAP 0x%02x", (unsigned) p[i+7] );
- break;
- case 0x05:
- if ( vflag )
- printf( " Version:\n%.*s", len-4, p+i+4 );
- else
- printf( " Version: (suppressed)" );
- break;
- case 0x06:
- printf( " Platform: '%.*s'", len-4, p+i+4 );
- break;
- default:
- printf( " unknown field type %02x, len %d",
- type, len );
- }
- i+=len;
+ ND_TCHECK2(*tptr, len);
+
+ if (ndo->ndo_vflag || type == 1) { /* in non-verbose mode just print Device-ID */
+
+ if (ndo->ndo_vflag)
+ ND_PRINT((ndo, "\n\t%s (0x%02x), value length: %u byte%s: ",
+ tok2str(cdp_tlv_values,"unknown field type", type),
+ type,
+ len,
+ PLURAL_SUFFIX(len))); /* plural */
+
+ switch (type) {
+
+ case 0x01: /* Device-ID */
+ if (!ndo->ndo_vflag)
+ ND_PRINT((ndo, ", Device-ID "));
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x02: /* Address */
+ if (cdp_print_addr(ndo, tptr, len) < 0)
+ goto trunc;
+ break;
+ case 0x03: /* Port-ID */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x04: /* Capabilities */
+ if (len < 4)
+ goto trunc;
+ ND_PRINT((ndo, "(0x%08x): %s",
+ EXTRACT_32BITS(tptr),
+ bittok2str(cdp_capability_values, "none", EXTRACT_32BITS(tptr))));
+ break;
+ case 0x05: /* Version */
+ ND_PRINT((ndo, "\n\t "));
+ for (i=0;i<len;i++) {
+ j = *(tptr+i);
+ ND_PRINT((ndo, "%c", j));
+ if (j == 0x0a) /* lets rework the version string to get a nice indentation */
+ ND_PRINT((ndo, "\t "));
+ }
+ break;
+ case 0x06: /* Platform */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x07: /* Prefixes */
+ if (cdp_print_prefixes(ndo, tptr, len) < 0)
+ goto trunc;
+ break;
+ case 0x08: /* Protocol Hello Option - not documented */
+ break;
+ case 0x09: /* VTP Mgmt Domain - CDPv2 */
+ ND_PRINT((ndo, "'"));
+ (void)fn_printn(ndo, tptr, len, NULL);
+ ND_PRINT((ndo, "'"));
+ break;
+ case 0x0a: /* Native VLAN ID - CDPv2 */
+ if (len < 2)
+ goto trunc;
+ ND_PRINT((ndo, "%d", EXTRACT_16BITS(tptr)));
+ break;
+ case 0x0b: /* Duplex - CDPv2 */
+ if (len < 1)
+ goto trunc;
+ ND_PRINT((ndo, "%s", *(tptr) ? "full": "half"));
+ break;