> >> Something else, in calc_next_hop: > >> don't you need to return all next hops for ptmp links now that you > >> support ECMP? > > > >The same as in ptp or bcast - multiple next hops are created > >by compositing returns of calc_next_hop(). Look at the caller > >of calc_next_hop(). > > Don't think it will work as intended(I am traveling and only have mail access) > but I think the find_neigh(ifa, rid); > will always find the same neighbor so any additional links > will be missed.
Still think you need to do something like this: diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c index 2f9fe49..ea3b660 100644 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@ -1360,6 +1360,9 @@ calc_next_hop(struct ospf_area *oa, struct top_hash_entry *en, /* The second case - ptp or ptmp neighbor */ if ((en->lsa.type == LSA_T_RT) && (par == oa->rt)) { + struct mpnh *nh, *p_nh; + struct ospf_neighbor *m; + ifa = rt_pos_to_ifa(oa, pos); if (!ifa) return NULL; @@ -1367,11 +1370,15 @@ calc_next_hop(struct ospf_area *oa, struct top_hash_entry *en, if (ifa->type == OSPF_IT_VLINK) return new_nexthop(po, IPA_NONE, NULL, 0); - struct ospf_neighbor *m = find_neigh(ifa, rid); - if (!m || (m->state != NEIGHBOR_FULL)) - return NULL; - - return new_nexthop(po, m->ip, ifa->iface, ifa->ecmp_weight); + nh = p_nh = NULL; + WALK_LIST(m, ifa->neigh_list) { + if (m->rid != rid || m->state != NEIGHBOR_FULL) + continue; + nh = new_nexthop(po, m->ip, ifa->iface, ifa->ecmp_weight); + nh->next = p_nh; + p_nh = nh; + } + return nh; } /* The third case - bcast or nbma neighbor */ But this will cause some extra work as originate_rt_lsa_body() adds identical entries to the RT LSA for multiple ptmp links between the same two routers. I am not sure what the point is with adding identical entries? Question, would this unrelated simplification work? diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c index 9e693e1..da15e52 100644 --- a/proto/ospf/topology.c +++ b/proto/ospf/topology.c @@ -230,14 +230,6 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length) { int net_lsa = 0; - if ((ifa->type == OSPF_IT_VLINK) && (ifa->voa == oa) && - (!EMPTY_LIST(ifa->neigh_list))) - { - neigh = (struct ospf_neighbor *) HEAD(ifa->neigh_list); - if ((neigh->state == NEIGHBOR_FULL) && (ifa->cost <= 0xffff)) - bitv = 1; - } - if ((ifa->oa != oa) || (ifa->state == OSPF_IS_DOWN)) continue; @@ -287,6 +279,8 @@ originate_rt_lsa_body(struct ospf_area *oa, u16 *length) ln->data = ipa_to_u32(ifa->addr->ip); ln->metric = ifa->cost; ln->padding = 0; + if (ifa->voa == oa) + bitv = 1; i++; } break;