@@ -106,6 +106,7 @@ static int wg_stop(struct net_device *dev)
106
106
{
107
107
struct wg_device * wg = netdev_priv (dev );
108
108
struct wg_peer * peer ;
109
+ struct sk_buff * skb ;
109
110
110
111
mutex_lock (& wg -> device_update_lock );
111
112
list_for_each_entry (peer , & wg -> peer_list , peer_list ) {
@@ -116,7 +117,9 @@ static int wg_stop(struct net_device *dev)
116
117
wg_noise_reset_last_sent_handshake (& peer -> last_sent_handshake );
117
118
}
118
119
mutex_unlock (& wg -> device_update_lock );
119
- skb_queue_purge (& wg -> incoming_handshakes );
120
+ while ((skb = ptr_ring_consume (& wg -> handshake_queue .ring )) != NULL )
121
+ kfree_skb (skb );
122
+ atomic_set (& wg -> handshake_queue_len , 0 );
120
123
wg_socket_reinit (wg , NULL , NULL );
121
124
return 0 ;
122
125
}
@@ -243,14 +246,13 @@ static void wg_destruct(struct net_device *dev)
243
246
destroy_workqueue (wg -> handshake_receive_wq );
244
247
destroy_workqueue (wg -> handshake_send_wq );
245
248
destroy_workqueue (wg -> packet_crypt_wq );
246
- wg_packet_queue_free (& wg -> decrypt_queue );
247
- wg_packet_queue_free (& wg -> encrypt_queue );
249
+ wg_packet_queue_free (& wg -> handshake_queue , true);
250
+ wg_packet_queue_free (& wg -> decrypt_queue , false);
251
+ wg_packet_queue_free (& wg -> encrypt_queue , false);
248
252
rcu_barrier (); /* Wait for all the peers to be actually freed. */
249
253
wg_ratelimiter_uninit ();
250
254
memzero_explicit (& wg -> static_identity , sizeof (wg -> static_identity ));
251
- skb_queue_purge (& wg -> incoming_handshakes );
252
255
free_percpu (dev -> tstats );
253
- free_percpu (wg -> incoming_handshakes_worker );
254
256
kvfree (wg -> index_hashtable );
255
257
kvfree (wg -> peer_hashtable );
256
258
mutex_unlock (& wg -> device_update_lock );
@@ -312,7 +314,6 @@ static int wg_newlink(struct net *src_net, struct net_device *dev,
312
314
init_rwsem (& wg -> static_identity .lock );
313
315
mutex_init (& wg -> socket_update_lock );
314
316
mutex_init (& wg -> device_update_lock );
315
- skb_queue_head_init (& wg -> incoming_handshakes );
316
317
wg_allowedips_init (& wg -> peer_allowedips );
317
318
wg_cookie_checker_init (& wg -> cookie_checker , wg );
318
319
INIT_LIST_HEAD (& wg -> peer_list );
@@ -330,16 +331,10 @@ static int wg_newlink(struct net *src_net, struct net_device *dev,
330
331
if (!dev -> tstats )
331
332
goto err_free_index_hashtable ;
332
333
333
- wg -> incoming_handshakes_worker =
334
- wg_packet_percpu_multicore_worker_alloc (
335
- wg_packet_handshake_receive_worker , wg );
336
- if (!wg -> incoming_handshakes_worker )
337
- goto err_free_tstats ;
338
-
339
334
wg -> handshake_receive_wq = alloc_workqueue ("wg-kex-%s" ,
340
335
WQ_CPU_INTENSIVE | WQ_FREEZABLE , 0 , dev -> name );
341
336
if (!wg -> handshake_receive_wq )
342
- goto err_free_incoming_handshakes ;
337
+ goto err_free_tstats ;
343
338
344
339
wg -> handshake_send_wq = alloc_workqueue ("wg-kex-%s" ,
345
340
WQ_UNBOUND | WQ_FREEZABLE , 0 , dev -> name );
@@ -361,10 +356,15 @@ static int wg_newlink(struct net *src_net, struct net_device *dev,
361
356
if (ret < 0 )
362
357
goto err_free_encrypt_queue ;
363
358
364
- ret = wg_ratelimiter_init ();
359
+ ret = wg_packet_queue_init (& wg -> handshake_queue , wg_packet_handshake_receive_worker ,
360
+ MAX_QUEUED_INCOMING_HANDSHAKES );
365
361
if (ret < 0 )
366
362
goto err_free_decrypt_queue ;
367
363
364
+ ret = wg_ratelimiter_init ();
365
+ if (ret < 0 )
366
+ goto err_free_handshake_queue ;
367
+
368
368
ret = register_netdevice (dev );
369
369
if (ret < 0 )
370
370
goto err_uninit_ratelimiter ;
@@ -381,18 +381,18 @@ static int wg_newlink(struct net *src_net, struct net_device *dev,
381
381
382
382
err_uninit_ratelimiter :
383
383
wg_ratelimiter_uninit ();
384
+ err_free_handshake_queue :
385
+ wg_packet_queue_free (& wg -> handshake_queue , false);
384
386
err_free_decrypt_queue :
385
- wg_packet_queue_free (& wg -> decrypt_queue );
387
+ wg_packet_queue_free (& wg -> decrypt_queue , false );
386
388
err_free_encrypt_queue :
387
- wg_packet_queue_free (& wg -> encrypt_queue );
389
+ wg_packet_queue_free (& wg -> encrypt_queue , false );
388
390
err_destroy_packet_crypt :
389
391
destroy_workqueue (wg -> packet_crypt_wq );
390
392
err_destroy_handshake_send :
391
393
destroy_workqueue (wg -> handshake_send_wq );
392
394
err_destroy_handshake_receive :
393
395
destroy_workqueue (wg -> handshake_receive_wq );
394
- err_free_incoming_handshakes :
395
- free_percpu (wg -> incoming_handshakes_worker );
396
396
err_free_tstats :
397
397
free_percpu (dev -> tstats );
398
398
err_free_index_hashtable :
0 commit comments