mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00
ospfd: Assure OSPF AS External routes are installed after link flap
OSPF intra/inter area routes were previously marked to assure they
are re-installed after a fast link flap in the commit:
commit effee18744
Author: Donald Sharp <sharpd@nvidia.com>
Date: Mon May 24 13:45:29 2021 -0400
ospfd: Fix quick interface down up event handling in ospf
This commit extends this fix to OSPF AS External routes as well.
Signed-off-by: Acee <aceelindem@gmail.com>
This commit is contained in:
parent
eae228c52d
commit
7ac19946b5
|
@ -480,7 +480,7 @@ static int ospf_ase_route_match_same(struct route_table *rt,
|
|||
|
||||
assert(or);
|
||||
|
||||
if (or->path_type != newor->path_type)
|
||||
if (or->changed || (or->path_type != newor->path_type))
|
||||
return 0;
|
||||
|
||||
switch (or->path_type) {
|
||||
|
|
|
@ -821,14 +821,41 @@ int ospf_if_up(struct ospf_interface *oi)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int ospf_if_down(struct ospf_interface *oi)
|
||||
/* This function will mark routes with next-hops matching the down
|
||||
* OSPF interface as changed. It is used to assure routes that get
|
||||
* removed from the zebra RIB when an interface goes down are
|
||||
* reinstalled if the interface comes back up prior to an intervening
|
||||
* SPF calculation.
|
||||
*/
|
||||
static void ospf_if_down_mark_routes_changed(struct route_table *table,
|
||||
struct ospf_interface *oi)
|
||||
{
|
||||
struct ospf *ospf;
|
||||
struct route_node *rn;
|
||||
struct ospf_route *or;
|
||||
struct listnode *nh;
|
||||
struct ospf_path *op;
|
||||
|
||||
for (rn = route_top(table); rn; rn = route_next(rn)) {
|
||||
or = rn->info;
|
||||
|
||||
if (or == NULL)
|
||||
continue;
|
||||
|
||||
for (nh = listhead(or->paths); nh;
|
||||
nh = listnextnode_unchecked(nh)) {
|
||||
op = listgetdata(nh);
|
||||
if (op->ifindex == oi->ifp->ifindex) {
|
||||
or->changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int ospf_if_down(struct ospf_interface *oi)
|
||||
{
|
||||
struct ospf *ospf;
|
||||
|
||||
if (oi == NULL)
|
||||
return 0;
|
||||
|
||||
|
@ -864,23 +891,11 @@ int ospf_if_down(struct ospf_interface *oi)
|
|||
/* Shutdown packet reception and sending */
|
||||
ospf_if_stream_unset(oi);
|
||||
|
||||
if (!ospf->new_table)
|
||||
return 1;
|
||||
for (rn = route_top(ospf->new_table); rn; rn = route_next(rn)) {
|
||||
or = rn->info;
|
||||
if (ospf->new_table)
|
||||
ospf_if_down_mark_routes_changed(ospf->new_table, oi);
|
||||
|
||||
if (!or)
|
||||
continue;
|
||||
|
||||
for (nh = listhead(or->paths); nh;
|
||||
nh = listnextnode_unchecked(nh)) {
|
||||
op = listgetdata(nh);
|
||||
if (op->ifindex == oi->ifp->ifindex) {
|
||||
or->changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ospf->new_external_route)
|
||||
ospf_if_down_mark_routes_changed(ospf->new_external_route, oi);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue