diff --git a/helmetsrv.conf b/helmetsrv.conf index 6e0a5bb..d10491a 100644 --- a/helmetsrv.conf +++ b/helmetsrv.conf @@ -1,2 +1,3 @@ listenport = 1025; tunnelnet = 10.1.1.0/24; +localnet = 172.17.0.0/24; diff --git a/iprouter.cpp b/iprouter.cpp index 7fc63ef..cca3671 100644 --- a/iprouter.cpp +++ b/iprouter.cpp @@ -21,7 +21,7 @@ extern "C" { #include -std::expected Router::AddRoute(std::string address, uint64_t prefix, std::string gateway) { +std::expected Router::AddRoute(std::string address, uint64_t prefix, std::string gateway, std::string dev) { struct sockaddr_in sa; if (inet_pton(AF_INET, address.data(), &(sa.sin_addr)) == 1) { } else { @@ -49,8 +49,7 @@ std::expected Router::AddRoute(std::string address, uint64_t }; char buffer[INET_ADDRSTRLEN]; - uint32_t mask = (prefix == 0) ? 0 : htonl(~((1U << (32 - prefix)) - 1)); - //uint32_t mask = (prefix == 0) ? 0 : (~0U << (32 - prefix)); + uint32_t mask = (prefix == 0) ? 0 : (~0U << (32 - prefix)); struct in_addr addr; addr.s_addr = mask; @@ -71,7 +70,7 @@ std::expected Router::AddRoute(std::string address, uint64_t }; rt.rt_flags = RTF_UP | RTF_GATEWAY; - //rt.rt_dev = std::string("eth0").data(); + //rt.rt_dev = dev.data(); int sockfd = 0; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { diff --git a/iprouter.hpp b/iprouter.hpp index 1675f94..73f4452 100644 --- a/iprouter.hpp +++ b/iprouter.hpp @@ -14,6 +14,6 @@ using Routes = std::vector; class Router { public: - std::expected AddRoute(std::string address, uint64_t prefix, std::string gateway); + std::expected AddRoute(std::string address, uint64_t prefix, std::string gateway, std::string dev); }; diff --git a/msgheader.cpp b/msgheader.cpp index 66f2ef5..c27d504 100644 --- a/msgheader.cpp +++ b/msgheader.cpp @@ -14,7 +14,7 @@ extern "C" { const std::string internetPkgMsg = "internetPkg"; const std::string tunAddressMsg = "tunAddress"; -const std::string Msg = "localRoute"; +const std::string localRouteMsg = "localRoute"; MessageHeader::MessageHeader(const uint32_t ipSize) { pSize = ipSize; diff --git a/sockhand.cpp b/sockhand.cpp index c23156e..8c14755 100644 --- a/sockhand.cpp +++ b/sockhand.cpp @@ -15,11 +15,11 @@ extern "C" { #include #include #include - +#include #include -void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, int prefix) { +void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, std::vector routes) { sock = newsock; auto interfaceName = std::format("uxsrv{}", sock); auto createRes = interface.Create(interfaceName); @@ -27,7 +27,7 @@ void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, in uxlogger.Error(createRes.error()); return; } - uxlogger.Debug(std::format("Set local ip address {}/{} for {}", laddr, prefix, interfaceName)); + uxlogger.Debug(std::format("Set local ip address {} for {}", laddr, interfaceName)); auto setAddrRes = interface.SetIP4Address(laddr); if (!setAddrRes) { uxlogger.Error(setAddrRes.error()); @@ -82,15 +82,52 @@ void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, in } } - std::thread sendThr(&SocketHandler::SendMessages, this, raddr); + for (const auto& route : routes) { + auto prefixRes = netprefix(route); + if (!prefixRes) { + uxlogger.Error(prefixRes.error()); + continue; + } + auto networkRes = network(route); + if (!networkRes) { + uxlogger.Error(networkRes.error()); + continue; + } + auto network = networkRes.value(); + auto prefix = prefixRes.value(); + + uxlogger.Log(std::format("Send route message for {}/{}", network, prefix)); + uxcontrol::RouteMessage routeMsg; + auto meta = routeMsg.mutable_meta(); + meta->set_kind(localRouteMsg); + routeMsg.set_address(network); + routeMsg.set_prefix(prefix); + std::string rawMessage; + routeMsg.SerializeToString(&rawMessage); + + MessageHeader header(rawMessage.size()); + auto rawHeader = header.Encode(); + std::string rawPacket; + rawPacket.append(rawHeader); + rawPacket.append(rawMessage); + + int wsize; + if ((wsize = write(sock, rawPacket.data(), rawPacket.size())) < 0) { + int errnoCopy = errno; + std::string error = std::strerror(errnoCopy); + uxlogger.Log(std::format("Write message error: {}", error)); + return; + } + + } + std::thread sendThr(&SocketHandler::SendMessages, this); sendThr.detach(); done.acquire(); uxlogger.Log("Handler done"); } -void SocketHandler::SendMessages(std::string raddr) { - +void SocketHandler::SendMessages(void) { while (true) { auto readRes = interface.Read(); if (!readRes) { @@ -119,10 +156,10 @@ void SocketHandler::SendMessages(std::string raddr) { if ((wsize = send(sock, rawPacket.data(), rawPacket.size(), 0)) < 0) { int errnoCopy = errno; std::string error = std::strerror(errnoCopy); - uxlogger.Log(std::format("Write packet error: {}", error)); + uxlogger.Error(std::format("Write packet error: {}", error)); break; } - uxlogger.Log("Send internetPacket message"); + uxlogger.Debug("Send internetPacket message"); } done.release(); diff --git a/sockhand.hpp b/sockhand.hpp index 728e31e..d05b337 100644 --- a/sockhand.hpp +++ b/sockhand.hpp @@ -16,9 +16,9 @@ private: std::binary_semaphore done{0}; Interface interface; public: - void Handle(int newsock, std::string laddr, std::string raddr, int prefix); + void Handle(int newsock, std::string laddr, std::string raddr, std::vector routes); void RecvMessages(void); - void SendMessages(std::string raddr); + void SendMessages(void); }; #endif diff --git a/tservice.cpp b/tservice.cpp index debbe93..41a5423 100644 --- a/tservice.cpp +++ b/tservice.cpp @@ -85,7 +85,7 @@ void TunService::Handle(int sock) { uxlogger.Error(networkRes.error()); return; } - int num = (sock - 2) * 2; + int num = (sock - 3); auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num); if (!networkRes) { uxlogger.Error(networkRes.error()); @@ -100,9 +100,8 @@ void TunService::Handle(int sock) { SocketHandler handler; std::string laddr = localaddrRes.value(); std::string raddr = remoteaddrRes.value(); - auto prefix = prefixRes.value(); - handler.Handle(sock, laddr, raddr, prefix); - uxlogger.Debug("Stop socker handler"); + handler.Handle(sock, laddr, raddr, localnets); + uxlogger.Debug("Stop socket handler"); close(sock); } diff --git a/uxclient.cpp b/uxclient.cpp index 099c484..832db2e 100644 --- a/uxclient.cpp +++ b/uxclient.cpp @@ -132,6 +132,7 @@ void UxClient::RecvMessages(void) { if (!setMaskRes) { uxlogger.Error(setMaskRes.error()); } + tunAddress = addrMessage.address(); } else if (kind == internetPkgMsg) { uxcontrol::PacketMessage packetMessage; packetMessage.ParseFromString(rawMessage); @@ -141,6 +142,21 @@ void UxClient::RecvMessages(void) { auto error = writeRes.error(); uxlogger.Error(std::format("Write packet error: {}", error)); } + } else if (kind == localRouteMsg) { + uxcontrol::RouteMessage routeMessage; + routeMessage.ParseFromString(rawMessage); + auto network = routeMessage.address(); + auto prefix = routeMessage.prefix(); + uxlogger.Info(std::format("Received route {}/{} gw {}", network, prefix, tunAddress)); + if (tunAddress != "") { + Router router; + auto addRouteRes = router.AddRoute(network, prefix, tunAddress, interface.Name()); + if (!addRouteRes) { + uxlogger.Error(addRouteRes.error()); + } else { + uxlogger.Warning(std::format("Add route {}/{}", network, prefix)); + } + } } else { uxlogger.Warning("Received unknown kind of message"); } @@ -151,9 +167,6 @@ void UxClient::RecvMessages(void) { void UxClient::SendMessages(void) { while (true) { - //std::this_thread::sleep_for(std::chrono::seconds(10)); - //continue; - auto readRes = interface.Read(); if (!readRes) { uxlogger.Log(std::format("Read packet error: {}", readRes.error())); diff --git a/uxclient.hpp b/uxclient.hpp index 290e736..4a0e98f 100644 --- a/uxclient.hpp +++ b/uxclient.hpp @@ -14,6 +14,7 @@ private: int sock; std::binary_semaphore done{0}; Interface interface; + std::string tunAddress; public: UxClient(void); std::expected Connect(std::string address, const int port);