[interface configuration] Try to avoid losing address info after shutdown.
2006-05-21 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
* if.h: (struct connected) Document the meaning of the
ZEBRA_IFC_REAL and ZEBRA_IFC_CONFIGURED flags.
* connected.c: (connected_withdraw) Do not delete the connected
address if the ZEBRA_IFC_CONFIGURED flag is set.
(connected_add_ipv4,connected_add_ipv6) Before calling
connected_withdraw, unset the ZEBRA_IFC_CONFIGURED flag
on the superseded connected structure.
diff --git a/zebra/connected.c b/zebra/connected.c
index 39f4780..37aa456 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -60,8 +60,11 @@
UNSET_FLAG (ifc->conf, ZEBRA_IFC_REAL);
}
- listnode_delete (ifc->ifp->connected, ifc);
- connected_free (ifc);
+ if (!CHECK_FLAG (ifc->conf, ZEBRA_IFC_CONFIGURED))
+ {
+ listnode_delete (ifc->ifp->connected, ifc);
+ connected_free (ifc);
+ }
}
static void
@@ -227,7 +230,10 @@
if ((current = connected_check (ifp, (struct prefix *) ifc->address)))
{
if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED))
- SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
+ {
+ SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
+ UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED);
+ }
connected_withdraw (current); /* implicit withdraw - freebsd does this */
}
@@ -370,7 +376,10 @@
if ((current = connected_check (ifp, (struct prefix *) ifc->address)))
{
if (CHECK_FLAG(current->conf, ZEBRA_IFC_CONFIGURED))
- SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
+ {
+ SET_FLAG(ifc->conf, ZEBRA_IFC_CONFIGURED);
+ UNSET_FLAG(current->conf, ZEBRA_IFC_CONFIGURED);
+ }
connected_withdraw (current); /* implicit update of existing address */
}