diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-11-15 01:38:11 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-15 14:13:16 -0500 |
commit | a386f99025f13b32502fe5dedf223c20d7283826 (patch) | |
tree | 63f137ee76576555118ae0ff6a49ee6f0412aa11 /net/bridge | |
parent | e80516880019aa1f7c5c410276edfea9575ec89f (diff) |
bridge: add proper RCU annotation to should_route_hook
Add br_should_route_hook_t typedef, this is the only way we can
get a clean RCU implementation for function pointer.
Move route_hook to location where it is used.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge')
-rw-r--r-- | net/bridge/br.c | 4 | ||||
-rw-r--r-- | net/bridge/br_input.c | 10 | ||||
-rw-r--r-- | net/bridge/netfilter/ebtable_broute.c | 3 |
3 files changed, 9 insertions, 8 deletions
diff --git a/net/bridge/br.c b/net/bridge/br.c index c8436fa31344..84bbb82599b2 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c | |||
@@ -22,8 +22,6 @@ | |||
22 | 22 | ||
23 | #include "br_private.h" | 23 | #include "br_private.h" |
24 | 24 | ||
25 | int (*br_should_route_hook)(struct sk_buff *skb); | ||
26 | |||
27 | static const struct stp_proto br_stp_proto = { | 25 | static const struct stp_proto br_stp_proto = { |
28 | .rcv = br_stp_rcv, | 26 | .rcv = br_stp_rcv, |
29 | }; | 27 | }; |
@@ -102,8 +100,6 @@ static void __exit br_deinit(void) | |||
102 | br_fdb_fini(); | 100 | br_fdb_fini(); |
103 | } | 101 | } |
104 | 102 | ||
105 | EXPORT_SYMBOL(br_should_route_hook); | ||
106 | |||
107 | module_init(br_init) | 103 | module_init(br_init) |
108 | module_exit(br_deinit) | 104 | module_exit(br_deinit) |
109 | MODULE_LICENSE("GPL"); | 105 | MODULE_LICENSE("GPL"); |
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 25207a1f182b..6f6d8e1b776f 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
@@ -21,6 +21,10 @@ | |||
21 | /* Bridge group multicast address 802.1d (pg 51). */ | 21 | /* Bridge group multicast address 802.1d (pg 51). */ |
22 | const u8 br_group_address[ETH_ALEN] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; | 22 | const u8 br_group_address[ETH_ALEN] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 }; |
23 | 23 | ||
24 | /* Hook for brouter */ | ||
25 | br_should_route_hook_t __rcu *br_should_route_hook __read_mostly; | ||
26 | EXPORT_SYMBOL(br_should_route_hook); | ||
27 | |||
24 | static int br_pass_frame_up(struct sk_buff *skb) | 28 | static int br_pass_frame_up(struct sk_buff *skb) |
25 | { | 29 | { |
26 | struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev; | 30 | struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev; |
@@ -139,7 +143,7 @@ struct sk_buff *br_handle_frame(struct sk_buff *skb) | |||
139 | { | 143 | { |
140 | struct net_bridge_port *p; | 144 | struct net_bridge_port *p; |
141 | const unsigned char *dest = eth_hdr(skb)->h_dest; | 145 | const unsigned char *dest = eth_hdr(skb)->h_dest; |
142 | int (*rhook)(struct sk_buff *skb); | 146 | br_should_route_hook_t *rhook; |
143 | 147 | ||
144 | if (unlikely(skb->pkt_type == PACKET_LOOPBACK)) | 148 | if (unlikely(skb->pkt_type == PACKET_LOOPBACK)) |
145 | return skb; | 149 | return skb; |
@@ -173,8 +177,8 @@ forward: | |||
173 | switch (p->state) { | 177 | switch (p->state) { |
174 | case BR_STATE_FORWARDING: | 178 | case BR_STATE_FORWARDING: |
175 | rhook = rcu_dereference(br_should_route_hook); | 179 | rhook = rcu_dereference(br_should_route_hook); |
176 | if (rhook != NULL) { | 180 | if (rhook) { |
177 | if (rhook(skb)) | 181 | if ((*rhook)(skb)) |
178 | return skb; | 182 | return skb; |
179 | dest = eth_hdr(skb)->h_dest; | 183 | dest = eth_hdr(skb)->h_dest; |
180 | } | 184 | } |
diff --git a/net/bridge/netfilter/ebtable_broute.c b/net/bridge/netfilter/ebtable_broute.c index ae3f106c3908..1bcaf36ad612 100644 --- a/net/bridge/netfilter/ebtable_broute.c +++ b/net/bridge/netfilter/ebtable_broute.c | |||
@@ -87,7 +87,8 @@ static int __init ebtable_broute_init(void) | |||
87 | if (ret < 0) | 87 | if (ret < 0) |
88 | return ret; | 88 | return ret; |
89 | /* see br_input.c */ | 89 | /* see br_input.c */ |
90 | rcu_assign_pointer(br_should_route_hook, ebt_broute); | 90 | rcu_assign_pointer(br_should_route_hook, |
91 | (br_should_route_hook_t *)ebt_broute); | ||
91 | return 0; | 92 | return 0; |
92 | } | 93 | } |
93 | 94 | ||