diff -ur v2.5.50/linux/net/ipv4/arp.c linux/net/ipv4/arp.c --- v2.5.50/linux/net/ipv4/arp.c Tue Nov 19 00:13:40 2002 +++ linux/net/ipv4/arp.c Sun Dec 1 18:19:47 2002 @@ -319,16 +319,21 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) { + struct rtable *rt; u32 saddr; u8 *dst_ha = NULL; struct net_device *dev = neigh->dev; u32 target = *(u32*)neigh->primary_key; int probes = atomic_read(&neigh->probes); + struct flowi fl = { .nl_u = { .ip4_u = { .daddr = target } }, + .oif = dev->ifindex }; - 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); + if (ip_route_output_key(&rt, &fl) < 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))