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:
parent
f8500b5943
commit
449cd471ad
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user