While working on Large Communities, I realized that I would really like to easily see and know when I am receiving "unknown" attributes.
Patch for tcpdump is easy, if it doesn't have a decoder, just print the type and length. You can use -X to see the raw hex. Path for bgpctl is a bit more involved. This shows us the type, flags, len and if len is not zero, the local-endian hex dump. OK? Example tcpdump: BGP (UPDATE: (Path attributes: (ORIGIN[T] IGP) (AS_PATH[T] 65000) (NEXT_HOP[T] 192.168.50.62) (#30[OTP] unknown type 30 len:24)) (NLRI: 1.2.3.4/32)) (DF) (ttl 64, id 14847, len 127) Example bgpctl: BGP routing table entry for 72.10.114.0/24 29140 2603 11164 22742 Nexthop 172.16.255.1 (via 172.16.255.1) from 172.16.255.1 (217.31.95.174) Origin IGP, metric 0, localpref 100, weight 0, external, valid, best Last update: 2d15h36m ago Communities: 2603:302 2603:501 2603:11164 2603:64110 2603:64113 11164:1160 11164:7500 11164:51240 11164:52100 11164:52200 Ext. communities: rt 2603:434300002, rt 22742:777 Unknown Attribute #20 flags [OTP] len 14: 00 01 00 00 58 d6 00 00 02 8e cf d2 8d b5 Index: usr.sbin/tcpdump/print-bgp.c =================================================================== RCS file: /cvs/openbsd/src/usr.sbin/tcpdump/print-bgp.c,v retrieving revision 1.19 diff -u -p -u -p -r1.19 print-bgp.c --- usr.sbin/tcpdump/print-bgp.c 13 Oct 2016 08:48:15 -0000 1.19 +++ usr.sbin/tcpdump/print-bgp.c 14 Oct 2016 08:39:04 -0000 @@ -713,6 +713,7 @@ bgp_attr_print(const struct bgp_attr *at } break; default: + printf(" unknown type %u len %u", attr->bgpa_type, len); break; } return 1; Index: usr.sbin/bgpctl/bgpctl.c =================================================================== RCS file: /cvs/openbsd/src/usr.sbin/bgpctl/bgpctl.c,v retrieving revision 1.188 diff -u -p -u -p -r1.188 bgpctl.c --- usr.sbin/bgpctl/bgpctl.c 3 Jun 2016 17:36:37 -0000 1.188 +++ usr.sbin/bgpctl/bgpctl.c 14 Oct 2016 08:30:44 -0000 @@ -1393,6 +1393,7 @@ show_attr(void *b, u_int16_t len) u_int32_t as; u_int16_t alen, ioff; u_int8_t flags, type; + int i; if (len < 3) errx(1, "show_attr: too short bgp attr"); @@ -1448,8 +1449,29 @@ show_attr(void *b, u_int16_t len) show_ext_community(data, alen); printf("\n"); break; + case ATTR_ATOMIC_AGGREGATE: + /* ignore */ + break; default: /* ignore unknown attributes */ + printf(" Unknown Attribute #%u", type); + if (flags) { + printf(" flags ["); + if (flags & ATTR_OPTIONAL) + printf("O"); + if (flags & ATTR_TRANSITIVE) + printf("T"); + if (flags & ATTR_PARTIAL) + printf("P"); + printf("]"); + } + printf(" len %u", alen); + if (alen) { + printf(":"); + for (i=0; i < alen; i++) + printf(" %02x", *(data+i) & 0xFF); + } + printf("\n"); break; } } -- Hardware, n.: The parts of a computer system that can be kicked.