OpenVPN 3 Core Library
Loading...
Searching...
No Matches
relay.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12// Create a special transport factory that persists an existing
13// transport client. This is used to preserve the transport
14// socket when other client components are restarted after
15// a RELAY message is received from the server.
16
17#ifndef OPENVPN_TRANSPORT_CLIENT_RELAY_H
18#define OPENVPN_TRANSPORT_CLIENT_RELAY_H
19
20#include <memory>
21
23
24namespace openvpn {
26{
27 public:
28 TransportRelayFactory(openvpn_io::io_context &io_context,
29 TransportClient::Ptr transport,
30 TransportClientParent *old_parent)
31 : io_context_(io_context),
32 transport_(std::move(transport)),
33 null_parent_(new NullParent(old_parent))
34 {
35 // Temporarily point transport to our null parent
37 }
38
40 {
41 public:
48
49 private:
50 void transport_start() override
51 {
52 }
53 void stop() override
54 {
55 }
56 bool transport_send_const(const Buffer &buf) override
57 {
58 return false;
59 }
60 bool transport_send(BufferAllocated &buf) override
61 {
62 return false;
63 }
65 {
66 return false;
67 }
69 {
70 return false;
71 }
72 size_t transport_send_queue_size() override
73 {
74 return 0;
75 }
77 {
78 }
79 void reset_align_adjust(const size_t align_adjust) override
80 {
81 }
83 {
84 }
85
87 {
88 return endpoint_;
89 }
90
92 {
93 return protocol_;
94 }
95
96 void server_endpoint_info(std::string &host, std::string &port, std::string &proto, std::string &ip_addr) const override
97 {
98 host = host_;
99 port = port_;
100 proto = proto_;
101 ip_addr = ip_addr_;
102 }
103
106 std::string host_;
107 std::string port_;
108 std::string proto_;
109 std::string ip_addr_;
110 };
111
112 private:
114 {
115 public:
120
121 private:
122 void transport_recv(BufferAllocated &buf) override
123 {
124 }
125 void transport_needs_send() override
126 {
127 }
128
129 void transport_error(const Error::Type fatal_err, const std::string &err_text) override
130 {
131 OPENVPN_LOG("TransportRelayFactory: Transport Error in null parent: " << Error::name(fatal_err) << " : " << err_text);
132 }
133
134 void proxy_error(const Error::Type fatal_err, const std::string &err_text) override
135 {
136 OPENVPN_LOG("TransportRelayFactory: Proxy Error in null parent: " << Error::name(fatal_err) << " : " << err_text);
137 }
138
139 // Return true if we are transporting OpenVPN protocol
141 {
142 return is_openvpn_protocol;
143 }
144
145 // progress notifications
146 void transport_pre_resolve() override
147 {
148 }
149 void transport_wait_proxy() override
150 {
151 }
152 void transport_wait() override
153 {
154 }
155 void transport_connecting() override
156 {
157 }
158
159 // Return true if keepalive parameter(s) are enabled.
160 bool is_keepalive_enabled() const override
161 {
162 return false;
163 }
164
165 // Disable keepalive for rest of session, but fetch
166 // the keepalive parameters (in seconds).
167 void disable_keepalive(unsigned int &keepalive_ping, unsigned int &keepalive_timeout) override
168 {
169 keepalive_ping = 0;
170 keepalive_timeout = 0;
171 }
172
174 };
175
176 TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context,
177 TransportClientParent *parent) override
178 {
179 // io_context MUST stay consistent
180 if (&io_context != &io_context_)
181 throw Exception("TransportRelayFactory: inconsistent io_context");
182
184 return transport_;
185 }
186
187 bool is_relay() override
188 {
189 return true;
190 }
191
192 openvpn_io::io_context &io_context_; // only used to verify consistency
193 TransportClient::Ptr transport_; // the persisted transport
194 std::unique_ptr<TransportClientParent> null_parent_; // placeholder for TransportClient parent before reparenting
195};
196} // namespace openvpn
197
198#endif
void proxy_error(const Error::Type fatal_err, const std::string &err_text) override
Definition relay.hpp:134
void disable_keepalive(unsigned int &keepalive_ping, unsigned int &keepalive_timeout) override
Definition relay.hpp:167
NullParent(TransportClientParent *old_parent)
Definition relay.hpp:116
void transport_recv(BufferAllocated &buf) override
Definition relay.hpp:122
bool is_keepalive_enabled() const override
Definition relay.hpp:160
void transport_error(const Error::Type fatal_err, const std::string &err_text) override
Definition relay.hpp:129
bool transport_send(BufferAllocated &buf) override
Definition relay.hpp:60
void reset_align_adjust(const size_t align_adjust) override
Definition relay.hpp:79
void server_endpoint_info(std::string &host, std::string &port, std::string &proto, std::string &ip_addr) const override
Definition relay.hpp:96
void transport_reparent(TransportClientParent *parent) override
Definition relay.hpp:82
IP::Addr server_endpoint_addr() const override
Definition relay.hpp:86
bool transport_send_const(const Buffer &buf) override
Definition relay.hpp:56
TransportClient::Ptr new_transport_client_obj(openvpn_io::io_context &io_context, TransportClientParent *parent) override
Definition relay.hpp:176
openvpn_io::io_context & io_context_
Definition relay.hpp:192
TransportRelayFactory(openvpn_io::io_context &io_context, TransportClient::Ptr transport, TransportClientParent *old_parent)
Definition relay.hpp:28
TransportClient::Ptr transport_
Definition relay.hpp:193
std::unique_ptr< TransportClientParent > null_parent_
Definition relay.hpp:194
#define OPENVPN_LOG(args)
const char * name(const size_t type)
Definition error.hpp:117
virtual void transport_reparent(TransportClientParent *parent)=0
virtual void server_endpoint_info(std::string &host, std::string &port, std::string &proto, std::string &ip_addr) const =0
proxy_host_port port
proxy_host_port host