aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavem <davem>2001-12-24 00:59:55 +0000
committerdavem <davem>2001-12-24 00:59:55 +0000
commit5b15431c54ce9a6d8c7bc733c5835fd4d62d3b11 (patch)
treeebc989e5af8cfd906e378f7de672f33bc16b70d4
parent8e415ed15437f6c879fd3c04b3d3b1bbdbb3b5da (diff)
downloadnetdev-vger-cvs-5b15431c54ce9a6d8c7bc733c5835fd4d62d3b11.tar.gz
Do not allow enslavement of a bridge device to
another bridge device, causes recursion and does not make any sense anyways. From Lennert Buytenhek.
-rw-r--r--net/bridge/br_device.c4
-rw-r--r--net/bridge/br_if.c5
-rw-r--r--net/bridge/br_private.h3
3 files changed, 8 insertions, 4 deletions
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
index 42e69ed56..e9dde42cc 100644
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
@@ -5,7 +5,7 @@
* Authors:
* Lennert Buytenhek <buytenh@gnu.org>
*
- * $Id: br_device.c,v 1.5 2001-08-14 22:05:57 davem Exp $
+ * $Id: br_device.c,v 1.6 2001-12-24 00:59:55 davem Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -71,7 +71,7 @@ static int __br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
return 0;
}
-static int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
+int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct net_bridge *br;
int ret;
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 0c52e6500..7bb9a9fae 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -5,7 +5,7 @@
* Authors:
* Lennert Buytenhek <buytenh@gnu.org>
*
- * $Id: br_if.c,v 1.6 2001-11-24 17:51:03 davem Exp $
+ * $Id: br_if.c,v 1.7 2001-12-24 00:59:55 davem Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -226,6 +226,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER)
return -EINVAL;
+ if (dev->hard_start_xmit == br_dev_xmit)
+ return -ELOOP;
+
dev_hold(dev);
write_lock_bh(&br->lock);
if ((p = new_nbp(br, dev)) == NULL) {
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 4930b19fb..4420bbf09 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -4,7 +4,7 @@
* Authors:
* Lennert Buytenhek <buytenh@gnu.org>
*
- * $Id: br_private.h,v 1.6 2001-06-01 09:28:28 davem Exp $
+ * $Id: br_private.h,v 1.7 2001-12-24 00:59:55 davem Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -121,6 +121,7 @@ extern void br_inc_use_count(void);
/* br_device.c */
extern void br_dev_setup(struct net_device *dev);
+extern int br_dev_xmit(struct sk_buff *skb, struct net_device *dev);
/* br_fdb.c */
extern void br_fdb_changeaddr(struct net_bridge_port *p,