From f681058889612df120b3c5fb37111a201cb99e1d Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Sat, 8 Nov 2025 17:41:44 -0500 Subject: [PATCH] feat: integrate NLPacket protocol for domain connection requests and responses --- src/OverteClient.cpp | 60 +++++++++++++++++++++++--------------------- src/OverteClient.hpp | 1 + 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/OverteClient.cpp b/src/OverteClient.cpp index f664874..833d2fa 100644 --- a/src/OverteClient.cpp +++ b/src/OverteClient.cpp @@ -497,26 +497,24 @@ void OverteClient::handleDomainConnectionDenied(const char* data, size_t len) { void OverteClient::sendDomainConnectRequest() { if (!m_udpReady || m_udpFd == -1) return; - // DomainConnectRequest packet (PacketType 0x04) - const unsigned char PACKET_TYPE_DOMAIN_CONNECT_REQUEST = 0x04; + // Create NLPacket with DomainConnectRequest type + NLPacket packet(PacketType::DomainConnectRequest, 0, true); // version 0, reliable + packet.setSequenceNumber(m_sequenceNumber++); - // Build packet with authentication - // Format: [PacketType][ProtocolVersion:string][HardwareAddress:string][MachineFingerprint:string][Username:string][Password:string] + // Build packet payload with authentication + // Format: [ProtocolVersion:string][HardwareAddress:string][MachineFingerprint:string][Username:string][Password:string] std::string protocolVersion = "Starworld-0.1"; std::string hardwareAddress = m_sessionUUID; std::string machineFingerprint = m_sessionUUID; // Use session UUID as fingerprint - std::vector packet; - packet.push_back(static_cast(PACKET_TYPE_DOMAIN_CONNECT_REQUEST)); - // Helper lambda to add length-prefixed string auto addString = [&packet](const std::string& str) { if (str.size() > 255) { - packet.push_back(static_cast(255)); - packet.insert(packet.end(), str.begin(), str.begin() + 255); + packet.writeUInt8(255); + packet.write(str.data(), 255); } else { - packet.push_back(static_cast(str.size())); - packet.insert(packet.end(), str.begin(), str.end()); + packet.writeUInt8(static_cast(str.size())); + packet.write(str.data(), str.size()); } }; @@ -535,19 +533,20 @@ void OverteClient::sendDomainConnectRequest() { // Add password/token (empty if not authenticated) addString(m_password); - ssize_t s = ::sendto(m_udpFd, packet.data(), packet.size(), 0, + const auto& data = packet.getData(); + ssize_t s = ::sendto(m_udpFd, data.data(), data.size(), 0, reinterpret_cast(&m_udpAddr), m_udpAddrLen); if (s > 0) { - std::cout << "[OverteClient] Domain connect request sent (" << s << " bytes)" << std::endl; + std::cout << "[OverteClient] DomainConnectRequest sent (" << s << " bytes, seq=" << (m_sequenceNumber-1) << ")" << std::endl; std::cout << "[OverteClient] Protocol: " << protocolVersion << std::endl; std::cout << "[OverteClient] Session: " << hardwareAddress << std::endl; if (!m_username.empty()) { std::cout << "[OverteClient] Username: " << m_username << std::endl; } // Hex dump first 32 bytes - std::cout << "[OverteClient] >>> Hex: "; - for (size_t i = 0; i < std::min(size_t(32), packet.size()); ++i) { - printf("%02x ", (unsigned char)packet[i]); + std::cout << "[OverteClient] >>> NLPacket Hex: "; + for (size_t i = 0; i < std::min(size_t(32), data.size()); ++i) { + printf("%02x ", data[i]); } std::cout << std::endl; } else { @@ -556,37 +555,40 @@ void OverteClient::sendDomainConnectRequest() { } void OverteClient::sendDomainListRequest() { - // Send DomainList request packet (PacketType 0x02) + // Send DomainList request packet using NLPacket format if (!m_udpReady || m_udpFd == -1) return; - const unsigned char PACKET_TYPE_DOMAIN_LIST_REQUEST = 0x02; - char packet[1] = { static_cast(PACKET_TYPE_DOMAIN_LIST_REQUEST) }; + // Create NLPacket with DomainListRequest type + NLPacket packet(PacketType::DomainListRequest, 0, true); // version 0, reliable + packet.setSequenceNumber(m_sequenceNumber++); - ssize_t s = ::sendto(m_udpFd, packet, sizeof(packet), 0, + // DomainListRequest has no payload, just the header + + const auto& data = packet.getData(); + ssize_t s = ::sendto(m_udpFd, data.data(), data.size(), 0, reinterpret_cast(&m_udpAddr), m_udpAddrLen); if (s > 0) { - std::cout << "[OverteClient] DomainList request sent" << std::endl; + std::cout << "[OverteClient] DomainListRequest sent (seq=" << (m_sequenceNumber-1) << ")" << std::endl; } else { std::cerr << "[OverteClient] Failed to send domain list request: " << strerror(errno) << std::endl; } } void OverteClient::sendPing(int fd, const sockaddr_storage& addr, socklen_t addrLen) { - const unsigned char PACKET_TYPE_PING = 0x01; - - // Ping packet: [PacketType][Timestamp:u64][PingType:u8] - char packet[1 + 8 + 1]; - packet[0] = static_cast(PACKET_TYPE_PING); + // Create NLPacket for Ping + NLPacket packet(PacketType::Ping, 0, false); // version 0, not reliable for pings + packet.setSequenceNumber(m_sequenceNumber++); // Add timestamp (microseconds since epoch) auto now = std::chrono::system_clock::now(); auto micros = std::chrono::duration_cast(now.time_since_epoch()).count(); - std::memcpy(packet + 1, µs, 8); + packet.writeUInt64(micros); // Ping type (0 = local, 1 = public) - packet[9] = 0; + packet.writeUInt8(0); - ssize_t s = ::sendto(fd, packet, sizeof(packet), 0, + const auto& data = packet.getData(); + ssize_t s = ::sendto(fd, data.data(), data.size(), 0, reinterpret_cast(&addr), addrLen); if (s < 0 && errno != EWOULDBLOCK && errno != EAGAIN) { std::cerr << "[OverteClient] Ping send failed: " << strerror(errno) << std::endl; diff --git a/src/OverteClient.hpp b/src/OverteClient.hpp index 1c4e6d9..e47d7e0 100644 --- a/src/OverteClient.hpp +++ b/src/OverteClient.hpp @@ -69,6 +69,7 @@ private: std::string m_sessionUUID; // Our client session UUID std::string m_username; // Domain authentication username std::string m_password; // Domain authentication password (or token) + std::uint32_t m_sequenceNumber{0}; // Packet sequence number for NLPacket protocol // Very small in-process world state for testing std::unordered_map m_entities;