Similar diff as I sent out for bgpd. Adjust the community code to handle
the generic transitive extended communities used by flowspec.
--
:wq Claudio
? obj
Index: bgpctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/bgpctl.c,v
retrieving revision 1.292
diff -u -p -r1.292 bgpctl.c
--- bgpctl.c 21 Apr 2023 09:12:41 -0000 1.292
+++ bgpctl.c 21 Apr 2023 09:23:01 -0000
@@ -1051,6 +1051,7 @@ fmt_ext_community(uint8_t *data)
switch (type) {
case EXT_COMMUNITY_TRANS_TWO_AS:
+ case EXT_COMMUNITY_GEN_TWO_AS:
memcpy(&as2, data + 2, sizeof(as2));
memcpy(&u32, data + 4, sizeof(u32));
snprintf(buf, sizeof(buf), "%s %s:%u",
@@ -1058,6 +1059,7 @@ fmt_ext_community(uint8_t *data)
log_as(ntohs(as2)), ntohl(u32));
return buf;
case EXT_COMMUNITY_TRANS_IPV4:
+ case EXT_COMMUNITY_GEN_IPV4:
memcpy(&ip, data + 2, sizeof(ip));
memcpy(&u16, data + 6, sizeof(u16));
snprintf(buf, sizeof(buf), "%s %s:%hu",
@@ -1065,6 +1067,7 @@ fmt_ext_community(uint8_t *data)
inet_ntoa(ip), ntohs(u16));
return buf;
case EXT_COMMUNITY_TRANS_FOUR_AS:
+ case EXT_COMMUNITY_GEN_FOUR_AS:
memcpy(&as4, data + 2, sizeof(as4));
memcpy(&u16, data + 6, sizeof(u16));
snprintf(buf, sizeof(buf), "%s %s:%hu",
@@ -1081,20 +1084,27 @@ fmt_ext_community(uint8_t *data)
case EXT_COMMUNITY_NON_TRANS_OPAQUE:
memcpy(&ext, data, sizeof(ext));
ext = be64toh(ext) & 0xffffffffffffLL;
- switch (ext) {
- case EXT_COMMUNITY_OVS_VALID:
- snprintf(buf, sizeof(buf), "%s valid",
- log_ext_subtype(type, subtype));
- return buf;
- case EXT_COMMUNITY_OVS_NOTFOUND:
- snprintf(buf, sizeof(buf), "%s not-found",
- log_ext_subtype(type, subtype));
- return buf;
- case EXT_COMMUNITY_OVS_INVALID:
- snprintf(buf, sizeof(buf), "%s invalid",
- log_ext_subtype(type, subtype));
- return buf;
- default:
+ if (subtype == EXT_COMMUNITY_SUBTYPE_OVS) {
+ switch (ext) {
+ case EXT_COMMUNITY_OVS_VALID:
+ snprintf(buf, sizeof(buf), "%s valid",
+ log_ext_subtype(type, subtype));
+ return buf;
+ case EXT_COMMUNITY_OVS_NOTFOUND:
+ snprintf(buf, sizeof(buf), "%s not-found",
+ log_ext_subtype(type, subtype));
+ return buf;
+ case EXT_COMMUNITY_OVS_INVALID:
+ snprintf(buf, sizeof(buf), "%s invalid",
+ log_ext_subtype(type, subtype));
+ return buf;
+ default:
+ snprintf(buf, sizeof(buf), "%s 0x%llx",
+ log_ext_subtype(type, subtype),
+ (unsigned long long)ext);
+ return buf;
+ }
+ } else {
snprintf(buf, sizeof(buf), "%s 0x%llx",
log_ext_subtype(type, subtype),
(unsigned long long)ext);
Index: output.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/output.c,v
retrieving revision 1.39
diff -u -p -r1.39 output.c
--- output.c 20 Apr 2023 14:01:50 -0000 1.39
+++ output.c 21 Apr 2023 09:23:01 -0000
@@ -674,11 +674,10 @@ show_communities(u_char *data, size_t le
break;
case COMMUNITY_TYPE_EXT:
ext = (uint64_t)c.data3 << 48;
- switch (c.data3 >> 8) {
+ switch ((c.data3 >> 8) & EXT_COMMUNITY_VALUE) {
case EXT_COMMUNITY_TRANS_TWO_AS:
case EXT_COMMUNITY_TRANS_OPAQUE:
case EXT_COMMUNITY_TRANS_EVPN:
- case EXT_COMMUNITY_NON_TRANS_OPAQUE:
ext |= ((uint64_t)c.data1 & 0xffff) << 32;
ext |= (uint64_t)c.data2;
break;
Index: output_json.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/output_json.c,v
retrieving revision 1.31
diff -u -p -r1.31 output_json.c
--- output_json.c 28 Mar 2023 12:07:09 -0000 1.31
+++ output_json.c 21 Apr 2023 09:23:01 -0000
@@ -495,11 +495,10 @@ json_communities(u_char *data, size_t le
break;
case COMMUNITY_TYPE_EXT:
ext = (uint64_t)c.data3 << 48;
- switch (c.data3 >> 8) {
+ switch ((c.data3 >> 8) & EXT_COMMUNITY_VALUE) {
case EXT_COMMUNITY_TRANS_TWO_AS:
case EXT_COMMUNITY_TRANS_OPAQUE:
case EXT_COMMUNITY_TRANS_EVPN:
- case EXT_COMMUNITY_NON_TRANS_OPAQUE:
ext |= ((uint64_t)c.data1 & 0xffff) << 32;
ext |= (uint64_t)c.data2;
break;
Index: parser.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpctl/parser.c,v
retrieving revision 1.131
diff -u -p -r1.131 parser.c
--- parser.c 21 Apr 2023 09:12:41 -0000 1.131
+++ parser.c 21 Apr 2023 09:23:01 -0000
@@ -741,7 +741,7 @@ match_token(int argc, char *argv[], cons
rd |= ((uint64_t)ext.data1 & 0xffff)
<< 32;
rd |= (uint64_t)ext.data2;
- break;
+ break;
case EXT_COMMUNITY_TRANS_IPV4:
rd = (1ULL << 48);
rd |= (uint64_t)ext.data1 << 16;
@@ -1298,7 +1298,7 @@ parseextvalue(int type, char *s, uint32_
type = EXT_COMMUNITY_TRANS_IPV4;
}
- switch (type) {
+ switch (type & EXT_COMMUNITY_VALUE) {
case EXT_COMMUNITY_TRANS_TWO_AS:
uval = strtonum(s, 0, USHRT_MAX, &errstr);
if (errstr)
@@ -1355,6 +1355,9 @@ parseextcommunity(struct community *c, c
case EXT_COMMUNITY_TRANS_TWO_AS:
case EXT_COMMUNITY_TRANS_FOUR_AS:
case EXT_COMMUNITY_TRANS_IPV4:
+ case EXT_COMMUNITY_GEN_TWO_AS:
+ case EXT_COMMUNITY_GEN_FOUR_AS:
+ case EXT_COMMUNITY_GEN_IPV4:
case -1:
if (strcmp(s, "*") == 0) {
dflag1 = COMMUNITY_ANY;
@@ -1367,10 +1370,13 @@ parseextcommunity(struct community *c, c
switch (type) {
case EXT_COMMUNITY_TRANS_TWO_AS:
+ case EXT_COMMUNITY_GEN_TWO_AS:
getcommunity(p, 1, &uval2, &dflag2);
break;
case EXT_COMMUNITY_TRANS_IPV4:
case EXT_COMMUNITY_TRANS_FOUR_AS:
+ case EXT_COMMUNITY_GEN_IPV4:
+ case EXT_COMMUNITY_GEN_FOUR_AS:
getcommunity(p, 0, &uval2, &dflag2);
break;
default: