Flowspec added some new ext communities. They use new type (generic
transitive types). Adjust the ext community code to handle these types as
well. I need to cycle back to this but this gets us of the ground.

-- 
:wq Claudio

Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.449
diff -u -p -r1.449 parse.y
--- parse.y     19 Apr 2023 15:27:46 -0000      1.449
+++ parse.y     21 Apr 2023 09:13:22 -0000
@@ -4441,7 +4441,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) {
@@ -4510,6 +4510,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;
@@ -4525,11 +4528,14 @@ parseextcommunity(struct community *c, c
 
                switch (type) {
                case EXT_COMMUNITY_TRANS_TWO_AS:
+               case EXT_COMMUNITY_GEN_TWO_AS:
                        if (getcommunity(p, 1, &uval2, &dflag2) == -1)
                                return (-1);
                        break;
                case EXT_COMMUNITY_TRANS_IPV4:
                case EXT_COMMUNITY_TRANS_FOUR_AS:
+               case EXT_COMMUNITY_GEN_IPV4:
+               case EXT_COMMUNITY_GEN_FOUR_AS:
                        if (getcommunity(p, 0, &uval2, &dflag2) == -1)
                                return (-1);
                        break;
Index: printconf.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/printconf.c,v
retrieving revision 1.165
diff -u -p -r1.165 printconf.c
--- printconf.c 18 Apr 2023 14:11:54 -0000      1.165
+++ printconf.c 21 Apr 2023 09:13:22 -0000
@@ -219,6 +219,8 @@ print_community(struct community *c)
                switch (type) {
                case EXT_COMMUNITY_TRANS_TWO_AS:
                case EXT_COMMUNITY_TRANS_FOUR_AS:
+               case EXT_COMMUNITY_GEN_TWO_AS:
+               case EXT_COMMUNITY_GEN_FOUR_AS:
                        if ((c->flags >> 8 & 0xff) == COMMUNITY_NEIGHBOR_AS)
                                printf("neighbor-as:");
                        else if ((c->flags >> 8 & 0xff) == COMMUNITY_LOCAL_AS)
@@ -227,6 +229,7 @@ print_community(struct community *c)
                                printf("%s:", log_as(c->data1));
                        break;
                case EXT_COMMUNITY_TRANS_IPV4:
+               case EXT_COMMUNITY_GEN_IPV4:
                        addr.s_addr = htonl(c->data1);
                        printf("%s:", inet_ntoa(addr));
                        break;
@@ -236,6 +239,9 @@ print_community(struct community *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:
                        if ((c->flags >> 16 & 0xff) == COMMUNITY_ANY)
                                printf("* ");
                        else if ((c->flags >> 16 & 0xff) ==

Reply via email to