diff options
-rw-r--r-- | bgpd/bgp_advertise.c | 2 | ||||
-rw-r--r-- | bgpd/bgp_common.h | 11 | ||||
-rw-r--r-- | bgpd/bgp_peer.c | 50 | ||||
-rw-r--r-- | bgpd/bgp_peer.h | 15 | ||||
-rw-r--r-- | bgpd/bgp_route.c | 8 | ||||
-rw-r--r-- | bgpd/bgp_session.c | 1 | ||||
-rw-r--r-- | bgpd/bgp_vty.c | 3 | ||||
-rw-r--r-- | bgpd/bgpd.h | 2 |
8 files changed, 52 insertions, 40 deletions
diff --git a/bgpd/bgp_advertise.c b/bgpd/bgp_advertise.c index 87eb7ac7..23740a68 100644 --- a/bgpd/bgp_advertise.c +++ b/bgpd/bgp_advertise.c @@ -300,7 +300,7 @@ bgp_adj_out_unset (struct bgp_node *rn, struct peer *peer, struct prefix *p, FIFO_ADD (&peer->sync[afi][safi]->withdraw, &adv->fifo); /* Schedule packet write. */ - BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd); + bgp_write(peer); } else { diff --git a/bgpd/bgp_common.h b/bgpd/bgp_common.h index bca64376..221b255a 100644 --- a/bgpd/bgp_common.h +++ b/bgpd/bgp_common.h @@ -114,17 +114,6 @@ enum bgp_session_events bgp_session_eDiscard, /* discarded by sibling */ } ; -typedef enum bgp_peer_states bgp_peer_state_t ; -enum bgp_peer_states -{ - bgp_peer_min_state = 0, - - bgp_peer_disabled = 0, /* peer disabled */ - bgp_peer_enabled = 1, /* peer enabled */ - - bgp_peer_max_state = 1 -} ; - /*============================================================================== * Other common types and .... */ diff --git a/bgpd/bgp_peer.c b/bgpd/bgp_peer.c index c959c958..3d1c6a7c 100644 --- a/bgpd/bgp_peer.c +++ b/bgpd/bgp_peer.c @@ -61,7 +61,6 @@ static int bgp_session_has_established(bgp_peer peer); static int bgp_session_has_stopped(bgp_peer peer); static int bgp_session_has_disabled(bgp_peer peer); -static int bgp_peer_stop (struct peer *peer) ; static void bgp_uptime_reset (struct peer *peer); static int bgp_routeadv_timer (struct thread *thread); static int bgp_graceful_restart_timer_expire (struct thread *thread); @@ -160,6 +159,7 @@ bgp_session_has_established(bgp_peer peer) assert(session->state == bgp_session_sEnabled) ; session->state = bgp_session_sEstablished ; + peer_change_status (peer, Established); /* update peer state from received open */ bgp_peer_open_state_receive(peer); @@ -273,13 +273,8 @@ bgp_session_has_stopped(bgp_peer peer) bgp_session session = peer->session ; assert(bgp_session_is_active(session)) ; - - bgp_session_disable(peer, NULL) ; /* does nothing if already sLimping */ - - /* TODO: needs to kick off the process of withdrawing routes etc. */ + bgp_peer_reenable(peer, NULL); /* TODO: needs to deal with NOTIFICATION, if any ?? */ - /* TODO: needs to automatically re-enable the peering ?? */ - bgp_peer_stop(peer) ; return 0; } @@ -313,7 +308,7 @@ bgp_session_has_disabled(bgp_peer peer) /* Administrative BGP peer stop event. */ /* May be called multiple times for the same peer */ -static int +int bgp_peer_stop (struct peer *peer) { afi_t afi; @@ -469,6 +464,7 @@ bgp_timer_set (struct peer *peer) BGP_TIMER_OFF (peer->t_routeadv); break; +#if 0 case Connect: /* After start timer is expired, the peer moves to Connnect status. Make sure start timer is off and connect timer is @@ -495,6 +491,7 @@ bgp_timer_set (struct peer *peer) BGP_TIMER_OFF (peer->t_asorig); BGP_TIMER_OFF (peer->t_routeadv); break; +#endif case Established: /* In Established status start and connect timer is turned @@ -657,7 +654,6 @@ peer_new (struct bgp *bgp) peer = XCALLOC (MTYPE_BGP_PEER, sizeof (struct peer)); /* Set default value. */ - peer->fd = -1; peer->v_start = BGP_INIT_START_TIMER; peer->v_connect = BGP_DEFAULT_CONNECT_RETRY; peer->v_asorig = BGP_DEFAULT_ASORIGINATE; @@ -797,8 +793,7 @@ peer_delete (struct peer *peer) */ peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE; bgp_peer_stop (peer); - /* TODO: Deleted status */ - /* bgp_fsm_change_status (peer, Deleted); */ + peer_change_status (peer, Deleted); /* Password configuration */ if (peer->password) @@ -888,9 +883,6 @@ peer_delete (struct peer *peer) peer->default_rmap[afi][safi].name = NULL; } - /* unregister */ - bgp_peer_index_deregister(peer, &peer->su); - peer_unlock (peer); /* initial reference */ return 0; @@ -911,6 +903,9 @@ peer_free (struct peer *peer) BGP_WRITE_OFF (peer->t_write); BGP_EVENT_FLUSH (peer); + /* unregister */ + bgp_peer_index_deregister(peer, &peer->su); + if (peer->desc) XFREE (MTYPE_PEER_DESC, peer->desc); @@ -985,7 +980,6 @@ bgp_peer_enable(bgp_peer peer) { /* enable the session */ bgp_session_enable(peer); - peer->state = bgp_peer_enabled; } /* disable the peer @@ -999,5 +993,29 @@ bgp_peer_disable(bgp_peer peer, bgp_notify notification) /* and the peer */ bgp_peer_stop(peer); - peer->state = bgp_peer_disabled; + peer_change_status (peer, Clearing); +} + +/* Called after event occurred, this function change status and reset + read/write and timer thread. */ +void +peer_change_status (bgp_peer peer, int status) +{ + bgp_dump_state (peer, peer->status, status); + + /* Transition into Clearing or Deleted must /always/ clear all routes.. + * (and must do so before actually changing into Deleted.. + */ + if (status >= Clearing) + bgp_clear_route_all (peer); + + /* Preserve old status and change into new status. */ + peer->ostatus = peer->status; + peer->status = status; + + if (BGP_DEBUG (normal, NORMAL)) + zlog_debug ("%s went from %s to %s", + peer->host, + LOOKUP (bgp_status_msg, peer->ostatus), + LOOKUP (bgp_status_msg, peer->status)); } diff --git a/bgpd/bgp_peer.h b/bgpd/bgp_peer.h index 2a8eb78a..b16543d4 100644 --- a/bgpd/bgp_peer.h +++ b/bgpd/bgp_peer.h @@ -143,18 +143,12 @@ struct peer /* Packet receive buffer. */ struct stream *ibuf; - /* TODO: kill - kludge to get things to compile */ -#if 1 struct stream_fifo *obuf; struct stream *work; - int fd; - unsigned long packet_size; -#endif /* Status of the peer. */ - int status; - int ostatus; - bgp_peer_state_t state; + int status; /* Current status */ + int ostatus; /* Old status */ /* Peer index, used for dumping TABLE_DUMP_V2 format */ uint16_t table_dump_index; @@ -480,6 +474,11 @@ bgp_peer_enable(bgp_peer peer); extern void bgp_peer_disable(bgp_peer peer, bgp_notify notification); +extern int bgp_peer_stop (struct peer *peer) ; + +extern void +peer_change_status (bgp_peer peer, int status); + extern struct peer * peer_new (struct bgp *bgp); diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 39aab2c3..46a8cb12 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2723,9 +2723,11 @@ bgp_clear_node_complete (struct work_queue *wq) { struct peer *peer = wq->spec.data; - /* Tickle FSM to start moving again */ - /* TODO: Clearing status */ - /* BGP_EVENT_ADD (peer, Clearing_Completed); */ + /* Flush the event queue and ensure the peer is shut down */ + bgp_peer_stop(peer); + BGP_EVENT_FLUSH (peer); + if (peer->status == Clearing) + peer_change_status (peer, Idle); peer_unlock (peer); /* bgp_clear_route */ } diff --git a/bgpd/bgp_session.c b/bgpd/bgp_session.c index 2b22b596..f7af093f 100644 --- a/bgpd/bgp_session.c +++ b/bgpd/bgp_session.c @@ -281,7 +281,6 @@ bgp_session_enable(bgp_peer peer) /* su_remote set when session Established */ /* Routeing Engine does the state change now. */ - session->state = bgp_session_sEnabled ; /* Now pass the session to the BGP Engine, which will set about */ /* making and running a connection to the peer. */ diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c index c679d93d..b94f4abd 100644 --- a/bgpd/bgp_vty.c +++ b/bgpd/bgp_vty.c @@ -7305,6 +7305,8 @@ bgp_show_peer (struct vty *vty, struct peer *p) if (p->status == Established) vty_out (vty, ", up for %8s", peer_uptime (p->uptime, timebuf, BGP_UPTIME_LEN)); + /* TODO: what is state "Active" now? sEnabled? */ +#if 0 else if (p->status == Active) { if (CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE)) @@ -7312,6 +7314,7 @@ bgp_show_peer (struct vty *vty, struct peer *p) else if (CHECK_FLAG (p->sflags, PEER_STATUS_NSF_WAIT)) vty_out (vty, " (NSF passive)"); } +#endif vty_out (vty, "%s", VTY_NEWLINE); /* read timer */ diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index bab5215b..94a372c1 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -273,10 +273,12 @@ struct bgp_nlri /* BGP finite state machine status. */ #define Idle 1 +/* Obsolete #define Connect 2 #define Active 3 #define OpenSent 4 #define OpenConfirm 5 +*/ #define Established 6 #define Clearing 7 #define Deleted 8 |