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);
 }
