summaryrefslogtreecommitdiff
path: root/zebra
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@diac24.net>2010-02-01 16:41:26 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2012-07-13 18:54:09 +0200
commit7f062c217b262e362a3362c677dea6c5e820adf1 (patch)
treea74cb6fa04df4af9f60d770de5e485c37ba2866d /zebra
parent1080c13f5d3979149c1950a1c46f45e2d4bd0dc8 (diff)
zebra: lingering IP address after deletion (BZ#486)
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>
Diffstat (limited to 'zebra')
-rw-r--r--zebra/interface.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/zebra/interface.c b/zebra/interface.c
index 22422594..3578b790 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -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);