congestvpn/VpnPacket.cpp

58 lines
1.5 KiB
C++

#include "VpnPacket.hpp"
#include "VpnPeer.hpp"
#include <chrono>
const size_t VpnPacket::VPN_HEADER_BYTES = 8;
uint32_t VpnPacket::_next_general_seqno = 0;
static const size_t OUTER_HEADERS_BYTES =
40 /* IPv6 header */ + 8 /* UDP header */;
// We use a TUN device, hence we don't have a layer 2 header.
static const int
DATA_SEQNO_POS = 0,
DATA_TIMESTAMP_POS = 4;
VpnPacket::VpnPacket(size_t mtu)
: _peer(nullptr), _data_space(mtu-OUTER_HEADERS_BYTES), _data_size(0),
_reception_timestamp(0)
{
_data = new char[mtu - OUTER_HEADERS_BYTES];
}
VpnPacket::~VpnPacket() {
delete[] _data;
}
bool VpnPacket::parse_as_ipv6() {
return parse_ipv6_header(get_payload(), get_payload_size(), _ipv6_header);
}
uint32_t VpnPacket::get_seqno() const {
return *(uint32_t*)(_data + DATA_SEQNO_POS);
}
uint32_t VpnPacket::get_sending_timestamp() const {
return *(uint32_t*)(_data + DATA_TIMESTAMP_POS);
}
void VpnPacket::prepare_for_sending() {
*(uint32_t*)(_data + DATA_SEQNO_POS) = next_seqno();
*(uint32_t*)(_data + DATA_TIMESTAMP_POS) =
std::chrono::time_point_cast<std::chrono::microseconds>(
std::chrono::steady_clock::now()).time_since_epoch().count();
}
void VpnPacket::upon_reception() {
_reception_timestamp =
std::chrono::time_point_cast<std::chrono::microseconds>(
std::chrono::steady_clock::now()).time_since_epoch().count();
}
uint32_t VpnPacket::next_seqno() {
if(_peer)
return _peer->next_seqno();
return _next_general_seqno++;
}