Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 41 additions & 26 deletions src/Tools/dotnet-dsrouter/ADBTcpRouterFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,52 +13,52 @@ namespace Microsoft.Diagnostics.Tools.DiagnosticsServerRouter
{
internal static class ADBCommandExec
{
public static bool AdbAddPortForward(int port, bool rethrow, ILogger logger)
public static bool AdbAddPortForward(int localPort, int remotePort, bool rethrow, ILogger logger)
{
bool ownsPortForward = false;
if (!RunAdbCommandInternal($"forward --list", $"tcp:{port}", 0, rethrow, logger))
if (!RunAdbCommandInternal($"forward --list", $"tcp:{localPort}", 0, rethrow, logger))
{
ownsPortForward = RunAdbCommandInternal($"forward tcp:{port} tcp:{port}", "", 0, rethrow, logger);
ownsPortForward = RunAdbCommandInternal($"forward tcp:{localPort} tcp:{remotePort}", "", 0, rethrow, logger);
if (!ownsPortForward)
{
logger?.LogError($"Failed setting up port forward for tcp:{port}.");
logger?.LogError($"Failed setting up port forward for host tcp:{localPort} <-> device tcp:{remotePort}.");
}
}
return ownsPortForward;
}

public static bool AdbAddPortReverse(int port, bool rethrow, ILogger logger)
public static bool AdbAddPortReverse(int localPort, int remotePort, bool rethrow, ILogger logger)
{
bool ownsPortForward = false;
if (!RunAdbCommandInternal($"reverse --list", $"tcp:{port}", 0, rethrow, logger))
if (!RunAdbCommandInternal($"reverse --list", $"tcp:{remotePort}", 0, rethrow, logger))
{
ownsPortForward = RunAdbCommandInternal($"reverse tcp:{port} tcp:{port}", "", 0, rethrow, logger);
ownsPortForward = RunAdbCommandInternal($"reverse tcp:{remotePort} tcp:{localPort}", "", 0, rethrow, logger);
if (!ownsPortForward)
{
logger?.LogError($"Failed setting up port forward for tcp:{port}.");
logger?.LogError($"Failed setting up port forward for host tcp:{localPort} <-> device tcp:{remotePort}.");
}
}
return ownsPortForward;
}

public static void AdbRemovePortForward(int port, bool ownsPortForward, bool rethrow, ILogger logger)
public static void AdbRemovePortForward(int localPort, int remotePort, bool ownsPortForward, bool rethrow, ILogger logger)
{
if (ownsPortForward)
{
if (!RunAdbCommandInternal($"forward --remove tcp:{port}", "", 0, rethrow, logger))
if (!RunAdbCommandInternal($"forward --remove tcp:{localPort}", "", 0, rethrow, logger))
{
logger?.LogError($"Failed removing port forward for tcp:{port}.");
logger?.LogError($"Failed setting up port forward for host tcp:{localPort} <-> device tcp:{remotePort}.");
}
}
}

public static void AdbRemovePortReverse(int port, bool ownsPortForward, bool rethrow, ILogger logger)
public static void AdbRemovePortReverse(int localPort, int remotePort, bool ownsPortForward, bool rethrow, ILogger logger)
{
if (ownsPortForward)
{
if (!RunAdbCommandInternal($"reverse --remove tcp:{port}", "", 0, rethrow, logger))
if (!RunAdbCommandInternal($"reverse --remove tcp:{remotePort}", "", 0, rethrow, logger))
{
logger?.LogError($"Failed removing port forward for tcp:{port}.");
logger?.LogError($"Failed setting up port forward for host tcp:{localPort} <-> device tcp:{remotePort}.");
}
}
}
Expand Down Expand Up @@ -131,7 +131,8 @@ public static bool RunAdbCommandInternal(string command, string expectedOutput,

internal sealed class ADBTcpServerRouterFactory : TcpServerRouterFactory
{
private readonly int _port;
private readonly int _localPort;
private readonly int _remotePort;
private bool _ownsPortReverse;
private Task _portReverseTask;
private CancellationTokenSource _portReverseTaskCancelToken;
Expand All @@ -144,23 +145,30 @@ public static TcpServerRouterFactory CreateADBInstance(string tcpServer, int run
public ADBTcpServerRouterFactory(string tcpServer, int runtimeTimeoutMs, ILogger logger)
: base(tcpServer, runtimeTimeoutMs, logger)
{
_port = new IpcTcpSocketEndPoint(tcpServer).EndPoint.Port;
_localPort = new IpcTcpSocketEndPoint(tcpServer).EndPoint.Port;
_remotePort = _localPort - 1;

if (_remotePort <= 0)
{
throw new ArgumentException($"Invalid local/remote TCP endpoint ports {_localPort}/{_remotePort}.");
}
}

public override void Start()
{
// Enable port reverse.
try
{
_ownsPortReverse = ADBCommandExec.AdbAddPortReverse(_port, true, Logger);
_ownsPortReverse = ADBCommandExec.AdbAddPortReverse(_localPort, _remotePort, true, Logger);
}
catch
{
_ownsPortReverse = false;
Logger.LogError("Failed setting up adb port reverse." +
" This might lead to problems communicating with Android application." +
" Make sure env variable ANDROID_SDK_ROOT is set and points to an Android SDK." +
$" Executing with unknown adb status for port {_port}.");
$" Executing with unknown adb status for port {_localPort}.");
base.Start();
return;
}

Expand All @@ -170,7 +178,7 @@ public override void Start()
while (await timer.WaitForNextTickAsync(_portReverseTaskCancelToken.Token).ConfigureAwait(false) && !_portReverseTaskCancelToken.Token.IsCancellationRequested)
{
// Make sure reverse port configuration is still active.
if (ADBCommandExec.AdbAddPortReverse(_port, false, Logger) && !_ownsPortReverse)
if (ADBCommandExec.AdbAddPortReverse(_localPort, _remotePort, false, Logger) && !_ownsPortReverse)
{
_ownsPortReverse = true;
}
Expand All @@ -192,14 +200,15 @@ public override async Task Stop()
catch { }

// Disable port reverse.
ADBCommandExec.AdbRemovePortReverse(_port, _ownsPortReverse, false, Logger);
ADBCommandExec.AdbRemovePortReverse(_localPort, _remotePort, _ownsPortReverse, false, Logger);
_ownsPortReverse = false;
}
}

internal sealed class ADBTcpClientRouterFactory : TcpClientRouterFactory
{
private readonly int _port;
private readonly int _localPort;
private readonly int _remotePort;
private bool _ownsPortForward;
private Task _portForwardTask;
private CancellationTokenSource _portForwardTaskCancelToken;
Expand All @@ -212,23 +221,29 @@ public static TcpClientRouterFactory CreateADBInstance(string tcpClient, int run
public ADBTcpClientRouterFactory(string tcpClient, int runtimeTimeoutMs, ILogger logger)
: base(tcpClient, runtimeTimeoutMs, logger)
{
_port = new IpcTcpSocketEndPoint(tcpClient).EndPoint.Port;
_localPort = new IpcTcpSocketEndPoint(tcpClient).EndPoint.Port;
_remotePort = _localPort - 1;

if (_remotePort <= 0)
{
throw new ArgumentException($"Invalid local/remote TCP endpoint ports {_localPort}/{_remotePort}.");
}
}

public override void Start()
{
// Enable port forwarding.
try
{
_ownsPortForward = ADBCommandExec.AdbAddPortForward(_port, true, Logger);
_ownsPortForward = ADBCommandExec.AdbAddPortForward(_localPort, _remotePort, true, Logger);
}
catch
{
_ownsPortForward = false;
Logger.LogError("Failed setting up adb port forward." +
" This might lead to problems communicating with Android application." +
" Make sure env variable ANDROID_SDK_ROOT is set and points to an Android SDK." +
$" Executing with unknown adb status for port {_port}.");
$" Executing with unknown adb status for port {_localPort}.");
return;
}

Expand All @@ -238,7 +253,7 @@ public override void Start()
while (await timer.WaitForNextTickAsync(_portForwardTaskCancelToken.Token).ConfigureAwait(false) && !_portForwardTaskCancelToken.Token.IsCancellationRequested)
{
// Make sure forward port configuration is still active.
if (ADBCommandExec.AdbAddPortForward(_port, false, Logger) && !_ownsPortForward)
if (ADBCommandExec.AdbAddPortForward(_localPort, _remotePort, false, Logger) && !_ownsPortForward)
{
_ownsPortForward = true;
}
Expand All @@ -256,7 +271,7 @@ public override void Stop()
catch { }

// Disable port forwarding.
ADBCommandExec.AdbRemovePortForward(_port, _ownsPortForward, false, Logger);
ADBCommandExec.AdbRemovePortForward(_localPort, _remotePort, _ownsPortForward, false, Logger);
_ownsPortForward = false;
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/Tools/dotnet-dsrouter/DiagnosticsServerRouterCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ public async Task<int> RunIpcClientWebSocketServerRouter(CancellationToken token

public async Task<int> RunIpcServerIOSSimulatorRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info)
{
if (info)
if (info || ParseLogLevel(verbose) <= LogLevel.Information)
{
logRouterUsageInfo("ios simulator", "127.0.0.1:9000", true);
}
Expand All @@ -346,7 +346,7 @@ public async Task<int> RunIpcServerIOSSimulatorRouter(CancellationToken token, i

public async Task<int> RunIpcServerIOSRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info)
{
if (info)
if (info || ParseLogLevel(verbose) <= LogLevel.Information)
{
logRouterUsageInfo("ios device", "127.0.0.1:9000", true);
}
Expand All @@ -356,7 +356,7 @@ public async Task<int> RunIpcServerIOSRouter(CancellationToken token, int runtim

public async Task<int> RunIpcServerAndroidEmulatorRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info)
{
if (info)
if (info || ParseLogLevel(verbose) <= LogLevel.Information)
{
logRouterUsageInfo("android emulator", "10.0.2.2:9000", false);
}
Expand All @@ -366,12 +366,12 @@ public async Task<int> RunIpcServerAndroidEmulatorRouter(CancellationToken token

public async Task<int> RunIpcServerAndroidRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info)
{
if (info)
if (info || ParseLogLevel(verbose) <= LogLevel.Information)
{
logRouterUsageInfo("android device", "127.0.0.1:9000", false);
}

return await RunIpcServerTcpServerRouter(token, "", "127.0.0.1:9000", runtimeTimeout, verbose, "Android").ConfigureAwait(false);
return await RunIpcServerTcpServerRouter(token, "", "127.0.0.1:9001", runtimeTimeout, verbose, "Android").ConfigureAwait(false);
}

private static string GetDefaultIpcServerPath(ILogger logger)
Expand Down