OpenVPN
reliable.h
Go to the documentation of this file.
1/*
2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single 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
30#ifndef RELIABLE_H
31#define RELIABLE_H
32
33#include "basic.h"
34#include "buffer.h"
35#include "packet_id.h"
36#include "session_id.h"
37#include "mtu.h"
38
43#define RELIABLE_ACK_SIZE 8
49#define RELIABLE_CAPACITY 12
54#define N_ACK_RETRANSMIT 3
59#define RELIABLE_MAX_TIMEOUT_SHIFT 6
65#define RELIABLE_MAX_INITIAL_TIMEOUT (1 << 16)
79
80/* The size of the ACK header */
81#define ACK_SIZE(n) (sizeof(uint8_t) + ((n) ? SID_SIZE : 0) + sizeof(packet_id_type) * (n))
82
88{
89 bool active;
91 time_t next_try;
93 size_t n_acks; /* Number of acks received for packets with higher PID.
94 * Used for fast retransmission when there were at least
95 * N_ACK_RETRANSMIT. */
96 int opcode;
97 struct buffer buf;
98};
99
105{
106 int size;
109 int offset;
110 bool hold; /* don't xmit until reliable_schedule_now is called */
112};
113
114
115/**************************************************************************/
137bool reliable_ack_read(struct reliable_ack *ack, struct buffer *buf, const struct session_id *sid);
138
139
157bool reliable_ack_parse(struct buffer *buf, struct reliable_ack *ack,
158 struct session_id *session_id_remote);
159
167void reliable_send_purge(struct reliable *rel, const struct reliable_ack *ack);
168
172/**************************************************************************/
186static inline bool
188{
189 return !ack->len;
190}
191
200int
202
210static inline int
212{
213 return ack->len;
214}
215
216
238bool reliable_ack_write(struct reliable_ack *ack, struct reliable_ack *ack_mru, struct buffer *buf,
239 const struct session_id *sid, int max, bool prepend);
240
244/**************************************************************************/
260void reliable_init(struct reliable *rel, int buf_size, int offset, int array_size, bool hold);
261
269void reliable_free(struct reliable *rel);
270
274/**************************************************************************/
288bool reliable_can_get(const struct reliable *rel);
289
301bool reliable_not_replay(const struct reliable *rel, packet_id_type id);
302
326
338
350struct buffer *reliable_get_buf(struct reliable *rel);
351
362 int opcode);
363
378
382/**************************************************************************/
396
397
405void copy_acks_to_mru(struct reliable_ack *ack, struct reliable_ack *ack_mru, int n);
406
407
414void reliable_mark_deleted(struct reliable *rel, struct buffer *buf);
415
419/**************************************************************************/
436
437
449
461void reliable_mark_active_outgoing(struct reliable *rel, struct buffer *buf, int opcode);
462
466/**************************************************************************/
482bool reliable_can_send(const struct reliable *rel);
483
501struct buffer *reliable_send(struct reliable *rel, int *opcode);
502
506/**************************************************************************/
520bool reliable_empty(const struct reliable *rel);
521
534
543
544void reliable_debug_print(const struct reliable *rel, char *desc);
545
546/* set sending timeout (after this time we send again until ACK) */
547static inline void
549{
550 rel->initial_timeout = timeout;
551}
552
553/* print a reliable ACK record coming off the wire */
554const char *reliable_ack_print(struct buffer *buf, bool verbose, struct gc_arena *gc);
555
557
564#endif /* RELIABLE_H */
Buffer management functions and garbage collection.
int interval_t
Definition common.h:37
void reliable_free(struct reliable *rel)
Free allocated memory associated with a reliable structure and the pointer itself.
Definition reliable.c:364
bool reliable_ack_read(struct reliable_ack *ack, struct buffer *buf, const struct session_id *sid)
Read an acknowledgment record from a received packet.
Definition reliable.c:144
struct buffer * reliable_get_buf_output_sequenced(struct reliable *rel)
Get the buffer of free reliable entry and check whether the outgoing acknowledgment sequence is still...
Definition reliable.c:595
void reliable_schedule_now(struct reliable *rel)
Reschedule all entries of a reliable structure to be ready for (re)sending immediately.
Definition reliable.c:719
void reliable_ack_debug_print(const struct reliable_ack *ack, char *desc)
bool reliable_ack_read_packet_id(struct buffer *buf, packet_id_type *pid)
Read the packet ID of a received packet.
Definition reliable.c:109
static int reliable_ack_outstanding(struct reliable_ack *ack)
Returns the number of packets that need to be acked.
Definition reliable.h:211
void reliable_mark_active_incoming(struct reliable *rel, struct buffer *buf, packet_id_type pid, int opcode)
Mark the reliable entry associated with the given buffer as active incoming.
Definition reliable.c:771
void reliable_mark_active_outgoing(struct reliable *rel, struct buffer *buf, int opcode)
Mark the reliable entry associated with the given buffer as active outgoing.
Definition reliable.c:804
const char * reliable_ack_print(struct buffer *buf, bool verbose, struct gc_arena *gc)
Definition reliable.c:305
bool reliable_ack_acknowledge_packet_id(struct reliable_ack *ack, packet_id_type pid)
Record a packet ID for later acknowledgment.
Definition reliable.c:127
bool reliable_ack_parse(struct buffer *buf, struct reliable_ack *ack, struct session_id *session_id_remote)
Parse an acknowledgment record from a received packet.
Definition reliable.c:166
bool reliable_ack_write(struct reliable_ack *ack, struct reliable_ack *ack_mru, struct buffer *buf, const struct session_id *sid, int max, bool prepend)
Write a packet ID acknowledgment record to a buffer.
Definition reliable.c:248
static void reliable_set_timeout(struct reliable *rel, interval_t timeout)
Definition reliable.h:548
int validate_packet_id_window(struct reliable *rel, packet_id_type pid)
check that pid is inside the window of possible outstanding packets of size RELIABLE_CAPACITY,...
Definition reliable.c:394
bool reliable_can_get(const struct reliable *rel)
Check whether a reliable structure has any free buffers available for use.
Definition reliable.c:487
void reliable_send_purge(struct reliable *rel, const struct reliable_ack *ack)
Remove acknowledged packets from a reliable structure.
Definition reliable.c:402
struct buffer * reliable_get_buf(struct reliable *rel)
Get the buffer of a free reliable entry in which to store a packet.
Definition reliable.c:551
struct buffer * reliable_send(struct reliable *rel, int *opcode)
Get the next packet to send to the remote peer.
Definition reliable.c:671
bool reliable_can_send(const struct reliable *rel)
Check whether a reliable structure has any active entries ready to be (re)sent.
Definition reliable.c:645
bool reliable_empty(const struct reliable *rel)
Check whether a reliable structure is empty.
Definition reliable.c:380
void reliable_debug_print(const struct reliable *rel, char *desc)
bool reliable_not_replay(const struct reliable *rel, packet_id_type id)
Check that a received packet's ID is not a replay.
Definition reliable.c:505
#define RELIABLE_ACK_SIZE
The maximum number of packet IDs waiting to be acknowledged which can be stored in one reliable_ack s...
Definition reliable.h:43
interval_t reliable_send_timeout(const struct reliable *rel)
Determined how many seconds until the earliest resend should be attempted.
Definition reliable.c:737
#define RELIABLE_CAPACITY
The maximum number of packets that the reliability layer for one VPN tunnel in one direction can stor...
Definition reliable.h:49
struct reliable_entry * reliable_get_entry_sequenced(struct reliable *rel)
Get the buffer of the next sequential and active entry.
Definition reliable.c:630
void reliable_init(struct reliable *rel, int buf_size, int offset, int array_size, bool hold)
Initialize a reliable structure.
Definition reliable.c:348
void copy_acks_to_mru(struct reliable_ack *ack, struct reliable_ack *ack_mru, int n)
Copies the first n acks from ack to ack_mru.
Definition reliable.c:204
void reliable_mark_deleted(struct reliable *rel, struct buffer *buf)
Remove an entry from a reliable structure.
Definition reliable.c:831
int reliable_get_num_output_sequenced_available(struct reliable *rel)
Counts the number of free buffers in output that can be potentially used for sending.
Definition reliable.c:566
bool reliable_wont_break_sequentiality(const struct reliable *rel, packet_id_type id)
Check that a received packet's ID can safely be stored in the reliable structure's processing window.
Definition reliable.c:532
static bool reliable_ack_empty(struct reliable_ack *ack)
Check whether an acknowledgment structure contains any packet IDs to be acknowledged.
Definition reliable.h:187
uint32_t packet_id_type
Definition packet_id.h:45
Wrapper structure for dynamically allocated memory.
Definition buffer.h:71
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:76
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:127
The acknowledgment structure in which packet IDs are stored for later acknowledgment.
Definition reliable.h:75
The structure in which the reliability layer stores a single incoming or outgoing packet.
Definition reliable.h:88
struct buffer buf
Definition reliable.h:97
int opcode
Definition reliable.h:96
time_t next_try
Definition reliable.h:91
size_t n_acks
Definition reliable.h:93
packet_id_type packet_id
Definition reliable.h:92
bool active
Definition reliable.h:89
interval_t timeout
Definition reliable.h:90
The reliability layer storage structure for one VPN tunnel's control channel in one direction.
Definition reliable.h:105
struct reliable_entry array[RELIABLE_CAPACITY]
Definition reliable.h:111
bool hold
Definition reliable.h:110
int size
Definition reliable.h:106
packet_id_type packet_id
Packet ID for the next packet to be sent out.
Definition reliable.h:108
interval_t initial_timeout
Definition reliable.h:107
int offset
Offset of the bufs in the reliable_entry array.
Definition reliable.h:109
struct gc_arena gc
Definition test_ssl.c:122