diff --git a/Tethering/src/com/android/networkstack/tethering/Tethering.java b/Tethering/src/com/android/networkstack/tethering/Tethering.java index b7607ef259..996ee116eb 100644 --- a/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ b/Tethering/src/com/android/networkstack/tethering/Tethering.java @@ -1687,6 +1687,8 @@ public class Tethering { static final int EVENT_IFACE_UPDATE_LINKPROPERTIES = BASE_MAIN_SM + 7; // Events from EntitlementManager to choose upstream again. static final int EVENT_UPSTREAM_PERMISSION_CHANGED = BASE_MAIN_SM + 8; + // Internal request from IpServer to enable or disable downstream. + static final int EVENT_REQUEST_CHANGE_DOWNSTREAM = BASE_MAIN_SM + 9; private final State mInitialState; private final State mTetherModeAliveState; @@ -2186,6 +2188,12 @@ public class Tethering { } break; } + case EVENT_REQUEST_CHANGE_DOWNSTREAM: { + final int tetheringType = message.arg1; + final Boolean enabled = (Boolean) message.obj; + enableTetheringInternal(tetheringType, enabled, null); + break; + } default: retValue = false; break; @@ -2743,7 +2751,8 @@ public class Tethering { @Override public void requestEnableTethering(int tetheringType, boolean enabled) { - enableTetheringInternal(tetheringType, enabled, null); + mTetherMainSM.sendMessage(TetherMainSM.EVENT_REQUEST_CHANGE_DOWNSTREAM, + tetheringType, 0, enabled ? Boolean.TRUE : Boolean.FALSE); } }; } diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java index ba39f228c8..f89ee8e529 100644 --- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java +++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java @@ -2880,24 +2880,33 @@ public class TetheringTest { final Network wifiNetwork = new Network(200); final Network[] allNetworks = { wifiNetwork }; doReturn(allNetworks).when(mCm).getAllNetworks(); + InOrder inOrder = inOrder(mUsbManager, mNetd); runUsbTethering(null); + + inOrder.verify(mNetd).tetherInterfaceAdd(TEST_RNDIS_IFNAME); + final ArgumentCaptor ifaceConfigCaptor = ArgumentCaptor.forClass(InterfaceConfigurationParcel.class); verify(mNetd).interfaceSetCfg(ifaceConfigCaptor.capture()); final String ipv4Address = ifaceConfigCaptor.getValue().ipv4Addr; verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( any(), any()); - reset(mUsbManager); // Cause a prefix conflict by assigning a /30 out of the downstream's /24 to the upstream. updateV4Upstream(new LinkAddress(InetAddresses.parseNumericAddress(ipv4Address), 30), wifiNetwork, TEST_WIFI_IFNAME, TRANSPORT_WIFI); // verify turn off usb tethering - verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_NONE); + inOrder.verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_NONE); sendUsbBroadcast(true, true, -1 /* function */); mLooper.dispatchAll(); + inOrder.verify(mNetd).tetherInterfaceRemove(TEST_RNDIS_IFNAME); + // verify restart usb tethering - verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); + inOrder.verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); + + sendUsbBroadcast(true, true, TETHER_USB_RNDIS_FUNCTION); + mLooper.dispatchAll(); + inOrder.verify(mNetd).tetherInterfaceAdd(TEST_RNDIS_IFNAME); } @Test