summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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. */