From patchwork Mon May 11 11:46:41 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cyrill Gorcunov X-Patchwork-Id: 27046 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 8AD22B6F56 for ; Mon, 11 May 2009 22:54:09 +1000 (EST) Received: by ozlabs.org (Postfix) id 7E484DDE18; Mon, 11 May 2009 22:54:09 +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 20926DDE0A for ; Mon, 11 May 2009 22:54:09 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757964AbZEKMyB (ORCPT ); Mon, 11 May 2009 08:54:01 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756518AbZEKMx7 (ORCPT ); Mon, 11 May 2009 08:53:59 -0400 Received: from rv-out-0506.google.com ([209.85.198.225]:31090 "EHLO rv-out-0506.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752652AbZEKMx4 (ORCPT ); Mon, 11 May 2009 08:53:56 -0400 Received: by rv-out-0506.google.com with SMTP id f9so2140700rvb.1 for ; Mon, 11 May 2009 05:53:57 -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=YNintBW6so8GKp2GABAfMgybxeDu2JQOsp0C0Mt3unE=; b=dydukonln0yroaD1Yyhqa0VOJS0h9MAvdSMD+tpG3NM8S1qgYUnAxBE8NW6EatoJsO vAaR0U528qmexZ9vcREQZLVzE5M++K++DIx8waHIpyN5qH8FFCt+Yd97nAr3ohP56rtX zEPOn/l6TjuoHDr+OCCHJABjavc6vSx2hFaNA= 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=EPmxtpWd8S+QdSHfy1M4lX+xarCglQE/phFrdUrYWBU452xdDG8QsDHt2UXZ1u95Xs 1hxSBALZ7aDyb/o55VQRcbo4DAxS6UV+xpAdjM3zVJMqmGpLf5GTRHp123d16GwSGj1t ob6BZCtTflro1yu/7q/p3VV4sdoJnpW8Y5iEM= Received: by 10.141.20.7 with SMTP id x7mr2756049rvi.85.1242046437513; Mon, 11 May 2009 05:53:57 -0700 (PDT) Received: from gorcunov (95-28-135-248.broadband.corbina.ru [95.28.135.248]) by mx.google.com with ESMTPS id f42sm10943450rvb.11.2009.05.11.05.53.54 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 11 May 2009 05:53:56 -0700 (PDT) Received: by gorcunov (Postfix, from userid 1000) id F15C61C7A; Mon, 11 May 2009 16:53:50 +0400 (MSD) Message-Id: <20090511125350.796823421@openvz.org> User-Agent: quilt/0.47-1 Date: Mon, 11 May 2009 15:46:41 +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 2/5] net: bridge - add managing of BRCTL_SET_VIA_PHYS_DEV and BRCTL_SET_MASTER_DEV References: <20090511114639.440944109@openvz.org> Content-Disposition: inline; filename=net-br-via_phys Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add managing via_phys_dev feature at sysctl level and ioctls as well. Signed-off-by: Cyrill Gorcunov --- Note: there is no changing done for __bridge_info structure and in handling of BRCTL_GET_BRIDGE_INFO since they are part of userspace. So returning info about master_dev could break userpace applications. Not sure how to better handle it and eventually decided to not touch it at all. include/linux/if_bridge.h | 2 ++ net/bridge/br_if.c | 22 ++++++++++++++++++++++ net/bridge/br_ioctl.c | 29 +++++++++++++++++++++++++++++ net/bridge/br_private.h | 2 ++ net/bridge/br_sysfs_br.c | 23 +++++++++++++++++++++++ 5 files changed, 78 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 @@ -42,6 +42,8 @@ #define BRCTL_SET_PORT_PRIORITY 16 #define BRCTL_SET_PATH_COST 17 #define BRCTL_GET_FDB_ENTRIES 18 +#define BRCTL_SET_VIA_PHYS_DEV 19 +#define BRCTL_SET_MASTER_DEV 20 #define BR_STATE_DISABLED 0 #define BR_STATE_LISTENING 1 Index: linux-2.6.git/net/bridge/br_if.c ===================================================================== --- linux-2.6.git.orig/net/bridge/br_if.c +++ linux-2.6.git/net/bridge/br_if.c @@ -158,6 +158,11 @@ static void del_br(struct net_bridge *br { struct net_bridge_port *p, *n; + if (br->master_dev) { + dev_put(br->master_dev); + br->master_dev = NULL; + } + list_for_each_entry_safe(p, n, &br->port_list, list) { del_nbp(p); } @@ -412,6 +417,19 @@ int br_add_if(struct net_bridge *br, str if ((dev->flags & IFF_UP) && netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) br_stp_enable_port(p); + + /* + * since brctl utils could not have BRCTL_SET_MASTER_DEV + * yet implemented we set first port as master device + * if via_phys_dev is turned on + */ + if (br->via_phys_dev) { + if (!br->master_dev) { + dev_hold(dev); + br->master_dev = dev; + } + } + spin_unlock_bh(&br->lock); br_ifinfo_notify(RTM_NEWLINK, p); @@ -446,6 +464,10 @@ int br_del_if(struct net_bridge *br, str spin_lock_bh(&br->lock); br_stp_recalculate_bridge_id(br); br_features_recompute(br); + if (br->master_dev == dev) { + br->master_dev = NULL; + dev_put(dev); + } spin_unlock_bh(&br->lock); return 0; Index: linux-2.6.git/net/bridge/br_ioctl.c ===================================================================== --- linux-2.6.git.orig/net/bridge/br_ioctl.c +++ linux-2.6.git/net/bridge/br_ioctl.c @@ -262,6 +262,35 @@ static int old_dev_ioctl(struct net_devi br_stp_set_enabled(br, args[1]); return 0; + case BRCTL_SET_VIA_PHYS_DEV: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + br->via_phys_dev = args[1] ? true : false; + return 0; + + case BRCTL_SET_MASTER_DEV: + { + struct net_device *dev; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (!br->via_phys_dev) { + pr_debug("Bridge: turn on via_phys_dev feature first\n"); + return -EINVAL; + } + + dev = dev_get_by_index(dev_net(br->dev), args[1]); + if (dev == NULL) + return -EINVAL; + + if (br->master_dev) + dev_put(br->master_dev); + br->master_dev = dev; + + return 0; + } + case BRCTL_SET_BRIDGE_PRIORITY: if (!capable(CAP_NET_ADMIN)) return -EPERM; Index: linux-2.6.git/net/bridge/br_private.h ===================================================================== --- linux-2.6.git.orig/net/bridge/br_private.h +++ linux-2.6.git/net/bridge/br_private.h @@ -89,6 +89,8 @@ struct net_bridge spinlock_t lock; struct list_head port_list; struct net_device *dev; + struct net_device *master_dev; + bool via_phys_dev; spinlock_t hash_lock; struct hlist_head hash[BR_HASH_SIZE]; struct list_head age_list; Index: linux-2.6.git/net/bridge/br_sysfs_br.c ===================================================================== --- linux-2.6.git.orig/net/bridge/br_sysfs_br.c +++ linux-2.6.git/net/bridge/br_sysfs_br.c @@ -181,6 +181,28 @@ static ssize_t store_stp_state(struct de static DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state, store_stp_state); +static ssize_t show_via_phys_dev_state(struct device *cd, + struct device_attribute *attr, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%d\n", br->via_phys_dev); +} + +static int set_via_phys_dev_state(struct net_bridge *br, unsigned long val) +{ + br->via_phys_dev = val ? true : false; + return 0; +} + +static ssize_t store_via_phys_dev_state(struct device *cd, + struct device_attribute *attr, const char *buf, size_t len) +{ + return store_bridge_parm(cd, buf, len, set_via_phys_dev_state); +} + +static DEVICE_ATTR(via_phys_dev, S_IRUGO | S_IWUSR, show_via_phys_dev_state, + store_via_phys_dev_state); + static ssize_t show_priority(struct device *d, struct device_attribute *attr, char *buf) { @@ -350,6 +372,7 @@ static struct attribute *bridge_attrs[] &dev_attr_max_age.attr, &dev_attr_ageing_time.attr, &dev_attr_stp_state.attr, + &dev_attr_via_phys_dev.attr, &dev_attr_priority.attr, &dev_attr_bridge_id.attr, &dev_attr_root_id.attr,