diff options
author | David Lamparter <equinox@diac24.net> | 2010-02-01 16:41:26 +0100 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2012-07-13 18:54:09 +0200 |
commit | 7f062c217b262e362a3362c677dea6c5e820adf1 (patch) | |
tree | a74cb6fa04df4af9f60d770de5e485c37ba2866d /zebra | |
parent | 1080c13f5d3979149c1950a1c46f45e2d4bd0dc8 (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.c | 21 |
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); |