bgp proto bug with add paths in bird 1.6.3

Lennert Buytenhek buytenh at
Thu Mar 9 13:20:28 CET 2017

On Mon, Mar 06, 2017 at 07:41:44PM +0200, Lennert Buytenhek wrote:

> Hi!
> bgp_init() in proto/bgp/bgp.c does:
>   P->accept_ra_types = c->secondary ? RA_ACCEPTED : RA_OPTIMAL;
> and then bgp_rx_open() in proto/bgp/packets.c does:
>   if (p->add_path_tx)
>     p->p.accept_ra_types = RA_ANY;
> As bgp_init() seems to only be called at configuration time, this
> means that if you have add path tx, and you have a peer that advertises
> rx add path and then reconnects without advertising rx add path, you
> will still have RA_ANY set on the sending side and not have the correct
> behavior of only sending the optimal route.  (This is easy to verify.)
> Not entirely sure how you'd want to fix this, but perhaps replicating
> the RA_ACCEPTED / RA_OPTIONAL assignment in bgp_rx_open() (or just
> moving it there) would do the trick?

In other words, something like this?

(I didn't trace all the code paths, but I'm guessing it should be safe
to remove the ->accept_ra_types assignment from bgp_init() based on the
fact that we are overriding it in bgp_rx_open() and expecting that to
do the trick for the add_path_tx case -- if that's not sufficient then
it's not safe to do that reassignment from there to begin with.)

diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index d100b7d..a566d11 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -1039,6 +1039,8 @@ bgp_rx_open(struct bgp_conn *conn, byte *pkt, uint len)
   if (p->add_path_tx)
     p->p.accept_ra_types = RA_ANY;
+  else
+    p->p.accept_ra_types = p->cf->secondary ? RA_ACCEPTED : RA_OPTIMAL;
   DBG("BGP: Hold timer set to %d, keepalive to %d, AS to %d, ID to %x, AS4 session to %d\n", conn->hold_time, conn->keepalive_time, p->remote_as, p->remote_id, p->as4_session);

More information about the Bird-users mailing list