+ if (i + len > caplen)
+ goto trunc;
+
+ switch (type) {
+ case 0x00:
+ printf(" Goodbye");
+ break;
+ case 0x01:
+ printf(" DevID '%.*s'", len - 4, p + i + 4);
+ break;
+ case 0x02:
+ printf(" Addr");
+ if (cdp_print_addr(p + i + 4, len - 4) < 0)
+ goto trunc;
+ 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 > 1)
+ 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;
+ case 0x07:
+ if (cdp_print_prefixes(p + i + 4, len - 4) < 0)
+ goto trunc;
+ break;
+ case 0x08: /* guess - not documented */
+ printf(" Protocol-Hello option" );
+ break;
+ case 0x09: /* guess - not documented */
+ printf(" VTP Management Domain: '%.*s'", len - 4,
+ p + i + 4);
+ break;
+ case 0x0a: /* guess - not documented */
+ printf(" Native VLAN ID: %d",
+ (p[i + 4] << 8) + p[i + 4 + 1] );
+ break;
+ case 0x0b: /* guess - not documented */
+ printf(" Duplex: %s", p[i + 4] ? "full": "half");
+ break;
+/* http://www.cisco.com/univercd/cc/td/doc/product/voice/ata/atarn/186rn21m.htm
+ * plus more details from other sources
+ */
+ case 0x0e: /* incomplete doc. */
+ printf(" ATA-186 VoIP VLAN request, app %d, vlan %d",
+ p[i + 4], EXTRACT_16BITS(&p[i+4+1]));
+ break;
+ case 0x0f: /* incomplete doc. */
+ printf(" ATA-186 VoIP VLAN assignment" );
+ break;
+ case 0x10: /* incomplete doc. */
+ printf(" power consumption: %1.2fW",
+ cdp_get_number(p+i+4, len-4)/1000.0 );
+ break;
+ case 0x11: /* guess - not documented */
+ printf(" MTU %u bytes", EXTRACT_32BITS(&p[i+4]));
+ break;
+ case 0x12: /* guess - not documented */
+ printf(" AVVID trust bitmap 0x%02x", p[i+4] );
+ break;
+ case 0x13: /* guess - not documented */
+ printf(" AVVID untrusted ports CoS: 0x%02x", p[i+4]);
+ break;
+ case 0x14: /* guess - not documented */
+ printf(" sysName='%.*s'", len - 4, p + i + 4 );
+ break;
+ case 0x15: /* guess - not documented */
+ printf(" sysObjectID" ); /* TODO */
+ break;
+ case 0x16: /* guess - not documented */
+ printf(" management address(es)" );
+ break;
+ case 0x17: /* guess - not documented */
+ printf(" phys. location 0x%02x/%.*s",
+ p[i+4], len - 5, p + i + 5 );
+ break;
+ default:
+ printf(" unknown field type %02x, len %d", type, len);
+ break;
+ }
+
+ /* avoid infinite loop */
+ if (len == 0)
+ break;
+ i += len;