--- v2.4.18/linux/include/linux/inetdevice.h	Tue Nov 13 01:27:21 2001
+++ linux/include/linux/inetdevice.h	Sat Dec  8 11:56:18 2001
@@ -12,6 +12,7 @@
 	int	accept_source_route;
 	int	rp_filter;
 	int	proxy_arp;
+	int	medium_id;
 	int	bootp_relay;
 	int	log_martians;
 	int	forwarding;
@@ -48,6 +49,7 @@
 #define IN_DEV_TX_REDIRECTS(in_dev)	(ipv4_devconf.send_redirects || (in_dev)->cnf.send_redirects)
 #define IN_DEV_SEC_REDIRECTS(in_dev)	(ipv4_devconf.secure_redirects || (in_dev)->cnf.secure_redirects)
 #define IN_DEV_IDTAG(in_dev)		((in_dev)->cnf.tag)
+#define IN_DEV_MEDIUM_ID(in_dev)	((in_dev)->cnf.medium_id)
 
 #define IN_DEV_RX_REDIRECTS(in_dev) \
 	((IN_DEV_FORWARD(in_dev) && \
--- v2.4.18/linux/include/linux/sysctl.h	Mon Nov 26 23:06:56 2001
+++ linux/include/linux/sysctl.h	Sat Dec  8 11:58:05 2001
@@ -334,7 +334,8 @@
 	NET_IPV4_CONF_BOOTP_RELAY=10,
 	NET_IPV4_CONF_LOG_MARTIANS=11,
 	NET_IPV4_CONF_TAG=12,
-	NET_IPV4_CONF_ARPFILTER=13
+	NET_IPV4_CONF_ARPFILTER=13,
+	NET_IPV4_CONF_MEDIUM_ID=14,
 };
 
 /* /proc/sys/net/ipv6 */
--- v2.4.18/linux/net/ipv4/arp.c	Tue Nov 13 01:28:51 2001
+++ linux/net/ipv4/arp.c	Tue Mar  5 01:12:10 2002
@@ -450,6 +450,32 @@
 }
 
 /*
+ * Check if we can use proxy ARP for this path
+ */
+
+static inline int arp_fwd_proxy(struct in_device *in_dev, struct rtable *rt)
+{
+	struct in_device *out_dev;
+	int imi, omi = -1;
+
+	if (!IN_DEV_PROXY_ARP(in_dev))
+		return 0;
+
+	if ((imi = IN_DEV_MEDIUM_ID(in_dev)) == 0)
+		return 1;
+	if (imi == -1)
+		return 0;
+
+	/* place to check for proxy_arp for routes */
+
+	if ((out_dev = in_dev_get(rt->u.dst.dev)) != NULL) {
+		omi = IN_DEV_MEDIUM_ID(out_dev);
+		in_dev_put(out_dev);
+	}
+	return (omi != imi && omi != -1);
+}
+
+/*
  *	Interface to link layer: send routine and receive handler.
  */
 
@@ -768,7 +794,7 @@
 		} else if (IN_DEV_FORWARD(in_dev)) {
 			if ((rt->rt_flags&RTCF_DNAT) ||
 			    (addr_type == RTN_UNICAST  && rt->u.dst.dev != dev &&
-			     (IN_DEV_PROXY_ARP(in_dev) || pneigh_lookup(&arp_tbl, &tip, dev, 0)))) {
+			     (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &tip, dev, 0)))) {
 				n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
 				if (n)
 					neigh_release(n);
--- v2.4.18/linux/net/ipv4/devinet.c	Sat Jan 26 11:18:25 2002
+++ linux/net/ipv4/devinet.c	Tue Mar  5 01:42:31 2002
@@ -1032,7 +1032,7 @@
 static struct devinet_sysctl_table
 {
 	struct ctl_table_header *sysctl_header;
-	ctl_table devinet_vars[14];
+	ctl_table devinet_vars[15];
 	ctl_table devinet_dev[2];
 	ctl_table devinet_conf_dir[2];
 	ctl_table devinet_proto_dir[2];
@@ -1065,6 +1065,9 @@
          &proc_dointvec},
 	{NET_IPV4_CONF_PROXY_ARP, "proxy_arp",
          &ipv4_devconf.proxy_arp, sizeof(int), 0644, NULL,
+         &proc_dointvec},
+	{NET_IPV4_CONF_MEDIUM_ID, "medium_id",
+         &ipv4_devconf.medium_id, sizeof(int), 0644, NULL,
          &proc_dointvec},
 	{NET_IPV4_CONF_BOOTP_RELAY, "bootp_relay",
          &ipv4_devconf.bootp_relay, sizeof(int), 0644, NULL,
--- v2.4.18/linux/Documentation/filesystems/proc.txt	Mon Nov 26 23:05:49 2001
+++ linux/Documentation/filesystems/proc.txt	Tue Mar  5 01:04:43 2002
@@ -1549,6 +1549,19 @@
 Do multicast routing. The kernel needs to be compiled with CONFIG_MROUTE and a
 multicast routing daemon is required.
 
+medium_id
+---------
+
+Integer value used to differentiate the devices by the medium they
+are attached to. Two devices can have different id values when
+the broadcast packets are received only on one of them.
+The default value 0 means that the device is the only interface
+to its medium, value of -1 means that medium is not known.
+
+Currently, it is used to change the proxy_arp behavior:
+the proxy_arp feature is enabled for packets forwarded between
+two devices attached to different medium.
+
 proxy_arp
 ---------
 
--- v2.4.18/linux/Documentation/networking/ip-sysctl.txt	Sun Mar  3 00:23:58 2002
+++ linux/Documentation/networking/ip-sysctl.txt	Tue Mar  5 01:43:33 2002
@@ -358,6 +358,18 @@
 	Do multicast routing. The kernel needs to be compiled with CONFIG_MROUTE
 	and a multicast routing daemon is required.
 
+medium_id - INTEGER
+
+	Integer value used to differentiate the devices by the medium they
+	are attached to. Two devices can have different id values when
+	the broadcast packets are received only on one of them.
+	The default value 0 means that the device is the only interface
+	to its medium, value of -1 means that medium is not known.
+
+	Currently, it is used to change the proxy_arp behavior:
+	the proxy_arp feature is enabled for packets forwarded between
+	two devices attached to different medium.
+
 proxy_arp - BOOLEAN
 	Do proxy arp.
 
