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>
This commit is contained in:
David Lamparter 2010-02-01 16:41:26 +01:00 committed by David Lamparter
parent 1080c13f5d
commit 7f062c217b

View File

@ -1297,14 +1297,29 @@ 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. */
#if 0
/* Redistribute this information. */
zebra_interface_address_delete_update (ifp, ifc);
/* 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);
/* Redistribute this information. */
zebra_interface_address_delete_update (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);
connected_free (ifc);