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
23#include <openvpn/time/time.hpp>
29
30#if defined(ENABLE_KOVPN)
31#include <openvpn/kovpn/kodevtun.hpp>
32#include <openvpn/kovpn/kostats.hpp>
33#include <openvpn/kovpn/kovpn.hpp>
34#include <openvpn/kovpn/rps_xps.hpp>
35#elif defined(ENABLE_OVPNDCO)
38#include <openvpn/dco/key.hpp>
41// Pre-include headers that ovpndcocli.hpp pulls in transitively.
42// These headers define symbols in their own namespaces (e.g. openvpn::TunNetlink).
43// Including them here, at global scope and before the namespace openvpn::DCOTransport
44// block opens below, ensures #pragma once prevents them from being re-included
45// inside that namespace block (which would create the spurious nested namespace
46// openvpn::DCOTransport::openvpn and break all unqualified openvpn:: references).
49#elif defined(ENABLE_OVPNDCOWIN)
50#include <bcrypt.h>
51#include <openvpn/dco/key.hpp>
54#else
55#error either ENABLE_KOVPN, ENABLE_OVPNDCO or ENABLE_OVPNDCOWIN must be defined
56#endif
57
59
60// client-side DCO (Data Channel Offload) module for Linux/kovpn
61
63enum
64{
65 OVPN_PEER_ID_UNDEF = 0x00FFFFFF,
66};
67
68class ClientConfig : public DCO,
70 public TunClientFactory
71{
72 public:
74
75 std::string dev_name;
76
79
80 unsigned int ping_restart_override = 0;
81
82 void process_push(const OptionList &opt) override
83 {
85 }
86
87 void finalize(const bool disconnected) override
88 {
89#if defined(ENABLE_OVPNDCOWIN)
90 if (disconnected)
91 tun.tun_persist.reset();
92#endif
93 }
94
96 {
97 tun = conf;
98
99 // set a default MTU
100 if (!tun.tun_prop.mtu)
102
103 // parse "dev" option
104 {
105 const Option *dev = opt.get_ptr("dev");
106 if (dev)
107 dev_name = dev->get(1, 64);
108 else
109 dev_name = "ovpnc";
110 }
111
112 // parse ping-restart-override
114 "ping-restart-override", 1, ping_restart_override, 0, 3600);
115
116 return TunClientFactory::Ptr(this);
117 }
118
124
125 TunClient::Ptr new_tun_client_obj(openvpn_io::io_context &io_context,
126 TunClientParent &parent,
127 TransportClient *transcli) override;
128
129 TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context,
130 TransportClientParent *parent) override;
131
133 {
134 auto ctrl = new ClientConfig();
135 if (ctrl)
136 ctrl->builder = tb;
137 return ctrl;
138 }
139
140 bool supports_epoch_data() override
141 {
142 /* Currently, there is no version of ovpn-dco for Linux or Windows that supports
143 * the new features, so we always return false here */
144 return false;
145 }
146
147 protected:
148 ClientConfig() = default;
149};
150
151class Client : public TransportClient,
152 public TunClient,
153 public AsyncResolvableUDP
154{
155 friend class ClientConfig;
156
158
159 public:
160 // transport methods
161
163 {
164 return false;
165 }
166
168 {
169 return false;
170 }
171
173 {
174 return 0;
175 }
176
177 void reset_align_adjust(const size_t align_adjust) override
178 {
179 }
180
182 {
183 }
184
185 void server_endpoint_info(std::string &host,
186 std::string &port,
187 std::string &proto,
188 std::string &ip_addr) const override
189 {
190 host = server_host;
191 port = server_port;
192 const IP::Addr addr = server_endpoint_addr();
193 proto = std::string(transport_protocol().str());
194 proto += "-DCO";
195 ip_addr = addr.to_string();
196 }
197
198 void stop() override
199 {
200 stop_();
201 }
202
203 // tun methods
204
205 void set_disconnect() override
206 {
207 }
208
209 bool tun_send(BufferAllocated &buf) override // return true if send succeeded
210 {
211 return false;
212 }
213
214 std::string vpn_ip4() const override
215 {
216 if (state->vpn_ip4_addr.specified())
217 return state->vpn_ip4_addr.to_string();
218 else
219 return "";
220 }
221
222 std::string vpn_ip6() const override
223 {
224 if (state->vpn_ip6_addr.specified())
225 return state->vpn_ip6_addr.to_string();
226 else
227 return "";
228 }
229
230 std::string vpn_gw4() const override
231 {
232 if (state->vpn_ip4_gw.specified())
233 return state->vpn_ip4_gw.to_string();
234 else
235 return "";
236 }
237
238 std::string vpn_gw6() const override
239 {
240 if (state->vpn_ip6_gw.specified())
241 return state->vpn_ip6_gw.to_string();
242 else
243 return "";
244 }
245
246 int vpn_mtu() const override
247 {
248 return state->mtu;
249 }
250
251 protected:
252 Client(openvpn_io::io_context &io_context_arg,
253 ClientConfig *config_arg,
254 TransportClientParent *parent_arg)
255 : AsyncResolvableUDP(io_context_arg), io_context(io_context_arg),
256 halt(false), state(new TunProp::State()), config(config_arg),
257 transport_parent(parent_arg), tun_parent(nullptr),
259 {
260 }
261
262 void transport_reparent(TransportClientParent *parent_arg) override
263 {
264 transport_parent = parent_arg;
265 }
266
267 virtual void stop_() = 0;
268
269 openvpn_io::io_context &io_context;
270 bool halt;
271
273
277
279
280 std::string server_host;
281 std::string server_port;
282
283 uint32_t peer_id;
284};
285
286#if defined(ENABLE_KOVPN)
287#include <openvpn/kovpn/kovpncli.hpp>
288inline DCO::Ptr new_controller(TunBuilderBase *)
289{
290 return KovpnClientConfig::new_controller();
291}
293ClientConfig::new_transport_client_obj(openvpn_io::io_context &io_context,
294 TransportClientParent *parent)
295{
296 return TransportClient::Ptr(new KovpnClient(io_context, this, parent));
297}
298#elif defined(ENABLE_OVPNDCO)
300inline DCO::Ptr new_controller(TunBuilderBase *tb)
301{
303 return nullptr;
304
310}
312ClientConfig::new_transport_client_obj(openvpn_io::io_context &io_context,
313 TransportClientParent *parent)
314{
315 return TransportClient::Ptr(new OvpnDcoClient(io_context, this, parent));
316}
317#elif defined(ENABLE_OVPNDCOWIN)
319inline DCO::Ptr new_controller(TunBuilderBase *tb)
320{
322 return nullptr;
323
325 BCRYPT_ALG_HANDLE h;
326 NTSTATUS status = BCryptOpenAlgorithmProvider(&h, L"CHACHA20_POLY1305", NULL, 0);
327 if (BCRYPT_SUCCESS(status))
328 {
329 BCryptCloseAlgorithmProvider(h, 0);
331 }
332
334 return ClientConfig::new_controller(nullptr);
335}
337ClientConfig::new_transport_client_obj(openvpn_io::io_context &io_context,
338 TransportClientParent *parent)
339{
340 return TransportClient::Ptr(new OvpnDcoWinClient(io_context, this, parent));
341}
342#endif
343
344inline TunClient::Ptr
345ClientConfig::new_tun_client_obj(openvpn_io::io_context &io_context,
346 TunClientParent &parent,
347 TransportClient *transcli)
348{
349 Client *cli = static_cast<Client *>(transcli);
350 cli->tun_parent = &parent;
351 return TunClient::Ptr(cli);
352}
353} // namespace openvpn::DCOTransport
static bool available(TunBuilderBase *tb)
static bool available()
void process_push(const OptionList &opt) override
Definition dcocli.hpp:82
TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context, TransportClientParent *parent) override
DCO::TransportConfig transport
Definition dcocli.hpp:77
TunClientFactory::Ptr new_tun_factory(const DCO::TunConfig &conf, const OptionList &opt) override
Definition dcocli.hpp:95
RCPtr< ClientConfig > Ptr
Definition dcocli.hpp:73
TunClient::Ptr new_tun_client_obj(openvpn_io::io_context &io_context, TunClientParent &parent, TransportClient *transcli) override
Definition dcocli.hpp:345
void finalize(const bool disconnected) override
Definition dcocli.hpp:87
TransportClientFactory::Ptr new_transport_factory(const DCO::TransportConfig &conf) override
Definition dcocli.hpp:119
static DCO::Ptr new_controller(TunBuilderBase *tb)
Definition dcocli.hpp:132
void server_endpoint_info(std::string &host, std::string &port, std::string &proto, std::string &ip_addr) const override
Definition dcocli.hpp:185
std::string vpn_ip4() const override
Definition dcocli.hpp:214
void transport_stop_requeueing() override
Definition dcocli.hpp:181
ClientConfig::Ptr config
Definition dcocli.hpp:274
void transport_reparent(TransportClientParent *parent_arg) override
Definition dcocli.hpp:262
int vpn_mtu() const override
Definition dcocli.hpp:246
size_t transport_send_queue_size() override
Definition dcocli.hpp:172
std::string vpn_gw6() const override
Definition dcocli.hpp:238
std::string vpn_ip6() const override
Definition dcocli.hpp:222
bool transport_send_queue_empty() override
Definition dcocli.hpp:162
ActionList::Ptr remove_cmds
Definition dcocli.hpp:278
void reset_align_adjust(const size_t align_adjust) override
Definition dcocli.hpp:177
openvpn_io::io_context & io_context
Definition dcocli.hpp:269
TransportClientParent * transport_parent
Definition dcocli.hpp:275
Client(openvpn_io::io_context &io_context_arg, ClientConfig *config_arg, TransportClientParent *parent_arg)
Definition dcocli.hpp:252
std::string vpn_gw4() const override
Definition dcocli.hpp:230
bool tun_send(BufferAllocated &buf) override
Definition dcocli.hpp:209
bool transport_has_send_queue() override
Definition dcocli.hpp:167
void set_disconnect() override
Definition dcocli.hpp:205
TunProp::State::Ptr state
Definition dcocli.hpp:272
TunClientParent * tun_parent
Definition dcocli.hpp:276
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:1400
const Option * get_ptr(const std::string &name) const
Definition options.hpp:1179
const std::string & get(const size_t index, const size_t max_len) const
Definition options.hpp:189
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:70
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