diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2017-11-29 16:22:08 -0200 | 
|---|---|---|
| committer | Renato Westphal <renato@opensourcerouting.org> | 2017-11-29 20:39:19 -0200 | 
| commit | 3c5b5220f72fea3a3d0f47b7ca7cc282bd5dc1ce (patch) | |
| tree | ec9ff019cf6ca7030c6268369d6ec7414f32ea6a | |
| parent | 69df82f3b5d3aa343c769f280fb811ce019601d4 (diff) | |
zebra, ldpd: fix display of pseudowire status
In some circumstances zebra and ldpd would display a pseudowire as UP
when in reality it's not (example: MTU mismatch between the two ends). Fix
this to avoid confusion.
Reported-by: ßingen <bingen@voltanet.io>
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| -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;  | 
