forked from OpenVPN/openvpn3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
transbase.hpp
132 lines (113 loc) · 4.62 KB
/
transbase.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// OpenVPN -- An application to securely tunnel IP networks
// over a single port, with support for SSL/TLS-based
// session authentication and key exchange,
// packet encryption, packet authentication, and
// packet compression.
//
// Copyright (C) 2012-2022 OpenVPN Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License Version 3
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program in the COPYING file.
// If not, see <http://www.gnu.org/licenses/>.
// Abstract base classes for client transport objects that implement UDP, TCP,
// HTTP Proxy, etc.
#ifndef OPENVPN_TRANSPORT_CLIENT_TRANSBASE_H
#define OPENVPN_TRANSPORT_CLIENT_TRANSBASE_H
#include <string>
#include <openvpn/io/io.hpp>
#include <openvpn/common/exception.hpp>
#include <openvpn/common/rc.hpp>
#include <openvpn/buffer/buffer.hpp>
#include <openvpn/addr/ip.hpp>
#include <openvpn/error/error.hpp>
#include <openvpn/crypto/cryptodc.hpp>
#include <openvpn/transport/protocol.hpp>
namespace openvpn {
struct TransportClientParent;
// Base class for client transport object.
struct TransportClient : public virtual RC<thread_unsafe_refcount>
{
typedef RCPtr<TransportClient> Ptr;
virtual void transport_start() = 0;
virtual void stop() = 0;
virtual bool transport_send_const(const Buffer &buf) = 0;
virtual bool transport_send(BufferAllocated &buf) = 0;
virtual bool transport_send_queue_empty() = 0;
virtual bool transport_has_send_queue() = 0;
virtual void transport_stop_requeueing() = 0;
virtual size_t transport_send_queue_size() = 0;
virtual void reset_align_adjust(const size_t align_adjust) = 0;
virtual IP::Addr server_endpoint_addr() const = 0;
virtual unsigned short server_endpoint_port() const
{
return 0;
}
virtual openvpn_io::detail::socket_type native_handle()
{
return 0;
}
// clang-format off
virtual void server_endpoint_info(std::string &host,
std::string &port,
std::string &proto,
std::string &ip_addr) const = 0;
// clang-format on
virtual Protocol transport_protocol() const = 0;
virtual void transport_reparent(TransportClientParent *parent) = 0;
};
// Base class for parent of client transport object, used by client transport
// objects to communicate received data packets, exceptions, and progress
// notifications.
struct TransportClientParent
{
virtual void transport_recv(BufferAllocated &buf) = 0;
virtual void transport_needs_send() = 0; // notification that send queue is empty
virtual void transport_error(const Error::Type fatal_err, const std::string &err_text) = 0;
virtual void proxy_error(const Error::Type fatal_err, const std::string &err_text) = 0;
// Return true if we are transporting OpenVPN protocol
virtual bool transport_is_openvpn_protocol() = 0;
// progress notifications
virtual void transport_pre_resolve() = 0;
virtual void transport_wait_proxy() = 0;
virtual void transport_wait() = 0;
virtual void transport_connecting() = 0;
// Return true if keepalive parameter(s) are enabled.
virtual bool is_keepalive_enabled() const = 0;
// clang-format off
// Disable keepalive for rest of session, but fetch
// the keepalive parameters (in seconds).
virtual void disable_keepalive(unsigned int &keepalive_ping,
unsigned int &keepalive_timeout) = 0;
// clang-format on
virtual ~TransportClientParent()
{
}
};
// Factory for client transport object.
struct TransportClientFactory : public virtual RC<thread_unsafe_refcount>
{
typedef RCPtr<TransportClientFactory> Ptr;
// clang-format off
virtual TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context,
TransportClientParent *parent) = 0;
// clang-format on
virtual bool is_relay()
{
return false;
}
virtual void process_push(const OptionList &)
{
return;
}
};
} // namespace openvpn
#endif // OPENVPN_TRANSPORT_CLIENT_TRANSBASE_H