diff options
Diffstat (limited to 'net/bridge/br_notify.c')
-rw-r--r-- | net/bridge/br_notify.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/net/bridge/br_notify.c b/net/bridge/br_notify.c new file mode 100644 index 000000000..8a109d7c3 --- /dev/null +++ b/net/bridge/br_notify.c @@ -0,0 +1,75 @@ +/* + * Device event handling + * Linux ethernet bridge + * + * Authors: + * Lennert Buytenhek <buytenh@gnu.org> + * + * $Id: br_notify.c,v 1.1 2000/02/18 16:47:12 davem Exp $ + * + * 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 <linux/kernel.h> +#include <linux/if_bridge.h> +#include "br_private.h" + +static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr); + +struct notifier_block br_device_notifier = +{ + br_device_event, + NULL, + 0 +}; + +static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr) +{ + struct net_device *dev; + struct net_bridge_port *p; + + dev = ptr; + p = dev->br_port; + + if (p == NULL) + return NOTIFY_DONE; + + switch (event) + { + case NETDEV_CHANGEADDR: + read_lock(&p->br->lock); + br_fdb_changeaddr(p, dev->dev_addr); + br_stp_recalculate_bridge_id(p->br); + read_unlock(&p->br->lock); + break; + + case NETDEV_GOING_DOWN: + /* extend the protocol to send some kind of notification? */ + break; + + case NETDEV_DOWN: + if (p->br->dev.flags & IFF_UP) { + read_lock(&p->br->lock); + br_stp_disable_port(dev->br_port); + read_unlock(&p->br->lock); + } + break; + + case NETDEV_UP: + if (p->br->dev.flags & IFF_UP) { + read_lock(&p->br->lock); + br_stp_enable_port(dev->br_port); + read_unlock(&p->br->lock); + } + break; + + case NETDEV_UNREGISTER: + br_del_if(dev->br_port->br, dev); + break; + } + + return NOTIFY_DONE; +} |