From 59e3ce08fa489274448558610232510782070c29 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Fri, 19 Jan 2024 14:34:27 +0200 Subject: [PATCH] zebra: convert interface link-params metric command to NB Signed-off-by: Igor Ryzhov --- yang/frr-zebra.yang | 5 +++++ zebra/interface.c | 49 ++++++++++++----------------------------- zebra/interface.h | 6 +++++ zebra/zebra_nb.c | 7 ++++++ zebra/zebra_nb.h | 3 +++ zebra/zebra_nb_config.c | 35 +++++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 35 deletions(-) diff --git a/yang/frr-zebra.yang b/yang/frr-zebra.yang index a58546923d..ccaf10066b 100644 --- a/yang/frr-zebra.yang +++ b/yang/frr-zebra.yang @@ -2050,6 +2050,11 @@ module frr-zebra { presence "Activates link parameters on this interface."; description "link-params for Traffic-Engineering (TE) use in IGP extensions."; + leaf metric { + type uint32; + description + "Link metric for MPLS-TE purpose."; + } choice admin-group-mode { description "Admin-group mode"; case legacy { diff --git a/zebra/interface.c b/zebra/interface.c index ec38cc8e11..7e1bc3e4b2 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -3892,8 +3892,8 @@ struct cmd_node link_params_node = { .prompt = "%s(config-link-params)# ", }; -static void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field, - uint32_t type, uint32_t value) +void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field, + uint32_t type, uint32_t value) { /* Update field as needed */ if (IS_PARAM_UNSET(ifp->link_params, type) || *field != value) { @@ -3906,8 +3906,9 @@ static void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field, zebra_interface_parameters_update(ifp); } } -static void link_param_cmd_set_float(struct interface *ifp, float *field, - uint32_t type, float value) + +void link_param_cmd_set_float(struct interface *ifp, float *field, + uint32_t type, float value) { /* Update field as needed */ @@ -3922,7 +3923,7 @@ static void link_param_cmd_set_float(struct interface *ifp, float *field, } } -static void link_param_cmd_unset(struct interface *ifp, uint32_t type) +void link_param_cmd_unset(struct interface *ifp, uint32_t type) { if (ifp->link_params == NULL) return; @@ -4005,40 +4006,19 @@ DEFUN_NOSH (no_link_params_enable, } /* STANDARD TE metrics */ -DEFUN (link_params_metric, +DEFPY_YANG (link_params_metric, link_params_metric_cmd, - "metric (0-4294967295)", + "[no] metric ![(0-4294967295)]$metric", + NO_STR "Link metric for MPLS-TE purpose\n" "Metric value in decimal\n") { - int idx_number = 1; - VTY_DECLVAR_CONTEXT(interface, ifp); - struct if_link_params *iflp = if_link_params_get(ifp); - uint32_t metric; - - metric = strtoul(argv[idx_number]->arg, NULL, 10); - - if (!iflp) - iflp = if_link_params_enable(ifp); - - /* Update TE metric if needed */ - link_param_cmd_set_uint32(ifp, &iflp->te_metric, LP_TE_METRIC, metric); - - return CMD_SUCCESS; -} - -DEFUN (no_link_params_metric, - no_link_params_metric_cmd, - "no metric", - NO_STR - "Disable Link Metric on this interface\n") -{ - VTY_DECLVAR_CONTEXT(interface, ifp); - - /* Unset TE Metric */ - link_param_cmd_unset(ifp, LP_TE_METRIC); + if (!no) + nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY, metric_str); + else + nb_cli_enqueue_change(vty, "./metric", NB_OP_DESTROY, NULL); - return CMD_SUCCESS; + return nb_cli_apply_changes(vty, NULL); } DEFUN (link_params_maxbw, @@ -5173,7 +5153,6 @@ void zebra_if_init(void) install_element(LINK_PARAMS_NODE, &link_params_enable_cmd); install_element(LINK_PARAMS_NODE, &no_link_params_enable_cmd); install_element(LINK_PARAMS_NODE, &link_params_metric_cmd); - install_element(LINK_PARAMS_NODE, &no_link_params_metric_cmd); install_element(LINK_PARAMS_NODE, &link_params_maxbw_cmd); install_element(LINK_PARAMS_NODE, &link_params_max_rsv_bw_cmd); install_element(LINK_PARAMS_NODE, &link_params_unrsv_bw_cmd); diff --git a/zebra/interface.h b/zebra/interface.h index 0c9831b7da..c1ff525189 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -323,6 +323,12 @@ extern int if_multicast_unset(struct interface *ifp); extern int if_linkdetect(struct interface *ifp, bool detect); extern void if_addr_wakeup(struct interface *ifp); +void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field, + uint32_t type, uint32_t value); +void link_param_cmd_set_float(struct interface *ifp, float *field, + uint32_t type, float value); +void link_param_cmd_unset(struct interface *ifp, uint32_t type); + /* Nexthop group connected functions */ extern void if_nhg_dependents_add(struct interface *ifp, struct nhg_hash_entry *nhe); diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index a62f6b4280..608c204989 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -365,6 +365,13 @@ const struct frr_yang_module_info frr_zebra_info = { .destroy = lib_interface_zebra_link_params_destroy, } }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/metric", + .cbs = { + .modify = lib_interface_zebra_link_params_metric_modify, + .destroy = lib_interface_zebra_link_params_metric_destroy, + } + }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/legacy-admin-group", .cbs = { diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index 044a9c00d7..5b872a4d48 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -103,6 +103,9 @@ int lib_interface_zebra_mpls_modify(struct nb_cb_modify_args *args); int lib_interface_zebra_mpls_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_create(struct nb_cb_create_args *args); int lib_interface_zebra_link_params_destroy(struct nb_cb_destroy_args *args); +int lib_interface_zebra_link_params_metric_modify(struct nb_cb_modify_args *args); +int lib_interface_zebra_link_params_metric_destroy( + struct nb_cb_destroy_args *args); int lib_interface_zebra_legacy_admin_group_modify( struct nb_cb_modify_args *args); int lib_interface_zebra_legacy_admin_group_destroy( diff --git a/zebra/zebra_nb_config.c b/zebra/zebra_nb_config.c index 1aae749e7c..5d77212f20 100644 --- a/zebra/zebra_nb_config.c +++ b/zebra/zebra_nb_config.c @@ -1304,6 +1304,41 @@ int lib_interface_zebra_link_params_destroy(struct nb_cb_destroy_args *args) return NB_OK; } +/* + * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-params/metric + */ +int lib_interface_zebra_link_params_metric_modify(struct nb_cb_modify_args *args) +{ + struct interface *ifp; + struct if_link_params *iflp; + uint32_t metric; + + if (args->event != NB_EV_APPLY) + return NB_OK; + + ifp = nb_running_get_entry(args->dnode, NULL, true); + iflp = if_link_params_get(ifp); + metric = yang_dnode_get_uint32(args->dnode, NULL); + + link_param_cmd_set_uint32(ifp, &iflp->te_metric, LP_TE_METRIC, metric); + + return NB_OK; +} + +int lib_interface_zebra_link_params_metric_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_TE_METRIC); + + return NB_OK; +} + /* * XPath: * /frr-interface:lib/interface/frr-zebra:zebra/link-params/legacy-admin-group -- 2.39.5