@@ -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