C rewrite: phase out smart pointers
This commit is contained in:
parent
b012375427
commit
7c1e5562f2
10 changed files with 47 additions and 26 deletions
|
@ -170,7 +170,7 @@ void UdpVpn::receive_from_tun() {
|
||||||
debugf("Dropping packet: no peer yet.\n");
|
debugf("Dropping packet: no peer yet.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
packet.set_peer(_peer.get());
|
packet.set_peer(_peer);
|
||||||
|
|
||||||
kdebugf("Transmitting %s -> %s, size %d\n",
|
kdebugf("Transmitting %s -> %s, size %d\n",
|
||||||
format_address(packet.get_ipv6_header().source.s6_addr),
|
format_address(packet.get_ipv6_header().source.s6_addr),
|
||||||
|
@ -189,7 +189,7 @@ void UdpVpn::receive_from_udp() {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// If we don't have a peer yet -- we're just setting the peer to nullptr.
|
// If we don't have a peer yet -- we're just setting the peer to nullptr.
|
||||||
packet.set_peer(_peer.get());
|
packet.set_peer(_peer);
|
||||||
|
|
||||||
if(packet.is_control()) {
|
if(packet.is_control()) {
|
||||||
VpnControlPacket ctrl_packet(std::move(packet));
|
VpnControlPacket ctrl_packet(std::move(packet));
|
||||||
|
|
|
@ -72,7 +72,7 @@ class UdpVpn {
|
||||||
size_t _vpn_mtu;
|
size_t _vpn_mtu;
|
||||||
|
|
||||||
TunDevice _tun_dev;
|
TunDevice _tun_dev;
|
||||||
std::unique_ptr<VpnPeer> _peer;
|
VpnPeer* _peer;
|
||||||
|
|
||||||
struct timespec
|
struct timespec
|
||||||
_last_control_sent, /**< A control is offered to be sent approx.
|
_last_control_sent, /**< A control is offered to be sent approx.
|
||||||
|
|
|
@ -4,7 +4,11 @@
|
||||||
#include "ip_header.hpp"
|
#include "ip_header.hpp"
|
||||||
|
|
||||||
UdpVpnClient::UdpVpnClient(const struct sockaddr_in6& server) : UdpVpn() {
|
UdpVpnClient::UdpVpnClient(const struct sockaddr_in6& server) : UdpVpn() {
|
||||||
_peer = std::make_unique<VpnPeer>(this, server, in6addr_any);
|
_peer = new VpnPeer(this, server, in6addr_any);
|
||||||
|
}
|
||||||
|
|
||||||
|
UdpVpnClient::~UdpVpnClient() {
|
||||||
|
delete _peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UdpVpnClient::acquire_peer(
|
void UdpVpnClient::acquire_peer(
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
class UdpVpnClient: public UdpVpn {
|
class UdpVpnClient: public UdpVpn {
|
||||||
public:
|
public:
|
||||||
UdpVpnClient(const struct sockaddr_in6& server);
|
UdpVpnClient(const struct sockaddr_in6& server);
|
||||||
|
~UdpVpnClient();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void acquire_peer(
|
virtual void acquire_peer(
|
||||||
|
|
|
@ -15,6 +15,11 @@ UdpVpnServer::UdpVpnServer(const struct in6_addr& bind_addr6, in_port_t port)
|
||||||
bind(bind_addr6, port);
|
bind(bind_addr6, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UdpVpnServer::~UdpVpnServer() {
|
||||||
|
if(_peer != nullptr)
|
||||||
|
delete _peer;
|
||||||
|
}
|
||||||
|
|
||||||
void UdpVpnServer::acquire_peer(
|
void UdpVpnServer::acquire_peer(
|
||||||
VpnDataPacket& packet,
|
VpnDataPacket& packet,
|
||||||
const sockaddr_in6& peer_ext_addr)
|
const sockaddr_in6& peer_ext_addr)
|
||||||
|
@ -26,9 +31,9 @@ void UdpVpnServer::acquire_peer(
|
||||||
if(!packet.parse_as_ipv6())
|
if(!packet.parse_as_ipv6())
|
||||||
return;
|
return;
|
||||||
const in6_addr& peer_inner_addr = packet.get_ipv6_header().source;
|
const in6_addr& peer_inner_addr = packet.get_ipv6_header().source;
|
||||||
_peer = std::make_unique<VpnPeer>(this, peer_ext_addr, peer_inner_addr);
|
_peer = new VpnPeer(this, peer_ext_addr, peer_inner_addr);
|
||||||
|
|
||||||
packet.set_peer(_peer.get());
|
packet.set_peer(_peer);
|
||||||
|
|
||||||
debugf("Got new peer %s:%d -- %s\n",
|
debugf("Got new peer %s:%d -- %s\n",
|
||||||
format_address(peer_ext_addr.sin6_addr.s6_addr),
|
format_address(peer_ext_addr.sin6_addr.s6_addr),
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include "UdpVpn.hpp"
|
#include "UdpVpn.hpp"
|
||||||
|
|
||||||
class UdpVpnServer: public UdpVpn {
|
class UdpVpnServer: public UdpVpn {
|
||||||
public:
|
public:
|
||||||
UdpVpnServer(in_port_t port);
|
UdpVpnServer(in_port_t port);
|
||||||
UdpVpnServer(const struct in6_addr& bind_addr6, in_port_t port);
|
UdpVpnServer(const struct in6_addr& bind_addr6, in_port_t port);
|
||||||
|
|
||||||
|
~UdpVpnServer();
|
||||||
protected:
|
protected:
|
||||||
virtual void acquire_peer(
|
virtual void acquire_peer(
|
||||||
VpnDataPacket& packet,
|
VpnDataPacket& packet,
|
||||||
|
|
|
@ -19,10 +19,12 @@ VpnPacket::VpnPacket(size_t mtu, bool inbound)
|
||||||
: _peer(nullptr), _inbound(inbound), _data_space(mtu-OUTER_HEADERS_BYTES),
|
: _peer(nullptr), _inbound(inbound), _data_space(mtu-OUTER_HEADERS_BYTES),
|
||||||
_data_size(VPN_HEADER_BYTES), _reception_timestamp(0)
|
_data_size(VPN_HEADER_BYTES), _reception_timestamp(0)
|
||||||
{
|
{
|
||||||
_data = std::unique_ptr<char[]>(new char[mtu - OUTER_HEADERS_BYTES]);
|
_data = (char*) malloc(sizeof(char) * (mtu - OUTER_HEADERS_BYTES));
|
||||||
}
|
}
|
||||||
|
|
||||||
VpnPacket::~VpnPacket() {}
|
VpnPacket::~VpnPacket() {
|
||||||
|
free(_data);
|
||||||
|
}
|
||||||
|
|
||||||
VpnPacket::VpnPacket(VpnPacket&& move_from) :
|
VpnPacket::VpnPacket(VpnPacket&& move_from) :
|
||||||
_peer(move_from._peer),
|
_peer(move_from._peer),
|
||||||
|
@ -44,31 +46,31 @@ void VpnPacket::set_peer(VpnPeer* peer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t VpnPacket::get_seqno() const {
|
uint32_t VpnPacket::get_seqno() const {
|
||||||
return ntohl(*(uint32_t*)(_data.get() + DATA_SEQNO_POS));
|
return ntohl(*(uint32_t*)(_data + DATA_SEQNO_POS));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t VpnPacket::get_sending_timestamp() const {
|
uint32_t VpnPacket::get_sending_timestamp() const {
|
||||||
return ntohl(
|
return ntohl(
|
||||||
*(uint32_t*)(_data.get() + DATA_TIMESTAMP_POS) & 0x7fffffffUL
|
*(uint32_t*)(_data + DATA_TIMESTAMP_POS) & 0x7fffffffUL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VpnPacket::is_control() const {
|
bool VpnPacket::is_control() const {
|
||||||
return *(unsigned char*)(_data.get() + DATA_CTRLBIT_POS) & 0x80;
|
return *(unsigned char*)(_data + DATA_CTRLBIT_POS) & 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VpnPacket::set_control(bool is_control) {
|
void VpnPacket::set_control(bool is_control) {
|
||||||
unsigned char* ctrl_field =
|
unsigned char* ctrl_field =
|
||||||
(unsigned char*) (_data.get() + DATA_CTRLBIT_POS);
|
(unsigned char*) (_data + DATA_CTRLBIT_POS);
|
||||||
*ctrl_field &= 0x7f;
|
*ctrl_field &= 0x7f;
|
||||||
if(is_control)
|
if(is_control)
|
||||||
*ctrl_field |= 0x80;
|
*ctrl_field |= 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VpnPacket::prepare_for_sending() {
|
void VpnPacket::prepare_for_sending() {
|
||||||
uint32_t* ts_field = (uint32_t*) (_data.get() + DATA_TIMESTAMP_POS);
|
uint32_t* ts_field = (uint32_t*) (_data + DATA_TIMESTAMP_POS);
|
||||||
*ts_field &= htonl(0x80000000UL);
|
*ts_field &= htonl(0x80000000UL);
|
||||||
*(uint32_t*)(_data.get() + DATA_SEQNO_POS) = htonl(next_seqno());
|
*(uint32_t*)(_data + DATA_SEQNO_POS) = htonl(next_seqno());
|
||||||
*ts_field |= htonl(to_us_timestamp(current_us_timestamp()));
|
*ts_field |= htonl(to_us_timestamp(current_us_timestamp()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
/** A packet to be transmitted or received over the VPN socket */
|
/** A packet to be transmitted or received over the VPN socket */
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <memory>
|
#include <exception>
|
||||||
|
|
||||||
#include "ip_header.hpp"
|
#include "ip_header.hpp"
|
||||||
|
|
||||||
|
@ -74,9 +74,9 @@ class VpnPacket {
|
||||||
|
|
||||||
/// Get a pointer to the packet payload (const version)
|
/// Get a pointer to the packet payload (const version)
|
||||||
const char* get_payload() const {
|
const char* get_payload() const {
|
||||||
return _data.get() + VPN_HEADER_BYTES; }
|
return _data + VPN_HEADER_BYTES; }
|
||||||
/// Get a pointer to the packet payload
|
/// Get a pointer to the packet payload
|
||||||
char* get_payload() { return _data.get() + VPN_HEADER_BYTES; }
|
char* get_payload() { return _data + VPN_HEADER_BYTES; }
|
||||||
/// Get a pointer to the first free byte of the packet payload
|
/// Get a pointer to the first free byte of the packet payload
|
||||||
char* get_next_payload() { return get_payload() + get_payload_size(); }
|
char* get_next_payload() { return get_payload() + get_payload_size(); }
|
||||||
/// Get the space allocated for the packet payload
|
/// Get the space allocated for the packet payload
|
||||||
|
@ -94,9 +94,9 @@ class VpnPacket {
|
||||||
_data_size += payload_size_increment; }
|
_data_size += payload_size_increment; }
|
||||||
|
|
||||||
/// Get a pointer to the full packet data (const version)
|
/// Get a pointer to the full packet data (const version)
|
||||||
const char* get_data() const { return _data.get(); }
|
const char* get_data() const { return _data; }
|
||||||
/// Get a pointer to the full packet data
|
/// Get a pointer to the full packet data
|
||||||
char* get_data() { return _data.get(); }
|
char* get_data() { return _data; }
|
||||||
/// Get the space allocated for the packet
|
/// Get the space allocated for the packet
|
||||||
size_t get_data_space() const { return _data_space; }
|
size_t get_data_space() const { return _data_space; }
|
||||||
/// Get the total current size of the packet
|
/// Get the total current size of the packet
|
||||||
|
@ -134,7 +134,7 @@ class VpnPacket {
|
||||||
VpnPeer* _peer; // raw pointer: we do not own the peer in any way
|
VpnPeer* _peer; // raw pointer: we do not own the peer in any way
|
||||||
bool _inbound; ///< is the packet received or sent?
|
bool _inbound; ///< is the packet received or sent?
|
||||||
|
|
||||||
std::unique_ptr<char[]> _data;
|
char* _data;
|
||||||
size_t _data_space, _data_size;
|
size_t _data_space, _data_size;
|
||||||
|
|
||||||
uint32_t _reception_timestamp;
|
uint32_t _reception_timestamp;
|
||||||
|
|
13
VpnPeer.cpp
13
VpnPeer.cpp
|
@ -11,12 +11,18 @@ VpnPeer::VpnPeer(UdpVpn* vpn, const sockaddr_in6& ext_addr,
|
||||||
const in6_addr& int_addr)
|
const in6_addr& int_addr)
|
||||||
: _vpn(vpn), _ext_addr(ext_addr), _int_addr(int_addr), _next_send_seqno(0),
|
: _vpn(vpn), _ext_addr(ext_addr), _int_addr(int_addr), _next_send_seqno(0),
|
||||||
_tot_bytes_sent(0), _prev_tot_bytes_sent(0),
|
_tot_bytes_sent(0), _prev_tot_bytes_sent(0),
|
||||||
_congestion_controller(*this)
|
_congestion_controller(*this),
|
||||||
|
_next_control_packet(nullptr)
|
||||||
{
|
{
|
||||||
clock_gettime(CLOCK_MONOTONIC, &_prev_tick_time);
|
clock_gettime(CLOCK_MONOTONIC, &_prev_tick_time);
|
||||||
cycle_next_control();
|
cycle_next_control();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VpnPeer::~VpnPeer() {
|
||||||
|
if(_next_control_packet != nullptr)
|
||||||
|
delete _next_control_packet;
|
||||||
|
}
|
||||||
|
|
||||||
void VpnPeer::make_loss_report() {
|
void VpnPeer::make_loss_report() {
|
||||||
VpnTlvLossReport report = VpnTlvLossReport::create(*_next_control_packet);
|
VpnTlvLossReport report = VpnTlvLossReport::create(*_next_control_packet);
|
||||||
report.set_report_seqno(_packet_loss.get_cur_seqno());
|
report.set_report_seqno(_packet_loss.get_cur_seqno());
|
||||||
|
@ -24,8 +30,9 @@ void VpnPeer::make_loss_report() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VpnPeer::cycle_next_control() {
|
void VpnPeer::cycle_next_control() {
|
||||||
_next_control_packet =
|
if(_next_control_packet != nullptr)
|
||||||
std::make_unique<VpnControlPacket>(_vpn->get_mtu(), false);
|
delete _next_control_packet;
|
||||||
|
_next_control_packet = new VpnControlPacket(_vpn->get_mtu(), false);
|
||||||
_next_control_packet->set_peer(this);
|
_next_control_packet->set_peer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,8 @@ class VpnPeer {
|
||||||
VpnPeer(UdpVpn* vpn, const sockaddr_in6& ext_addr,
|
VpnPeer(UdpVpn* vpn, const sockaddr_in6& ext_addr,
|
||||||
const in6_addr& int_addr);
|
const in6_addr& int_addr);
|
||||||
|
|
||||||
|
~VpnPeer();
|
||||||
|
|
||||||
const sockaddr_in6& get_ext_addr() const { return _ext_addr; }
|
const sockaddr_in6& get_ext_addr() const { return _ext_addr; }
|
||||||
const in6_addr& get_int_addr() const { return _int_addr; }
|
const in6_addr& get_int_addr() const { return _int_addr; }
|
||||||
|
|
||||||
|
@ -145,5 +147,5 @@ class VpnPeer {
|
||||||
RTTLogger _rtt;
|
RTTLogger _rtt;
|
||||||
CongestionController _congestion_controller;
|
CongestionController _congestion_controller;
|
||||||
|
|
||||||
std::unique_ptr<VpnControlPacket> _next_control_packet;
|
VpnControlPacket* _next_control_packet;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue