Adjust ext community handling to support the generic transitive communities
authorclaudio <claudio@openbsd.org>
Fri, 21 Apr 2023 10:48:33 +0000 (10:48 +0000)
committerclaudio <claudio@openbsd.org>
Fri, 21 Apr 2023 10:48:33 +0000 (10:48 +0000)
introduced with flowspec.
OK tb@

usr.sbin/bgpd/parse.y
usr.sbin/bgpd/printconf.c

index 516c19c..3c3e310 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: parse.y,v 1.451 2023/04/21 10:47:07 claudio Exp $ */
+/*     $OpenBSD: parse.y,v 1.452 2023/04/21 10:48:33 claudio Exp $ */
 
 /*
  * Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -4441,7 +4441,7 @@ parseextvalue(int type, char *s, uint32_t *v, uint32_t *flag)
                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, char *t, char *s)
        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, char *t, char *s)
 
                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 137dd77..75fa425 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: printconf.c,v 1.165 2023/04/18 14:11:54 claudio Exp $ */
+/*     $OpenBSD: printconf.c,v 1.166 2023/04/21 10:48:33 claudio Exp $ */
 
 /*
  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -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) ==