diff options
Diffstat (limited to 'net/bridge/br_input.c')
-rw-r--r-- | net/bridge/br_input.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 160797722228..43d2cd862bc2 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c | |||
@@ -213,8 +213,7 @@ drop: | |||
213 | } | 213 | } |
214 | EXPORT_SYMBOL_GPL(br_handle_frame_finish); | 214 | EXPORT_SYMBOL_GPL(br_handle_frame_finish); |
215 | 215 | ||
216 | /* note: already called with rcu_read_lock */ | 216 | static void __br_handle_local_finish(struct sk_buff *skb) |
217 | static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb) | ||
218 | { | 217 | { |
219 | struct net_bridge_port *p = br_port_get_rcu(skb->dev); | 218 | struct net_bridge_port *p = br_port_get_rcu(skb->dev); |
220 | u16 vid = 0; | 219 | u16 vid = 0; |
@@ -222,6 +221,14 @@ static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_bu | |||
222 | /* check if vlan is allowed, to avoid spoofing */ | 221 | /* check if vlan is allowed, to avoid spoofing */ |
223 | if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid)) | 222 | if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid)) |
224 | br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false); | 223 | br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false); |
224 | } | ||
225 | |||
226 | /* note: already called with rcu_read_lock */ | ||
227 | static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb) | ||
228 | { | ||
229 | struct net_bridge_port *p = br_port_get_rcu(skb->dev); | ||
230 | |||
231 | __br_handle_local_finish(skb); | ||
225 | 232 | ||
226 | BR_INPUT_SKB_CB(skb)->brdev = p->br->dev; | 233 | BR_INPUT_SKB_CB(skb)->brdev = p->br->dev; |
227 | br_pass_frame_up(skb); | 234 | br_pass_frame_up(skb); |
@@ -274,7 +281,9 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb) | |||
274 | if (p->br->stp_enabled == BR_NO_STP || | 281 | if (p->br->stp_enabled == BR_NO_STP || |
275 | fwd_mask & (1u << dest[5])) | 282 | fwd_mask & (1u << dest[5])) |
276 | goto forward; | 283 | goto forward; |
277 | break; | 284 | *pskb = skb; |
285 | __br_handle_local_finish(skb); | ||
286 | return RX_HANDLER_PASS; | ||
278 | 287 | ||
279 | case 0x01: /* IEEE MAC (Pause) */ | 288 | case 0x01: /* IEEE MAC (Pause) */ |
280 | goto drop; | 289 | goto drop; |