summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yang/frr-zebra.yang6
-rw-r--r--zebra/interface.c21
-rw-r--r--zebra/zebra_nb.c7
-rw-r--r--zebra/zebra_nb.h2
-rw-r--r--zebra/zebra_nb_config.c44
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) {
- /* 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;
- }
+ 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);
- 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
@@ -339,6 +339,13 @@ const struct frr_yang_module_info frr_zebra_info = {
}
},
{
+ .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 = {
.modify = lib_interface_zebra_bandwidth_modify,
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
@@ -1088,6 +1088,50 @@ int lib_interface_zebra_shutdown_destroy(struct nb_cb_destroy_args *args)
}
/*
+ * 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
*/
int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args *args)