working commit

This commit is contained in:
2026-05-18 14:56:08 +02:00
parent e52e90c222
commit 498a3867fb
9 changed files with 73 additions and 23 deletions
+1
View File
@@ -1,2 +1,3 @@
listenport = 1025; listenport = 1025;
tunnelnet = 10.1.1.0/24; tunnelnet = 10.1.1.0/24;
localnet = 172.17.0.0/24;
+3 -4
View File
@@ -21,7 +21,7 @@ extern "C" {
#include <iprouter.hpp> #include <iprouter.hpp>
std::expected<void, std::string> Router::AddRoute(std::string address, uint64_t prefix, std::string gateway) { std::expected<void, std::string> Router::AddRoute(std::string address, uint64_t prefix, std::string gateway, std::string dev) {
struct sockaddr_in sa; struct sockaddr_in sa;
if (inet_pton(AF_INET, address.data(), &(sa.sin_addr)) == 1) { if (inet_pton(AF_INET, address.data(), &(sa.sin_addr)) == 1) {
} else { } else {
@@ -49,8 +49,7 @@ std::expected<void, std::string> Router::AddRoute(std::string address, uint64_t
}; };
char buffer[INET_ADDRSTRLEN]; 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; struct in_addr addr;
addr.s_addr = mask; addr.s_addr = mask;
@@ -71,7 +70,7 @@ std::expected<void, std::string> Router::AddRoute(std::string address, uint64_t
}; };
rt.rt_flags = RTF_UP | RTF_GATEWAY; rt.rt_flags = RTF_UP | RTF_GATEWAY;
//rt.rt_dev = std::string("eth0").data(); //rt.rt_dev = dev.data();
int sockfd = 0; int sockfd = 0;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+1 -1
View File
@@ -14,6 +14,6 @@ using Routes = std::vector<Route>;
class Router { class Router {
public: public:
std::expected<void, std::string> AddRoute(std::string address, uint64_t prefix, std::string gateway); std::expected<void, std::string> AddRoute(std::string address, uint64_t prefix, std::string gateway, std::string dev);
}; };
+1 -1
View File
@@ -14,7 +14,7 @@ extern "C" {
const std::string internetPkgMsg = "internetPkg"; const std::string internetPkgMsg = "internetPkg";
const std::string tunAddressMsg = "tunAddress"; const std::string tunAddressMsg = "tunAddress";
const std::string Msg = "localRoute"; const std::string localRouteMsg = "localRoute";
MessageHeader::MessageHeader(const uint32_t ipSize) { MessageHeader::MessageHeader(const uint32_t ipSize) {
pSize = ipSize; pSize = ipSize;
+45 -8
View File
@@ -15,11 +15,11 @@ extern "C" {
#include <msgheader.hpp> #include <msgheader.hpp>
#include <sockhand.hpp> #include <sockhand.hpp>
#include <uxlogger.hpp> #include <uxlogger.hpp>
#include <networkaux.hpp>
#include <uxcontrol.pb.h> #include <uxcontrol.pb.h>
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<std::string> routes) {
sock = newsock; sock = newsock;
auto interfaceName = std::format("uxsrv{}", sock); auto interfaceName = std::format("uxsrv{}", sock);
auto createRes = interface.Create(interfaceName); 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()); uxlogger.Error(createRes.error());
return; 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); auto setAddrRes = interface.SetIP4Address(laddr);
if (!setAddrRes) { if (!setAddrRes) {
uxlogger.Error(setAddrRes.error()); 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(); sendThr.detach();
done.acquire(); done.acquire();
uxlogger.Log("Handler done"); uxlogger.Log("Handler done");
} }
void SocketHandler::SendMessages(std::string raddr) { void SocketHandler::SendMessages(void) {
while (true) { while (true) {
auto readRes = interface.Read(); auto readRes = interface.Read();
if (!readRes) { if (!readRes) {
@@ -119,10 +156,10 @@ void SocketHandler::SendMessages(std::string raddr) {
if ((wsize = send(sock, rawPacket.data(), rawPacket.size(), 0)) < 0) { if ((wsize = send(sock, rawPacket.data(), rawPacket.size(), 0)) < 0) {
int errnoCopy = errno; int errnoCopy = errno;
std::string error = std::strerror(errnoCopy); std::string error = std::strerror(errnoCopy);
uxlogger.Log(std::format("Write packet error: {}", error)); uxlogger.Error(std::format("Write packet error: {}", error));
break; break;
} }
uxlogger.Log("Send internetPacket message"); uxlogger.Debug("Send internetPacket message");
} }
done.release(); done.release();
+2 -2
View File
@@ -16,9 +16,9 @@ private:
std::binary_semaphore done{0}; std::binary_semaphore done{0};
Interface interface; Interface interface;
public: 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<std::string> routes);
void RecvMessages(void); void RecvMessages(void);
void SendMessages(std::string raddr); void SendMessages(void);
}; };
#endif #endif
+3 -4
View File
@@ -85,7 +85,7 @@ void TunService::Handle(int sock) {
uxlogger.Error(networkRes.error()); uxlogger.Error(networkRes.error());
return; return;
} }
int num = (sock - 2) * 2; int num = (sock - 3);
auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num); auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num);
if (!networkRes) { if (!networkRes) {
uxlogger.Error(networkRes.error()); uxlogger.Error(networkRes.error());
@@ -100,9 +100,8 @@ void TunService::Handle(int sock) {
SocketHandler handler; SocketHandler handler;
std::string laddr = localaddrRes.value(); std::string laddr = localaddrRes.value();
std::string raddr = remoteaddrRes.value(); std::string raddr = remoteaddrRes.value();
auto prefix = prefixRes.value(); handler.Handle(sock, laddr, raddr, localnets);
handler.Handle(sock, laddr, raddr, prefix); uxlogger.Debug("Stop socket handler");
uxlogger.Debug("Stop socker handler");
close(sock); close(sock);
} }
+16 -3
View File
@@ -132,6 +132,7 @@ void UxClient::RecvMessages(void) {
if (!setMaskRes) { if (!setMaskRes) {
uxlogger.Error(setMaskRes.error()); uxlogger.Error(setMaskRes.error());
} }
tunAddress = addrMessage.address();
} else if (kind == internetPkgMsg) { } else if (kind == internetPkgMsg) {
uxcontrol::PacketMessage packetMessage; uxcontrol::PacketMessage packetMessage;
packetMessage.ParseFromString(rawMessage); packetMessage.ParseFromString(rawMessage);
@@ -141,6 +142,21 @@ void UxClient::RecvMessages(void) {
auto error = writeRes.error(); auto error = writeRes.error();
uxlogger.Error(std::format("Write packet error: {}", 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 { } else {
uxlogger.Warning("Received unknown kind of message"); uxlogger.Warning("Received unknown kind of message");
} }
@@ -151,9 +167,6 @@ void UxClient::RecvMessages(void) {
void UxClient::SendMessages(void) { void UxClient::SendMessages(void) {
while (true) { while (true) {
//std::this_thread::sleep_for(std::chrono::seconds(10));
//continue;
auto readRes = interface.Read(); auto readRes = interface.Read();
if (!readRes) { if (!readRes) {
uxlogger.Log(std::format("Read packet error: {}", readRes.error())); uxlogger.Log(std::format("Read packet error: {}", readRes.error()));
+1
View File
@@ -14,6 +14,7 @@ private:
int sock; int sock;
std::binary_semaphore done{0}; std::binary_semaphore done{0};
Interface interface; Interface interface;
std::string tunAddress;
public: public:
UxClient(void); UxClient(void);
std::expected<void, std::string> Connect(std::string address, const int port); std::expected<void, std::string> Connect(std::string address, const int port);