diff options
author | Cong Wang <xiyou.wangcong@gmail.com> | 2014-05-20 20:30:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-22 15:33:47 -0400 |
commit | b1282726d53465c7362eb134eb335173e8cd5b8c (patch) | |
tree | b8add1f37fa1d12ce7d3e6cc230b54560c23c978 | |
parent | 5c4a43b024cce66bd65c45c338f1ec9fcbdf3a81 (diff) |
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>
-rw-r--r-- | net/bridge/Makefile | 2 | ||||
-rw-r--r-- | net/bridge/br.c | 98 | ||||
-rw-r--r-- | net/bridge/br_notify.c | 118 | ||||
-rw-r--r-- | net/bridge/br_private.h | 2 |
4 files changed, 99 insertions, 121 deletions
diff --git a/net/bridge/Makefile b/net/bridge/Makefile index 906a18b4e74a..29b6e2a8ca9e 100644 --- a/net/bridge/Makefile +++ b/net/bridge/Makefile | |||
@@ -5,7 +5,7 @@ | |||
5 | obj-$(CONFIG_BRIDGE) += bridge.o | 5 | obj-$(CONFIG_BRIDGE) += bridge.o |
6 | 6 | ||
7 | bridge-y := br.o br_device.o br_fdb.o br_forward.o br_if.o br_input.o \ | 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 | br_stp_if.o br_stp_timer.o br_netlink.o | 9 | br_stp_if.o br_stp_timer.o br_netlink.o |
10 | 10 | ||
11 | bridge-$(CONFIG_SYSFS) += br_sysfs_if.o br_sysfs_br.o | 11 | bridge-$(CONFIG_SYSFS) += br_sysfs_if.o br_sysfs_br.o |
diff --git a/net/bridge/br.c b/net/bridge/br.c index 19311aafcf5a..1a755a1e5410 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c | |||
@@ -22,6 +22,104 @@ | |||
22 | 22 | ||
23 | #include "br_private.h" | 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 | static void __net_exit br_net_exit(struct net *net) | 123 | static void __net_exit br_net_exit(struct net *net) |
26 | { | 124 | { |
27 | struct net_device *dev; | 125 | struct net_device *dev; |
diff --git a/net/bridge/br_notify.c b/net/bridge/br_notify.c deleted file mode 100644 index 2998dd1769a0..000000000000 --- a/net/bridge/br_notify.c +++ /dev/null | |||
@@ -1,118 +0,0 @@ | |||
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 | } | ||
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index af067711574f..53d6e32965fc 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
@@ -333,8 +333,6 @@ struct br_input_skb_cb { | |||
333 | #define br_debug(br, format, args...) \ | 333 | #define br_debug(br, format, args...) \ |
334 | pr_debug("%s: " format, (br)->dev->name, ##args) | 334 | pr_debug("%s: " format, (br)->dev->name, ##args) |
335 | 335 | ||
336 | extern struct notifier_block br_device_notifier; | ||
337 | |||
338 | /* called under bridge lock */ | 336 | /* called under bridge lock */ |
339 | static inline int br_is_root_bridge(const struct net_bridge *br) | 337 | static inline int br_is_root_bridge(const struct net_bridge *br) |
340 | { | 338 | { |