Просмотр исходного кода

Add logging in socket implementation (#661)

Adds logging to most Socket calls to help with debugging network
issues.

Shouldn't affect any functionality. There's a small chance it could spam
the log in some games.
Vudjun 1 год назад
Родитель
Сommit
61975ca44d

+ 12 - 1
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);
         }
 

+ 78 - 5
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<byte> 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);
             }
         }

+ 11 - 1
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);
         }
     }