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!!!!"