]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: fix interface deletion bug introduced by ptp address support
authorDavid Lamparter <equinox@diac24.net>
Sat, 27 Mar 2010 17:31:42 +0000 (18:31 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Sun, 27 Aug 2017 21:40:23 +0000 (23:40 +0200)
meh. forgot to even look at the interface deletion path. this doesn't
really work well when looking for the local address in the subnet list
which has the connected prefix in it... loop ensues.

fix by using the connected prefix when looking at the list of connected
prefixes. duh.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
zebra/interface.c

index 9b4af1786e6b91aee95e4f05c28d76337ec5c768..7dcf30d71e14f729aa3aa910de5593b255b9c3a4 100644 (file)
@@ -569,7 +569,7 @@ static void if_uninstall_connected(struct interface *ifp)
 static void if_delete_connected(struct interface *ifp)
 {
        struct connected *ifc;
-       struct prefix *p;
+       struct prefix cp;
        struct route_node *rn;
        struct zebra_if *zebra_if;
 
@@ -582,11 +582,13 @@ static void if_delete_connected(struct interface *ifp)
                while ((node = (last ? last->next
                                     : listhead(ifp->connected)))) {
                        ifc = listgetdata(node);
-                       p = ifc->address;
 
-                       if (p->family == AF_INET
+                       cp = *CONNECTED_PREFIX(ifc);
+                       apply_mask(&cp);
+
+                       if (cp.family == AF_INET
                            && (rn = route_node_lookup(zebra_if->ipv4_subnets,
-                                                      p))) {
+                                                      &cp))) {
                                struct listnode *anode;
                                struct listnode *next;
                                struct listnode *first;
@@ -639,7 +641,7 @@ static void if_delete_connected(struct interface *ifp)
                                list_delete(addr_list);
                                rn->info = NULL;
                                route_unlock_node(rn);
-                       } else if (p->family == AF_INET6) {
+                       } else if (cp.family == AF_INET6) {
                                connected_down_ipv6(ifp, ifc);
 
                                zebra_interface_address_delete_update(ifp, ifc);