summaryrefslogtreecommitdiff
path: root/pimd/pim_msdp.c
diff options
context:
space:
mode:
authorRafael Zalamena <rzalamena@opensourcerouting.org>2022-12-07 10:13:39 -0300
committerRafael Zalamena <rzalamena@opensourcerouting.org>2024-07-29 11:40:53 -0300
commitbd838d8c896140ae43b41bb7f8fcf88a26ec5a0f (patch)
tree72fa3700df1255d5f46ca7fc50eae16e80d9ae7c /pimd/pim_msdp.c
parent13126dec147ec7c8f94ca2adb870e5b6646fb3bb (diff)
pimd: add support for MSDP authentication
Implement MSDP MD5 authentication connection support. Implementation details: - Move the MSDP socket creation code to a generic function so it can be parametrized to be used with/without authentication. - The MSDP peer connection will not change when the configuration is set, instead it will only be applied next connection or when `clear ip msdp peer A.B.C.D` is called. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
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);