]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Allow to specify interface for regular sessions
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 14 Mar 2017 11:56:47 +0000 (12:56 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 14 Mar 2017 11:56:47 +0000 (12:56 +0100)
This may be useful if multple interfaces share the same network range.

Thanks to Fritz Grimpen for the original patch.

doc/bird.sgml
proto/bgp/bgp.c

index dd4472aee04f482718e97130302773ef1a3a2e48..ffd28964e702eded80c6d0c58ab9be3f60c9ef31 100644 (file)
@@ -1883,8 +1883,9 @@ using the following configuration parameters:
        <tag><label id="bgp-iface">interface <m/string/</tag>
        Define interface we should use for link-local BGP IPv6 sessions.
        Interface can also be specified as a part of <cf/neighbor address/
-       (e.g., <cf/neighbor fe80::1234%eth0 as 65000;/). It is an error to use
-       this parameter for non link-local sessions.
+       (e.g., <cf/neighbor fe80::1234%eth0 as 65000;/). The option may also be
+       used for non link-local sessions when it is necessary to explicitly
+       specify an interface, but only for direct (not multihop) sessions.
 
        <tag><label id="bgp-direct">direct</tag>
        Specify that the neighbor is directly connected. The IP address of the
index 0f1c9446ded8c48f9365cf1b96855df896655bc9..f706e76e64b78794d92118a92200d62bce828daf 100644 (file)
@@ -790,7 +790,7 @@ bgp_find_proto(sock *sk)
       {
        struct bgp_proto *p = (struct bgp_proto *) pc->proto;
        if (ipa_equal(p->cf->remote_ip, sk->daddr) &&
-           (!ipa_is_link_local(sk->daddr) || (p->cf->iface == sk->iface)))
+           (!p->cf->iface || (p->cf->iface == sk->iface)))
          return p;
       }
 
@@ -1324,11 +1324,8 @@ bgp_check_config(struct bgp_config *c)
   if (!c->remote_as)
     cf_error("Remote AS number must be set");
 
-  // if (ipa_is_link_local(c->remote_ip) && !c->iface)
-  //   cf_error("Link-local neighbor address requires specified interface");
-
-  if (!ipa_is_link_local(c->remote_ip) != !c->iface)
-    cf_error("Link-local address and interface scope must be used together");
+  if (ipa_is_link_local(c->remote_ip) && !c->iface)
+    cf_error("Link-local neighbor address requires specified interface");
 
   if (!(c->capabilities && c->enable_as4) && (c->remote_as > 0xFFFF))
     cf_error("Neighbor AS number out of range (AS4 not available)");
@@ -1346,6 +1343,9 @@ bgp_check_config(struct bgp_config *c)
                      ipa_is_link_local(c->source_addr)))
     cf_error("Multihop BGP cannot be used with link-local addresses");
 
+  if (c->multihop && c->iface)
+    cf_error("Multihop BGP cannot be bound to interface");
+
   if (c->multihop && c->check_link)
     cf_error("Multihop BGP cannot depend on link state");