summaryrefslogtreecommitdiff
path: root/ospfd
diff options
context:
space:
mode:
authorAyan Banerjee <ayan@cumulusnetworks.com>2012-12-03 10:48:46 -0800
committerScott Feldman <sfeldma@cumulusnetworks.com>2013-01-07 09:59:40 -0800
commit16a86b3e2f82d3e19a722e2ab34c2c77f62ed926 (patch)
tree7c0826c1f684292ec80f8b7898e07f9c8e56b3f1 /ospfd
parente1a555b67cc868f95ea2b53c278bd8d091333e5f (diff)
ospf: suppress delete using replacement
After a SPF run, OSPF deletes routes that have changed in terms of any metric, type, and/or next-hops and re-adds them. Given that the Zebra-RIB already support replacement semantics, we suppress deletes for routes that will be added back again. This has the following advantages. It reduces the number of IPC messages between OSPF/Zebra. Also, in the current flow, a batch of route deletes were followed by a batch of adds even for say a metric change. With the change, routes are sent as "add" when they are modified. Zebra already implicitly deletes older routes. Signed-off-by: Ayan Banerjee <ayan@cumulusnetworks.com> Reviewed-by: Scott Feldman <sfeldma@cumulusnetworks.com> Reviewed-by: Dinesh Dutt <ddutt@cumulusnetworks.com> Signed-off-by: Scott Feldman <sfeldma@cumulusnetworks.com>
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_route.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c
index c3acba34..eb7829ac 100644
--- a/ospfd/ospf_route.c
+++ b/ospfd/ospf_route.c
@@ -126,6 +126,31 @@ ospf_route_table_free (struct route_table *rt)
route_table_finish (rt);
}
+/* If a prefix exists in the new routing table, then return 1,
+ otherwise return 0. Since the ZEBRA-RIB does an implicit
+ withdraw, it is not necessary to send a delete, an add later
+ will act like an implicit delete. */
+static int
+ospf_route_exist_new_table (struct route_table *rt, struct prefix_ipv4 *prefix)
+{
+ struct route_node *rn;
+
+ assert (rt);
+ assert (prefix);
+
+ rn = route_node_lookup (rt, (struct prefix *) prefix);
+ if (!rn) {
+ return 0;
+ }
+ route_unlock_node (rn);
+
+ if (!rn->info) {
+ return 0;
+ }
+
+ return 1;
+}
+
/* If a prefix and a nexthop match any route in the routing table,
then return 1, otherwise return 0. */
int
@@ -223,13 +248,13 @@ ospf_route_delete_uniq (struct route_table *rt, struct route_table *cmprt)
{
if (or->type == OSPF_DESTINATION_NETWORK)
{
- if (! ospf_route_match_same (cmprt,
- (struct prefix_ipv4 *) &rn->p, or))
+ if (! ospf_route_exist_new_table (cmprt,
+ (struct prefix_ipv4 *) &rn->p))
ospf_zebra_delete ((struct prefix_ipv4 *) &rn->p, or);
}
else if (or->type == OSPF_DESTINATION_DISCARD)
- if (! ospf_route_match_same (cmprt,
- (struct prefix_ipv4 *) &rn->p, or))
+ if (! ospf_route_exist_new_table (cmprt,
+ (struct prefix_ipv4 *) &rn->p))
ospf_zebra_delete_discard ((struct prefix_ipv4 *) &rn->p);
}
}