2005-07-29 Paul Jakma <paul.jakma@sun.com>

	* interface.c: (if_delete_update) should always be available, not
	  just on RTM_IFANNOUNCE/NETLINK systems.
	* kernel_socket.c: (ifan_read) only call if_delete_update when
	  interface departs, dont if_delete, because we wish to retain
	  interface configuration state even when interfaces are removed.
	  (ifm_read) If we dont have RTM_IFANNOUNCE, then transitioning
	  to down state is only chance we have to clean up interface in case
	  it is deleted (eg Solaris down -> unplumb -> plumb up).
	* redistribute.c: (zebra_interface_delete_update) should always be
	  available, we /will/ call it now on all systems, via
	  if_delete_update.
	* zserv.c: (zsend_interface_delete) ditto
	  (zsend_interface_address) Update the call-flow diagramme, to
	  reflect that if_delete_update /is/ now called on all systems,
	  potentially.
	* zserv.h: (zsend_interface_delete) unconditionally exported, as
	  above.
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index a27bebd..b2985c9 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -227,10 +227,7 @@
       if_add_update (ifp);
     }
   else if (ifp != NULL && ifan->ifan_what == IFAN_DEPARTURE)
-    {
-      if_delete_update (ifp);
-      if_delete (ifp);
-    }
+    if_delete_update (ifp);
 
   if_get_flags (ifp);
   if_get_mtu (ifp);
@@ -397,7 +394,21 @@
 	{
 	  ifp->flags = ifm->ifm_flags;
 	  if (! if_is_up (ifp))
-	    if_down (ifp);
+	    {
+	      if_down (ifp);
+#ifndef RTM_IFANNOUNCE
+              /* No RTM_IFANNOUNCE on this platform, so we can never
+               * distinguish between down and delete. We must presume
+               * it has been deleted.
+               * Eg, Solaris will not notify us of unplumb.
+               *
+               * XXX: Fixme - this should be runtime detected
+               * So that a binary compiled on a system with IFANNOUNCE
+               * will still behave correctly if run on a platform without
+               */
+              if_delete_update (ifp);
+#endif /* RTM_IFANNOUNCE */
+            }
 	}
       else
 	{