diff options
author | Maria Matejka <mq@ucw.cz> | 2022-02-04 15:26:36 +0100 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2022-02-04 15:26:36 +0100 |
commit | fe840ddad96259ed7b2f1d0d2f07bdf8d4c03384 (patch) | |
tree | 8a59e7eceaa1cfabb400f1fc2fbf0eaebf0d959f /proto/bgp/bgp.c | |
parent | 14bb6fd29a1c88103e73138d5fd4396e610aa469 (diff) | |
parent | a9646efd40569f3a1d749bc1bd13219876b33a00 (diff) |
Merge commit 'a9646efd40569f3a1d749bc1bd13219876b33a00' into sark-bgp-rebased
Diffstat (limited to 'proto/bgp/bgp.c')
-rw-r--r-- | proto/bgp/bgp.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 65cc3a40..e2754649 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -165,12 +165,17 @@ bgp_open(struct bgp_proto *p) ip_addr addr = p->cf->strict_bind ? p->cf->local_ip : (p->ipv4 ? IPA_NONE4 : IPA_NONE6); uint port = p->cf->local_port; + uint flags = p->cf->free_bind ? SKF_FREEBIND : 0; + uint flag_mask = SKF_FREEBIND; /* We assume that cf->iface is defined iff cf->local_ip is link-local */ WALK_LIST(bs, bgp_sockets) - if (ipa_equal(bs->sk->saddr, addr) && (bs->sk->sport == port) && - (bs->sk->iface == ifa) && (bs->sk->vrf == p->p.vrf)) + if (ipa_equal(bs->sk->saddr, addr) && + (bs->sk->sport == port) && + (bs->sk->iface == ifa) && + (bs->sk->vrf == p->p.vrf) && + ((bs->sk->flags & flag_mask) == flags)) { bs->uc++; p->sock = bs; @@ -184,7 +189,7 @@ bgp_open(struct bgp_proto *p) sk->sport = port; sk->iface = ifa; sk->vrf = p->p.vrf; - sk->flags = SKF_PASSIVE_THREAD; + sk->flags = flags | SKF_PASSIVE_THREAD; sk->tos = IP_PREC_INTERNET_CONTROL; sk->rbsize = BGP_RX_BUFFER_SIZE; sk->tbsize = BGP_TX_BUFFER_SIZE; |