summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authorJoakim Tjernlund <Joakim.Tjernlund@transmode.se>2009-07-27 12:42:31 +0200
committerPaul Jakma <paul@quagga.net>2009-07-30 16:18:30 +0100
commitbd5403778b0d96258730050e4526c7c72903e60b (patch)
treebcd21a0f78175f0693857bc7eaadef30d8b3c4a6 /ospfd
parent4a5f432fa07f33da5ad05d18e4ba81d57b44af8e (diff)
downloadquagga-bd5403778b0d96258730050e4526c7c72903e60b.tar.bz2
quagga-bd5403778b0d96258730050e4526c7c72903e60b.tar.xz
ospfd: Discriminate better when selecting links between vertices in SPF
* ospf_spf.c: (ospf_get_next_link) One must check the vertex type, Router or Network, to select type link to match against. Link type 1 has neighbour router ID in link_id and link type 2 has IP address of DR. Since router id may have same value as an existing IP address one risks matching a router ID against a DR.
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_spf.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c
index 82f0fedd..12afe5d9 100644
--- a/ospfd/ospf_spf.c
+++ b/ospfd/ospf_spf.c
@@ -369,8 +369,12 @@ ospf_get_next_link (struct vertex *v, struct vertex *w,
{
u_char *p;
u_char *lim;
+ u_char lsa_type = LSA_LINK_TYPE_TRANSIT;
struct router_lsa_link *l;
+ if (w->type == OSPF_VERTEX_ROUTER)
+ lsa_type = LSA_LINK_TYPE_POINTOPOINT;
+
if (prev_link == NULL)
p = ((u_char *) v->lsa) + OSPF_LSA_HEADER_SIZE + 4;
else
@@ -388,13 +392,7 @@ ospf_get_next_link (struct vertex *v, struct vertex *w,
p += (ROUTER_LSA_MIN_SIZE + (l->m[0].tos_count * ROUTER_LSA_TOS_SIZE));
- if (l->m[0].type == LSA_LINK_TYPE_STUB)
- continue;
-
- /* Defer NH calculation via VLs until summaries from
- transit areas area confidered */
-
- if (l->m[0].type == LSA_LINK_TYPE_VIRTUALLINK)
+ if (l->m[0].type != lsa_type)
continue;
if (IPV4_ADDR_SAME (&l->link_id, &w->id))