summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2017-11-29 16:22:08 -0200
committerRenato Westphal <renato@opensourcerouting.org>2017-11-29 20:39:19 -0200
commit3c5b5220f72fea3a3d0f47b7ca7cc282bd5dc1ce (patch)
treeec9ff019cf6ca7030c6268369d6ec7414f32ea6a
parent69df82f3b5d3aa343c769f280fb811ce019601d4 (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.c3
-rw-r--r--ldpd/lde.c9
-rw-r--r--ldpd/ldpd.h1
-rw-r--r--zebra/zebra_pw.c2
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;