Allow us to receive our own AS paths from a neighbor.

Like several of the related diffs, this also invites dragons and grues
into your network.

Probably needs the most love in the man page, as usual ;).

OK?


Index: bgpd.conf.5
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/bgpd.conf.5,v
retrieving revision 1.154
diff -u -p -u -p -r1.154 bgpd.conf.5
--- bgpd.conf.5 27 May 2017 10:33:15 -0000      1.154
+++ bgpd.conf.5 27 May 2017 12:49:42 -0000
@@ -767,6 +767,19 @@ section in
 .Sx GLOBAL CONFIGURATION .
 .Pp
 .It Xo
+.Ic enforce local-as
+.Pq Ic yes Ns | Ns Ic no
+.Xc
+If set to
+.Ic no ,
+.Em AS paths
+will not be checked for AS loop detection.
+Since there is no AS path loop check, this option is dangerous, and
+requires you to add filters to prevent receiving your own prefixes.
+The default value is
+.Ic yes .
+.Pp
+.It Xo
 .Ic enforce neighbor-as
 .Pq Ic yes Ns | Ns Ic no
 .Xc
Index: bgpd.h
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/bgpd.h,v
retrieving revision 1.303
diff -u -p -u -p -r1.303 bgpd.h
--- bgpd.h      27 May 2017 12:09:27 -0000      1.303
+++ bgpd.h      27 May 2017 12:34:57 -0000
@@ -309,6 +309,7 @@ struct peer_config {
        u_int32_t                max_prefix;
        enum announce_type       announce_type;
        enum enforce_as          enforce_as;
+       enum enforce_as          enforce_local_as;
        enum reconf_action       reconf_action;
        u_int16_t                max_prefix_restart;
        u_int16_t                holdtime;
Index: parse.y
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.303
diff -u -p -u -p -r1.303 parse.y
--- parse.y     27 May 2017 10:33:15 -0000      1.303
+++ parse.y     27 May 2017 12:35:33 -0000
@@ -1183,6 +1183,12 @@ peeropts : REMOTEAS as4number    {
                        else
                                curpeer->conf.enforce_as = ENFORCE_AS_OFF;
                }
+               | ENFORCE LOCALAS yesno {
+                       if ($3)
+                               curpeer->conf.enforce_local_as = ENFORCE_AS_ON;
+                       else
+                               curpeer->conf.enforce_local_as = ENFORCE_AS_OFF;
+               }
                | MAXPREFIX NUMBER restart {
                        if ($2 < 0 || $2 > UINT_MAX) {
                                yyerror("bad maximum number of prefixes");
@@ -3690,6 +3696,8 @@ neighbor_consistent(struct peer *p)
        if (p->conf.enforce_as == ENFORCE_AS_UNDEF)
                p->conf.enforce_as = p->conf.ebgp ?
                    ENFORCE_AS_ON : ENFORCE_AS_OFF;
+       if (p->conf.enforce_local_as == ENFORCE_AS_UNDEF)
+               p->conf.enforce_local_as = ENFORCE_AS_ON;
 
        /* EBGP neighbors are not allowed in route reflector clusters */
        if (p->conf.reflector_client && p->conf.ebgp) {
Index: printconf.c
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/printconf.c,v
retrieving revision 1.102
diff -u -p -u -p -r1.102 printconf.c
--- printconf.c 27 May 2017 10:33:15 -0000      1.102
+++ printconf.c 27 May 2017 12:38:13 -0000
@@ -470,6 +470,10 @@ print_peer(struct peer_config *p, struct
                printf("%s\tenforce neighbor-as yes\n", c);
        else
                printf("%s\tenforce neighbor-as no\n", c);
+       if (p->enforce_local_as == ENFORCE_AS_ON)
+               printf("%s\tenforce local-as yes\n", c);
+       else
+               printf("%s\tenforce local-as no\n", c);
        if (p->reflector_client) {
                if (conf->clusterid == 0)
                        printf("%s\troute-reflector\n", c);
Index: rde.c
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.362
diff -u -p -u -p -r1.362 rde.c
--- rde.c       27 May 2017 10:33:15 -0000      1.362
+++ rde.c       27 May 2017 12:41:06 -0000
@@ -1104,6 +1104,7 @@ rde_update_dispatch(struct imsg *imsg)
 
        /* aspath needs to be loop free nota bene this is not a hard error */
        if (peer->conf.ebgp &&
+           peer->conf.enforce_local_as == ENFORCE_AS_ON &&
            !aspath_loopfree(asp->aspath, peer->conf.local_as))
                asp->flags |= F_ATTR_LOOP;
 



-- 
The porcupine with the sharpest quills gets stuck on a tree more often.

Reply via email to