summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <stephen.hemminger@vyatta.com>2008-12-23 09:49:28 -0800
committerStephen Hemminger <stephen.hemminger@vyatta.com>2008-12-23 09:49:28 -0800
commitdcc88cf610dea7cd46738706c6e81cd23eb0a797 (patch)
tree5b86b99393a3ae6b096de686cd4c0c3092c1525b
parent2372cf6268b73c10fa30923229a59bfc8a138544 (diff)
downloadquagga-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.c59
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. */