OpenVPN
mtcp.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) 2002-2026 OpenVPN Inc <sales@openvpn.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, see <https://www.gnu.org/licenses/>.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include "config.h"
25#endif
26
27#include "syshead.h"
28
29#include "multi.h"
30#include "forward.h"
31#include "mtcp.h"
32#include "multi_io.h"
33
34#include "memdbg.h"
35
36#ifdef HAVE_SYS_INOTIFY_H
37#include <sys/inotify.h>
38#endif
39
40struct multi_instance *
42{
43 struct gc_arena gc = gc_new();
44 struct multi_instance *mi = NULL;
45
46 mi = multi_create_instance(m, NULL, sock);
47 if (mi)
48 {
49 mi->real.proto = sock->info.proto;
51 }
52
53#ifndef ENABLE_SMALL
54 if (mi)
55 {
56 dmsg(D_MULTI_DEBUG, "MULTI TCP: instance added: %s", mroute_addr_print(&mi->real, &gc));
57 }
58 else
59 {
60 dmsg(D_MULTI_DEBUG, "MULTI TCP: new client instance failed");
61 }
62#endif
63
64 gc_free(&gc);
65 ASSERT(!(mi && mi->halt));
66 return mi;
67}
68
69bool
71{
72 /* buffer for queued TCP socket output packets */
74
79 ASSERT(mi->context.c2.link_sockets[0]->info.lsa->actual.dest.addr.sa.sa_family == AF_INET
80 || mi->context.c2.link_sockets[0]->info.lsa->actual.dest.addr.sa.sa_family == AF_INET6);
83 &mi->real, &mi->context.c2.link_sockets[0]->info.lsa->actual.dest, true))
84 {
85 msg(D_MULTI_ERRORS, "MULTI TCP: TCP client address is undefined");
86 return false;
87 }
88 return true;
89}
90
91void
96
97void
99{
100 if (multi_io && multi_io->es)
101 {
102 event_del(multi_io->es, event);
103 }
104}
105
106void
108{
109 const struct link_socket *sock = mi->context.c2.link_sockets[0];
110 if (sock && mi->socket_set_called)
111 {
113 mi->socket_set_called = false;
114 }
115 multi_io->n_esr = 0;
116}
117
118void
120{
121 if (mi && !proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto))
122 {
123 mi->socket_set_called = true;
126 &mi->tcp_rwflags);
127 }
128}
static void gc_free(struct gc_arena *a)
Free all allocations in a garbage collection arena.
Definition buffer.h:1965
static struct gc_arena gc_new(void)
Allocate and return a new, empty garbage collection arena.
Definition buffer.h:1949
#define D_MULTI_ERRORS
Definition errlevel.h:64
#define D_MULTI_DEBUG
Definition errlevel.h:126
static void event_del(struct event_set *es, event_t event)
Definition event.h:174
#define EVENT_WRITE
Definition event.h:38
#define EVENT_READ
Definition event.h:37
Interface functions to the internal and external multiplexers.
void mbuf_free(struct mbuf_set *ms)
Definition mbuf.c:50
struct mbuf_set * mbuf_init(unsigned int size)
Definition mbuf.c:38
static bool mbuf_defined(const struct mbuf_set *ms)
Definition mbuf.h:81
bool mroute_extract_openvpn_sockaddr(struct mroute_addr *addr, const struct openvpn_sockaddr *osaddr, bool use_port)
Definition mroute.c:255
const char * mroute_addr_print(const struct mroute_addr *ma, struct gc_arena *gc)
Definition mroute.c:372
void multi_tcp_set_global_rw_flags(struct multi_context *m, struct multi_instance *mi)
Definition mtcp.c:119
bool multi_tcp_instance_specific_init(const struct multi_context *m, struct multi_instance *mi)
Definition mtcp.c:70
void multi_tcp_instance_specific_free(struct multi_instance *mi)
Definition mtcp.c:92
struct multi_instance * multi_create_instance_tcp(struct multi_context *m, struct link_socket *sock)
Definition mtcp.c:41
void multi_tcp_delete_event(struct multi_io *multi_io, event_t event)
Definition mtcp.c:98
void multi_tcp_dereference_instance(struct multi_io *multi_io, struct multi_instance *mi)
Definition mtcp.c:107
struct multi_instance * multi_create_instance(struct multi_context *m, const struct mroute_addr *real, struct link_socket *sock)
Definition multi.c:726
void multi_assign_peer_id(struct multi_context *m, struct multi_instance *mi)
Assigns a peer-id to a a client and adds the instance to the the instances array of the multi_context...
Definition multi.c:4256
Header file for server-mode related structures and functions.
#define dmsg(flags,...)
Definition error.h:164
#define msg(flags,...)
Definition error.h:152
#define ASSERT(x)
Definition error.h:221
unsigned int socket_set(struct link_socket *s, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
Definition socket.c:2594
static event_t socket_event_handle(const struct link_socket *sock)
Definition socket.h:797
#define LS_MODE_TCP_ACCEPT_FROM
Definition socket.h:189
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
struct link_socket ** link_sockets
Definition openvpn.h:238
struct context_2 c2
Level 2 context.
Definition openvpn.h:516
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:472
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:127
uint8_t proto
Definition mroute.h:84
Main OpenVPN server state structure.
Definition multi.h:170
struct multi_io * multi_io
I/O state and events tracker.
Definition multi.h:193
struct context top
Storage structure for process-wide configuration.
Definition multi.h:217
Server-mode state structure for one single VPN tunnel.
Definition multi.h:102
struct mbuf_set * tcp_link_out_deferred
Definition multi.h:128
unsigned int tcp_rwflags
Definition multi.h:127
struct mroute_addr real
External network address of the remote peer.
Definition multi.h:121
bool socket_set_called
Definition multi.h:129
struct event_arg ev_arg
this struct will store a pointer to either mi or link_socket, depending on the event type,...
Definition multi.h:107
struct context context
The context structure storing state for this VPN tunnel.
Definition multi.h:150
struct event_set * es
Definition multi_io.h:53
int n_esr
Definition multi_io.h:55
union openvpn_sockaddr::@27 addr
struct sockaddr sa
Definition socket_util.h:42
int n_bcast_buf
Definition options.h:510
struct gc_arena gc
Definition test_ssl.c:138