summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_advertise.c2
-rw-r--r--bgpd/bgp_common.h11
-rw-r--r--bgpd/bgp_peer.c50
-rw-r--r--bgpd/bgp_peer.h15
-rw-r--r--bgpd/bgp_route.c8
-rw-r--r--bgpd/bgp_session.c1
-rw-r--r--bgpd/bgp_vty.c3
-rw-r--r--bgpd/bgpd.h2
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