]> git.proxmox.com Git - mirror_frr.git/blobdiff - ldpd/lde.c
Merge pull request #892 from opensourcerouting/watchfrr-simplify
[mirror_frr.git] / ldpd / lde.c
index 6c74c20125553e584326c0dd9f0a1d465174fc07..582582babfe62f75f4c4c2fc3adf7b33cce3f495 100644 (file)
@@ -473,6 +473,15 @@ lde_dispatch_parent(struct thread *thread)
                                }
                        }
                        break;
+               case IMSG_PW_UPDATE:
+                       if (imsg.hdr.len != IMSG_HEADER_SIZE +
+                           sizeof(struct zapi_pw_status))
+                               fatalx("PW_UPDATE imsg with wrong len");
+
+                       if (l2vpn_pw_status_update(imsg.data) != 0)
+                               log_warnx("%s: error updating PW status",
+                                   __func__);
+                       break;
                case IMSG_NETWORK_ADD:
                case IMSG_NETWORK_UPDATE:
                        if (imsg.hdr.len != IMSG_HEADER_SIZE +
@@ -713,8 +722,8 @@ lde_update_label(struct fec_node *fn)
 void
 lde_send_change_klabel(struct fec_node *fn, struct fec_nh *fnh)
 {
-       struct kroute   kr;
-       struct kpw      kpw;
+       struct kroute    kr;
+       struct zapi_pw   zpw;
        struct l2vpn_pw *pw;
 
        switch (fn->fec.type) {
@@ -752,19 +761,10 @@ lde_send_change_klabel(struct fec_node *fn, struct fec_nh *fnh)
                        return;
 
                pw = (struct l2vpn_pw *) fn->data;
-               pw->flags |= F_PW_STATUS_UP;
-
-               memset(&kpw, 0, sizeof(kpw));
-               kpw.ifindex = pw->ifindex;
-               kpw.pw_type = fn->fec.u.pwid.type;
-               kpw.af = pw->af;
-               kpw.nexthop = pw->addr;
-               kpw.local_label = fn->local_label;
-               kpw.remote_label = fnh->remote_label;
-               kpw.flags = pw->flags;
-
-               lde_imsg_compose_parent(IMSG_KPWLABEL_CHANGE, 0, &kpw,
-                   sizeof(kpw));
+               pw2zpw(pw, &zpw);
+               zpw.local_label = fn->local_label;
+               zpw.remote_label = fnh->remote_label;
+               lde_imsg_compose_parent(IMSG_KPW_SET, 0, &zpw, sizeof(zpw));
                break;
        }
 }
@@ -773,7 +773,7 @@ void
 lde_send_delete_klabel(struct fec_node *fn, struct fec_nh *fnh)
 {
        struct kroute    kr;
-       struct kpw       kpw;
+       struct zapi_pw   zpw;
        struct l2vpn_pw *pw;
 
        switch (fn->fec.type) {
@@ -807,21 +807,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->flags & F_PW_STATUS_UP))
-                       return;
-               pw->flags &= ~F_PW_STATUS_UP;
-
-               memset(&kpw, 0, sizeof(kpw));
-               kpw.ifindex = pw->ifindex;
-               kpw.pw_type = fn->fec.u.pwid.type;
-               kpw.af = pw->af;
-               kpw.nexthop = pw->addr;
-               kpw.local_label = fn->local_label;
-               kpw.remote_label = fnh->remote_label;
-               kpw.flags = pw->flags;
-
-               lde_imsg_compose_parent(IMSG_KPWLABEL_DELETE, 0, &kpw,
-                   sizeof(kpw));
+               pw2zpw(pw, &zpw);
+               zpw.local_label = fn->local_label;
+               zpw.remote_label = fnh->remote_label;
+               lde_imsg_compose_parent(IMSG_KPW_UNSET, 0, &zpw, sizeof(zpw));
                break;
        }
 }
@@ -902,8 +891,12 @@ lde_send_labelmapping(struct lde_nbr *ln, struct fec_node *fn, int single)
         */
        lw = (struct lde_wdraw *)fec_find(&ln->sent_wdraw, &fn->fec);
        if (lw) {
-               if (!fec_find(&ln->sent_map_pending, &fn->fec))
+               if (!fec_find(&ln->sent_map_pending, &fn->fec)) {
+                       debug_evt("%s: FEC %s: scheduling to send label "
+                           "mapping later (waiting for pending label release)",
+                           __func__, log_fec(&fn->fec));
                        lde_map_pending_add(ln, fn);
+               }
                return;
        }
 
@@ -949,8 +942,7 @@ lde_send_labelmapping(struct lde_nbr *ln, struct fec_node *fn, int single)
                        map.flags |= F_MAP_PW_CWORD;
                if (pw->flags & F_PW_STATUSTLV) {
                        map.flags |= F_MAP_PW_STATUS;
-                       /* VPLS are always up */
-                       map.pw_status = PW_FORWARDING;
+                       map.pw_status = pw->local_status;
                }
                break;
        }