summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2008-10-29 14:16:34 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2008-10-29 14:16:34 +0100
commite16466b379be2b94c84b351a69e63b6de5be9dc5 (patch)
treed1b33be94f4181aaaeec89597e8f09093c8bceda
parentf0ad56f4414fef2781339cfa41704f7bf4c61ad2 (diff)
downloadbird-e16466b379be2b94c84b351a69e63b6de5be9dc5.tar
bird-e16466b379be2b94c84b351a69e63b6de5be9dc5.zip
Fix race condition that breaks BGP connections after reconfigure.
RFC says that only connections in OpenConfirm and Established state should participate in connection collision detection. The current implementation leads to race condition when both sides are trying to connect at the almost same time, then both sides receive OPEN message by different connections at the almost same time and close the other connection. Both connections are closed and the both sides end in start/idle or start/active state.
-rw-r--r--proto/bgp/packets.c3
1 files changed, 0 insertions, 3 deletions
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index c18c6e4..84e6ffd 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -510,12 +510,9 @@ bgp_rx_open(struct bgp_conn *conn, byte *pkt, int len)
switch (other->state)
{
case BS_IDLE:
- break;
case BS_CONNECT:
case BS_ACTIVE:
case BS_OPENSENT:
- BGP_TRACE(D_EVENTS, "Connection collision, giving up the other connection");
- bgp_close_conn(other);
break;
case BS_OPENCONFIRM:
if ((p->local_id < id) == (conn == &p->incoming_conn))