134 lines
3.3 KiB
C++
134 lines
3.3 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"
|
|
|
|
#if defined(AURORA_COMPILER_CLANG)
|
|
// warning: enumeration values 'kEnumCount' and 'kEnumInvalid' not handled in switch [-Wswitch
|
|
#pragma clang diagnostic ignored "-Wswitch"
|
|
// Yea, I don't give a shit.
|
|
#endif
|
|
|
|
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;
|
|
}
|
|
} |