--- v2.2.19/linux/net/ipv4/arp.c Wed Dec 13 11:19:12 2000 +++ linux/net/ipv4/arp.c Sun Oct 14 13:25:02 2001 @@ -311,18 +311,16 @@ u32 saddr; u8 *dst_ha = NULL; struct device *dev = neigh->dev; - struct device *dev2; - struct in_device *in_dev2; u32 target = *(u32*)neigh->primary_key; int probes = neigh->probes; + struct rtable *rt; - if (skb && - (dev2 = ip_dev_find(skb->nh.iph->saddr)) != NULL && - (in_dev2 = dev2->ip_ptr) != NULL && - !IN_DEV_HIDDEN(in_dev2)) - saddr = skb->nh.iph->saddr; - else - saddr = inet_select_addr(dev, target, RT_SCOPE_LINK); + if (ip_route_output(&rt, target, 0, 0, dev->ifindex) < 0) + return; + saddr = rt->rt_src; + ip_rt_put(rt); + if (!saddr) + return; if ((probes -= neigh->parms->ucast_probes) < 0) { if (!(neigh->nud_state&NUD_VALID))