|
@@ -122,6 +122,7 @@ static inline int is_link_local(const unsigned char *dest)
|
|
|
struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
|
|
|
{
|
|
|
const unsigned char *dest = eth_hdr(skb)->h_dest;
|
|
|
+ int (*rhook)(struct sk_buff *skb);
|
|
|
|
|
|
if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
|
|
|
goto drop;
|
|
@@ -147,9 +148,9 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
|
|
|
|
|
|
switch (p->state) {
|
|
|
case BR_STATE_FORWARDING:
|
|
|
-
|
|
|
- if (br_should_route_hook) {
|
|
|
- if (br_should_route_hook(skb))
|
|
|
+ rhook = rcu_dereference(br_should_route_hook);
|
|
|
+ if (rhook != NULL) {
|
|
|
+ if (rhook(skb))
|
|
|
return skb;
|
|
|
dest = eth_hdr(skb)->h_dest;
|
|
|
}
|