]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Store listen socket params also inside the socket structure
authorMaria Matejka <mq@ucw.cz>
Sat, 11 Oct 2025 15:54:00 +0000 (17:54 +0200)
committerMaria Matejka <mq@ucw.cz>
Thu, 13 Nov 2025 11:25:03 +0000 (12:25 +0100)
This makes matching sockets to requests easier.

proto/bgp/bgp.c

index 4dc34da2afffcdd4669e77e7ff81d315323867d1..1b6923ec4fd886f1f21ec718f13ecd4937413f48 100644 (file)
@@ -735,11 +735,22 @@ bgp_open(struct bgp_proto *p)
   ev_send(&global_event_list, &bl->event);
 }
 
+static int
+bgp_socket_match(const struct bgp_socket_params *a, const struct bgp_socket_params *b)
+{
+  return
+    ipa_equal(a->addr, b->addr) &&
+    a->iface == b->iface &&
+    a->vrf == b->vrf &&
+    a->port == b->port &&
+    a->flags == b->flags &&
+    1;
+}
+
 static void
 bgp_listen_create(void *_ UNUSED)
 {
   ASSERT_DIE(birdloop_inside(&main_birdloop));
-  uint flag_mask = SKF_FREEBIND;
 
   while (1) {
     BGP_LISTEN_LOCK(bl);
@@ -756,11 +767,7 @@ bgp_listen_create(void *_ UNUSED)
     /* First try to find existing socket */
     struct bgp_socket *bs;
     WALK_LIST(bs, bl->sockets)
-      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))
+      if (bgp_socket_match(&req->params, &bs->params))
        break;
 
     /* Not found any */
@@ -797,6 +804,7 @@ bgp_listen_create(void *_ UNUSED)
 
       bs = mb_allocz(birdloop_pool(bl->loop), sizeof(struct bgp_socket));
       bs->sk = sk;
+      bs->params = req->params;
       sk->data = bs;
 
       init_list(&bs->requests);