|
@@ -213,8 +213,7 @@ drop:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(br_handle_frame_finish);
|
|
|
|
|
|
-/* note: already called with rcu_read_lock */
|
|
|
-static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
|
+static void __br_handle_local_finish(struct sk_buff *skb)
|
|
|
{
|
|
|
struct net_bridge_port *p = br_port_get_rcu(skb->dev);
|
|
|
u16 vid = 0;
|
|
@@ -222,6 +221,14 @@ static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_bu
|
|
|
/* check if vlan is allowed, to avoid spoofing */
|
|
|
if (p->flags & BR_LEARNING && br_should_learn(p, skb, &vid))
|
|
|
br_fdb_update(p->br, p, eth_hdr(skb)->h_source, vid, false);
|
|
|
+}
|
|
|
+
|
|
|
+/* note: already called with rcu_read_lock */
|
|
|
+static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
|
|
|
+{
|
|
|
+ struct net_bridge_port *p = br_port_get_rcu(skb->dev);
|
|
|
+
|
|
|
+ __br_handle_local_finish(skb);
|
|
|
|
|
|
BR_INPUT_SKB_CB(skb)->brdev = p->br->dev;
|
|
|
br_pass_frame_up(skb);
|
|
@@ -274,7 +281,9 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
|
|
|
if (p->br->stp_enabled == BR_NO_STP ||
|
|
|
fwd_mask & (1u << dest[5]))
|
|
|
goto forward;
|
|
|
- break;
|
|
|
+ *pskb = skb;
|
|
|
+ __br_handle_local_finish(skb);
|
|
|
+ return RX_HANDLER_PASS;
|
|
|
|
|
|
case 0x01: /* IEEE MAC (Pause) */
|
|
|
goto drop;
|