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/ChangeLog b/zebra/ChangeLog
index 374f854..3e9629f 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,23 @@
+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.
+	  
 2005-06-28 Paul Jakma <paul.jakma@sun.com>
 
 	* (global) Extern and static'ification, with related fixups
diff --git a/zebra/interface.c b/zebra/interface.c
index 8032614..92e43d9 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -290,14 +290,7 @@
     }
 }
 
-
-/* Handle an interface delete event
- * 
- * This function is only called  when support for
- * RTM_IFANNOUNCE or AF_NETLINK sockets (RTM_DELLINK message)
- * is available. It is not called on, eg, Solaris.
- */
-#if (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK))
+/* Handle an interface delete event */
 void 
 if_delete_update (struct interface *ifp)
 {
@@ -405,7 +398,6 @@
      interface deletion message. */
   ifp->ifindex = IFINDEX_INTERNAL;
 }
-#endif /* (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK) */
 
 /* Interface is up. */
 void
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
 	{
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index dff6cb5..677e6f9 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -345,12 +345,6 @@
       zsend_interface_add (client, ifp);
 }
 
-/*
- * This function is only called  when support for 
- * RTM_IFANNOUNCE or AF_NETLINK sockets (RTM_DELLINK message)
- * is available. It is not called on Solaris.
- */
-#if (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK))
 void
 zebra_interface_delete_update (struct interface *ifp)
 {
@@ -364,7 +358,6 @@
     if (client->ifinfo)
       zsend_interface_delete (client, ifp);
 }
-#endif /* defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK) */
 
 /* Interface address addition. */
 void
diff --git a/zebra/zserv.c b/zebra/zserv.c
index f08f7ce..eb126fe 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -203,12 +203,6 @@
 }
 
 /* Interface deletion from zebra daemon. */
-/*
- * This function is only called  when support for 
- * RTM_IFANNOUNCE or AF_NETLINK sockets (RTM_DELLINK message)
- * is available. It is not called on Solaris.
- */
-#if (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK))
 int
 zsend_interface_delete (struct zserv *client, struct interface *ifp)
 {
@@ -240,7 +234,6 @@
 
   return zebra_server_send_message (client);
 }
-#endif /* (defined(RTM_IFANNOUNCE) || defined(HAVE_LINUX_RTNETLINK_H)) */
 
 /* Interface address is added/deleted. Send ZEBRA_INTERFACE_ADDRESS_ADD or
  * ZEBRA_INTERFACE_ADDRESS_DELETE to the client. 
@@ -266,8 +259,8 @@
  *                           |                        
  *          zebra_interface_address_delete_update    
  *             ^                        ^      ^
- *             |                        |      if_delete_update (not called on 
- *             |                        |                         Solaris)
+ *             |                        |      if_delete_update
+ *             |                        |
  *         ip_address_uninstall        connected_delete_ipv4
  *         [ipv6_addresss_uninstall]   [connected_delete_ipv6]
  *             ^                        ^
diff --git a/zebra/zserv.h b/zebra/zserv.h
index 8e67c60..f7d3f8c 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -96,9 +96,7 @@
 extern void zebra_vty_init (void);
 
 extern int zsend_interface_add (struct zserv *, struct interface *);
-#if (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK))
 extern int zsend_interface_delete (struct zserv *, struct interface *);
-#endif
 extern int zsend_interface_address (int, struct zserv *, struct interface *,
                                     struct connected *);
 extern int zsend_interface_update (int, struct zserv *, struct interface *);