From 7832bbcc30cd770e2f85b0b96fb0a4f09e29095e Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Sun, 9 Jul 2023 21:44:03 +0200 Subject: [PATCH] zebra, yang: add an mpls leaf to interface The yang NB API does not handle the mpls configuration on its leaf. Add an mpls leaf to stick to the mpls configuration. - true or false to mean if config - not defined, means no config. Signed-off-by: Philippe Guibert --- yang/frr-zebra.yang | 6 ++++++ zebra/interface.c | 21 +++++++------------- zebra/zebra_nb.c | 7 +++++++ zebra/zebra_nb.h | 2 ++ zebra/zebra_nb_config.c | 44 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/yang/frr-zebra.yang b/yang/frr-zebra.yang index 7f4254cd41..3c6e45126a 100644 --- a/yang/frr-zebra.yang +++ b/yang/frr-zebra.yang @@ -1982,6 +1982,12 @@ module frr-zebra { "Interface admin status."; } + leaf mpls { + type boolean; + description + "Interface MPLS status."; + } + leaf bandwidth { type uint32 { range "1..100000"; diff --git a/zebra/interface.c b/zebra/interface.c index c92f149e23..ab2b7d2446 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -3783,21 +3783,14 @@ DEFPY (mpls, "Set mpls to be on for the interface\n" "Set mpls to be off for the interface\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct zebra_if *if_data = ifp->info; + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/mpls", + NB_OP_CREATE, on ? "true" : "false"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/mpls", + NB_OP_DESTROY, NULL); - if (no) { - /* keep the state as it is */ - if_data->mpls_config = IF_ZEBRA_DATA_UNSPEC; - } else { - dplane_intf_mpls_modify_state(ifp, !!on); - if (on) - if_data->mpls_config = IF_ZEBRA_DATA_ON; - else - if_data->mpls_config = IF_ZEBRA_DATA_OFF; - } - - return CMD_SUCCESS; + return nb_cli_apply_changes(vty, NULL); } int if_multicast_unset(struct interface *ifp) diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index d94547cffc..a0ef08273c 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -338,6 +338,13 @@ const struct frr_yang_module_info frr_zebra_info = { .destroy = lib_interface_zebra_bandwidth_destroy, } }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/mpls", + .cbs = { + .modify = lib_interface_zebra_mpls_modify, + .destroy = lib_interface_zebra_mpls_destroy, + } + }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/bandwidth", .cbs = { diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index fa576ec3f4..a066a7f9dc 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -96,6 +96,8 @@ int lib_interface_zebra_shutdown_modify(struct nb_cb_modify_args *args); int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args *args); int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args *args); +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_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 336669a49b..5ea03112bc 100644 --- a/zebra/zebra_nb_config.c +++ b/zebra/zebra_nb_config.c @@ -1087,6 +1087,50 @@ int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args *args) return NB_OK; } +/* + * XPath: /frr-interface:lib/interface/frr-zebra:zebra/mpls + */ +int lib_interface_zebra_mpls_modify(struct nb_cb_modify_args *args) +{ + struct interface *ifp; + bool mpls; + 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; + mpls = yang_dnode_get_bool(args->dnode, NULL); + + if (mpls) + zif->mpls_config = IF_ZEBRA_DATA_ON; + else + zif->mpls_config = IF_ZEBRA_DATA_OFF; + + dplane_intf_mpls_modify_state(ifp, mpls); + + return NB_OK; +} + +int lib_interface_zebra_mpls_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->mpls_config = IF_ZEBRA_DATA_UNSPEC; + + /* keep the state as it is */ + + return NB_OK; +} + /* * XPath: /frr-interface:lib/interface/frr-zebra:zebra/bandwidth */