hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/net/wireguard/device.c
....@@ -19,6 +19,7 @@
1919 #include <linux/if_arp.h>
2020 #include <linux/icmp.h>
2121 #include <linux/suspend.h>
22
+#include <net/dst_metadata.h>
2223 #include <net/icmp.h>
2324 #include <net/rtnetlink.h>
2425 #include <net/ip_tunnels.h>
....@@ -98,6 +99,7 @@
9899 {
99100 struct wg_device *wg = netdev_priv(dev);
100101 struct wg_peer *peer;
102
+ struct sk_buff *skb;
101103
102104 mutex_lock(&wg->device_update_lock);
103105 list_for_each_entry(peer, &wg->peer_list, peer_list) {
....@@ -108,7 +110,9 @@
108110 wg_noise_reset_last_sent_handshake(&peer->last_sent_handshake);
109111 }
110112 mutex_unlock(&wg->device_update_lock);
111
- skb_queue_purge(&wg->incoming_handshakes);
113
+ while ((skb = ptr_ring_consume(&wg->handshake_queue.ring)) != NULL)
114
+ kfree_skb(skb);
115
+ atomic_set(&wg->handshake_queue_len, 0);
112116 wg_socket_reinit(wg, NULL, NULL);
113117 return 0;
114118 }
....@@ -138,7 +142,7 @@
138142 else if (skb->protocol == htons(ETH_P_IPV6))
139143 net_dbg_ratelimited("%s: No peer has allowed IPs matching %pI6\n",
140144 dev->name, &ipv6_hdr(skb)->daddr);
141
- goto err;
145
+ goto err_icmp;
142146 }
143147
144148 family = READ_ONCE(peer->endpoint.addr.sa_family);
....@@ -149,7 +153,7 @@
149153 goto err_peer;
150154 }
151155
152
- mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
156
+ mtu = skb_valid_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
153157
154158 __skb_queue_head_init(&packets);
155159 if (!skb_is_gso(skb)) {
....@@ -201,12 +205,13 @@
201205
202206 err_peer:
203207 wg_peer_put(peer);
204
-err:
205
- ++dev->stats.tx_errors;
208
+err_icmp:
206209 if (skb->protocol == htons(ETH_P_IP))
207210 icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0);
208211 else if (skb->protocol == htons(ETH_P_IPV6))
209212 icmpv6_ndo_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
213
+err:
214
+ ++dev->stats.tx_errors;
210215 kfree_skb(skb);
211216 return ret;
212217 }
....@@ -234,14 +239,13 @@
234239 destroy_workqueue(wg->handshake_receive_wq);
235240 destroy_workqueue(wg->handshake_send_wq);
236241 destroy_workqueue(wg->packet_crypt_wq);
237
- wg_packet_queue_free(&wg->decrypt_queue, true);
238
- wg_packet_queue_free(&wg->encrypt_queue, true);
242
+ wg_packet_queue_free(&wg->handshake_queue, true);
243
+ wg_packet_queue_free(&wg->decrypt_queue, false);
244
+ wg_packet_queue_free(&wg->encrypt_queue, false);
239245 rcu_barrier(); /* Wait for all the peers to be actually freed. */
240246 wg_ratelimiter_uninit();
241247 memzero_explicit(&wg->static_identity, sizeof(wg->static_identity));
242
- skb_queue_purge(&wg->incoming_handshakes);
243248 free_percpu(dev->tstats);
244
- free_percpu(wg->incoming_handshakes_worker);
245249 kvfree(wg->index_hashtable);
246250 kvfree(wg->peer_hashtable);
247251 mutex_unlock(&wg->device_update_lock);
....@@ -262,6 +266,7 @@
262266 max(sizeof(struct ipv6hdr), sizeof(struct iphdr));
263267
264268 dev->netdev_ops = &netdev_ops;
269
+ dev->header_ops = &ip_tunnel_header_ops;
265270 dev->hard_header_len = 0;
266271 dev->addr_len = 0;
267272 dev->needed_headroom = DATA_PACKET_HEAD_ROOM;
....@@ -296,7 +301,6 @@
296301 init_rwsem(&wg->static_identity.lock);
297302 mutex_init(&wg->socket_update_lock);
298303 mutex_init(&wg->device_update_lock);
299
- skb_queue_head_init(&wg->incoming_handshakes);
300304 wg_allowedips_init(&wg->peer_allowedips);
301305 wg_cookie_checker_init(&wg->cookie_checker, wg);
302306 INIT_LIST_HEAD(&wg->peer_list);
....@@ -314,16 +318,10 @@
314318 if (!dev->tstats)
315319 goto err_free_index_hashtable;
316320
317
- wg->incoming_handshakes_worker =
318
- wg_packet_percpu_multicore_worker_alloc(
319
- wg_packet_handshake_receive_worker, wg);
320
- if (!wg->incoming_handshakes_worker)
321
- goto err_free_tstats;
322
-
323321 wg->handshake_receive_wq = alloc_workqueue("wg-kex-%s",
324322 WQ_CPU_INTENSIVE | WQ_FREEZABLE, 0, dev->name);
325323 if (!wg->handshake_receive_wq)
326
- goto err_free_incoming_handshakes;
324
+ goto err_free_tstats;
327325
328326 wg->handshake_send_wq = alloc_workqueue("wg-kex-%s",
329327 WQ_UNBOUND | WQ_FREEZABLE, 0, dev->name);
....@@ -336,18 +334,23 @@
336334 goto err_destroy_handshake_send;
337335
338336 ret = wg_packet_queue_init(&wg->encrypt_queue, wg_packet_encrypt_worker,
339
- true, MAX_QUEUED_PACKETS);
337
+ MAX_QUEUED_PACKETS);
340338 if (ret < 0)
341339 goto err_destroy_packet_crypt;
342340
343341 ret = wg_packet_queue_init(&wg->decrypt_queue, wg_packet_decrypt_worker,
344
- true, MAX_QUEUED_PACKETS);
342
+ MAX_QUEUED_PACKETS);
345343 if (ret < 0)
346344 goto err_free_encrypt_queue;
347345
348
- ret = wg_ratelimiter_init();
346
+ ret = wg_packet_queue_init(&wg->handshake_queue, wg_packet_handshake_receive_worker,
347
+ MAX_QUEUED_INCOMING_HANDSHAKES);
349348 if (ret < 0)
350349 goto err_free_decrypt_queue;
350
+
351
+ ret = wg_ratelimiter_init();
352
+ if (ret < 0)
353
+ goto err_free_handshake_queue;
351354
352355 ret = register_netdevice(dev);
353356 if (ret < 0)
....@@ -365,18 +368,18 @@
365368
366369 err_uninit_ratelimiter:
367370 wg_ratelimiter_uninit();
371
+err_free_handshake_queue:
372
+ wg_packet_queue_free(&wg->handshake_queue, false);
368373 err_free_decrypt_queue:
369
- wg_packet_queue_free(&wg->decrypt_queue, true);
374
+ wg_packet_queue_free(&wg->decrypt_queue, false);
370375 err_free_encrypt_queue:
371
- wg_packet_queue_free(&wg->encrypt_queue, true);
376
+ wg_packet_queue_free(&wg->encrypt_queue, false);
372377 err_destroy_packet_crypt:
373378 destroy_workqueue(wg->packet_crypt_wq);
374379 err_destroy_handshake_send:
375380 destroy_workqueue(wg->handshake_send_wq);
376381 err_destroy_handshake_receive:
377382 destroy_workqueue(wg->handshake_receive_wq);
378
-err_free_incoming_handshakes:
379
- free_percpu(wg->incoming_handshakes_worker);
380383 err_free_tstats:
381384 free_percpu(dev->tstats);
382385 err_free_index_hashtable:
....@@ -393,9 +396,10 @@
393396 .newlink = wg_newlink,
394397 };
395398
396
-static void wg_netns_exit(struct net *net)
399
+static void wg_netns_pre_exit(struct net *net)
397400 {
398401 struct wg_device *wg;
402
+ struct wg_peer *peer;
399403
400404 rtnl_lock();
401405 list_for_each_entry(wg, &device_list, device_list) {
....@@ -405,6 +409,8 @@
405409 mutex_lock(&wg->device_update_lock);
406410 rcu_assign_pointer(wg->creating_net, NULL);
407411 wg_socket_reinit(wg, NULL, NULL);
412
+ list_for_each_entry(peer, &wg->peer_list, peer_list)
413
+ wg_socket_clear_peer_endpoint_src(peer);
408414 mutex_unlock(&wg->device_update_lock);
409415 }
410416 }
....@@ -412,7 +418,7 @@
412418 }
413419
414420 static struct pernet_operations pernet_ops = {
415
- .exit = wg_netns_exit
421
+ .pre_exit = wg_netns_pre_exit
416422 };
417423
418424 int __init wg_device_init(void)