Clean up changing AP configuration
Bug: 2527293
Change-Id: I35e82e24e27349e2966f88189ebca4246ad1a354
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index afe4191..1254782 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -167,11 +167,15 @@
/**
* Start Wifi Access Point
*/
- void startAccessPoint(in WifiConfiguration wifiConfig, String intf);
+ void startAccessPoint(in WifiConfiguration wifiConfig, String wlanIface, String softapIface);
/**
* Stop Wifi Access Point
*/
void stopAccessPoint();
+ /**
+ * Set Access Point config
+ */
+ void setAccessPoint(in WifiConfiguration wifiConfig, String wlanIface, String softapIface);
}
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index b114ca2..5be919d 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -460,17 +460,17 @@
throw new IllegalStateException("Got an empty response");
}
- public void startAccessPoint(WifiConfiguration wifiConfig, String intf)
+ public void startAccessPoint(WifiConfiguration wifiConfig, String wlanIface, String softapIface)
throws IllegalStateException {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
- mConnector.doCommand(String.format("softap stop " + intf));
- mConnector.doCommand(String.format("softap fwreload " + intf + " AP"));
- mConnector.doCommand(String.format("softap start " + intf));
+ android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
+ mConnector.doCommand(String.format("softap stop " + wlanIface));
+ mConnector.doCommand(String.format("softap fwreload " + wlanIface + " AP"));
+ mConnector.doCommand(String.format("softap start " + wlanIface));
if (wifiConfig == null) {
- mConnector.doCommand(String.format("softap set " + intf + " wl0.1"));
+ mConnector.doCommand(String.format("softap set " + wlanIface + " " + softapIface));
} else {
/**
* softap set arg1 arg2 arg3 [arg4 arg5 arg6 arg7 arg8]
@@ -482,10 +482,9 @@
* argv6 - Channel
* argv7 - Preamble
* argv8 - Max SCB
- *
- * TODO: get a configurable softap interface from driver
*/
- String str = String.format("softap set " + intf + " wl0.1 %s %s %s", wifiConfig.SSID,
+ String str = String.format("softap set " + wlanIface + " " + softapIface + " %s %s %s",
+ wifiConfig.SSID,
wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ?
"wpa2-psk" : "open",
wifiConfig.preSharedKey);
@@ -498,8 +497,25 @@
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
+ android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
mConnector.doCommand("softap stopap");
}
+ public void setAccessPoint(WifiConfiguration wifiConfig, String wlanIface, String softapIface)
+ throws IllegalStateException {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CHANGE_WIFI_STATE, "NetworkManagementService");
+ if (wifiConfig == null) {
+ mConnector.doCommand(String.format("softap set " + wlanIface + " " + softapIface));
+ } else {
+ String str = String.format("softap set " + wlanIface + " " + softapIface +
+ " %s %s %s", wifiConfig.SSID,
+ wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_PSK) ?
+ "wpa2-psk" : "open",
+ wifiConfig.preSharedKey);
+ mConnector.doCommand(str);
+ }
+ }
}
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 4eb529c..70dd03d 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -96,6 +96,8 @@
private static final boolean DBG = false;
private static final Pattern scanResultPattern = Pattern.compile("\t+");
private final WifiStateTracker mWifiStateTracker;
+ /* TODO: fetch a configurable interface */
+ private static final String SOFTAP_IFACE = "wl0.1";
private Context mContext;
private int mWifiApState;
@@ -578,9 +580,10 @@
}
/**
- * see {@link android.net.wifi.WifiManager#startAccessPoint(WifiConfiguration)}
+ * see {@link android.net.wifi.WifiManager#setWifiApEnabled(WifiConfiguration, boolean)}
* @param wifiConfig SSID, security and channel details as
* part of WifiConfiguration
+ * @param enabled, true to enable and false to disable
* @return {@code true} if the start operation was
* started or is already in the queue.
*/
@@ -652,11 +655,16 @@
if(enable && (wifiConfig != null)) {
try {
persistApConfiguration(wifiConfig);
- nwService.stopAccessPoint();
- nwService.startAccessPoint(wifiConfig, mWifiStateTracker.getInterfaceName());
+ nwService.setAccessPoint(wifiConfig, mWifiStateTracker.getInterfaceName(),
+ SOFTAP_IFACE);
return true;
} catch(Exception e) {
Slog.e(TAG, "Exception in nwService during AP restart");
+ try {
+ nwService.stopAccessPoint();
+ } catch (Exception ee) {
+ Slog.e(TAG, "Could not stop AP, :" + ee);
+ }
setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.DRIVER_UNLOAD);
return false;
}
@@ -692,7 +700,8 @@
}
try {
- nwService.startAccessPoint(wifiConfig, mWifiStateTracker.getInterfaceName());
+ nwService.startAccessPoint(wifiConfig, mWifiStateTracker.getInterfaceName(),
+ SOFTAP_IFACE);
} catch(Exception e) {
Slog.e(TAG, "Exception in startAccessPoint()");
setWifiApEnabledState(WIFI_AP_STATE_FAILED, uid, DriverAction.DRIVER_UNLOAD);