Loading services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +34 −12 Original line number Diff line number Diff line Loading @@ -78,7 +78,6 @@ public class TetherInterfaceStateMachine extends StateMachine { public static final int CMD_IPV6_TETHER_UPDATE = BASE_IFACE + 13; private final State mInitialState; private final State mServingState; private final State mLocalHotspotState; private final State mTetheredState; private final State mUnavailableState; Loading Loading @@ -107,14 +106,12 @@ public class TetherInterfaceStateMachine extends StateMachine { mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR; mInitialState = new InitialState(); mServingState = new ServingState(); mLocalHotspotState = new LocalHotspotState(); mTetheredState = new TetheredState(); mUnavailableState = new UnavailableState(); addState(mInitialState); addState(mServingState); addState(mLocalHotspotState, mServingState); addState(mTetheredState, mServingState); addState(mLocalHotspotState); addState(mTetheredState); addState(mUnavailableState); setInitialState(mInitialState); Loading Loading @@ -222,12 +219,11 @@ public class TetherInterfaceStateMachine extends StateMachine { } } class ServingState extends State { class BaseServingState extends State { @Override public void enter() { if (!configureIfaceIp(true)) { mLastError = ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR; transitionTo(mInitialState); return; } Loading @@ -236,12 +232,13 @@ public class TetherInterfaceStateMachine extends StateMachine { } catch (Exception e) { Log.e(TAG, "Error Tethering: " + e.toString()); mLastError = ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR; transitionTo(mInitialState); return; } if (!mIPv6TetherSvc.start()) { Log.e(TAG, "Failed to start IPv6TetheringInterfaceServices"); // TODO: Make this a fatal error once Bluetooth IPv6 is sorted. return; } } Loading @@ -254,9 +251,9 @@ public class TetherInterfaceStateMachine extends StateMachine { try { mNMService.untetherInterface(mIfaceName); } catch (Exception ee) { } catch (Exception e) { mLastError = ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR; Log.e(TAG, "Failed to untether interface: " + ee.toString()); Log.e(TAG, "Failed to untether interface: " + e.toString()); } configureIfaceIp(false); Loading Loading @@ -293,15 +290,27 @@ public class TetherInterfaceStateMachine extends StateMachine { } } class LocalHotspotState extends State { // Handling errors in BaseServingState.enter() by transitioning is // problematic because transitioning during a multi-state jump yields // a Log.wtf(). Ultimately, there should be only one ServingState, // and forwarding and NAT rules should be handled by a coordinating // functional element outside of TetherInterfaceStateMachine. class LocalHotspotState extends BaseServingState { @Override public void enter() { super.enter(); if (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) { transitionTo(mInitialState); } if (DBG) Log.d(TAG, "Local hotspot " + mIfaceName); sendInterfaceState(IControlsTethering.STATE_LOCAL_HOTSPOT); } @Override public boolean processMessage(Message message) { if (super.processMessage(message)) return true; maybeLogMessage(this, message.what); switch (message.what) { case CMD_TETHER_REQUESTED: Loading @@ -317,9 +326,19 @@ public class TetherInterfaceStateMachine extends StateMachine { } } class TetheredState extends State { // Handling errors in BaseServingState.enter() by transitioning is // problematic because transitioning during a multi-state jump yields // a Log.wtf(). Ultimately, there should be only one ServingState, // and forwarding and NAT rules should be handled by a coordinating // functional element outside of TetherInterfaceStateMachine. class TetheredState extends BaseServingState { @Override public void enter() { super.enter(); if (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) { transitionTo(mInitialState); } if (DBG) Log.d(TAG, "Tethered " + mIfaceName); sendInterfaceState(IControlsTethering.STATE_TETHERED); } Loading @@ -327,6 +346,7 @@ public class TetherInterfaceStateMachine extends StateMachine { @Override public void exit() { cleanupUpstream(); super.exit(); } private void cleanupUpstream() { Loading Loading @@ -361,6 +381,8 @@ public class TetherInterfaceStateMachine extends StateMachine { @Override public boolean processMessage(Message message) { if (super.processMessage(message)) return true; maybeLogMessage(this, message.what); boolean retValue = true; switch (message.what) { Loading Loading
services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +34 −12 Original line number Diff line number Diff line Loading @@ -78,7 +78,6 @@ public class TetherInterfaceStateMachine extends StateMachine { public static final int CMD_IPV6_TETHER_UPDATE = BASE_IFACE + 13; private final State mInitialState; private final State mServingState; private final State mLocalHotspotState; private final State mTetheredState; private final State mUnavailableState; Loading Loading @@ -107,14 +106,12 @@ public class TetherInterfaceStateMachine extends StateMachine { mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR; mInitialState = new InitialState(); mServingState = new ServingState(); mLocalHotspotState = new LocalHotspotState(); mTetheredState = new TetheredState(); mUnavailableState = new UnavailableState(); addState(mInitialState); addState(mServingState); addState(mLocalHotspotState, mServingState); addState(mTetheredState, mServingState); addState(mLocalHotspotState); addState(mTetheredState); addState(mUnavailableState); setInitialState(mInitialState); Loading Loading @@ -222,12 +219,11 @@ public class TetherInterfaceStateMachine extends StateMachine { } } class ServingState extends State { class BaseServingState extends State { @Override public void enter() { if (!configureIfaceIp(true)) { mLastError = ConnectivityManager.TETHER_ERROR_IFACE_CFG_ERROR; transitionTo(mInitialState); return; } Loading @@ -236,12 +232,13 @@ public class TetherInterfaceStateMachine extends StateMachine { } catch (Exception e) { Log.e(TAG, "Error Tethering: " + e.toString()); mLastError = ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR; transitionTo(mInitialState); return; } if (!mIPv6TetherSvc.start()) { Log.e(TAG, "Failed to start IPv6TetheringInterfaceServices"); // TODO: Make this a fatal error once Bluetooth IPv6 is sorted. return; } } Loading @@ -254,9 +251,9 @@ public class TetherInterfaceStateMachine extends StateMachine { try { mNMService.untetherInterface(mIfaceName); } catch (Exception ee) { } catch (Exception e) { mLastError = ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR; Log.e(TAG, "Failed to untether interface: " + ee.toString()); Log.e(TAG, "Failed to untether interface: " + e.toString()); } configureIfaceIp(false); Loading Loading @@ -293,15 +290,27 @@ public class TetherInterfaceStateMachine extends StateMachine { } } class LocalHotspotState extends State { // Handling errors in BaseServingState.enter() by transitioning is // problematic because transitioning during a multi-state jump yields // a Log.wtf(). Ultimately, there should be only one ServingState, // and forwarding and NAT rules should be handled by a coordinating // functional element outside of TetherInterfaceStateMachine. class LocalHotspotState extends BaseServingState { @Override public void enter() { super.enter(); if (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) { transitionTo(mInitialState); } if (DBG) Log.d(TAG, "Local hotspot " + mIfaceName); sendInterfaceState(IControlsTethering.STATE_LOCAL_HOTSPOT); } @Override public boolean processMessage(Message message) { if (super.processMessage(message)) return true; maybeLogMessage(this, message.what); switch (message.what) { case CMD_TETHER_REQUESTED: Loading @@ -317,9 +326,19 @@ public class TetherInterfaceStateMachine extends StateMachine { } } class TetheredState extends State { // Handling errors in BaseServingState.enter() by transitioning is // problematic because transitioning during a multi-state jump yields // a Log.wtf(). Ultimately, there should be only one ServingState, // and forwarding and NAT rules should be handled by a coordinating // functional element outside of TetherInterfaceStateMachine. class TetheredState extends BaseServingState { @Override public void enter() { super.enter(); if (mLastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) { transitionTo(mInitialState); } if (DBG) Log.d(TAG, "Tethered " + mIfaceName); sendInterfaceState(IControlsTethering.STATE_TETHERED); } Loading @@ -327,6 +346,7 @@ public class TetherInterfaceStateMachine extends StateMachine { @Override public void exit() { cleanupUpstream(); super.exit(); } private void cleanupUpstream() { Loading Loading @@ -361,6 +381,8 @@ public class TetherInterfaceStateMachine extends StateMachine { @Override public boolean processMessage(Message message) { if (super.processMessage(message)) return true; maybeLogMessage(this, message.what); boolean retValue = true; switch (message.what) { Loading