]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: lingering IP address after deletion (BZ#486)
authorDavid Lamparter <equinox@diac24.net>
Mon, 1 Feb 2010 15:41:26 +0000 (16:41 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Fri, 13 Jul 2012 16:54:09 +0000 (18:54 +0200)
zebra address bookkeeping is a mess. this is just a workaround to have
IPv4 address deletion somewhat working on Linux.

the if_unset_prefix call is synchronous, when it returns success the
address deletion completed successfully. this is either signaled by a
netlink ACK or by an OK return value from ioctl().

This version is wrapped by #ifdef HAVE_NETLINK so we don't touch the
BSDs for now.

* zebra/interface.c: On Linux, update zebra internal state after
  deleting an address.

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

index 22422594c7f417a639af88c43f197966a5eb1884..3578b79008358800be8d1e72a508cbc28ba46268 100644 (file)
@@ -1297,13 +1297,28 @@ ip_address_uninstall (struct vty *vty, struct interface *ifp,
               safe_strerror(errno), VTY_NEWLINE);
       return CMD_WARNING;
     }
+  /* success! call returned that the address deletion went through.
+   * this is a synchronous operation, so we know it succeeded and can
+   * now update all internal state. */
+
+  /* the HAVE_NETLINK check is only here because, on BSD, although the
+   * call above is still synchronous, we get a second confirmation later
+   * through the route socket, and we don't want to touch that behaviour
+   * for now.  It should work without the #ifdef, but why take the risk...
+   * -- equinox 2012-07-13 */
+#ifdef HAVE_NETLINK
+
+  /* Remove connected route. */
+  connected_down_ipv4 (ifp, ifc);
 
-#if 0
   /* Redistribute this information. */
   zebra_interface_address_delete_update (ifp, ifc);
 
-  /* Remove connected route. */
-  connected_down_ipv4 (ifp, ifc);
+  /* IP address propery set. */
+  UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL);
+
+  /* remove from interface, remark secondaries */
+  if_subnet_delete (ifp, ifc);
 
   /* Free address information. */
   listnode_delete (ifp->connected, ifc);