From dcc88cf610dea7cd46738706c6e81cd23eb0a797 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 23 Dec 2008 09:49:28 -0800 Subject: Add more to interface rename updates When interface is renamed notify daemons of addresses that are now available. --- zebra/interface.c | 59 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 23 deletions(-) (limited to 'zebra/interface.c') diff --git a/zebra/interface.c b/zebra/interface.c index 75a3e1cb..329547b4 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -488,34 +488,47 @@ if_delete_update (struct interface *ifp) void if_rename (struct interface *ifp, const char *name) { - struct interface *oifp; + struct interface *oifp; - zebra_interface_delete_update (ifp); - listnode_delete (iflist, ifp); + UNSET_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE); + zebra_interface_delete_update (ifp); + listnode_delete (iflist, ifp); - /* rename overlaps earlier interface */ - oifp = if_lookup_by_name(name); - if (oifp) - { - if (oifp->ifindex != IFINDEX_INTERNAL) - { - zlog_err ("interface %s rename to %s overlaps with index %d", - ifp->name, name, oifp->ifindex); - if_delete_update (oifp); - } - else if (IS_ZEBRA_DEBUG_KERNEL) - zlog_debug ("interface %s index %d superseded by rename of %s", - oifp->name, oifp->ifindex, ifp->name); + /* rename overlaps earlier interface */ + oifp = if_lookup_by_name(name); + if (oifp) + { + if (oifp->ifindex != IFINDEX_INTERNAL) + { + zlog_err ("interface %s rename to %s overlaps with index %d", + ifp->name, name, oifp->ifindex); + if_delete_update (oifp); + } + else if (IS_ZEBRA_DEBUG_KERNEL) + zlog_debug ("interface %s index %d superseded by rename of %s", + oifp->name, oifp->ifindex, ifp->name); - listnode_delete (iflist, oifp); - XFREE (MTYPE_IF, oifp); - } + listnode_delete (iflist, oifp); + XFREE (MTYPE_IF, oifp); + } - strncpy(ifp->name, name, INTERFACE_NAMSIZ); - ifp->name[INTERFACE_NAMSIZ] = 0; - listnode_add_sort (iflist, ifp); + strncpy(ifp->name, name, INTERFACE_NAMSIZ); + ifp->name[INTERFACE_NAMSIZ] = 0; + listnode_add_sort (iflist, ifp); + + zebra_interface_add_update (ifp); + + SET_FLAG (ifp->status, ZEBRA_INTERFACE_ACTIVE); + + if (ifp->connected) + { + struct connected *ifc; + struct listnode *node; + for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc)) + zebra_interface_address_add_update (ifp, ifc); + } - zebra_interface_add_update (ifp); + rib_update(); } /* Interface is up. */ -- cgit v1.2.3