From 21502964760ea96a8326b0ebcdd02bc0c3643044 Mon Sep 17 00:00:00 2001 From: Mark <markchien@google.com> Date: Wed, 21 Dec 2022 06:58:23 +0000 Subject: [PATCH] SyncSM07: Replace IpServer's state machine with StateMachineShim A simple replacement without changing any behavior. Test: atest TetheringTests Change-Id: I34903b57df68081e974163edec82a851ee4ccc98 --- Tethering/src/android/net/ip/IpServer.java | 34 +++++++++++++------ .../networkstack/tethering/Tethering.java | 2 +- .../unit/src/android/net/ip/IpServerTest.java | 7 ++-- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Tethering/src/android/net/ip/IpServer.java b/Tethering/src/android/net/ip/IpServer.java index 246e5bcce2..6063526fec 100644 --- a/Tethering/src/android/net/ip/IpServer.java +++ b/Tethering/src/android/net/ip/IpServer.java @@ -33,6 +33,7 @@ import static android.system.OsConstants.RT_SCOPE_UNIVERSE; import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH; import static com.android.net.module.util.NetworkStackConstants.RFC7421_PREFIX_LENGTH; +import static com.android.networkstack.tethering.TetheringConfiguration.USE_SYNC_SM; import static com.android.networkstack.tethering.UpstreamNetworkState.isVcnInterface; import static com.android.networkstack.tethering.util.PrefixUtils.asIpPrefix; import static com.android.networkstack.tethering.util.TetheringMessageBase.BASE_IPSERVER; @@ -56,7 +57,6 @@ import android.net.dhcp.IDhcpEventCallbacks; import android.net.dhcp.IDhcpServer; import android.net.ip.RouterAdvertisementDaemon.RaParams; import android.os.Handler; -import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.ServiceSpecificException; @@ -68,7 +68,6 @@ import androidx.annotation.Nullable; import com.android.internal.util.MessageUtils; import com.android.internal.util.State; -import com.android.internal.util.StateMachine; import com.android.modules.utils.build.SdkLevel; import com.android.net.module.util.InterfaceParams; import com.android.net.module.util.NetdUtils; @@ -85,6 +84,8 @@ import com.android.networkstack.tethering.TetheringConfiguration; import com.android.networkstack.tethering.metrics.TetheringMetrics; import com.android.networkstack.tethering.util.InterfaceSet; import com.android.networkstack.tethering.util.PrefixUtils; +import com.android.networkstack.tethering.util.StateMachineShim; +import com.android.networkstack.tethering.util.SyncStateMachine.StateInfo; import java.net.Inet4Address; import java.net.Inet6Address; @@ -104,7 +105,7 @@ import java.util.Set; * * @hide */ -public class IpServer extends StateMachine { +public class IpServer extends StateMachineShim { public static final int STATE_UNAVAILABLE = 0; public static final int STATE_AVAILABLE = 1; public static final int STATE_TETHERED = 2; @@ -309,16 +310,18 @@ public class IpServer extends StateMachine { private LinkAddress mIpv4Address; private final TetheringMetrics mTetheringMetrics; + private final Handler mHandler; // TODO: Add a dependency object to pass the data members or variables from the tethering // object. It helps to reduce the arguments of the constructor. public IpServer( - String ifaceName, Looper looper, int interfaceType, SharedLog log, + String ifaceName, Handler handler, int interfaceType, SharedLog log, INetd netd, @NonNull BpfCoordinator bpfCoordinator, @Nullable LateSdk<RoutingCoordinatorManager> routingCoordinator, Callback callback, TetheringConfiguration config, PrivateAddressCoordinator addressCoordinator, TetheringMetrics tetheringMetrics, Dependencies deps) { - super(ifaceName, looper); + super(ifaceName, USE_SYNC_SM ? null : handler.getLooper()); + mHandler = handler; mLog = log.forSubComponent(ifaceName); mNetd = netd; mBpfCoordinator = bpfCoordinator; @@ -351,13 +354,22 @@ public class IpServer extends StateMachine { mTetheredState = new TetheredState(); mUnavailableState = new UnavailableState(); mWaitingForRestartState = new WaitingForRestartState(); - addState(mInitialState); - addState(mLocalHotspotState); - addState(mTetheredState); - addState(mWaitingForRestartState, mTetheredState); - addState(mUnavailableState); + final ArrayList allStates = new ArrayList<StateInfo>(); + allStates.add(new StateInfo(mInitialState, null)); + allStates.add(new StateInfo(mLocalHotspotState, null)); + allStates.add(new StateInfo(mTetheredState, null)); + allStates.add(new StateInfo(mWaitingForRestartState, mTetheredState)); + allStates.add(new StateInfo(mUnavailableState, null)); + addAllStates(allStates); + } + + private Handler getHandler() { + return mHandler; + } - setInitialState(mInitialState); + /** Start IpServer state machine. */ + public void start() { + start(mInitialState); } /** Interface name which IpServer served.*/ diff --git a/Tethering/src/com/android/networkstack/tethering/Tethering.java b/Tethering/src/com/android/networkstack/tethering/Tethering.java index f52bed9ce6..b7607ef259 100644 --- a/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ b/Tethering/src/com/android/networkstack/tethering/Tethering.java @@ -2841,7 +2841,7 @@ public class Tethering { mLog.i("adding IpServer for: " + iface); final TetherState tetherState = new TetherState( - new IpServer(iface, mLooper, interfaceType, mLog, mNetd, mBpfCoordinator, + new IpServer(iface, mHandler, interfaceType, mLog, mNetd, mBpfCoordinator, mRoutingCoordinator, makeControlCallback(), mConfig, mPrivateAddressCoordinator, mTetheringMetrics, mDeps.getIpServerDependencies()), isNcm); diff --git a/Tethering/tests/unit/src/android/net/ip/IpServerTest.java b/Tethering/tests/unit/src/android/net/ip/IpServerTest.java index fc9928d6a7..d94502510a 100644 --- a/Tethering/tests/unit/src/android/net/ip/IpServerTest.java +++ b/Tethering/tests/unit/src/android/net/ip/IpServerTest.java @@ -215,6 +215,7 @@ public class IpServerTest { @Captor private ArgumentCaptor<DhcpServingParamsParcel> mDhcpParamsCaptor; private final TestLooper mLooper = new TestLooper(); + private final Handler mHandler = new Handler(mLooper.getLooper()); private final ArgumentCaptor<LinkProperties> mLinkPropertiesCaptor = ArgumentCaptor.forClass(LinkProperties.class); private IpServer mIpServer; @@ -254,7 +255,7 @@ public class IpServerTest { // Recreate mBpfCoordinator again here because mTetherConfig has changed mBpfCoordinator = spy(new BpfCoordinator(mBpfDeps)); mIpServer = new IpServer( - IFACE_NAME, mLooper.getLooper(), interfaceType, mSharedLog, mNetd, mBpfCoordinator, + IFACE_NAME, mHandler, interfaceType, mSharedLog, mNetd, mBpfCoordinator, mRoutingCoordinatorManager, mCallback, mTetherConfig, mAddressCoordinator, mTetheringMetrics, mDependencies); mIpServer.start(); @@ -324,7 +325,7 @@ public class IpServerTest { mBpfDeps = new BpfCoordinator.Dependencies() { @NonNull public Handler getHandler() { - return new Handler(mLooper.getLooper()); + return mHandler; } @NonNull @@ -402,7 +403,7 @@ public class IpServerTest { public void startsOutAvailable() { when(mDependencies.getIpNeighborMonitor(any(), any(), any())) .thenReturn(mIpNeighborMonitor); - mIpServer = new IpServer(IFACE_NAME, mLooper.getLooper(), TETHERING_BLUETOOTH, mSharedLog, + mIpServer = new IpServer(IFACE_NAME, mHandler, TETHERING_BLUETOOTH, mSharedLog, mNetd, mBpfCoordinator, mRoutingCoordinatorManager, mCallback, mTetherConfig, mAddressCoordinator, mTetheringMetrics, mDependencies); mIpServer.start(); -- GitLab