[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/ChangeLog b/zebra/ChangeLog
index 3ad0e83..e70efae 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,11 @@
+2006-05-21 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+	* 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.
+
 2006-05-19 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
 	* connected.c: (connected_add_ipv4,connected_add_ipv6) If the
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 */
     }