OpenVPN
dco.c
Go to the documentation of this file.
1/*
2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
6 * packet compression.
7 *
8 * Copyright (C) 2021-2025 Arne Schwabe <arne@rfc2549.org>
9 * Copyright (C) 2021-2025 Antonio Quartulli <a@unstable.cc>
10 * Copyright (C) 2021-2025 OpenVPN Inc <sales@openvpn.net>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2
14 * as published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program (see the file COPYING included with this
23 * distribution); if not, see <https://www.gnu.org/licenses/>.
24 */
25
26#ifdef HAVE_CONFIG_H
27#include "config.h"
28#endif
29
30#if defined(ENABLE_DCO)
31
32#include "syshead.h"
33#include "crypto.h"
34#include "dco.h"
35#include "errlevel.h"
36#include "multi.h"
37#include "networking.h"
38#include "openvpn.h"
39#include "options.h"
40#include "ssl_common.h"
41#include "ssl_ncp.h"
42#include "tun.h"
43#include "tun_afunix.h"
44
45#if defined(_WIN32)
46#include "dco_win.h"
47#endif
48
49#ifdef HAVE_LIBCAPNG
50#include <cap-ng.h>
51#endif
52
53static int
54dco_install_key(struct tls_multi *multi, struct key_state *ks, const uint8_t *encrypt_key,
55 const uint8_t *encrypt_iv, const uint8_t *decrypt_key, const uint8_t *decrypt_iv,
56 const char *ciphername)
57
58{
60 msg(D_DCO_DEBUG, "%s: peer_id=%d keyid=%d epoch=%d, currently %d keys installed", __func__,
61 multi->dco_peer_id, ks->key_id, multi->dco_keys_installed, epoch);
62
63 /* Install a key in the PRIMARY slot only when no other key exist.
64 * From that moment on, any new key will be installed in the SECONDARY
65 * slot and will be promoted to PRIMARY when userspace says so (a swap
66 * will be performed in that case)
67 */
68 dco_key_slot_t slot = OVPN_KEY_SLOT_PRIMARY;
69 if (multi->dco_keys_installed > 0)
70 {
72 }
73
74 int ret = dco_new_key(multi->dco, multi->dco_peer_id, ks->key_id, slot, encrypt_key, encrypt_iv,
75 decrypt_key, decrypt_iv, ciphername, epoch);
76 if ((ret == 0) && (multi->dco_keys_installed < 2))
77 {
78 multi->dco_keys_installed++;
79 ks->dco_status =
81 }
82
83 return ret;
84}
85
86int
87init_key_dco_bi(struct tls_multi *multi, struct key_state *ks, const struct key2 *key2,
88 int key_direction, const char *ciphername, bool server)
89{
90 struct key_direction_state kds;
91 key_direction_state_init(&kds, key_direction);
92
93 return dco_install_key(multi, ks, key2->keys[kds.out_key].cipher, key2->keys[(int)server].hmac,
94 key2->keys[kds.in_key].cipher, key2->keys[1 - (int)server].hmac,
95 ciphername);
96}
97
106static struct key_state *
107dco_get_secondary_key(struct tls_multi *multi, const struct key_state *primary)
108{
109 for (int i = 0; i < KEY_SCAN_SIZE; ++i)
110 {
111 struct key_state *ks = get_key_scan(multi, i);
113
114 if (ks == primary)
115 {
116 continue;
117 }
118
120 {
121 ASSERT(key->initialized);
122 return ks;
123 }
124 }
125
126 return NULL;
127}
128
129bool
130dco_update_keys(dco_context_t *dco, struct tls_multi *multi)
131{
132 /* this function checks if keys have to be swapped or erased, therefore it
133 * can't do much if we don't have any key installed
134 */
135 if (multi->dco_keys_installed == 0)
136 {
137 return true;
138 }
139
140 struct key_state *primary = tls_select_encryption_key(multi);
141 /* no primary key available -> no usable key exists, therefore we should
142 * tell DCO to simply wipe all keys
143 */
144 if (!primary)
145 {
146 msg(D_DCO, "No encryption key found. Purging data channel keys");
147
148 int ret = dco_del_key(dco, multi->dco_peer_id, OVPN_KEY_SLOT_PRIMARY);
149 if (ret < 0)
150 {
151 msg(D_DCO, "Cannot delete primary key during wipe: %s (%d)", strerror(-ret), ret);
152 return false;
153 }
154
156 if (ret < 0)
157 {
158 msg(D_DCO, "Cannot delete secondary key during wipe: %s (%d)", strerror(-ret), ret);
159 return false;
160 }
161
162 multi->dco_keys_installed = 0;
163 return true;
164 }
165
166 /* if we have a primary key, it must have been installed already (keys
167 * are installed upon generation in the TLS code)
168 */
170
171 struct key_state *secondary = dco_get_secondary_key(multi, primary);
172 /* if the current primary key was installed as secondary in DCO,
173 * this means we have promoted it since installation in DCO, and
174 * we now need to tell DCO to swap keys
175 */
176 if (primary->dco_status == DCO_INSTALLED_SECONDARY)
177 {
178 if (secondary)
179 {
181 "Swapping primary and secondary keys to "
182 "primary-id=%d secondary-id=%d",
183 primary->key_id, secondary->key_id);
184 }
185 else
186 {
188 "Swapping primary and secondary keys to "
189 "primary-id=%d secondary-id=(to be deleted)",
190 primary->key_id);
191 }
192
193 int ret = dco_swap_keys(dco, multi->dco_peer_id);
194 if (ret < 0)
195 {
196 msg(D_DCO, "Cannot swap keys: %s (%d)", strerror(-ret), ret);
197 return false;
198 }
199
201 if (secondary)
202 {
205 }
206 }
207
208 /* if we have no secondary key anymore, inform DCO about it */
209 if (!secondary && multi->dco_keys_installed == 2)
210 {
211 int ret = dco_del_key(dco, multi->dco_peer_id, OVPN_KEY_SLOT_SECONDARY);
212 if (ret < 0)
213 {
214 msg(D_DCO, "Cannot delete secondary key: %s (%d)", strerror(-ret), ret);
215 return false;
216 }
217 multi->dco_keys_installed = 1;
218 }
219
220 /* all keys that are not installed are set to NOT installed. Include also
221 * keys that might even be considered as active keys to be sure*/
222 for (int i = 0; i < TM_SIZE; ++i)
223 {
224 for (int j = 0; j < KS_SIZE; j++)
225 {
226 struct key_state *ks = &multi->session[i].key[j];
227 if (ks != primary && ks != secondary)
228 {
230 }
231 }
232 }
233 return true;
234}
235
236static bool
237dco_check_option_ce(const struct connection_entry *ce, msglvl_t msglevel, int mode)
238{
239 if (ce->fragment)
240 {
241 msg(msglevel, "Note: --fragment disables data channel offload.");
242 return false;
243 }
244
245 if (ce->http_proxy_options)
246 {
247 msg(msglevel, "Note: --http-proxy disables data channel offload.");
248 return false;
249 }
250
251 if (ce->socks_proxy_server)
252 {
253 msg(msglevel, "Note: --socks-proxy disables data channel offload.");
254 return false;
255 }
256
257#if defined(TARGET_FREEBSD)
258 if (ce->local_list)
259 {
260 for (int i = 0; i < ce->local_list->len; i++)
261 {
263 {
264 msg(msglevel, "NOTE: TCP transport disables data channel offload on FreeBSD.");
265 return false;
266 }
267 }
268 }
269#endif
270
271#if defined(_WIN32)
272 if (!proto_is_udp(ce->local_list->array[0]->proto) && mode == MODE_SERVER)
273 {
274 msg(msglevel,
275 "NOTE: TCP transport disables data channel offload on Windows in server mode.");
276 return false;
277 }
278
279 if (!ce->remote && !dco_win_supports_multipeer())
280 {
281 msg(msglevel,
282 "NOTE: --remote is not defined. This DCO version doesn't support multipeer. Disabling Data Channel Offload");
283 return false;
284 }
285
286 if ((mode == MODE_SERVER) && (ce->local_list->len > 1))
287 {
288 msg(msglevel, "NOTE: multiple --local options defined, disabling data channel offload");
289 return false;
290 }
291#endif
292
293 return true;
294}
295
296bool
297dco_check_startup_option(msglvl_t msglevel, const struct options *o)
298{
299 /* check if no dev name was specified at all. In the case,
300 * later logic will most likely stop OpenVPN, so no need to
301 * print any message here.
302 */
303 if (!o->dev)
304 {
305 return false;
306 }
307
308 if (!o->tls_client && !o->tls_server)
309 {
310 msg(msglevel, "No tls-client or tls-server option in configuration "
311 "detected. Disabling data channel offload.");
312 return false;
313 }
314
315 if (dev_type_enum(o->dev, o->dev_type) != DEV_TYPE_TUN)
316 {
317 msg(msglevel, "Note: dev-type not tun, disabling data channel offload.");
318 return false;
319 }
320
321 if (is_tun_afunix(o->dev_node))
322 {
323 msg(msglevel, "Note: afunix tun type selected, disabling data channel offload");
324 return false;
325 }
326
327 if (is_dev_type(o->dev, o->dev_type, "null"))
328 {
329 msg(msglevel, "Note: null tun type selected, disabling data channel offload");
330 return false;
331 }
332
333 if (o->connection_list)
334 {
335 const struct connection_list *l = o->connection_list;
336 for (int i = 0; i < l->len; ++i)
337 {
338 if (!dco_check_option_ce(l->array[i], msglevel, o->mode))
339 {
340 return false;
341 }
342 }
343 }
344 else
345 {
346 if (!dco_check_option_ce(&o->ce, msglevel, o->mode))
347 {
348 return false;
349 }
350 }
351
352#if defined(_WIN32)
353 if ((o->mode == MODE_SERVER) && !dco_win_supports_multipeer())
354 {
355 msg(msglevel,
356 "--mode server is set. This DCO version doesn't support multipeer. Disabling Data Channel Offload");
357 return false;
358 }
359
360 if ((o->mode == MODE_SERVER) && o->ce.local_list->len > 1)
361 {
362 msg(msglevel, "multiple --local options defined, disabling data channel offload");
363 return false;
364 }
365
366#elif defined(TARGET_LINUX)
367 /* if the device name is fixed, we need to check if an interface with this
368 * name already exists. IF it does, it must be a DCO interface, otherwise
369 * DCO has to be disabled in order to continue.
370 */
371 if (tun_name_is_fixed(o->dev))
372 {
374 /* we pass NULL as net_ctx because using DCO on Linux implies that we
375 * are using SITNL and the latter does not need any context. This way we
376 * don't need to have the net_ctx percolate all the way here
377 */
378 int ret = net_iface_type(NULL, o->dev, iftype);
379 if ((ret == 0) && (strcmp(iftype, "ovpn-dco") != 0))
380 {
381 msg(msglevel, "Interface %s exists and is non-DCO. Disabling data channel offload",
382 o->dev);
383 return false;
384 }
385 else if ((ret < 0) && (ret != -ENODEV))
386 {
387 msg(msglevel, "Cannot retrieve type of device %s: %s (%d)", o->dev, strerror(-ret),
388 ret);
389 }
390 }
391#endif /* if defined(_WIN32) */
392
393#if defined(HAVE_LIBCAPNG)
394 /* DCO can't operate without CAP_NET_ADMIN. To retain it when switching user
395 * we need CAP_SETPCAP. CAP_NET_ADMIN also needs to be part of the permitted set
396 * of capabilities in order to retain it.
397 */
398 if (o->username)
399 {
401 {
402 msg(msglevel, "--user specified but lacking CAP_SETPCAP. "
403 "Cannot retain CAP_NET_ADMIN. Disabling data channel offload");
404 return false;
405 }
407 {
408 msg(msglevel, "--user specified but not permitted to retain CAP_NET_ADMIN. "
409 "Disabling data channel offload");
410 return false;
411 }
412 }
413#endif /* if defined(HAVE_LIBCAPNG) */
414
415 if (o->mode == MODE_SERVER && o->topology != TOP_SUBNET)
416 {
417 msg(msglevel, "Note: NOT using '--topology subnet' disables data channel offload.");
418 return false;
419 }
420
421 if (o->management_flags & MF_QUERY_PROXY)
422 {
423 msg(msglevel, "Note: --management-query-proxy disables data channel offload.");
424 return false;
425 }
426
427 /* now that all options have been confirmed to be supported, check
428 * if DCO is truly available on the system
429 */
430 return dco_available(msglevel);
431}
432
433bool
434dco_check_option(msglvl_t msglevel, const struct options *o)
435{
436 /* At this point the ciphers have already been normalised */
437 if (o->enable_ncp_fallback
439 {
440 msg(msglevel,
441 "Note: --data-ciphers-fallback with cipher '%s' "
442 "disables data channel offload.",
443 o->ciphername);
444 return false;
445 }
446
447#if defined(USE_COMP)
448 if (o->comp.alg != COMP_ALG_UNDEF || o->comp.flags & COMP_F_ALLOW_ASYM)
449 {
450 msg(msglevel,
451 "Note: '--allow-compression' is not set to 'no', disabling data channel offload.");
452
453 if (o->mode == MODE_SERVER && !(o->comp.flags & COMP_F_MIGRATE))
454 {
455 /* We can end up here from the multi.c call, only print the
456 * note if it is not already enabled */
457 msg(msglevel, "Consider using the '--compress migrate' option.");
458 }
459 return false;
460 }
461#endif
462
463 struct gc_arena gc = gc_new();
464 char *tmp_ciphers = string_alloc(o->ncp_ciphers, &gc);
465 const char *token;
466 while ((token = strsep(&tmp_ciphers, ":")))
467 {
469 {
470 msg(msglevel,
471 "Note: cipher '%s' in --data-ciphers is not supported "
472 "by ovpn-dco, disabling data channel offload.",
473 token);
474 gc_free(&gc);
475 return false;
476 }
477 }
478 gc_free(&gc);
479
480 return true;
481}
482
483bool
484dco_check_pull_options(msglvl_t msglevel, const struct options *o)
485{
486 if (!o->use_peer_id)
487 {
488 msg(msglevel, "OPTIONS IMPORT: Server did not request DATA_V2 packet "
489 "format required for data channel offload");
490 return false;
491 }
492 return true;
493}
494
495int
497{
498 if (!dco_enabled(&c->options))
499 {
500 return 0;
501 }
502
503 struct link_socket *sock = c->c2.link_sockets[0];
504
506
507 struct sockaddr *remoteaddr = &sock->info.lsa->actual.dest.addr.sa;
508 struct tls_multi *multi = c->c2.tls_multi;
509#ifdef TARGET_FREEBSD
510 /* In Linux in P2P mode the kernel automatically removes an existing peer
511 * when adding a new peer. FreeBSD needs to explicitly be told to do that */
512 if (c->c2.tls_multi->dco_peer_id != -1)
513 {
515 c->c2.tls_multi->dco_peer_id = -1;
516 }
517#endif
518 int ret = dco_new_peer(&c->c1.tuntap->dco, multi->peer_id, sock->sd, NULL,
519 proto_is_dgram(sock->info.proto) ? remoteaddr : NULL, NULL, NULL);
520 if (ret < 0)
521 {
522 return ret;
523 }
524
525 c->c2.tls_multi->dco_peer_id = multi->peer_id;
526
527 return 0;
528}
529
530void
531dco_remove_peer(struct context *c)
532{
533 if (!dco_enabled(&c->options))
534 {
535 return;
536 }
537
538 if (c->c1.tuntap && c->c2.tls_multi && c->c2.tls_multi->dco_peer_id != -1)
539 {
541 c->c2.tls_multi->dco_peer_id = -1;
542 }
543}
544
545static bool
546dco_multi_get_localaddr(struct multi_context *m, struct multi_instance *mi,
547 struct sockaddr_storage *local)
548{
549#if ENABLE_IP_PKTINFO
550 struct context *c = &mi->context;
551
554 {
555 return false;
556 }
557
558 struct link_socket_actual *actual = &c->c2.link_socket_infos[0]->lsa->actual;
559
560 switch (actual->dest.addr.sa.sa_family)
561 {
562 case AF_INET:
563 {
564 struct sockaddr_in *sock_in4 = (struct sockaddr_in *)local;
565#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
566 sock_in4->sin_addr = actual->pi.in4.ipi_spec_dst;
567#elif defined(IP_RECVDSTADDR)
568 sock_in4->sin_addr = actual->pi.in4;
569#else
570 /* source IP not available on this platform */
571 return false;
572#endif
573 sock_in4->sin_family = AF_INET;
574 break;
575 }
576
577 case AF_INET6:
578 {
579 struct sockaddr_in6 *sock_in6 = (struct sockaddr_in6 *)local;
580 sock_in6->sin6_addr = actual->pi.in6.ipi6_addr;
581 sock_in6->sin6_family = AF_INET6;
582 break;
583 }
584
585 default:
586 ASSERT(false);
587 }
588
589 return true;
590#else /* if ENABLE_IP_PKTINFO */
591 return false;
592#endif /* if ENABLE_IP_PKTINFO */
593}
594
595int
597{
598 struct context *c = &mi->context;
599
600 int peer_id = c->c2.tls_multi->peer_id;
601 struct sockaddr *remoteaddr, *localaddr = NULL;
602 struct sockaddr_storage local = { 0 };
603 const socket_descriptor_t sd = c->c2.link_sockets[0]->sd;
604
605
606 if (c->mode == CM_CHILD_TCP)
607 {
608 /* the remote address will be inferred from the TCP socket endpoint */
609 remoteaddr = NULL;
610 }
611 else
612 {
614 remoteaddr = &c->c2.link_socket_infos[0]->lsa->actual.dest.addr.sa;
615 }
616
617 /* In server mode we need to fetch the remote addresses from the push config */
618 struct in_addr vpn_ip4 = { 0 };
619 struct in_addr *vpn_addr4 = NULL;
621 {
622 vpn_ip4.s_addr = htonl(c->c2.push_ifconfig_local);
623 vpn_addr4 = &vpn_ip4;
624 }
625
626 struct in6_addr *vpn_addr6 = NULL;
628 {
629 vpn_addr6 = &c->c2.push_ifconfig_ipv6_local;
630 }
631
632 if (dco_multi_get_localaddr(m, mi, &local))
633 {
634 localaddr = (struct sockaddr *)&local;
635 }
636
637 int ret =
638 dco_new_peer(&c->c1.tuntap->dco, peer_id, sd, localaddr, remoteaddr, vpn_addr4, vpn_addr6);
639 if (ret < 0)
640 {
641 return ret;
642 }
643
644 c->c2.tls_multi->dco_peer_id = peer_id;
645
646 return 0;
647}
648
649void
650dco_install_iroute(struct multi_context *m, struct multi_instance *mi, struct mroute_addr *addr)
651{
652#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32)
653 if (!dco_enabled(&m->top.options))
654 {
655 return;
656 }
657
658 int addrtype = (addr->type & MR_ADDR_MASK);
659
660 /* If we do not have local IP addr to install, skip the route */
661 if ((addrtype == MR_ADDR_IPV6 && !mi->context.c2.push_ifconfig_ipv6_defined)
662 || (addrtype == MR_ADDR_IPV4 && !mi->context.c2.push_ifconfig_defined))
663 {
664 return;
665 }
666
667 struct context *c = &mi->context;
668 if (addrtype == MR_ADDR_IPV6)
669 {
670#if defined(_WIN32)
672 c->c2.tls_multi->peer_id);
673#else
674 net_route_v6_add(&m->top.net_ctx, &addr->v6.addr, addr->netbits,
677#endif
678 }
679 else if (addrtype == MR_ADDR_IPV4)
680 {
681#if defined(_WIN32)
683 c->c2.tls_multi->peer_id);
684#else
685 in_addr_t dest = htonl(addr->v4.addr);
686 net_route_v4_add(&m->top.net_ctx, &dest, addr->netbits, &mi->context.c2.push_ifconfig_local,
688#endif
689 }
690#endif /* if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32) */
691}
692
693void
695{
696#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32)
697 if (!dco_enabled(&m->top.options))
698 {
699 return;
700 }
702
703 struct context *c = &mi->context;
704
706 {
707 for (const struct iroute *ir = c->options.iroutes; ir; ir = ir->next)
708 {
709#if defined(_WIN32)
710 dco_win_del_iroute_ipv4(&c->c1.tuntap->dco, htonl(ir->network), ir->netbits);
711#else
712 net_route_v4_del(&m->top.net_ctx, &ir->network, ir->netbits,
715#endif
716 }
717 }
718
720 {
721 for (const struct iroute_ipv6 *ir6 = c->options.iroutes_ipv6; ir6; ir6 = ir6->next)
722 {
723#if defined(_WIN32)
724 dco_win_del_iroute_ipv6(&c->c1.tuntap->dco, ir6->network, ir6->netbits);
725#else
726 net_route_v6_del(&m->top.net_ctx, &ir6->network, ir6->netbits,
729#endif
730 }
731 }
732#endif /* if defined(TARGET_LINUX) || defined(TARGET_FREEBSD) || defined(_WIN32) */
733}
734
735#endif /* defined(ENABLE_DCO) */
char * string_alloc(const char *str, struct gc_arena *gc)
Definition buffer.c:649
static void gc_free(struct gc_arena *a)
Definition buffer.h:1025
static struct gc_arena gc_new(void)
Definition buffer.h:1017
#define COMP_F_ALLOW_ASYM
Compression was explicitly set to allow asymetric compression.
Definition comp.h:49
#define COMP_F_MIGRATE
push stub-v2 or comp-lzo no when we see a client with comp-lzo in occ
Definition comp.h:47
#define COMP_ALG_UNDEF
Definition comp.h:54
char * strsep(char **stringp, const char *delim)
void key_direction_state_init(struct key_direction_state *kds, int key_direction)
Definition crypto.c:1666
Data Channel Cryptography Module.
#define CO_EPOCH_DATA_KEY_FORMAT
Bit-flag indicating the epoch the data format.
Definition crypto.h:377
static const char * dco_get_supported_ciphers(void)
Definition dco.h:380
static void dco_remove_peer(struct context *c)
Definition dco.h:347
static bool dco_check_startup_option(msglvl_t msglevel, const struct options *o)
Definition dco.h:279
static void dco_install_iroute(struct multi_context *m, struct multi_instance *mi, struct mroute_addr *addr)
Definition dco.h:358
static bool dco_check_pull_options(msglvl_t msglevel, const struct options *o)
Definition dco.h:285
static bool dco_available(msglvl_t msglevel)
Definition dco.h:261
static int dco_p2p_add_new_peer(struct context *c)
Definition dco.h:334
static bool dco_check_option(msglvl_t msglevel, const struct options *o)
Definition dco.h:273
static bool dco_update_keys(dco_context_t *dco, struct tls_multi *multi)
Definition dco.h:327
void * dco_context_t
Definition dco.h:258
#define DCO_IROUTE_METRIC
Definition dco.h:46
static int dco_multi_add_new_peer(struct multi_context *m, struct multi_instance *mi)
Definition dco.h:352
static void dco_delete_iroutes(struct multi_context *m, struct multi_instance *mi)
Definition dco.h:363
static int init_key_dco_bi(struct tls_multi *multi, struct key_state *ks, const struct key2 *key2, int key_direction, const char *ciphername, bool server)
Definition dco.h:320
int dco_del_key(dco_context_t *dco, unsigned int peerid, dco_key_slot_t slot)
Definition dco_win.c:584
int dco_del_peer(dco_context_t *dco, unsigned int peerid)
Definition dco_win.c:469
int dco_new_peer(dco_context_t *dco, unsigned int peerid, socket_descriptor_t sd, struct sockaddr *localaddr, struct sockaddr *remoteaddr, struct in_addr *vpn_ipv4, struct in6_addr *vpn_ipv6)
Definition dco_win.c:418
void dco_win_add_iroute_ipv6(dco_context_t *dco, struct in6_addr dst, unsigned int netbits, unsigned int peer_id)
Definition dco_win.c:1032
void dco_win_del_iroute_ipv4(dco_context_t *dco, in_addr_t dst, unsigned int netbits)
Definition dco_win.c:1053
bool dco_win_supports_multipeer(void)
Definition dco_win.c:1002
void dco_win_del_iroute_ipv6(dco_context_t *dco, struct in6_addr dst, unsigned int netbits)
Definition dco_win.c:1074
int dco_swap_keys(dco_context_t *dco, unsigned int peer_id)
Definition dco_win.c:592
void dco_win_add_iroute_ipv4(dco_context_t *dco, in_addr_t dst, unsigned int netbits, unsigned int peer_id)
Definition dco_win.c:1009
int dco_new_key(dco_context_t *dco, unsigned int peerid, int keyid, dco_key_slot_t slot, const uint8_t *encrypt_key, const uint8_t *encrypt_iv, const uint8_t *decrypt_key, const uint8_t *decrypt_iv, const char *ciphername, bool epoch)
Definition dco_win.c:529
#define D_DCO
Definition errlevel.h:93
#define D_DCO_DEBUG
Definition errlevel.h:117
#define KS_SIZE
Size of the tls_session.key array.
Definition ssl_common.h:469
#define TM_SIZE
Size of the tls_multi.session \ array.
Definition ssl_common.h:550
#define S_GENERATED_KEYS
The data channel keys have been generated The TLS session is fully authenticated when reaching this s...
Definition ssl_common.h:105
struct key_state * tls_select_encryption_key(struct tls_multi *multi)
Selects the primary encryption that should be used to encrypt data of an outgoing packet.
Definition ssl.c:3928
#define MF_QUERY_PROXY
Definition manage.h:41
#define MR_ADDR_IPV4
Definition mroute.h:61
#define MR_ADDR_IPV6
Definition mroute.h:62
#define MR_ADDR_MASK
Definition mroute.h:63
Header file for server-mode related structures and functions.
#define IFACE_TYPE_LEN_MAX
Definition networking.h:25
#define msg(flags,...)
Definition error.h:152
unsigned int msglvl_t
Definition error.h:77
#define ASSERT(x)
Definition error.h:219
#define CM_CHILD_TCP
Definition openvpn.h:486
#define MODE_SERVER
Definition options.h:264
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
Definition options.h:1008
@ OVPN_KEY_SLOT_SECONDARY
@ OVPN_KEY_SLOT_PRIMARY
#define DEV_TYPE_TUN
Definition proto.h:35
#define TOP_SUBNET
Definition proto.h:43
#define SF_USE_IP_PKTINFO
Definition socket.h:191
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
Control Channel Common Data Structures.
#define KEY_SCAN_SIZE
Definition ssl_common.h:567
@ DCO_INSTALLED_PRIMARY
Definition ssl_common.h:185
@ DCO_INSTALLED_SECONDARY
Definition ssl_common.h:186
@ DCO_NOT_INSTALLED
Definition ssl_common.h:184
static struct key_state * get_key_scan(struct tls_multi *multi, int index)
gets an item of key_state objects in the order they should be scanned by data channel modules.
Definition ssl_common.h:733
@ KS_AUTH_TRUE
Key state is authenticated.
Definition ssl_common.h:157
bool tls_item_in_cipher_list(const char *item, const char *list)
Return true iff item is present in the colon-separated zero-terminated cipher list.
Definition ssl_ncp.c:206
Control Channel SSL/Data dynamic negotiation Module This file is split from ssl.h to be able to unit ...
Definition options.h:107
struct local_list * local_list
Definition options.h:108
const char * remote
Definition options.h:114
struct http_proxy_options * http_proxy_options
Definition options.h:122
const char * socks_proxy_server
Definition options.h:123
int fragment
Definition options.h:141
struct tuntap * tuntap
Tun/tap virtual network interface.
Definition openvpn.h:172
bool push_ifconfig_ipv6_defined
Definition openvpn.h:434
bool push_ifconfig_defined
Definition openvpn.h:428
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Definition openvpn.h:323
struct in6_addr push_ifconfig_ipv6_local
Definition openvpn.h:435
struct link_socket ** link_sockets
Definition openvpn.h:237
struct link_socket_info ** link_socket_infos
Definition openvpn.h:238
in_addr_t push_ifconfig_local
Definition openvpn.h:430
Contains all state information for one tunnel.
Definition openvpn.h:474
int mode
Role of this context within the OpenVPN process.
Definition openvpn.h:487
openvpn_net_ctx_t net_ctx
Networking API opaque context.
Definition openvpn.h:501
struct context_2 c2
Level 2 context.
Definition openvpn.h:517
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:475
struct context_1 c1
Level 1 context.
Definition openvpn.h:516
unsigned int flags
Bit-flags determining behavior of security operation functions.
Definition crypto.h:384
struct key_ctx_bi key_ctx_bi
OpenSSL cipher and HMAC contexts for both sending and receiving directions.
Definition crypto.h:294
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:116
Container for bidirectional cipher and HMAC key material.
Definition crypto.h:240
struct key keys[2]
Two unidirectional sets of key material.
Definition crypto.h:243
Container for two sets of OpenSSL cipher and/or HMAC contexts for both sending and receiving directio...
Definition crypto.h:280
Key ordering of the key2.keys array.
Definition crypto.h:259
Security parameter state of one TLS and data channel key session.
Definition ssl_common.h:208
struct crypto_options crypto_options
Definition ssl_common.h:237
enum dco_key_status dco_status
Definition ssl_common.h:271
enum ks_auth_state authenticated
Definition ssl_common.h:259
int key_id
Key id for this key_state, inherited from struct tls_session.
Definition ssl_common.h:217
Container for unidirectional cipher and HMAC key material.
Definition crypto.h:152
uint8_t cipher[MAX_CIPHER_KEY_LENGTH]
Key material for cipher operations.
Definition crypto.h:153
uint8_t hmac[MAX_HMAC_KEY_LENGTH]
Key material for HMAC operations.
Definition crypto.h:155
int proto
Definition options.h:103
struct local_entry ** array
Definition options.h:196
struct mroute_addr::@2::@6 v6
uint8_t addr[OPENVPN_ETH_ALEN]
Definition mroute.h:89
struct mroute_addr::@2::@5 v4
uint8_t type
Definition mroute.h:81
uint8_t netbits
Definition mroute.h:82
Main OpenVPN server state structure.
Definition multi.h:164
struct context top
Storage structure for process-wide configuration.
Definition multi.h:203
Server-mode state structure for one single VPN tunnel.
Definition multi.h:103
struct context context
The context structure storing state for this VPN tunnel.
Definition multi.h:144
union openvpn_sockaddr::@27 addr
struct sockaddr sa
Definition socket_util.h:42
struct connection_list * connection_list
Definition options.h:294
bool use_peer_id
Definition options.h:707
const char * dev_type
Definition options.h:322
struct iroute_ipv6 * iroutes_ipv6
Definition options.h:518
const char * ncp_ciphers
Definition options.h:584
bool tls_server
Definition options.h:598
bool tls_client
Definition options.h:599
struct iroute * iroutes
Definition options.h:517
unsigned int sockflags
Definition options.h:427
const char * dev_node
Definition options.h:323
const char * dev
Definition options.h:321
Security parameter state for a single VPN tunnel.
Definition ssl_common.h:612
dco_context_t * dco
Definition ssl_common.h:726
struct tls_session session[TM_SIZE]
Array of tls_session objects representing control channel sessions with the remote peer.
Definition ssl_common.h:712
int dco_keys_installed
Definition ssl_common.h:716
uint32_t peer_id
Definition ssl_common.h:700
int dco_peer_id
This is the handle that DCO uses to identify this session with the kernel.
Definition ssl_common.h:724
struct key_state key[KS_SIZE]
Definition ssl_common.h:525
dco_context_t dco
Definition tun.h:249
char * actual_name
Definition tun.h:207
SOCKET socket_descriptor_t
Definition syshead.h:440
struct gc_arena gc
Definition test_ssl.c:131
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:521
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
Definition tun.c:503
bool tun_name_is_fixed(const char *dev)
Definition tun.c:1790
#define TUNNEL_TYPE(tt)
Definition tun.h:184
static bool is_tun_afunix(const char *devnode)
Checks whether a –dev-node parameter specifies a AF_UNIX device.
Definition tun_afunix.h:61