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; }