]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Autoconfigure BGP next hops from preferred addresses
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 8 Dec 2017 01:26:17 +0000 (02:26 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Fri, 8 Dec 2017 01:26:17 +0000 (02:26 +0100)
proto/bgp/bgp.c

index 30fe75ba77f425d3764d06542e29e11cd3a978ee..a26c0cb992651bc14189d7c011506ca376598c74 100644 (file)
@@ -1504,6 +1504,20 @@ bgp_channel_start(struct channel *C)
       c->next_hop_addr = src;
   }
 
+  /* Use preferred addresses associated with interface / source address */
+  if (ipa_zero(c->next_hop_addr))
+  {
+    /* We know the iface for single-hop, we make lookup for multihop */
+    struct neighbor *nbr = p->neigh ?: neigh_find2(&p->p, &src, NULL, 0);
+    struct iface *iface = nbr ? nbr->iface : NULL;
+
+    if (bgp_channel_is_ipv4(c) && iface && iface->addr4)
+      c->next_hop_addr = iface->addr4->ip;
+
+    if (bgp_channel_is_ipv6(c) && iface && iface->addr6)
+      c->next_hop_addr = iface->addr6->ip;
+  }
+
   /* Exit if no feasible next hop address is found */
   if (ipa_zero(c->next_hop_addr))
   {
@@ -2079,6 +2093,11 @@ bgp_show_proto_info(struct proto *P)
     {
       channel_show_info(&c->c);
 
+      if (ipa_zero(c->link_addr))
+       cli_msg(-1006, "    BGP Next hop:   %I", c->next_hop_addr);
+      else
+       cli_msg(-1006, "    BGP Next hop:   %I %I", c->next_hop_addr, c->link_addr);
+
       if (c->igp_table_ip4)
        cli_msg(-1006, "    IGP IPv4 table: %s", c->igp_table_ip4->name);