From a45f6d9438c0766131ce5fb84444440999458f37 Mon Sep 17 00:00:00 2001 From: SMarioMan Date: Wed, 15 Feb 2023 07:59:38 -0500 Subject: [PATCH 1/3] Enable broadcast permissions in socket requests --- Source/Core/Core/IOS/Network/Socket.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Core/Core/IOS/Network/Socket.cpp b/Source/Core/Core/IOS/Network/Socket.cpp index edd88fc898..ce24ab90b6 100644 --- a/Source/Core/Core/IOS/Network/Socket.cpp +++ b/Source/Core/Core/IOS/Network/Socket.cpp @@ -872,6 +872,9 @@ s32 WiiSockMan::AddSocket(s32 fd, bool is_rw) if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &opt_no_sigpipe, sizeof(opt_no_sigpipe)) < 0) ERROR_LOG_FMT(IOS_NET, "Failed to set SO_NOSIGPIPE on socket"); #endif + + BOOL opt_broadcast = TRUE; + setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*)&opt_broadcast, sizeof(opt_broadcast)); } SetLastNetError(wii_fd); From 301e97f7f73a520dc41dfc0931286b2595918204 Mon Sep 17 00:00:00 2001 From: SMarioMan Date: Wed, 15 Feb 2023 09:29:21 -0500 Subject: [PATCH 2/3] Remove WinAPI-specific type from socket request --- Source/Core/Core/IOS/Network/Socket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Core/Core/IOS/Network/Socket.cpp b/Source/Core/Core/IOS/Network/Socket.cpp index ce24ab90b6..e32762f69d 100644 --- a/Source/Core/Core/IOS/Network/Socket.cpp +++ b/Source/Core/Core/IOS/Network/Socket.cpp @@ -873,7 +873,7 @@ s32 WiiSockMan::AddSocket(s32 fd, bool is_rw) ERROR_LOG_FMT(IOS_NET, "Failed to set SO_NOSIGPIPE on socket"); #endif - BOOL opt_broadcast = TRUE; + int opt_broadcast = 1; setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*)&opt_broadcast, sizeof(opt_broadcast)); } From 078730c87377dab28b55845026e254a9c13db911 Mon Sep 17 00:00:00 2001 From: SMarioMan Date: Wed, 1 Mar 2023 20:52:43 -0500 Subject: [PATCH 3/3] Avoid altering TCP sockets Co-authored-by: sepalani --- Source/Core/Core/IOS/Network/Socket.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/IOS/Network/Socket.cpp b/Source/Core/Core/IOS/Network/Socket.cpp index e32762f69d..a1fe3d6a27 100644 --- a/Source/Core/Core/IOS/Network/Socket.cpp +++ b/Source/Core/Core/IOS/Network/Socket.cpp @@ -873,8 +873,25 @@ s32 WiiSockMan::AddSocket(s32 fd, bool is_rw) ERROR_LOG_FMT(IOS_NET, "Failed to set SO_NOSIGPIPE on socket"); #endif - int opt_broadcast = 1; - setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*)&opt_broadcast, sizeof(opt_broadcast)); + // Wii UDP sockets can use broadcast address by default + if (!is_rw) + { + const auto state = Common::SaveNetworkErrorState(); + Common::ScopeGuard guard([&state] { Common::RestoreNetworkErrorState(state); }); + + int socket_type; + socklen_t option_length = sizeof(socket_type); + const bool is_udp = getsockopt(fd, SOL_SOCKET, SO_TYPE, reinterpret_cast(&socket_type), + &option_length) == 0 && + socket_type == SOCK_DGRAM; + const int opt_broadcast = 1; + if (is_udp && + setsockopt(fd, SOL_SOCKET, SO_BROADCAST, reinterpret_cast(&opt_broadcast), + sizeof(opt_broadcast)) != 0) + { + ERROR_LOG_FMT(IOS_NET, "Failed to set SO_BROADCAST on socket"); + } + } } SetLastNetError(wii_fd);