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