]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Forward-port better solution of listening socket requests
authorKaterina Kubecova <katerina.kubecova@nic.cz>
Thu, 4 Sep 2025 10:34:59 +0000 (12:34 +0200)
committerMaria Matejka <mq@ucw.cz>
Thu, 13 Nov 2025 11:25:03 +0000 (12:25 +0100)
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.

proto/bgp/bgp.c
proto/bgp/bgp.h

index 394759255fc93d559d195b152c055e7a585b5c06..32e61f700402fde2653eb7af84679f537679cb53 100644 (file)
@@ -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)))
     {
index 84eb06646f2304a0a1a86c363f716272855be0ae..dfc80e6c678457d9097a8f1c7cc7be25d0e403c2 100644 (file)
@@ -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 {