1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*  OpenVPN data channel offload
3  *
4  *  Copyright (C) 2020-2025 OpenVPN, Inc.
5  *
6  *  Author:	James Yonan <james@openvpn.net>
7  *		Antonio Quartulli <antonio@openvpn.net>
8  */
9 
10 #ifndef _NET_OVPN_SOCK_H_
11 #define _NET_OVPN_SOCK_H_
12 
13 #include <linux/net.h>
14 #include <linux/kref.h>
15 #include <net/sock.h>
16 
17 struct ovpn_priv;
18 struct ovpn_peer;
19 
20 /**
21  * struct ovpn_socket - a kernel socket referenced in the ovpn code
22  * @ovpn: ovpn instance owning this socket (UDP only)
23  * @dev_tracker: reference tracker for associated dev (UDP only)
24  * @peer: unique peer transmitting over this socket (TCP only)
25  * @sk: the low level sock object
26  * @refcount: amount of contexts currently referencing this object
27  * @work: member used to schedule release routine (it may block)
28  * @tcp_tx_work: work for deferring outgoing packet processing (TCP only)
29  */
30 struct ovpn_socket {
31 	union {
32 		struct {
33 			struct ovpn_priv *ovpn;
34 			netdevice_tracker dev_tracker;
35 		};
36 		struct ovpn_peer *peer;
37 	};
38 
39 	struct sock *sk;
40 	struct kref refcount;
41 	struct work_struct work;
42 	struct work_struct tcp_tx_work;
43 };
44 
45 struct ovpn_socket *ovpn_socket_new(struct socket *sock,
46 				    struct ovpn_peer *peer);
47 void ovpn_socket_release(struct ovpn_peer *peer);
48 
49 #endif /* _NET_OVPN_SOCK_H_ */
50