1 // SPDX-License-Identifier: GPL-2.0
2 /* OpenVPN data channel offload
3 *
4 * Copyright (C) 2019-2025 OpenVPN, Inc.
5 *
6 * Author: Antonio Quartulli <antonio@openvpn.net>
7 */
8
9 #include <linux/netdevice.h>
10 #include <linux/inetdevice.h>
11 #include <linux/skbuff.h>
12 #include <linux/socket.h>
13 #include <linux/udp.h>
14 #include <net/addrconf.h>
15 #include <net/dst_cache.h>
16 #include <net/route.h>
17 #include <net/transp_v6.h>
18 #include <net/udp.h>
19 #include <net/udp_tunnel.h>
20
21 #include "ovpnpriv.h"
22 #include "main.h"
23 #include "bind.h"
24 #include "io.h"
25 #include "peer.h"
26 #include "proto.h"
27 #include "socket.h"
28 #include "udp.h"
29
30 /* Retrieve the corresponding ovpn object from a UDP socket
31 * rcu_read_lock must be held on entry
32 */
ovpn_socket_from_udp_sock(struct sock * sk)33 static struct ovpn_socket *ovpn_socket_from_udp_sock(struct sock *sk)
34 {
35 struct ovpn_socket *ovpn_sock;
36
37 if (unlikely(READ_ONCE(udp_sk(sk)->encap_type) != UDP_ENCAP_OVPNINUDP))
38 return NULL;
39
40 ovpn_sock = rcu_dereference_sk_user_data(sk);
41 if (unlikely(!ovpn_sock))
42 return NULL;
43
44 /* make sure that sk matches our stored transport socket */
45 if (unlikely(!ovpn_sock->sk || sk != ovpn_sock->sk))
46 return NULL;
47
48 return ovpn_sock;
49 }
50
51 /**
52 * ovpn_udp_encap_recv - Start processing a received UDP packet.
53 * @sk: socket over which the packet was received
54 * @skb: the received packet
55 *
56 * If the first byte of the payload is:
57 * - DATA_V2 the packet is accepted for further processing,
58 * - DATA_V1 the packet is dropped as not supported,
59 * - anything else the packet is forwarded to the UDP stack for
60 * delivery to user space.
61 *
62 * Return:
63 * 0 if skb was consumed or dropped
64 * >0 if skb should be passed up to userspace as UDP (packet not consumed)
65 * <0 if skb should be resubmitted as proto -N (packet not consumed)
66 */
ovpn_udp_encap_recv(struct sock * sk,struct sk_buff * skb)67 static int ovpn_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
68 {
69 struct ovpn_socket *ovpn_sock;
70 struct ovpn_priv *ovpn;
71 struct ovpn_peer *peer;
72 u32 peer_id;
73 u8 opcode;
74
75 ovpn_sock = ovpn_socket_from_udp_sock(sk);
76 if (unlikely(!ovpn_sock)) {
77 net_err_ratelimited("ovpn: %s invoked on non ovpn socket\n",
78 __func__);
79 goto drop_noovpn;
80 }
81
82 ovpn = ovpn_sock->ovpn;
83 if (unlikely(!ovpn)) {
84 net_err_ratelimited("ovpn: cannot obtain ovpn object from UDP socket\n");
85 goto drop_noovpn;
86 }
87
88 /* Make sure the first 4 bytes of the skb data buffer after the UDP
89 * header are accessible.
90 * They are required to fetch the OP code, the key ID and the peer ID.
91 */
92 if (unlikely(!pskb_may_pull(skb, sizeof(struct udphdr) +
93 OVPN_OPCODE_SIZE))) {
94 net_dbg_ratelimited("%s: packet too small from UDP socket\n",
95 netdev_name(ovpn->dev));
96 goto drop;
97 }
98
99 opcode = ovpn_opcode_from_skb(skb, sizeof(struct udphdr));
100 if (unlikely(opcode != OVPN_DATA_V2)) {
101 /* DATA_V1 is not supported */
102 if (opcode == OVPN_DATA_V1)
103 goto drop;
104
105 /* unknown or control packet: let it bubble up to userspace */
106 return 1;
107 }
108
109 peer_id = ovpn_peer_id_from_skb(skb, sizeof(struct udphdr));
110 /* some OpenVPN server implementations send data packets with the
111 * peer-id set to UNDEF. In this case we skip the peer lookup by peer-id
112 * and we try with the transport address
113 */
114 if (peer_id == OVPN_PEER_ID_UNDEF)
115 peer = ovpn_peer_get_by_transp_addr(ovpn, skb);
116 else
117 peer = ovpn_peer_get_by_id(ovpn, peer_id);
118
119 if (unlikely(!peer))
120 goto drop;
121
122 /* pop off outer UDP header */
123 __skb_pull(skb, sizeof(struct udphdr));
124 ovpn_recv(peer, skb);
125 return 0;
126
127 drop:
128 ovpn_dev_dstats_rx_dropped(ovpn->dev);
129 drop_noovpn:
130 kfree_skb(skb);
131 return 0;
132 }
133
ovpn_route_key_equal(const struct ovpn_route_key * a,const struct ovpn_route_key * b)134 static bool ovpn_route_key_equal(const struct ovpn_route_key *a,
135 const struct ovpn_route_key *b)
136 {
137 return a->mark == b->mark && a->sport == b->sport;
138 }
139
140 /**
141 * ovpn_dst_cache_check_key - reset peer dst cache after key changes
142 * @peer: the peer owning the dst cache
143 * @cache: the cache that might need to be reset
144 * @key: the route key for the packet being transmitted
145 *
146 * Reset the peer dst cache if it was populated for a different route key.
147 */
ovpn_dst_cache_check_key(struct ovpn_peer * peer,struct dst_cache * cache,const struct ovpn_route_key * key)148 static void ovpn_dst_cache_check_key(struct ovpn_peer *peer,
149 struct dst_cache *cache,
150 const struct ovpn_route_key *key)
151 {
152 struct ovpn_route_key old_key;
153 unsigned int seq;
154
155 /* snapshot the saved key before deciding whether the cache matches */
156 do {
157 seq = read_seqcount_begin(&peer->route_key_seq);
158 old_key = peer->route_key;
159 } while (read_seqcount_retry(&peer->route_key_seq, seq));
160
161 /* nothing changed: the current cache can be reused */
162 if (likely(ovpn_route_key_equal(&old_key, key)))
163 return;
164
165 /* recheck under lock because another path may have updated the key */
166 spin_lock_bh(&peer->lock);
167 if (!ovpn_route_key_equal(&peer->route_key, key)) {
168 write_seqcount_begin(&peer->route_key_seq);
169 peer->route_key = *key;
170 dst_cache_reset(cache);
171 write_seqcount_end(&peer->route_key_seq);
172 }
173 spin_unlock_bh(&peer->lock);
174 }
175
176 /**
177 * ovpn_dst_cache_current - check whether a route lookup matches peer state
178 * @peer: the peer owning the bind and dst cache
179 * @bind: the RCU bind used for the route lookup
180 * @key: the route key used for the route lookup
181 *
182 * Check that @bind is still the current peer bind and that @key still matches
183 * the peer route key. The caller must hold @peer->lock. The TX path keeps
184 * @bind inside an RCU read-side critical section, so pointer identity is enough
185 * to detect whether the bind was replaced while the route lookup was running.
186 *
187 * Return: true if the lookup result still matches the current peer state and
188 * may update the dst cache or replace the bind.
189 */
ovpn_dst_cache_current(const struct ovpn_peer * peer,const struct ovpn_bind * bind,const struct ovpn_route_key * key)190 static bool ovpn_dst_cache_current(const struct ovpn_peer *peer,
191 const struct ovpn_bind *bind,
192 const struct ovpn_route_key *key)
193 {
194 const struct ovpn_bind *curr_bind;
195
196 lockdep_assert_held(&peer->lock);
197
198 curr_bind = rcu_dereference_protected(peer->bind,
199 lockdep_is_held(&peer->lock));
200
201 return curr_bind == bind &&
202 ovpn_route_key_equal(key, &peer->route_key);
203 }
204
205 /**
206 * ovpn_udp4_output - send IPv4 packet over udp socket
207 * @peer: the destination peer
208 * @bind: the binding related to the destination peer
209 * @cache: dst cache
210 * @sk: the socket to send the packet over
211 * @skb: the packet to send
212 * @key: the route key snapshot used for cache validation and flow lookup
213 *
214 * Return: 0 on success or a negative error code otherwise
215 */
ovpn_udp4_output(struct ovpn_peer * peer,struct ovpn_bind * bind,struct dst_cache * cache,struct sock * sk,struct sk_buff * skb,const struct ovpn_route_key * key)216 static int ovpn_udp4_output(struct ovpn_peer *peer, struct ovpn_bind *bind,
217 struct dst_cache *cache, struct sock *sk,
218 struct sk_buff *skb,
219 const struct ovpn_route_key *key)
220 {
221 struct sockaddr_storage remote;
222 struct in_addr local = {};
223 bool reset_local = false;
224 struct rtable *rt;
225 struct flowi4 fl = {
226 .saddr = bind->local.ipv4.s_addr,
227 .daddr = bind->remote.in4.sin_addr.s_addr,
228 .fl4_sport = key->sport,
229 .fl4_dport = bind->remote.in4.sin_port,
230 .flowi4_proto = sk->sk_protocol,
231 .flowi4_mark = key->mark,
232 };
233 int ret;
234
235 local_bh_disable();
236 rt = dst_cache_get_ip4(cache, &fl.saddr);
237 if (rt)
238 goto transmit;
239
240 if (fl.saddr && unlikely(!inet_confirm_addr(sock_net(sk), NULL, 0,
241 fl.saddr, RT_SCOPE_HOST))) {
242 /* The learned local address is not usable anymore.
243 * Retry with source address autoselection.
244 */
245 fl.saddr = 0;
246 reset_local = true;
247 }
248
249 rt = ip_route_output_flow(sock_net(sk), &fl, sk);
250 if (IS_ERR(rt) && PTR_ERR(rt) == -EINVAL) {
251 fl.saddr = 0;
252 reset_local = true;
253
254 rt = ip_route_output_flow(sock_net(sk), &fl, sk);
255 }
256
257 if (IS_ERR(rt)) {
258 ret = PTR_ERR(rt);
259 net_dbg_ratelimited("%s: no route to host %pISpc: %d\n",
260 netdev_name(peer->ovpn->dev),
261 &bind->remote.in4,
262 ret);
263 goto err;
264 }
265
266 /* avoid storing a stale cache or local address */
267 spin_lock_bh(&peer->lock);
268 if (likely(ovpn_dst_cache_current(peer, bind, key))) {
269 if (!reset_local) {
270 dst_cache_set_ip4(cache, &rt->dst, fl.saddr);
271 spin_unlock_bh(&peer->lock);
272 goto transmit;
273 }
274
275 /* invalidate per-CPU dst entries that may still carry
276 * the stale source
277 */
278 dst_cache_reset(cache);
279
280 /* preserve the current remote */
281 memcpy(&remote, &bind->remote, sizeof(struct sockaddr_in));
282 /* The current packet already has a valid wildcard-source route.
283 * If replacing the bind fails, leave the stale local in place;
284 * a later cache miss will retry the repair.
285 */
286 ovpn_peer_reset_sockaddr(peer, &remote, &local);
287 }
288 spin_unlock_bh(&peer->lock);
289
290 transmit:
291 udp_tunnel_xmit_skb(rt, sk, skb, fl.saddr, fl.daddr, 0,
292 ip4_dst_hoplimit(&rt->dst), 0, fl.fl4_sport,
293 fl.fl4_dport, false, sk->sk_no_check_tx, 0);
294 ret = 0;
295 err:
296 local_bh_enable();
297 return ret;
298 }
299
300 #if IS_ENABLED(CONFIG_IPV6)
301 /**
302 * ovpn_udp6_output - send IPv6 packet over udp socket
303 * @peer: the destination peer
304 * @bind: the binding related to the destination peer
305 * @cache: dst cache
306 * @sk: the socket to send the packet over
307 * @skb: the packet to send
308 * @key: the route key snapshot used for cache validation and flow lookup
309 *
310 * Return: 0 on success or a negative error code otherwise
311 */
ovpn_udp6_output(struct ovpn_peer * peer,struct ovpn_bind * bind,struct dst_cache * cache,struct sock * sk,struct sk_buff * skb,const struct ovpn_route_key * key)312 static int ovpn_udp6_output(struct ovpn_peer *peer, struct ovpn_bind *bind,
313 struct dst_cache *cache, struct sock *sk,
314 struct sk_buff *skb,
315 const struct ovpn_route_key *key)
316 {
317 struct in6_addr local = in6addr_any;
318 struct sockaddr_storage remote;
319 bool reset_local = false;
320 struct dst_entry *dst;
321 int ret;
322
323 struct flowi6 fl = {
324 .saddr = bind->local.ipv6,
325 .daddr = bind->remote.in6.sin6_addr,
326 .fl6_sport = key->sport,
327 .fl6_dport = bind->remote.in6.sin6_port,
328 .flowi6_proto = sk->sk_protocol,
329 .flowi6_mark = key->mark,
330 .flowi6_oif = bind->remote.in6.sin6_scope_id,
331 };
332
333 local_bh_disable();
334 dst = dst_cache_get_ip6(cache, &fl.saddr);
335 if (dst)
336 goto transmit;
337
338 if (!ipv6_addr_any(&fl.saddr) &&
339 unlikely(!ipv6_chk_addr(sock_net(sk), &fl.saddr, NULL, 0))) {
340 /* The learned local address is not usable anymore.
341 * Retry with source address autoselection.
342 */
343 fl.saddr = in6addr_any;
344 reset_local = true;
345 }
346
347 dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl, NULL);
348 if (IS_ERR(dst)) {
349 ret = PTR_ERR(dst);
350 net_dbg_ratelimited("%s: no route to host %pISpc: %d\n",
351 netdev_name(peer->ovpn->dev),
352 &bind->remote.in6, ret);
353 goto err;
354 }
355
356 /* avoid storing a stale cache or local address */
357 spin_lock_bh(&peer->lock);
358 if (likely(ovpn_dst_cache_current(peer, bind, key))) {
359 if (!reset_local) {
360 dst_cache_set_ip6(cache, dst, &fl.saddr);
361 spin_unlock_bh(&peer->lock);
362 goto transmit;
363 }
364
365 /* invalidate per-CPU dst entries that may still carry
366 * the stale source
367 */
368 dst_cache_reset(cache);
369
370 /* preserve the current remote */
371 memcpy(&remote, &bind->remote, sizeof(struct sockaddr_in6));
372 /* The current packet already has a valid wildcard-source route.
373 * If replacing the bind fails, leave the stale local in place;
374 * a later cache miss will retry the repair.
375 */
376 ovpn_peer_reset_sockaddr(peer, &remote, &local);
377 }
378 spin_unlock_bh(&peer->lock);
379
380 transmit:
381 /* user IPv6 packets may be larger than the transport interface
382 * MTU (after encapsulation), however, since they are locally
383 * generated we should ensure they get fragmented.
384 * Setting the ignore_df flag to 1 will instruct ip6_fragment() to
385 * fragment packets if needed.
386 *
387 * NOTE: this is not needed for IPv4 because we pass df=0 to
388 * udp_tunnel_xmit_skb()
389 */
390 skb->ignore_df = 1;
391 udp_tunnel6_xmit_skb(dst, sk, skb, skb->dev, &fl.saddr, &fl.daddr, 0,
392 ip6_dst_hoplimit(dst), 0, fl.fl6_sport,
393 fl.fl6_dport, udp_get_no_check6_tx(sk), 0);
394 ret = 0;
395 err:
396 local_bh_enable();
397 return ret;
398 }
399 #endif
400
401 /**
402 * ovpn_udp_output - transmit skb using udp-tunnel
403 * @peer: the destination peer
404 * @cache: dst cache
405 * @sk: the socket to send the packet over
406 * @skb: the packet to send
407 * @key: route key snapshot used for cache validation and flow lookup
408 *
409 * rcu_read_lock should be held on entry.
410 * On return, the skb is consumed.
411 *
412 * Return: 0 on success or a negative error code otherwise
413 */
ovpn_udp_output(struct ovpn_peer * peer,struct dst_cache * cache,struct sock * sk,struct sk_buff * skb,struct ovpn_route_key * key)414 static int ovpn_udp_output(struct ovpn_peer *peer, struct dst_cache *cache,
415 struct sock *sk, struct sk_buff *skb,
416 struct ovpn_route_key *key)
417 {
418 struct ovpn_bind *bind;
419 int ret;
420
421 /* set sk to null if skb is already orphaned */
422 if (!skb->destructor)
423 skb->sk = NULL;
424
425 rcu_read_lock();
426 bind = rcu_dereference(peer->bind);
427 if (unlikely(!bind)) {
428 net_warn_ratelimited("%s: no bind for remote peer %u\n",
429 netdev_name(peer->ovpn->dev), peer->id);
430 ret = -ENODEV;
431 goto out;
432 }
433
434 switch (bind->remote.in4.sin_family) {
435 case AF_INET:
436 ret = ovpn_udp4_output(peer, bind, cache, sk, skb, key);
437 break;
438 #if IS_ENABLED(CONFIG_IPV6)
439 case AF_INET6:
440 ret = ovpn_udp6_output(peer, bind, cache, sk, skb, key);
441 break;
442 #endif
443 default:
444 ret = -EAFNOSUPPORT;
445 break;
446 }
447
448 out:
449 rcu_read_unlock();
450 return ret;
451 }
452
453 /**
454 * ovpn_udp_send_skb - prepare skb and send it over via UDP
455 * @peer: the destination peer
456 * @sk: peer socket
457 * @skb: the packet to send
458 */
ovpn_udp_send_skb(struct ovpn_peer * peer,struct sock * sk,struct sk_buff * skb)459 void ovpn_udp_send_skb(struct ovpn_peer *peer, struct sock *sk,
460 struct sk_buff *skb)
461 {
462 struct ovpn_route_key key = {
463 .mark = READ_ONCE(sk->sk_mark),
464 .sport = READ_ONCE(inet_sk(sk)->inet_sport),
465 };
466 int ret;
467
468 skb->dev = peer->ovpn->dev;
469 skb->mark = key.mark;
470 /* no checksum performed at this layer */
471 skb->ip_summed = CHECKSUM_NONE;
472
473 ovpn_dst_cache_check_key(peer, &peer->dst_cache, &key);
474
475 /* crypto layer -> transport (UDP) */
476 ret = ovpn_udp_output(peer, &peer->dst_cache, sk, skb, &key);
477 if (unlikely(ret < 0))
478 kfree_skb(skb);
479 }
480
ovpn_udp_encap_destroy(struct sock * sk)481 static void ovpn_udp_encap_destroy(struct sock *sk)
482 {
483 struct ovpn_socket *sock;
484 struct ovpn_priv *ovpn;
485
486 rcu_read_lock();
487 sock = rcu_dereference_sk_user_data(sk);
488 if (!sock || !sock->ovpn) {
489 rcu_read_unlock();
490 return;
491 }
492 ovpn = sock->ovpn;
493 rcu_read_unlock();
494
495 ovpn_peers_free(ovpn, sk, OVPN_DEL_PEER_REASON_TRANSPORT_DISCONNECT);
496 }
497
498 /**
499 * ovpn_udp_socket_attach - set udp-tunnel CBs on socket and link it to ovpn
500 * @ovpn_sock: socket to configure
501 * @sock: the socket container to be passed to setup_udp_tunnel_sock()
502 * @ovpn: the openvp instance to link
503 *
504 * After invoking this function, the sock will be controlled by ovpn so that
505 * any incoming packet may be processed by ovpn first.
506 *
507 * Return: 0 on success or a negative error code otherwise
508 */
ovpn_udp_socket_attach(struct ovpn_socket * ovpn_sock,struct socket * sock,struct ovpn_priv * ovpn)509 int ovpn_udp_socket_attach(struct ovpn_socket *ovpn_sock, struct socket *sock,
510 struct ovpn_priv *ovpn)
511 {
512 struct udp_tunnel_sock_cfg cfg = {
513 .sk_user_data = ovpn_sock,
514 .encap_type = UDP_ENCAP_OVPNINUDP,
515 .encap_rcv = ovpn_udp_encap_recv,
516 .encap_destroy = ovpn_udp_encap_destroy,
517 };
518 struct ovpn_socket *old_data;
519 int ret;
520
521 /* make sure no pre-existing encapsulation handler exists */
522 rcu_read_lock();
523 old_data = rcu_dereference_sk_user_data(ovpn_sock->sk);
524 if (!old_data) {
525 /* socket is currently unused - we can take it */
526 rcu_read_unlock();
527 setup_udp_tunnel_sock(sock_net(ovpn_sock->sk), sock->sk, &cfg);
528 return 0;
529 }
530
531 /* socket is in use. We need to understand if it's owned by this ovpn
532 * instance or by something else.
533 * In the former case, we can increase the refcounter and happily
534 * use it, because the same UDP socket is expected to be shared among
535 * different peers.
536 *
537 * Unlikely TCP, a single UDP socket can be used to talk to many remote
538 * hosts and therefore openvpn instantiates one only for all its peers
539 */
540 if ((READ_ONCE(udp_sk(ovpn_sock->sk)->encap_type) == UDP_ENCAP_OVPNINUDP) &&
541 old_data->ovpn == ovpn) {
542 netdev_dbg(ovpn->dev,
543 "provided socket already owned by this interface\n");
544 ret = -EALREADY;
545 } else {
546 netdev_dbg(ovpn->dev,
547 "provided socket already taken by other user\n");
548 ret = -EBUSY;
549 }
550 rcu_read_unlock();
551
552 return ret;
553 }
554
555 /**
556 * ovpn_udp_socket_detach - clean udp-tunnel status for this socket
557 * @ovpn_sock: the socket to clean
558 */
ovpn_udp_socket_detach(struct ovpn_socket * ovpn_sock)559 void ovpn_udp_socket_detach(struct ovpn_socket *ovpn_sock)
560 {
561 struct sock *sk = ovpn_sock->sk;
562
563 /* Re-enable multicast loopback */
564 inet_set_bit(MC_LOOP, sk);
565 /* Disable CHECKSUM_UNNECESSARY to CHECKSUM_COMPLETE conversion */
566 inet_dec_convert_csum(sk);
567
568 WRITE_ONCE(udp_sk(sk)->encap_type, 0);
569 WRITE_ONCE(udp_sk(sk)->encap_rcv, NULL);
570 WRITE_ONCE(udp_sk(sk)->encap_destroy, NULL);
571
572 rcu_assign_sk_user_data(sk, NULL);
573 }
574