From dcdf399fbc7420d3edc230c9646f720825fcecda Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Sun, 15 Oct 2006 23:39:59 +0000 Subject: [bgpd] Bug #302 fixes. ClearingCompleted event gets flushed, leaving peers stuck in Clearing. 2006-10-14 Paul Jakma * bgp_fsm.h: Remove BGP_EVENT_FLUSH_ADD, dangerous and not needed. * bgp_fsm.c: (bgp_stop) Move BGP_EVENT_FLUSH to the top of the of the function, otherwise it could flush a ClearingCompleted event, bug #302. * bgp_packet.c: Replace all BGP_EVENT_FLUSH_ADD with BGP_EVENT_ADD, fixing bug #302. --- bgpd/ChangeLog | 10 ++++++++++ bgpd/bgp_fsm.c | 6 +++--- bgpd/bgp_fsm.h | 6 ------ bgpd/bgp_packet.c | 8 ++++---- 4 files changed, 17 insertions(+), 13 deletions(-) (limited to 'bgpd') diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 2294f89a..c33562da 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -1,3 +1,13 @@ +2006-10-14 Paul Jakma + + * bgp_fsm.h: Remove BGP_EVENT_FLUSH_ADD, dangerous and not + needed. + * bgp_fsm.c: (bgp_stop) Move BGP_EVENT_FLUSH to the top of the + of the function, otherwise it could flush a ClearingCompleted + event, bug #302. + * bgp_packet.c: Replace all BGP_EVENT_FLUSH_ADD with + BGP_EVENT_ADD, fixing bug #302. + 2006-09-19 Andrew J. Schorr * bgpd.c: (peer_uptime) Fix printf format/arg mismatch in diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c index cc2b2c3a..ef8dfea4 100644 --- a/bgpd/bgp_fsm.c +++ b/bgpd/bgp_fsm.c @@ -428,6 +428,9 @@ bgp_stop (struct peer *peer) safi_t safi; char orf_name[BUFSIZ]; + /* Delete all existing events of the peer */ + BGP_EVENT_FLUSH (peer); + /* Increment Dropped count. */ if (peer->status == Established) { @@ -499,9 +502,6 @@ bgp_stop (struct peer *peer) BGP_TIMER_OFF (peer->t_asorig); BGP_TIMER_OFF (peer->t_routeadv); - /* Delete all existing events of the peer */ - BGP_EVENT_FLUSH (peer); - /* Stream reset. */ peer->packet_size = 0; diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h index c51bed37..a749f8ea 100644 --- a/bgpd/bgp_fsm.h +++ b/bgpd/bgp_fsm.h @@ -71,12 +71,6 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA thread_cancel_event (master, (P)); \ } while (0) -#define BGP_EVENT_FLUSH_ADD(P,E) \ - do { \ - BGP_EVENT_FLUSH(P); \ - BGP_EVENT_ADD(P,E); \ - } while (0) - /* Prototypes. */ extern int bgp_event (struct thread *); extern int bgp_stop (struct peer *peer); diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index da59d329..cf6d00f1 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -637,7 +637,7 @@ bgp_write (struct thread *thread) if (write_errno == EWOULDBLOCK || write_errno == EAGAIN) break; - BGP_EVENT_FLUSH_ADD (peer, TCP_fatal_error); + BGP_EVENT_ADD (peer, TCP_fatal_error); return 0; } if (num != writenum) @@ -672,7 +672,7 @@ bgp_write (struct thread *thread) peer->v_start = (60 * 2); /* Flush any existing events */ - BGP_EVENT_FLUSH_ADD (peer, BGP_Stop); + BGP_EVENT_ADD (peer, BGP_Stop); return 0; case BGP_MSG_KEEPALIVE: peer->keepalive_out++; @@ -717,7 +717,7 @@ bgp_write_notify (struct peer *peer) ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s)); if (ret <= 0) { - BGP_EVENT_FLUSH_ADD (peer, TCP_fatal_error); + BGP_EVENT_ADD (peer, TCP_fatal_error); return 0; } @@ -737,7 +737,7 @@ bgp_write_notify (struct peer *peer) if (peer->v_start >= (60 * 2)) peer->v_start = (60 * 2); - BGP_EVENT_FLUSH_ADD (peer, BGP_Stop); + BGP_EVENT_ADD (peer, BGP_Stop); return 0; } -- cgit v1.2.1