diff options
author | Ben Greear <greearb@candelatech.com> | 2008-11-16 22:19:38 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-11-16 22:19:38 -0500 |
commit | 8164f1b79731ad8ad9c713dc53d587a3b746f82f (patch) | |
tree | d9e9cf462fccbfbc217b064dcf41789033faf7e9 /net | |
parent | 6ea7ae1d0fc02a6c4ccd27e43346f67c44226e7a (diff) |
ipv4: Fix ARP behavior with many mac-vlans
Ben Greear wrote:
> I have 500 mac-vlans on a system talking to 500 other
> mac-vlans. My problem is that the arp-table gets extremely
> huge because every time an arp-request comes in on all mac-vlans,
> a stale arp entry is added for each mac-vlan. I have filtering
> turned on, but that doesn't help because the neigh_event_ns call
> below will cause a stale neighbor entry to be created regardless
> of whether a replay will be sent or not.
> Maybe the neigh_event code should be below the checks for dont_send,
> and only create check neigh_event_ns if we are !dont_send?
The attached patch makes it work much better for me. The patch
will cause the code to NOT create a stale neighbor entry if we
are not going to respond to the ARP request. The old code
*would* create a stale entry even if we are not going to respond.
Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/arp.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 957c87dc8e16..29a74c01d8de 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -818,18 +818,18 @@ static int arp_process(struct sk_buff *skb) | |||
818 | addr_type = rt->rt_type; | 818 | addr_type = rt->rt_type; |
819 | 819 | ||
820 | if (addr_type == RTN_LOCAL) { | 820 | if (addr_type == RTN_LOCAL) { |
821 | n = neigh_event_ns(&arp_tbl, sha, &sip, dev); | 821 | int dont_send = 0; |
822 | if (n) { | ||
823 | int dont_send = 0; | ||
824 | |||
825 | if (!dont_send) | ||
826 | dont_send |= arp_ignore(in_dev, sip, tip); | ||
827 | if (!dont_send && IN_DEV_ARPFILTER(in_dev)) | ||
828 | dont_send |= arp_filter(sip, tip, dev); | ||
829 | if (!dont_send) | ||
830 | arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); | ||
831 | 822 | ||
832 | neigh_release(n); | 823 | if (!dont_send) |
824 | dont_send |= arp_ignore(in_dev,sip,tip); | ||
825 | if (!dont_send && IN_DEV_ARPFILTER(in_dev)) | ||
826 | dont_send |= arp_filter(sip,tip,dev); | ||
827 | if (!dont_send) { | ||
828 | n = neigh_event_ns(&arp_tbl, sha, &sip, dev); | ||
829 | if (n) { | ||
830 | arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); | ||
831 | neigh_release(n); | ||
832 | } | ||
833 | } | 833 | } |
834 | goto out; | 834 | goto out; |
835 | } else if (IN_DEV_FORWARD(in_dev)) { | 835 | } else if (IN_DEV_FORWARD(in_dev)) { |