summaryrefslogtreecommitdiffstats
path: root/lib/if.c
diff options
context:
space:
mode:
authorDinesh Dutt <ddutt@cumulusnetworks.com>2013-08-24 09:55:50 +0200
committerDavid Lamparter <equinox@opensourcerouting.org>2013-11-08 03:15:43 +0100
commitb81e97a8a7f85ecc7489dc8a7c7b9d403d9c4bc6 (patch)
tree48e2c8492f01cc177a6691878cf4e5a329fe4d2d /lib/if.c
parentospf6d: don't suppress empty router LSA (diff)
downloadfrr-b81e97a8a7f85ecc7489dc8a7c7b9d403d9c4bc6.tar.xz
frr-b81e97a8a7f85ecc7489dc8a7c7b9d403d9c4bc6.zip
ospf6d: correct nexthop through directly connected networks
This is implementing this part of RFC 2328: This is the "first case", see below, 16.1.1. The next hop calculation ... If there is at least one intervening router in the current shortest path between the destination and the root, the destination simply inherits the set of next hops from the parent. Otherwise, there are two cases. In the first case, the parent vertex is the root (the calculating router itself). This means that the destination is either a directly connected network or directly connected router. The outgoing interface in this case is simply the OSPF interface connecting to the destination network/router. ... The current Quagga code always tries to inherit the nexthop from a parent vertex, but does not cover the case that the destination is directly connected to the root vertex. This patch adds support for that case. Signed-off-by: James Li <jli at cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt at cumulusnetworks.com> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'lib/if.c')
-rw-r--r--lib/if.c24
1 files changed, 24 insertions, 0 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 *