mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-31 14:11:54 +00:00
fixup! fixup! BGP runs TX as a deferred routine
This commit is contained in:
parent
24dfee88a2
commit
235ec45954
@ -1841,32 +1841,34 @@ bgp_done_prefix(struct bgp_ptx_private *c, struct bgp_prefix *px, struct bgp_buc
|
|||||||
void
|
void
|
||||||
bgp_tx_resend(struct bgp_proto *p, struct bgp_channel *bc)
|
bgp_tx_resend(struct bgp_proto *p, struct bgp_channel *bc)
|
||||||
{
|
{
|
||||||
BGP_PTX_LOCK(bc->tx, c);
|
|
||||||
|
|
||||||
ASSERT_DIE(bc->tx_keep);
|
|
||||||
uint seen = 0;
|
uint seen = 0;
|
||||||
|
|
||||||
HASH_WALK(c->prefix_hash, next, px)
|
|
||||||
{
|
{
|
||||||
if (!px->cur)
|
BGP_PTX_LOCK(bc->tx, c);
|
||||||
|
|
||||||
|
ASSERT_DIE(bc->tx_keep);
|
||||||
|
|
||||||
|
HASH_WALK(c->prefix_hash, next, px)
|
||||||
{
|
{
|
||||||
ASSERT_DIE(px->last);
|
if (!px->cur)
|
||||||
struct bgp_bucket *last = px->last;
|
{
|
||||||
|
ASSERT_DIE(px->last);
|
||||||
|
struct bgp_bucket *last = px->last;
|
||||||
|
|
||||||
/* Remove the last reference, we wanna resend the route */
|
/* Remove the last reference, we wanna resend the route */
|
||||||
px->last->px_uc--;
|
px->last->px_uc--;
|
||||||
px->last = NULL;
|
px->last = NULL;
|
||||||
|
|
||||||
/* And send it once again */
|
/* And send it once again */
|
||||||
seen += bgp_update_prefix(c, px, last);
|
seen += bgp_update_prefix(c, px, last);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
HASH_WALK_END;
|
||||||
|
|
||||||
|
if (bc->c.debug & D_EVENTS)
|
||||||
|
log(L_TRACE "%s.%s: TX resending %u routes",
|
||||||
|
bc->c.proto->name, bc->c.name, seen);
|
||||||
|
|
||||||
}
|
}
|
||||||
HASH_WALK_END;
|
|
||||||
|
|
||||||
if (bc->c.debug & D_EVENTS)
|
|
||||||
log(L_TRACE "%s.%s: TX resending %u routes",
|
|
||||||
bc->c.proto->name, bc->c.name, seen);
|
|
||||||
|
|
||||||
if (seen)
|
if (seen)
|
||||||
bgp_schedule_packet(p->conn, bc, PKT_UPDATE);
|
bgp_schedule_packet(p->conn, bc, PKT_UPDATE);
|
||||||
}
|
}
|
||||||
|
@ -1052,9 +1052,12 @@ bgp_rx_open(struct bgp_conn *conn, byte *pkt, uint len)
|
|||||||
conn->hold_time, conn->keepalive_time, p->remote_as, p->remote_id, conn->as4_session);
|
conn->hold_time, conn->keepalive_time, p->remote_as, p->remote_id, conn->as4_session);
|
||||||
|
|
||||||
bgp_schedule_packet(conn, NULL, PKT_KEEPALIVE);
|
bgp_schedule_packet(conn, NULL, PKT_KEEPALIVE);
|
||||||
bgp_start_timer(p, conn->hold_timer, conn->hold_time);
|
if (conn->sk)
|
||||||
bgp_start_timer(p, conn->send_hold_timer, conn->send_hold_time);
|
{
|
||||||
bgp_conn_enter_openconfirm_state(conn);
|
bgp_start_timer(p, conn->hold_timer, conn->hold_time);
|
||||||
|
bgp_start_timer(p, conn->send_hold_timer, conn->send_hold_time);
|
||||||
|
bgp_conn_enter_openconfirm_state(conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3186,7 +3189,8 @@ bgp_schedule_packet(struct bgp_conn *conn, struct bgp_channel *c, int type)
|
|||||||
if (was_active || (conn->sk->tpos != conn->sk->tbuf))
|
if (was_active || (conn->sk->tpos != conn->sk->tbuf))
|
||||||
return;
|
return;
|
||||||
else if ((type == PKT_KEEPALIVE) || (this_birdloop != p->p.loop))
|
else if ((type == PKT_KEEPALIVE) || (this_birdloop != p->p.loop))
|
||||||
bgp_fire_tx(conn);
|
while (bgp_fire_tx(conn) > 0)
|
||||||
|
;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct bgp_tx_deferred_call btdc = {
|
struct bgp_tx_deferred_call btdc = {
|
||||||
|
Loading…
Reference in New Issue
Block a user