From a5d6236508a4c60e33bf78e340a6125b810acfd4 Mon Sep 17 00:00:00 2001 From: lizzie Date: Thu, 21 May 2026 17:13:13 +0000 Subject: [PATCH] implement the rest --- src/core/hle/service/sockets/sockets.h | 112 ++++++++++++- .../hle/service/sockets/sockets_translate.cpp | 156 +++++++++++++++--- src/core/internal_network/network.cpp | 12 +- 3 files changed, 245 insertions(+), 35 deletions(-) diff --git a/src/core/hle/service/sockets/sockets.h b/src/core/hle/service/sockets/sockets.h index a94975b859..2837ce71ea 100644 --- a/src/core/hle/service/sockets/sockets.h +++ b/src/core/hle/service/sockets/sockets.h @@ -65,11 +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 ac5f2d760e..c95d7ca2da 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -598,19 +598,17 @@ int TranslateTypeToNative(Type type) { NETWORK_PROTOCOL_TRANSLATE_ELEM(UDP) \ NETWORK_PROTOCOL_TRANSLATE_ELEM(SCTP) #endif - -Protocol TranslateProtocolFromNative(int protocol) { +[[nodiscard]] Protocol TranslateProtocolFromNative(u32 protocol) { switch (protocol) { #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) { #define NETWORK_PROTOCOL_TRANSLATE_ELEM(x) case Protocol::x: return IPPROTO_##x; NETWORK_PROTOCOL_TRANSLATE_LIST @@ -620,6 +618,7 @@ int TranslateProtocolToNative(Protocol protocol) { return 0; } } +#undef NETWORK_PROTOCOL_TRANSLATE_LIST SockAddrIn TranslateToSockAddrIn(sockaddr_in input, size_t input_len) { SockAddrIn result{}; @@ -839,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; }