Skip to contentSkip to conversation

Patch suggestion for proxy arp on shaper interface

PATCH Roberto Arcomano 2 participants 4 messages Jul 22, 2001 – Jul 25, 2001

lore
Share & tools
lore
#0 lore raw

Hi all,
Recently I have had a problem with Linux proxy arp feature (using with shaper interface): when I machine starts up it was receiving a "IP conflits". The problem is that Linux proxy_arp routine doesn't make difference between real interface (i.e. eth0) and shaper interface (i.e. shaper0 which has been attached to eth0).
I attach a first beta solution to the problem, which could be far from optimal! (I use a "strncmp", cause I didn't found another method to know if the device is a "shaper" device).

arp.c Sun Jul 22 19:31:20 2001 renamed from arp.c.orig Wed May 16 19:21:45 2001 +7 -2
@@ -111,7 +111,7 @@
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
-
+#include <linux/if_shaper.h>
 
 
 /*
@@ -767,10 +767,17 @@
                        }
                        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) &&
+                            (strncmp(rt->u.dst.dev->name,"shaper",6)==0) )
+                         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);
+                               n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
                                if (n)

The patch declare a variable (flag to know if the interface is shaper-like), investigate on private data of shaper device (where we can know what is the attached interface) and set the flag. After we consider the "attached" interface if flag is set.

I tested it under 2.4.6 on RedHat 7.1 with success (there is no more IP conflit).
Hope it'll useful.

Best Regards
Roberto Arcomano

arp.c renamed from arp.c.orig +10 -3
@@ -111,7 +111,7 @@
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
-
+#include <linux/if_shaper.h>
 
 
 /*
@@ -767,10 +767,17 @@
 			}
 			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) &&
+			     (strncmp(rt->u.dst.dev->name,"shaper",6)==0) )
+			  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);
+			        n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
 				if (n)
 					neigh_release(n);
 
#1 lore raw

Il 22:31, domenica 22 luglio 2001, Roberto Arcomano ha scritto:

Quoted 52 lines

Hi all,
Recently I have had a problem with Linux proxy arp feature (using with shaper interface): when I machine starts up it was receiving a "IP conflits". The problem is that Linux proxy_arp routine doesn't make difference between real interface (i.e. eth0) and shaper interface (i.e. shaper0 which has been attached to eth0).
I attach a first beta solution to the problem, which could be far from optimal! (I use a "strncmp", cause I didn't found another method to know if the device is a "shaper" device).

arp.c Sun Jul 22 19:31:20 2001 renamed from arp.c.orig Wed May 16 19:21:45 2001 +5 -1
@@ -111,7 +111,7 @@
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
-
+#include <linux/if_shaper.h>
 
 
 /*
@@ -767,10 +767,17 @@
                        }
                        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)

&& +
(strncmp(rt->u.dst.dev->name,"shaper",6)==0) ) +

shflag=1;
                        if ((rt->rt_flags&RTCF_DNAT) ||

- (addr_type == RTN_UNICAST && rt->u.dst.dev !=
dev &&

arp.c Sun Jul 22 19:31:20 2001 renamed from arp.c.orig Wed May 16 19:21:45 2001 +2 -0
+                           (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); + n = neigh_event_ns(&arp_tbl, sha,
&sip, dev); if (n)

The patch declare a variable (flag to know if the interface is shaper-like), investigate on private data of shaper device (where we can know what is the attached interface) and set the flag. After we consider the "attached" interface if flag is set.

Quoted 6 lines

I tested it under 2.4.6 on RedHat 7.1 with success (there is no more IP conflit).
Hope it'll useful.

Best Regards
Roberto Arcomano

Please someone takes a look at it! This is a bug of proxy arp feature (when talking with shaper interface) could be correct (for example using my patch). Thank you for your help

Best Regards
Roberto Arcomano

arp.c renamed from arp.c.orig +10 -3
@@ -111,7 +111,7 @@
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
-
+#include <linux/if_shaper.h>
 
 
 /*
@@ -767,10 +767,17 @@
 			}
 			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) &&
+			     (strncmp(rt->u.dst.dev->name,"shaper",6)==0) )
+			  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);
+			        n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
 				if (n)
 					neigh_release(n);
 
#2 lore raw
In reply to Roberto Arcomano

Hello!

Quoted 1 line

Recently I have had a problem with Linux proxy arp feature (using with shaper

You must not enable proxy arp, when routing is asymmetric or configure it manually. Shaper device is one of cases, when proxy arp cannot work correctly.

Alexey

#3 lore raw

Il 00:31, mercoledì 25 luglio 2001, Alexey Kuznetsov ha scritto:

Quoted 9 lines

Hello!

Quoted 2 lines

Recently I have had a problem with Linux proxy arp feature (using with shaper

You must not enable proxy arp, when routing is asymmetric or configure it manually. Shaper device is one of cases, when proxy arp cannot work correctly.

Quoted 6 lines

Alexey
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Hello,
First thank you for your answer. I must enable proxy arp cause I need it with shaper interface. During configuration in user mode I noticed that kernel sees shaper device instead of using its device attached (in fact I received from a lan machine a "IP conflit"): I think that it is more correct to use the device attached to shaper, for 2 reasons:
1-) shaper is not a "real" interface (I mean directly connected to a wire or wireless physical interface), while proxy arp sends "ARP REPLY" using physical devices only.

2-) Proxy arp would become more flexible, also using proxy arp interface:
proxy arp is a great thing, particulary with complex wireless networks. Like all good thinks I think that we have to keep it under kernel to keep simplify sysadmin life!

Anyway, there are some applications that need shaper and proxy arp (for example using a traffic manager behind a firewall).

As I said in my first message, I tested it with 2.4.6 and it "appears" (I tested it in a very little net) to work well (but I think performance aren't so well...).

Thank you for your help.
Best regards
Roberto Arcomano