]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra, ldpd: fix display of pseudowire status
authorRenato Westphal <renato@opensourcerouting.org>
Wed, 29 Nov 2017 18:22:08 +0000 (16:22 -0200)
committerßingen <bingen@voltanet.io>
Wed, 27 Dec 2017 11:17:05 +0000 (12:17 +0100)
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>
ldpd/l2vpn.c
ldpd/lde.c
ldpd/ldpd.h
zebra/zebra_pw.c

index 9bb378a11c2d522659ede5d19998b153180e119e..33c3d713a33bfb673c6bd8b0879501ef9b51125c 100644 (file)
@@ -549,7 +549,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;
 
index 519fcd9d1191d1fabce5453162c87948ea6c834d..e68b7bc22af2e178e7b8717d617ccbce2f038cd6 100644 (file)
@@ -773,11 +773,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;
@@ -824,6 +825,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;
index fd7d5c5729f6d279337386a3a8cdcef701ac6cb8..0c3b271f833ab480a78548166a317e4d7f270698 100644 (file)
@@ -410,6 +410,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;
index 6e221ec4861d4b00484e3f7e7b89735f9759f763..39c4e3b1a05b69cbcc5a5fb639db880ccb3a91eb 100644 (file)
@@ -71,7 +71,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;