summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ospf6d/ospf6_interface.c17
-rw-r--r--ospf6d/ospf6_zebra.c11
2 files changed, 22 insertions, 6 deletions
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index d9d2d03b..8d427645 100644
--- a/ospf6d/ospf6_interface.c
+++ b/ospf6d/ospf6_interface.c
@@ -287,8 +287,7 @@ ospf6_interface_if_add (struct interface *ifp)
}
/* interface start */
- if (oi->area)
- thread_add_event (master, interface_up, oi, 0);
+ ospf6_interface_state_update(oi->interface);
}
void
@@ -327,7 +326,9 @@ ospf6_interface_state_update (struct interface *ifp)
if (CHECK_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE))
return;
- if (if_is_operative (ifp))
+ if (if_is_operative (ifp)
+ && (ospf6_interface_get_linklocal_address(oi->interface)
+ || if_is_loopback(oi->interface)))
thread_add_event (master, interface_up, oi, 0);
else
thread_add_event (master, interface_down, oi, 0);
@@ -647,6 +648,16 @@ interface_up (struct thread *thread)
return 0;
}
+ /* check interface has a link-local address */
+ if (! (ospf6_interface_get_linklocal_address(oi->interface)
+ || if_is_loopback(oi->interface)))
+ {
+ if (IS_OSPF6_DEBUG_INTERFACE)
+ zlog_debug ("Interface %s has no link local address, can't execute [InterfaceUp]",
+ oi->interface->name);
+ return 0;
+ }
+
/* if already enabled, do nothing */
if (oi->state > OSPF6_INTERFACE_DOWN)
{
diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c
index 50ecc170..cffd7675 100644
--- a/ospf6d/ospf6_zebra.c
+++ b/ospf6d/ospf6_zebra.c
@@ -165,8 +165,10 @@ ospf6_zebra_if_address_update_add (int command, struct zclient *zclient,
buf, sizeof (buf)), c->address->prefixlen);
if (c->address->family == AF_INET6)
- ospf6_interface_connected_route_update (c->ifp);
-
+ {
+ ospf6_interface_state_update (c->ifp);
+ ospf6_interface_connected_route_update (c->ifp);
+ }
return 0;
}
@@ -188,7 +190,10 @@ ospf6_zebra_if_address_update_delete (int command, struct zclient *zclient,
buf, sizeof (buf)), c->address->prefixlen);
if (c->address->family == AF_INET6)
- ospf6_interface_connected_route_update (c->ifp);
+ {
+ ospf6_interface_connected_route_update (c->ifp);
+ ospf6_interface_state_update (c->ifp);
+ }
return 0;
}