summaryrefslogtreecommitdiff
path: root/ospfd
diff options
context:
space:
mode:
authorPaul Jakma <paul.jakma@sun.com>2008-09-04 13:52:07 +0100
committerPaul Jakma <paul@quagga.net>2008-09-04 13:52:07 +0100
commitb3bc68e5a4eecd85138463ae5742c2ccaa1db4bb (patch)
tree57f3167f01485aee55ca6fb47dd9b87e0b01bd41 /ospfd
parent742c64ff34a79ad22982c433edd8d7cf32fd9cdf (diff)
[ospfd] Minor enhancements to recent self-host-routes suppression patch
* ospf_spf.c: (ospf_spf_process_stubs) Track whether parent router vertex is the root, so that the host-route suppression logic need only be activated for such vertices. Move the actual logic to ospf_intra_add_stub. * ospf_route.c: (ospf_intra_add_stub) Main test of link moved here, notionally more appropriate.
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_route.c18
-rw-r--r--ospfd/ospf_route.h3
-rw-r--r--ospfd/ospf_spf.c34
3 files changed, 33 insertions, 22 deletions
diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c
index 3a1fa999..50fba750 100644
--- a/ospfd/ospf_route.c
+++ b/ospfd/ospf_route.c
@@ -481,7 +481,8 @@ ospf_intra_add_transit (struct route_table *rt, struct vertex *v,
/* RFC2328 16.1. second stage. */
void
ospf_intra_add_stub (struct route_table *rt, struct router_lsa_link *link,
- struct vertex *v, struct ospf_area *area)
+ struct vertex *v, struct ospf_area *area,
+ int parent_is_root)
{
u_int32_t cost;
struct route_node *rn;
@@ -514,7 +515,20 @@ ospf_intra_add_stub (struct route_table *rt, struct router_lsa_link *link,
if (IS_DEBUG_OSPF_EVENT)
zlog_debug ("ospf_intra_add_stub(): calculated cost is %d + %d = %d",
v->distance, ntohs(link->m[0].metric), cost);
-
+
+ /* PtP links with /32 masks adds host routes to remote, directly
+ * connected hosts, see RFC 2328, 12.4.1.1, Option 1.
+ * Such routes can just be ignored for the sake of tidyness.
+ */
+ if (parent_is_root && link->link_data.s_addr == 0xffffffff &&
+ ospf_if_lookup_by_local_addr (area->ospf, NULL, link->link_id))
+ {
+ if (IS_DEBUG_OSPF_EVENT)
+ zlog_debug ("%s: ignoring host route %s/32 to self.",
+ __func__, inet_ntoa (link->link_id));
+ return;
+ }
+
rn = route_node_get (rt, (struct prefix *) &p);
/* Lookup current routing table. */
diff --git a/ospfd/ospf_route.h b/ospfd/ospf_route.h
index 351e014d..0d37436d 100644
--- a/ospfd/ospf_route.h
+++ b/ospfd/ospf_route.h
@@ -140,7 +140,8 @@ extern void ospf_intra_add_transit (struct route_table *, struct vertex *,
extern void ospf_intra_add_stub (struct route_table *,
struct router_lsa_link *, struct vertex *,
- struct ospf_area *);
+ struct ospf_area *,
+ int parent_is_root);
extern int ospf_route_cmp (struct ospf *, struct ospf_route *,
struct ospf_route *);
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c
index 15d27be7..82f0fedd 100644
--- a/ospfd/ospf_spf.c
+++ b/ospfd/ospf_spf.c
@@ -946,7 +946,8 @@ ospf_spf_dump (struct vertex *v, int i)
/* Second stage of SPF calculation. */
static void
ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v,
- struct route_table *rt)
+ struct route_table *rt,
+ int parent_is_root)
{
struct listnode *cnode, *cnnode;
struct vertex *child;
@@ -981,21 +982,7 @@ ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v,
(l->m[0].tos_count * ROUTER_LSA_TOS_SIZE));
if (l->m[0].type == LSA_LINK_TYPE_STUB)
- {
- /* PtP links with /32 masks adds host routes to the remote host,
- see RFC 2328, 12.4.1.1, Option 1.
- Make sure that such routes are ignored */
- /* XXX: Change to breadth-first and avoid the lookup */
- if (l->link_data.s_addr == 0xffffffff &&
- ospf_if_lookup_by_local_addr (area->ospf, NULL, l->link_id))
- {
- if (IS_DEBUG_OSPF_EVENT)
- zlog_debug ("ospf_spf_process_stubs(): ignoring host route "
- "%s/32 to self.", inet_ntoa (l->link_id));
- continue;
- }
- ospf_intra_add_stub (rt, l, v, area);
- }
+ ospf_intra_add_stub (rt, l, v, area, parent_is_root);
}
}
@@ -1005,8 +992,17 @@ ospf_spf_process_stubs (struct ospf_area *area, struct vertex *v,
{
if (CHECK_FLAG (child->flags, OSPF_VERTEX_PROCESSED))
continue;
-
- ospf_spf_process_stubs (area, child, rt);
+
+ /* the first level of routers connected to the root
+ * should have 'parent_is_root' set, including those
+ * connected via a network vertex.
+ */
+ if (area->spf == v)
+ parent_is_root = 1;
+ else if (v->type == OSPF_VERTEX_ROUTER)
+ parent_is_root = 0;
+
+ ospf_spf_process_stubs (area, child, rt, parent_is_root);
SET_FLAG (child->flags, OSPF_VERTEX_PROCESSED);
}
@@ -1193,7 +1189,7 @@ ospf_spf_calculate (struct ospf_area *area, struct route_table *new_table,
}
/* Second stage of SPF calculation procedure's */
- ospf_spf_process_stubs (area, area->spf, new_table);
+ ospf_spf_process_stubs (area, area->spf, new_table, 0);
/* Free candidate queue. */
pqueue_delete (candidate);