WLAN Enhanced Open :WiFi增强开放,这个功能就是当手机开启热点时,Securty的一个选项,与WPA2/WPA3同级,Enhanced Open就是不设置密码,但是增强了安全性。
我们知道Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能,也就是可以同时连接WiFi和开启热点。但是在Android 10中,如果手机热点的安全选项为Enhanced Open,则不支持WiFi和热点同时开启。如果热点的安全选项为WPA2或者WPA3,则可以同时开启热点和WiFi。
下面我们来看这个功能在代码中是怎么设置的: 1、开启热点我们直接看WifiServiceImpl的startSoftApInternal,至于打开热点流程以及怎么走到这个函数的,可以看我之前的总结 热点开启流程。 startSoftApInternal会调用setDualSapMode函数,这个函数是干什么的呢,我们后面会讲,这个很关键。 如果validateApWifiConfiguration函数返回true,则发送CMD_SET_AP的消息,由WifiController处理。 android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
private boolean startSoftApInternal(WifiConfiguration wifiConfig, int mode) {
setDualSapMode(wifiConfig);
.............
// null wifiConfig is a meaningful input for CMD_SET_AP
if (wifiConfig == null || WifiApConfigStore.validateApWifiConfiguration(wifiConfig)) {
SoftApModeConfiguration softApConfig = new SoftApModeConfiguration(mode, wifiConfig);
mWifiController.sendMessage(CMD_SET_AP, 1, 0, softApConfig);
return true;
}
Slog.e(TAG, "Invalid WifiConfiguration");
return false;
}
2、WifiController一开始是在DefaultState ,我们看CMD_SET_AP的处理过程: 看这个判断语句 if (msg.arg1 == 1 && mWifiApConfigStore.getDualSapStatus()) ,这个如果返回true,则 mActiveModeWarden.disableWifi ,也就是关闭 WiFi 。 msg.arg1 的值就是 CMD_SET_AP 的第一个参数,我们可以从上面 mWifiController.sendMessage(CMD_SET_AP, 1, 0, softApConfig) 看到是 1 。然后再看 mWifiApConfigStore.getDualSapStatus ,这个函数为什么返回的是 true 呢?
android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java
class DefaultState extends State {
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case CMD_SET_AP:
if (msg.arg1 == 1 && mWifiApConfigStore.getDualSapStatus()) {
mActiveModeWarden.disableWifi();
transitionTo(mStaDisabledState);
}
if (msg.arg1 == 1) {
SoftApModeConfiguration config = (SoftApModeConfiguration) msg.obj;
mActiveModeWarden.enterSoftAPMode((SoftApModeConfiguration) msg.obj);
} else {
mActiveModeWarden.stopSoftAPMode(msg.arg2);
}
break;
3、getDualSapStatus 函数就是获取 mDualSapStatus 的值。mDualSapStatus 的值是谁设的呢?这里就明白我们一开始说的 WifiServiceImpl 的 startSoftApInternal 函数中一开始执行的 setDualSapMode 的。setDualSapMode 把 mDualSapStatus 设为了 true。 android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiApConfigStore.java
public synchronized boolean getDualSapStatus() {
return mDualSapStatus;
}
4、我们看 setDualSapMode 函数,apConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE) 这个函数就是判断AP是否是OWE模式,OWE也就是我们所说的 Enhanced Open 。所以当AP为Enhanced Open时,会把 mDualSapStatus 设为 true 。 android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
private void setDualSapMode(WifiConfiguration apConfig) {
if (apConfig == null)
apConfig = mWifiApConfigStore.getApConfiguration();
if (apConfig.apBand == WifiConfiguration.AP_BAND_DUAL
|| apConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE)) {
mLog.trace("setDualSapMode uid=%").c(Binder.getCallingUid()).flush();
mWifiApConfigStore.setDualSapStatus(true);
} else {
mWifiApConfigStore.setDualSapStatus(false);
}
}
分析到这里,也就很清楚为什么 AP 设为 Enhanced Open 模式的时候不支持 WiFi 和 热点共存了。