[PATCH] find correct IP address for PTMP I/Fs in calc_next_hop

Joakim Tjernlund Joakim.Tjernlund at transmode.se
Sun Jan 9 15:45:18 CET 2011


Currently calc_next_hop searches for the next hop IP
with RID as search key. This will not work when there
are multiple links with the same RID.

Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund at transmode.se>
---
 proto/ospf/rt.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c
index 2f9fe49..e136aa3 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 ospf_neighbor *m;
+    s16 n_pos;
+
     ifa = rt_pos_to_ifa(oa, pos);
     if (!ifa)
       return NULL;
@@ -1367,8 +1370,14 @@ 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))
+    n_pos = ifa->rt_pos_beg;
+    WALK_LIST(m, ifa->neigh_list) {
+      if (m->state != NEIGHBOR_FULL)
+	continue;
+      if (n_pos++ == pos)
+	break;
+    }
+    if (!m || m->rid != rid) /* Check rid just to be sure */
       return NULL;

     return new_nexthop(po, m->ip, ifa->iface, ifa->ecmp_weight);
--
1.7.3.4




More information about the Bird-users mailing list