mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-18 17:18:42 +00:00
BGP: respecting table cork
This commit is contained in:
parent
f8500b5943
commit
449cd471ad
@ -376,6 +376,7 @@ bgp_close_conn(struct bgp_conn *conn)
|
||||
conn->keepalive_timer = NULL;
|
||||
rfree(conn->hold_timer);
|
||||
conn->hold_timer = NULL;
|
||||
|
||||
rfree(conn->tx_ev);
|
||||
conn->tx_ev = NULL;
|
||||
rfree(conn->sk);
|
||||
@ -514,6 +515,7 @@ void
|
||||
bgp_stop(struct bgp_proto *p, int subcode, byte *data, uint len)
|
||||
{
|
||||
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->incoming_conn, subcode, data, len);
|
||||
ev_schedule(p->event);
|
||||
@ -1576,6 +1578,8 @@ bgp_start(struct proto *P)
|
||||
p->last_rx_update = 0;
|
||||
|
||||
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->gr_timer = tm_new_init(p->p.pool, bgp_graceful_restart_timeout, p, 0, 0);
|
||||
|
||||
|
@ -319,6 +319,7 @@ struct bgp_proto {
|
||||
struct bgp_socket *sock; /* Shared listening socket */
|
||||
struct bfd_request *bfd_req; /* BFD request, if BFD is used */
|
||||
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 */
|
||||
btime last_established; /* Last time of enter/leave of established state */
|
||||
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_tx(struct birdsock *sk);
|
||||
int bgp_rx(struct birdsock *sk, uint size);
|
||||
void bgp_uncork(void *vp);
|
||||
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);
|
||||
|
||||
|
@ -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
|
||||
* @sk: socket
|
||||
@ -3189,6 +3204,7 @@ int
|
||||
bgp_rx(sock *sk, uint size)
|
||||
{
|
||||
struct bgp_conn *conn = sk->data;
|
||||
struct bgp_proto *p = conn->bgp;
|
||||
byte *pkt_start = sk->rbuf;
|
||||
byte *end = pkt_start + size;
|
||||
uint i, len;
|
||||
@ -3198,6 +3214,12 @@ bgp_rx(sock *sk, uint size)
|
||||
{
|
||||
if ((conn->state == BS_CLOSE) || (conn->sk != sk))
|
||||
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++)
|
||||
if (pkt_start[i] != 0xff)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user