From patchwork Mon Mar 7 22:43:38 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Gospodarek X-Patchwork-Id: 85828 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 7FBE8B70E7 for ; Tue, 8 Mar 2011 09:44:25 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756411Ab1CGWoV (ORCPT ); Mon, 7 Mar 2011 17:44:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55845 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751496Ab1CGWoU (ORCPT ); Mon, 7 Mar 2011 17:44:20 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p27MheOF027844 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 7 Mar 2011 17:43:41 -0500 Received: from gospo.usersys.redhat.com (gospo.rdu.redhat.com [10.11.228.52]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with SMTP id p27Mhddg007292; Mon, 7 Mar 2011 17:43:39 -0500 Received: by gospo.usersys.redhat.com (sSMTP sendmail emulation); Mon, 7 Mar 2011 17:43:38 -0500 Date: Mon, 7 Mar 2011 17:43:38 -0500 From: Andy Gospodarek To: Jiri Pirko Cc: Nicolas de =?iso-8859-1?Q?Peslo=FCan?= , netdev@vger.kernel.org, davem@davemloft.net, shemminger@linux-foundation.org, kaber@trash.net, fubar@us.ibm.com, eric.dumazet@gmail.com, andy@greyhouse.net Subject: Re: [patch net-next-2.6] net: reinject arps into bonding slave instead of master Message-ID: <20110307224338.GU11864@gospo.rdu.redhat.com> References: <1299320969-7951-1-git-send-email-jpirko@redhat.com> <1299320969-7951-7-git-send-email-jpirko@redhat.com> <4D7249BA.8030401@gmail.com> <20110305144314.GC8573@psychotron.redhat.com> <4D724DB4.9020207@gmail.com> <4D737D00.20406@gmail.com> <20110306133413.GB2795@psychotron.redhat.com> <20110307125059.GA6053@psychotron.brq.redhat.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20110307125059.GA6053@psychotron.brq.redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Mon, Mar 07, 2011 at 01:51:00PM +0100, Jiri Pirko wrote: > Recent patch "bonding: move processing of recv handlers into > handle_frame()" caused a regression on following net scheme: > > eth0 - bond0 - bond0.5 > > where arp monitoring is happening over vlan. This patch fixes it by > reinjecting the arp packet into bonding slave device so the bonding > rx_handler can pickup and process it. > > Signed-off-by: Jiri Pirko > --- > net/core/dev.c | 8 ++++---- > 1 files changed, 4 insertions(+), 4 deletions(-) > > diff --git a/net/core/dev.c b/net/core/dev.c > index c71bd18..3d88458 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -3094,12 +3094,12 @@ void netdev_rx_handler_unregister(struct net_device *dev) > } > EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); > > -static void vlan_on_bond_hook(struct sk_buff *skb) > +static void vlan_on_bond_hook(struct sk_buff *skb, struct net_device *orig_dev) > { > /* > * Make sure ARP frames received on VLAN interfaces stacked on > * bonding interfaces still make their way to any base bonding > - * device that may have registered for a specific ptype. > + * device by reinjecting the frame into bonding slave (orig_dev) > */ > if (skb->dev->priv_flags & IFF_802_1Q_VLAN && > vlan_dev_real_dev(skb->dev)->priv_flags & IFF_BONDING && > @@ -3108,7 +3108,7 @@ static void vlan_on_bond_hook(struct sk_buff *skb) > > if (!skb2) > return; > - skb2->dev = vlan_dev_real_dev(skb->dev); > + skb2->dev = orig_dev; > netif_rx(skb2); > } > } > @@ -3202,7 +3202,7 @@ ncls: > goto out; > } > > - vlan_on_bond_hook(skb); > + vlan_on_bond_hook(skb, orig_dev); > > /* deliver only exact match when indicated */ > null_or_dev = deliver_exact ? skb->dev : NULL; This patch doesn't work. My setup has bond0.100 -> bond0 -> eth2 and eth3. ARP monitoring is enabled as is arp_valiate. The initial problem was just that just before vlan_on_bond_hook is called, skb->dev = bond0.100 and orig_dev = eth2. (This is after running goto another_route and having been called back through __netif_receive_skb since vlan_hwaccel_do_receive it true.) Now vlan_on_bond_hook is called and we have 2 skbs. The original skb still have skb->dev = bond0.100 and orig_dev = eth2. Since bond_arp_rcv is registered for traffic only to bond0, the handler is not hit and the frame is dropped (or processed by another handler). The cloned skb has skb->dev = bond0 and is put back on the receive queue and comes back through __netif_receive_skb. This frame will match the ptype entry for bond_arp_rcv, but since orig_dev = bond0 in this case, the code in bond_arp_rcv will not handle the frame. If we truly want to track the original interface that received the frame, the following is a better option. With the recursive nature of __netif_receive_skb at this point, we should really consider setting orig_dev from skb_iif rather than just from skb->dev. --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/net/core/dev.c b/net/core/dev.c index 30440e7..500fdbc 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -3135,7 +3135,6 @@ static int __netif_receive_skb(struct sk_buff *skb) if (!skb->skb_iif) skb->skb_iif = skb->dev->ifindex; - orig_dev = skb->dev; skb_reset_network_header(skb); skb_reset_transport_header(skb); @@ -3145,6 +3144,7 @@ static int __netif_receive_skb(struct sk_buff *skb) rcu_read_lock(); + orig_dev = dev_get_by_index_rcu(dev_net(skb->dev),skb->skb_iif); another_round: __this_cpu_inc(softnet_data.processed);