]> git.puffer.fish Git - mirror/frr.git/commitdiff
ldpd: fixes to handle interface renames properly 431/head
authorRenato Westphal <renato@opensourcerouting.org>
Sun, 30 Apr 2017 13:26:57 +0000 (10:26 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Mon, 1 May 2017 12:37:41 +0000 (09:37 -0300)
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ldpd/interface.c
ldpd/ldp_zebra.c
ldpd/ldpd.h

index b7f473d3960762d05632e66b9cb08a01dfb94f91..f1c9925e976d82feb0b701017f0dbc26916e622d 100644 (file)
@@ -209,7 +209,7 @@ if_addr_add(struct kaddr *ka)
                }
        }
 
-       iface = if_lookup(leconf, ka->ifindex);
+       iface = if_lookup_name(leconf, ka->ifname);
        if (iface) {
                if (ka->af == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&ka->addr.v6))
                        iface->linklocal = ka->addr.v6;
@@ -229,7 +229,7 @@ if_addr_del(struct kaddr *ka)
        struct if_addr          *if_addr;
        struct nbr              *nbr;
 
-       iface = if_lookup(leconf, ka->ifindex);
+       iface = if_lookup_name(leconf, ka->ifname);
        if (iface) {
                if (ka->af == AF_INET6 &&
                    IN6_ARE_ADDR_EQUAL(&iface->linklocal, &ka->addr.v6))
index 702b5c5eaaf5203a37335b5007a628bb105e4460..6fcb273372f8a314b46f9620633b3b54b1f34b44 100644 (file)
@@ -73,6 +73,7 @@ static void
 ifc2kaddr(struct interface *ifp, struct connected *ifc, struct kaddr *ka)
 {
        memset(ka, 0, sizeof(*ka));
+       strlcpy(ka->ifname, ifp->name, sizeof(ka->ifname));
        ka->ifindex = ifp->ifindex;
        ka->af = ifc->address->family;
        ka->prefixlen = ifc->address->prefixlen;
@@ -232,6 +233,7 @@ ldp_interface_delete(int command, struct zclient *zclient, zebra_size_t length,
     vrf_id_t vrf_id)
 {
        struct interface        *ifp;
+       struct kif               kif;
 
        /* zebra_interface_state_read() updates interface structure in iflist */
        ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
@@ -243,7 +245,10 @@ ldp_interface_delete(int command, struct zclient *zclient, zebra_size_t length,
 
        /* To support pseudo interface do not free interface structure.  */
        /* if_delete(ifp); */
-       ifp->ifindex = IFINDEX_INTERNAL;
+       ifp->ifindex = IFINDEX_DELETED;
+
+       ifp2kif(ifp, &kif);
+       main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif));
 
        return (0);
 }
@@ -309,8 +314,8 @@ ldp_interface_address_add(int command, struct zclient *zclient,
        if (bad_addr(ka.af, &ka.addr))
                return (0);
 
-       debug_zebra_in("address add %s/%u", log_addr(ka.af, &ka.addr),
-           ka.prefixlen);
+       debug_zebra_in("address add %s/%u interface %s",
+           log_addr(ka.af, &ka.addr), ka.prefixlen, ifp->name);
 
        /* notify ldpe about new address */
        main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka, sizeof(ka));
@@ -338,8 +343,8 @@ ldp_interface_address_delete(int command, struct zclient *zclient,
        if (bad_addr(ka.af, &ka.addr))
                return (0);
 
-       debug_zebra_in("address delete %s/%u", log_addr(ka.af, &ka.addr),
-           ka.prefixlen);
+       debug_zebra_in("address delete %s/%u interface %s",
+           log_addr(ka.af, &ka.addr), ka.prefixlen, ifp->name);
 
        /* notify ldpe about removed address */
        main_imsg_compose_ldpe(IMSG_DELADDR, 0, &ka, sizeof(ka));
index d2fc5aa3afe8be4d12c0dfacfbd00ec843597e0a..c662a07d57d699624855f4a59e96919e9093f8fa 100644 (file)
@@ -541,6 +541,7 @@ struct kpw {
 };
 
 struct kaddr {
+       char                     ifname[IF_NAMESIZE];
        unsigned short           ifindex;
        int                      af;
        union ldpd_addr          addr;