From 8a1fdff198cf21bc6463b7283c7e4abac73873ef Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Tue, 23 Jan 2024 18:30:29 +0200 Subject: [PATCH] zebra: convert interface ipv6 nd home-agent-preference command to NB Signed-off-by: Igor Ryzhov --- yang/frr-zebra.yang | 9 +++++++++ zebra/rtadv.c | 36 +++++++++++------------------------- zebra/zebra_nb.c | 7 +++++++ zebra/zebra_nb.h | 4 ++++ zebra/zebra_nb_config.c | 40 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 25 deletions(-) diff --git a/yang/frr-zebra.yang b/yang/frr-zebra.yang index f60b325d1e..e425fc1443 100644 --- a/yang/frr-zebra.yang +++ b/yang/frr-zebra.yang @@ -2449,6 +2449,15 @@ module frr-zebra { reference "RFC 6275: Mobility Support in IPv6"; } + leaf home-agent-preference { + type uint16; + description + "The value to be placed in the Home Agent Preference + field in the Router Advertisement messages sent by the + router."; + reference + "RFC 6275: Mobility Support in IPv6"; + } } container state { config false; diff --git a/zebra/rtadv.c b/zebra/rtadv.c index 96c7773b6a..dfab33d9f5 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -1678,37 +1678,24 @@ DEFPY_YANG (ipv6_nd_reachable_time, return nb_cli_apply_changes(vty, NULL); } -DEFUN (ipv6_nd_homeagent_preference, +DEFPY_YANG (ipv6_nd_homeagent_preference, ipv6_nd_homeagent_preference_cmd, - "ipv6 nd home-agent-preference (0-65535)", - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Home Agent preference\n" - "preference value (default is 0, least preferred)\n") -{ - int idx_number = 3; - VTY_DECLVAR_CONTEXT(interface, ifp); - struct zebra_if *zif = ifp->info; - zif->rtadv.HomeAgentPreference = - strtoul(argv[idx_number]->arg, NULL, 10); - return CMD_SUCCESS; -} - -DEFUN (no_ipv6_nd_homeagent_preference, - no_ipv6_nd_homeagent_preference_cmd, - "no ipv6 nd home-agent-preference [(0-65535)]", + "[no] ipv6 nd home-agent-preference ![(0-65535)$pref]", NO_STR "Interface IPv6 config commands\n" "Neighbor discovery\n" "Home Agent preference\n" "preference value (default is 0, least preferred)\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct zebra_if *zif = ifp->info; - - zif->rtadv.HomeAgentPreference = 0; - - return CMD_SUCCESS; + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", + NB_OP_MODIFY, pref_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); } DEFUN (ipv6_nd_homeagent_lifetime, @@ -2674,7 +2661,6 @@ void rtadv_cmd_init(void) install_element(INTERFACE_NODE, &ipv6_nd_other_config_flag_cmd); install_element(INTERFACE_NODE, &ipv6_nd_homeagent_config_flag_cmd); install_element(INTERFACE_NODE, &ipv6_nd_homeagent_preference_cmd); - install_element(INTERFACE_NODE, &no_ipv6_nd_homeagent_preference_cmd); install_element(INTERFACE_NODE, &ipv6_nd_homeagent_lifetime_cmd); install_element(INTERFACE_NODE, &no_ipv6_nd_homeagent_lifetime_cmd); install_element(INTERFACE_NODE, &ipv6_nd_adv_interval_config_option_cmd); diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index 748c791f8e..71f9ae8e7b 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -620,6 +620,13 @@ const struct frr_yang_module_info frr_zebra_info = { .modify = lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_modify, } }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", + .cbs = { + .modify = lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_modify, + .destroy = lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_destroy, + } + }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/state/up-count", .cbs = { diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index aaddfaac36..ef01f10f49 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -209,6 +209,10 @@ int lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_modify( struct nb_cb_modify_args *args); int lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_modify( struct nb_cb_modify_args *args); +int lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_modify( + struct nb_cb_modify_args *args); +int lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_destroy( + struct nb_cb_destroy_args *args); struct yang_data * lib_interface_zebra_state_up_count_get_elem(struct nb_cb_get_elem_args *args); struct yang_data * diff --git a/zebra/zebra_nb_config.c b/zebra/zebra_nb_config.c index 07cdf7f239..433b9cda75 100644 --- a/zebra/zebra_nb_config.c +++ b/zebra/zebra_nb_config.c @@ -2766,6 +2766,46 @@ int lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option return NB_OK; } +/* + * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference + */ +int lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_modify( + struct nb_cb_modify_args *args) +{ + struct interface *ifp; + struct zebra_if *zif; + uint16_t preference; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + ifp = nb_running_get_entry(args->dnode, NULL, true); + zif = ifp->info; + + preference = yang_dnode_get_uint16(args->dnode, NULL); + + zif->rtadv.HomeAgentPreference = preference; + + return NB_OK; +} + +int lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_destroy( + struct nb_cb_destroy_args *args) +{ + struct interface *ifp; + struct zebra_if *zif; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + ifp = nb_running_get_entry(args->dnode, NULL, true); + zif = ifp->info; + + zif->rtadv.HomeAgentPreference = 0; + + return NB_OK; +} + /* * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id */ -- 2.39.5