diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2021-10-14 12:12:37 -0300 | 
|---|---|---|
| committer | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2023-04-19 09:15:01 -0300 | 
| commit | c262df828b2475632f590c256db677b424d868c7 (patch) | |
| tree | 85a8ab1e5ff016e9cdc28e18f91d263a207c8d32 /ripd/rip_nb_config.c | |
| parent | fec51f2e2be021108dc1de4dd1ea89516082eaf7 (diff) | |
ripd: support BFD integration
Implement RIP peer monitoring with BFD.
RFC 5882 Generic Application of Bidirectional Forwarding Detection
(BFD), Section 10.3 Interactions with RIP.
Co-authored-by: Renato Westphal <renato@opensourcerouting.org>
Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
Diffstat (limited to 'ripd/rip_nb_config.c')
| -rw-r--r-- | ripd/rip_nb_config.c | 135 | 
1 files changed, 135 insertions, 0 deletions
diff --git a/ripd/rip_nb_config.c b/ripd/rip_nb_config.c index 343bb9bb57..cbc62f9f1f 100644 --- a/ripd/rip_nb_config.c +++ b/ripd/rip_nb_config.c @@ -23,6 +23,9 @@  #include "ripd/rip_nb.h"  #include "ripd/rip_debug.h"  #include "ripd/rip_interface.h" +#include "ripd/rip_bfd.h" + +DEFINE_MTYPE_STATIC(RIPD, RIP_BFD_PROFILE, "RIP BFD profile name");  /*   * XPath: /frr-ripd:ripd/instance @@ -906,6 +909,40 @@ int ripd_instance_version_send_modify(struct nb_cb_modify_args *args)  }  /* + * XPath: /frr-ripd:ripd/instance/default-bfd-profile + */ +int ripd_instance_default_bfd_profile_modify(struct nb_cb_modify_args *args) +{ +	struct rip *rip; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	rip = nb_running_get_entry(args->dnode, NULL, true); +	XFREE(MTYPE_RIP_BFD_PROFILE, rip->default_bfd_profile); +	rip->default_bfd_profile = +		XSTRDUP(MTYPE_RIP_BFD_PROFILE, +			yang_dnode_get_string(args->dnode, NULL)); +	rip_bfd_instance_update(rip); + +	return NB_OK; +} + +int ripd_instance_default_bfd_profile_destroy(struct nb_cb_destroy_args *args) +{ +	struct rip *rip; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	rip = nb_running_get_entry(args->dnode, NULL, true); +	XFREE(MTYPE_RIP_BFD_PROFILE, rip->default_bfd_profile); +	rip_bfd_instance_update(rip); + +	return NB_OK; +} + +/*   * XPath: /frr-interface:lib/interface/frr-ripd:rip/split-horizon   */  int lib_interface_rip_split_horizon_modify(struct nb_cb_modify_args *args) @@ -1071,6 +1108,104 @@ int lib_interface_rip_authentication_password_destroy(  }  /* + * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring + */ +int lib_interface_rip_bfd_create(struct nb_cb_create_args *args) +{ +	struct interface *ifp; +	struct rip_interface *ri; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	ifp = nb_running_get_entry(args->dnode, NULL, true); +	ri = ifp->info; +	ri->bfd.enabled = yang_dnode_get_bool(args->dnode, "./enable"); +	XFREE(MTYPE_RIP_BFD_PROFILE, ri->bfd.profile); +	if (yang_dnode_exists(args->dnode, "./profile")) +		ri->bfd.profile = XSTRDUP( +			MTYPE_RIP_BFD_PROFILE, +			yang_dnode_get_string(args->dnode, "./profile")); + +	rip_bfd_interface_update(ri); + +	return NB_OK; +} + +int lib_interface_rip_bfd_destroy(struct nb_cb_destroy_args *args) +{ +	struct interface *ifp; +	struct rip_interface *ri; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	ifp = nb_running_get_entry(args->dnode, NULL, true); +	ri = ifp->info; +	ri->bfd.enabled = false; +	XFREE(MTYPE_RIP_BFD_PROFILE, ri->bfd.profile); +	rip_bfd_interface_update(ri); + +	return NB_OK; +} + +/* + * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/enable + */ +int lib_interface_rip_bfd_enable_modify(struct nb_cb_modify_args *args) +{ +	struct interface *ifp; +	struct rip_interface *ri; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	ifp = nb_running_get_entry(args->dnode, NULL, true); +	ri = ifp->info; +	ri->bfd.enabled = yang_dnode_get_bool(args->dnode, NULL); +	rip_bfd_interface_update(ri); + +	return NB_OK; +} + +/* + * XPath: /frr-interface:lib/interface/frr-ripd:rip/bfd-monitoring/profile + */ +int lib_interface_rip_bfd_profile_modify(struct nb_cb_modify_args *args) +{ +	struct interface *ifp; +	struct rip_interface *ri; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	ifp = nb_running_get_entry(args->dnode, NULL, true); +	ri = ifp->info; +	XFREE(MTYPE_RIP_BFD_PROFILE, ri->bfd.profile); +	ri->bfd.profile = XSTRDUP(MTYPE_RIP_BFD_PROFILE, +				  yang_dnode_get_string(args->dnode, NULL)); +	rip_bfd_interface_update(ri); + +	return NB_OK; +} + +int lib_interface_rip_bfd_profile_destroy(struct nb_cb_destroy_args *args) +{ +	struct interface *ifp; +	struct rip_interface *ri; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	ifp = nb_running_get_entry(args->dnode, NULL, true); +	ri = ifp->info; +	XFREE(MTYPE_RIP_BFD_PROFILE, ri->bfd.profile); +	rip_bfd_interface_update(ri); + +	return NB_OK; +} + +/*   * XPath: /frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain   */  int lib_interface_rip_authentication_key_chain_modify(  | 
