From 1b1ed1fc78740f0a2c76e7288be0fc85877484da Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Sun, 2 Apr 2023 19:15:27 +0200 Subject: BGP: sockets use sk_resume_rx and sk_pause_rx --- proto/bgp/packets.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'proto/bgp') diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c index ab171189..546f0809 100644 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@ -3264,16 +3264,25 @@ bgp_rx_packet(struct bgp_conn *conn, byte *pkt, uint len) void bgp_uncork(void *vp) { + /* The uncork event is run from &main_birdloop and there is no useful way how + * to assign the target loop to it, thus we have to lock it ourselves. */ + struct bgp_proto *p = vp; + if (!p) + return; + + birdloop_enter(p->p.loop); if (p && p->conn && (p->conn->state == BS_ESTABLISHED) && !p->conn->sk->rx_hook) { struct birdsock *sk = p->conn->sk; ASSERT_DIE(sk->rpos > sk->rbuf); - sk->rx_hook = bgp_rx; + sk_resume_rx(p->p.loop, sk, bgp_rx); bgp_rx(sk, sk->rpos - sk->rbuf); BGP_TRACE(D_PACKETS, "Uncorked"); } + + birdloop_leave(p->p.loop); } /** @@ -3302,7 +3311,7 @@ bgp_rx(sock *sk, uint size) return 0; if ((conn->state == BS_ESTABLISHED) && rt_cork_check(conn->bgp->uncork_ev)) { - sk->rx_hook = NULL; + sk_pause_rx(p->p.loop, sk); BGP_TRACE(D_PACKETS, "Corked"); return 0; } -- cgit v1.2.3