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.35-rc3 104 lines 2.4 kB view raw
1/* 2 * Device event handling 3 * Linux ethernet bridge 4 * 5 * Authors: 6 * Lennert Buytenhek <buytenh@gnu.org> 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 11 * 2 of the License, or (at your option) any later version. 12 */ 13 14#include <linux/kernel.h> 15#include <linux/rtnetlink.h> 16#include <net/net_namespace.h> 17 18#include "br_private.h" 19 20static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr); 21 22struct notifier_block br_device_notifier = { 23 .notifier_call = br_device_event 24}; 25 26/* 27 * Handle changes in state of network devices enslaved to a bridge. 28 * 29 * Note: don't care about up/down if bridge itself is down, because 30 * port state is checked when bridge is brought up. 31 */ 32static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr) 33{ 34 struct net_device *dev = ptr; 35 struct net_bridge_port *p = dev->br_port; 36 struct net_bridge *br; 37 int err; 38 39 /* not a port of a bridge */ 40 if (p == NULL) 41 return NOTIFY_DONE; 42 43 br = p->br; 44 45 switch (event) { 46 case NETDEV_CHANGEMTU: 47 dev_set_mtu(br->dev, br_min_mtu(br)); 48 break; 49 50 case NETDEV_CHANGEADDR: 51 spin_lock_bh(&br->lock); 52 br_fdb_changeaddr(p, dev->dev_addr); 53 br_stp_recalculate_bridge_id(br); 54 spin_unlock_bh(&br->lock); 55 break; 56 57 case NETDEV_CHANGE: 58 br_port_carrier_check(p); 59 break; 60 61 case NETDEV_FEAT_CHANGE: 62 spin_lock_bh(&br->lock); 63 if (netif_running(br->dev)) 64 br_features_recompute(br); 65 spin_unlock_bh(&br->lock); 66 break; 67 68 case NETDEV_DOWN: 69 spin_lock_bh(&br->lock); 70 if (br->dev->flags & IFF_UP) 71 br_stp_disable_port(p); 72 spin_unlock_bh(&br->lock); 73 break; 74 75 case NETDEV_UP: 76 if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) { 77 spin_lock_bh(&br->lock); 78 br_stp_enable_port(p); 79 spin_unlock_bh(&br->lock); 80 } 81 break; 82 83 case NETDEV_UNREGISTER: 84 br_del_if(br, dev); 85 break; 86 87 case NETDEV_CHANGENAME: 88 err = br_sysfs_renameif(p); 89 if (err) 90 return notifier_from_errno(err); 91 break; 92 93 case NETDEV_PRE_TYPE_CHANGE: 94 /* Forbid underlaying device to change its type. */ 95 return NOTIFY_BAD; 96 } 97 98 /* Events that may cause spanning tree to refresh */ 99 if (event == NETDEV_CHANGEADDR || event == NETDEV_UP || 100 event == NETDEV_CHANGE || event == NETDEV_DOWN) 101 br_ifinfo_notify(RTM_NEWLINK, p); 102 103 return NOTIFY_DONE; 104}