Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.20 90 lines 2.1 kB view raw
1/* 2 * Device event handling 3 * Linux ethernet bridge 4 * 5 * Authors: 6 * Lennert Buytenhek <buytenh@gnu.org> 7 * 8 * $Id: br_notify.c,v 1.2 2000/02/21 15:51:34 davem Exp $ 9 * 10 * This program is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU General Public License 12 * as published by the Free Software Foundation; either version 13 * 2 of the License, or (at your option) any later version. 14 */ 15 16#include <linux/kernel.h> 17#include <linux/rtnetlink.h> 18 19#include "br_private.h" 20 21static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr); 22 23struct notifier_block br_device_notifier = { 24 .notifier_call = br_device_event 25}; 26 27/* 28 * Handle changes in state of network devices enslaved to a bridge. 29 * 30 * Note: don't care about up/down if bridge itself is down, because 31 * port state is checked when bridge is brought up. 32 */ 33static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr) 34{ 35 struct net_device *dev = ptr; 36 struct net_bridge_port *p = dev->br_port; 37 struct net_bridge *br; 38 39 /* not a port of a bridge */ 40 if (p == NULL) 41 return NOTIFY_DONE; 42 43 br = p->br; 44 45 spin_lock_bh(&br->lock); 46 switch (event) { 47 case NETDEV_CHANGEMTU: 48 dev_set_mtu(br->dev, br_min_mtu(br)); 49 break; 50 51 case NETDEV_CHANGEADDR: 52 br_fdb_changeaddr(p, dev->dev_addr); 53 br_ifinfo_notify(RTM_NEWLINK, p); 54 br_stp_recalculate_bridge_id(br); 55 break; 56 57 case NETDEV_CHANGE: 58 if (br->dev->flags & IFF_UP) 59 schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE); 60 break; 61 62 case NETDEV_FEAT_CHANGE: 63 if (br->dev->flags & IFF_UP) 64 br_features_recompute(br); 65 66 /* could do recursive feature change notification 67 * but who would care?? 68 */ 69 break; 70 71 case NETDEV_DOWN: 72 if (br->dev->flags & IFF_UP) 73 br_stp_disable_port(p); 74 break; 75 76 case NETDEV_UP: 77 if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) 78 br_stp_enable_port(p); 79 break; 80 81 case NETDEV_UNREGISTER: 82 spin_unlock_bh(&br->lock); 83 br_del_if(br, dev); 84 goto done; 85 } 86 spin_unlock_bh(&br->lock); 87 88 done: 89 return NOTIFY_DONE; 90}