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.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c
index 0bb2d93a3a..215cc3c502 100644
--- a/pimd/pim_msdp.c
+++ b/pimd/pim_msdp.c
@@ -773,7 +773,10 @@ static void pim_msdp_peer_listen(struct pim_msdp_peer *mp)
* first listening peer is configured; but don't bother tearing it down
* when
* all the peers go down */
- pim_msdp_sock_listen(mp->pim);
+ if (mp->auth_type == MSDP_AUTH_NONE)
+ pim_msdp_sock_listen(mp->pim);
+ else
+ pim_msdp_sock_auth_listen(mp);
}
/* 11.2.A4 and 11.2.A5: transition active or passive peer to
@@ -1045,6 +1048,7 @@ struct pim_msdp_peer *pim_msdp_peer_add(struct pim_instance *pim,
mp->state = PIM_MSDP_INACTIVE;
mp->fd = -1;
+ mp->auth_listen_sock = -1;
strlcpy(mp->last_reset, "-", sizeof(mp->last_reset));
/* higher IP address is listener */
if (ntohl(mp->local.s_addr) > ntohl(mp->peer.s_addr)) {
@@ -1100,6 +1104,12 @@ static void pim_msdp_peer_free(struct pim_msdp_peer *mp)
stream_fifo_free(mp->obuf);
}
+ /* Free authentication data. */
+ event_cancel(&mp->auth_listen_ev);
+ XFREE(MTYPE_PIM_MSDP_AUTH_KEY, mp->auth_key);
+ if (mp->auth_listen_sock != -1)
+ close(mp->auth_listen_sock);
+
XFREE(MTYPE_PIM_MSDP_MG_NAME, mp->mesh_group_name);
mp->pim = NULL;
@@ -1128,19 +1138,32 @@ void pim_msdp_peer_del(struct pim_msdp_peer **mp)
*mp = NULL;
}
-void pim_msdp_peer_change_source(struct pim_msdp_peer *mp,
- const struct in_addr *addr)
+void pim_msdp_peer_restart(struct pim_msdp_peer *mp)
{
- pim_msdp_peer_stop_tcp_conn(mp, true);
+ /* Stop auth listening socket if any. */
+ event_cancel(&mp->auth_listen_ev);
+ if (mp->auth_listen_sock != -1) {
+ close(mp->auth_listen_sock);
+ mp->auth_listen_sock = -1;
+ }
- mp->local = *addr;
+ /* Stop previously running connection. */
+ pim_msdp_peer_stop_tcp_conn(mp, true);
+ /* Start connection again. */
if (PIM_MSDP_PEER_IS_LISTENER(mp))
pim_msdp_peer_listen(mp);
else
pim_msdp_peer_connect(mp);
}
+void pim_msdp_peer_change_source(struct pim_msdp_peer *mp,
+ const struct in_addr *addr)
+{
+ mp->local = *addr;
+ pim_msdp_peer_restart(mp);
+}
+
/* peer hash and peer list helpers */
static unsigned int pim_msdp_peer_hash_key_make(const void *p)
{
@@ -1318,6 +1341,10 @@ bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim)
vty_out(vty, " msdp peer %pI4 source %pI4\n", &mp->peer,
&mp->local);
+ if (mp->auth_type == MSDP_AUTH_MD5)
+ vty_out(vty, " msdp peer %pI4 password %s\n", &mp->peer,
+ mp->auth_key);
+
if (mp->acl_in)
vty_out(vty, " msdp peer %pI4 sa-filter %s in\n",
&mp->peer, mp->acl_in);