From: Katerina Kubecova Date: Thu, 4 Sep 2025 10:34:59 +0000 (+0200) Subject: BGP: Forward-port better solution of listening socket requests X-Git-Tag: v3.2.0~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2041869a5b82dc83b56f763f7d5cec87e34555c2;p=thirdparty%2Fbird.git BGP: Forward-port better solution of listening socket requests In master (upcoming v2.18), the listening socket creation has been resolved better than in current v3, and thus we forward-port that solution from the mq-bgp-multilisten branch before actually merging master. --- diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 394759255..32e61f700 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -689,14 +689,14 @@ bgp_open(struct bgp_proto *p) struct bgp_listen_request *req = &p->listen; /* We assume that cf->iface is defined iff cf->local_ip is link-local */ - req->iface = p->cf->strict_bind ? p->cf->iface : NULL; - req->vrf = p->p.vrf; - req->addr = p->cf->strict_bind ? p->cf->local_ip : + req->params.iface = p->cf->strict_bind ? p->cf->iface : NULL; + req->params.vrf = p->p.vrf; + req->params.addr = p->cf->strict_bind ? p->cf->local_ip : (p->ipv4 ? IPA_NONE4 : IPA_NONE6); - req->port = p->cf->local_port; - req->flags = p->cf->free_bind ? SKF_FREEBIND : 0; + req->params.port = p->cf->local_port; + req->params.flags = p->cf->free_bind ? SKF_FREEBIND : 0; - BGP_TRACE(D_EVENTS, "Requesting listen socket at %I%J port %u", req->addr, req->iface, req->port); + BGP_TRACE(D_EVENTS, "Requesting listen socket at %I%J port %u", req->params.addr, req->params.iface, req->params.port); add_tail(&bgp_listen_pending, &req->n); ev_send(&global_event_list, &bgp_listen_event); @@ -727,11 +727,11 @@ bgp_listen_create(void *_ UNUSED) /* First try to find existing socket */ struct bgp_socket *bs; WALK_LIST(bs, bgp_sockets) - if (ipa_equal(bs->sk->saddr, req->addr) && - (bs->sk->sport == req->port) && - (bs->sk->iface == req->iface) && - (bs->sk->vrf == req->vrf) && - ((bs->sk->flags & flag_mask) == req->flags)) + if (ipa_equal(bs->sk->saddr, req->params.addr) && + (bs->sk->sport == req->params.port) && + (bs->sk->iface == req->params.iface) && + (bs->sk->vrf == req->params.vrf) && + ((bs->sk->flags & flag_mask) == req->params.flags)) break; /* Not found any */ @@ -744,11 +744,11 @@ bgp_listen_create(void *_ UNUSED) sock *sk = sk_new(bgp_listen_pool); sk->type = SK_TCP_PASSIVE; sk->ttl = 255; - sk->saddr = req->addr; - sk->sport = req->port; - sk->iface = req->iface; - sk->vrf = req->vrf; - sk->flags = req->flags; + sk->saddr = req->params.addr; + sk->sport = req->params.port; + sk->iface = req->params.iface; + sk->vrf = req->params.vrf; + sk->flags = req->params.flags; sk->tos = IP_PREC_INTERNET_CONTROL; sk->rbsize = BGP_RX_BUFFER_SIZE; sk->tbsize = BGP_TX_BUFFER_SIZE; @@ -1875,7 +1875,7 @@ bgp_find_proto(sock *sk) (ipa_equal(p->remote_ip, sk->daddr) || bgp_is_dynamic(p)) && (!p->cf->remote_range || ipa_in_netX(sk->daddr, p->cf->remote_range)) && (p->p.vrf == sk->vrf) && - (p->cf->local_port == sk->sport) && + (req->params.port == sk->sport) && (!link || (p->cf->iface == sk->iface)) && (ipa_zero(p->cf->local_ip) || ipa_equal(p->cf->local_ip, sk->saddr))) { diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 84eb06646..dfc80e6c6 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -312,6 +312,13 @@ struct bgp_socket { node n; /* Node in global bgp_sockets */ list requests; /* Listen requests */ sock *sk; /* Real listening socket */ + struct bgp_socket_params { + ip_addr addr; /* Local address to bind to */ + struct iface *iface; /* Local interface to bind to */ + struct iface *vrf; /* VRF to bind to */ + uint port; /* Local port to bind to (mandatory) */ + uint flags; /* Additional SKF_* flags */ + } params; }; struct bgp_stats { @@ -370,11 +377,7 @@ struct bgp_session_close_ad { struct bgp_listen_request { node n; /* Node in bgp_socket / pending list */ struct bgp_socket *sock; /* Assigned socket */ - ip_addr addr; - struct iface *iface; - struct iface *vrf; - uint port; - uint flags; + struct bgp_socket_params params; }; struct bgp_proto {