summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/if.c24
-rw-r--r--lib/if.h1
-rw-r--r--ospf6d/ospf6_intra.c23
3 files changed, 45 insertions, 3 deletions
diff --git a/lib/if.c b/lib/if.c
index e26aa046f..6348403b6 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -304,6 +304,30 @@ if_lookup_address (struct in_addr src)
return match;
}
+/* Lookup interface by prefix */
+struct interface *
+if_lookup_prefix (struct prefix *prefix)
+{
+ struct listnode *node;
+ struct prefix addr;
+ int bestlen = 0;
+ struct listnode *cnode;
+ struct interface *ifp;
+ struct connected *c;
+
+ for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+ {
+ for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c))
+ {
+ if (prefix_cmp(c->address, prefix) == 0)
+ {
+ return ifp;
+ }
+ }
+ }
+ return NULL;
+}
+
/* Get interface by name if given name interface doesn't exist create
one. */
struct interface *
diff --git a/lib/if.h b/lib/if.h
index 13cc254e2..8081be87d 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -245,6 +245,7 @@ extern struct interface *if_create (const char *name, int namelen);
extern struct interface *if_lookup_by_index (unsigned int);
extern struct interface *if_lookup_exact_address (struct in_addr);
extern struct interface *if_lookup_address (struct in_addr);
+extern struct interface *if_lookup_prefix (struct prefix *prefix);
/* These 2 functions are to be used when the ifname argument is terminated
by a '\0' character: */
diff --git a/ospf6d/ospf6_intra.c b/ospf6d/ospf6_intra.c
index 4cb751f01..c08a6ae64 100644
--- a/ospf6d/ospf6_intra.c
+++ b/ospf6d/ospf6_intra.c
@@ -1024,6 +1024,8 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
struct ospf6_prefix *op;
char *start, *current, *end;
char buf[64];
+ struct interface *ifp;
+ int direct_connect = 0;
if (OSPF6_LSA_IS_MAXAGE (lsa))
return;
@@ -1060,6 +1062,12 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
return;
}
+ if (intra_prefix_lsa->ref_adv_router == oa->ospf6->router_id)
+ {
+ /* the intra-prefix are directly connected */
+ direct_connect = 1;
+ }
+
prefix_num = ntohs (intra_prefix_lsa->prefix_num);
start = (caddr_t) intra_prefix_lsa +
sizeof (struct ospf6_intra_prefix_lsa);
@@ -1090,9 +1098,18 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
route->path.cost = ls_entry->path.cost +
ntohs (op->prefix_metric);
- for (i = 0; ospf6_nexthop_is_set (&ls_entry->nexthop[i]) &&
- i < OSPF6_MULTI_PATH_LIMIT; i++)
- ospf6_nexthop_copy (&route->nexthop[i], &ls_entry->nexthop[i]);
+ if (direct_connect)
+ {
+ ifp = if_lookup_prefix(&route->prefix);
+ if (ifp)
+ route->nexthop[0].ifindex = ifp->ifindex;
+ }
+ else
+ {
+ for (i = 0; ospf6_nexthop_is_set (&ls_entry->nexthop[i]) &&
+ i < OSPF6_MULTI_PATH_LIMIT; i++)
+ ospf6_nexthop_copy (&route->nexthop[i], &ls_entry->nexthop[i]);
+ }
if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
{