aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlizzie <lizzie@eden-emu.dev>2026-05-21 21:24:18 +0200
committercrueter <crueter@eden-emu.dev>2026-05-21 21:24:18 +0200
commit46cfd9b6f3de00cc0b3b7e5f3369a66f66f7d115 (patch)
tree40eb10dd0dec41421c3fc8dba2cf4540e9064216 /src
parent889545e1ee17ef5e0a88faf18861f47a0e9e7523 (diff)
[net] support SCTP protocols (+all base FBSD protos), ban more NS domains (#3955)
bans more NS domains making hb dns check pass also fixes bogus "SCTP is not implemented" assertion for translate protocol Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3955 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: crueter <crueter@eden-emu.dev>
Diffstat (limited to 'src')
-rw-r--r--src/common/socket_types.h112
-rw-r--r--src/core/hle/service/sockets/sfdnsres.cpp31
-rw-r--r--src/core/hle/service/sockets/sockets.h113
-rw-r--r--src/core/hle/service/sockets/sockets_translate.cpp156
-rw-r--r--src/core/internal_network/network.cpp288
5 files changed, 604 insertions, 96 deletions
diff --git a/src/common/socket_types.h b/src/common/socket_types.h
index 63824a5c48..5b1e4d7b1d 100644
--- a/src/common/socket_types.h
+++ b/src/common/socket_types.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -28,9 +31,118 @@ enum class Type {
/// Protocol values for sockets
enum class Protocol : u8 {
Unspecified, ///< Represents 0, usable in various places
+ IP,
ICMP,
TCP,
UDP,
+ IPV6,
+ RAW,
+ IGMP,
+ GGP,
+ IPV4,
+ ST,
+ EGP,
+ PIGP,
+ RCCMON,
+ NVPII,
+ PUP,
+ ARGUS,
+ EMCON,
+ XNET,
+ CHAOS,
+ MUX,
+ MEAS,
+ HMP,
+ PRM,
+ IDP,
+ TRUNK1,
+ TRUNK2,
+ LEAF1,
+ LEAF2,
+ RDP,
+ IRTP,
+ TP,
+ BLT,
+ NSP,
+ INP,
+ DCCP,
+ //TODO: 3PC,
+ IDPR,
+ XTP,
+ DDP,
+ CMTP,
+ TPXX,
+ IL,
+ SDRP,
+ ROUTING,
+ FRAGMENT,
+ IDRP,
+ RSVP,
+ GRE,
+ MHRP,
+ BHA,
+ ESP,
+ AH,
+ INLSP,
+ SWIPE,
+ NHRP,
+ MOBILE,
+ TLSP,
+ SKIP,
+ ICMPV6,
+ NONE,
+ DSTOPTS,
+ AHIP,
+ CFTP,
+ HELLO,
+ SATEXPAK,
+ KRYPTOLAN,
+ RVD,
+ IPPC,
+ ADFS,
+ SATMON,
+ VISA,
+ IPCV,
+ CPNX,
+ CPHB,
+ WSN,
+ PVP,
+ BRSATMON,
+ ND,
+ WBMON,
+ WBEXPAK,
+ EON,
+ VMTP,
+ SVMTP,
+ VINES,
+ TTP,
+ IGP,
+ DGP,
+ TCF,
+ IGRP,
+ OSPFIGP,
+ SRPC,
+ LARP,
+ MTP,
+ AX25,
+ IPEIP,
+ MICP,
+ SCCSP,
+ ETHERIP,
+ ENCAP,
+ APES,
+ GMTP,
+ IPCOMP,
+ SCTP,
+ MH,
+ UDPLITE,
+ HIP,
+ SHIM6,
+ PIM,
+ CARP,
+ PGM,
+ MPLS,
+ PFSYNC
};
/// Shutdown mode
diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp
index 9cd60ac240..fa3a5bb82a 100644
--- a/src/core/hle/service/sockets/sfdnsres.cpp
+++ b/src/core/hle/service/sockets/sfdnsres.cpp
@@ -55,6 +55,37 @@ enum class NetDbError : s32 {
static const constexpr std::array blockedDomains = {
"srv.nintendo.net", //obvious
+ "nintendo.es",
+ "nintendowifi.net",
+ "nintendo-europe.com",
+ "nintendo.com.hk",
+ "nintendo.com.au",
+ "nintendo.co.kr",
+ "nintendo.co.uk",
+ "nintendo.co.jp",
+ "nintendo.co.nz",
+ "nintendo.co.za",
+ "nintendo.com",
+ "nintendo.jp",
+ "nintendo.tw",
+ "nintendo.at",
+ "nintendo.be",
+ "nintendo.dk",
+ "nintendo.de",
+ "nintendo.fi",
+ "nintendo.fr",
+ "nintendo.gr",
+ "nintendo.hu",
+ "nintendo.it",
+ "nintendo.nl",
+ "nintendo.no",
+ "nintendo.pt",
+ "nintendo.ru",
+ "nintendo.ch",
+ "nintendo.se",
+ "nintendoswitch.com.cn",
+ "nintendoswitch.com",
+ "sun.hac.lp1.d4c.nintendo.net",
"phoenix-api.wbagora.com", //hogwarts legacy
"battle.net",
"microsoft.com", //minecraft dungeons + other games
diff --git a/src/core/hle/service/sockets/sockets.h b/src/core/hle/service/sockets/sockets.h
index 7992d9822c..2837ce71ea 100644
--- a/src/core/hle/service/sockets/sockets.h
+++ b/src/core/hle/service/sockets/sockets.h
@@ -65,10 +65,121 @@ enum class Type : u32 {
};
enum class Protocol : u32 {
- Unspecified = 0,
+ IP = 0,
ICMP = 1,
TCP = 6,
UDP = 17,
+ //
+ IPV6 = 41,
+ RAW = 255,
+ //
+ HOPOPTS = 0,
+ IGMP = 2,
+ GGP = 3,
+ IPV4 = 4,
+ ST = 7,
+ EGP = 8,
+ PIGP = 9,
+ RCCMON = 10,
+ NVPII = 11,
+ PUP = 12,
+ ARGUS = 13,
+ EMCON = 14,
+ XNET = 15,
+ CHAOS = 16,
+ MUX = 18,
+ MEAS = 19,
+ HMP = 20,
+ PRM = 21,
+ IDP = 22,
+ TRUNK1 = 23,
+ TRUNK2 = 24,
+ LEAF1 = 25,
+ LEAF2 = 26,
+ RDP = 27,
+ IRTP = 28,
+ TP = 29,
+ BLT = 30,
+ NSP = 31,
+ INP = 32,
+ DCCP = 33,
+ //3PC = 34,
+ IDPR = 35,
+ XTP = 36,
+ DDP = 37,
+ CMTP = 38,
+ TPXX = 39,
+ IL = 40,
+ SDRP = 42,
+ ROUTING = 43,
+ FRAGMENT = 44,
+ IDRP = 45,
+ RSVP = 46,
+ GRE = 47,
+ MHRP = 48,
+ BHA = 49,
+ ESP = 50,
+ AH = 51,
+ INLSP = 52,
+ SWIPE = 53,
+ NHRP = 54,
+ MOBILE = 55,
+ TLSP = 56,
+ SKIP = 57,
+ ICMPV6 = 58,
+ NONE = 59,
+ DSTOPTS = 60,
+ AHIP = 61,
+ CFTP = 62,
+ HELLO = 63,
+ SATEXPAK = 64,
+ KRYPTOLAN = 65,
+ RVD = 66,
+ IPPC = 67,
+ ADFS = 68,
+ SATMON = 69,
+ VISA = 70,
+ IPCV = 71,
+ CPNX = 72,
+ CPHB = 73,
+ WSN = 74,
+ PVP = 75,
+ BRSATMON = 76,
+ ND = 77,
+ WBMON = 78,
+ WBEXPAK = 79,
+ EON = 80,
+ VMTP = 81,
+ SVMTP = 82,
+ VINES = 83,
+ TTP = 84,
+ IGP = 85,
+ DGP = 86,
+ TCF = 87,
+ IGRP = 88,
+ OSPFIGP = 89,
+ SRPC = 90,
+ LARP = 91,
+ MTP = 92,
+ AX25 = 93,
+ IPEIP = 94,
+ MICP = 95,
+ SCCSP = 96,
+ ETHERIP = 97,
+ ENCAP = 98,
+ APES = 99,
+ GMTP = 100,
+ IPCOMP = 108,
+ SCTP = 132,
+ MH = 135,
+ UDPLITE = 136,
+ HIP = 139,
+ SHIM6 = 140,
+ PIM = 103,
+ CARP = 112,
+ PGM = 113,
+ MPLS = 137,
+ PFSYNC = 240,
};
enum class SocketLevel : u32 {
diff --git a/src/core/hle/service/sockets/sockets_translate.cpp b/src/core/hle/service/sockets/sockets_translate.cpp
index 6b93adb5ce..46ef0a89cb 100644
--- a/src/core/hle/service/sockets/sockets_translate.cpp
+++ b/src/core/hle/service/sockets/sockets_translate.cpp
@@ -175,49 +175,151 @@ Network::Type Translate(Type type) {
Type Translate(Network::Type type) {
switch (type) {
- case Network::Type::Unspecified:
- return Type::Unspecified;
- case Network::Type::STREAM:
- return Type::STREAM;
- case Network::Type::DGRAM:
- return Type::DGRAM;
- case Network::Type::RAW:
- return Type::RAW;
- case Network::Type::SEQPACKET:
- return Type::SEQPACKET;
+ case Network::Type::Unspecified: return Type::Unspecified;
+ case Network::Type::STREAM: return Type::STREAM;
+ case Network::Type::DGRAM: return Type::DGRAM;
+ case Network::Type::RAW: return Type::RAW;
+ case Network::Type::SEQPACKET: return Type::SEQPACKET;
default:
UNIMPLEMENTED_MSG("Unimplemented type={}", type);
return Type{};
}
}
-Network::Protocol Translate(Protocol protocol) {
+#define NETWORK_PROTOCOL_TRANSLATE_LIST \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RAW) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV4) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ST) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PIGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RCCMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NVPII) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PUP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ARGUS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EMCON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(XNET) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CHAOS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MUX) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MEAS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(HMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PRM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TRUNK1) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TRUNK2) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(LEAF1) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(LEAF2) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IRTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(BLT) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(INP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DCCP) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(3PC)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDPR) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(XTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TPXX) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IL) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SDRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ROUTING) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(FRAGMENT) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RSVP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GRE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MHRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(BHA) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ESP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AH) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(INLSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SWIPE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NHRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MOBILE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TLSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SKIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NONE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DSTOPTS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AHIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CFTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(HELLO) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SATEXPAK) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(KRYPTOLAN) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RVD) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPPC) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ADFS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SATMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(VISA) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPCV) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CPNX) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CPHB) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(WSN) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PVP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(BRSATMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ND) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(WBMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(WBEXPAK) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(VMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SVMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(VINES) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCF) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(OSPFIGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SRPC) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(LARP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AX25) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPEIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MICP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCCSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ETHERIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ENCAP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(APES) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPCOMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MH) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDPLITE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(HIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SHIM6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PIM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CARP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PGM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MPLS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PFSYNC)
+[[nodiscard]] Network::Protocol Translate(Protocol protocol) {
switch (protocol) {
- case Protocol::Unspecified:
- return Network::Protocol::Unspecified;
- case Protocol::TCP:
- return Network::Protocol::TCP;
- case Protocol::UDP:
- return Network::Protocol::UDP;
+#define NETWORK_PROTOCOL_TRANSLATE_ELEM(name) case Protocol::name: return Network::Protocol::name;
+ NETWORK_PROTOCOL_TRANSLATE_LIST
+#undef NETWORK_PROTOCOL_TRANSLATE_ELEM
default:
UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
- return Network::Protocol::Unspecified;
+ return {};
}
}
-
-Protocol Translate(Network::Protocol protocol) {
+[[nodiscard]] Protocol Translate(Network::Protocol protocol) {
switch (protocol) {
- case Network::Protocol::Unspecified:
- return Protocol::Unspecified;
- case Network::Protocol::TCP:
- return Protocol::TCP;
- case Network::Protocol::UDP:
- return Protocol::UDP;
+#define NETWORK_PROTOCOL_TRANSLATE_ELEM(name) case Network::Protocol::name: return Protocol::name;
+ NETWORK_PROTOCOL_TRANSLATE_LIST
+#undef NETWORK_PROTOCOL_TRANSLATE_ELEM
default:
UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
- return Protocol::Unspecified;
+ return {};
}
}
+#undef NETWORK_PROTOCOL_TRANSLATE_LIST
Network::PollEvents Translate(PollEvents flags) {
Network::PollEvents result{};
diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp
index 1b27934f69..c95d7ca2da 100644
--- a/src/core/internal_network/network.cpp
+++ b/src/core/internal_network/network.cpp
@@ -326,52 +326,37 @@ Errno GetAndLogLastError(CallType call_type = CallType::Other) {
GetAddrInfoError TranslateGetAddrInfoErrorFromNative(int gai_err) {
switch (gai_err) {
- case 0:
- return GetAddrInfoError::SUCCESS;
+ case 0: return GetAddrInfoError::SUCCESS;
+ case EAI_AGAIN: return GetAddrInfoError::AGAIN;
+ case EAI_BADFLAGS: return GetAddrInfoError::BADFLAGS;
+ case EAI_FAIL: return GetAddrInfoError::FAIL;
+ case EAI_FAMILY: return GetAddrInfoError::FAMILY;
+ case EAI_MEMORY: return GetAddrInfoError::MEMORY;
+ case EAI_NONAME: return GetAddrInfoError::NONAME;
+ case EAI_SERVICE: return GetAddrInfoError::SERVICE;
+ case EAI_SOCKTYPE: return GetAddrInfoError::SOCKTYPE;
+ // These codes may not be defined on all systems:
#ifdef EAI_ADDRFAMILY
- case EAI_ADDRFAMILY:
- return GetAddrInfoError::ADDRFAMILY;
+ case EAI_ADDRFAMILY: return GetAddrInfoError::ADDRFAMILY;
#endif
- case EAI_AGAIN:
- return GetAddrInfoError::AGAIN;
- case EAI_BADFLAGS:
- return GetAddrInfoError::BADFLAGS;
- case EAI_FAIL:
- return GetAddrInfoError::FAIL;
- case EAI_FAMILY:
- return GetAddrInfoError::FAMILY;
- case EAI_MEMORY:
- return GetAddrInfoError::MEMORY;
- case EAI_NONAME:
- return GetAddrInfoError::NONAME;
- case EAI_SERVICE:
- return GetAddrInfoError::SERVICE;
- case EAI_SOCKTYPE:
- return GetAddrInfoError::SOCKTYPE;
- // These codes may not be defined on all systems:
#ifdef EAI_SYSTEM
- case EAI_SYSTEM:
- return GetAddrInfoError::SYSTEM;
+ case EAI_SYSTEM: return GetAddrInfoError::SYSTEM;
#endif
#ifdef EAI_BADHINTS
- case EAI_BADHINTS:
- return GetAddrInfoError::BADHINTS;
+ case EAI_BADHINTS: return GetAddrInfoError::BADHINTS;
#endif
#ifdef EAI_PROTOCOL
- case EAI_PROTOCOL:
- return GetAddrInfoError::PROTOCOL;
+ case EAI_PROTOCOL: return GetAddrInfoError::PROTOCOL;
#endif
#ifdef EAI_OVERFLOW
- case EAI_OVERFLOW:
- return GetAddrInfoError::OVERFLOW_;
+ case EAI_OVERFLOW: return GetAddrInfoError::OVERFLOW_;
#endif
default:
#ifdef EAI_NODATA
// This can't be a case statement because it would create a duplicate
// case on Windows where EAI_NODATA is an alias for EAI_NONAME.
- if (gai_err == EAI_NODATA) {
+ if (gai_err == EAI_NODATA)
return GetAddrInfoError::NODATA;
- }
#endif
return GetAddrInfoError::OTHER;
}
@@ -405,14 +390,10 @@ Type TranslateTypeFromNative(int type) {
switch (type) {
case 0:
return Type::Unspecified;
- case SOCK_STREAM:
- return Type::STREAM;
- case SOCK_DGRAM:
- return Type::DGRAM;
- case SOCK_RAW:
- return Type::RAW;
- case SOCK_SEQPACKET:
- return Type::SEQPACKET;
+ case SOCK_STREAM: return Type::STREAM;
+ case SOCK_DGRAM: return Type::DGRAM;
+ case SOCK_RAW: return Type::RAW;
+ case SOCK_SEQPACKET: return Type::SEQPACKET;
default:
UNIMPLEMENTED_MSG("Unimplemented type={}", type);
return Type::STREAM;
@@ -423,55 +404,227 @@ int TranslateTypeToNative(Type type) {
switch (type) {
case Type::Unspecified:
return 0;
- case Type::STREAM:
- return SOCK_STREAM;
- case Type::DGRAM:
- return SOCK_DGRAM;
- case Type::RAW:
- return SOCK_RAW;
+ case Type::STREAM: return SOCK_STREAM;
+ case Type::DGRAM: return SOCK_DGRAM;
+ case Type::RAW: return SOCK_RAW;
+ case Type::SEQPACKET: return SOCK_SEQPACKET;
default:
UNIMPLEMENTED_MSG("Unimplemented type={}", type);
return 0;
}
}
-Protocol TranslateProtocolFromNative(int protocol) {
+// Some of those protocols may not be supported on some platforms
+// It doesn't really matter, except that some homebrew may not work correctly
+// Official software uses TCP & UDP mainly, SCTP is used by some homebrew as well
+#ifdef __FreeBSD__
+#define NETWORK_PROTOCOL_TRANSLATE_LIST \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RAW) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV4) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ST) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PIGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RCCMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NVPII) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PUP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ARGUS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EMCON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(XNET) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CHAOS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MUX) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MEAS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(HMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PRM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TRUNK1) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TRUNK2) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(LEAF1) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(LEAF2) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IRTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(BLT) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(INP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DCCP) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(3PC)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDPR) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(XTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TPXX) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IL) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SDRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ROUTING) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(FRAGMENT) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RSVP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GRE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MHRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(BHA) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ESP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AH) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(INLSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SWIPE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NHRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MOBILE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TLSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SKIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NONE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DSTOPTS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AHIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CFTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(HELLO) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SATEXPAK) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(KRYPTOLAN) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RVD) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPPC) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ADFS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SATMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(VISA) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPCV) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CPNX) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CPHB) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(WSN) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PVP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(BRSATMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ND) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(WBMON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(WBEXPAK) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EON) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(VMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SVMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(VINES) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCF) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGRP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(OSPFIGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SRPC) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(LARP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AX25) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPEIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MICP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCCSP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ETHERIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ENCAP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(APES) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GMTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPCOMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MH) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDPLITE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(HIP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SHIM6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PIM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(CARP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PGM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MPLS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PFSYNC)
+#elif defined(__linux__)
+// Other platforms get fucked
+#define NETWORK_PROTOCOL_TRANSLATE_LIST \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IP) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(HOPOPTS)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGMP) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(IPIP)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PUP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DCCP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ROUTING) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(FRAGMENT) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RSVP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GRE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ESP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AH) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NONE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DSTOPTS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(MTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ENCAP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PIM) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(COMP)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCTP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDPLITE)
+#elif defined(_WIN32)
+#define NETWORK_PROTOCOL_TRANSLATE_LIST \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(HOPOPTS)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGMP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(GGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV4) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ST) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCP) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(CBT)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(EGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IGP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PUP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(RDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(IPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ROUTING) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(FRAGMENT) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ESP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(AH) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ICMPV6) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(NONE) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(DSTOPTS) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(ND) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(ICLFXBM)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PIM) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(PGM) \
+ /*NETWORK_PROTOCOL_TRANSLATE_ELEM(L2TP)*/ \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCTP)
+#else
+#define NETWORK_PROTOCOL_TRANSLATE_LIST \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(TCP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(UDP) \
+ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCTP)
+#endif
+[[nodiscard]] Protocol TranslateProtocolFromNative(u32 protocol) {
switch (protocol) {
- case 0:
- return Protocol::Unspecified;
- case IPPROTO_TCP:
- return Protocol::TCP;
- case IPPROTO_UDP:
- return Protocol::UDP;
+#define NETWORK_PROTOCOL_TRANSLATE_ELEM(x) case IPPROTO_##x: return Protocol::x;
+ NETWORK_PROTOCOL_TRANSLATE_LIST
+#undef NETWORK_PROTOCOL_TRANSLATE_ELEM
default:
UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
- return Protocol::Unspecified;
+ return Protocol::IP;
}
}
-
-int TranslateProtocolToNative(Protocol protocol) {
+[[nodiscard]] u32 TranslateProtocolToNative(Protocol protocol) {
switch (protocol) {
- case Protocol::Unspecified:
- return 0;
- case Protocol::TCP:
- return IPPROTO_TCP;
- case Protocol::UDP:
- return IPPROTO_UDP;
+#define NETWORK_PROTOCOL_TRANSLATE_ELEM(x) case Protocol::x: return IPPROTO_##x;
+ NETWORK_PROTOCOL_TRANSLATE_LIST
+#undef NETWORK_PROTOCOL_TRANSLATE_ELEM
default:
UNIMPLEMENTED_MSG("Unimplemented protocol={}", protocol);
return 0;
}
}
+#undef NETWORK_PROTOCOL_TRANSLATE_LIST
SockAddrIn TranslateToSockAddrIn(sockaddr_in input, size_t input_len) {
- SockAddrIn result;
-
+ SockAddrIn result{};
result.family = TranslateDomainFromNative(input.sin_family);
-
result.portno = ntohs(input.sin_port);
-
result.ip = TranslateIPv4(input.sin_addr);
-
return result;
}
@@ -685,8 +838,7 @@ Errno Socket::SetSockOpt(SOCKET fd_so, int option, T value) {
}
Errno Socket::Initialize(Domain domain, Type type, Protocol protocol) {
- fd = socket(TranslateDomainToNative(domain), TranslateTypeToNative(type),
- TranslateProtocolToNative(protocol));
+ fd = socket(TranslateDomainToNative(domain), TranslateTypeToNative(type), TranslateProtocolToNative(protocol));
if (fd != INVALID_SOCKET) {
return Errno::SUCCESS;
}