0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-23 02:01:55 +00:00

BGP: respecting table cork

This commit is contained in:
Maria Matejka 2022-08-02 12:54:11 +02:00
parent f8500b5943
commit 449cd471ad
3 changed files with 28 additions and 0 deletions

View File

@ -376,6 +376,7 @@ bgp_close_conn(struct bgp_conn *conn)
conn->keepalive_timer = NULL; conn->keepalive_timer = NULL;
rfree(conn->hold_timer); rfree(conn->hold_timer);
conn->hold_timer = NULL; conn->hold_timer = NULL;
rfree(conn->tx_ev); rfree(conn->tx_ev);
conn->tx_ev = NULL; conn->tx_ev = NULL;
rfree(conn->sk); rfree(conn->sk);
@ -514,6 +515,7 @@ void
bgp_stop(struct bgp_proto *p, int subcode, byte *data, uint len) bgp_stop(struct bgp_proto *p, int subcode, byte *data, uint len)
{ {
proto_notify_state(&p->p, PS_STOP); proto_notify_state(&p->p, PS_STOP);
p->uncork_ev->data = NULL;
bgp_graceful_close_conn(&p->outgoing_conn, subcode, data, len); bgp_graceful_close_conn(&p->outgoing_conn, subcode, data, len);
bgp_graceful_close_conn(&p->incoming_conn, subcode, data, len); bgp_graceful_close_conn(&p->incoming_conn, subcode, data, len);
ev_schedule(p->event); ev_schedule(p->event);
@ -1576,6 +1578,8 @@ bgp_start(struct proto *P)
p->last_rx_update = 0; p->last_rx_update = 0;
p->event = ev_new_init(p->p.pool, bgp_decision, p); p->event = ev_new_init(p->p.pool, bgp_decision, p);
p->uncork_ev = ev_new_init(p->p.pool, bgp_uncork, p);
p->startup_timer = tm_new_init(p->p.pool, bgp_startup_timeout, p, 0, 0); p->startup_timer = tm_new_init(p->p.pool, bgp_startup_timeout, p, 0, 0);
p->gr_timer = tm_new_init(p->p.pool, bgp_graceful_restart_timeout, p, 0, 0); p->gr_timer = tm_new_init(p->p.pool, bgp_graceful_restart_timeout, p, 0, 0);

View File

@ -319,6 +319,7 @@ struct bgp_proto {
struct bgp_socket *sock; /* Shared listening socket */ struct bgp_socket *sock; /* Shared listening socket */
struct bfd_request *bfd_req; /* BFD request, if BFD is used */ struct bfd_request *bfd_req; /* BFD request, if BFD is used */
struct birdsock *postponed_sk; /* Postponed incoming socket for dynamic BGP */ struct birdsock *postponed_sk; /* Postponed incoming socket for dynamic BGP */
event *uncork_ev; /* Uncork event in case of congestion */
struct bgp_stats stats; /* BGP statistics */ struct bgp_stats stats; /* BGP statistics */
btime last_established; /* Last time of enter/leave of established state */ btime last_established; /* Last time of enter/leave of established state */
btime last_rx_update; /* Last time of RX update */ btime last_rx_update; /* Last time of RX update */
@ -610,6 +611,7 @@ void bgp_schedule_packet(struct bgp_conn *conn, struct bgp_channel *c, int type)
void bgp_kick_tx(void *vconn); void bgp_kick_tx(void *vconn);
void bgp_tx(struct birdsock *sk); void bgp_tx(struct birdsock *sk);
int bgp_rx(struct birdsock *sk, uint size); int bgp_rx(struct birdsock *sk, uint size);
void bgp_uncork(void *vp);
const char * bgp_error_dsc(unsigned code, unsigned subcode); const char * bgp_error_dsc(unsigned code, unsigned subcode);
void bgp_log_error(struct bgp_proto *p, u8 class, char *msg, unsigned code, unsigned subcode, byte *data, unsigned len); void bgp_log_error(struct bgp_proto *p, u8 class, char *msg, unsigned code, unsigned subcode, byte *data, unsigned len);

View File

@ -3175,6 +3175,21 @@ bgp_rx_packet(struct bgp_conn *conn, byte *pkt, uint len)
} }
} }
void
bgp_uncork(void *vp)
{
struct bgp_proto *p = vp;
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;
bgp_rx(sk, sk->rpos - sk->rbuf);
BGP_TRACE(D_PACKETS, "Uncorked");
}
}
/** /**
* bgp_rx - handle received data * bgp_rx - handle received data
* @sk: socket * @sk: socket
@ -3189,6 +3204,7 @@ int
bgp_rx(sock *sk, uint size) bgp_rx(sock *sk, uint size)
{ {
struct bgp_conn *conn = sk->data; struct bgp_conn *conn = sk->data;
struct bgp_proto *p = conn->bgp;
byte *pkt_start = sk->rbuf; byte *pkt_start = sk->rbuf;
byte *end = pkt_start + size; byte *end = pkt_start + size;
uint i, len; uint i, len;
@ -3198,6 +3214,12 @@ bgp_rx(sock *sk, uint size)
{ {
if ((conn->state == BS_CLOSE) || (conn->sk != sk)) if ((conn->state == BS_CLOSE) || (conn->sk != sk))
return 0; return 0;
if ((conn->state == BS_ESTABLISHED) && rt_cork_check(conn->bgp->uncork_ev))
{
sk->rx_hook = NULL;
BGP_TRACE(D_PACKETS, "Corked");
return 0;
}
for(i=0; i<16; i++) for(i=0; i<16; i++)
if (pkt_start[i] != 0xff) if (pkt_start[i] != 0xff)
{ {