diff -Nur linux-2.4.22.orig/include/linux/sysctl.h linux-2.4.22/include/linux/sysctl.h --- linux-2.4.22.orig/include/linux/sysctl.h Mon Aug 25 13:44:44 2003 +++ linux-2.4.22/include/linux/sysctl.h Sat Oct 25 03:52:51 2003 @@ -401,10 +401,11 @@ NET_NEIGH_ANYCAST_DELAY=10, NET_NEIGH_PROXY_DELAY=11, NET_NEIGH_LOCKTIME=12, - NET_NEIGH_GC_INTERVAL=13, - NET_NEIGH_GC_THRESH1=14, - NET_NEIGH_GC_THRESH2=15, - NET_NEIGH_GC_THRESH3=16 + NET_NEIGH_SEND_ARP_REQ=13, + NET_NEIGH_GC_INTERVAL=14, + NET_NEIGH_GC_THRESH1=15, + NET_NEIGH_GC_THRESH2=16, + NET_NEIGH_GC_THRESH3=17 }; /* /proc/sys/net/ipx */ diff -Nur linux-2.4.22.orig/include/net/neighbour.h linux-2.4.22/include/net/neighbour.h --- linux-2.4.22.orig/include/net/neighbour.h Thu Nov 22 20:47:11 2001 +++ linux-2.4.22/include/net/neighbour.h Sat Oct 25 03:43:54 2003 @@ -74,6 +74,7 @@ int proxy_delay; int proxy_qlen; int locktime; + int arp_requests; }; struct neigh_statistics diff -Nur linux-2.4.22.orig/net/core/neighbour.c linux-2.4.22/net/core/neighbour.c --- linux-2.4.22.orig/net/core/neighbour.c Mon Aug 25 13:44:44 2003 +++ linux-2.4.22/net/core/neighbour.c Sat Oct 25 03:53:16 2003 @@ -775,6 +775,11 @@ if (arp && (old&(NUD_NOARP|NUD_PERMANENT))) goto out; + if(!(neigh->parms->arp_requests) && (!(new & NUD_PERMANENT))) { + new &= ~NUD_REACHABLE; + new &= ~NUD_VALID; + } + if (!(new&NUD_VALID)) { neigh_del_timer(neigh); if (old&NUD_CONNECTED) @@ -1434,7 +1439,7 @@ struct neigh_sysctl_table { struct ctl_table_header *sysctl_header; - ctl_table neigh_vars[17]; + ctl_table neigh_vars[18]; ctl_table neigh_dev[2]; ctl_table neigh_neigh_dir[2]; ctl_table neigh_proto_dir[2]; @@ -1477,6 +1482,9 @@ {NET_NEIGH_LOCKTIME, "locktime", NULL, sizeof(int), 0644, NULL, &proc_dointvec}, + {NET_NEIGH_SEND_ARP_REQ, "send_arp_req", + NULL, sizeof(int), 0644, NULL, + &proc_dointvec}, {NET_NEIGH_GC_INTERVAL, "gc_interval", NULL, sizeof(int), 0644, NULL, &proc_dointvec_jiffies}, @@ -1518,15 +1526,16 @@ t->neigh_vars[9].data = &p->anycast_delay; t->neigh_vars[10].data = &p->proxy_delay; t->neigh_vars[11].data = &p->locktime; + t->neigh_vars[12].data = &p->arp_requests; if (dev) { t->neigh_dev[0].procname = dev->name; t->neigh_dev[0].ctl_name = dev->ifindex; - memset(&t->neigh_vars[12], 0, sizeof(ctl_table)); + memset(&t->neigh_vars[13], 0, sizeof(ctl_table)); } else { - t->neigh_vars[12].data = (int*)(p+1); - t->neigh_vars[13].data = (int*)(p+1) + 1; - t->neigh_vars[14].data = (int*)(p+1) + 2; - t->neigh_vars[15].data = (int*)(p+1) + 3; + t->neigh_vars[13].data = (int*)(p+1); + t->neigh_vars[14].data = (int*)(p+1) + 1; + t->neigh_vars[15].data = (int*)(p+1) + 2; + t->neigh_vars[16].data = (int*)(p+1) + 3; } t->neigh_neigh_dir[0].ctl_name = pdev_id; diff -Nur linux-2.4.22.orig/net/ipv4/arp.c linux-2.4.22/net/ipv4/arp.c --- linux-2.4.22.orig/net/ipv4/arp.c Mon Aug 25 13:44:44 2003 +++ linux-2.4.22/net/ipv4/arp.c Sat Oct 25 03:47:40 2003 @@ -184,6 +184,7 @@ proxy_delay: (8 * HZ) / 10, proxy_qlen: 64, locktime: 1 * HZ, + arp_requests: 1, }, gc_interval: 30 * HZ, gc_thresh1: 128, @@ -340,8 +341,9 @@ return; } - arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr, - dst_ha, dev->dev_addr, NULL); + if (neigh->parms->arp_requests) + arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr, + dst_ha, dev->dev_addr, NULL); if (dst_ha) read_unlock_bh(&neigh->lock); }