diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 608a042998..b3dd89932e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -718,11 +718,29 @@ s32 sys_net_bnet_getsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: native_opt = SO_BROADCAST; break; } +#ifdef _WIN32 + case SYS_NET_SO_REUSEADDR: + { + *(be_t*)optval.get_ptr() = sock.so_reuseaddr; + return 0; + } + case SYS_NET_SO_REUSEPORT: + { + *(be_t*)optval.get_ptr() = sock.so_reuseport; + return 0; + } +#else case SYS_NET_SO_REUSEADDR: { native_opt = SO_REUSEADDR; break; } + case SYS_NET_SO_REUSEPORT: + { + native_opt = SO_REUSEPORT; + break; + } +#endif case SYS_NET_SO_SNDTIMEO: case SYS_NET_SO_RCVTIMEO: { @@ -1166,11 +1184,33 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm:: native_opt = SO_BROADCAST; break; } +#ifdef _WIN32 + case SYS_NET_SO_REUSEADDR: + { + native_opt = SO_REUSEADDR; + sock.so_reuseaddr = native_int; + native_int = sock.so_reuseaddr || sock.so_reuseport ? 1 : 0; + break; + } + case SYS_NET_SO_REUSEPORT: + { + native_opt = SO_REUSEADDR; + sock.so_reuseport = native_int; + native_int = sock.so_reuseaddr || sock.so_reuseport ? 1 : 0; + break; + } +#else case SYS_NET_SO_REUSEADDR: { native_opt = SO_REUSEADDR; break; } + case SYS_NET_SO_REUSEPORT: + { + native_opt = SO_REUSEPORT; + break; + } +#endif case SYS_NET_SO_SNDTIMEO: case SYS_NET_SO_RCVTIMEO: { diff --git a/rpcs3/Emu/Cell/lv2/sys_net.h b/rpcs3/Emu/Cell/lv2/sys_net.h index ed5ad3b8f9..db50214576 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.h +++ b/rpcs3/Emu/Cell/lv2/sys_net.h @@ -346,6 +346,12 @@ struct lv2_socket final // Unsupported option s32 so_tcp_maxseg = 1500; + // Value keepers +#ifdef _WIN32 + s32 so_reuseaddr = 0; + s32 so_reuseport = 0; +#endif + // Event processing workload (pair of thread id and the processing function) std::vector)>>> queue; };