diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h index 0a5d371..c51bed3 100644 --- a/bgpd/bgp_fsm.h +++ b/bgpd/bgp_fsm.h @@ -25,77 +25,55 @@ #define _QUAGGA_BGP_FSM_H /* Macro for BGP read, write and timer thread. */ #define BGP_READ_ON(T,F,V) \ do { \ - if (!T) \ - { \ - peer_lock (peer); \ - THREAD_READ_ON(master,T,F,peer,V); \ - } \ + if (!(T) && (peer->status != Deleted)) \ + THREAD_READ_ON(master,T,F,peer,V); \ } while (0) #define BGP_READ_OFF(T) \ do { \ if (T) \ - { \ - peer_unlock (peer); \ - THREAD_READ_OFF(T); \ - } \ + THREAD_READ_OFF(T); \ } while (0) #define BGP_WRITE_ON(T,F,V) \ do { \ if (!(T) && (peer->status != Deleted)) \ - { \ - peer_lock (peer); \ - THREAD_WRITE_ON(master,(T),(F),peer,(V)); \ - } \ + THREAD_WRITE_ON(master,(T),(F),peer,(V)); \ } while (0) #define BGP_WRITE_OFF(T) \ do { \ if (T) \ - { \ - peer_unlock (peer); \ - THREAD_WRITE_OFF(T); \ - } \ + THREAD_WRITE_OFF(T); \ } while (0) #define BGP_TIMER_ON(T,F,V) \ do { \ if (!(T) && (peer->status != Deleted)) \ - { \ - peer_lock (peer); \ - THREAD_TIMER_ON(master,(T),(F),peer,(V)); \ - } \ + THREAD_TIMER_ON(master,(T),(F),peer,(V)); \ } while (0) #define BGP_TIMER_OFF(T) \ do { \ if (T) \ - { \ - peer_unlock (peer); \ - THREAD_TIMER_OFF(T); \ - } \ + THREAD_TIMER_OFF(T); \ } while (0) #define BGP_EVENT_ADD(P,E) \ do { \ if ((P)->status != Deleted) \ - { \ - peer_lock (peer); /* bgp event reference */ \ - thread_add_event (master, bgp_event, (P), (E)); \ - } \ + thread_add_event (master, bgp_event, (P), (E)); \ } while (0) -#define BGP_EVENT_DELETE(P) \ +#define BGP_EVENT_FLUSH(P) \ do { \ - peer_unlock (peer); /* bgp event peer reference */ \ assert (peer); \ thread_cancel_event (master, (P)); \ } while (0) #define BGP_EVENT_FLUSH_ADD(P,E) \ do { \ - BGP_EVENT_DELETE(P); \ + BGP_EVENT_FLUSH(P); \ BGP_EVENT_ADD(P,E); \ } while (0) diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 733b33a..89f8262 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -695,6 +695,7 @@ peer_free (struct peer *peer) bgp_timer_set (peer); BGP_READ_OFF (peer->t_read); BGP_WRITE_OFF (peer->t_write); + BGP_EVENT_FLUSH (peer); if (peer->desc) XFREE (MTYPE_PEER_DESC, peer->desc);