diff options
| -rw-r--r-- | zebra/ChangeLog | 20 | ||||
| -rw-r--r-- | zebra/interface.c | 10 | ||||
| -rw-r--r-- | zebra/kernel_socket.c | 21 | ||||
| -rw-r--r-- | zebra/redistribute.c | 7 | ||||
| -rw-r--r-- | zebra/zserv.c | 11 | ||||
| -rw-r--r-- | zebra/zserv.h | 2 | 
6 files changed, 39 insertions, 32 deletions
diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 374f8547..3e9629f5 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 8032614f..92e43d97 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -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 diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index a27bebde..b2985c9d 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -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  	{ diff --git a/zebra/redistribute.c b/zebra/redistribute.c index dff6cb54..677e6f90 100644 --- a/zebra/redistribute.c +++ b/zebra/redistribute.c @@ -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 diff --git a/zebra/zserv.c b/zebra/zserv.c index f08f7ce8..eb126feb 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -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]   *             ^                        ^ diff --git a/zebra/zserv.h b/zebra/zserv.h index 8e67c605..f7d3f8c0 100644 --- a/zebra/zserv.h +++ b/zebra/zserv.h @@ -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 *);  | 
