diff options
Diffstat (limited to 'lib/if.c')
-rw-r--r-- | lib/if.c | 34 |
1 files changed, 13 insertions, 21 deletions
@@ -189,11 +189,13 @@ if_lookup_address (struct in_addr src) listnode node; struct prefix addr; struct prefix best; + struct prefix peer; listnode cnode; struct interface *ifp; struct prefix *p; struct connected *c; struct interface *match; + int prefixlen; /* Zero structures - get rid of rubbish from stack */ memset(&addr, 0, sizeof(addr)); @@ -212,34 +214,24 @@ if_lookup_address (struct in_addr src) for (cnode = listhead (ifp->connected); cnode; nextnode (cnode)) { c = getdata (cnode); + p = c->address; - if (if_is_pointopoint (ifp)) + if (p->family == AF_INET) { - p = c->address; + prefixlen = p->prefixlen; - if (p && p->family == AF_INET) + if (if_is_pointopoint (ifp) || + prefixlen >= IPV4_MAX_PREFIXLEN - 1) { -#ifdef OLD_RIB /* PTP links are conventionally identified - by the address of the far end - MAG */ - if (IPV4_ADDR_SAME (&p->u.prefix4, &src)) - return ifp; -#endif - p = c->destination; - if (p && IPV4_ADDR_SAME (&p->u.prefix4, &src)) - return ifp; + peer = *c->destination; + peer.prefixlen = prefixlen; + p = &peer; } - } - else - { - p = c->address; - if (p->family == AF_INET) + if (prefix_match (p, &addr) && prefixlen > best.prefixlen) { - if (prefix_match (p, &addr) && p->prefixlen > best.prefixlen) - { - best = *p; - match = ifp; - } + best = *p; + match = ifp; } } } |