summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemi NGUYEN VAN <reminv@google.com>2018-12-04 11:46:24 +0900
committerRemi NGUYEN VAN <reminv@google.com>2019-01-23 00:07:18 +0900
commit9983135d1f86a620daed6948118db367486ce72a (patch)
treeaaa17008114cd9b8f298743c4289f2dadcd79aad
parentbc132a8a68efda543f7189f8ce81862a41006f81 (diff)
downloadwifi-9983135d1f86a620daed6948118db367486ce72a.tar.gz
Migrate WifiStateMachine to IIpClient
Test: atest FrameworksWifiTests Bug: 112869080 Merged-In: I738d839a1be56004b1f881bb814646cfe9bdb48a Change-Id: I3457052cbb77fdb50ef5b91a73bf00dc93726bb1
-rw-r--r--service/java/com/android/server/wifi/FrameworkFacade.java14
-rw-r--r--service/java/com/android/server/wifi/WifiServiceImpl.java4
-rw-r--r--service/java/com/android/server/wifi/WifiStateMachine.java207
-rw-r--r--service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java120
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java33
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();
}
/**