diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2010-11-10 16:43:11 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2010-11-10 16:43:11 +0100 |
commit | 5cdf264f937687aff194574f5fe2badb087337b8 (patch) | |
tree | bcb0cf3f701d2abbe350a811f1f32448d8eeedf0 | |
parent | c4443085a198c26a478463429477e7e8a599fa07 (diff) | |
download | bird-5cdf264f937687aff194574f5fe2badb087337b8.tar bird-5cdf264f937687aff194574f5fe2badb087337b8.zip |
Fixes a bug related to implicit backbone on ABR.
-rw-r--r-- | proto/ospf/ospf.c | 1 | ||||
-rw-r--r-- | proto/ospf/ospf.h | 2 | ||||
-rw-r--r-- | proto/ospf/topology.c | 15 |
3 files changed, 12 insertions, 6 deletions
diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index a9dc1de..a2a38f4 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -205,6 +205,7 @@ ospf_start(struct proto *p) oa = mb_allocz(p->pool, sizeof(struct ospf_area)); add_tail(&po->area_list, NODE oa); po->areano++; + oa->ac = NULL; oa->stub = 0; oa->areaid = 0; oa->rt = NULL; diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 1ae83c1..34b0545 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -701,7 +701,7 @@ struct ospf_area { node n; u32 areaid; - struct ospf_area_config *ac; /* Related area config */ + struct ospf_area_config *ac; /* Related area config, might be NULL */ int origrt; /* Rt lsa origination scheduled? */ struct top_hash_entry *rt; /* My own router LSA */ struct top_hash_entry *pxr_lsa; /* Originated prefix LSA */ diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index 16a0667..1ea1df1 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -157,6 +157,9 @@ get_seqnum(struct top_hash_entry *en) static int configured_stubnet(struct ospf_area *oa, struct ifa *a) { + if (!oa->ac) + return 0; + struct ospf_stubnet_config *sn; WALK_LIST(sn, oa->ac->stubnet_list) { @@ -309,8 +312,9 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length) } struct ospf_stubnet_config *sn; - WALK_LIST(sn, oa->ac->stubnet_list) - if (!sn->hidden) + if (oa->ac) + WALK_LIST(sn, oa->ac->stubnet_list) + if (!sn->hidden) { ln = lsab_alloc(po, sizeof(struct ospf_lsa_rt_link)); ln->type = LSART_STUB; @@ -1197,7 +1201,7 @@ originate_prefix_rt_lsa_body(struct ospf_area *oa, u16 *length) /* If there are some configured vlinks, add some global address, which will be used as a vlink endpoint. */ - if (!EMPTY_LIST(oa->ac->vlink_list) && !host_addr && vlink_addr) + if (oa->ac && !EMPTY_LIST(oa->ac->vlink_list) && !host_addr && vlink_addr) { put_ipv6_prefix(lsab_alloc(po, IPV6_PREFIX_SPACE(MAX_PREFIX_LENGTH)), vlink_addr->ip, MAX_PREFIX_LENGTH, OPT_PX_LA, 0); @@ -1205,8 +1209,9 @@ originate_prefix_rt_lsa_body(struct ospf_area *oa, u16 *length) } struct ospf_stubnet_config *sn; - WALK_LIST(sn, oa->ac->stubnet_list) - if (!sn->hidden) + if (oa->ac) + WALK_LIST(sn, oa->ac->stubnet_list) + if (!sn->hidden) { flags = (sn->px.len < MAX_PREFIX_LENGTH) ? 0 : OPT_PX_LA; put_ipv6_prefix(lsab_alloc(po, IPV6_PREFIX_SPACE(sn->px.len)), |