--- 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.