zebra: convert interface ipv6 nd ra-hop-limit command to NB

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2024-01-23 17:20:22 +02:00
parent 224429da6f
commit a4fee0cb52
5 changed files with 81 additions and 38 deletions

View File

@ -2379,6 +2379,25 @@ module frr-zebra {
"RFC 4861: Neighbor Discovery for IP version 6 (IPv6) "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
- AdvRetransTimer"; - AdvRetransTimer";
} }
leaf cur-hop-limit {
type uint8;
description
"The value to be placed in the Cur Hop Limit field in
the Router Advertisement messages sent by the router.
A value of zero means unspecified (by this router).
If this parameter is not configured, the device SHOULD
use the IANA-specified value for the default IPv4
Time to Live (TTL) parameter that was in effect at the
time of implementation.";
reference
"RFC 3232: Assigned Numbers: RFC 1700 is Replaced by
an On-line Database
RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
- AdvCurHopLimit
IANA: IP Parameters
(https://www.iana.org/assignments/ip-parameters)";
}
leaf default-lifetime { leaf default-lifetime {
type uint16 { type uint16 {
range "0..9000"; range "0..9000";

View File

@ -1573,49 +1573,24 @@ DEFUN (no_ipv6_nd_ra_fast_retrans,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFPY (ipv6_nd_ra_hop_limit, DEFPY_YANG (ipv6_nd_ra_hop_limit,
ipv6_nd_ra_hop_limit_cmd, ipv6_nd_ra_hop_limit_cmd,
"ipv6 nd ra-hop-limit (0-255)$hopcount", "[no] ipv6 nd ra-hop-limit ![(0-255)$hopcount]",
NO_STR
"Interface IPv6 config commands\n" "Interface IPv6 config commands\n"
"Neighbor discovery\n" "Neighbor discovery\n"
"Advertisement Hop Limit\n" "Advertisement Hop Limit\n"
"Advertisement Hop Limit in hops (default:64)\n") "Advertisement Hop Limit in hops (default:64)\n")
{ {
VTY_DECLVAR_CONTEXT(interface, ifp); if (!no)
struct zebra_if *zif = ifp->info; nb_cli_enqueue_change(vty,
"./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit",
if (if_is_loopback(ifp)) { NB_OP_MODIFY, hopcount_str);
vty_out(vty, else
"Cannot configure IPv6 Router Advertisements on this interface\n"); nb_cli_enqueue_change(vty,
return CMD_WARNING_CONFIG_FAILED; "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit",
} NB_OP_DESTROY, NULL);
return nb_cli_apply_changes(vty, NULL);
zif->rtadv.AdvCurHopLimit = hopcount;
return CMD_SUCCESS;
}
DEFPY (no_ipv6_nd_ra_hop_limit,
no_ipv6_nd_ra_hop_limit_cmd,
"no ipv6 nd ra-hop-limit [(0-255)]",
NO_STR
"Interface IPv6 config commands\n"
"Neighbor discovery\n"
"Advertisement Hop Limit\n"
"Advertisement Hop Limit in hops\n")
{
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
if (if_is_loopback(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
}
zif->rtadv.AdvCurHopLimit = RTADV_DEFAULT_HOPLIMIT;
return CMD_SUCCESS;
} }
DEFPY_YANG (ipv6_nd_ra_retrans_interval, DEFPY_YANG (ipv6_nd_ra_retrans_interval,
@ -2740,7 +2715,6 @@ void rtadv_cmd_init(void)
install_element(INTERFACE_NODE, &no_ipv6_nd_ra_fast_retrans_cmd); install_element(INTERFACE_NODE, &no_ipv6_nd_ra_fast_retrans_cmd);
install_element(INTERFACE_NODE, &ipv6_nd_ra_retrans_interval_cmd); install_element(INTERFACE_NODE, &ipv6_nd_ra_retrans_interval_cmd);
install_element(INTERFACE_NODE, &ipv6_nd_ra_hop_limit_cmd); install_element(INTERFACE_NODE, &ipv6_nd_ra_hop_limit_cmd);
install_element(INTERFACE_NODE, &no_ipv6_nd_ra_hop_limit_cmd);
install_element(INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd); install_element(INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd);
install_element(INTERFACE_NODE, &ipv6_nd_ra_interval_cmd); install_element(INTERFACE_NODE, &ipv6_nd_ra_interval_cmd);
install_element(INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd); install_element(INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd);

View File

@ -588,6 +588,13 @@ const struct frr_yang_module_info frr_zebra_info = {
.modify = lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify, .modify = lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify,
} }
}, },
{
.xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit",
.cbs = {
.modify = lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_modify,
.destroy = lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_destroy,
}
},
{ {
.xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-lifetime",
.cbs = { .cbs = {

View File

@ -195,6 +195,10 @@ int lib_interface_zebra_ipv6_router_advertisements_reachable_time_modify(
struct nb_cb_modify_args *args); struct nb_cb_modify_args *args);
int lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify( int lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify(
struct nb_cb_modify_args *args); struct nb_cb_modify_args *args);
int lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_modify(
struct nb_cb_modify_args *args);
int lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_destroy(
struct nb_cb_destroy_args *args);
int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_modify( int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_modify(
struct nb_cb_modify_args *args); struct nb_cb_modify_args *args);
int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_destroy( int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_destroy(

View File

@ -2618,6 +2618,45 @@ int lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify(
return NB_OK; return NB_OK;
} }
/*
* XPath: /frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit
*/
int lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_modify(
struct nb_cb_modify_args *args)
{
struct interface *ifp;
struct zebra_if *zif;
uint8_t limit;
if (args->event != NB_EV_APPLY)
return NB_OK;
ifp = nb_running_get_entry(args->dnode, NULL, true);
zif = ifp->info;
limit = yang_dnode_get_uint8(args->dnode, NULL);
zif->rtadv.AdvCurHopLimit = limit;
return NB_OK;
}
int lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_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.AdvCurHopLimit = RTADV_DEFAULT_HOPLIMIT;
return NB_OK;
}
/* /*
* XPath: /frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-lifetime * XPath: /frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-lifetime
*/ */