lkml.org 
[lkml]   [2001]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH] solving proxy arp bug on shaper devices
Date
Hi,
This patch should corrects proxy arp feature in shaper devices forcing kernel
checking (before sending ARP REPLY) for "physical" device (i.e. eth0) instead
of "shaper" device (i.e. shaper0): in this way we avoid useless ARP REPLY and
"IP CONFLICT" messages on client hosts.
More details in "readme.txt" file attached.

I already tested it for many days and it has been worked well.

Noticed that this discussion has done in July: now I optimized patch
introducing a flag (to determine if the device is shaper) instead of
comparing dev name.

Thank you for your great support.
Best Regards
Roberto arcomano
diff -ur linux-2.4.9.orig/drivers/net/shaper.c linux-2.4.9/drivers/net/shaper.c
--- linux-2.4.9.orig/drivers/net/shaper.c Thu Jun 28 02:10:55 2001
+++ linux-2.4.9/drivers/net/shaper.c Tue Sep 11 13:20:09 2001
@@ -670,6 +670,7 @@
dev->addr_len = 0;
dev->tx_queue_len = 10;
dev->flags = 0;
+ dev->features |= NETIF_F_SHAPER;

/*
* Shaper is ok
diff -ur linux-2.4.9.orig/include/linux/if_shaper.h linux-2.4.9/include/linux/if_shaper.h
--- linux-2.4.9.orig/include/linux/if_shaper.h Wed Aug 18 20:38:47 1999
+++ linux-2.4.9/include/linux/if_shaper.h Tue Sep 11 13:20:00 2001
@@ -14,6 +14,8 @@
#define SHAPER_MAXSLIP 2
#define SHAPER_BURST (HZ/50) /* Good for >128K then */

+#define IS_SHAPERDEVICE(dev) ((dev)->features & NETIF_F_SHAPER)
+
struct shaper
{
struct sk_buff_head sendq;
diff -ur linux-2.4.9.orig/include/linux/netdevice.h linux-2.4.9/include/linux/netdevice.h
--- linux-2.4.9.orig/include/linux/netdevice.h Sun Sep 9 16:15:40 2001
+++ linux-2.4.9/include/linux/netdevice.h Tue Sep 11 13:20:04 2001
@@ -345,6 +345,7 @@
#define NETIF_F_DYNALLOC 16 /* Self-dectructable device. */
#define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */
#define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */
+#define NETIF_F_SHAPER 128 /* Shaper device. */

/* Called after device is detached from network. */
void (*uninit)(struct net_device *dev);
diff -ur linux-2.4.9.orig/net/ipv4/arp.c linux-2.4.9/net/ipv4/arp.c
--- linux-2.4.9.orig/net/ipv4/arp.c Wed May 16 19:21:45 2001
+++ linux-2.4.9/net/ipv4/arp.c Tue Sep 11 13:19:51 2001
@@ -111,8 +111,7 @@

#include <asm/system.h>
#include <asm/uaccess.h>
-
-
+#include <linux/if_shaper.h>

/*
* Interface to generic neighbour cache.
@@ -767,8 +766,15 @@
}
goto out;
} else if (IN_DEV_FORWARD(in_dev)) {
+ char shflag=0;
+ if ( (rt->u.dst.dev) &&
+ (rt->u.dst.dev->priv) &&
+ (((struct shaper *) rt->u.dst.dev->priv)->dev) &&
+ (IS_SHAPERDEVICE(rt->u.dst.dev)) )
+ shflag=1;
if ((rt->rt_flags&RTCF_DNAT) ||
- (addr_type == RTN_UNICAST && rt->u.dst.dev != dev &&
+ (addr_type == RTN_UNICAST &&
+ ( ((shflag) && ( ((struct shaper *) rt->u.dst.dev->priv)->dev != dev)) || ((!shflag) && (rt->u.dst.dev != dev)) ) &&
(IN_DEV_PROXY_ARP(in_dev) || pneigh_lookup(&arp_tbl, &tip, dev, 0)))) {
n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
if (n)Subject: PATCH to update proxy arp feature on shaper device

Author: Roberto Arcomano, berto@fatamorgana.com,
http://www.fatamorgana.com/bertolinux

Date: 9/9/2001

Description: Shaper device is seen by the kernel like a
different device (i.e. shaper0) than the
physical one (i.e. eth0) to which is attached:
so kernel always issues an "ARP REPLY"
(if proxy arp is active on shaper physical
interface): this prevent us from use proxy arp on
a shaper device cause, during turning on client
machine, we would receive an "IP conflit" message.

Solution: Patch consists in 4 files:
a-) "include/linux/netdevice.h", where we add a new
net feature, NETIF_F_SHAPER which will help
us to understand if a device is a shaper one.

b-) "drivers/net/shaper.c", in "shaper_probe" function
we set NETIF_F_SHAPER flag for a new shaper
device.

c-) "include/linux/if_shaper.h" where we add the macro
IS_SHAPERDEVICE, used to know if the device is a
shaper one (it checks NETIF_F_SHAPER flag in
features field, under "netdevice" struct).

d-) "net/ipv4/arp.c" where finally we modify proxy arp;
We use shflag to determine if we are managing a
shaper device (with IS_SHAPERDEVICE macro): in
this case we check
"rt->u.dst.dev->priv->dev" (physical device)
instead of
"rt->u.dst.dev" (shaper device)
while if the device is a non shaper one, we check
rt->u.dst.dev (anded with !shflag)

TODO: I used "features" field in netdevice struct: maybe it could
be choosen another place where to put the shaper flag.

Tests: I tested new feature using 3 PCs like that:

CLIENT1 ------------- LINUX ------------- CLIENT2
shaper0 ppp0
[eth0]

LINUX host has proxy arp and shaper enabled, with CLIENT1
reachable via shaper0.
With classic proxy arp, when I turn on CLIENT machine I
receive an "IP conflit" from OS, while using patched version
there are no problems.
Proxy arp still does its work cause, if I give CLIENT2 IP
address to CLIENT1 machine, I receive (from CLIENT1 OS) a
IP busy message.

Also tests on commercial server have been done with good
results.

Kernel version tested is 2.4.9


Final notes: It should be very simple to port patch to older
kernel version (2.0.xx, 2.1.xx, 2.2.xx, 2.3.xx)




\
 
 \ /
  Last update: 2005-03-22 13:03    [W:0.039 / U:1.752 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site