Commit b1282726d53465c7362eb134eb335173e8cd5b8c
Committed by
David S. Miller
1 parent
5c4a43b024
bridge: make br_device_notifier static
Merge net/bridge/br_notify.c into net/bridge/br.c, since it has only br_device_event() and br.c is small. Cc: Stephen Hemminger <stephen@networkplumber.org> Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 4 changed files with 99 additions and 121 deletions Side-by-side Diff
net/bridge/Makefile
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | obj-$(CONFIG_BRIDGE) += bridge.o |
6 | 6 | |
7 | 7 | bridge-y := br.o br_device.o br_fdb.o br_forward.o br_if.o br_input.o \ |
8 | - br_ioctl.o br_notify.o br_stp.o br_stp_bpdu.o \ | |
8 | + br_ioctl.o br_stp.o br_stp_bpdu.o \ | |
9 | 9 | br_stp_if.o br_stp_timer.o br_netlink.o |
10 | 10 | |
11 | 11 | bridge-$(CONFIG_SYSFS) += br_sysfs_if.o br_sysfs_br.o |
net/bridge/br.c
... | ... | @@ -22,6 +22,104 @@ |
22 | 22 | |
23 | 23 | #include "br_private.h" |
24 | 24 | |
25 | +/* | |
26 | + * Handle changes in state of network devices enslaved to a bridge. | |
27 | + * | |
28 | + * Note: don't care about up/down if bridge itself is down, because | |
29 | + * port state is checked when bridge is brought up. | |
30 | + */ | |
31 | +static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr) | |
32 | +{ | |
33 | + struct net_device *dev = netdev_notifier_info_to_dev(ptr); | |
34 | + struct net_bridge_port *p; | |
35 | + struct net_bridge *br; | |
36 | + bool changed_addr; | |
37 | + int err; | |
38 | + | |
39 | + /* register of bridge completed, add sysfs entries */ | |
40 | + if ((dev->priv_flags & IFF_EBRIDGE) && event == NETDEV_REGISTER) { | |
41 | + br_sysfs_addbr(dev); | |
42 | + return NOTIFY_DONE; | |
43 | + } | |
44 | + | |
45 | + /* not a port of a bridge */ | |
46 | + p = br_port_get_rtnl(dev); | |
47 | + if (!p) | |
48 | + return NOTIFY_DONE; | |
49 | + | |
50 | + br = p->br; | |
51 | + | |
52 | + switch (event) { | |
53 | + case NETDEV_CHANGEMTU: | |
54 | + dev_set_mtu(br->dev, br_min_mtu(br)); | |
55 | + break; | |
56 | + | |
57 | + case NETDEV_CHANGEADDR: | |
58 | + spin_lock_bh(&br->lock); | |
59 | + br_fdb_changeaddr(p, dev->dev_addr); | |
60 | + changed_addr = br_stp_recalculate_bridge_id(br); | |
61 | + spin_unlock_bh(&br->lock); | |
62 | + | |
63 | + if (changed_addr) | |
64 | + call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); | |
65 | + | |
66 | + break; | |
67 | + | |
68 | + case NETDEV_CHANGE: | |
69 | + br_port_carrier_check(p); | |
70 | + break; | |
71 | + | |
72 | + case NETDEV_FEAT_CHANGE: | |
73 | + netdev_update_features(br->dev); | |
74 | + break; | |
75 | + | |
76 | + case NETDEV_DOWN: | |
77 | + spin_lock_bh(&br->lock); | |
78 | + if (br->dev->flags & IFF_UP) | |
79 | + br_stp_disable_port(p); | |
80 | + spin_unlock_bh(&br->lock); | |
81 | + break; | |
82 | + | |
83 | + case NETDEV_UP: | |
84 | + if (netif_running(br->dev) && netif_oper_up(dev)) { | |
85 | + spin_lock_bh(&br->lock); | |
86 | + br_stp_enable_port(p); | |
87 | + spin_unlock_bh(&br->lock); | |
88 | + } | |
89 | + break; | |
90 | + | |
91 | + case NETDEV_UNREGISTER: | |
92 | + br_del_if(br, dev); | |
93 | + break; | |
94 | + | |
95 | + case NETDEV_CHANGENAME: | |
96 | + err = br_sysfs_renameif(p); | |
97 | + if (err) | |
98 | + return notifier_from_errno(err); | |
99 | + break; | |
100 | + | |
101 | + case NETDEV_PRE_TYPE_CHANGE: | |
102 | + /* Forbid underlaying device to change its type. */ | |
103 | + return NOTIFY_BAD; | |
104 | + | |
105 | + case NETDEV_RESEND_IGMP: | |
106 | + /* Propagate to master device */ | |
107 | + call_netdevice_notifiers(event, br->dev); | |
108 | + break; | |
109 | + } | |
110 | + | |
111 | + /* Events that may cause spanning tree to refresh */ | |
112 | + if (event == NETDEV_CHANGEADDR || event == NETDEV_UP || | |
113 | + event == NETDEV_CHANGE || event == NETDEV_DOWN) | |
114 | + br_ifinfo_notify(RTM_NEWLINK, p); | |
115 | + | |
116 | + return NOTIFY_DONE; | |
117 | +} | |
118 | + | |
119 | +static struct notifier_block br_device_notifier = { | |
120 | + .notifier_call = br_device_event | |
121 | +}; | |
122 | + | |
25 | 123 | static void __net_exit br_net_exit(struct net *net) |
26 | 124 | { |
27 | 125 | struct net_device *dev; |
net/bridge/br_notify.c
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 | - | |
20 | -static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr); | |
21 | - | |
22 | -struct 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 | - */ | |
32 | -static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr) | |
33 | -{ | |
34 | - struct net_device *dev = netdev_notifier_info_to_dev(ptr); | |
35 | - struct net_bridge_port *p; | |
36 | - struct net_bridge *br; | |
37 | - bool changed_addr; | |
38 | - int err; | |
39 | - | |
40 | - /* register of bridge completed, add sysfs entries */ | |
41 | - if ((dev->priv_flags & IFF_EBRIDGE) && event == NETDEV_REGISTER) { | |
42 | - br_sysfs_addbr(dev); | |
43 | - return NOTIFY_DONE; | |
44 | - } | |
45 | - | |
46 | - /* not a port of a bridge */ | |
47 | - p = br_port_get_rtnl(dev); | |
48 | - if (!p) | |
49 | - return NOTIFY_DONE; | |
50 | - | |
51 | - br = p->br; | |
52 | - | |
53 | - switch (event) { | |
54 | - case NETDEV_CHANGEMTU: | |
55 | - dev_set_mtu(br->dev, br_min_mtu(br)); | |
56 | - break; | |
57 | - | |
58 | - case NETDEV_CHANGEADDR: | |
59 | - spin_lock_bh(&br->lock); | |
60 | - br_fdb_changeaddr(p, dev->dev_addr); | |
61 | - changed_addr = br_stp_recalculate_bridge_id(br); | |
62 | - spin_unlock_bh(&br->lock); | |
63 | - | |
64 | - if (changed_addr) | |
65 | - call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); | |
66 | - | |
67 | - break; | |
68 | - | |
69 | - case NETDEV_CHANGE: | |
70 | - br_port_carrier_check(p); | |
71 | - break; | |
72 | - | |
73 | - case NETDEV_FEAT_CHANGE: | |
74 | - netdev_update_features(br->dev); | |
75 | - break; | |
76 | - | |
77 | - case NETDEV_DOWN: | |
78 | - spin_lock_bh(&br->lock); | |
79 | - if (br->dev->flags & IFF_UP) | |
80 | - br_stp_disable_port(p); | |
81 | - spin_unlock_bh(&br->lock); | |
82 | - break; | |
83 | - | |
84 | - case NETDEV_UP: | |
85 | - if (netif_running(br->dev) && netif_oper_up(dev)) { | |
86 | - spin_lock_bh(&br->lock); | |
87 | - br_stp_enable_port(p); | |
88 | - spin_unlock_bh(&br->lock); | |
89 | - } | |
90 | - break; | |
91 | - | |
92 | - case NETDEV_UNREGISTER: | |
93 | - br_del_if(br, dev); | |
94 | - break; | |
95 | - | |
96 | - case NETDEV_CHANGENAME: | |
97 | - err = br_sysfs_renameif(p); | |
98 | - if (err) | |
99 | - return notifier_from_errno(err); | |
100 | - break; | |
101 | - | |
102 | - case NETDEV_PRE_TYPE_CHANGE: | |
103 | - /* Forbid underlaying device to change its type. */ | |
104 | - return NOTIFY_BAD; | |
105 | - | |
106 | - case NETDEV_RESEND_IGMP: | |
107 | - /* Propagate to master device */ | |
108 | - call_netdevice_notifiers(event, br->dev); | |
109 | - break; | |
110 | - } | |
111 | - | |
112 | - /* Events that may cause spanning tree to refresh */ | |
113 | - if (event == NETDEV_CHANGEADDR || event == NETDEV_UP || | |
114 | - event == NETDEV_CHANGE || event == NETDEV_DOWN) | |
115 | - br_ifinfo_notify(RTM_NEWLINK, p); | |
116 | - | |
117 | - return NOTIFY_DONE; | |
118 | -} |
net/bridge/br_private.h
... | ... | @@ -333,8 +333,6 @@ |
333 | 333 | #define br_debug(br, format, args...) \ |
334 | 334 | pr_debug("%s: " format, (br)->dev->name, ##args) |
335 | 335 | |
336 | -extern struct notifier_block br_device_notifier; | |
337 | - | |
338 | 336 | /* called under bridge lock */ |
339 | 337 | static inline int br_is_root_bridge(const struct net_bridge *br) |
340 | 338 | { |