From patchwork Mon May 11 11:46:43 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cyrill Gorcunov X-Patchwork-Id: 27045 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@bilbo.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id 016B7B6F56 for ; Mon, 11 May 2009 22:54:09 +1000 (EST) Received: by ozlabs.org (Postfix) id E862EDDE18; Mon, 11 May 2009 22:54:08 +1000 (EST) Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 9091CDDE0A for ; Mon, 11 May 2009 22:54:08 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757728AbZEKMx7 (ORCPT ); Mon, 11 May 2009 08:53:59 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756473AbZEKMx5 (ORCPT ); Mon, 11 May 2009 08:53:57 -0400 Received: from rv-out-0506.google.com ([209.85.198.229]:29916 "EHLO rv-out-0506.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755884AbZEKMxz (ORCPT ); Mon, 11 May 2009 08:53:55 -0400 Received: by rv-out-0506.google.com with SMTP id f9so2140702rvb.1 for ; Mon, 11 May 2009 05:53:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:received:message-id :user-agent:date:from:to:cc:subject:references:content-disposition; bh=zwYqb3c8N+CpAPvTPdxh6QbBJwjtxIWW0+BdFYDrERs=; b=QY3NHxOal3C9moBjI0wnH71DQBPwG2rH5Sg/L5nu9gkv9b95WEk8R/gfuYPY3oIHl0 +AEFy12xmCtBCRyCI8VwTyWkGDjbCW/9JoDMfFt1umkK3wJdsWaTbVCKI6NtcOJDnLj8 /qjnnuDY8uSFcRtKxjUDZIF1TznZ0HKE+VreY= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:message-id:user-agent:date:from:to:cc:subject:references :content-disposition; b=iu7GNtqwLR0Awq3wB80lAKDdT7IGRekADfL7vLMrHvzNTOumJ9ooXd8AitfZauM/s8 PXMhP3rBfSzxxHzQSLiWQljEu3yGXDeSkkNCjLE/93V1xKw74/rIvuzzjy6ucrYed+8v VGR5GgHi/Uyty5GOYAVO5vpQcfOK8JZVDHxHw= Received: by 10.141.48.6 with SMTP id a6mr2802902rvk.36.1242046436394; Mon, 11 May 2009 05:53:56 -0700 (PDT) Received: from gorcunov (95-28-135-248.broadband.corbina.ru [95.28.135.248]) by mx.google.com with ESMTPS id f21sm10918026rvb.35.2009.05.11.05.53.54 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 11 May 2009 05:53:55 -0700 (PDT) Received: by gorcunov (Postfix, from userid 1000) id 5E3411C80; Mon, 11 May 2009 16:53:51 +0400 (MSD) Message-Id: <20090511125351.203354561@openvz.org> User-Agent: quilt/0.47-1 Date: Mon, 11 May 2009 15:46:43 +0400 From: Cyrill Gorcunov To: Stephen Hemminger Cc: davem@davemloft.net, netdev@vger.kernel.org, bridge@lists.linux-foundation.org, xemul@openvz.org, Cyrill Gorcunov Subject: [RFC 4/5] net: dev.c - introduce br_hard_xmit_hook References: <20090511114639.440944109@openvz.org> Content-Disposition: inline; filename=net-br-hard-xmit-hook Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In a sake of ability to handle outgoing skb by a bridge the br_hard_xmit_hook is added. Signed-off-by: Cyrill Gorcunov --- include/linux/if_bridge.h | 1 + net/core/dev.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) -- 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 Index: linux-2.6.git/include/linux/if_bridge.h ===================================================================== --- linux-2.6.git.orig/include/linux/if_bridge.h +++ linux-2.6.git/include/linux/if_bridge.h @@ -109,6 +109,7 @@ struct __fdb_entry extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); extern struct sk_buff *(*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff *skb); +extern int (*br_hard_xmit_hook)(struct sk_buff *skb, struct net_bridge_port *port); extern int (*br_should_route_hook)(struct sk_buff *skb); #endif Index: linux-2.6.git/net/core/dev.c ===================================================================== --- linux-2.6.git.orig/net/core/dev.c +++ linux-2.6.git/net/core/dev.c @@ -1671,6 +1671,24 @@ static int dev_gso_segment(struct sk_buf return 0; } +#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) +int (*br_hard_xmit_hook)(struct sk_buff *skb, struct net_bridge_port *port); +static inline int bridge_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct net_bridge_port *port; + + port = rcu_dereference(dev->br_port); + if (!port || skb->br_seen) + return 0; + + return br_hard_xmit_hook(skb, port); +} +#else +static inline int bridge_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ } +#endif + + int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq) { @@ -1688,6 +1706,8 @@ int dev_hard_start_xmit(struct sk_buff * goto gso; } + bridge_hard_start_xmit(skb, dev); + rc = ops->ndo_start_xmit(skb, dev); /* * TODO: if skb_orphan() was called by @@ -1712,6 +1732,9 @@ gso: skb->next = nskb->next; nskb->next = NULL; + + bridge_hard_start_xmit(skb, dev); + rc = ops->ndo_start_xmit(nskb, dev); if (unlikely(rc)) { nskb->next = skb->next; @@ -5576,6 +5599,7 @@ EXPORT_SYMBOL(dev_get_flags); #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) EXPORT_SYMBOL(br_handle_frame_hook); +EXPORT_SYMBOL(br_hard_xmit_hook); EXPORT_SYMBOL(br_fdb_get_hook); EXPORT_SYMBOL(br_fdb_put_hook); #endif