We already have a local AS saved per peer. Let's use it. This is very
useful when one needs to change their local AS.
"
neighbor 192.0.2.1 {
remote-as 65530
local-as 131000
}
"
OK?
Index: parse.y
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/parse.y,v
retrieving revision 1.288
diff -u -p -u -p -r1.288 parse.y
--- parse.y 21 Jun 2016 21:35:24 -0000 1.288
+++ parse.y 26 Sep 2016 14:46:23 -0000
@@ -175,7 +175,7 @@ typedef struct {
%token RDOMAIN RD EXPORTTRGT IMPORTTRGT
%token RDE RIB EVALUATE IGNORE COMPARE
%token GROUP NEIGHBOR NETWORK
-%token REMOTEAS DESCR LOCALADDR MULTIHOP PASSIVE MAXPREFIX RESTART
+%token LOCALAS REMOTEAS DESCR LOCALADDR MULTIHOP PASSIVE MAXPREFIX RESTART
%token ANNOUNCE CAPABILITIES REFRESH AS4BYTE CONNECTRETRY
%token DEMOTE ENFORCE NEIGHBORAS REFLECTOR DEPEND DOWN SOFTRECONFIG
%token DUMP IN OUT SOCKET RESTRICTED
@@ -1004,6 +1004,9 @@ peeroptsl : peeropts nl
peeropts : REMOTEAS as4number {
curpeer->conf.remote_as = $2;
}
+ | LOCALAS as4number {
+ curpeer->conf.local_as = $2;
+ }
| DESCR string {
if (strlcpy(curpeer->conf.descr, $2,
sizeof(curpeer->conf.descr)) >=
@@ -2249,6 +2252,7 @@ lookup(char *s)
{ "key", KEY},
{ "listen", LISTEN},
{ "local-address", LOCALADDR},
+ { "local-as", LOCALAS},
{ "localpref", LOCALPREF},
{ "log", LOG},
{ "match", MATCH},
Index: printconf.c
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/printconf.c,v
retrieving revision 1.97
diff -u -p -u -p -r1.97 printconf.c
--- printconf.c 13 Jul 2016 20:07:38 -0000 1.97
+++ printconf.c 26 Sep 2016 17:41:58 -0000
@@ -365,6 +365,8 @@ print_peer(struct peer_config *p, struct
printf("%s\trib \"%s\"\n", c, p->rib);
if (p->remote_as)
printf("%s\tremote-as %s\n", c, log_as(p->remote_as));
+ if (p->local_as != conf->as)
+ printf("%s\tlocale-as %s\n", c, log_as(p->local_as));
if (p->down)
printf("%s\tdown\n", c);
if (p->distance > 1)
Index: session.c
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/session.c,v
retrieving revision 1.354
diff -u -p -u -p -r1.354 session.c
--- session.c 3 Sep 2016 16:22:17 -0000 1.354
+++ session.c 26 Sep 2016 17:47:59 -0000
@@ -1461,7 +1461,7 @@ session_open(struct peer *p)
if (p->capa.ann.as4byte) { /* 4 bytes data */
u_int32_t nas;
- nas = htonl(conf->as);
+ nas = htonl(p->conf.local_as);
errs += session_capa_add(opb, CAPA_AS4BYTE, sizeof(nas));
errs += ibuf_add(opb, &nas, sizeof(nas));
}
@@ -2120,7 +2120,7 @@ parse_open(struct peer *peer)
/* if remote-as is zero and it's a cloned neighbor, accept any */
if (peer->template && !peer->conf.remote_as && as != AS_TRANS) {
peer->conf.remote_as = as;
- peer->conf.ebgp = (peer->conf.remote_as != conf->as);
+ peer->conf.ebgp = (peer->conf.remote_as != peer->conf.local_as);
if (!peer->conf.ebgp)
/* force enforce_as off for iBGP sessions */
peer->conf.enforce_as = ENFORCE_AS_OFF;
@@ -3074,7 +3074,7 @@ session_template_clone(struct peer *p, s
if (as) {
p->conf.remote_as = as;
- p->conf.ebgp = (p->conf.remote_as != conf->as);
+ p->conf.ebgp = (p->conf.remote_as != p->conf.local_as);
if (!p->conf.ebgp)
/* force enforce_as off for iBGP sessions */
p->conf.enforce_as = ENFORCE_AS_OFF;
Index: bgpd.conf.5
===================================================================
RCS file: /cvs/openbsd/src/usr.sbin/bgpd/bgpd.conf.5,v
retrieving revision 1.146
diff -u -p -u -p -r1.146 bgpd.conf.5
--- bgpd.conf.5 17 Aug 2016 08:14:40 -0000 1.146
+++ bgpd.conf.5 26 Sep 2016 18:03:06 -0000
@@ -855,6 +855,10 @@ is given,
.Xr bgpd 8
binds to this address first.
.Pp
+.It Ic local-as Ar as-number
+Set the AS number sent to the remote system.
+Intended to be used temporarily, for migrations to another AS.
+.Pp
.It Ic log no
Disable neighbor specific logging.
.Pp
--
"But I don't like Spam!!!!"