123 lines
3.0 KiB
C++
123 lines
3.0 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;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|