]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: convert interface ipv6 nd ra-hop-limit command to NB
authorIgor Ryzhov <iryzhov@nfware.com>
Tue, 23 Jan 2024 15:20:22 +0000 (17:20 +0200)
committerIgor Ryzhov <iryzhov@nfware.com>
Sun, 28 Jan 2024 21:28:39 +0000 (23:28 +0200)
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
yang/frr-zebra.yang
zebra/rtadv.c
zebra/zebra_nb.c
zebra/zebra_nb.h
zebra/zebra_nb_config.c

index 16daee3d34108bf73cf3bfa5eb9eef09e36849d1..c68aa0fbcd8695348633de116c107236057dd363 100644 (file)
@@ -2379,6 +2379,25 @@ module frr-zebra {
             "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
                        - 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 {
           type uint16 {
             range "0..9000";
index 6f1405296284db32543438a0689d3daad238be17..6720c47f1d9054185b811192f5ac23d8fe5dc1b8 100644 (file)
@@ -1573,49 +1573,24 @@ DEFUN (no_ipv6_nd_ra_fast_retrans,
        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 (0-255)$hopcount",
-       "Interface IPv6 config commands\n"
-       "Neighbor discovery\n"
-       "Advertisement Hop Limit\n"
-       "Advertisement Hop Limit in hops (default:64)\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 = 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] ipv6 nd ra-hop-limit ![(0-255)$hopcount]",
        NO_STR
        "Interface IPv6 config commands\n"
        "Neighbor discovery\n"
        "Advertisement Hop Limit\n"
-       "Advertisement Hop Limit in hops\n")
+       "Advertisement Hop Limit in hops (default:64)\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;
+       if (!no)
+               nb_cli_enqueue_change(vty,
+                                     "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit",
+                                     NB_OP_MODIFY, hopcount_str);
+       else
+               nb_cli_enqueue_change(vty,
+                                     "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit",
+                                     NB_OP_DESTROY, NULL);
+       return nb_cli_apply_changes(vty, NULL);
 }
 
 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, &ipv6_nd_ra_retrans_interval_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_ra_interval_cmd);
        install_element(INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd);
index c3640b8ee24075470460cea27984f25c4e61e68b..b20dabdb3a5a9871b4e7729059ff179913b31d04 100644 (file)
@@ -588,6 +588,13 @@ const struct frr_yang_module_info frr_zebra_info = {
                                .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",
                        .cbs = {
index fc75740540cb5b580997d0a77eba6f1317eb0330..d3e9300ccd4a5293f90aa8867faca3242b5c4eb4 100644 (file)
@@ -195,6 +195,10 @@ int lib_interface_zebra_ipv6_router_advertisements_reachable_time_modify(
        struct nb_cb_modify_args *args);
 int lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify(
        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(
        struct nb_cb_modify_args *args);
 int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_destroy(
index 3c333147888e45be5e252733b90fd0181758530b..707e49d8c11255709cab4b39ae6e49d2b40cf098 100644 (file)
@@ -2618,6 +2618,45 @@ int lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify(
        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
  */