From d406c42e152d1d430cac7e00be3eafd7cf959c25 Mon Sep 17 00:00:00 2001 From: Vudjun Date: Sat, 8 Feb 2025 18:28:41 +0000 Subject: [PATCH 1/2] Make the uPNP device search more reliable --- .../LdnRyu/Proxy/P2pProxyServer.cs | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs index 4a217b88b..fb2f19afd 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs @@ -110,24 +110,9 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy _broadcastAddress = config.ProxyIp | (~config.ProxySubnetMask); } - public async Task NatPunch() + private async Task NatPunchForDevice(NatDevice device) { - NatDiscoverer discoverer = new(); - CancellationTokenSource cts = new(5000); - - NatDevice device; - - try - { - device = await discoverer.DiscoverDeviceAsync(PortMapper.Upnp, cts); - } - catch (NatDeviceNotFoundException) - { - return 0; - } - - _publicPort = PublicPortBase; - + Logger.Trace?.PrintMsg(LogClass.ServiceLdn, $"Attempting to map port using {device.ToString()}"); for (int i = 0; i < PublicPortRange; i++) { try @@ -138,12 +123,14 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy break; } - catch (MappingException) + catch (MappingException ex) { + Logger.Trace?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.Message}"); _publicPort++; } - catch (Exception) + catch (Exception ex) { + Logger.Trace?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.GetType().Name}: {ex.Message}"); return 0; } @@ -155,17 +142,52 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy if (_publicPort != 0) { + _natDevice = device; _ = Executor.ExecuteAfterDelayAsync( - PortLeaseRenew.Seconds(), + PortLeaseRenew.Seconds(), _disposedCancellation.Token, RefreshLease); } - _natDevice = device; - return _publicPort; } + public async Task NatPunch() + { + NatDiscoverer discoverer = new(); + CancellationTokenSource cts = new(5000); + + NatDevice[] devices; + + try + { + devices = (await discoverer.DiscoverDevicesAsync(PortMapper.Upnp, cts)).ToArray(); + } + catch (Exception ex) + { + Logger.Error?.PrintMsg(LogClass.ServiceLdn, $"Failed to discover UPnP devices: {ex.Message}"); + return 0; + } + + if (devices.Length == 0) + { + Logger.Error?.PrintMsg(LogClass.ServiceLdn, "No UPnP devices found."); + return 0; + } + + foreach (var device in devices) + { + _publicPort = PublicPortBase; + ushort port = await NatPunchForDevice(device); + if (port != 0) + { + return port; + } + } + Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port using any device"); + return 0; + } + // Proxy handlers private void RouteMessage(P2pProxySession sender, ref ProxyInfo info, Action action) -- 2.47.2 From bcbe589964159b92544146ab664447f1be1d80b3 Mon Sep 17 00:00:00 2001 From: Vudjun Date: Sat, 8 Feb 2025 23:14:29 +0000 Subject: [PATCH 2/2] Decrease timeout on uPNP to avoid timeout issue on smash bros and change debug statements to Info --- .../UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs index fb2f19afd..eb21f1996 100644 --- a/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Ldn/UserServiceCreator/LdnRyu/Proxy/P2pProxyServer.cs @@ -112,7 +112,8 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy private async Task NatPunchForDevice(NatDevice device) { - Logger.Trace?.PrintMsg(LogClass.ServiceLdn, $"Attempting to map port using {device.ToString()}"); + Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Attempting to map port using {device.ToString()}"); + _publicPort = PublicPortBase; for (int i = 0; i < PublicPortRange; i++) { try @@ -125,12 +126,12 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy } catch (MappingException ex) { - Logger.Trace?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.Message}"); + Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.Message}"); _publicPort++; } catch (Exception ex) { - Logger.Trace?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.GetType().Name}: {ex.Message}"); + Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port {_publicPort}: {ex.GetType().Name}: {ex.Message}"); return 0; } @@ -155,7 +156,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy public async Task NatPunch() { NatDiscoverer discoverer = new(); - CancellationTokenSource cts = new(5000); + CancellationTokenSource cts = new(500); NatDevice[] devices; @@ -177,7 +178,6 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy foreach (var device in devices) { - _publicPort = PublicPortBase; ushort port = await NatPunchForDevice(device); if (port != 0) { @@ -185,6 +185,7 @@ namespace Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy } } Logger.Info?.PrintMsg(LogClass.ServiceLdn, $"Failed to map port using any device"); + _publicPort = 0; return 0; } -- 2.47.2