diff options
Diffstat (limited to 'pimd/pim_msdp.c')
| -rw-r--r-- | pimd/pim_msdp.c | 50 |
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); + } + } +} |
