summaryrefslogtreecommitdiff
path: root/pimd/pim_nb_config.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_nb_config.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_nb_config.c')
-rw-r--r--pimd/pim_nb_config.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/pimd/pim_nb_config.c b/pimd/pim_nb_config.c
index 49bd9a5ce7..328463c40e 100644
--- a/pimd/pim_nb_config.c
+++ b/pimd/pim_nb_config.c
@@ -15,6 +15,7 @@
#include "pim_pim.h"
#include "pim_mlag.h"
#include "pim_bfd.h"
+#include "pim_msdp_socket.h"
#include "pim_static.h"
#include "pim_ssm.h"
#include "pim_ssmpingd.h"
@@ -1053,6 +1054,9 @@ pim6_msdp_err(routing_control_plane_protocols_control_plane_protocol_pim_address
nb_cb_destroy_args);
pim6_msdp_err(routing_control_plane_protocols_control_plane_protocol_pim_address_family_msdp_peer_create,
nb_cb_create_args);
+pim6_msdp_err(pim_msdp_peer_authentication_type_modify, nb_cb_modify_args);
+pim6_msdp_err(pim_msdp_peer_authentication_key_modify, nb_cb_modify_args);
+pim6_msdp_err(pim_msdp_peer_authentication_key_destroy, nb_cb_destroy_args);
#if PIM_IPV != 6
/*
@@ -1154,6 +1158,81 @@ int pim_msdp_mesh_group_source_destroy(struct nb_cb_destroy_args *args)
return NB_OK;
}
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-peer/authentication-type
+ */
+int pim_msdp_peer_authentication_type_modify(struct nb_cb_modify_args *args)
+{
+ struct pim_msdp_peer *mp;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ /* NOTHING */
+ break;
+ case NB_EV_APPLY:
+ mp = nb_running_get_entry(args->dnode, NULL, true);
+ mp->auth_type = yang_dnode_get_enum(args->dnode, NULL);
+ break;
+ }
+
+ return NB_OK;
+}
+
+/*
+ * XPath:
+ * /frr-routing:routing/control-plane-protocols/control-plane-protocol/frr-pim:pim/address-family/msdp-peer/authentication-key
+ */
+int pim_msdp_peer_authentication_key_modify(struct nb_cb_modify_args *args)
+{
+ struct pim_msdp_peer *mp;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ if (strlen(yang_dnode_get_string(args->dnode, NULL)) >
+ TCP_MD5SIG_MAXKEYLEN) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "MD5 authentication key too long");
+ return NB_ERR_VALIDATION;
+ }
+ break;
+ case NB_EV_APPLY:
+ mp = nb_running_get_entry(args->dnode, NULL, true);
+ XFREE(MTYPE_PIM_MSDP_AUTH_KEY, mp->auth_key);
+ mp->auth_key = XSTRDUP(MTYPE_PIM_MSDP_AUTH_KEY,
+ yang_dnode_get_string(args->dnode, NULL));
+
+ /* We must start listening the new authentication key now. */
+ if (PIM_MSDP_PEER_IS_LISTENER(mp))
+ pim_msdp_sock_auth_listen(mp);
+ break;
+ }
+
+ return NB_OK;
+}
+
+int pim_msdp_peer_authentication_key_destroy(struct nb_cb_destroy_args *args)
+{
+ struct pim_msdp_peer *mp;
+
+ switch (args->event) {
+ case NB_EV_VALIDATE:
+ case NB_EV_PREPARE:
+ case NB_EV_ABORT:
+ /* NOTHING */
+ break;
+ case NB_EV_APPLY:
+ mp = nb_running_get_entry(args->dnode, NULL, true);
+ XFREE(MTYPE_PIM_MSDP_AUTH_KEY, mp->auth_key);
+ break;
+ }
+
+ return NB_OK;
+}
/*
* XPath: