From d919284b59a4d404f4fcf84fa6c24c48f72360a2 Mon Sep 17 00:00:00 2001 From: gnattu Date: Tue, 7 May 2024 06:53:02 +0800 Subject: [PATCH 1/3] Let AutoDiscoveryHost bind to all addresses Signed-off-by: gnattu --- src/Jellyfin.Networking/AutoDiscoveryHost.cs | 75 +++++++++----------- 1 file changed, 32 insertions(+), 43 deletions(-) diff --git a/src/Jellyfin.Networking/AutoDiscoveryHost.cs b/src/Jellyfin.Networking/AutoDiscoveryHost.cs index f1b79b4b4f..4f7a28d541 100644 --- a/src/Jellyfin.Networking/AutoDiscoveryHost.cs +++ b/src/Jellyfin.Networking/AutoDiscoveryHost.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; @@ -11,7 +10,6 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Model.ApiClient; -using MediaBrowser.Model.Net; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -51,25 +49,6 @@ public sealed class AutoDiscoveryHost : BackgroundService _networkManager = networkManager; } - private static IPAddress GetBindAddress(IPData intf) - { - if (intf.AddressFamily == AddressFamily.InterNetwork) - { - if (OperatingSystem.IsLinux()) - { - return NetworkUtils.GetBroadcastAddress(intf.Subnet); - } - - if (OperatingSystem.IsMacOS()) - { - // macOS kernel does not allow bind to 127:255:255:255 - return IPAddress.IsLoopback(intf.Address) ? intf.Address : NetworkUtils.GetBroadcastAddress(intf.Subnet); - } - } - - return intf.Address; - } - /// protected override async Task ExecuteAsync(CancellationToken stoppingToken) { @@ -80,17 +59,7 @@ public sealed class AutoDiscoveryHost : BackgroundService } var udpServers = new List(); - // Linux needs to bind to the broadcast addresses to receive broadcast traffic - if (OperatingSystem.IsLinux() && networkConfig.EnableIPv4) - { - udpServers.Add(ListenForAutoDiscoveryMessage(IPAddress.Broadcast, IPAddress.Broadcast, stoppingToken)); - } - - udpServers.AddRange(_networkManager.GetInternalBindAddresses() - .Select(intf => ListenForAutoDiscoveryMessage( - GetBindAddress(intf), - intf.Address, - stoppingToken))); + udpServers.Add(ListenForAutoDiscoveryMessage(IPAddress.Any, IPAddress.Any, stoppingToken)); await Task.WhenAll(udpServers).ConfigureAwait(false); } @@ -110,7 +79,7 @@ public sealed class AutoDiscoveryHost : BackgroundService var text = Encoding.UTF8.GetString(result.Buffer); if (text.Contains("who is JellyfinServer?", StringComparison.OrdinalIgnoreCase)) { - await RespondToV2Message(respondAddress, result.RemoteEndPoint, cancellationToken).ConfigureAwait(false); + await RespondToV2Message(respondAddress, result.RemoteEndPoint, udpClient, cancellationToken).ConfigureAwait(false); } } catch (SocketException ex) @@ -130,28 +99,48 @@ public sealed class AutoDiscoveryHost : BackgroundService } } - private async Task RespondToV2Message(IPAddress responderIp, IPEndPoint endpoint, CancellationToken cancellationToken) + private async Task RespondToV2Message(IPAddress responderIp, IPEndPoint endpoint, UdpClient broadCastUdpClient, CancellationToken cancellationToken) { var localUrl = _appHost.GetSmartApiUrl(endpoint.Address); if (string.IsNullOrEmpty(localUrl)) { - _logger.LogWarning("Unable to respond to server discovery request because the local ip address could not be determined."); + _logger.LogWarning("Unable to respond to server discovery request because the local ip address could not be determined"); return; } var response = new ServerDiscoveryInfo(localUrl, _appHost.SystemId, _appHost.FriendlyName); + var listenerEndpoint = (IPEndPoint?)broadCastUdpClient.Client.LocalEndPoint; + var listenerIp = listenerEndpoint?.Address; - using var responder = new UdpClient(new IPEndPoint(responderIp, PortNumber)); - try + // Reuse the UdpClient if listener IP equals to responder, otherwise create a new one and respond with that + if (Equals(listenerIp, responderIp)) { - _logger.LogDebug("Sending AutoDiscovery response"); - await responder - .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) - .ConfigureAwait(false); + try + { + _logger.LogDebug("Sending AutoDiscovery response"); + await broadCastUdpClient + .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) + .ConfigureAwait(false); + } + catch (SocketException ex) + { + _logger.LogError(ex, "Error sending response message"); + } } - catch (SocketException ex) + else { - _logger.LogError(ex, "Error sending response message"); + using var responder = new UdpClient(new IPEndPoint(responderIp, PortNumber)); + try + { + _logger.LogDebug("Sending AutoDiscovery response"); + await responder + .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) + .ConfigureAwait(false); + } + catch (SocketException ex) + { + _logger.LogError(ex, "Error sending response message"); + } } } } From 07faa8a3fbdcae4b8bb99dcd3537693d7ba6bd5a Mon Sep 17 00:00:00 2001 From: gnattu Date: Tue, 7 May 2024 07:36:41 +0800 Subject: [PATCH 2/3] Cleanup unused code Signed-off-by: gnattu --- src/Jellyfin.Networking/AutoDiscoveryHost.cs | 41 ++++---------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/src/Jellyfin.Networking/AutoDiscoveryHost.cs b/src/Jellyfin.Networking/AutoDiscoveryHost.cs index 4f7a28d541..7bfa3b7be7 100644 --- a/src/Jellyfin.Networking/AutoDiscoveryHost.cs +++ b/src/Jellyfin.Networking/AutoDiscoveryHost.cs @@ -58,10 +58,7 @@ public sealed class AutoDiscoveryHost : BackgroundService return; } - var udpServers = new List(); - udpServers.Add(ListenForAutoDiscoveryMessage(IPAddress.Any, IPAddress.Any, stoppingToken)); - - await Task.WhenAll(udpServers).ConfigureAwait(false); + await ListenForAutoDiscoveryMessage(IPAddress.Any, IPAddress.Any, stoppingToken).ConfigureAwait(false); } private async Task ListenForAutoDiscoveryMessage(IPAddress listenAddress, IPAddress respondAddress, CancellationToken cancellationToken) @@ -109,38 +106,16 @@ public sealed class AutoDiscoveryHost : BackgroundService } var response = new ServerDiscoveryInfo(localUrl, _appHost.SystemId, _appHost.FriendlyName); - var listenerEndpoint = (IPEndPoint?)broadCastUdpClient.Client.LocalEndPoint; - var listenerIp = listenerEndpoint?.Address; - - // Reuse the UdpClient if listener IP equals to responder, otherwise create a new one and respond with that - if (Equals(listenerIp, responderIp)) + try { - try - { - _logger.LogDebug("Sending AutoDiscovery response"); - await broadCastUdpClient - .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) - .ConfigureAwait(false); - } - catch (SocketException ex) - { - _logger.LogError(ex, "Error sending response message"); - } + _logger.LogDebug("Sending AutoDiscovery response"); + await broadCastUdpClient + .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) + .ConfigureAwait(false); } - else + catch (SocketException ex) { - using var responder = new UdpClient(new IPEndPoint(responderIp, PortNumber)); - try - { - _logger.LogDebug("Sending AutoDiscovery response"); - await responder - .SendAsync(JsonSerializer.SerializeToUtf8Bytes(response).AsMemory(), endpoint, cancellationToken) - .ConfigureAwait(false); - } - catch (SocketException ex) - { - _logger.LogError(ex, "Error sending response message"); - } + _logger.LogError(ex, "Error sending response message"); } } } From 76757719f717dbe34687c5c9f0ee965a908ec25d Mon Sep 17 00:00:00 2001 From: gnattu Date: Tue, 7 May 2024 07:39:47 +0800 Subject: [PATCH 3/3] Cleanup more unused code Signed-off-by: gnattu --- src/Jellyfin.Networking/AutoDiscoveryHost.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Jellyfin.Networking/AutoDiscoveryHost.cs b/src/Jellyfin.Networking/AutoDiscoveryHost.cs index 7bfa3b7be7..ff0d179b94 100644 --- a/src/Jellyfin.Networking/AutoDiscoveryHost.cs +++ b/src/Jellyfin.Networking/AutoDiscoveryHost.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; @@ -58,10 +57,10 @@ public sealed class AutoDiscoveryHost : BackgroundService return; } - await ListenForAutoDiscoveryMessage(IPAddress.Any, IPAddress.Any, stoppingToken).ConfigureAwait(false); + await ListenForAutoDiscoveryMessage(IPAddress.Any, stoppingToken).ConfigureAwait(false); } - private async Task ListenForAutoDiscoveryMessage(IPAddress listenAddress, IPAddress respondAddress, CancellationToken cancellationToken) + private async Task ListenForAutoDiscoveryMessage(IPAddress listenAddress, CancellationToken cancellationToken) { try { @@ -76,7 +75,7 @@ public sealed class AutoDiscoveryHost : BackgroundService var text = Encoding.UTF8.GetString(result.Buffer); if (text.Contains("who is JellyfinServer?", StringComparison.OrdinalIgnoreCase)) { - await RespondToV2Message(respondAddress, result.RemoteEndPoint, udpClient, cancellationToken).ConfigureAwait(false); + await RespondToV2Message(result.RemoteEndPoint, udpClient, cancellationToken).ConfigureAwait(false); } } catch (SocketException ex) @@ -96,7 +95,7 @@ public sealed class AutoDiscoveryHost : BackgroundService } } - private async Task RespondToV2Message(IPAddress responderIp, IPEndPoint endpoint, UdpClient broadCastUdpClient, CancellationToken cancellationToken) + private async Task RespondToV2Message(IPEndPoint endpoint, UdpClient broadCastUdpClient, CancellationToken cancellationToken) { var localUrl = _appHost.GetSmartApiUrl(endpoint.Address); if (string.IsNullOrEmpty(localUrl))