mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 14:34:22 +00:00
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:
parent
d9628728e0
commit
b13c1d9299
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user