diff options
| -rw-r--r-- | ldpd/l2vpn.c | 3 | ||||
| -rw-r--r-- | ldpd/lde.c | 9 | ||||
| -rw-r--r-- | ldpd/ldpd.h | 1 | ||||
| -rw-r--r-- | zebra/zebra_pw.c | 2 | 
4 files changed, 11 insertions, 4 deletions
diff --git a/ldpd/l2vpn.c b/ldpd/l2vpn.c index 3335be08a8..5bf9bd4575 100644 --- a/ldpd/l2vpn.c +++ b/ldpd/l2vpn.c @@ -550,7 +550,8 @@ l2vpn_pw_ctl(pid_t pid)  			    sizeof(pwctl.ifname));  			pwctl.pwid = pw->pwid;  			pwctl.lsr_id = pw->lsr_id; -			if (pw->local_status == PW_FORWARDING && +			if (pw->enabled && +			    pw->local_status == PW_FORWARDING &&  			    pw->remote_status == PW_FORWARDING)  				pwctl.status = 1; diff --git a/ldpd/lde.c b/ldpd/lde.c index b597d967d7..63e1e39946 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -767,11 +767,12 @@ lde_send_change_klabel(struct fec_node *fn, struct fec_nh *fnh)  		    sizeof(kr));  		break;  	case FEC_TYPE_PWID: -		if (fn->local_label == NO_LABEL || +		pw = (struct l2vpn_pw *) fn->data; +		if (!pw || fn->local_label == NO_LABEL ||  		    fnh->remote_label == NO_LABEL)  			return; -		pw = (struct l2vpn_pw *) fn->data; +		pw->enabled = true;  		pw2zpw(pw, &zpw);  		zpw.local_label = fn->local_label;  		zpw.remote_label = fnh->remote_label; @@ -818,6 +819,10 @@ lde_send_delete_klabel(struct fec_node *fn, struct fec_nh *fnh)  		break;  	case FEC_TYPE_PWID:  		pw = (struct l2vpn_pw *) fn->data; +		if (!pw) +			return; + +		pw->enabled = false;  		pw2zpw(pw, &zpw);  		zpw.local_label = fn->local_label;  		zpw.remote_label = fnh->remote_label; diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h index 5580ea5d67..4824f1720b 100644 --- a/ldpd/ldpd.h +++ b/ldpd/ldpd.h @@ -409,6 +409,7 @@ struct l2vpn_pw {  	uint32_t		 pwid;  	char			 ifname[IF_NAMESIZE];  	unsigned int		 ifindex; +	bool			 enabled;  	uint32_t		 remote_group;  	uint16_t		 remote_mtu;  	uint32_t		 local_status; diff --git a/zebra/zebra_pw.c b/zebra/zebra_pw.c index d3492fb41c..bbd01a759e 100644 --- a/zebra/zebra_pw.c +++ b/zebra/zebra_pw.c @@ -73,7 +73,7 @@ struct zebra_pw *zebra_pw_add(struct zebra_vrf *zvrf, const char *ifname,  	pw->protocol = protocol;  	pw->vrf_id = zvrf_id(zvrf);  	pw->client = client; -	pw->status = PW_STATUS_UP; +	pw->status = PW_STATUS_DOWN;  	pw->local_label = MPLS_NO_LABEL;  	pw->remote_label = MPLS_NO_LABEL;  	pw->flags = F_PSEUDOWIRE_CWORD;  | 
