--- linux-lt-2.4.0-test7.prev/include/net/route.h.route Thu Aug 3 16:47:58 2000 +++ linux-lt-2.4.0-test7.prev/include/net/route.h Fri Aug 25 15:31:09 2000 @@ -106,6 +106,7 @@ extern void ip_rt_send_redirect(struct sk_buff *skb); extern unsigned inet_addr_type(u32 addr); +extern u32 fib_select_addr(struct net_device *, u32 dst, int scope); extern void ip_rt_multicast_event(struct in_device *); extern int ip_rt_ioctl(unsigned int cmd, void *arg); extern void ip_rt_get_source(u8 *src, struct rtable *rt); --- linux-lt-2.4.0-test7.prev/net/ipv4/arp.c.route Thu Aug 10 11:42:11 2000 +++ linux-lt-2.4.0-test7.prev/net/ipv4/arp.c Fri Aug 25 15:31:09 2000 @@ -330,10 +330,7 @@ u32 target = *(u32*)neigh->primary_key; int probes = atomic_read(&neigh->probes); - if (skb && inet_addr_type(skb->nh.iph->saddr) == RTN_LOCAL) - saddr = skb->nh.iph->saddr; - else - saddr = inet_select_addr(dev, target, RT_SCOPE_LINK); + saddr = fib_select_addr(dev, target, RT_SCOPE_LINK); if ((probes -= neigh->parms->ucast_probes) < 0) { if (!(neigh->nud_state&NUD_VALID)) --- linux-lt-2.4.0-test7.prev/net/ipv4/fib_frontend.c.route Thu Dec 23 11:55:38 1999 +++ linux-lt-2.4.0-test7.prev/net/ipv4/fib_frontend.c Fri Aug 25 15:31:10 2000 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -180,6 +201,26 @@ return ret; } +u32 fib_select_addr(struct net_device *dev, u32 dst, int scope) +{ + struct rt_key key; + struct fib_result res; + u32 ret; + + memset(&key, 0, sizeof(key)); + key.src = dst; + key.dst = dst; + key.oif = dev->ifindex; + key.scope = scope; + + if (fib_lookup(&key, &res) == 0) { + ret = FIB_RES_PREFSRC(res); + fib_res_put(&res); + } else + ret = inet_select_addr(dev, dst, scope); + return ret; +} + /* Given (packet source, input interface) and optional (dst, oif, tos): - (main) check, that source is valid i.e. not broadcast or our local address.