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/br_input.c | |
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/br_input.c')
-rw-r--r-- | net/bridge/br_input.c | 10 |
1 files changed, 7 insertions, 3 deletions
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 | } |