]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: convert interface link-params packet-loss command to NB
authorIgor Ryzhov <iryzhov@nfware.com>
Sat, 20 Jan 2024 01:55:42 +0000 (03:55 +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>
lib/if.h
yang/frr-zebra.yang
zebra/interface.c
zebra/zebra_nb.c
zebra/zebra_nb.h
zebra/zebra_nb_config.c

index fd5f6f7502e611e778d521c2c890c6ab0748bdaf..548a91b9480d5b6ee166a93033bf401b7b0843d2 100644 (file)
--- a/lib/if.h
+++ b/lib/if.h
@@ -195,7 +195,7 @@ struct if_link_params {
        uint32_t min_delay;             /* Link Min Delay */
        uint32_t max_delay;             /* Link Max Delay */
        uint32_t delay_var;             /* Link Delay Variation */
-       float pkt_loss;                 /* Link Packet Loss */
+       uint32_t pkt_loss;              /* Link Packet Loss */
        float res_bw;                   /* Residual Bandwidth */
        float ava_bw;                   /* Available Bandwidth */
        float use_bw;                   /* Utilized Bandwidth */
index 905a1409a648f5e8c62889acd90b3b43bfa2d721..d876c90bf72312eeb982404323330bef597bb393 100644 (file)
@@ -2206,6 +2206,14 @@ module frr-zebra {
           description
             "Unidirectional Delay Variation";
         }
+        leaf packet-loss {
+          type decimal64 {
+            fraction-digits 6;
+            range "0..50.331642";
+          }
+          description
+            "Unidirectional Link Packet Loss";
+        }
         // TODO -- other link-params options
         // for (experimental/partial TE use in IGP extensions)
       }
index 3cfde74ea1f95ec5d2f0d2ab840b03d9f8b91c0b..9c8c9e0125aa884fb62c706e58090dd81085dd0c 100644 (file)
@@ -2877,8 +2877,8 @@ static void if_dump_vty(struct vty *vty, struct interface *ifp)
                                "    Link Delay Variation %u (micro-sec.)\n",
                                iflp->delay_var);
                if (IS_PARAM_SET(iflp, LP_PKT_LOSS))
-                       vty_out(vty, "    Link Packet Loss %g (in %%)\n",
-                               iflp->pkt_loss);
+                       vty_out(vty, "    Link Packet Loss %f (in %%)\n",
+                               (double)iflp->pkt_loss * LOSS_PRECISION);
                if (IS_PARAM_SET(iflp, LP_AVA_BW))
                        vty_out(vty, "    Available Bandwidth %g (Byte/s)\n",
                                iflp->ava_bw);
@@ -3278,7 +3278,8 @@ static void if_dump_vty_json(struct vty *vty, struct interface *ifp,
                                            iflp->delay_var);
                if (IS_PARAM_SET(iflp, LP_PKT_LOSS))
                        json_object_double_add(json_te, "linkPacketLoss",
-                                              iflp->pkt_loss);
+                                              (double)iflp->pkt_loss *
+                                                      LOSS_PRECISION);
                if (IS_PARAM_SET(iflp, LP_AVA_BW))
                        json_object_double_add(json_te, "availableBandwidth",
                                               iflp->ava_bw);
@@ -4205,47 +4206,20 @@ DEFPY_YANG (link_params_delay_var,
        return nb_cli_apply_changes(vty, NULL);
 }
 
-DEFUN (link_params_pkt_loss,
-       link_params_pkt_loss_cmd,
-       "packet-loss PERCENTAGE",
-       "Unidirectional Link Packet Loss\n"
-       "percentage of total traffic by 0.000003% step and less than 50.331642%\n")
+DEFPY_YANG(
+       link_params_pkt_loss, link_params_pkt_loss_cmd,
+       "[no] packet-loss ![PERCENTAGE]",
+       NO_STR
+       "Unidirectional Link Packet Loss\n"
+       "percentage of total traffic by 0.000003% step and less than 50.331642%\n")
 {
-       int idx_percentage = 1;
-       VTY_DECLVAR_CONTEXT(interface, ifp);
-       struct if_link_params *iflp = if_link_params_get(ifp);
-       float fval;
-
-       if (sscanf(argv[idx_percentage]->arg, "%g", &fval) != 1) {
-               vty_out(vty, "link_params_pkt_loss: fscanf: %s\n",
-                       safe_strerror(errno));
-               return CMD_WARNING_CONFIG_FAILED;
-       }
-
-       if (fval > MAX_PKT_LOSS)
-               fval = MAX_PKT_LOSS;
-
-       if (!iflp)
-               iflp = if_link_params_enable(ifp);
-
-       /* Update Packet Loss if needed */
-       link_param_cmd_set_float(ifp, &iflp->pkt_loss, LP_PKT_LOSS, fval);
-
-       return CMD_SUCCESS;
-}
-
-DEFUN (no_link_params_pkt_loss,
-       no_link_params_pkt_loss_cmd,
-       "no packet-loss",
-       NO_STR
-       "Disable Unidirectional Link Packet Loss on this interface\n")
-{
-       VTY_DECLVAR_CONTEXT(interface, ifp);
-
-       /* Unset Packet Loss */
-       link_param_cmd_unset(ifp, LP_PKT_LOSS);
+       if (!no)
+               nb_cli_enqueue_change(vty, "./packet-loss", NB_OP_MODIFY,
+                                     percentage);
+       else
+               nb_cli_enqueue_change(vty, "./packet-loss", NB_OP_DESTROY, NULL);
 
-       return CMD_SUCCESS;
+       return nb_cli_apply_changes(vty, NULL);
 }
 
 DEFPY_YANG (link_params_res_bw,
@@ -4752,7 +4726,8 @@ static int link_params_config_write(struct vty *vty, struct interface *ifp)
        if (IS_PARAM_SET(iflp, LP_DELAY_VAR))
                vty_out(vty, "  delay-variation %u\n", iflp->delay_var);
        if (IS_PARAM_SET(iflp, LP_PKT_LOSS))
-               vty_out(vty, "  packet-loss %g\n", iflp->pkt_loss);
+               vty_out(vty, "  packet-loss %f\n",
+                       (double)iflp->pkt_loss * LOSS_PRECISION);
        if (IS_PARAM_SET(iflp, LP_AVA_BW))
                vty_out(vty, "  ava-bw %g\n", iflp->ava_bw);
        if (IS_PARAM_SET(iflp, LP_RES_BW))
@@ -4898,7 +4873,6 @@ void zebra_if_init(void)
        install_element(LINK_PARAMS_NODE, &link_params_delay_cmd);
        install_element(LINK_PARAMS_NODE, &link_params_delay_var_cmd);
        install_element(LINK_PARAMS_NODE, &link_params_pkt_loss_cmd);
-       install_element(LINK_PARAMS_NODE, &no_link_params_pkt_loss_cmd);
        install_element(LINK_PARAMS_NODE, &link_params_ava_bw_cmd);
        install_element(LINK_PARAMS_NODE, &link_params_res_bw_cmd);
        install_element(LINK_PARAMS_NODE, &link_params_use_bw_cmd);
index 0e698186de0e78ae7f055c6a80bcd00c83a239c5..3952e9cb1e365e6a7c3c7a832ff93832f97bdee1 100644 (file)
@@ -500,6 +500,13 @@ const struct frr_yang_module_info frr_zebra_info = {
                                .destroy = lib_interface_zebra_link_params_delay_variation_destroy,
                        }
                },
+               {
+                       .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/packet-loss",
+                       .cbs = {
+                               .modify = lib_interface_zebra_link_params_packet_loss_modify,
+                               .destroy = lib_interface_zebra_link_params_packet_loss_destroy,
+                       }
+               },
                {
                        .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/state/up-count",
                        .cbs = {
index dd7e2bd72c96307e90d3d1fcbf131273d50b853e..9d4e720c82fb9434d37ce4ece42712b5839de9a4 100644 (file)
@@ -162,6 +162,10 @@ int lib_interface_zebra_link_params_delay_variation_modify(
        struct nb_cb_modify_args *args);
 int lib_interface_zebra_link_params_delay_variation_destroy(
        struct nb_cb_destroy_args *args);
+int lib_interface_zebra_link_params_packet_loss_modify(
+       struct nb_cb_modify_args *args);
+int lib_interface_zebra_link_params_packet_loss_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 *
index 636ec0fa28893d46cab3c2a6b68539943d67cb6c..844232935a90fd832a653d5c8ce87eba8e36a471 100644 (file)
@@ -2160,6 +2160,46 @@ int lib_interface_zebra_link_params_delay_variation_destroy(
        return NB_OK;
 }
 
+/*
+ * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-params/packet-loss
+ */
+int lib_interface_zebra_link_params_packet_loss_modify(
+       struct nb_cb_modify_args *args)
+{
+       struct interface *ifp;
+       struct if_link_params *iflp;
+       double packet_loss;
+       uint32_t value;
+
+       if (args->event != NB_EV_APPLY)
+               return NB_OK;
+
+       packet_loss = yang_dnode_get_dec64(args->dnode, NULL);
+       value = (uint32_t)(packet_loss / LOSS_PRECISION);
+
+       ifp = nb_running_get_entry(args->dnode, NULL, true);
+       iflp = if_link_params_get(ifp);
+
+       link_param_cmd_set_uint32(ifp, &iflp->pkt_loss, LP_PKT_LOSS, value);
+
+       return NB_OK;
+}
+
+int lib_interface_zebra_link_params_packet_loss_destroy(
+       struct nb_cb_destroy_args *args)
+{
+       struct interface *ifp;
+
+       if (args->event != NB_EV_APPLY)
+               return NB_OK;
+
+       ifp = nb_running_get_entry(args->dnode, NULL, true);
+
+       link_param_cmd_unset(ifp, LP_PKT_LOSS);
+
+       return NB_OK;
+}
+
 /*
  * XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id
  */