@@ -30,7 +30,7 @@ br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb)
30
30
return netif_receive_skb (skb );
31
31
}
32
32
33
- static int br_pass_frame_up (struct sk_buff * skb )
33
+ static int br_pass_frame_up (struct sk_buff * skb , bool promisc )
34
34
{
35
35
struct net_device * indev , * brdev = BR_INPUT_SKB_CB (skb )-> brdev ;
36
36
struct net_bridge * br = netdev_priv (brdev );
@@ -65,6 +65,8 @@ static int br_pass_frame_up(struct sk_buff *skb)
65
65
br_multicast_count (br , NULL , skb , br_multicast_igmp_type (skb ),
66
66
BR_MCAST_DIR_TX );
67
67
68
+ BR_INPUT_SKB_CB (skb )-> promisc = promisc ;
69
+
68
70
return NF_HOOK (NFPROTO_BRIDGE , NF_BR_LOCAL_IN ,
69
71
dev_net (indev ), NULL , skb , indev , NULL ,
70
72
br_netif_receive_skb );
@@ -82,6 +84,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
82
84
struct net_bridge_mcast * brmctx ;
83
85
struct net_bridge_vlan * vlan ;
84
86
struct net_bridge * br ;
87
+ bool promisc ;
85
88
u16 vid = 0 ;
86
89
u8 state ;
87
90
@@ -120,7 +123,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
120
123
if (p -> flags & BR_LEARNING )
121
124
br_fdb_update (br , p , eth_hdr (skb )-> h_source , vid , 0 );
122
125
123
- local_rcv = !!(br -> dev -> flags & IFF_PROMISC );
126
+ promisc = !!(br -> dev -> flags & IFF_PROMISC );
127
+ local_rcv = promisc ;
128
+
124
129
if (is_multicast_ether_addr (eth_hdr (skb )-> h_dest )) {
125
130
/* by definition the broadcast is also a multicast address */
126
131
if (is_broadcast_ether_addr (eth_hdr (skb )-> h_dest )) {
@@ -183,7 +188,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
183
188
unsigned long now = jiffies ;
184
189
185
190
if (test_bit (BR_FDB_LOCAL , & dst -> flags ))
186
- return br_pass_frame_up (skb );
191
+ return br_pass_frame_up (skb , false );
187
192
188
193
if (now != dst -> used )
189
194
dst -> used = now ;
@@ -196,7 +201,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
196
201
}
197
202
198
203
if (local_rcv )
199
- return br_pass_frame_up (skb );
204
+ return br_pass_frame_up (skb , promisc );
200
205
201
206
out :
202
207
return 0 ;
@@ -368,6 +373,8 @@ static rx_handler_result_t br_handle_frame(struct sk_buff **pskb)
368
373
goto forward ;
369
374
}
370
375
376
+ BR_INPUT_SKB_CB (skb )-> promisc = false;
377
+
371
378
/* The else clause should be hit when nf_hook():
372
379
* - returns < 0 (drop/error)
373
380
* - returns = 0 (stolen/nf_queue)
0 commit comments