diff options
author | Remi NGUYEN VAN <reminv@google.com> | 2018-12-04 11:46:24 +0900 |
---|---|---|
committer | Remi NGUYEN VAN <reminv@google.com> | 2019-01-23 00:07:18 +0900 |
commit | 9983135d1f86a620daed6948118db367486ce72a (patch) | |
tree | aaa17008114cd9b8f298743c4289f2dadcd79aad | |
parent | bc132a8a68efda543f7189f8ce81862a41006f81 (diff) | |
download | wifi-9983135d1f86a620daed6948118db367486ce72a.tar.gz |
Migrate WifiStateMachine to IIpClient
Test: atest FrameworksWifiTests
Bug: 112869080
Merged-In: I738d839a1be56004b1f881bb814646cfe9bdb48a
Change-Id: I3457052cbb77fdb50ef5b91a73bf00dc93726bb1
5 files changed, 242 insertions, 136 deletions
diff --git a/service/java/com/android/server/wifi/FrameworkFacade.java b/service/java/com/android/server/wifi/FrameworkFacade.java index 26cb4ff7b..4d1f2db2b 100644 --- a/service/java/com/android/server/wifi/FrameworkFacade.java +++ b/service/java/com/android/server/wifi/FrameworkFacade.java @@ -25,7 +25,8 @@ import android.content.Intent; import android.database.ContentObserver; import android.net.TrafficStats; import android.net.Uri; -import android.net.ip.IpClient; +import android.net.ip.IpClientCallbacks; +import android.net.ip.IpClientUtil; import android.os.BatteryStats; import android.os.Handler; import android.os.IBinder; @@ -144,9 +145,14 @@ public class FrameworkFacade { return TrafficStats.getRxPackets(iface); } - public IpClient makeIpClient( - Context context, String iface, IpClient.Callback callback) { - return new IpClient(context, iface, callback); + /** + * Request a new IpClient to be created asynchronously. + * @param context Context to use for creation. + * @param iface Interface the client should act on. + * @param callback IpClient event callbacks. + */ + public void makeIpClient(Context context, String iface, IpClientCallbacks callback) { + IpClientUtil.makeIpClient(context, iface, callback); } /** diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index 6a8e0639b..5e327bbe7 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -57,7 +57,7 @@ import android.net.DhcpResults; import android.net.Network; import android.net.NetworkUtils; import android.net.Uri; -import android.net.ip.IpClient; +import android.net.ip.IpClientUtil; import android.net.wifi.ISoftApCallback; import android.net.wifi.IWifiManager; import android.net.wifi.ScanResult; @@ -2530,7 +2530,7 @@ public class WifiServiceImpl extends IWifiManager.Stub { // WifiMetrics proto bytes were requested. Dump only these. mWifiStateMachine.updateWifiMetrics(); mWifiMetrics.dump(fd, pw, args); - } else if (args != null && args.length > 0 && IpClient.DUMP_ARG.equals(args[0])) { + } else if (args != null && args.length > 0 && IpClientUtil.DUMP_ARG.equals(args[0])) { // IpClient dump was requested. Pass it along and take no further action. String[] ipClientArgs = new String[args.length - 1]; System.arraycopy(args, 1, ipClientArgs, 0, ipClientArgs.length); diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index ef5eb027f..8af3a0fe5 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -16,6 +16,7 @@ package com.android.server.wifi; +import static android.net.shared.LinkPropertiesParcelableUtil.toStableParcelable; import static android.net.wifi.WifiManager.WIFI_STATE_DISABLED; import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING; import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; @@ -50,8 +51,10 @@ import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.StaticIpConfiguration; import android.net.TrafficStats; -import android.net.dhcp.DhcpClient; -import android.net.ip.IpClient; +import android.net.ip.IIpClient; +import android.net.ip.IpClientCallbacks; +import android.net.ip.IpClientUtil; +import android.net.shared.ProvisioningConfiguration; import android.net.wifi.RssiPacketCountInfo; import android.net.wifi.ScanResult; import android.net.wifi.SupplicantState; @@ -66,6 +69,7 @@ import android.net.wifi.hotspot2.PasspointConfiguration; import android.net.wifi.p2p.IWifiP2pManager; import android.os.BatteryStats; import android.os.Bundle; +import android.os.ConditionVariable; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -151,6 +155,7 @@ public class WifiStateMachine extends StateMachine { private static final String EXTRA_OSU_ICON_QUERY_BSSID = "BSSID"; private static final String EXTRA_OSU_ICON_QUERY_FILENAME = "FILENAME"; private static final String EXTRA_OSU_PROVIDER = "OsuProvider"; + private static final int IPCLIENT_TIMEOUT_MS = 10_000; private boolean mVerboseLoggingEnabled = false; private final WifiPermissionsWrapper mWifiPermissionsWrapper; @@ -386,7 +391,8 @@ public class WifiStateMachine extends StateMachine { return true; } - private IpClient mIpClient; + private volatile IIpClient mIpClient; + private IpClientCallbacksImpl mIpClientCallbacks; // Channel for sending replies. private AsyncChannel mReplyChannel = new AsyncChannel(); @@ -413,10 +419,6 @@ public class WifiStateMachine extends StateMachine { /* The base for wifi message types */ static final int BASE = Protocol.BASE_WIFI; - /* Indicates Static IP succeeded */ - static final int CMD_STATIC_IP_SUCCESS = BASE + 15; - /* Indicates Static IP failed */ - static final int CMD_STATIC_IP_FAILURE = BASE + 16; static final int CMD_BLUETOOTH_ADAPTER_STATE_CHANGE = BASE + 31; @@ -638,9 +640,14 @@ public class WifiStateMachine extends StateMachine { // Start subscription provisioning with a given provider private static final int CMD_START_SUBSCRIPTION_PROVISIONING = BASE + 254; + @VisibleForTesting + static final int CMD_PRE_DHCP_ACTION = BASE + 255; + private static final int CMD_PRE_DHCP_ACTION_COMPLETE = BASE + 256; + private static final int CMD_POST_DHCP_ACTION = BASE + 257; + // For message logging. private static final Class[] sMessageClasses = { - AsyncChannel.class, WifiStateMachine.class, DhcpClient.class }; + AsyncChannel.class, WifiStateMachine.class }; private static final SparseArray<String> sSmToString = MessageUtils.findMessageNames(sMessageClasses); @@ -954,6 +961,16 @@ public class WifiStateMachine extends StateMachine { mWifiMetrics.getHandler()); } + private void setMulticastFilter(boolean enabled) { + if (mIpClient != null) { + try { + mIpClient.setMulticastFilter(enabled); + } catch (RemoteException e) { + loge("Error setting multicast filter", e); + } + } + } + /** * Class to implement the MulticastLockManager.FilterController callback. */ @@ -962,30 +979,35 @@ public class WifiStateMachine extends StateMachine { * Start filtering Multicast v4 packets */ public void startFilteringMulticastPackets() { - if (mIpClient != null) { - mIpClient.setMulticastFilter(true); - } + setMulticastFilter(true); } /** * Stop filtering Multicast v4 packets */ public void stopFilteringMulticastPackets() { - if (mIpClient != null) { - mIpClient.setMulticastFilter(false); - } + setMulticastFilter(false); } } - class IpClientCallback extends IpClient.Callback { + class IpClientCallbacksImpl extends IpClientCallbacks { + private final ConditionVariable mWaitForCreationCv = new ConditionVariable(false); + private final ConditionVariable mWaitForStopCv = new ConditionVariable(false); + + @Override + public void onIpClientCreated(IIpClient ipClient) { + mIpClient = ipClient; + mWaitForCreationCv.open(); + } + @Override public void onPreDhcpAction() { - sendMessage(DhcpClient.CMD_PRE_DHCP_ACTION); + sendMessage(CMD_PRE_DHCP_ACTION); } @Override public void onPostDhcpAction() { - sendMessage(DhcpClient.CMD_POST_DHCP_ACTION); + sendMessage(CMD_POST_DHCP_ACTION); } @Override @@ -1043,12 +1065,29 @@ public class WifiStateMachine extends StateMachine { public void setNeighborDiscoveryOffload(boolean enabled) { sendMessage(CMD_CONFIG_ND_OFFLOAD, (enabled ? 1 : 0)); } + + @Override + public void onQuit() { + mWaitForStopCv.open(); + } + + boolean awaitCreation() { + return mWaitForCreationCv.block(IPCLIENT_TIMEOUT_MS); + } + + boolean awaitShutdown() { + return mWaitForStopCv.block(IPCLIENT_TIMEOUT_MS); + } } private void stopIpClient() { /* Restore power save and suspend optimizations */ handlePostDhcpSetup(); - mIpClient.stop(); + try { + mIpClient.stop(); + } catch (RemoteException e) { + loge("Error stopping IpClient", e); + } } PendingIntent getPrivateBroadcast(String action, int requestCode) { @@ -1864,7 +1903,7 @@ public class WifiStateMachine extends StateMachine { public void dumpIpClient(FileDescriptor fd, PrintWriter pw, String[] args) { if (mIpClient != null) { - mIpClient.dump(fd, pw, args); + IpClientUtil.dumpIpClient(mIpClient, fd, pw, args); } } @@ -2212,7 +2251,7 @@ public class WifiStateMachine extends StateMachine { sb.append(Integer.toString(msg.arg2)); sb.append(" num=").append(mWifiConfigManager.getConfiguredNetworks().size()); break; - case DhcpClient.CMD_PRE_DHCP_ACTION: + case CMD_PRE_DHCP_ACTION: sb.append(" "); sb.append(Integer.toString(msg.arg1)); sb.append(" "); @@ -2221,16 +2260,7 @@ public class WifiStateMachine extends StateMachine { sb.append(",").append(mWifiInfo.txBad); sb.append(",").append(mWifiInfo.txRetries); break; - case DhcpClient.CMD_POST_DHCP_ACTION: - sb.append(" "); - sb.append(Integer.toString(msg.arg1)); - sb.append(" "); - sb.append(Integer.toString(msg.arg2)); - if (msg.arg1 == DhcpClient.DHCP_SUCCESS) { - sb.append(" OK "); - } else if (msg.arg1 == DhcpClient.DHCP_FAILURE) { - sb.append(" FAIL "); - } + case CMD_POST_DHCP_ACTION: if (mLinkProperties != null) { sb.append(" "); sb.append(getLinkPropertiesSummary(mLinkProperties)); @@ -2330,23 +2360,7 @@ public class WifiStateMachine extends StateMachine { break; case CMD_IPV4_PROVISIONING_SUCCESS: sb.append(" "); - if (msg.arg1 == DhcpClient.DHCP_SUCCESS) { - sb.append("DHCP_OK"); - } else if (msg.arg1 == CMD_STATIC_IP_SUCCESS) { - sb.append("STATIC_OK"); - } else { - sb.append(Integer.toString(msg.arg1)); - } - break; - case CMD_IPV4_PROVISIONING_FAILURE: - sb.append(" "); - if (msg.arg1 == DhcpClient.DHCP_FAILURE) { - sb.append("DHCP_FAIL"); - } else if (msg.arg1 == CMD_STATIC_IP_FAILURE) { - sb.append("STATIC_FAIL"); - } else { - sb.append(Integer.toString(msg.arg1)); - } + sb.append(/* DhcpResults */ msg.obj); break; default: sb.append(" "); @@ -2821,12 +2835,12 @@ public class WifiStateMachine extends StateMachine { Message msg = new Message(); msg.what = WifiP2pServiceImpl.BLOCK_DISCOVERY; msg.arg1 = WifiP2pServiceImpl.ENABLED; - msg.arg2 = DhcpClient.CMD_PRE_DHCP_ACTION_COMPLETE; + msg.arg2 = CMD_PRE_DHCP_ACTION_COMPLETE; msg.obj = WifiStateMachine.this; mWifiP2pChannel.sendMessage(msg); } else { // If the p2p service is not running, we can proceed directly. - sendMessage(DhcpClient.CMD_PRE_DHCP_ACTION_COMPLETE); + sendMessage(CMD_PRE_DHCP_ACTION_COMPLETE); } } @@ -3364,9 +3378,9 @@ public class WifiStateMachine extends StateMachine { case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: case WifiMonitor.ASSOCIATION_REJECTION_EVENT: case CMD_RSSI_POLL: - case DhcpClient.CMD_PRE_DHCP_ACTION: - case DhcpClient.CMD_PRE_DHCP_ACTION_COMPLETE: - case DhcpClient.CMD_POST_DHCP_ACTION: + case CMD_PRE_DHCP_ACTION: + case CMD_PRE_DHCP_ACTION_COMPLETE: + case CMD_POST_DHCP_ACTION: case CMD_ENABLE_P2P: case CMD_DISABLE_P2P_RSP: case WifiMonitor.SUP_REQUEST_IDENTITY: @@ -3517,7 +3531,11 @@ public class WifiStateMachine extends StateMachine { break; case CMD_READ_PACKET_FILTER: byte[] data = mWifiNative.readPacketFilter(mInterfaceName); - mIpClient.readPacketFilterComplete(data); + try { + mIpClient.readPacketFilterComplete(data); + } catch (RemoteException e) { + loge("Error notifying IpClient of packet filter read", e); + } break; case CMD_SET_FALLBACK_PACKET_FILTERING: if ((boolean) message.obj) { @@ -3652,8 +3670,13 @@ public class WifiStateMachine extends StateMachine { } } - mIpClient = mFacade.makeIpClient(mContext, mInterfaceName, new IpClientCallback()); - mIpClient.setMulticastFilter(true); + mIpClientCallbacks = new IpClientCallbacksImpl(); + mFacade.makeIpClient(mContext, mInterfaceName, mIpClientCallbacks); + if (!mIpClientCallbacks.awaitCreation()) { + loge("Timeout waiting for IpClient"); + } + + setMulticastFilter(true); registerForWifiMonitorEvents(); mWifiInjector.getWifiLastResortWatchdog().clearAllFailureCounts(); setSupplicantLogLevel(); @@ -3731,10 +3754,14 @@ public class WifiStateMachine extends StateMachine { updateBatteryWorkSource(null); if (mIpClient != null) { - mIpClient.shutdown(); - // Block to make sure IpClient has really shut down, lest cleanup - // race with, say, bringup code over in tethering. - mIpClient.awaitShutdown(); + try { + mIpClient.shutdown(); + // Block to make sure IpClient has really shut down, lest cleanup + // race with, say, bringup code over in tethering. + mIpClientCallbacks.awaitShutdown(); + } catch (RemoteException e) { + loge("Error shutting down IpClient", e); + } } mNetworkInfo.setIsAvailable(false); if (mNetworkAgent != null) mNetworkAgent.sendNetworkInfo(mNetworkInfo); @@ -3960,7 +3987,11 @@ public class WifiStateMachine extends StateMachine { // DNAv4/DNAv6 -style probing for on-link neighbors of // interest (e.g. routers); harmless if none are configured. if (state == SupplicantState.COMPLETED) { - mIpClient.confirmConfiguration(); + try { + mIpClient.confirmConfiguration(); + } catch (RemoteException e) { + loge("Error confirming IpClient configuration", e); + } mWifiScoreReport.noteIpCheck(); } break; @@ -4240,8 +4271,12 @@ public class WifiStateMachine extends StateMachine { } else { if (result.hasProxyChanged()) { log("Reconfiguring proxy on connection"); - mIpClient.setHttpProxy( - getCurrentWifiConfiguration().getHttpProxy()); + try { + mIpClient.setHttpProxy(toStableParcelable( + getCurrentWifiConfiguration().getHttpProxy())); + } catch (RemoteException e) { + loge("Error setting IpClient proxy", e); + } } if (result.hasIpChanged()) { // The current connection configuration was changed @@ -4737,7 +4772,11 @@ public class WifiStateMachine extends StateMachine { @Override public void exit() { - mIpClient.stop(); + try { + mIpClient.stop(); + } catch (RemoteException e) { + loge("Error stopping IpClient", e); + } // This is handled by receiving a NETWORK_DISCONNECTION_EVENT in ConnectModeState // Bug: 15347363 @@ -4764,13 +4803,17 @@ public class WifiStateMachine extends StateMachine { logStateAndMessage(message, this); switch (message.what) { - case DhcpClient.CMD_PRE_DHCP_ACTION: + case CMD_PRE_DHCP_ACTION: handlePreDhcpSetup(); break; - case DhcpClient.CMD_PRE_DHCP_ACTION_COMPLETE: - mIpClient.completedPreDhcpAction(); + case CMD_PRE_DHCP_ACTION_COMPLETE: + try { + mIpClient.completedPreDhcpAction(); + } catch (RemoteException e) { + loge("Error completing PreDhcpAction", e); + } break; - case DhcpClient.CMD_POST_DHCP_ACTION: + case CMD_POST_DHCP_ACTION: handlePostDhcpSetup(); // We advance to mConnectedState because IpClient will also send a // CMD_IPV4_PROVISIONING_SUCCESS message, which calls handleIPv4Success(), @@ -4864,7 +4907,11 @@ public class WifiStateMachine extends StateMachine { mWifiScoreReport.calculateAndReportScore( mWifiInfo, mNetworkAgent, mWifiMetrics); if (mWifiScoreReport.shouldCheckIpLayer()) { - mIpClient.confirmConfiguration(); + try { + mIpClient.confirmConfiguration(); + } catch (RemoteException e) { + loge("Error confirming IpClient configuration", e); + } mWifiScoreReport.noteIpCheck(); } sendMessageDelayed(obtainMessage(CMD_RSSI_POLL, mRssiPollToken, 0), @@ -4990,13 +5037,21 @@ public class WifiStateMachine extends StateMachine { // CONNECTED. stopIpClient(); - mIpClient.setHttpProxy(currentConfig.getHttpProxy()); + try { + mIpClient.setHttpProxy(toStableParcelable(currentConfig.getHttpProxy())); + } catch (RemoteException e) { + loge("Error setting IpClient proxy", e); + } if (!TextUtils.isEmpty(mTcpBufferSizes)) { - mIpClient.setTcpBufferSizes(mTcpBufferSizes); + try { + mIpClient.setTcpBufferSizes(mTcpBufferSizes); + } catch (RemoteException e) { + loge("Error setting IpClient TCP buffer sizes", e); + } } - final IpClient.ProvisioningConfiguration prov; + final ProvisioningConfiguration prov; if (!isUsingStaticIp) { - prov = IpClient.buildProvisioningConfiguration() + prov = new ProvisioningConfiguration.Builder() .withPreDhcpAction() .withApfCapabilities(mWifiNative.getApfCapabilities(mInterfaceName)) .withNetwork(getCurrentNetwork()) @@ -5005,14 +5060,18 @@ public class WifiStateMachine extends StateMachine { .build(); } else { StaticIpConfiguration staticIpConfig = currentConfig.getStaticIpConfiguration(); - prov = IpClient.buildProvisioningConfiguration() + prov = new ProvisioningConfiguration.Builder() .withStaticConfiguration(staticIpConfig) .withApfCapabilities(mWifiNative.getApfCapabilities(mInterfaceName)) .withNetwork(getCurrentNetwork()) .withDisplayName(currentConfig.SSID) .build(); } - mIpClient.startProvisioning(prov); + try { + mIpClient.startProvisioning(prov.toStableParcelable()); + } catch (RemoteException e) { + loge("Error starting IpClient provisioning", e); + } // Get Link layer stats so as we get fresh tx packet counters getWifiLinkLayerStats(); } diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java index b0b225a61..c6c050750 100644 --- a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java +++ b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java @@ -33,7 +33,10 @@ import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.NetworkUtils; -import android.net.ip.IpClient; +import android.net.ip.IIpClient; +import android.net.ip.IpClientCallbacks; +import android.net.ip.IpClientUtil; +import android.net.shared.ProvisioningConfiguration; import android.net.wifi.WifiManager; import android.net.wifi.WpsInfo; import android.net.wifi.p2p.IWifiP2pManager; @@ -52,6 +55,7 @@ import android.net.wifi.p2p.nsd.WifiP2pServiceRequest; import android.net.wifi.p2p.nsd.WifiP2pServiceResponse; import android.os.Binder; import android.os.Bundle; +import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.INetworkManagementService; @@ -113,7 +117,8 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { private Context mContext; INetworkManagementService mNwService; - private IpClient mIpClient; + private IIpClient mIpClient; + private int mIpClientStartIndex = 0; private DhcpResults mDhcpResults; private P2pStateMachine mP2pStateMachine; @@ -443,49 +448,78 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { } private void stopIpClient() { + // Invalidate all previous start requests + mIpClientStartIndex++; if (mIpClient != null) { - mIpClient.stop(); + try { + mIpClient.stop(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } mIpClient = null; } mDhcpResults = null; } - private void startIpClient(String ifname) { + private void startIpClient(String ifname, Handler smHandler) { stopIpClient(); + mIpClientStartIndex++; + IpClientUtil.makeIpClient(mContext, ifname, new IpClientCallbacksImpl( + mIpClientStartIndex, smHandler)); + } - mIpClient = new IpClient(mContext, ifname, - new IpClient.Callback() { - @Override - public void onPreDhcpAction() { - mP2pStateMachine.sendMessage(IPC_PRE_DHCP_ACTION); - } - @Override - public void onPostDhcpAction() { - mP2pStateMachine.sendMessage(IPC_POST_DHCP_ACTION); - } - @Override - public void onNewDhcpResults(DhcpResults dhcpResults) { - mP2pStateMachine.sendMessage(IPC_DHCP_RESULTS, dhcpResults); - } - @Override - public void onProvisioningSuccess(LinkProperties newLp) { - mP2pStateMachine.sendMessage(IPC_PROVISIONING_SUCCESS); - } - @Override - public void onProvisioningFailure(LinkProperties newLp) { - mP2pStateMachine.sendMessage(IPC_PROVISIONING_FAILURE); - } - }, - mNwService); - - final IpClient.ProvisioningConfiguration config = - mIpClient.buildProvisioningConfiguration() - .withoutIPv6() - .withoutIpReachabilityMonitor() - .withPreDhcpAction(30 * 1000) - .withProvisioningTimeoutMs(36 * 1000) - .build(); - mIpClient.startProvisioning(config); + private class IpClientCallbacksImpl extends IpClientCallbacks { + private final int mStartIndex; + private final Handler mHandler; + + private IpClientCallbacksImpl(int startIndex, Handler handler) { + mStartIndex = startIndex; + mHandler = handler; + } + + @Override + public void onIpClientCreated(IIpClient ipClient) { + mHandler.post(() -> { + if (mIpClientStartIndex != mStartIndex) { + // This start request is obsolete + return; + } + + final ProvisioningConfiguration config = + new ProvisioningConfiguration.Builder() + .withoutIPv6() + .withoutIpReachabilityMonitor() + .withPreDhcpAction(30 * 1000) + .withProvisioningTimeoutMs(36 * 1000) + .build(); + try { + mIpClient.startProvisioning(config.toStableParcelable()); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + }); + } + + @Override + public void onPreDhcpAction() { + mP2pStateMachine.sendMessage(IPC_PRE_DHCP_ACTION); + } + @Override + public void onPostDhcpAction() { + mP2pStateMachine.sendMessage(IPC_POST_DHCP_ACTION); + } + @Override + public void onNewDhcpResults(DhcpResults dhcpResults) { + mP2pStateMachine.sendMessage(IPC_DHCP_RESULTS, dhcpResults); + } + @Override + public void onProvisioningSuccess(LinkProperties newLp) { + mP2pStateMachine.sendMessage(IPC_PROVISIONING_SUCCESS); + } + @Override + public void onProvisioningFailure(LinkProperties newLp) { + mP2pStateMachine.sendMessage(IPC_PROVISIONING_FAILURE); + } } /** @@ -624,10 +658,10 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { pw.println("mDeathDataByBinder " + mDeathDataByBinder); pw.println(); - final IpClient ipClient = mIpClient; + final IIpClient ipClient = mIpClient; if (ipClient != null) { pw.println("mIpClient:"); - ipClient.dump(fd, pw, args); + IpClientUtil.dumpIpClient(ipClient, fd, pw, args); } } @@ -1971,7 +2005,7 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { startDhcpServer(mGroup.getInterface()); } else { mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); - startIpClient(mGroup.getInterface()); + startIpClient(mGroup.getInterface(), getHandler()); WifiP2pDevice groupOwner = mGroup.getOwner(); WifiP2pDevice peer = mPeers.get(groupOwner.deviceAddress); if (peer != null) { @@ -2233,7 +2267,11 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { break; case IPC_PRE_DHCP_ACTION: mWifiNative.setP2pPowerSave(mGroup.getInterface(), false); - mIpClient.completedPreDhcpAction(); + try { + mIpClient.completedPreDhcpAction(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } break; case IPC_POST_DHCP_ACTION: mWifiNative.setP2pPowerSave(mGroup.getInterface(), true); diff --git a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java index 90f3e0775..86a096b76 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java @@ -19,6 +19,8 @@ package com.android.server.wifi; import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.DISABLED_NO_INTERNET_TEMPORARY; import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE; +import static com.android.server.wifi.WifiStateMachine.CMD_PRE_DHCP_ACTION; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -46,8 +48,8 @@ import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkMisc; import android.net.NetworkRequest; -import android.net.dhcp.DhcpClient; -import android.net.ip.IpClient; +import android.net.ip.IIpClient; +import android.net.ip.IpClientCallbacks; import android.net.wifi.ScanResult; import android.net.wifi.SupplicantState; import android.net.wifi.WifiConfiguration; @@ -203,14 +205,13 @@ public class WifiStateMachineTest { IBinder batteryStatsBinder = mockService(BatteryStats.class, IBatteryStats.class); when(facade.getService(BatteryStats.SERVICE_NAME)).thenReturn(batteryStatsBinder); - when(facade.makeIpClient(any(Context.class), anyString(), any(IpClient.Callback.class))) - .then(new AnswerWithArguments() { - public IpClient answer( - Context context, String ifname, IpClient.Callback callback) { - mIpClientCallback = callback; - return mIpClient; - } - }); + doAnswer(new AnswerWithArguments() { + public void answer( + Context context, String ifname, IpClientCallbacks callback) { + mIpClientCallback = callback; + callback.onIpClientCreated(mIpClient); + } + }).when(facade).makeIpClient(any(), anyString(), any()); return facade; } @@ -333,7 +334,7 @@ public class WifiStateMachineTest { Context mContext; MockResources mResources; FrameworkFacade mFrameworkFacade; - IpClient.Callback mIpClientCallback; + IpClientCallbacks mIpClientCallback; PhoneStateListener mPhoneStateListener; NetworkRequest mDefaultNetworkRequest; OsuProvider mOsuProvider; @@ -358,7 +359,7 @@ public class WifiStateMachineTest { @Mock PasspointManager mPasspointManager; @Mock SelfRecovery mSelfRecovery; @Mock WifiPermissionsUtil mWifiPermissionsUtil; - @Mock IpClient mIpClient; + @Mock IIpClient mIpClient; @Mock TelephonyManager mTelephonyManager; @Mock WrongPasswordNotifier mWrongPasswordNotifier; @Mock Clock mClock; @@ -455,6 +456,10 @@ public class WifiStateMachineTest { when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true); when(mWifiPermissionsWrapper.getLocalMacAddressPermission(anyInt())) .thenReturn(PackageManager.PERMISSION_DENIED); + doAnswer(inv -> { + mIpClientCallback.onQuit(); + return null; + }).when(mIpClient).shutdown(); initializeWsm(); mOsuProvider = PasspointProvisioningTestUtil.generateOsuProvider(true); @@ -1303,8 +1308,7 @@ public class WifiStateMachineTest { public void smToString() throws Exception { assertEquals("CMD_CHANNEL_HALF_CONNECTED", mWsm.smToString( AsyncChannel.CMD_CHANNEL_HALF_CONNECTED)); - assertEquals("CMD_PRE_DHCP_ACTION", mWsm.smToString( - DhcpClient.CMD_PRE_DHCP_ACTION)); + assertEquals("CMD_PRE_DHCP_ACTION", mWsm.smToString(CMD_PRE_DHCP_ACTION)); assertEquals("CMD_IP_REACHABILITY_LOST", mWsm.smToString( WifiStateMachine.CMD_IP_REACHABILITY_LOST)); } @@ -2397,7 +2401,6 @@ public class WifiStateMachineTest { mWsm.setOperationalMode(WifiStateMachine.DISABLED_MODE, null); mLooper.dispatchAll(); verify(mIpClient).shutdown(); - verify(mIpClient).awaitShutdown(); } /** |