ospf6d: handle missing link local address more gracefully

ospf6 can't run on an interface without a link local address.
Don't start the state machine when an interface comes up without
such an ip and bring it up later, when a usable link local
address is added.

Signed-off-by: Christian Franke <chris@opensourcerouting.org>
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
Christian Franke 2012-12-13 16:11:16 +01:00 committed by David Lamparter
parent d9628728e0
commit b13c1d9299
2 changed files with 22 additions and 6 deletions

View File

@ -287,8 +287,7 @@ ospf6_interface_if_add (struct interface *ifp)
} }
/* interface start */ /* interface start */
if (oi->area) ospf6_interface_state_update(oi->interface);
thread_add_event (master, interface_up, oi, 0);
} }
void void
@ -327,7 +326,9 @@ ospf6_interface_state_update (struct interface *ifp)
if (CHECK_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE)) if (CHECK_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE))
return; 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); thread_add_event (master, interface_up, oi, 0);
else else
thread_add_event (master, interface_down, oi, 0); thread_add_event (master, interface_down, oi, 0);
@ -647,6 +648,16 @@ interface_up (struct thread *thread)
return 0; 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 already enabled, do nothing */
if (oi->state > OSPF6_INTERFACE_DOWN) if (oi->state > OSPF6_INTERFACE_DOWN)
{ {

View File

@ -165,8 +165,10 @@ ospf6_zebra_if_address_update_add (int command, struct zclient *zclient,
buf, sizeof (buf)), c->address->prefixlen); buf, sizeof (buf)), c->address->prefixlen);
if (c->address->family == AF_INET6) 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; return 0;
} }
@ -188,7 +190,10 @@ ospf6_zebra_if_address_update_delete (int command, struct zclient *zclient,
buf, sizeof (buf)), c->address->prefixlen); buf, sizeof (buf)), c->address->prefixlen);
if (c->address->family == AF_INET6) 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; return 0;
} }