AuroraRuntime/Source/IO/Net/AuNetEndpoint.cpp
J Reece Wilson 1e4082c02f [+] Linux datagrams
[+] NetSocketBind::uDefaultInputStreamSize
[+] NetDatagramBind::uDefaultInputStreamSize
2022-12-16 17:18:12 +00:00

128 lines
3.1 KiB
C++

/***
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;
};
}
return EndpointToLength(ep);
}
AuUInt8 EndpointToLength(const NetEndpoint &ep)
{
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;
}
}