| Index: tools/telemetry/telemetry/core/forwarders/android_forwarder.py
|
| diff --git a/tools/telemetry/telemetry/core/forwarders/android_forwarder.py b/tools/telemetry/telemetry/core/forwarders/android_forwarder.py
|
| index a3c3b1959a22096da5808137192d6b9c10e23a41..c522c3c8b9487ba75a0271ddb77e56f725e8cfd7 100644
|
| --- a/tools/telemetry/telemetry/core/forwarders/android_forwarder.py
|
| +++ b/tools/telemetry/telemetry/core/forwarders/android_forwarder.py
|
| @@ -34,8 +34,7 @@ class AndroidForwarderFactory(forwarders.ForwarderFactory):
|
|
|
| def Create(self, port_pairs):
|
| if self._rndis_configurator:
|
| - return AndroidRndisForwarder(self._adb, self.host_ip,
|
| - self._rndis_configurator.device_iface,
|
| + return AndroidRndisForwarder(self._adb, self._rndis_configurator,
|
| port_pairs)
|
| return AndroidForwarder(self._adb, port_pairs)
|
|
|
| @@ -68,17 +67,20 @@ class AndroidForwarder(forwarders.Forwarder):
|
| class AndroidRndisForwarder(forwarders.Forwarder):
|
| """Forwards traffic using RNDIS. Assumes the device has root access."""
|
|
|
| - def __init__(self, adb, host_ip, device_iface, port_pairs):
|
| + def __init__(self, adb, rndis_configurator, port_pairs):
|
| super(AndroidRndisForwarder, self).__init__(port_pairs)
|
|
|
| self._adb = adb
|
| - self._device_iface = device_iface
|
| - self._host_ip = host_ip
|
| + self._rndis_configurator = rndis_configurator
|
| + self._device_iface = rndis_configurator.device_iface
|
| + self._host_ip = rndis_configurator.host_ip
|
| self._original_dns = None, None, None
|
| self._RedirectPorts(port_pairs)
|
| if port_pairs.dns:
|
| self._OverrideDns()
|
| - self._OverrideRoutingPolicy()
|
| + # Need to override routing policy again since call to setifdns
|
| + # sometimes resets policy table
|
| + self._rndis_configurator.OverrideRoutingPolicy()
|
| # TODO(tonyg): Verify that each port can connect to host.
|
|
|
| @property
|
| @@ -86,8 +88,8 @@ class AndroidRndisForwarder(forwarders.Forwarder):
|
| return self._host_ip
|
|
|
| def Close(self):
|
| + self._rndis_configurator.RestoreRoutingPolicy()
|
| self._SetDns(*self._original_dns)
|
| - self._RestoreRoutingPolicy()
|
| super(AndroidRndisForwarder, self).Close()
|
|
|
| def _RedirectPorts(self, port_pairs):
|
| @@ -146,21 +148,6 @@ class AndroidRndisForwarder(forwarders.Forwarder):
|
| self._adb.device().GetProp('net.dns2'),
|
| )
|
|
|
| - def _OverrideRoutingPolicy(self):
|
| - """Override any routing policy that could prevent
|
| - packets from reaching the rndis interface
|
| - """
|
| - policies = self._adb.RunShellCommand('ip rule')
|
| - if len(policies) > 1 and not ('lookup main' in policies[1]):
|
| - self._adb.RunShellCommand('ip rule add prio 1 from all table main')
|
| - self._adb.RunShellCommand('ip route flush cache')
|
| -
|
| - def _RestoreRoutingPolicy(self):
|
| - policies = self._adb.RunShellCommand('ip rule')
|
| - if len(policies) > 1 and re.match("^1:.*lookup main", policies[1]):
|
| - self._adb.RunShellCommand('ip rule del prio 1')
|
| - self._adb.RunShellCommand('ip route flush cache')
|
| -
|
|
|
| class AndroidRndisConfigurator(object):
|
| """Configures a linux host to connect to an android device via RNDIS.
|
| @@ -473,13 +460,30 @@ doit &
|
| return subprocess.call(['ping', '-q', '-c1', '-W1', self._device_ip],
|
| stdout=devnull) == 0
|
|
|
| + def OverrideRoutingPolicy(self):
|
| + """Override any routing policy that could prevent
|
| + packets from reaching the rndis interface
|
| + """
|
| + policies = self._device.RunShellCommand('ip rule')
|
| + if len(policies) > 1 and not ('lookup main' in policies[1]):
|
| + self._device.RunShellCommand('ip rule add prio 1 from all table main')
|
| + self._device.RunShellCommand('ip route flush cache')
|
| +
|
| + def RestoreRoutingPolicy(self):
|
| + policies = self._device.RunShellCommand('ip rule')
|
| + if len(policies) > 1 and re.match("^1:.*lookup main", policies[1]):
|
| + self._device.RunShellCommand('ip rule del prio 1')
|
| + self._device.RunShellCommand('ip route flush cache')
|
| +
|
| def _CheckConfigureNetwork(self):
|
| """Enables RNDIS and configures it, retrying until we have connectivity."""
|
| force = False
|
| for _ in range(3):
|
| device_iface, host_iface = self._CheckEnableRndis(force)
|
| self._ConfigureNetwork(device_iface, host_iface)
|
| + self.OverrideRoutingPolicy()
|
| if self._TestConnectivity():
|
| return
|
| force = True
|
| + self.RestoreRoutingPolicy()
|
| raise Exception('No connectivity, giving up.')
|
|
|