OpenVPN 3 Core Library
Loading...
Searching...
No Matches
dcocli.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#pragma once
13
14#include <memory>
15#include <sstream>
16#include <vector>
17
22#include <openvpn/time/time.hpp>
28
29#if !defined(ENABLE_OVPNDCOWIN)
31#endif
32
33#if defined(ENABLE_KOVPN)
34#include <openvpn/kovpn/kodevtun.hpp>
35#include <openvpn/kovpn/kostats.hpp>
36#include <openvpn/kovpn/kovpn.hpp>
37#include <openvpn/kovpn/rps_xps.hpp>
38#elif defined(ENABLE_OVPNDCO)
41#include <openvpn/dco/key.hpp>
44#elif defined(ENABLE_OVPNDCOWIN)
45#include <bcrypt.h>
46#include <openvpn/dco/key.hpp>
49#else
50#error either ENABLE_KOVPN, ENABLE_OVPNDCO or ENABLE_OVPNDCOWIN must be defined
51#endif
52
54
55// client-side DCO (Data Channel Offload) module for Linux/kovpn
56
58enum
59{
60 OVPN_PEER_ID_UNDEF = 0x00FFFFFF,
61};
62
63class ClientConfig : public DCO,
65 public TunClientFactory
66{
67 public:
69
70 std::string dev_name;
71
74
75 unsigned int ping_restart_override = 0;
76
77 void process_push(const OptionList &opt) override
78 {
80 }
81
82 void finalize(const bool disconnected) override
83 {
84#if defined(ENABLE_OVPNDCOWIN)
85 if (disconnected)
86 tun.tun_persist.reset();
87#endif
88 }
89
91 {
92 tun = conf;
93
94 // set a default MTU
95 if (!tun.tun_prop.mtu)
97
98 // parse "dev" option
99 {
100 const Option *dev = opt.get_ptr("dev");
101 if (dev)
102 dev_name = dev->get(1, 64);
103 else
104 dev_name = "ovpnc";
105 }
106
107 // parse ping-restart-override
109 "ping-restart-override", 1, ping_restart_override, 0, 3600);
110
111 return TunClientFactory::Ptr(this);
112 }
113
119
120 TunClient::Ptr new_tun_client_obj(openvpn_io::io_context &io_context,
121 TunClientParent &parent,
122 TransportClient *transcli) override;
123
124 TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context,
125 TransportClientParent *parent) override;
126
128 {
129 auto ctrl = new ClientConfig();
130 if (ctrl)
131 ctrl->builder = tb;
132 return ctrl;
133 }
134
135 bool supports_epoch_data() override
136 {
137 /* Currently, there is no version of ovpn-dco for Linux or Windows that supports
138 * the new features, so we always return false here */
139 return false;
140 }
141
142 protected:
143 ClientConfig() = default;
144};
145
146class Client : public TransportClient,
147 public TunClient,
148 public AsyncResolvableUDP
149{
150 friend class ClientConfig;
151
153
154 public:
155 // transport methods
156
158 {
159 return false;
160 }
161
163 {
164 return false;
165 }
166
168 {
169 return 0;
170 }
171
172 void reset_align_adjust(const size_t align_adjust) override
173 {
174 }
175
177 {
178 }
179
180 void server_endpoint_info(std::string &host,
181 std::string &port,
182 std::string &proto,
183 std::string &ip_addr) const override
184 {
187 const IP::Addr addr = server_endpoint_addr();
188 proto = std::string(transport_protocol().str());
189 proto += "-DCO";
190 ip_addr = addr.to_string();
191 }
192
193 void stop() override
194 {
195 stop_();
196 }
197
198 // tun methods
199
200 void set_disconnect() override
201 {
202 }
203
204 bool tun_send(BufferAllocated &buf) override // return true if send succeeded
205 {
206 return false;
207 }
208
209 std::string vpn_ip4() const override
210 {
211 if (state->vpn_ip4_addr.specified())
212 return state->vpn_ip4_addr.to_string();
213 else
214 return "";
215 }
216
217 std::string vpn_ip6() const override
218 {
219 if (state->vpn_ip6_addr.specified())
220 return state->vpn_ip6_addr.to_string();
221 else
222 return "";
223 }
224
225 std::string vpn_gw4() const override
226 {
227 if (state->vpn_ip4_gw.specified())
228 return state->vpn_ip4_gw.to_string();
229 else
230 return "";
231 }
232
233 std::string vpn_gw6() const override
234 {
235 if (state->vpn_ip6_gw.specified())
236 return state->vpn_ip6_gw.to_string();
237 else
238 return "";
239 }
240
241 int vpn_mtu() const override
242 {
243 return state->mtu;
244 }
245
246 protected:
247 Client(openvpn_io::io_context &io_context_arg,
248 ClientConfig *config_arg,
249 TransportClientParent *parent_arg)
250 : AsyncResolvableUDP(io_context_arg), io_context(io_context_arg),
251 halt(false), state(new TunProp::State()), config(config_arg),
252 transport_parent(parent_arg), tun_parent(nullptr),
254 {
255 }
256
257 void transport_reparent(TransportClientParent *parent_arg) override
258 {
259 transport_parent = parent_arg;
260 }
261
262 virtual void stop_() = 0;
263
264 openvpn_io::io_context &io_context;
265 bool halt;
266
268
272
274
275 std::string server_host;
276 std::string server_port;
277
278 uint32_t peer_id;
279};
280
281#if defined(ENABLE_KOVPN)
282#include <openvpn/kovpn/kovpncli.hpp>
283inline DCO::Ptr new_controller(TunBuilderBase *)
284{
285 return KovpnClientConfig::new_controller();
286}
288ClientConfig::new_transport_client_obj(openvpn_io::io_context &io_context,
289 TransportClientParent *parent)
290{
291 return TransportClient::Ptr(new KovpnClient(io_context, this, parent));
292}
293#elif defined(ENABLE_OVPNDCO)
295inline DCO::Ptr new_controller(TunBuilderBase *tb)
296{
298 return nullptr;
299
305}
307ClientConfig::new_transport_client_obj(openvpn_io::io_context &io_context,
308 TransportClientParent *parent)
309{
310 return TransportClient::Ptr(new OvpnDcoClient(io_context, this, parent));
311}
312#elif defined(ENABLE_OVPNDCOWIN)
314inline DCO::Ptr new_controller(TunBuilderBase *tb)
315{
317 return nullptr;
318
320 BCRYPT_ALG_HANDLE h;
321 NTSTATUS status = BCryptOpenAlgorithmProvider(&h, L"CHACHA20_POLY1305", NULL, 0);
322 if (BCRYPT_SUCCESS(status))
323 {
324 BCryptCloseAlgorithmProvider(h, 0);
326 }
327
329 return ClientConfig::new_controller(nullptr);
330}
332ClientConfig::new_transport_client_obj(openvpn_io::io_context &io_context,
333 TransportClientParent *parent)
334{
335 return TransportClient::Ptr(new OvpnDcoWinClient(io_context, this, parent));
336}
337#endif
338
339inline TunClient::Ptr
340ClientConfig::new_tun_client_obj(openvpn_io::io_context &io_context,
341 TunClientParent &parent,
342 TransportClient *transcli)
343{
344 Client *cli = static_cast<Client *>(transcli);
345 cli->tun_parent = &parent;
346 return TunClient::Ptr(cli);
347}
348} // namespace openvpn::DCOTransport
static bool available(TunBuilderBase *tb)
static bool available()
void process_push(const OptionList &opt) override
Definition dcocli.hpp:77
TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context, TransportClientParent *parent) override
DCO::TransportConfig transport
Definition dcocli.hpp:72
TunClientFactory::Ptr new_tun_factory(const DCO::TunConfig &conf, const OptionList &opt) override
Definition dcocli.hpp:90
RCPtr< ClientConfig > Ptr
Definition dcocli.hpp:68
TunClient::Ptr new_tun_client_obj(openvpn_io::io_context &io_context, TunClientParent &parent, TransportClient *transcli) override
Definition dcocli.hpp:340
void finalize(const bool disconnected) override
Definition dcocli.hpp:82
TransportClientFactory::Ptr new_transport_factory(const DCO::TransportConfig &conf) override
Definition dcocli.hpp:114
static DCO::Ptr new_controller(TunBuilderBase *tb)
Definition dcocli.hpp:127
void server_endpoint_info(std::string &host, std::string &port, std::string &proto, std::string &ip_addr) const override
Definition dcocli.hpp:180
std::string vpn_ip4() const override
Definition dcocli.hpp:209
void transport_stop_requeueing() override
Definition dcocli.hpp:176
ClientConfig::Ptr config
Definition dcocli.hpp:269
void transport_reparent(TransportClientParent *parent_arg) override
Definition dcocli.hpp:257
int vpn_mtu() const override
Definition dcocli.hpp:241
size_t transport_send_queue_size() override
Definition dcocli.hpp:167
std::string vpn_gw6() const override
Definition dcocli.hpp:233
std::string vpn_ip6() const override
Definition dcocli.hpp:217
bool transport_send_queue_empty() override
Definition dcocli.hpp:157
ActionList::Ptr remove_cmds
Definition dcocli.hpp:273
void reset_align_adjust(const size_t align_adjust) override
Definition dcocli.hpp:172
openvpn_io::io_context & io_context
Definition dcocli.hpp:264
TransportClientParent * transport_parent
Definition dcocli.hpp:270
Client(openvpn_io::io_context &io_context_arg, ClientConfig *config_arg, TransportClientParent *parent_arg)
Definition dcocli.hpp:247
std::string vpn_gw4() const override
Definition dcocli.hpp:225
bool tun_send(BufferAllocated &buf) override
Definition dcocli.hpp:204
bool transport_has_send_queue() override
Definition dcocli.hpp:162
void set_disconnect() override
Definition dcocli.hpp:200
TunProp::State::Ptr state
Definition dcocli.hpp:267
TunClientParent * tun_parent
Definition dcocli.hpp:271
std::string to_string() const
Definition ip.hpp:528
T get_num(const std::string &name, const size_t idx, const T default_value) const
Definition options.hpp:1416
const Option * get_ptr(const std::string &name) const
Definition options.hpp:1186
const std::string & get(const size_t index, const size_t max_len) const
Definition options.hpp:187
The smart pointer class.
Definition rc.hpp:119
void process_push(const OptionList &opt)
TunBuilder methods, loosely based on the Android VpnService.Builder abstraction.
Definition base.hpp:42
void allow_dc_algs(const std::list< Type > types)
std::array< Alg, Type::SIZE > algs
@ TUN_MTU_DEFAULT
Definition tunmtu.hpp:20
RemoteList::Ptr remote_list
Definition dco.hpp:47
TunProp::Config tun_prop
Definition dco.hpp:72
RCPtr< DCO > Ptr
Definition dco.hpp:37
RCPtr< TransportClientFactory > Ptr
RCPtr< TransportClient > Ptr
Definition transbase.hpp:37
virtual IP::Addr server_endpoint_addr() const =0
virtual Protocol transport_protocol() const =0
RCPtr< TunClientFactory > Ptr
Definition tunbase.hpp:102
RCPtr< TunClient > Ptr
Definition tunbase.hpp:34
proxy_host_port port
os<< "Session Name: "<< tbc-> session_name<< '\n';os<< "Layer: "<< tbc-> layer str()<< '\n'
proxy_host_port host