summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;