31template <
typename ReadHandler,
typename PacketFrom,
typename STREAM>
32class TunIO :
public RC<thread_unsafe_refcount>
37 TunIO(ReadHandler read_handler_arg,
47 TunIO(ReadHandler read_handler_arg,
103 if (wrote == buf.
size())
112 catch (openvpn_io::system_error &e)
115 const openvpn_io::error_code code(e.code());
124 template <
class BUFSEQ>
132 const size_t wrote =
stream->write_some(bs);
138 if (wrote == bs.size())
147 catch (openvpn_io::system_error &e)
150 const openvpn_io::error_code code(e.code());
163 for (
int i = 0; i < n_parallel; i++)
196 const std::uint32_t net_value = htonl(value);
197 buf.
prepend((
unsigned char *)&net_value,
sizeof(net_value));
205 tunfrom =
new PacketFrom();
210 [self =
Ptr(
this), tunfrom =
typename PacketFrom::SPtr(tunfrom)](
const openvpn_io::error_code &error,
const size_t bytes_recvd)
mutable
213 self->handle_read(std::move(tunfrom), error, bytes_recvd);
217 void handle_read(
typename PacketFrom::SPtr pfp,
const openvpn_io::error_code &error,
const size_t bytes_recvd)
224 pfp->buf.set_size(bytes_recvd);
234 else if (pfp->buf.size() >= 4)
#define OPENVPN_ASYNC_HANDLER
openvpn_io::const_buffer const_buffer() const
Return an openvpn_io::const_buffer object used by asio write methods.
void prepend(const T *data, const size_t size)
Prepend data to the buffer.
size_t size() const
Returns the size of the buffer in T objects.
size_t offset() const
Returns the current offset (headroom) into the buffer.
size_t prepare(Buffer &buf) const
openvpn_io::mutable_buffer mutable_buffer(Buffer &buf) const
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
virtual void error(const size_t type, const std::string *text=nullptr)
void inc_stat(const size_t type, const count_t value)
const Frame::Context frame_context
bool write_seq(const BUFSEQ &bs)
void handle_read(typename PacketFrom::SPtr pfp, const openvpn_io::error_code &error, const size_t bytes_recvd)
TunIO(ReadHandler read_handler_arg, const Frame::Context &frame_context_arg, const SessionStats::Ptr &stats_arg)
void queue_read(PacketFrom *tunfrom)
void prepend_pf_inet(Buffer &buf, const std::uint32_t value)
void tun_error(const Error::Type errtype, const openvpn_io::error_code *error)
TunIO(ReadHandler read_handler_arg, const Frame::Ptr &frame_arg, const SessionStats::Ptr &stats_arg, const size_t frame_context_type=Frame::READ_TUN)
void start(const int n_parallel)
unsigned int version(const std::uint8_t version_len_prio)
#define OPENVPN_LOG_TUN_ERROR(x)
#define OPENVPN_LOG_TUN_VERBOSE(x)