All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlad Yasevich <vyasevich@gmail.com>
To: Ahmed Amamou <ahmed@gandi.net>, netdev@vger.kernel.org
Cc: william@gandi.net, f.cachereul@alphalink.fr,
	Kamel Haddadou <kamel@gandi.net>
Subject: Re: [RFC PATCH 06/24] net: rbridge: Enable/disable TRILL capability
Date: Wed, 24 Sep 2014 13:46:37 -0400	[thread overview]
Message-ID: <5423037D.2090001@gmail.com> (raw)
In-Reply-To: <1411573940-14079-7-git-send-email-ahmed@gandi.net>

On 09/24/2014 11:52 AM, Ahmed Amamou wrote:
> enable switching TRILL capability state via sysfs command
> 
> Signed-off-by: Ahmed Amamou <ahmed@gandi.net>
> Signed-off-by: Kamel Haddadou <kamel@gandi.net>
> ---
>  net/bridge/Makefile      |  2 ++
>  net/bridge/br_private.h  |  5 ++++
>  net/bridge/br_sysfs_br.c | 38 +++++++++++++++++++++++
>  net/bridge/rbridge/rbr.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 123 insertions(+)
>  create mode 100644 net/bridge/rbridge/rbr.c
> 
> diff --git a/net/bridge/Makefile b/net/bridge/Makefile
> index 8590b94..314783c 100644
> --- a/net/bridge/Makefile
> +++ b/net/bridge/Makefile
> @@ -17,3 +17,5 @@ bridge-$(CONFIG_BRIDGE_IGMP_SNOOPING) += br_multicast.o br_mdb.o
>  bridge-$(CONFIG_BRIDGE_VLAN_FILTERING) += br_vlan.o
>  
>  obj-$(CONFIG_NETFILTER) += netfilter/
> +
> +bridge-$(CONFIG_TRILL) += rbridge/rbr.o
> diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
> index 430c556..844c87b 100644
> --- a/net/bridge/br_private.h
> +++ b/net/bridge/br_private.h
> @@ -811,6 +811,11 @@ int br_stp_set_port_priority(struct net_bridge_port *p, unsigned long newprio);
>  int br_stp_set_path_cost(struct net_bridge_port *p, unsigned long path_cost);
>  ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id);
>  
> +/* rbridge/rbr.c */
> +#ifdef CONFIG_TRILL
> +void br_trill_set_enabled(struct net_bridge *br, unsigned long val);
> +#endif
> +
>  /* br_stp_bpdu.c */
>  struct stp_proto;
>  void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
> diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c
> index c9e2572..787ab84 100644
> --- a/net/bridge/br_sysfs_br.c
> +++ b/net/bridge/br_sysfs_br.c
> @@ -146,6 +146,41 @@ static ssize_t stp_state_store(struct device *d,
>  }
>  static DEVICE_ATTR_RW(stp_state);
>  
> +#ifdef CONFIG_TRILL
> +static ssize_t trill_state_show(struct device *d,
> +				struct device_attribute *attr, char *buf)
> +{
> +	struct net_bridge *br = to_bridge(d);
> +	return sprintf(buf, "%d\n", br->trill_enabled);
> +}
> +
> +static ssize_t trill_state_store(struct device *d,
> +				 struct device_attribute *attr, const char *buf,
> +				 size_t len)
> +{
> +	struct net_bridge *br = to_bridge(d);
> +	char *endp;
> +	unsigned long val;
> +
> +	if (!ns_capable(dev_net(br->dev)->user_ns, CAP_NET_ADMIN))
> +		return -EPERM;
> +
> +	val = simple_strtoul(buf, &endp, 0);
> +	if (endp == buf)
> +		return -EINVAL;
> +
> +	if (!rtnl_trylock())
> +		return restart_syscall();
> +	br_trill_set_enabled(br, val);
> +	rtnl_unlock();
> +
> +	return len;
> +}
> +
> +static DEVICE_ATTR_RW(trill_state);
> +#endif
> +
> +
>  static ssize_t group_fwd_mask_show(struct device *d,
>  				   struct device_attribute *attr,
>  				   char *buf)
> @@ -733,6 +768,9 @@ static struct attribute *bridge_attrs[] = {
>  	&dev_attr_max_age.attr,
>  	&dev_attr_ageing_time.attr,
>  	&dev_attr_stp_state.attr,
> +#ifdef CONFIG_TRILL
> +	&dev_attr_trill_state.attr,
> +#endif
>  	&dev_attr_group_fwd_mask.attr,
>  	&dev_attr_priority.attr,
>  	&dev_attr_bridge_id.attr,
> diff --git a/net/bridge/rbridge/rbr.c b/net/bridge/rbridge/rbr.c
> new file mode 100644
> index 0000000..41d47db
> --- /dev/null
> +++ b/net/bridge/rbridge/rbr.c
> @@ -0,0 +1,78 @@
> +/*
> + *	Generic parts
> + *	Linux ethernet Rbridge
> + *
> + *	Authors:
> + *	Ahmed AMAMOU	<ahmed@gandi.net>
> + *	Kamel Haddadou	<kamel@gandi.net>
> + *
> + *	This program is free software; you can redistribute it and/or
> + *	modify it under the terms of the GNU General Public License
> + *	as published by the Free Software Foundation; either version
> + *	2 of the License, or (at your option) any later version.
> + */
> +#include "br_private.h"
> +#include "rbr_private.h"
> +
> +static struct rbr *add_rbr(struct net_bridge *br)
> +{
> +	struct rbr *rbr;
> +
> +	if (!br->rbr) {
> +		rbr = kzalloc(sizeof(*rbr), GFP_KERNEL);
> +		if (!rbr)
> +			return NULL;
> +
> +		rbr->br = br;
> +		rbr->nick = RBRIDGE_NICKNAME_NONE;
> +		rbr->treeroot = RBRIDGE_NICKNAME_NONE;
> +		return rbr;
> +	}
> +
> +	return br->rbr;
> +}
> +
> +static void br_trill_start(struct net_bridge *br)
> +{
> +	/* Disable STP if it is already enabled */
> +
> +	if (br->stp_enabled != BR_NO_STP)
> +		br_stp_set_enabled(br, false);
> +	br->rbr = add_rbr(br);
> +	if (br->rbr) {
> +		spin_lock_bh(&br->lock);
> +		br->trill_enabled = BR_TRILL;
> +		spin_unlock_bh(&br->lock);
> +	} else {
> +		printk(KERN_WARNING
> +		       "RBridge allocation for bridge '%s' failed\n",
> +		       br->dev->name);
> +	}
> +}
> +
> +static void br_trill_stop(struct net_bridge *br)
> +{
> +	struct rbr *old;
> +
> +	spin_lock_bh(&br->lock);
> +	br->trill_enabled = BR_NO_TRILL;
> +	spin_unlock_bh(&br->lock);

Are the locks around trill_enabled really needed?  Seems to be already
protected by rtnl.  Are you protecting against something else?

> +	old = br->rbr;
> +	br->rbr = NULL;
> +	if (likely(old)) {
> +		spin_lock_bh(&br->lock);
> +		kfree(old);
> +		spin_unlock_bh(&br->lock);

These locks appear to be completely unnecessary.

Also what's protecting future refrences to br->rbr?  Should it be rcu
protected?

-vlad
> +	}
> +}
> +
> +void br_trill_set_enabled(struct net_bridge *br, unsigned long val)
> +{
> +	if (val) {
> +		if (br->trill_enabled == BR_NO_TRILL)
> +			br_trill_start(br);
> +	} else {
> +		if (br->trill_enabled != BR_NO_TRILL)
> +			br_trill_stop(br);
> +	}
> +}
> 

  reply	other threads:[~2014-09-24 17:46 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-24 15:51 [RFC PATCH 00/24] TRILL implementation Ahmed Amamou
2014-09-24 15:51 ` [RFC PATCH 01/24] net: rbridge: add trill frame description Ahmed Amamou
2014-09-24 16:38   ` Stephen Hemminger
2014-09-24 16:48     ` William Dauchy
2014-09-24 17:26       ` Cong Wang
2014-09-24 17:34         ` William Dauchy
2014-09-24 17:01   ` Cong Wang
2014-09-24 15:51 ` [RFC PATCH 02/24] net: rbridge: Add layer 2 IS-IS Ethertype Ahmed Amamou
2014-09-24 15:51 ` [RFC PATCH 03/24] net: rbridge: Add RBridge structure Ahmed Amamou
2014-09-24 16:40   ` Stephen Hemminger
2014-09-24 16:55     ` William Dauchy
2014-09-24 17:18   ` Cong Wang
2014-09-24 15:52 ` [RFC PATCH 04/24] net: rbridge: Add CONFIG_TRILL Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 05/24] net: rbridge: Adapt Bridge structure Ahmed Amamou
2014-09-24 20:56   ` Francois Romieu
2014-09-24 15:52 ` [RFC PATCH 06/24] net: rbridge: Enable/disable TRILL capability Ahmed Amamou
2014-09-24 17:46   ` Vlad Yasevich [this message]
2014-09-24 15:52 ` [RFC PATCH 07/24] net: rbridge: Add sysfs for trill_state Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 08/24] net: rbridge: Add Rbridge netlink message skeleton Ahmed Amamou
2014-09-24 17:52   ` Vlad Yasevich
2014-09-24 15:52 ` [RFC PATCH 09/24] net: rbridge: Get Rbridge nickname from daemon Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 10/24] net: rbridge: Add elected dtroot Ahmed Amamou
2014-09-25 11:30   ` Sergei Shtylyov
2014-09-24 15:52 ` [RFC PATCH 11/24] net: rbridge: Add rbr_node management function Ahmed Amamou
2014-09-25 11:24   ` Sergei Shtylyov
2014-09-24 15:52 ` [RFC PATCH 12/24] net: rbridge: Clean up rbr_node on rbridge stop Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 13/24] net: rbridge: Add set_node function Ahmed Amamou
2014-09-25 11:34   ` Sergei Shtylyov
2014-09-24 15:52 ` [RFC PATCH 14/24] net: rbridge: Add get_node function Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 15/24] net: rbridge: Add basic trill frame handling function Ahmed Amamou
2014-09-24 19:23   ` Francois Romieu
2014-09-24 15:52 ` [RFC PATCH 16/24] net: rbridge: Update forwarding database Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 17/24] net: rbridge: Add test on trill flag before flood Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 18/24] net: rbridge: Add encapsulation process Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 19/24] net: rbridge: Add receive function Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 20/24] net: rbridge: Add multicast recv handling Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 21/24] net: rbridge: Add decapsulation function Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 22/24] net: rbridge: Add rbr_fwd Ahmed Amamou
2014-09-25 11:43   ` Sergei Shtylyov
2014-09-24 15:52 ` [RFC PATCH 23/24] net: rbridge: Add rbr_multidest_fwd Ahmed Amamou
2014-09-24 15:52 ` [RFC PATCH 24/24] net: rbridge: replace net_port rx_handler Ahmed Amamou
2014-09-24 16:44 ` [RFC PATCH 00/24] TRILL implementation Stephen Hemminger
2014-09-24 16:54   ` William Dauchy
2014-09-24 17:24     ` Cong Wang
2014-09-24 17:33       ` William Dauchy
2014-09-24 20:57     ` Francois Romieu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5423037D.2090001@gmail.com \
    --to=vyasevich@gmail.com \
    --cc=ahmed@gandi.net \
    --cc=f.cachereul@alphalink.fr \
    --cc=kamel@gandi.net \
    --cc=netdev@vger.kernel.org \
    --cc=william@gandi.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.