summaryrefslogtreecommitdiff
path: root/ospfd/ospf_interface.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2021-05-24 13:45:29 -0400
committerDonald Sharp <sharpd@nvidia.com>2021-05-25 14:43:40 -0400
commiteffee18744ad3e1777614f58350d74fb718d3211 (patch)
treee6e55034a884761386396cc963f83e7e93c42083 /ospfd/ospf_interface.c
parent99447cf226c45d1bda38a489e1a9160891e5a02b (diff)
ospfd: Fix quick interface down up event handling in ospf
When we get this sequence of events: - zebra receives interface up, sends to ospf - ospf receives intf up, processes( including neighbor formation and spf ) and sends route to zebra for installation. - zebra receives route for processing, schedules it too happen in the future - zebra receives interface down event, sends to ospf - zebra processes route X and marks it inactive because nexthop interface is down - zebra receives interface up event, sends to ospf - ospf receives both events and processes the change and decides that nothing has changed so it does not send any route change for X to zebra. At this point zebra has a route from ospf that is marked as inactive, while ospf believes that the route should be installed properly. Modify the code such that on an interface down event, ospf marks the routes as changed if the ifindex is being used for a nexthop, so that when ospf is deciding if routes have changed post spf that it can just automatically send that route down again if it still exists. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'ospfd/ospf_interface.c')
-rw-r--r--ospfd/ospf_interface.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index 334ed33ee0..b4e318d1d1 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -49,6 +49,7 @@
#include "ospfd/ospf_network.h"
#include "ospfd/ospf_dump.h"
#include "ospfd/ospf_ldp_sync.h"
+#include "ospfd/ospf_route.h"
DEFINE_QOBJ_TYPE(ospf_interface);
DEFINE_HOOK(ospf_vl_add, (struct ospf_vl_data * vd), (vd));
@@ -804,6 +805,10 @@ int ospf_if_up(struct ospf_interface *oi)
int ospf_if_down(struct ospf_interface *oi)
{
struct ospf *ospf;
+ struct route_node *rn;
+ struct ospf_route *or;
+ struct listnode *nh;
+ struct ospf_path *op;
if (oi == NULL)
return 0;
@@ -840,6 +845,22 @@ int ospf_if_down(struct ospf_interface *oi)
/* Shutdown packet reception and sending */
ospf_if_stream_unset(oi);
+ for (rn = route_top(ospf->new_table); rn; rn = route_next(rn)) {
+ or = rn->info;
+
+ 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;
+ }
+ }
+ }
+
return 1;
}