]> git.proxmox.com Git - mirror_frr.git/commitdiff
2005-07-29 Paul Jakma <paul.jakma@sun.com>
authorpaul <paul>
Fri, 29 Jul 2005 14:36:00 +0000 (14:36 +0000)
committerpaul <paul>
Fri, 29 Jul 2005 14:36:00 +0000 (14:36 +0000)
* 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.

zebra/ChangeLog
zebra/interface.c
zebra/kernel_socket.c
zebra/redistribute.c
zebra/zserv.c
zebra/zserv.h

index 374f8547c75c5b27d42e36cc9d84a5db89c082a8..3e9629f53c6b99bee74eea198e26e7d9af2ef418 100644 (file)
@@ -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
index 8032614fa3cc7087cc097dd52ae7f269627f378a..92e43d97e0cd07cff8d2d895f540637244adab0a 100644 (file)
@@ -290,14 +290,7 @@ if_add_update (struct interface *ifp)
     }
 }
 
-
-/* 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 @@ if_delete_update (struct interface *ifp)
      interface deletion message. */
   ifp->ifindex = IFINDEX_INTERNAL;
 }
-#endif /* (defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK) */
 
 /* Interface is up. */
 void
index a27bebded86184a1c8a8d9a014b8da01da1ebb4a..b2985c9d91efd4280660b255c7d6cc6227f48ee0 100644 (file)
@@ -227,10 +227,7 @@ ifan_read (struct if_announcemsghdr *ifan)
       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 @@ ifm_read (struct if_msghdr *ifm)
        {
          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
        {
index dff6cb54e5f0a1a0ca8243b6a635833d064923ba..677e6f9082e7f460e34132439aa3ddbe804815ac 100644 (file)
@@ -345,12 +345,6 @@ zebra_interface_add_update (struct interface *ifp)
       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 @@ zebra_interface_delete_update (struct interface *ifp)
     if (client->ifinfo)
       zsend_interface_delete (client, ifp);
 }
-#endif /* defined(RTM_IFANNOUNCE) || defined(HAVE_NETLINK) */
 
 /* Interface address addition. */
 void
index f08f7ce8f5f7c513827be4b3d61790efbc1846c8..eb126feb1538f448ad8ab5dfe9085b53e49c9309 100644 (file)
@@ -203,12 +203,6 @@ zsend_interface_add (struct zserv *client, struct interface *ifp)
 }
 
 /* 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 @@ zsend_interface_delete (struct zserv *client, struct interface *ifp)
 
   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 @@ zsend_interface_delete (struct zserv *client, struct interface *ifp)
  *                           |                        
  *          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]
  *             ^                        ^
index 8e67c605c90cdf8d40762fc34ce2802ab3cc6ddd..f7d3f8c07e87b8032410f27d36ecb892bffd7b20 100644 (file)
@@ -96,9 +96,7 @@ extern void zebra_snmp_init (void);
 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 *);