working commit

This commit is contained in:
2026-04-22 18:15:05 +02:00
parent f1b7d9783d
commit 76c797b489
13 changed files with 207 additions and 135 deletions
+24 -23
View File
@@ -90,7 +90,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = : POST_UNINSTALL = :
sbin_PROGRAMS = helmetd$(EXEEXT) sbin_PROGRAMS = helmetd$(EXEEXT)
noinst_PROGRAMS = udpclient_test$(EXEEXT) service_test$(EXEEXT) \ noinst_PROGRAMS = udpclient_test$(EXEEXT) service_test$(EXEEXT) \
server_test$(EXEEXT) tunclient_test$(EXEEXT)
subdir = . subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__aclocal_m4_deps = $(top_srcdir)/configure.ac
@@ -106,19 +106,19 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES = CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(sbindir)" am__installdirs = "$(DESTDIR)$(sbindir)"
PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS) PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS)
am_helmetd_OBJECTS = helmetd.$(OBJEXT) server.$(OBJEXT) \ am_helmetd_OBJECTS = helmetd.$(OBJEXT) tunclient.$(OBJEXT) \
service.$(OBJEXT) interface.$(OBJEXT) hello.pb.$(OBJEXT) \ service.$(OBJEXT) interface.$(OBJEXT) hello.pb.$(OBJEXT) \
udpclient.$(OBJEXT) resolver.$(OBJEXT) udpclient.$(OBJEXT) resolver.$(OBJEXT) iprouter.$(OBJEXT)
helmetd_OBJECTS = $(am_helmetd_OBJECTS) helmetd_OBJECTS = $(am_helmetd_OBJECTS)
helmetd_LDADD = $(LDADD) helmetd_LDADD = $(LDADD)
am_server_test_OBJECTS = server_test.$(OBJEXT) server.$(OBJEXT) \ am_service_test_OBJECTS = service_test.$(OBJEXT) tunclient.$(OBJEXT) \
service.$(OBJEXT) interface.$(OBJEXT)
server_test_OBJECTS = $(am_server_test_OBJECTS)
server_test_LDADD = $(LDADD)
am_service_test_OBJECTS = service_test.$(OBJEXT) server.$(OBJEXT) \
service.$(OBJEXT) interface.$(OBJEXT) service.$(OBJEXT) interface.$(OBJEXT)
service_test_OBJECTS = $(am_service_test_OBJECTS) service_test_OBJECTS = $(am_service_test_OBJECTS)
service_test_LDADD = $(LDADD) service_test_LDADD = $(LDADD)
am_tunclient_test_OBJECTS = tunclient_test.$(OBJEXT) \
tunclient.$(OBJEXT) service.$(OBJEXT) interface.$(OBJEXT)
tunclient_test_OBJECTS = $(am_tunclient_test_OBJECTS)
tunclient_test_LDADD = $(LDADD)
am_udpclient_test_OBJECTS = resolver.$(OBJEXT) udpclient.$(OBJEXT) \ am_udpclient_test_OBJECTS = resolver.$(OBJEXT) udpclient.$(OBJEXT) \
udpclient_test.$(OBJEXT) udpclient_test.$(OBJEXT)
udpclient_test_OBJECTS = $(am_udpclient_test_OBJECTS) udpclient_test_OBJECTS = $(am_udpclient_test_OBJECTS)
@@ -163,10 +163,10 @@ AM_V_CCLD = $(am__v_CCLD_$(V))
am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 = am__v_CCLD_1 =
SOURCES = $(helmetd_SOURCES) $(server_test_SOURCES) \ SOURCES = $(helmetd_SOURCES) $(service_test_SOURCES) \
$(service_test_SOURCES) $(udpclient_test_SOURCES) $(tunclient_test_SOURCES) $(udpclient_test_SOURCES)
DIST_SOURCES = $(helmetd_SOURCES) $(server_test_SOURCES) \ DIST_SOURCES = $(helmetd_SOURCES) $(service_test_SOURCES) \
$(service_test_SOURCES) $(udpclient_test_SOURCES) $(tunclient_test_SOURCES) $(udpclient_test_SOURCES)
am__can_run_installinfo = \ am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \ case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \ n|no|NO) false;; \
@@ -313,20 +313,21 @@ top_builddir = .
top_srcdir = . top_srcdir = .
AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo subdir-objects AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo subdir-objects
helmetd_SOURCES = helmetd.cpp \ helmetd_SOURCES = helmetd.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp \ interface.cpp interface.hpp \
hello.pb.cc hello.pb.h \ hello.pb.cc hello.pb.h \
udpclient.cpp udpclient.hpp \ udpclient.cpp udpclient.hpp \
resolver.cpp resolver.hpp resolver.cpp resolver.hpp \
iprouter.cpp iprouter.hpp
server_test_SOURCES = server_test.cpp \ tunclient_test_SOURCES = tunclient_test.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp interface.cpp interface.hpp
service_test_SOURCES = service_test.cpp \ service_test_SOURCES = service_test.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp interface.cpp interface.hpp
@@ -439,14 +440,14 @@ helmetd$(EXEEXT): $(helmetd_OBJECTS) $(helmetd_DEPENDENCIES) $(EXTRA_helmetd_DEP
@rm -f helmetd$(EXEEXT) @rm -f helmetd$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(helmetd_OBJECTS) $(helmetd_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(helmetd_OBJECTS) $(helmetd_LDADD) $(LIBS)
server_test$(EXEEXT): $(server_test_OBJECTS) $(server_test_DEPENDENCIES) $(EXTRA_server_test_DEPENDENCIES)
@rm -f server_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(server_test_OBJECTS) $(server_test_LDADD) $(LIBS)
service_test$(EXEEXT): $(service_test_OBJECTS) $(service_test_DEPENDENCIES) $(EXTRA_service_test_DEPENDENCIES) service_test$(EXEEXT): $(service_test_OBJECTS) $(service_test_DEPENDENCIES) $(EXTRA_service_test_DEPENDENCIES)
@rm -f service_test$(EXEEXT) @rm -f service_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(service_test_OBJECTS) $(service_test_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(service_test_OBJECTS) $(service_test_LDADD) $(LIBS)
tunclient_test$(EXEEXT): $(tunclient_test_OBJECTS) $(tunclient_test_DEPENDENCIES) $(EXTRA_tunclient_test_DEPENDENCIES)
@rm -f tunclient_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(tunclient_test_OBJECTS) $(tunclient_test_LDADD) $(LIBS)
udpclient_test$(EXEEXT): $(udpclient_test_OBJECTS) $(udpclient_test_DEPENDENCIES) $(EXTRA_udpclient_test_DEPENDENCIES) udpclient_test$(EXEEXT): $(udpclient_test_OBJECTS) $(udpclient_test_DEPENDENCIES) $(EXTRA_udpclient_test_DEPENDENCIES)
@rm -f udpclient_test$(EXEEXT) @rm -f udpclient_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(udpclient_test_OBJECTS) $(udpclient_test_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(udpclient_test_OBJECTS) $(udpclient_test_LDADD) $(LIBS)
@@ -829,8 +830,8 @@ uninstall-am: uninstall-sbinPROGRAMS
.PRECIOUS: Makefile .PRECIOUS: Makefile
test: udpclient_test test: tunclient_test
./udpclient_test ./tunclient_test
run: helmetd run: helmetd
./helmetd ./helmetd
+9 -8
View File
@@ -8,25 +8,26 @@ LIBS = -Wl,--as-need -lprotobuf-lite
sbin_PROGRAMS = helmetd sbin_PROGRAMS = helmetd
helmetd_SOURCES = helmetd.cpp \ helmetd_SOURCES = helmetd.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp \ interface.cpp interface.hpp \
hello.pb.cc hello.pb.h \ hello.pb.cc hello.pb.h \
udpclient.cpp udpclient.hpp \ udpclient.cpp udpclient.hpp \
resolver.cpp resolver.hpp resolver.cpp resolver.hpp \
iprouter.cpp iprouter.hpp
noinst_PROGRAMS = \ noinst_PROGRAMS = \
udpclient_test \ udpclient_test \
service_test \ service_test \
server_test tunclient_test
server_test_SOURCES = server_test.cpp \ tunclient_test_SOURCES = tunclient_test.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp interface.cpp interface.hpp
service_test_SOURCES = service_test.cpp \ service_test_SOURCES = service_test.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp interface.cpp interface.hpp
@@ -36,8 +37,8 @@ udpclient_test_SOURCES = \
udpclient.cpp udpclient.hpp \ udpclient.cpp udpclient.hpp \
udpclient_test.cpp udpclient_test.cpp
test: udpclient_test test: tunclient_test
./udpclient_test ./tunclient_test
run: helmetd run: helmetd
./helmetd ./helmetd
+24 -23
View File
@@ -90,7 +90,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = : POST_UNINSTALL = :
sbin_PROGRAMS = helmetd$(EXEEXT) sbin_PROGRAMS = helmetd$(EXEEXT)
noinst_PROGRAMS = udpclient_test$(EXEEXT) service_test$(EXEEXT) \ noinst_PROGRAMS = udpclient_test$(EXEEXT) service_test$(EXEEXT) \
server_test$(EXEEXT) tunclient_test$(EXEEXT)
subdir = . subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__aclocal_m4_deps = $(top_srcdir)/configure.ac
@@ -106,19 +106,19 @@ CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES = CONFIG_CLEAN_VPATH_FILES =
am__installdirs = "$(DESTDIR)$(sbindir)" am__installdirs = "$(DESTDIR)$(sbindir)"
PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS) PROGRAMS = $(noinst_PROGRAMS) $(sbin_PROGRAMS)
am_helmetd_OBJECTS = helmetd.$(OBJEXT) server.$(OBJEXT) \ am_helmetd_OBJECTS = helmetd.$(OBJEXT) tunclient.$(OBJEXT) \
service.$(OBJEXT) interface.$(OBJEXT) hello.pb.$(OBJEXT) \ service.$(OBJEXT) interface.$(OBJEXT) hello.pb.$(OBJEXT) \
udpclient.$(OBJEXT) resolver.$(OBJEXT) udpclient.$(OBJEXT) resolver.$(OBJEXT) iprouter.$(OBJEXT)
helmetd_OBJECTS = $(am_helmetd_OBJECTS) helmetd_OBJECTS = $(am_helmetd_OBJECTS)
helmetd_LDADD = $(LDADD) helmetd_LDADD = $(LDADD)
am_server_test_OBJECTS = server_test.$(OBJEXT) server.$(OBJEXT) \ am_service_test_OBJECTS = service_test.$(OBJEXT) tunclient.$(OBJEXT) \
service.$(OBJEXT) interface.$(OBJEXT)
server_test_OBJECTS = $(am_server_test_OBJECTS)
server_test_LDADD = $(LDADD)
am_service_test_OBJECTS = service_test.$(OBJEXT) server.$(OBJEXT) \
service.$(OBJEXT) interface.$(OBJEXT) service.$(OBJEXT) interface.$(OBJEXT)
service_test_OBJECTS = $(am_service_test_OBJECTS) service_test_OBJECTS = $(am_service_test_OBJECTS)
service_test_LDADD = $(LDADD) service_test_LDADD = $(LDADD)
am_tunclient_test_OBJECTS = tunclient_test.$(OBJEXT) \
tunclient.$(OBJEXT) service.$(OBJEXT) interface.$(OBJEXT)
tunclient_test_OBJECTS = $(am_tunclient_test_OBJECTS)
tunclient_test_LDADD = $(LDADD)
am_udpclient_test_OBJECTS = resolver.$(OBJEXT) udpclient.$(OBJEXT) \ am_udpclient_test_OBJECTS = resolver.$(OBJEXT) udpclient.$(OBJEXT) \
udpclient_test.$(OBJEXT) udpclient_test.$(OBJEXT)
udpclient_test_OBJECTS = $(am_udpclient_test_OBJECTS) udpclient_test_OBJECTS = $(am_udpclient_test_OBJECTS)
@@ -163,10 +163,10 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 = am__v_CCLD_1 =
SOURCES = $(helmetd_SOURCES) $(server_test_SOURCES) \ SOURCES = $(helmetd_SOURCES) $(service_test_SOURCES) \
$(service_test_SOURCES) $(udpclient_test_SOURCES) $(tunclient_test_SOURCES) $(udpclient_test_SOURCES)
DIST_SOURCES = $(helmetd_SOURCES) $(server_test_SOURCES) \ DIST_SOURCES = $(helmetd_SOURCES) $(service_test_SOURCES) \
$(service_test_SOURCES) $(udpclient_test_SOURCES) $(tunclient_test_SOURCES) $(udpclient_test_SOURCES)
am__can_run_installinfo = \ am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \ case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \ n|no|NO) false;; \
@@ -313,20 +313,21 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo subdir-objects AUTOMAKE_OPTIONS = foreign no-dependencies no-installinfo subdir-objects
helmetd_SOURCES = helmetd.cpp \ helmetd_SOURCES = helmetd.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp \ interface.cpp interface.hpp \
hello.pb.cc hello.pb.h \ hello.pb.cc hello.pb.h \
udpclient.cpp udpclient.hpp \ udpclient.cpp udpclient.hpp \
resolver.cpp resolver.hpp resolver.cpp resolver.hpp \
iprouter.cpp iprouter.hpp
server_test_SOURCES = server_test.cpp \ tunclient_test_SOURCES = tunclient_test.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp interface.cpp interface.hpp
service_test_SOURCES = service_test.cpp \ service_test_SOURCES = service_test.cpp \
server.cpp server.hpp \ tunclient.cpp tunclient.hpp \
service.cpp service.hpp \ service.cpp service.hpp \
interface.cpp interface.hpp interface.cpp interface.hpp
@@ -439,14 +440,14 @@ helmetd$(EXEEXT): $(helmetd_OBJECTS) $(helmetd_DEPENDENCIES) $(EXTRA_helmetd_DEP
@rm -f helmetd$(EXEEXT) @rm -f helmetd$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(helmetd_OBJECTS) $(helmetd_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(helmetd_OBJECTS) $(helmetd_LDADD) $(LIBS)
server_test$(EXEEXT): $(server_test_OBJECTS) $(server_test_DEPENDENCIES) $(EXTRA_server_test_DEPENDENCIES)
@rm -f server_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(server_test_OBJECTS) $(server_test_LDADD) $(LIBS)
service_test$(EXEEXT): $(service_test_OBJECTS) $(service_test_DEPENDENCIES) $(EXTRA_service_test_DEPENDENCIES) service_test$(EXEEXT): $(service_test_OBJECTS) $(service_test_DEPENDENCIES) $(EXTRA_service_test_DEPENDENCIES)
@rm -f service_test$(EXEEXT) @rm -f service_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(service_test_OBJECTS) $(service_test_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(service_test_OBJECTS) $(service_test_LDADD) $(LIBS)
tunclient_test$(EXEEXT): $(tunclient_test_OBJECTS) $(tunclient_test_DEPENDENCIES) $(EXTRA_tunclient_test_DEPENDENCIES)
@rm -f tunclient_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(tunclient_test_OBJECTS) $(tunclient_test_LDADD) $(LIBS)
udpclient_test$(EXEEXT): $(udpclient_test_OBJECTS) $(udpclient_test_DEPENDENCIES) $(EXTRA_udpclient_test_DEPENDENCIES) udpclient_test$(EXEEXT): $(udpclient_test_OBJECTS) $(udpclient_test_DEPENDENCIES) $(EXTRA_udpclient_test_DEPENDENCIES)
@rm -f udpclient_test$(EXEEXT) @rm -f udpclient_test$(EXEEXT)
$(AM_V_CXXLD)$(CXXLINK) $(udpclient_test_OBJECTS) $(udpclient_test_LDADD) $(LIBS) $(AM_V_CXXLD)$(CXXLINK) $(udpclient_test_OBJECTS) $(udpclient_test_LDADD) $(LIBS)
@@ -829,8 +830,8 @@ uninstall-am: uninstall-sbinPROGRAMS
.PRECIOUS: Makefile .PRECIOUS: Makefile
test: udpclient_test test: tunclient_test
./udpclient_test ./tunclient_test
run: helmetd run: helmetd
./helmetd ./helmetd
+14 -1
View File
@@ -270,6 +270,19 @@ std::expected<void, std::string> Interface::Down(void) {
return {}; return {};
} }
std::expected<std::string, std::string> Interface::Read() {
char buffer[mtu];
int rsize = 0;
if ((rsize = read(tunfd, buffer, sizeof(buffer))) < 0) {
int errnocopy = errno;
std::string error = std::strerror(errnocopy);
return std::unexpected("Read interface error: " + error);
}
std::string rdata;
rdata.append(buffer, rsize);
return rdata;
}
std::string Interface::Name() { std::string Interface::Name() {
return ifname; return ifname;
} }
@@ -282,6 +295,7 @@ Interface::~Interface() {
close(tunfd); close(tunfd);
} }
std::expected<void, std::string> Interface::UpN(void) { std::expected<void, std::string> Interface::UpN(void) {
int netlinkfd = 0; int netlinkfd = 0;
if ((netlinkfd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE)) < 0) { if ((netlinkfd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE)) < 0) {
@@ -313,7 +327,6 @@ std::expected<void, std::string> Interface::UpN(void) {
return {}; return {};
} }
std::expected<void, std::string> Interface::SetIP4AddrMask(const std::string address, const int prefix) { std::expected<void, std::string> Interface::SetIP4AddrMask(const std::string address, const int prefix) {
int netlinkfd = 0; int netlinkfd = 0;
if ((netlinkfd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE)) < 0) { if ((netlinkfd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE)) < 0) {
+2
View File
@@ -22,6 +22,8 @@ public:
std::expected<void, std::string> UpN(void); std::expected<void, std::string> UpN(void);
std::expected<void, std::string> SetIP4AddrMask(const std::string address, const int prefix); std::expected<void, std::string> SetIP4AddrMask(const std::string address, const int prefix);
std::expected<std::string, std::string> Read();
~Interface(); ~Interface();
}; };
+11
View File
@@ -0,0 +1,11 @@
#include <expected>
#include <vector>
#include <iprouter.hpp>
std::expected<Routes, std::string> Router::List() {
std::vector<Route> routes;
return routes;
}
+18
View File
@@ -0,0 +1,18 @@
#include <vector>
#include <expected>
#include <string>
class Route {
public:
std::string dest;
int mask;
};
using Routes = std::vector<Route>;
class Router {
std::expected<Routes, std::string> List();
};
-39
View File
@@ -1,39 +0,0 @@
extern "C" {
#include <arpa/inet.h>
}
#include <expected>
#include <string>
#include <vector>
#include <span>
#include <iostream>
#include <thread>
#include <chrono>
#include <cstring>
#include <interface.hpp>
#include <service.hpp>
#include <server.hpp>
std::expected<void, std::string> Server::Create(const std::string name, const std::string addr, const int prefix) {
auto createres = iface.Create(name);
if (!createres) {
return std::unexpected(createres.error());
}
auto setaddrres = iface.SetIP4Address(addr);
if (!setaddrres) {
return std::unexpected(setaddrres.error());
}
auto setprefixres = iface.SetIP4Netmask(24);
if (!setprefixres) {
return std::unexpected(setprefixres.error());
}
auto setmtures = iface.SetMTU(1240);
if (!setmtures) {
return std::unexpected(setmtures.error());
}
return {};
}
-25
View File
@@ -1,25 +0,0 @@
#include <expected>
#include <string>
#include <chrono>
#include <cstring>
#include <thread>
#include <iostream>
#include <server.hpp>
using namespace std::chrono_literals;
int main(int argc, char** argv) {
Server srv;
auto createres = srv.Create("tun10", "10.1.2.1", 30);
if (!createres) {
std::cerr << "Error: " << createres.error() << std::endl;
return 1;
}
std::chrono::milliseconds timesleep(20s);
std::this_thread::sleep_for(timesleep);
return 0;
}
+61
View File
@@ -0,0 +1,61 @@
extern "C" {
#include <netinet/ip.h>
#include <arpa/inet.h>
}
#include <expected>
#include <string>
#include <iostream>
#include <format>
#include <interface.hpp>
#include <tunclient.hpp>
std::expected<void, std::string> TClient::Create(const std::string name, const std::string addr, const int prefix) {
auto createRes = iface.Create(name);
if (!createRes) {
return std::unexpected(createRes.error());
}
auto setaddrRes = iface.SetIP4Address(addr);
if (!setaddrRes) {
return std::unexpected(setaddrRes.error());
}
auto setprefixRes = iface.SetIP4Netmask(24);
if (!setprefixRes) {
return std::unexpected(setprefixRes.error());
}
auto setmtuRes = iface.SetMTU(1240);
if (!setmtuRes) {
return std::unexpected(setmtuRes.error());
}
auto upRes = iface.Up();
if (!upRes) {
return std::unexpected(upRes.error());
}
return {};
}
std::expected<void, std::string> TClient::Run() {
while (true) {
auto readRes = iface.Read();
if (!readRes) {
std::cerr << std::format("Error: {}\n", readRes.error());
}
auto value = readRes.value();
std::cerr << std::format("Packet size: {}\n", value.size());
struct iphdr* iphdr = (struct iphdr*)(value.data());
struct in_addr src, dest;
src.s_addr = iphdr->saddr;
dest.s_addr = iphdr->daddr;
std::cout << "Source IP: " << inet_ntoa(src) << std::endl;
std::cout << "Dest IP: " << inet_ntoa(dest) << std::endl;
std::cout << "Protocol: " << (int)iphdr->protocol << std::endl;
}
return {};
}
+2 -1
View File
@@ -7,9 +7,10 @@
#include <interface.hpp> #include <interface.hpp>
#include <service.hpp> #include <service.hpp>
class Server { class TClient {
private: private:
Interface iface; Interface iface;
public: public:
std::expected<void, std::string> Create(const std::string name, const std::string addr, const int prefix); std::expected<void, std::string> Create(const std::string name, const std::string addr, const int prefix);
std::expected<void, std::string> Run();
}; };
+31
View File
@@ -0,0 +1,31 @@
#include <expected>
#include <string>
#include <chrono>
#include <cstring>
#include <thread>
#include <iostream>
#include <tunclient.hpp>
using namespace std::chrono_literals;
int main(int argc, char** argv) {
TClient cli;
auto createRes = cli.Create("tun10", "10.1.2.1", 30);
if (!createRes) {
std::cerr << "Error: " << createRes.error() << std::endl;
return 1;
}
auto runRes = cli.Run();
if (!runRes) {
std::cerr << "Error: " << runRes.error() << std::endl;
return 1;
}
//std::chrono::milliseconds timesleep(20s);
//std::this_thread::sleep_for(timesleep);
return 0;
}
+6 -10
View File
@@ -8,19 +8,15 @@
int main(int argc, char** argv) { int main(int argc, char** argv) {
UDPClient cli; UDPClient cli;
std::string message("Hello"); std::string message("Hello");
{ auto bindRes = cli.Bind("www.gnu.org", 1025);
auto res = cli.Bind("www.gnu.org", 1025); if (!bindRes) {
if (!res) { std::cerr << std::format("Error: {}", bindRes.error()) << std::endl;
std::cerr << std::format("Error: {}", res.error()) << std::endl;
return 1; return 1;
} }
} auto sendRes = cli.Send(message);
{ if (!sendRes) {
auto res = cli.Send(message); std::cerr << std::format("Error: {}", sendRes.error()) << std::endl;
if (!res) {
std::cerr << std::format("Error: {}", res.error()) << std::endl;
return 1; return 1;
} }
}
return 0; return 0;
} }