diff options
Diffstat (limited to 'ospf6d/ospf6_spf.c')
| -rw-r--r-- | ospf6d/ospf6_spf.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c index 032484e288..4e7a7146eb 100644 --- a/ospf6d/ospf6_spf.c +++ b/ospf6d/ospf6_spf.c @@ -225,21 +225,25 @@ static char *ospf6_lsdesc_backlink(struct ospf6_lsa *lsa, caddr_t lsdesc, assert(!(OSPF6_LSA_IS_TYPE(NETWORK, lsa) && VERTEX_IS_TYPE(NETWORK, v))); - if (OSPF6_LSA_IS_TYPE(NETWORK, lsa) - && NETWORK_LSDESC_GET_NBR_ROUTERID(backlink) - == v->lsa->header->adv_router) - found = backlink; - else if (VERTEX_IS_TYPE(NETWORK, v) - && ROUTER_LSDESC_IS_TYPE(TRANSIT_NETWORK, backlink) - && ROUTER_LSDESC_GET_NBR_ROUTERID(backlink) - == v->lsa->header->adv_router - && ROUTER_LSDESC_GET_NBR_IFID(backlink) - == ntohl(v->lsa->header->id)) - found = backlink; - else { + if (OSPF6_LSA_IS_TYPE(NETWORK, lsa)) { + if (NETWORK_LSDESC_GET_NBR_ROUTERID(backlink) + == v->lsa->header->adv_router) + found = backlink; + } else if (VERTEX_IS_TYPE(NETWORK, v)) { + if (ROUTER_LSDESC_IS_TYPE(TRANSIT_NETWORK, backlink) + && ROUTER_LSDESC_GET_NBR_ROUTERID(backlink) + == v->lsa->header->adv_router + && ROUTER_LSDESC_GET_NBR_IFID(backlink) + == ntohl(v->lsa->header->id)) + found = backlink; + } else { + assert(OSPF6_LSA_IS_TYPE(ROUTER, lsa) + && VERTEX_IS_TYPE(ROUTER, v)); + if (!ROUTER_LSDESC_IS_TYPE(POINTTOPOINT, backlink) || !ROUTER_LSDESC_IS_TYPE(POINTTOPOINT, lsdesc)) continue; + if (ROUTER_LSDESC_GET_NBR_IFID(backlink) != ROUTER_LSDESC_GET_IFID(lsdesc) || ROUTER_LSDESC_GET_NBR_IFID(lsdesc) @@ -370,7 +374,7 @@ static int ospf6_spf_install(struct ospf6_vertex *v, up to here. */ assert(route == NULL); - route = ospf6_route_create(); + route = ospf6_route_create(v->area->ospf6); memcpy(&route->prefix, &v->vertex_id, sizeof(struct prefix)); route->type = OSPF6_DEST_TYPE_LINKSTATE; route->path.type = OSPF6_PATH_TYPE_INTRA; |
