uint fast_rx; /* RX has higher priority in event loop */
uint rbsize;
int (*rx_hook)(struct birdsock *, uint size); /* NULL=receiving turned off, returns 1 to clear rx buffer */
+ int (*rx_paused)(struct birdsock *, uint size); /* stored rx_hook when paused */
byte *tbuf, *tpos; /* NULL=allocate automatically */
byte *ttx; /* Internal */
void (*tx_hook)(struct birdsock *);
void (*err_hook)(struct birdsock *, int); /* errno or zero if EOF */
+ void (*err_paused)(struct birdsock *, int); /* called first when paused */
/* Information about received datagrams (UDP, RAW), valid in rx_hook */
ip_addr faddr, laddr; /* src (From) and dst (Local) address of the datagram */
int sk_send_to(sock *, uint len, ip_addr to, uint port); /* sk_send to given destination */
void sk_reallocate(sock *); /* Free and allocate tbuf & rbuf */
void sk_pause_rx(struct birdloop *loop, sock *s);
-void sk_resume_rx(struct birdloop *loop, sock *s, int (*hook)(sock *, uint));
+void sk_resume_rx(struct birdloop *loop, sock *s);
void sk_set_rbsize(sock *s, uint val); /* Resize RX buffer */
void sk_set_tbsize(sock *s, uint val); /* Resize TX buffer, keeping content */
void sk_set_tbuf(sock *s, void *tbuf); /* Switch TX buffer, NULL-> return to internal */
{
struct birdsock *sk = p->conn->sk;
ASSERT_DIE(sk->rpos > sk->rbuf);
- sk_resume_rx(p->p.loop, sk, bgp_rx);
+ sk_resume_rx(p->p.loop, sk);
bgp_rx(sk, sk->rpos - sk->rbuf);
BGP_TRACE(D_PACKETS, "Uncorked");
}
sk_pause_rx(struct birdloop *loop, sock *s)
{
ASSERT_DIE(birdloop_inside(loop));
+ ASSERT_DIE(!s->rx_paused);
+ ASSERT_DIE(s->rx_hook);
+ s->rx_paused = s->rx_hook;
s->rx_hook = NULL;
socket_changed(s);
}
void
-sk_resume_rx(struct birdloop *loop, sock *s, int (*hook)(sock *, uint))
+sk_resume_rx(struct birdloop *loop, sock *s)
{
ASSERT_DIE(birdloop_inside(loop));
- ASSERT_DIE(hook);
- s->rx_hook = hook;
+ ASSERT_DIE(s->rx_paused);
+ ASSERT_DIE(!s->rx_hook);
+ s->rx_hook = s->rx_paused;
+ s->rx_paused = NULL;
socket_changed(s);
}