16#ifndef OPENVPN_TUN_BUILDER_CLIENT_H
17#define OPENVPN_TUN_BUILDER_CLIENT_H
33 typedef std::unique_ptr<PacketFrom>
SPtr;
42template <
typename ReadHandler>
43class Tun :
public TunIO<ReadHandler, PacketFrom, openvpn_io::posix::stream_descriptor>
50 Tun(openvpn_io::io_context &io_context,
52 const bool retain_sd_arg,
53 const bool tun_prefix_arg,
54 ReadHandler read_handler_arg,
57 :
Base(read_handler_arg, frame_arg, stats_arg)
59 Base::stream =
new openvpn_io::posix::stream_descriptor(io_context, socket);
96 void finalize(
const bool disconnected)
override
148 config->builder->tun_builder_establish_lite();
156 throw tun_builder_error(
"tun_builder_new failed");
183 OPENVPN_LOG(
"TunPersist: saving tun context:" << std::endl
198 catch (
const std::exception &e)
223 if (
state->vpn_ip4_addr.specified())
224 return state->vpn_ip4_addr.to_string();
231 if (
state->vpn_ip6_addr.specified())
232 return state->vpn_ip6_addr.to_string();
239 if (
state->vpn_ip4_gw.specified())
240 return state->vpn_ip4_gw.to_string();
247 if (
state->vpn_ip6_gw.specified())
248 return state->vpn_ip6_gw.to_string();
283 openvpn_io::post(
io_context, [self =
Ptr(
this), opt, &transcli]
287 self->tun_start(opt, transcli, c); });
291 Client(openvpn_io::io_context &io_context_arg,
305 return impl->write(buf);
316 const openvpn_io::error_code *error)
#define OPENVPN_ASYNC_HANDLER
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
T * get() const noexcept
Returns the raw pointer to the object T, or nullptr.
TunBuilder methods, loosely based on the Android VpnService.Builder abstraction.
virtual int tun_builder_establish()
Callback to establish the VPN tunnel.
virtual bool tun_builder_new()
Callback to construct a new TunBuilder. This function should be called first.
void finalize(const bool disconnected) override
EmulateExcludeRouteFactory::Ptr eer_factory
TunPersist::Ptr tun_persist
bool supports_epoch_data() override
TunClient::Ptr new_tun_client_obj(openvpn_io::io_context &io_context, TunClientParent &parent, TransportClient *transcli) override
RCPtr< ClientConfig > Ptr
openvpn_io::io_context & io_context
Client(openvpn_io::io_context &io_context_arg, ClientConfig *config_arg, TunClientParent &parent_arg)
std::string tun_name() const override
void tun_read_handler(PacketFrom::SPtr &pfp)
TunPersist::Ptr tun_persist
bool tun_send(BufferAllocated &buf) override
void set_disconnect() override
void apply_push_update(const OptionList &opt, TransportClient &transcli) override
Notifies tun client about received PUSH_UPDATE control channel message.
TunProp::State::Ptr state
void tun_error_handler(const Error::Type errtype, const openvpn_io::error_code *error)
std::string vpn_gw6() const override
std::string vpn_gw4() const override
int vpn_mtu() const override
void tun_start(const OptionList &opt, TransportClient &transcli, CryptoDCSettings &) override
std::string vpn_ip6() const override
std::string vpn_ip4() const override
TunIO< ReadHandler, PacketFrom, openvpn_io::posix::stream_descriptor > Base
Tun(openvpn_io::io_context &io_context, const int socket, const bool retain_sd_arg, const bool tun_prefix_arg, ReadHandler read_handler_arg, const Frame::Ptr &frame_arg, const SessionStats::Ptr &stats_arg)
openvpn_io::posix::stream_descriptor * stream
static void configure_builder(TunBuilderBase *tb, State *state, SessionStats *stats, const IP::Addr &server_addr, const Config &config, const OptionList &opt, const EmulateExcludeRouteFactory *eer_factory, const bool quiet)
#define OPENVPN_EXCEPTION(C)
#define OPENVPN_LOG(args)
TunPersistTemplate< ScopedFD > TunPersist
virtual IP::Addr server_endpoint_addr() const =0
std::unique_ptr< PacketFrom > SPtr
virtual void tun_error(const Error::Type fatal_err, const std::string &err_text)=0
virtual void tun_connected()=0
virtual void tun_pre_tun_config()=0
virtual void tun_recv(BufferAllocated &buf)=0