From db970be0fd9112199725f270613ecf808b886a29 Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Wed, 26 Apr 2017 11:11:07 +0900 Subject: Refactor TISM add/remove code This de-duplicates all the TISM adding and teardown code. It does not yet change the locking or threading semantics. Test: as follows - built - flashed - booted - "runtest frameworks-net" passes - manual tethering of WiFi and USB start normally Bug: 32163131 Bug: 36216864 Bug: 62343300 Merged-In: I8ed82272183022a0469011a1f993704ecf771e3f Merged-In: Ic1bcb3ca011bdc886086f34be18409eb5b12f521 Merged-In: I44a57660d23e76a7c13368cb8f60eaeac5830a0a Change-Id: I44a57660d23e76a7c13368cb8f60eaeac5830a0a (cherry picked from commit 4dd9bb83e2779b309dcc7a7db389b16fa3cb05be) --- .../com/android/server/connectivity/Tethering.java | 74 ++++++++++------------ 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 3f825c58e6ea..d6def4c46725 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -243,21 +243,11 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering // See NetlinkHandler.cpp:71. if (VDBG) Log.d(TAG, "interfaceStatusChanged " + iface + ", " + up); synchronized (mPublicSync) { - int interfaceType = ifaceNameToType(iface); - if (interfaceType == ConnectivityManager.TETHERING_INVALID) { - return; - } - - TetherState tetherState = mTetherStates.get(iface); if (up) { - if (tetherState == null) { - trackNewTetherableInterface(iface, interfaceType); - } + maybeTrackNewInterfaceLocked(iface); } else { - if (interfaceType == ConnectivityManager.TETHERING_BLUETOOTH) { - tetherState.stateMachine.sendMessage( - TetherInterfaceStateMachine.CMD_INTERFACE_DOWN); - mTetherStates.remove(iface); + if (ifaceNameToType(iface) == ConnectivityManager.TETHERING_BLUETOOTH) { + stopTrackingInterfaceLocked(iface); } else { // Ignore usb0 down after enabling RNDIS. // We will handle disconnect in interfaceRemoved. @@ -291,18 +281,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public void interfaceAdded(String iface) { if (VDBG) Log.d(TAG, "interfaceAdded " + iface); synchronized (mPublicSync) { - int interfaceType = ifaceNameToType(iface); - if (interfaceType == ConnectivityManager.TETHERING_INVALID) { - if (VDBG) Log.d(TAG, iface + " is not a tetherable iface, ignoring"); - return; - } - - TetherState tetherState = mTetherStates.get(iface); - if (tetherState == null) { - trackNewTetherableInterface(iface, interfaceType); - } else { - if (VDBG) Log.d(TAG, "active iface (" + iface + ") reported as added, ignoring"); - } + maybeTrackNewInterfaceLocked(iface); } } @@ -310,15 +289,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public void interfaceRemoved(String iface) { if (VDBG) Log.d(TAG, "interfaceRemoved " + iface); synchronized (mPublicSync) { - TetherState tetherState = mTetherStates.get(iface); - if (tetherState == null) { - if (VDBG) { - Log.e(TAG, "attempting to remove unknown iface (" + iface + "), ignoring"); - } - return; - } - tetherState.stateMachine.sendMessage(TetherInterfaceStateMachine.CMD_INTERFACE_DOWN); - mTetherStates.remove(iface); + stopTrackingInterfaceLocked(iface); } } @@ -1887,15 +1858,40 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering sendTetherStateChangedBroadcast(); } - private void trackNewTetherableInterface(String iface, int interfaceType) { - TetherState tetherState; - tetherState = new TetherState(new TetherInterfaceStateMachine(iface, mLooper, - interfaceType, mLog, mNMService, mStatsService, this, - new IPv6TetheringInterfaceServices(iface, mNMService, mLog))); + private void maybeTrackNewInterfaceLocked(final String iface) { + // If we don't care about this type of interface, ignore. + final int interfaceType = ifaceNameToType(iface); + if (interfaceType == ConnectivityManager.TETHERING_INVALID) { + mLog.log(iface + " is not a tetherable iface, ignoring"); + return; + } + + // If we have already started a TISM for this interface, skip. + if (mTetherStates.containsKey(iface)) { + mLog.log("active iface (" + iface + ") reported as added, ignoring"); + return; + } + + mLog.log("adding TetheringInterfaceStateMachine for: " + iface); + final TetherState tetherState = new TetherState( + new TetherInterfaceStateMachine( + iface, mLooper, interfaceType, mLog, mNMService, mStatsService, this, + new IPv6TetheringInterfaceServices(iface, mNMService, mLog))); mTetherStates.put(iface, tetherState); tetherState.stateMachine.start(); } + private void stopTrackingInterfaceLocked(final String iface) { + final TetherState tetherState = mTetherStates.get(iface); + if (tetherState == null) { + mLog.log("attempting to remove unknown iface (" + iface + "), ignoring"); + return; + } + tetherState.stateMachine.sendMessage(TetherInterfaceStateMachine.CMD_INTERFACE_DOWN); + mLog.log("removing TetheringInterfaceStateMachine for: " + iface); + mTetherStates.remove(iface); + } + private static String[] copy(String[] strarray) { return Arrays.copyOf(strarray, strarray.length); } -- cgit v1.2.3-59-g8ed1b