diff options
author | Maria Matejka <mq@ucw.cz> | 2023-04-02 19:15:27 +0200 |
---|---|---|
committer | Maria Matejka <mq@ucw.cz> | 2023-04-04 17:00:59 +0200 |
commit | 1b1ed1fc78740f0a2c76e7288be0fc85877484da (patch) | |
tree | 36455fa858bade40c960c7c4c03b1ce51be0202d /proto/bgp | |
parent | e33902e15cb5399900fd346b4dba522ad821f0f0 (diff) |
BGP: sockets use sk_resume_rx and sk_pause_rx
Diffstat (limited to 'proto/bgp')
-rw-r--r-- | proto/bgp/packets.c | 13 |
1 files changed, 11 insertions, 2 deletions
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; } |