--- v2.2.20/linux/include/linux/inetdevice.h Wed Dec 13 11:19:12 2000 +++ linux/include/linux/inetdevice.h Tue Dec 11 22:47:09 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; @@ -46,6 +47,7 @@ #define IN_DEV_SHARED_MEDIA(in_dev) (ipv4_devconf.shared_media || (in_dev)->cnf.shared_media) #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_MEDIUM_ID(in_dev) ((in_dev)->cnf.medium_id) #define IN_DEV_RX_REDIRECTS(in_dev) \ ((IN_DEV_FORWARD(in_dev) && \ --- v2.2.20/linux/include/linux/sysctl.h Sat Aug 4 12:52:32 2001 +++ linux/include/linux/sysctl.h Tue Dec 11 22:48:01 2001 @@ -274,7 +274,8 @@ NET_IPV4_CONF_BOOTP_RELAY=10, NET_IPV4_CONF_LOG_MARTIANS=11, NET_IPV4_CONF_HIDDEN=12, - NET_IPV4_CONF_ARPFILTER=13 + NET_IPV4_CONF_ARPFILTER=13, + NET_IPV4_CONF_MEDIUM_ID=14, }; /* /proc/sys/net/ipv6 */ --- v2.2.20/linux/net/ipv4/arp.c Sun Nov 4 10:16:16 2001 +++ linux/net/ipv4/arp.c Tue Mar 5 01:52:36 2002 @@ -440,6 +440,30 @@ } /* + * 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 = rt->u.dst.dev->ip_ptr) != NULL) + omi = IN_DEV_MEDIUM_ID(out_dev); + return (omi != imi && omi != -1); +} + +/* * Interface to link layer: send routine and receive handler. */ @@ -729,7 +753,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.2.20/linux/net/ipv4/devinet.c Wed Dec 13 11:19:12 2000 +++ linux/net/ipv4/devinet.c Tue Dec 11 22:55:51 2001 @@ -925,7 +925,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]; @@ -958,6 +958,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.2.20/linux/Documentation/proc.txt Sun Nov 4 10:16:03 2001 +++ linux/Documentation/proc.txt Tue Mar 5 01:56:45 2002 @@ -1169,6 +1169,17 @@ 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 Do (1) or don't (0) do proxy ARP. --- v2.2.20/linux/Documentation/networking/ip-sysctl.txt Sun Nov 4 10:16:03 2001 +++ linux/Documentation/networking/ip-sysctl.txt Tue Mar 5 01:57:41 2002 @@ -158,6 +158,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.