| 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 b593f1e3b3e342bd7d2133634d50462277d9f482..babe33b960726459bd43720d4d0f15d52013f38c 100644
|
| --- a/tools/telemetry/telemetry/core/forwarders/android_forwarder.py
|
| +++ b/tools/telemetry/telemetry/core/forwarders/android_forwarder.py
|
| @@ -78,6 +78,7 @@ class AndroidRndisForwarder(forwarders.Forwarder):
|
| self._RedirectPorts(port_pairs)
|
| if port_pairs.dns:
|
| self._OverrideDns()
|
| + self._OverrideDefaultGateway()
|
| # Need to override routing policy again since call to setifdns
|
| # sometimes resets policy table
|
| self._rndis_configurator.OverrideRoutingPolicy()
|
| @@ -90,6 +91,7 @@ class AndroidRndisForwarder(forwarders.Forwarder):
|
| def Close(self):
|
| self._rndis_configurator.RestoreRoutingPolicy()
|
| self._SetDns(*self._original_dns)
|
| + self._RestoreDefaultGateway()
|
| super(AndroidRndisForwarder, self).Close()
|
|
|
| def _RedirectPorts(self, port_pairs):
|
| @@ -107,11 +109,6 @@ class AndroidRndisForwarder(forwarders.Forwarder):
|
| def _OverrideDns(self):
|
| """Overrides DNS on device to point at the host."""
|
| self._original_dns = self._GetCurrentDns()
|
| - if not self._original_dns[0]:
|
| - # No default route. Install one via the host. This is needed because
|
| - # getaddrinfo in bionic uses routes to determine AI_ADDRCONFIG.
|
| - self._adb.RunShellCommand('route add default gw %s dev %s' %
|
| - (self.host_ip, self._device_iface))
|
| self._SetDns(self._device_iface, self.host_ip, self.host_ip)
|
|
|
| def _SetDns(self, iface, dns1, dns2):
|
| @@ -148,6 +145,22 @@ class AndroidRndisForwarder(forwarders.Forwarder):
|
| self._adb.device().GetProp('net.dns2'),
|
| )
|
|
|
| + def _OverrideDefaultGateway(self):
|
| + """Force traffic to go through RNDIS interface.
|
| +
|
| + Override any default gateway route. Without this traffic may go through
|
| + the wrong interface.
|
| +
|
| + This introduces the risk that _RestoreDefaultGateway() is not called
|
| + (e.g. Telemetry crashes). A power cycle or "adb reboot" is a simple
|
| + workaround around in that case.
|
| + """
|
| + self._adb.RunShellCommand('route add default gw %s dev %s' %
|
| + (self.host_ip, self._device_iface))
|
| +
|
| + def _RestoreDefaultGateway(self):
|
| + self._adb.RunShellCommand('netcfg %s down' % self._device_iface)
|
| +
|
|
|
| class AndroidRndisConfigurator(object):
|
| """Configures a linux host to connect to an android device via RNDIS.
|
| @@ -407,12 +420,7 @@ doit &
|
| ' netmask 255.255.255.0',
|
| ])
|
| self._WriteProtectedFile(interface_conf_file, interface_conf)
|
| - subprocess.check_call(['sudo', '/etc/init.d/networking', 'restart'])
|
| - if 'stop/waiting' not in subprocess.check_output(
|
| - ['status', 'network-manager']):
|
| - logging.info('Stopping network-manager...')
|
| - subprocess.call(['sudo', 'stop', 'network-manager'])
|
| -
|
| + subprocess.check_call(['sudo', 'ifup', host_iface])
|
| logging.info('Waiting for RNDIS connectivity...')
|
| util.WaitFor(HasHostAddress, 10)
|
|
|
|
|