diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-12-23 09:49:28 -0800 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-12-23 09:49:28 -0800 |
commit | dcc88cf610dea7cd46738706c6e81cd23eb0a797 (patch) | |
tree | 5b86b99393a3ae6b096de686cd4c0c3092c1525b | |
parent | 2372cf6268b73c10fa30923229a59bfc8a138544 (diff) | |
download | quagga-dcc88cf610dea7cd46738706c6e81cd23eb0a797.tar.bz2 quagga-dcc88cf610dea7cd46738706c6e81cd23eb0a797.tar.xz |
Add more to interface rename updates
When interface is renamed notify daemons of addresses that are
now available.
-rw-r--r-- | zebra/interface.c | 59 |
1 files changed, 36 insertions, 23 deletions
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. */ |