working commit
This commit is contained in:
@@ -1,2 +1,3 @@
|
||||
listenport = 1025;
|
||||
tunnelnet = 10.1.1.0/24;
|
||||
localnet = 172.17.0.0/24;
|
||||
|
||||
+3
-4
@@ -21,7 +21,7 @@ extern "C" {
|
||||
|
||||
#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;
|
||||
if (inet_pton(AF_INET, address.data(), &(sa.sin_addr)) == 1) {
|
||||
} else {
|
||||
@@ -49,8 +49,7 @@ std::expected<void, std::string> 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<void, std::string> 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) {
|
||||
|
||||
+1
-1
@@ -14,6 +14,6 @@ using Routes = std::vector<Route>;
|
||||
|
||||
class Router {
|
||||
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
@@ -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;
|
||||
|
||||
+45
-8
@@ -15,11 +15,11 @@ extern "C" {
|
||||
#include <msgheader.hpp>
|
||||
#include <sockhand.hpp>
|
||||
#include <uxlogger.hpp>
|
||||
|
||||
#include <networkaux.hpp>
|
||||
|
||||
#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;
|
||||
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();
|
||||
|
||||
+2
-2
@@ -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<std::string> routes);
|
||||
void RecvMessages(void);
|
||||
void SendMessages(std::string raddr);
|
||||
void SendMessages(void);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+3
-4
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+16
-3
@@ -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()));
|
||||
|
||||
@@ -14,6 +14,7 @@ private:
|
||||
int sock;
|
||||
std::binary_semaphore done{0};
|
||||
Interface interface;
|
||||
std::string tunAddress;
|
||||
public:
|
||||
UxClient(void);
|
||||
std::expected<void, std::string> Connect(std::string address, const int port);
|
||||
|
||||
Reference in New Issue
Block a user