From 6eb8827d669b06d7b38357860d23fa33e0c0078e Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 29 Jul 2005 14:36:00 +0000 Subject: 2005-07-29 Paul Jakma * 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 | 20 ++++++++++++++++++++ zebra/interface.c | 10 +--------- zebra/kernel_socket.c | 21 ++++++++++++++++----- zebra/redistribute.c | 7 ------- zebra/zserv.c | 11 ++--------- zebra/zserv.h | 2 -- 6 files changed, 39 insertions(+), 32 deletions(-) (limited to 'zebra') 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 + + * 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 * (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 *); -- cgit v1.2.1