working commit
This commit is contained in:
@@ -284,6 +284,16 @@ std::expected<std::string, std::string> Interface::Read() {
|
|||||||
return rdata;
|
return rdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::expected<int, std::string> Interface::Write(std::string payload) {
|
||||||
|
int wsize = 0;
|
||||||
|
if ((wsize = write(tunfd, payload.data(), payload.size())) < 0) {
|
||||||
|
int errnocopy = errno;
|
||||||
|
std::string error = std::strerror(errnocopy);
|
||||||
|
return std::unexpected("Write interface error: " + error);
|
||||||
|
}
|
||||||
|
return wsize;
|
||||||
|
}
|
||||||
|
|
||||||
std::string Interface::Name() {
|
std::string Interface::Name() {
|
||||||
return ifname;
|
return ifname;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public:
|
|||||||
std::expected<void, std::string> Down(void);
|
std::expected<void, std::string> Down(void);
|
||||||
|
|
||||||
std::expected<std::string, std::string> Read(void);
|
std::expected<std::string, std::string> Read(void);
|
||||||
|
std::expected<int, std::string> Write(std::string payload);
|
||||||
|
|
||||||
~Interface();
|
~Interface();
|
||||||
};
|
};
|
||||||
|
|||||||
+22
-13
@@ -19,12 +19,6 @@ extern "C" {
|
|||||||
|
|
||||||
#include <uxcontrol.pb.h>
|
#include <uxcontrol.pb.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
using namespace std::chrono_literals;
|
|
||||||
|
|
||||||
|
|
||||||
void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, int prefix) {
|
void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, int prefix) {
|
||||||
sock = newsock;
|
sock = newsock;
|
||||||
auto interfaceName = std::format("uxsrv{}", sock);
|
auto interfaceName = std::format("uxsrv{}", sock);
|
||||||
@@ -49,8 +43,6 @@ void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, in
|
|||||||
uxlogger.Error(createRes.error());
|
uxlogger.Error(createRes.error());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::thread recvThr(&SocketHandler::RecvMessages, this);
|
std::thread recvThr(&SocketHandler::RecvMessages, this);
|
||||||
recvThr.detach();
|
recvThr.detach();
|
||||||
|
|
||||||
@@ -148,7 +140,7 @@ void SocketHandler::RecvMessages(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (rsize < msgHeaderSize) {
|
if (rsize < msgHeaderSize) {
|
||||||
uxlogger.Log(std::format("Read only {} from {} bytes", rsize, msgHeaderSize));
|
uxlogger.Log(std::format("Read only {} from {} header bytes", rsize, msgHeaderSize));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
MessageHeader header;
|
MessageHeader header;
|
||||||
@@ -158,7 +150,9 @@ void SocketHandler::RecvMessages(void) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
auto pSize = header.PayloadSize();
|
auto pSize = header.PayloadSize();
|
||||||
if (pSize > 0) {
|
if (pSize == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
std::string rawMessage(pSize, 0);
|
std::string rawMessage(pSize, 0);
|
||||||
if ((rsize = recv(sock, rawMessage.data(), rawMessage.size(), MSG_WAITALL)) < 0) {
|
if ((rsize = recv(sock, rawMessage.data(), rawMessage.size(), MSG_WAITALL)) < 0) {
|
||||||
int errnoCopy = errno;
|
int errnoCopy = errno;
|
||||||
@@ -166,9 +160,24 @@ void SocketHandler::RecvMessages(void) {
|
|||||||
uxlogger.Log(std::format("Read message error: {}", error));
|
uxlogger.Log(std::format("Read message error: {}", error));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
uxcontrol::SimpleMessage msg;
|
uxcontrol::SimpleMessage simpleMsg;
|
||||||
msg.ParseFromString(rawMessage);
|
simpleMsg.ParseFromString(rawMessage);
|
||||||
uxlogger.Log(std::format("Receive message {}", msg.meta().kind()));
|
|
||||||
|
auto metaPart = simpleMsg.meta();
|
||||||
|
auto kind = metaPart.kind();
|
||||||
|
uxlogger.Debug(std::format("Received message kind of {}", kind));
|
||||||
|
|
||||||
|
if (kind == internetPkgMsg) {
|
||||||
|
uxcontrol::PacketMessage packetMessage;
|
||||||
|
packetMessage.ParseFromString(rawMessage);
|
||||||
|
auto payload = packetMessage.payload();
|
||||||
|
auto writeRes = interface.Write(payload);
|
||||||
|
if (!writeRes) {
|
||||||
|
auto error = writeRes.error();
|
||||||
|
uxlogger.Error(std::format("Write packet error: {}", error));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uxlogger.Warning("Received unknown kind of message");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
done.release();
|
done.release();
|
||||||
|
|||||||
+3
-2
@@ -85,12 +85,13 @@ void TunService::Handle(int sock) {
|
|||||||
uxlogger.Error(networkRes.error());
|
uxlogger.Error(networkRes.error());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), sock);
|
int num = (sock - 2) * 2;
|
||||||
|
auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num);
|
||||||
if (!networkRes) {
|
if (!networkRes) {
|
||||||
uxlogger.Error(networkRes.error());
|
uxlogger.Error(networkRes.error());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), sock + 1);
|
auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), num + 1);
|
||||||
if (!remoteaddrRes) {
|
if (!remoteaddrRes) {
|
||||||
uxlogger.Error(remoteaddrRes.error());
|
uxlogger.Error(remoteaddrRes.error());
|
||||||
return;
|
return;
|
||||||
|
|||||||
+13
-5
@@ -117,14 +117,13 @@ void UxClient::RecvMessages(void) {
|
|||||||
meta.ParseFromString(rawMessage);
|
meta.ParseFromString(rawMessage);
|
||||||
auto metaPart = meta.meta();
|
auto metaPart = meta.meta();
|
||||||
auto kind = metaPart.kind();
|
auto kind = metaPart.kind();
|
||||||
uxlogger.Debug(std::format("Receive message with call {}", kind));
|
uxlogger.Debug(std::format("Received message kind of {}", kind));
|
||||||
|
|
||||||
if (kind == tunAddressMsg) {
|
if (kind == tunAddressMsg) {
|
||||||
uxcontrol::AddressMessage addrMessage;
|
uxcontrol::AddressMessage addrMessage;
|
||||||
addrMessage.ParseFromString(rawMessage);
|
addrMessage.ParseFromString(rawMessage);
|
||||||
|
|
||||||
uxlogger.Debug(std::format("Receive address {}", addrMessage.address()));
|
uxlogger.Debug(std::format("Receive address {}", addrMessage.address()));
|
||||||
uxlogger.Debug(std::format("Receive prefix {}", addrMessage.prefix()));
|
uxlogger.Debug(std::format("Receive prefix {}", addrMessage.prefix()));
|
||||||
|
|
||||||
auto setAddrRes = interface.SetIP4Address(addrMessage.address());
|
auto setAddrRes = interface.SetIP4Address(addrMessage.address());
|
||||||
if (!setAddrRes) {
|
if (!setAddrRes) {
|
||||||
uxlogger.Error(setAddrRes.error());
|
uxlogger.Error(setAddrRes.error());
|
||||||
@@ -133,6 +132,15 @@ void UxClient::RecvMessages(void) {
|
|||||||
if (!setMaskRes) {
|
if (!setMaskRes) {
|
||||||
uxlogger.Error(setMaskRes.error());
|
uxlogger.Error(setMaskRes.error());
|
||||||
}
|
}
|
||||||
|
} else if (kind == internetPkgMsg) {
|
||||||
|
uxcontrol::PacketMessage packetMessage;
|
||||||
|
packetMessage.ParseFromString(rawMessage);
|
||||||
|
auto payload = packetMessage.payload();
|
||||||
|
auto writeRes = interface.Write(payload);
|
||||||
|
if (!writeRes) {
|
||||||
|
auto error = writeRes.error();
|
||||||
|
uxlogger.Error(std::format("Write packet error: {}", error));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
uxlogger.Warning("Received unknown kind of message");
|
uxlogger.Warning("Received unknown kind of message");
|
||||||
}
|
}
|
||||||
@@ -143,8 +151,8 @@ 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));
|
//std::this_thread::sleep_for(std::chrono::seconds(10));
|
||||||
continue;
|
//continue;
|
||||||
|
|
||||||
auto readRes = interface.Read();
|
auto readRes = interface.Read();
|
||||||
if (!readRes) {
|
if (!readRes) {
|
||||||
|
|||||||
Reference in New Issue
Block a user