diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs index 8475424ce..b8deb2c45 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/IClient.cs @@ -34,6 +34,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { if (errorCode != LinuxError.SUCCESS) { + if (errorCode != LinuxError.EWOULDBLOCK) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Operation failed with error {errorCode}."); + } result = -1; } @@ -66,6 +70,8 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd BsdSocketType type = (BsdSocketType)context.RequestData.ReadInt32(); ProtocolType protocol = (ProtocolType)context.RequestData.ReadInt32(); + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Creating socket with domain={domain}, type={type}, protocol={protocol}"); + BsdSocketCreationFlags creationFlags = (BsdSocketCreationFlags)((int)type >> (int)BsdSocketCreationFlags.FlagsShift); type &= BsdSocketType.TypeMask; @@ -111,6 +117,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd if (exempt) { + Logger.Info?.Print(LogClass.ServiceBsd, "Disconnecting exempt socket."); newBsdSocket.Disconnect(); } @@ -797,7 +804,11 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd { errno = socket.Listen(backlog); } - + else + { + Logger.Warning?.PrintMsg(LogClass.ServiceBsd, $"Invalid socket fd '{socketFd}'."); + } + return WriteBsdResult(context, 0, errno); } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs index 981fe0a8f..3c367660a 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Impl/ManagedSocket.cs @@ -92,18 +92,30 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { newSocket = new ManagedSocket(Socket.Accept()); + IPEndPoint remoteEndPoint = newSocket.RemoteEndPoint; + bool isPrivateIp = remoteEndPoint.Address.ToString().StartsWith("192.168."); + Logger.Info?.PrintMsg(LogClass.ServiceBsd, + isPrivateIp + ? $"Accepted connection from {ProtocolType}/{remoteEndPoint.Address}:{remoteEndPoint.Port}" + : $"Accepted connection from {ProtocolType}/***:{remoteEndPoint.Port}"); + return LinuxError.SUCCESS; } catch (SocketException exception) { newSocket = null; + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } public LinuxError Bind(IPEndPoint localEndPoint) { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Socket binding to: {ProtocolType}/{localEndPoint.Port}"); try { Socket.Bind(localEndPoint); @@ -112,6 +124,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -123,6 +139,15 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public LinuxError Connect(IPEndPoint remoteEndPoint) { + bool isLDNPrivateIP = remoteEndPoint.Address.ToString().StartsWith("192.168."); + if (isLDNPrivateIP) + { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Connecting to: {ProtocolType}/{remoteEndPoint.Address}:{remoteEndPoint.Port}"); + } + else + { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Connecting to: {ProtocolType}/***:{remoteEndPoint.Port}"); + } try { Socket.Connect(remoteEndPoint); @@ -137,6 +162,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } else { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -144,11 +173,13 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl public void Disconnect() { + Logger.Info?.Print(LogClass.ServiceBsd, "Socket disconnecting"); Socket.Disconnect(true); } public void Dispose() { + Logger.Info?.Print(LogClass.ServiceBsd, "Socket closed"); Socket.Close(); Socket.Dispose(); } @@ -159,10 +190,16 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl { Socket.Listen(backlog); + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Socket listening: {ProtocolType}/{(Socket.LocalEndPoint as IPEndPoint).Port}"); + return LinuxError.SUCCESS; } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -182,11 +219,15 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } - bool hasEmittedBlockingWarning = false; + private bool _hasEmittedBlockingWarning; public LinuxError Receive(out int receiveSize, Span buffer, BsdSocketFlags flags) { @@ -202,10 +243,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl shouldBlockAfterOperation = true; } - if (Blocking && !hasEmittedBlockingWarning) + if (Blocking && !_hasEmittedBlockingWarning) { Logger.Warning?.PrintMsg(LogClass.ServiceBsd, "Blocking socket operations are not yet working properly. Expect network errors."); - hasEmittedBlockingWarning = true; + _hasEmittedBlockingWarning = true; } receiveSize = Socket.Receive(buffer, ConvertBsdSocketFlags(flags)); @@ -214,6 +255,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } receiveSize = -1; result = WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -245,10 +290,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl shouldBlockAfterOperation = true; } - if (Blocking && !hasEmittedBlockingWarning) + if (Blocking && !_hasEmittedBlockingWarning) { Logger.Warning?.PrintMsg(LogClass.ServiceBsd, "Blocking socket operations are not yet working properly. Expect network errors."); - hasEmittedBlockingWarning = true; + _hasEmittedBlockingWarning = true; } if (!Socket.IsBound) @@ -265,6 +310,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } receiveSize = -1; result = WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -288,6 +337,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } sendSize = -1; return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -304,6 +357,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } sendSize = -1; return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); @@ -341,6 +398,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -387,6 +448,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -519,6 +584,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } @@ -557,6 +626,10 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Impl } catch (SocketException exception) { + if (exception.SocketErrorCode != SocketError.WouldBlock) + { + Logger.Warning?.Print(LogClass.ServiceBsd, $"Socket Exception: {exception}"); + } return WinSockHelper.ConvertError((WsaError)exception.ErrorCode); } } diff --git a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs index 9f206176d..b442cf802 100644 --- a/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs +++ b/src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Proxy/SocketHelpers.cs @@ -1,4 +1,6 @@ +using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy; +using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types; using System; using System.Collections.Generic; using System.Linq; @@ -64,10 +66,18 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Proxy { if (_proxy.Supported(domain, type, protocol)) { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Socket is using LDN proxy"); return new LdnProxySocket(domain, type, protocol, _proxy); } + else + { + Logger.Warning?.PrintMsg(LogClass.ServiceBsd, $"LDN proxy does not support socket {domain}, {type}, {protocol}"); + } + } + else + { + Logger.Info?.PrintMsg(LogClass.ServiceBsd, $"Opening socket using host networking stack"); } - return new DefaultSocket(domain, type, protocol, lanInterfaceId); } }