OpenVPN
src
openvpn
ping.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-2022 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
#elif defined(_MSC_VER)
27
#include "
config-msvc.h
"
28
#endif
29
30
#include "
syshead.h
"
31
32
#include "
ping.h
"
33
34
#include "
memdbg.h
"
35
36
37
/*
38
* This random string identifies an OpenVPN ping packet.
39
* It should be of sufficient length and randomness
40
* so as not to collide with other tunnel data.
41
*
42
* PING_STRING_SIZE must be sizeof (ping_string)
43
*/
44
const
uint8_t
ping_string
[] = {
45
0x2a, 0x18, 0x7b, 0xf3, 0x64, 0x1e, 0xb4, 0xcb,
46
0x07, 0xed, 0x2d, 0x0a, 0x98, 0x1f, 0xc7, 0x48
47
};
48
49
void
50
trigger_ping_timeout_signal
(
struct
context
*c)
51
{
52
struct
gc_arena
gc =
gc_new
();
53
switch
(c->
options
.
ping_rec_timeout_action
)
54
{
55
case
PING_EXIT
:
56
msg
(
M_INFO
,
"%sInactivity timeout (--ping-exit), exiting"
,
57
format_common_name
(c, &gc));
58
c->
sig
->
signal_received
=
SIGTERM
;
59
c->
sig
->
signal_text
=
"ping-exit"
;
60
break
;
61
62
case
PING_RESTART
:
63
msg
(
M_INFO
,
"%sInactivity timeout (--ping-restart), restarting"
,
64
format_common_name
(c, &gc));
65
c->
sig
->
signal_received
=
SIGUSR1
;
/* SOFT-SIGUSR1 -- Ping Restart */
66
c->
sig
->
signal_text
=
"ping-restart"
;
67
break
;
68
69
default
:
70
ASSERT
(0);
71
}
72
gc_free
(&gc);
73
}
74
75
/*
76
* Should we ping the remote?
77
*/
78
void
79
check_ping_send_dowork
(
struct
context
*c)
80
{
81
c->
c2
.
buf
= c->
c2
.
buffers
->
aux_buf
;
82
ASSERT
(
buf_init
(&c->
c2
.
buf
, c->
c2
.
frame
.
buf
.
headroom
));
83
ASSERT
(
buf_safe
(&c->
c2
.
buf
, c->
c2
.
frame
.
buf
.
payload_size
));
84
ASSERT
(
buf_write
(&c->
c2
.
buf
,
ping_string
,
sizeof
(
ping_string
)));
85
86
/*
87
* We will treat the ping like any other outgoing packet,
88
* encrypt, sign, etc.
89
*/
90
encrypt_sign
(c,
true
);
91
/* Set length to 0, so it won't be counted as activity */
92
c->
c2
.
buf
.
len
= 0;
93
dmsg
(
D_PING
,
"SENT PING"
);
94
}
buf_safe
static bool buf_safe(const struct buffer *buf, size_t len)
Definition:
buffer.h:525
signal_info::signal_received
volatile int signal_received
Definition:
sig.h:45
M_INFO
#define M_INFO
Definition:
errlevel.h:55
gc_new
static struct gc_arena gc_new(void)
Definition:
buffer.h:998
signal_info::signal_text
const char * signal_text
Definition:
sig.h:47
buffer::len
int len
Length in bytes of the actual content within the allocated memory.
Definition:
buffer.h:66
context_2::buf
struct buffer buf
Definition:
openvpn.h:371
buf_init
#define buf_init(buf, offset)
Definition:
buffer.h:196
context
Contains all state information for one tunnel.
Definition:
openvpn.h:467
config-msvc.h
frame::buf
struct frame::@5 buf
dmsg
#define dmsg(flags,...)
Definition:
error.h:154
ping_string
const uint8_t ping_string[]
Definition:
ping.c:44
context_2::buffers
struct context_buffers * buffers
Definition:
openvpn.h:363
check_ping_send_dowork
void check_ping_send_dowork(struct context *c)
Definition:
ping.c:79
PING_RESTART
#define PING_RESTART
Definition:
options.h:326
context::c2
struct context_2 c2
Level 2 context.
Definition:
openvpn.h:508
ASSERT
#define ASSERT(x)
Definition:
error.h:201
ping.h
encrypt_sign
void encrypt_sign(struct context *c, bool comp_frag)
Process a data channel packet that will be sent through a VPN tunnel.
Definition:
forward.c:527
frame::payload_size
int payload_size
the maximum size that a payload that our buffers can hold from either tun device or network link.
Definition:
mtu.h:97
D_PING
#define D_PING
Definition:
errlevel.h:141
context::options
struct options options
Options loaded from command line or configuration file.
Definition:
openvpn.h:469
format_common_name
const char * format_common_name(struct context *c, struct gc_arena *gc)
Definition:
init.c:1223
trigger_ping_timeout_signal
void trigger_ping_timeout_signal(struct context *c)
Trigger the correct signal on a –ping timeout depending if –ping-exit is set (SIGTERM) or not (SIGUSR...
Definition:
ping.c:50
buf_write
static bool buf_write(struct buffer *dest, const void *src, size_t size)
Definition:
buffer.h:673
context_buffers::aux_buf
struct buffer aux_buf
Definition:
openvpn.h:94
context_2::frame
struct frame frame
Definition:
openvpn.h:248
syshead.h
SIGTERM
#define SIGTERM
Definition:
config-msvc.h:82
gc_arena
Garbage collection arena used to keep track of dynamically allocated memory.
Definition:
buffer.h:116
SIGUSR1
#define SIGUSR1
Definition:
config-msvc.h:80
context::sig
struct signal_info * sig
Internal error signaling object.
Definition:
openvpn.h:494
PING_EXIT
#define PING_EXIT
Definition:
options.h:325
gc_free
static void gc_free(struct gc_arena *a)
Definition:
buffer.h:1006
config.h
memdbg.h
options::ping_rec_timeout_action
int ping_rec_timeout_action
Definition:
options.h:327
msg
#define msg(flags,...)
Definition:
error.h:150
frame::headroom
int headroom
the headroom in the buffer, this is choosen to allow all potential header to be added before the pack...
Definition:
mtu.h:103
Generated by
1.8.17