patch-2.4.27 linux-2.4.27/net/bridge/br_if.c
Next file: linux-2.4.27/net/bridge/br_ioctl.c
Previous file: linux-2.4.27/net/bridge/br.c
Back to the patch index
Back to the overall index
- Lines: 142
- Date:
2004-08-07 16:26:06.820435779 -0700
- Orig file:
linux-2.4.26/net/bridge/br_if.c
- Orig date:
2003-08-25 04:44:44.000000000 -0700
diff -urN linux-2.4.26/net/bridge/br_if.c linux-2.4.27/net/bridge/br_if.c
@@ -19,11 +19,10 @@
#include <linux/inetdevice.h>
#include <linux/rtnetlink.h>
#include <linux/brlock.h>
+#include <linux/etherdevice.h>
#include <asm/uaccess.h>
#include "br_private.h"
-static struct net_bridge *bridge_list;
-
static int br_initial_port_cost(struct net_device *dev)
{
if (!strncmp(dev->name, "lec", 3))
@@ -44,7 +43,7 @@
struct net_bridge_port *p;
struct net_bridge_port **pptr;
- if ((p = dev->br_port) == NULL)
+ if ((p = dev->br_port) == NULL || p->br != br)
return -EINVAL;
br_stp_disable_port(p);
@@ -69,22 +68,6 @@
return 0;
}
-static struct net_bridge **__find_br(char *name)
-{
- struct net_bridge **b;
- struct net_bridge *br;
-
- b = &bridge_list;
- while ((br = *b) != NULL) {
- if (!strncmp(br->dev.name, name, IFNAMSIZ))
- return b;
-
- b = &(br->next);
- }
-
- return NULL;
-}
-
static void del_ifs(struct net_bridge *br)
{
br_write_lock_bh(BR_NETPROTO_LOCK);
@@ -177,42 +160,48 @@
int br_add_bridge(char *name)
{
struct net_bridge *br;
+ struct net_device *dev;
+ int err;
if ((br = new_nb(name)) == NULL)
return -ENOMEM;
- if (__dev_get_by_name(name) != NULL) {
- kfree(br);
- return -EEXIST;
+ dev = &br->dev;
+ if (strchr(dev->name, '%')) {
+ err = dev_alloc_name(dev, dev->name);
+ if (err < 0)
+ goto out;
}
- br->next = bridge_list;
- bridge_list = br;
+ err = register_netdevice(dev);
+ if (err == 0)
+ br_inc_use_count();
- br_inc_use_count();
- register_netdev(&br->dev);
-
- return 0;
+ out:
+ return err;
}
int br_del_bridge(char *name)
{
- struct net_bridge **b;
+ struct net_device *dev;
struct net_bridge *br;
- if ((b = __find_br(name)) == NULL)
+ dev = __dev_get_by_name(name);
+ if (!dev)
return -ENXIO;
- br = *b;
+ if (dev->hard_start_xmit != br_dev_xmit)
+ return -EPERM;
- if (br->dev.flags & IFF_UP)
+ if (dev->flags & IFF_UP)
return -EBUSY;
- del_ifs(br);
+ br = dev->priv;
+ BUG_ON(&br->dev != dev);
- *b = br->next;
+ del_ifs(br);
- unregister_netdev(&br->dev);
+ unregister_netdevice(dev);
kfree(br);
br_dec_use_count();
@@ -232,6 +221,9 @@
if (dev->hard_start_xmit == br_dev_xmit)
return -ELOOP;
+ if (!is_valid_ether_addr(dev->dev_addr))
+ return -EADDRNOTAVAIL;
+
dev_hold(dev);
write_lock_bh(&br->lock);
if ((p = new_nbp(br, dev)) == NULL) {
@@ -267,16 +259,12 @@
int br_get_bridge_ifindices(int *indices, int num)
{
- struct net_bridge *br;
- int i;
-
- br = bridge_list;
- for (i=0;i<num;i++) {
- if (br == NULL)
- break;
+ struct net_device *dev;
+ int i = 0;
- indices[i] = br->dev.ifindex;
- br = br->next;
+ for (dev = dev_base; i < num && dev != NULL; dev = dev->next) {
+ if (dev->hard_start_xmit == br_dev_xmit)
+ indices[i++] = dev->ifindex;
}
return i;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)