@@ -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
@@ -137,7 +140,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
137140 if (p -> flags & BR_LEARNING )
138141 br_fdb_update (br , p , eth_hdr (skb )-> h_source , vid , 0 );
139142
140- local_rcv = !!(br -> dev -> flags & IFF_PROMISC );
143+ promisc = !!(br -> dev -> flags & IFF_PROMISC );
144+ local_rcv = promisc ;
145+
141146 if (is_multicast_ether_addr (eth_hdr (skb )-> h_dest )) {
142147 /* by definition the broadcast is also a multicast address */
143148 if (is_broadcast_ether_addr (eth_hdr (skb )-> h_dest )) {
@@ -200,7 +205,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
200205 unsigned long now = jiffies ;
201206
202207 if (test_bit (BR_FDB_LOCAL , & dst -> flags ))
203- return br_pass_frame_up (skb );
208+ return br_pass_frame_up (skb , false );
204209
205210 if (now != dst -> used )
206211 dst -> used = now ;
@@ -213,7 +218,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
213218 }
214219
215220 if (local_rcv )
216- return br_pass_frame_up (skb );
221+ return br_pass_frame_up (skb , promisc );
217222
218223out :
219224 return 0 ;
@@ -386,6 +391,8 @@ static rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
386391 goto forward ;
387392 }
388393
394+ BR_INPUT_SKB_CB (skb )-> promisc = false;
395+
389396 /* The else clause should be hit when nf_hook():
390397 * - returns < 0 (drop/error)
391398 * - returns = 0 (stolen/nf_queue)
0 commit comments