diff options
author | paul <paul> | 2002-12-13 22:07:36 +0100 |
---|---|---|
committer | paul <paul> | 2002-12-13 22:07:36 +0100 |
commit | 00df0c1e80811f3cf5eca0b28e720bf1bcc84a53 (patch) | |
tree | d03bbabe82d8526b1f5472d38a59ed24f9c8c42b /lib/if.c | |
parent | changelog updated (diff) | |
download | frr-00df0c1e80811f3cf5eca0b28e720bf1bcc84a53.tar.xz frr-00df0c1e80811f3cf5eca0b28e720bf1bcc84a53.zip |
[zebra 14631] Generic PtP and RFC3021 interface addressing support
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; } } } |