[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/lib/ChangeLog b/lib/ChangeLog
index b54b745..db3c546 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,8 @@
+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.
+
 2006-05-15 Paul Jakma <paul.jakma@sun.com>
 
 	* log.c: (general) Generalise struct zebra_route_desc into
diff --git a/lib/if.h b/lib/if.h
index 20df7ef..0a4ff14 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -145,6 +145,12 @@
   u_char conf;
 #define ZEBRA_IFC_REAL         (1 << 0)
 #define ZEBRA_IFC_CONFIGURED   (1 << 1)
+  /*
+     The ZEBRA_IFC_REAL flag should be set if and only if this address
+     exists in the kernel.
+     The ZEBRA_IFC_CONFIGURED flag should be set if and only if this address
+     was configured by the user from inside quagga.
+   */
 
   /* Flags for connected address. */
   u_char flags;
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 */
     }