From: Stephen Hemminger <shemminger@linux-foundation.org>
To: David Miller <davem@davemloft.net>
Cc: anna.fischer@hp.com, netdev@vger.kernel.org,
ptcongdon@ucdavis.edu, evb@yahoogroups.com,
bridge@lists.linux-foundation.org, kaber@trash.net,
arnd@arndb.de, mike.dickson@hp.com, adobriyan@gmail.com,
bridge@osdl.org
Subject: [RFC] bridge: prevent hairpin and STP problems?
Date: Fri, 14 Aug 2009 14:41:33 -0700 [thread overview]
Message-ID: <20090814144133.34ac9d94@nehalam> (raw)
In-Reply-To: <20090813.162716.207478915.davem@davemloft.net>
Do we need to add this to block Spanning Tree from being enabled
with hairpin mode? I am not sure what the exact usage of hairpin
mode and if it is possible to create loops and get STP confusion.
For comment only, do not apply as is.
--- a/net/bridge/br_ioctl.c 2009-08-14 14:28:19.917690805 -0700
+++ b/net/bridge/br_ioctl.c 2009-08-14 14:29:54.078271361 -0700
@@ -259,8 +259,7 @@ static int old_dev_ioctl(struct net_devi
if (!capable(CAP_NET_ADMIN))
return -EPERM;
- br_stp_set_enabled(br, args[1]);
- return 0;
+ return br_stp_set_enabled(br, args[1]);
case BRCTL_SET_BRIDGE_PRIORITY:
if (!capable(CAP_NET_ADMIN))
--- a/net/bridge/br_stp_if.c 2009-08-14 14:24:30.022315573 -0700
+++ b/net/bridge/br_stp_if.c 2009-08-14 14:35:25.819566113 -0700
@@ -160,17 +160,26 @@ static void br_stp_stop(struct net_bridg
br->stp_enabled = BR_NO_STP;
}
-void br_stp_set_enabled(struct net_bridge *br, unsigned long val)
+int br_stp_set_enabled(struct net_bridge *br, unsigned long val)
{
ASSERT_RTNL();
if (val) {
+ struct net_bridge_port *p;
+ list_for_each_entry_rcu(p, &br->port_list, list) {
+ if (p->flags & BR_HAIRPIN_MODE)
+ return -EINVAL;
+ }
+
+
if (br->stp_enabled == BR_NO_STP)
br_stp_start(br);
} else {
if (br->stp_enabled != BR_NO_STP)
br_stp_stop(br);
}
+
+ return 0;
}
/* called under bridge lock */
--- a/net/bridge/br_sysfs_br.c 2009-08-14 14:24:36.874256194 -0700
+++ b/net/bridge/br_sysfs_br.c 2009-08-14 14:33:26.025441102 -0700
@@ -164,6 +164,7 @@ static ssize_t store_stp_state(struct de
struct net_bridge *br = to_bridge(d);
char *endp;
unsigned long val;
+ int ret;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
@@ -174,10 +175,11 @@ static ssize_t store_stp_state(struct de
if (!rtnl_trylock())
return restart_syscall();
- br_stp_set_enabled(br, val);
+
+ ret = br_stp_set_enabled(br, val);
rtnl_unlock();
- return len;
+ return (ret == 0) ? len : ret;
}
static DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state,
store_stp_state);
--- a/net/bridge/br_sysfs_if.c 2009-08-14 14:24:36.888356879 -0700
+++ b/net/bridge/br_sysfs_if.c 2009-08-14 14:34:55.339272738 -0700
@@ -150,10 +150,13 @@ static ssize_t show_hairpin_mode(struct
}
static ssize_t store_hairpin_mode(struct net_bridge_port *p, unsigned long v)
{
- if (v)
+ if (!v)
+ p->flags &= ~BR_HAIRPIN_MODE;
+ else if (p->br->stp_enabled == BR_NO_STP)
p->flags |= BR_HAIRPIN_MODE;
else
- p->flags &= ~BR_HAIRPIN_MODE;
+ return -EINVAL;
+
return 0;
}
static BRPORT_ATTR(hairpin_mode, S_IRUGO | S_IWUSR,
--- a/net/bridge/br_private.h 2009-08-14 14:34:05.263278817 -0700
+++ b/net/bridge/br_private.h 2009-08-14 14:34:15.717297908 -0700
@@ -218,7 +218,7 @@ extern void br_become_designated_port(st
/* br_stp_if.c */
extern void br_stp_enable_bridge(struct net_bridge *br);
extern void br_stp_disable_bridge(struct net_bridge *br);
-extern void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
+extern int br_stp_set_enabled(struct net_bridge *br, unsigned long val);
extern void br_stp_enable_port(struct net_bridge_port *p);
extern void br_stp_disable_port(struct net_bridge_port *p);
extern void br_stp_recalculate_bridge_id(struct net_bridge *br);
next prev parent reply other threads:[~2009-08-14 21:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-13 16:55 [PATCH] net/bridge: Add 'hairpin' port forwarding mode Fischer, Anna
2009-08-13 17:06 ` Arnd Bergmann
2009-08-13 18:07 ` Stephen Hemminger
2009-08-13 23:27 ` David Miller
2009-08-14 21:41 ` Stephen Hemminger [this message]
2009-08-17 21:16 ` [RFC] bridge: prevent hairpin and STP problems? Fischer, Anna
2009-08-17 22:37 ` Stephen Hemminger
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=20090814144133.34ac9d94@nehalam \
--to=shemminger@linux-foundation.org \
--cc=adobriyan@gmail.com \
--cc=anna.fischer@hp.com \
--cc=arnd@arndb.de \
--cc=bridge@lists.linux-foundation.org \
--cc=bridge@osdl.org \
--cc=davem@davemloft.net \
--cc=evb@yahoogroups.com \
--cc=kaber@trash.net \
--cc=mike.dickson@hp.com \
--cc=netdev@vger.kernel.org \
--cc=ptcongdon@ucdavis.edu \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).