164
164
165
165
static DEFINE_SPINLOCK (ptype_lock );
166
166
struct list_head ptype_base [PTYPE_HASH_SIZE ] __read_mostly ;
167
- struct list_head ptype_all __read_mostly ; /* Taps */
168
167
169
168
static int netif_rx_internal (struct sk_buff * skb );
170
169
static int call_netdevice_notifiers_extack (unsigned long val ,
@@ -569,10 +568,18 @@ static inline void netdev_set_addr_lockdep_class(struct net_device *dev)
569
568
570
569
static inline struct list_head * ptype_head (const struct packet_type * pt )
571
570
{
572
- if (pt -> type == htons (ETH_P_ALL ))
573
- return pt -> dev ? & pt -> dev -> ptype_all : & ptype_all ;
574
- else
575
- return pt -> dev ? & pt -> dev -> ptype_specific :
571
+ if (pt -> type == htons (ETH_P_ALL )) {
572
+ if (!pt -> af_packet_net && !pt -> dev )
573
+ return NULL ;
574
+
575
+ return pt -> dev ? & pt -> dev -> ptype_all :
576
+ & pt -> af_packet_net -> ptype_all ;
577
+ }
578
+
579
+ if (pt -> dev )
580
+ return & pt -> dev -> ptype_specific ;
581
+
582
+ return pt -> af_packet_net ? & pt -> af_packet_net -> ptype_specific :
576
583
& ptype_base [ntohs (pt -> type ) & PTYPE_HASH_MASK ];
577
584
}
578
585
@@ -593,6 +600,9 @@ void dev_add_pack(struct packet_type *pt)
593
600
{
594
601
struct list_head * head = ptype_head (pt );
595
602
603
+ if (WARN_ON_ONCE (!head ))
604
+ return ;
605
+
596
606
spin_lock (& ptype_lock );
597
607
list_add_rcu (& pt -> list , head );
598
608
spin_unlock (& ptype_lock );
@@ -617,6 +627,9 @@ void __dev_remove_pack(struct packet_type *pt)
617
627
struct list_head * head = ptype_head (pt );
618
628
struct packet_type * pt1 ;
619
629
630
+ if (!head )
631
+ return ;
632
+
620
633
spin_lock (& ptype_lock );
621
634
622
635
list_for_each_entry (pt1 , head , list ) {
@@ -2360,15 +2373,21 @@ static inline bool skb_loop_sk(struct packet_type *ptype, struct sk_buff *skb)
2360
2373
}
2361
2374
2362
2375
/**
2363
- * dev_nit_active - return true if any network interface taps are in use
2376
+ * dev_nit_active_rcu - return true if any network interface taps are in use
2377
+ *
2378
+ * The caller must hold the RCU lock
2364
2379
*
2365
2380
* @dev: network device to check for the presence of taps
2366
2381
*/
2367
- bool dev_nit_active ( struct net_device * dev )
2382
+ bool dev_nit_active_rcu ( const struct net_device * dev )
2368
2383
{
2369
- return !list_empty (& ptype_all ) || !list_empty (& dev -> ptype_all );
2384
+ /* Callers may hold either RCU or RCU BH lock */
2385
+ WARN_ON_ONCE (!rcu_read_lock_held () && !rcu_read_lock_bh_held ());
2386
+
2387
+ return !list_empty (& dev_net (dev )-> ptype_all ) ||
2388
+ !list_empty (& dev -> ptype_all );
2370
2389
}
2371
- EXPORT_SYMBOL_GPL (dev_nit_active );
2390
+ EXPORT_SYMBOL_GPL (dev_nit_active_rcu );
2372
2391
2373
2392
/*
2374
2393
* Support routine. Sends outgoing frames to any network
@@ -2380,9 +2399,10 @@ void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
2380
2399
struct packet_type * ptype ;
2381
2400
struct sk_buff * skb2 = NULL ;
2382
2401
struct packet_type * pt_prev = NULL ;
2383
- struct list_head * ptype_list = & ptype_all ;
2402
+ struct list_head * ptype_list ;
2384
2403
2385
2404
rcu_read_lock ();
2405
+ ptype_list = & dev_net_rcu (dev )-> ptype_all ;
2386
2406
again :
2387
2407
list_for_each_entry_rcu (ptype , ptype_list , list ) {
2388
2408
if (READ_ONCE (ptype -> ignore_outgoing ))
@@ -2426,7 +2446,7 @@ void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev)
2426
2446
pt_prev = ptype ;
2427
2447
}
2428
2448
2429
- if (ptype_list == & ptype_all ) {
2449
+ if (ptype_list != & dev -> ptype_all ) {
2430
2450
ptype_list = & dev -> ptype_all ;
2431
2451
goto again ;
2432
2452
}
@@ -3640,7 +3660,7 @@ static int xmit_one(struct sk_buff *skb, struct net_device *dev,
3640
3660
unsigned int len ;
3641
3661
int rc ;
3642
3662
3643
- if (dev_nit_active (dev ))
3663
+ if (dev_nit_active_rcu (dev ))
3644
3664
dev_queue_xmit_nit (skb , dev );
3645
3665
3646
3666
len = skb -> len ;
@@ -5504,7 +5524,8 @@ static int __netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,
5504
5524
if (pfmemalloc )
5505
5525
goto skip_taps ;
5506
5526
5507
- list_for_each_entry_rcu (ptype , & ptype_all , list ) {
5527
+ list_for_each_entry_rcu (ptype , & dev_net_rcu (skb -> dev )-> ptype_all ,
5528
+ list ) {
5508
5529
if (pt_prev )
5509
5530
ret = deliver_skb (skb , pt_prev , orig_dev );
5510
5531
pt_prev = ptype ;
@@ -5616,6 +5637,14 @@ static int __netif_receive_skb_core(struct sk_buff **pskb, bool pfmemalloc,
5616
5637
deliver_ptype_list_skb (skb , & pt_prev , orig_dev , type ,
5617
5638
& ptype_base [ntohs (type ) &
5618
5639
PTYPE_HASH_MASK ]);
5640
+
5641
+ /* orig_dev and skb->dev could belong to different netns;
5642
+ * Even in such case we need to traverse only the list
5643
+ * coming from skb->dev, as the ptype owner (packet socket)
5644
+ * will use dev_net(skb->dev) to do namespace filtering.
5645
+ */
5646
+ deliver_ptype_list_skb (skb , & pt_prev , orig_dev , type ,
5647
+ & dev_net_rcu (skb -> dev )-> ptype_specific );
5619
5648
}
5620
5649
5621
5650
deliver_ptype_list_skb (skb , & pt_prev , orig_dev , type ,
@@ -12042,7 +12071,6 @@ static int __init net_dev_init(void)
12042
12071
if (netdev_kobject_init ())
12043
12072
goto out ;
12044
12073
12045
- INIT_LIST_HEAD (& ptype_all );
12046
12074
for (i = 0 ; i < PTYPE_HASH_SIZE ; i ++ )
12047
12075
INIT_LIST_HEAD (& ptype_base [i ]);
12048
12076
0 commit comments