summaryrefslogtreecommitdiff
path: root/pimd/pim_msdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_msdp.c')
-rw-r--r--pimd/pim_msdp.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c
index a536ab6fe0..ae887b2482 100644
--- a/pimd/pim_msdp.c
+++ b/pimd/pim_msdp.c
@@ -734,6 +734,10 @@ static void pim_msdp_peer_state_chg_log(struct pim_msdp_peer *mp)
* a tcp connection will be made */
static void pim_msdp_peer_connect(struct pim_msdp_peer *mp)
{
+ /* Stop here if we are shutdown. */
+ if (mp->pim->msdp.shutdown)
+ return;
+
mp->state = PIM_MSDP_CONNECTING;
if (pim_msdp_log_neighbor_events(mp->pim))
pim_msdp_peer_state_chg_log(mp);
@@ -744,6 +748,10 @@ static void pim_msdp_peer_connect(struct pim_msdp_peer *mp)
/* 11.2.A3: passive peer - just listen for connections */
static void pim_msdp_peer_listen(struct pim_msdp_peer *mp)
{
+ /* Stop here if we are shutdown. */
+ if (mp->pim->msdp.shutdown)
+ return;
+
mp->state = PIM_MSDP_LISTEN;
if (pim_msdp_log_neighbor_events(mp->pim))
pim_msdp_peer_state_chg_log(mp);
@@ -1311,6 +1319,9 @@ bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim)
written = true;
}
+ if (pim->msdp.shutdown)
+ vty_out(vty, " msdp shutdown\n");
+
return written;
}
@@ -1431,3 +1442,42 @@ struct pim_msdp_mg_mbr *pim_msdp_mg_mbr_add(struct pim_instance *pim,
return mbr;
}
+
+void pim_msdp_shutdown(struct pim_instance *pim, bool state)
+{
+ struct pim_msdp_peer *peer;
+ struct listnode *node;
+
+ /* Same value nothing to do. */
+ if (pim->msdp.shutdown == state)
+ return;
+
+ if (state) {
+ pim->msdp.shutdown = true;
+
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.peer_list, node, peer)) {
+ /* Stop the tcp connection and shutdown all timers */
+ pim_msdp_peer_stop_tcp_conn(peer, true);
+
+ /* Stop listening socket if any. */
+ event_cancel(&peer->auth_listen_ev);
+ if (peer->auth_listen_sock != -1)
+ close(peer->auth_listen_sock);
+
+ /* Disable and remove listener flag. */
+ UNSET_FLAG(pim->msdp.flags, PIM_MSDPF_ENABLE | PIM_MSDPF_LISTENER);
+ }
+ } else {
+ pim->msdp.shutdown = false;
+
+ for (ALL_LIST_ELEMENTS_RO(pim->msdp.peer_list, node, peer)) {
+ /* Start connection again. */
+ if (PIM_MSDP_PEER_IS_LISTENER(peer))
+ pim_msdp_peer_listen(peer);
+ else
+ pim_msdp_peer_connect(peer);
+
+ SET_FLAG(pim->msdp.flags, PIM_MSDPF_ENABLE);
+ }
+ }
+}