From 55ada8abc1feb92a79e1d18e4d3438a3c0fb98c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Fri, 5 Jun 2020 16:14:05 +0200 Subject: [PATCH] Add class VpnPeer --- Makefile | 2 +- VpnPeer.cpp | 23 +++++++++++++++++++++++ VpnPeer.hpp | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 VpnPeer.cpp create mode 100644 VpnPeer.hpp diff --git a/Makefile b/Makefile index 00b0620..9a98e14 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CXX=g++ CXXFLAGS=-O2 -g -Wall -Wextra -std=c++17 CXXLIBS= -OBJS=UdpVpn.o TunDevice.o util.o main.o +OBJS=UdpVpn.o VpnPeer.o TunDevice.o util.o main.o TARGET=congestvpn all: $(TARGET) diff --git a/VpnPeer.cpp b/VpnPeer.cpp new file mode 100644 index 0000000..0e93826 --- /dev/null +++ b/VpnPeer.cpp @@ -0,0 +1,23 @@ +#include "VpnPeer.hpp" +#include "UdpVpn.hpp" + +#include +#include +#include + +VpnPeer::VpnPeer(UdpVpn* vpn, const sockaddr_in6& ext_addr, + const in6_addr int_addr) + : _vpn(vpn), _ext_addr(ext_addr), _int_addr(int_addr) +{} + + +size_t VpnPeer::write(const char* data, size_t len) { + ssize_t nsent; + + nsent = sendto(_vpn->get_socket_fd(), data, len, MSG_CONFIRM, + (const struct sockaddr*) &_ext_addr, sizeof(_ext_addr)); + if(nsent < 0) + throw NetError("Could not send UDP packet", errno, true); + + return (size_t) nsent; +} diff --git a/VpnPeer.hpp b/VpnPeer.hpp new file mode 100644 index 0000000..bc74834 --- /dev/null +++ b/VpnPeer.hpp @@ -0,0 +1,33 @@ +#pragma once + +/** A peer of a bound (server) instance of UdpVpn */ + +#include +#include "util.hpp" + +class UdpVpn; + +class VpnPeer { + public: + class NetError : public MsgException { + public: + NetError( + const std::string& msg, + int code=0, + bool is_perror=false) + : MsgException(msg, code, is_perror) {} + }; + + VpnPeer(UdpVpn* vpn, const sockaddr_in6& ext_addr, + const in6_addr int_addr); + + const sockaddr_in6& get_ext_addr() const { return _ext_addr; } + const in6_addr& get_int_addr() const { return _int_addr; } + + size_t write(const char* data, size_t len); + + private: + UdpVpn* _vpn; + sockaddr_in6 _ext_addr; + in6_addr _int_addr; +};