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-2024 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, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
24#ifdef HAVE_CONFIG_H
25#include "config.h"
26#endif
27
28#include "syshead.h"
29
30#include "multi.h"
31#include "forward.h"
32#include "mtcp.h"
33#include "multi_io.h"
34
35#include "memdbg.h"
36
37#ifdef HAVE_SYS_INOTIFY_H
38#include <sys/inotify.h>
39#endif
40
42{
43 unsigned int flags;
44 unsigned int ret;
45 unsigned int tun;
46 unsigned int sock;
47};
48
49struct multi_instance *
51{
52 struct gc_arena gc = gc_new();
53 struct multi_instance *mi = NULL;
54 struct hash *hash = m->hash;
55
56 mi = multi_create_instance(m, NULL, sock);
57 if (mi)
58 {
59 mi->real.proto = sock->info.proto;
60 struct hash_element *he;
61 const uint32_t hv = hash_value(hash, &mi->real);
62 struct hash_bucket *bucket = hash_bucket(hash, hv);
63
65
66 he = hash_lookup_fast(hash, bucket, &mi->real, hv);
67
68 if (he)
69 {
70 struct multi_instance *oldmi = (struct multi_instance *) he->value;
71 msg(D_MULTI_LOW, "MULTI TCP: new incoming client address matches existing client address -- new client takes precedence");
72 oldmi->did_real_hash = false;
73 multi_close_instance(m, oldmi, false);
74 he->key = &mi->real;
75 he->value = mi;
76 }
77 else
78 {
79 hash_add_fast(hash, bucket, &mi->real, hv, mi);
80 }
81
82 mi->did_real_hash = true;
83 }
84
85#ifdef ENABLE_DEBUG
86 if (mi)
87 {
88 dmsg(D_MULTI_DEBUG, "MULTI TCP: instance added: %s", mroute_addr_print(&mi->real, &gc));
89 }
90 else
91 {
92 dmsg(D_MULTI_DEBUG, "MULTI TCP: new client instance failed");
93 }
94#endif
95
96 gc_free(&gc);
97 ASSERT(!(mi && mi->halt));
98 return mi;
99}
100
101bool
103{
104 /* buffer for queued TCP socket output packets */
106
111 ASSERT(mi->context.c2.link_sockets[0]->info.lsa->actual.dest.addr.sa.sa_family == AF_INET
112 || mi->context.c2.link_sockets[0]->info.lsa->actual.dest.addr.sa.sa_family == AF_INET6
113 );
114 mi->real.proto = mi->context.c2.link_sockets[0]->info.proto;
117 true))
118 {
119 msg(D_MULTI_ERRORS, "MULTI TCP: TCP client address is undefined");
120 return false;
121 }
122 return true;
123}
124
125void
130
131void
133{
134 if (multi_io && multi_io->es)
135 {
136 event_del(multi_io->es, event);
137 }
138}
139
140void
142{
143 struct link_socket *sock = mi->context.c2.link_sockets[0];
144 if (sock && mi->socket_set_called)
145 {
147 mi->socket_set_called = false;
148 }
149 multi_io->n_esr = 0;
150}
151
152bool
153multi_tcp_process_outgoing_link_ready(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
154{
155 struct mbuf_item item;
156 bool ret = true;
157 ASSERT(mi);
158
159 /* extract from queue */
160 if (mbuf_extract_item(mi->tcp_link_out_deferred, &item)) /* ciphertext IP packet */
161 {
162 dmsg(D_MULTI_TCP, "MULTI TCP: transmitting previously deferred packet");
163
164 ASSERT(mi == item.instance);
165 mi->context.c2.to_link = item.buffer->buf;
166 ret = multi_process_outgoing_link_dowork(m, mi, mpp_flags);
167 if (!ret)
168 {
169 mi = NULL;
170 }
171 mbuf_free_buf(item.buffer);
172 }
173 return ret;
174}
175
176bool
177multi_tcp_process_outgoing_link(struct multi_context *m, bool defer, const unsigned int mpp_flags)
178{
180 bool ret = true;
181
182 if (mi)
183 {
184 if (defer || mbuf_defined(mi->tcp_link_out_deferred))
185 {
186 /* save to queue */
187 struct buffer *buf = &mi->context.c2.to_link;
188 if (BLEN(buf) > 0)
189 {
190 struct mbuf_buffer *mb = mbuf_alloc_buf(buf);
191 struct mbuf_item item;
192
193 set_prefix(mi);
194 dmsg(D_MULTI_TCP, "MULTI TCP: queuing deferred packet");
195 item.buffer = mb;
196 item.instance = mi;
198 mbuf_free_buf(mb);
199 buf_reset(buf);
200 ret = multi_process_post(m, mi, mpp_flags);
201 if (!ret)
202 {
203 mi = NULL;
204 }
205 clear_prefix();
206 }
207 }
208 else
209 {
210 ret = multi_process_outgoing_link_dowork(m, mi, mpp_flags);
211 if (!ret)
212 {
213 mi = NULL;
214 }
215 }
216 }
217 return ret;
218}
static void buf_reset(struct buffer *buf)
Definition buffer.h:303
#define BLEN(buf)
Definition buffer.h:127
static void gc_free(struct gc_arena *a)
Definition buffer.h:1033
static struct gc_arena gc_new(void)
Definition buffer.h:1025
#define D_MULTI_ERRORS
Definition errlevel.h:65
#define D_MULTI_DEBUG
Definition errlevel.h:127
#define D_MULTI_TCP
Definition errlevel.h:163
#define D_MULTI_LOW
Definition errlevel.h:86
static void event_del(struct event_set *es, event_t event)
Definition event.h:175
Interface functions to the internal and external multiplexers.
struct hash_element * hash_lookup_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint32_t hv)
Definition list.c:83
static uint32_t hash_value(const struct hash *hash, const void *key)
Definition list.h:116
static void hash_add_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint32_t hv, void *value)
Definition list.h:158
void mbuf_add_item(struct mbuf_set *ms, const struct mbuf_item *item)
Definition mbuf.c:89
struct mbuf_buffer * mbuf_alloc_buf(const struct buffer *buf)
Definition mbuf.c:65
void mbuf_free_buf(struct mbuf_buffer *mb)
Definition mbuf.c:76
bool mbuf_extract_item(struct mbuf_set *ms, struct mbuf_item *item)
Definition mbuf.c:111
void mbuf_free(struct mbuf_set *ms)
Definition mbuf.c:49
struct mbuf_set * mbuf_init(unsigned int size)
Definition mbuf.c:39
static bool mbuf_defined(const struct mbuf_set *ms)
Definition mbuf.h:80
bool mroute_extract_openvpn_sockaddr(struct mroute_addr *addr, const struct openvpn_sockaddr *osaddr, bool use_port)
Definition mroute.c:264
const char * mroute_addr_print(const struct mroute_addr *ma, struct gc_arena *gc)
Definition mroute.c:384
void multi_tcp_instance_specific_free(struct multi_instance *mi)
Definition mtcp.c:126
struct multi_instance * multi_create_instance_tcp(struct multi_context *m, struct link_socket *sock)
Definition mtcp.c:50
void multi_tcp_delete_event(struct multi_io *multi_io, event_t event)
Definition mtcp.c:132
bool multi_tcp_instance_specific_init(struct multi_context *m, struct multi_instance *mi)
Definition mtcp.c:102
bool multi_tcp_process_outgoing_link(struct multi_context *m, bool defer, const unsigned int mpp_flags)
Definition mtcp.c:177
bool multi_tcp_process_outgoing_link_ready(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
Definition mtcp.c:153
void multi_tcp_dereference_instance(struct multi_io *multi_io, struct multi_instance *mi)
Definition mtcp.c:141
struct multi_instance * multi_create_instance(struct multi_context *m, const struct mroute_addr *real, struct link_socket *sock)
Definition multi.c:756
bool multi_process_post(struct multi_context *m, struct multi_instance *mi, const unsigned int flags)
Perform postprocessing of a VPN tunnel instance.
Definition multi.c:3048
void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
Definition multi.c:604
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:4155
Header file for server-mode related structures and functions.
static void set_prefix(struct multi_instance *mi)
Definition multi.h:544
static void clear_prefix(void)
Definition multi.h:556
static struct multi_instance * multi_process_outgoing_link_pre(struct multi_context *m)
Definition multi.h:432
static bool multi_process_outgoing_link_dowork(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
Definition multi.h:683
#define dmsg(flags,...)
Definition error.h:148
#define msg(flags,...)
Definition error.h:144
#define ASSERT(x)
Definition error.h:195
static event_t socket_event_handle(const struct link_socket *sock)
Definition socket.h:1259
#define LS_MODE_TCP_ACCEPT_FROM
Definition socket.h:211
Wrapper structure for dynamically allocated memory.
Definition buffer.h:61
struct buffer to_link
Definition openvpn.h:377
struct link_socket ** link_sockets
Definition openvpn.h:237
struct context_2 c2
Level 2 context.
Definition openvpn.h:514
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:475
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:117
void * value
Definition list.h:45
const void * key
Definition list.h:46
Definition list.h:57
struct buffer buf
Definition mbuf.h:43
struct mbuf_buffer * buffer
Definition mbuf.h:52
struct multi_instance * instance
Definition mbuf.h:53
uint8_t proto
Definition mroute.h:80
Main OpenVPN server state structure.
Definition multi.h:163
struct hash * hash
VPN tunnel instances indexed by real address of the remote peer.
Definition multi.h:167
struct context top
Storage structure for process-wide configuration.
Definition multi.h:202
Server-mode state structure for one single VPN tunnel.
Definition multi.h:103
struct mbuf_set * tcp_link_out_deferred
Definition multi.h:129
struct mroute_addr real
External network address of the remote peer.
Definition multi.h:122
bool socket_set_called
Definition multi.h:130
bool did_real_hash
Definition multi.h:135
struct context context
The context structure storing state for this VPN tunnel.
Definition multi.h:144
struct event_set * es
Definition multi_io.h:54
int n_esr
Definition multi_io.h:56
union openvpn_sockaddr::@20 addr
struct sockaddr sa
Definition socket.h:69
int n_bcast_buf
Definition options.h:508
unsigned int flags
Definition mtcp.c:43
unsigned int ret
Definition mtcp.c:44
unsigned int tun
Definition mtcp.c:45
unsigned int sock
Definition mtcp.c:46
struct gc_arena gc
Definition test_ssl.c:155