diff options
| -rw-r--r-- | doc/user/zebra.rst | 22 | ||||
| -rw-r--r-- | vtysh/vtysh.c | 10 | ||||
| -rw-r--r-- | yang/frr-zebra.yang | 1 | ||||
| -rw-r--r-- | zebra/interface.c | 92 | ||||
| -rw-r--r-- | zebra/zebra_nb.c | 7 | ||||
| -rw-r--r-- | zebra/zebra_nb.h | 2 | ||||
| -rw-r--r-- | zebra/zebra_nb_config.c | 92 | 
7 files changed, 113 insertions, 113 deletions
diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst index c27819449c..9199404f3e 100644 --- a/doc/user/zebra.rst +++ b/doc/user/zebra.rst @@ -214,20 +214,14 @@ Link Parameters Commands  .. clicmd:: link-params - -   Enter into the link parameters sub node. At least 'enable' must be -   set to activate the link parameters, and consequently routing -   information that could be used as part of Traffic Engineering on -   this interface. MPLS-TE must be enable at the OSPF -   (:ref:`ospf-traffic-engineering`) or ISIS -   (:ref:`isis-traffic-engineering`) router level in complement to -   this. - -   Under link parameter statement, the following commands set the different TE values: - -.. clicmd:: enable - -   Enable link parameters for this interface. +   Enter into the link parameters sub node. This command activates the link +   parameters and allows to configure routing information that could be used +   as part of Traffic Engineering on this interface. MPLS-TE must be enabled at +   the OSPF (:ref:`ospf-traffic-engineering`) or ISIS +   (:ref:`isis-traffic-engineering`) router level in complement to this. To +   disable link parameters, use the ``no`` version of this command. + +Under link parameter statement, the following commands set the different TE values:  .. clicmd:: metric (0-4294967295) diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index b1a53965cd..299165e2aa 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -1615,7 +1615,6 @@ struct cmd_node link_params_node = {  	.node = LINK_PARAMS_NODE,  	.parent_node = INTERFACE_NODE,  	.prompt = "%s(config-link-params)# ", -	.no_xpath = true,  };  #ifdef HAVE_BGPD @@ -3015,6 +3014,14 @@ DEFUNSH(VTYSH_ZEBRA, vtysh_link_params, vtysh_link_params_cmd, "link-params",  	return CMD_SUCCESS;  } +DEFUNSH_HIDDEN(VTYSH_ZEBRA, no_link_params_enable, no_link_params_enable_cmd, +	"no enable", NO_STR "Disable link parameters on this interface\n") +{ +	if (vty->node == LINK_PARAMS_NODE) +		vty->node = INTERFACE_NODE; +	return CMD_SUCCESS; +} +  DEFUNSH(VTYSH_ZEBRA, exit_link_params, exit_link_params_cmd, "exit-link-params",  	"Exit from Link Params configuration node\n")  { @@ -5064,6 +5071,7 @@ void vtysh_init_vty(void)  	install_node(&link_params_node);  	install_element(INTERFACE_NODE, &vtysh_link_params_cmd); +	install_element(LINK_PARAMS_NODE, &no_link_params_enable_cmd);  	install_element(LINK_PARAMS_NODE, &exit_link_params_cmd);  	install_element(LINK_PARAMS_NODE, &vtysh_end_all_cmd);  	install_element(LINK_PARAMS_NODE, &vtysh_exit_link_params_cmd); diff --git a/yang/frr-zebra.yang b/yang/frr-zebra.yang index 14c6ae5f77..a58546923d 100644 --- a/yang/frr-zebra.yang +++ b/yang/frr-zebra.yang @@ -2047,6 +2047,7 @@ module frr-zebra {            "Link bandwidth informational parameter, in megabits.";        }        container link-params { +        presence "Activates link parameters on this interface.";          description            "link-params for Traffic-Engineering (TE) use in IGP extensions.";          choice admin-group-mode { diff --git a/zebra/interface.c b/zebra/interface.c index 06ba9488c0..ec38cc8e11 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -3809,7 +3809,7 @@ DEFPY_YANG (linkdetect,  {  	nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-detect",  			      NB_OP_CREATE, no ? "false" : "true"); -	 +  	return nb_cli_apply_changes(vty, NULL);  } @@ -3890,7 +3890,6 @@ struct cmd_node link_params_node = {  	.node = LINK_PARAMS_NODE,  	.parent_node = INTERFACE_NODE,  	.prompt = "%s(config-link-params)# ", -	.no_xpath = true,  };  static void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field, @@ -3936,15 +3935,23 @@ static void link_param_cmd_unset(struct interface *ifp, uint32_t type)  		zebra_interface_parameters_update(ifp);  } -DEFUN_NOSH (link_params, +DEFUN_YANG_NOSH (link_params,         link_params_cmd,         "link-params",         LINK_PARAMS_STR)  { -	/* vty->qobj_index stays the same @ interface pointer */ -	vty->node = LINK_PARAMS_NODE; +	int ret; -	return CMD_SUCCESS; +	nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-params", NB_OP_CREATE, NULL); + +	ret = nb_cli_apply_changes(vty, NULL); +	if (ret == CMD_SUCCESS) { +		char xpath[XPATH_MAXLEN]; +		snprintf(xpath, sizeof(xpath), "%s/frr-zebra:zebra/link-params", VTY_CURR_XPATH); +		VTY_PUSH_XPATH(LINK_PARAMS_NODE, xpath); +	} + +	return ret;  }  DEFUN_NOSH (exit_link_params, @@ -3952,70 +3959,49 @@ DEFUN_NOSH (exit_link_params,         "exit-link-params",         "Exit from Link Params configuration mode\n")  { -	if (vty->node == LINK_PARAMS_NODE) -		vty->node = INTERFACE_NODE; +	cmd_exit(vty);  	return CMD_SUCCESS;  } +DEFUN_YANG (no_link_params, +       no_link_params_cmd, +       "no link-params", +       NO_STR +       LINK_PARAMS_STR) +{ +	nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-params", NB_OP_DESTROY, NULL); + +	return nb_cli_apply_changes(vty, NULL); +} +  /* Specific Traffic Engineering parameters commands */ -DEFUN (link_params_enable, +DEFUN_HIDDEN (link_params_enable,         link_params_enable_cmd,         "enable",         "Activate link parameters on this interface\n")  { -	VTY_DECLVAR_CONTEXT(interface, ifp); - -	/* This command could be issue at startup, when activate MPLS TE */ -	/* on a new interface or after a ON / OFF / ON toggle */ -	/* In all case, TE parameters are reset to their default factory */ -	if (IS_ZEBRA_DEBUG_EVENT || IS_ZEBRA_DEBUG_MPLS) -		zlog_debug( -			"Link-params: enable TE link parameters on interface %s", -			ifp->name); - -	if (!if_link_params_get(ifp)) -		if_link_params_enable(ifp); - -	/* force protocols to update LINK STATE due to parameters change */ -	if (if_is_operative(ifp)) -		zebra_interface_parameters_update(ifp); +	vty_out(vty, "This command is deprecated. Link parameters are activated when \"link-params\" node is entered.\n");  	return CMD_SUCCESS;  } -DEFUN (no_link_params_enable, +DEFUN_NOSH (no_link_params_enable,         no_link_params_enable_cmd,         "no enable",         NO_STR         "Disable link parameters on this interface\n")  { -	char xpath[XPATH_MAXLEN];  	int ret; -	VTY_DECLVAR_CONTEXT(interface, ifp); -	if (IS_ZEBRA_DEBUG_EVENT || IS_ZEBRA_DEBUG_MPLS) -		zlog_debug("MPLS-TE: disable TE link parameters on interface %s", -			   ifp->name); +	vty_out(vty, "This command is deprecated. To disable link parameters use \"no link-params\" in the interface node.\n"); -	if_link_params_free(ifp); - -	snprintf( -		xpath, sizeof(xpath), -		"/frr-interface:lib/interface[name='%s']/frr-zebra:zebra/link-params/affinities", -		ifp->name); -	if (yang_dnode_exists(running_config->dnode, xpath)) -		nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); +	nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL);  	ret = nb_cli_apply_changes(vty, NULL); +	if (ret == CMD_SUCCESS) +		cmd_exit(vty); -	if (ret != CMD_SUCCESS) -		return ret; - -	/* force protocols to update LINK STATE due to parameters change */ -	if (if_is_operative(ifp)) -		zebra_interface_parameters_update(ifp); - -	return CMD_SUCCESS; +	return ret;  }  /* STANDARD TE metrics */ @@ -4199,7 +4185,7 @@ DEFPY_YANG(link_params_admin_grp, link_params_admin_grp_cmd,  	snprintf(value_str, sizeof(value_str), "%ld", value);  	nb_cli_enqueue_change( -		vty, "./frr-zebra:zebra/link-params/legacy-admin-group", +		vty, "./legacy-admin-group",  		NB_OP_MODIFY, value_str);  	return nb_cli_apply_changes(vty, NULL); @@ -4210,7 +4196,7 @@ DEFPY_YANG(no_link_params_admin_grp, no_link_params_admin_grp_cmd,  	   NO_STR "Disable Administrative group membership on this interface\n")  {  	nb_cli_enqueue_change( -		vty, "./frr-zebra:zebra/link-params/legacy-admin-group", +		vty, "./legacy-admin-group",  		NB_OP_DESTROY, NULL);  	return nb_cli_apply_changes(vty, NULL); @@ -4655,7 +4641,7 @@ DEFPY_YANG(link_params_affinity, link_params_affinity_cmd,  	   "Affinity names\n")  {  	return ag_change(vty, argc, argv, -			 "./frr-zebra:zebra/link-params/affinities/affinity", +			 "./affinities/affinity",  			 no, no ? 2 : 1);  } @@ -4671,7 +4657,7 @@ DEFPY_YANG(link_params_affinity_mode, link_params_affinity_mode_cmd,  	   "Extended Admin-Group only RFC7308 (default)\n"  	   "Standard and extended Admin-Group format\n")  { -	const char *xpath = "./frr-zebra:zebra/link-params/affinity-mode"; +	const char *xpath = "./affinity-mode";  	nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, affmode); @@ -4686,7 +4672,7 @@ DEFPY_YANG(no_link_params_affinity_mode, no_link_params_affinity_mode_cmd,  	   "Extended Admin-Group only RFC7308 (default)\n"  	   "Standard and extended Admin-Group format\n")  { -	const char *xpath = "./frr-zebra:zebra/link-params/affinity-mode"; +	const char *xpath = "./affinity-mode";  	nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, "extended"); @@ -5017,7 +5003,6 @@ static int link_params_config_write(struct vty *vty, struct interface *ifp)  	struct if_link_params *iflp = ifp->link_params;  	vty_out(vty, " link-params\n"); -	vty_out(vty, "  enable\n");  	if (IS_PARAM_SET(iflp, LP_TE_METRIC) && iflp->te_metric != ifp->metric)  		vty_out(vty, "  metric %u\n", iflp->te_metric);  	if (IS_PARAM_SET(iflp, LP_MAX_BW) && iflp->max_bw != iflp->default_bw) @@ -5183,6 +5168,7 @@ void zebra_if_init(void)  	install_element(INTERFACE_NODE, &ip_address_peer_cmd);  	install_element(INTERFACE_NODE, &ipv6_address_cmd);  	install_element(INTERFACE_NODE, &link_params_cmd); +	install_element(INTERFACE_NODE, &no_link_params_cmd);  	install_default(LINK_PARAMS_NODE);  	install_element(LINK_PARAMS_NODE, &link_params_enable_cmd);  	install_element(LINK_PARAMS_NODE, &no_link_params_enable_cmd); diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index ddb2e8f325..a62f6b4280 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -359,6 +359,13 @@ const struct frr_yang_module_info frr_zebra_info = {  			}  		},  		{ +			.xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params", +			.cbs = { +				.create = lib_interface_zebra_link_params_create, +				.destroy = lib_interface_zebra_link_params_destroy, +			} +		}, +		{  			.xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/legacy-admin-group",  			.cbs = {  				.modify = lib_interface_zebra_legacy_admin_group_modify, diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index 13d42d41d2..044a9c00d7 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -101,6 +101,8 @@ 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_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_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 c704f79bca..1aae749e7c 100644 --- a/zebra/zebra_nb_config.c +++ b/zebra/zebra_nb_config.c @@ -1272,6 +1272,39 @@ int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args *args)  }  /* + * XPath: /frr-interface:lib/interface/frr-zebra:zebra/link-params + */ +int lib_interface_zebra_link_params_create(struct nb_cb_create_args *args) +{ +	struct interface *ifp; + +	if (args->event != NB_EV_APPLY) +		return NB_OK; + +	ifp = nb_running_get_entry(args->dnode, NULL, true); +	if_link_params_enable(ifp); +	if (if_is_operative(ifp)) +		zebra_interface_parameters_update(ifp); + +	return NB_OK; +} + +int lib_interface_zebra_link_params_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); +	if_link_params_free(ifp); +	if (if_is_operative(ifp)) +		zebra_interface_parameters_update(ifp); + +	return NB_OK; +} + +/*   * XPath:   * /frr-interface:lib/interface/frr-zebra:zebra/link-params/legacy-admin-group   */ @@ -1282,22 +1315,16 @@ int lib_interface_zebra_legacy_admin_group_modify(  	struct if_link_params *iflp;  	uint32_t admin_group_value; -	ifp = nb_running_get_entry(args->dnode, NULL, true);  	admin_group_value = yang_dnode_get_uint32(args->dnode, "."); -	if (!ifp) -		return NB_ERR_RESOURCE; - -	iflp = if_link_params_get(ifp); -  	switch (args->event) {  	case NB_EV_VALIDATE:  	case NB_EV_PREPARE:  	case NB_EV_ABORT:  		break;  	case NB_EV_APPLY: -		if (!iflp) -			iflp = if_link_params_enable(ifp); +		ifp = nb_running_get_entry(args->dnode, NULL, true); +		iflp = if_link_params_get(ifp);  		iflp->admin_grp = admin_group_value;  		SET_PARAM(iflp, LP_ADM_GRP); @@ -1318,21 +1345,14 @@ int lib_interface_zebra_legacy_admin_group_destroy(  	struct interface *ifp;  	struct if_link_params *iflp; -	ifp = nb_running_get_entry(args->dnode, NULL, true); - -	if (!ifp) -		return NB_ERR_RESOURCE; - -	iflp = if_link_params_get(ifp); -  	switch (args->event) {  	case NB_EV_VALIDATE:  	case NB_EV_PREPARE:  	case NB_EV_ABORT:  		break;  	case NB_EV_APPLY: -		if (!iflp) -			iflp = if_link_params_enable(ifp); +		ifp = nb_running_get_entry(args->dnode, NULL, true); +		iflp = if_link_params_get(ifp);  		iflp->admin_grp = 0;  		UNSET_PARAM(iflp, LP_ADM_GRP); @@ -1356,25 +1376,18 @@ int lib_interface_zebra_affinity_create(struct nb_cb_create_args *args)  	struct affinity_map *affmap;  	enum affinity_mode affinity_mode; - -	ifp = nb_running_get_entry(args->dnode, NULL, true);  	affname = yang_dnode_get_string(args->dnode, ".");  	affinity_mode = yang_dnode_get_enum(args->dnode, "../../affinity-mode"); -	if (!ifp) -		return NB_ERR_RESOURCE; - -	affmap = affinity_map_get(affname); -	iflp = if_link_params_get(ifp); -  	switch (args->event) {  	case NB_EV_VALIDATE:  	case NB_EV_PREPARE:  	case NB_EV_ABORT:  		break;  	case NB_EV_APPLY: -		if (!iflp) -			iflp = if_link_params_enable(ifp); +		ifp = nb_running_get_entry(args->dnode, NULL, true); +		iflp = if_link_params_get(ifp); +		affmap = affinity_map_get(affname);  		if (affmap->bit_position < 32 &&  		    (affinity_mode == AFFINITY_MODE_STANDARD || @@ -1404,24 +1417,19 @@ int lib_interface_zebra_affinity_destroy(struct nb_cb_destroy_args *args)  	struct affinity_map *affmap;  	enum affinity_mode affinity_mode; -	ifp = nb_running_get_entry(args->dnode, NULL, true);  	affname = yang_dnode_get_string(args->dnode, ".");  	affinity_mode = yang_dnode_get_enum(args->dnode, "../../affinity-mode"); -	if (!ifp) -		return NB_ERR_RESOURCE; - -	affmap = affinity_map_get(affname); -	iflp = if_link_params_get(ifp); -  	switch (args->event) {  	case NB_EV_VALIDATE:  	case NB_EV_PREPARE:  	case NB_EV_ABORT:  		break;  	case NB_EV_APPLY: -		if (!iflp) -			return NB_OK; +		ifp = nb_running_get_entry(args->dnode, NULL, true); +		iflp = if_link_params_get(ifp); +		affmap = affinity_map_get(affname); +  		if (affmap->bit_position < 32 &&  		    (affinity_mode == AFFINITY_MODE_STANDARD ||  		     affinity_mode == AFFINITY_MODE_BOTH)) { @@ -1454,23 +1462,17 @@ int lib_interface_zebra_affinity_mode_modify(struct nb_cb_modify_args *args)  	struct if_link_params *iflp;  	enum affinity_mode affinity_mode; - -	ifp = nb_running_get_entry(args->dnode, NULL, true);  	affinity_mode = yang_dnode_get_enum(args->dnode, "."); -	if (!ifp) -		return NB_ERR_RESOURCE; - -	iflp = if_link_params_get(ifp); -  	switch (args->event) {  	case NB_EV_VALIDATE:  	case NB_EV_PREPARE:  	case NB_EV_ABORT:  		break;  	case NB_EV_APPLY: -		if (!iflp) -			iflp = if_link_params_enable(ifp); +		ifp = nb_running_get_entry(args->dnode, NULL, true); +		iflp = if_link_params_get(ifp); +  		if (affinity_mode == AFFINITY_MODE_STANDARD) {  			if (!IS_PARAM_SET(iflp, LP_ADM_GRP) &&  			    IS_PARAM_SET(iflp, LP_EXTEND_ADM_GRP)) {  | 
