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.