/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuNetEndpoint.cpp Date: 2022-8-16 Author: Reece ***/ #include "Networking.hpp" #include "AuNetEndpoint.hpp" namespace Aurora::IO::Net { AuUInt8 OptimizeEndpoint(NetEndpoint &ep) { // TFW structure is more of a defacto standard than the instantiation of the fields int offset; auto &hint = ep.hint[AuArraySize(ep.hint) - 1]; if (!hint) { AuMemset(ep.hint, 0, AuArraySize(ep.hint)); switch (ep.ip.ip) { case EIPProtocol::eIPProtocolV6: { AuWriteU16(ep.hint, 0, AF_INET6); AuWriteU16BE(ep.hint, 2, ep.uPort); offset = { 0 }; offset += 4; // flowinfo for (int i = 0; i < AuArraySize(ep.ip.v6); i++) { AuWriteU16BE(ep.hint + 4 + 4 + offset, i * sizeof(*ep.ip.v6), ep.ip.v6[i]);//AuArraySize(ep.ip.v6) - 1 - i]); } AuWriteU16BE(ep.hint, 24, ep.uIPv6Scope); hint = true; break; } case EIPProtocol::eIPProtocolV4: { AuWriteU16(ep.hint, 0, AF_INET); AuWriteU16BE(ep.hint, 2, ep.uPort); AuWriteU32LE(ep.hint, 4, AuReadU32LE(ep.ip.v4, 0)); hint = true; break; } default: hint = false; }; } switch (ep.ip.ip) { case EIPProtocol::eIPProtocolV6: { return 28; } case EIPProtocol::eIPProtocolV4: { return 16; } default: { return 0; } }; } void DeoptimizeEndpoint(NetEndpoint &ep) { switch (AuReadU16(ep.hint, 0)) { case AF_INET6: { ep.uPort = AuReadU16BE(ep.hint, 2); ep.ip.ip = EIPProtocol::eIPProtocolV6; ep.ip.UpdateFromName(true, (const char *)ep.hint + 8); break; } case AF_INET: { ep.uPort = AuReadU16BE(ep.hint, 2); ep.ip.ip = EIPProtocol::eIPProtocolV4; ep.ip.UpdateFromName(false, (const char *)ep.hint + 4); break; } }; } AuUInt IPToDomain(EIPProtocol protocol); AuUInt IPToDomain(const NetEndpoint &ep) { return IPToDomain(ep.ip.ip); } AuUInt TransportToPlatformType(const NetEndpoint &ep) { return TransportToPlatformType(ep.transportProtocol); } AuUInt TransportToPlatformType(ETransportProtocol protocol) { switch (protocol) { case ETransportProtocol::eProtocolTCP: { return SOCK_STREAM; } case ETransportProtocol::eProtocolUDP: { return SOCK_DGRAM; } } return 0; } }