@@ -30,7 +30,7 @@ br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb)
3030	return netif_receive_skb(skb);
3131}
3232
33- static int br_pass_frame_up(struct sk_buff *skb)
33+ static int br_pass_frame_up(struct sk_buff *skb, bool promisc )
3434{
3535	struct net_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev;
3636	struct net_bridge *br = netdev_priv(brdev);
@@ -65,6 +65,8 @@ static int br_pass_frame_up(struct sk_buff *skb)
6565	br_multicast_count(br, NULL, skb, br_multicast_igmp_type(skb),
6666			   BR_MCAST_DIR_TX);
6767
68+ 	BR_INPUT_SKB_CB(skb)->promisc = promisc;
69+ 
6870	return NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN,
6971		       dev_net(indev), NULL, skb, indev, NULL,
7072		       br_netif_receive_skb);
@@ -82,6 +84,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
8284	struct net_bridge_mcast *brmctx;
8385	struct net_bridge_vlan *vlan;
8486	struct net_bridge *br;
87+ 	bool promisc;
8588	u16 vid = 0;
8689	u8 state;
8790
@@ -102,7 +105,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
102105	if (p->flags & BR_LEARNING)
103106		br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, 0);
104107
105- 	local_rcv = !!(br->dev->flags & IFF_PROMISC);
108+ 	promisc = !!(br->dev->flags & IFF_PROMISC);
109+ 	local_rcv = promisc;
110+ 
106111	if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) {
107112		/* by definition the broadcast is also a multicast address */
108113		if (is_broadcast_ether_addr(eth_hdr(skb)->h_dest)) {
@@ -165,7 +170,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
165170		unsigned long now = jiffies;
166171
167172		if (test_bit(BR_FDB_LOCAL, &dst->flags))
168- 			return br_pass_frame_up(skb);
173+ 			return br_pass_frame_up(skb, false );
169174
170175		if (now != dst->used)
171176			dst->used = now;
@@ -178,7 +183,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
178183	}
179184
180185	if (local_rcv)
181- 		return br_pass_frame_up(skb);
186+ 		return br_pass_frame_up(skb, promisc );
182187
183188out:
184189	return 0;
@@ -350,6 +355,8 @@ static rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
350355				goto forward;
351356		}
352357
358+ 		BR_INPUT_SKB_CB(skb)->promisc = false;
359+ 
353360		/* The else clause should be hit when nf_hook():
354361		 *   - returns < 0 (drop/error)
355362		 *   - returns = 0 (stolen/nf_queue)
0 commit comments