diff options
| author | Igor Ryzhov <iryzhov@nfware.com> | 2021-04-29 01:59:56 +0300 | 
|---|---|---|
| committer | Igor Ryzhov <iryzhov@nfware.com> | 2021-04-29 17:05:21 +0300 | 
| commit | ec62fbaa07998df71a0bfce4a0383556bb604521 (patch) | |
| tree | 830da6519ffef5e5c44ebf07ff32485bd8d9c3c8 /isisd/isis_nb_config.c | |
| parent | bcf220815632500f9646cb0b4c13f498afa4edf6 (diff) | |
isisd: fix ldp-sync configuration
YANG model and CLI commands allow user to configure LDP-sync per area.
But the actual implementation is incorrect - all commands are changing
the config for the whole VRF instead of a single area. This commit fixes
this issue by actually implementing per area configuration.
Fixes #8578.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
Diffstat (limited to 'isisd/isis_nb_config.c')
| -rw-r--r-- | isisd/isis_nb_config.c | 141 | 
1 files changed, 22 insertions, 119 deletions
diff --git a/isisd/isis_nb_config.c b/isisd/isis_nb_config.c index 4b68cd3bed..5cad9fcfcb 100644 --- a/isisd/isis_nb_config.c +++ b/isisd/isis_nb_config.c @@ -32,7 +32,6 @@  #include "spf_backoff.h"  #include "lib_errors.h"  #include "vrf.h" -#include "zclient.h"  #include "ldp_sync.h"  #include "isisd/isisd.h" @@ -56,8 +55,6 @@  DEFINE_MTYPE_STATIC(ISISD, ISIS_MPLS_TE,    "ISIS MPLS_TE parameters");  DEFINE_MTYPE_STATIC(ISISD, ISIS_PLIST_NAME, "ISIS prefix-list name"); -extern struct zclient *zclient; -  /*   * XPath: /frr-isisd:isis/instance   */ @@ -87,16 +84,10 @@ int isis_instance_create(struct nb_cb_create_args *args)  int isis_instance_destroy(struct nb_cb_destroy_args *args)  {  	struct isis_area *area; -	vrf_id_t vrf_id;  	if (args->event != NB_EV_APPLY)  		return NB_OK;  	area = nb_running_unset_entry(args->dnode); -	vrf_id = area->isis->vrf_id; - -	/* remove ldp-sync config */ -	if (vrf_id == VRF_DEFAULT) -		isis_ldp_sync_gbl_exit(true);  	isis_area_destroy(area);  	return NB_OK; @@ -2369,11 +2360,6 @@ int isis_instance_segment_routing_prefix_sid_map_prefix_sid_n_flag_clear_modify(  int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args)  {  	struct isis_area *area; -	struct listnode *node; -	struct isis_circuit *circuit; -	struct interface *ifp; -	struct vrf *vrf; -	struct isis *isis;  	switch (args->event) {  	case NB_EV_VALIDATE: @@ -2392,30 +2378,7 @@ int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args)  		break;  	case NB_EV_APPLY:  		area = nb_running_get_entry(args->dnode, NULL, true); -		isis = area->isis; -		vrf = vrf_lookup_by_id(isis->vrf_id); - -		/* register with opaque client to recv LDP-IGP Sync msgs */ -		zclient_register_opaque(zclient, LDP_IGP_SYNC_IF_STATE_UPDATE); -		zclient_register_opaque(zclient, LDP_IGP_SYNC_ANNOUNCE_UPDATE); - -		if (!CHECK_FLAG(isis->ldp_sync_cmd.flags, -				LDP_SYNC_FLAG_ENABLE)) { -			SET_FLAG(isis->ldp_sync_cmd.flags, -				 LDP_SYNC_FLAG_ENABLE); - -			/* turn on LDP-IGP Sync on all ptop ISIS interfaces */ -			FOR_ALL_INTERFACES (vrf, ifp) { -				for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, -							  area)) { -					circuit = circuit_lookup_by_ifp( -						ifp, area->circuit_list); -					if (circuit == NULL) -						continue; -					isis_if_set_ldp_sync_enable(circuit); -				} -			} -		} +		isis_area_ldp_sync_enable(area);  		break;  	}  	return NB_OK; @@ -2423,11 +2386,13 @@ int isis_instance_mpls_ldp_sync_create(struct nb_cb_create_args *args)  int isis_instance_mpls_ldp_sync_destroy(struct nb_cb_destroy_args *args)  { +	struct isis_area *area; +  	if (args->event != NB_EV_APPLY)  		return NB_OK; -	/* remove ldp-sync config */ -	isis_ldp_sync_gbl_exit(false); +	area = nb_running_get_entry(args->dnode, NULL, true); +	isis_area_ldp_sync_disable(area);  	return NB_OK;  } @@ -2438,12 +2403,7 @@ int isis_instance_mpls_ldp_sync_destroy(struct nb_cb_destroy_args *args)  int isis_instance_mpls_ldp_sync_holddown_modify(struct nb_cb_modify_args *args)  {  	struct isis_area *area; -	struct listnode *node; -	struct isis_circuit *circuit; -	struct interface *ifp; -	struct vrf *vrf; -	uint16_t holddown = LDP_IGP_SYNC_HOLDDOWN_DEFAULT; -	struct isis *isis; +	uint16_t holddown;  	switch (args->event) {  	case NB_EV_VALIDATE: @@ -2462,29 +2422,8 @@ int isis_instance_mpls_ldp_sync_holddown_modify(struct nb_cb_modify_args *args)  		break;  	case NB_EV_APPLY:  		area = nb_running_get_entry(args->dnode, NULL, true); -		isis = area->isis; -		vrf = vrf_lookup_by_id(isis->vrf_id);  		holddown = yang_dnode_get_uint16(args->dnode, NULL); - -		if (holddown == LDP_IGP_SYNC_HOLDDOWN_DEFAULT) -			UNSET_FLAG(isis->ldp_sync_cmd.flags, -				   LDP_SYNC_FLAG_HOLDDOWN); -		else -			SET_FLAG(isis->ldp_sync_cmd.flags, -				 LDP_SYNC_FLAG_HOLDDOWN); -		isis->ldp_sync_cmd.holddown = holddown; - -		/* set holddown time on all ISIS interfaces */ -		FOR_ALL_INTERFACES (vrf, ifp) { -			for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, -						  area)) { -				circuit = circuit_lookup_by_ifp(ifp, -							area->circuit_list); -				if (circuit == NULL) -					continue; -				isis_if_set_ldp_sync_holddown(circuit); -			} -		} +		isis_area_ldp_sync_set_holddown(area, holddown);  		break;  	}  	return NB_OK; @@ -2562,9 +2501,6 @@ int lib_interface_isis_destroy(struct nb_cb_destroy_args *args)  	circuit = nb_running_unset_entry(args->dnode); -	/* remove ldp-sync config */ -	isis_ldp_sync_if_remove(circuit, true); -  	isis_circuit_del(circuit);  	return NB_OK; @@ -3283,13 +3219,12 @@ int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args *args)  	struct isis_circuit *circuit;  	struct ldp_sync_info *ldp_sync_info;  	bool ldp_sync_enable; -	struct isis *isis;  	switch (args->event) {  	case NB_EV_VALIDATE:  		circuit = nb_running_get_entry(args->dnode, NULL, false);  		if (circuit == NULL || circuit->area == NULL) -			return NB_ERR_VALIDATION; +			break;  		if (circuit->isis->vrf_id != VRF_DEFAULT) {  			snprintf(args->errmsg, args->errmsg_len, @@ -3303,39 +3238,17 @@ int lib_interface_isis_mpls_ldp_sync_modify(struct nb_cb_modify_args *args)  	case NB_EV_APPLY:  		circuit = nb_running_get_entry(args->dnode, NULL, true);  		ldp_sync_enable = yang_dnode_get_bool(args->dnode, NULL); -		isis = circuit->isis; -		if (circuit->ldp_sync_info == NULL) -			isis_ldp_sync_if_init(circuit, isis); -		assert(circuit->ldp_sync_info != NULL);  		ldp_sync_info = circuit->ldp_sync_info; -		if (ldp_sync_enable) { -			/* enable LDP-SYNC on an interface -			 *  if ptop interface send message to LDP to get state -			 */ -			SET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_IF_CONFIG); -			ldp_sync_info->enabled = LDP_IGP_SYNC_ENABLED; -			if (circuit->circ_type == CIRCUIT_T_P2P) { -				ldp_sync_info->state = -					LDP_IGP_SYNC_STATE_REQUIRED_NOT_UP; -				isis_ldp_sync_state_req_msg(circuit); -			} else { -				zlog_debug("ldp_sync: only runs on P2P links %s", -					   circuit->interface->name); -				ldp_sync_info->state = -					LDP_IGP_SYNC_STATE_NOT_REQUIRED; -			} -		} else { -			/* disable LDP-SYNC on an interface -			 *  stop holddown timer if running -			 *  restore isis metric -			 */ -			SET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_IF_CONFIG); -			ldp_sync_info->enabled = LDP_IGP_SYNC_DEFAULT; -			ldp_sync_info->state = LDP_IGP_SYNC_STATE_NOT_REQUIRED; -			THREAD_OFF(ldp_sync_info->t_holddown); -			isis_ldp_sync_set_if_metric(circuit, true); +		SET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_IF_CONFIG); +		ldp_sync_info->enabled = ldp_sync_enable; + +		if (circuit->area) { +			if (ldp_sync_enable) +				isis_if_ldp_sync_enable(circuit); +			else +				isis_if_ldp_sync_disable(circuit);  		}  		break;  	} @@ -3350,13 +3263,12 @@ int lib_interface_isis_mpls_holddown_modify(struct nb_cb_modify_args *args)  	struct isis_circuit *circuit;  	struct ldp_sync_info *ldp_sync_info;  	uint16_t holddown; -	struct isis *isis;  	switch (args->event) {  	case NB_EV_VALIDATE:  		circuit = nb_running_get_entry(args->dnode, NULL, false);  		if (circuit == NULL || circuit->area == NULL) -			return NB_ERR_VALIDATION; +			break;  		if (circuit->isis->vrf_id != VRF_DEFAULT) {  			snprintf(args->errmsg, args->errmsg_len, @@ -3370,11 +3282,7 @@ int lib_interface_isis_mpls_holddown_modify(struct nb_cb_modify_args *args)  	case NB_EV_APPLY:  		circuit = nb_running_get_entry(args->dnode, NULL, true);  		holddown = yang_dnode_get_uint16(args->dnode, NULL); -		isis = circuit->isis; -		if (circuit->ldp_sync_info == NULL) -			isis_ldp_sync_if_init(circuit, isis); -		assert(circuit->ldp_sync_info != NULL);  		ldp_sync_info = circuit->ldp_sync_info;  		SET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_HOLDDOWN); @@ -3388,14 +3296,12 @@ int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args *args)  {  	struct isis_circuit *circuit;  	struct ldp_sync_info *ldp_sync_info; -	struct isis *isis;  	switch (args->event) {  	case NB_EV_VALIDATE:  		circuit = nb_running_get_entry(args->dnode, NULL, false); -		if (circuit == NULL || circuit->ldp_sync_info == NULL -		    || circuit->area == NULL) -			return NB_ERR_VALIDATION; +		if (circuit == NULL || circuit->area == NULL) +			break;  		if (circuit->isis->vrf_id != VRF_DEFAULT) {  			snprintf(args->errmsg, args->errmsg_len, @@ -3408,15 +3314,12 @@ int lib_interface_isis_mpls_holddown_destroy(struct nb_cb_destroy_args *args)  		break;  	case NB_EV_APPLY:  		circuit = nb_running_get_entry(args->dnode, NULL, true); -		isis = circuit->isis;  		ldp_sync_info = circuit->ldp_sync_info; +  		UNSET_FLAG(ldp_sync_info->flags, LDP_SYNC_FLAG_HOLDDOWN); -		if (CHECK_FLAG(isis->ldp_sync_cmd.flags, -			       LDP_SYNC_FLAG_HOLDDOWN)) -			ldp_sync_info->holddown = isis->ldp_sync_cmd.holddown; -		else -			ldp_sync_info->holddown = LDP_IGP_SYNC_HOLDDOWN_DEFAULT; +		if (circuit->area) +			isis_if_set_ldp_sync_holddown(circuit);  		break;  	}  | 
