Android 10.0热点为Enhanced Open模式时不允许WiFI和热点同时开启代码流程梳理

前言:

WLAN Enhanced Open 官方介绍
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 和 热点共存了。

关注公众号,获取更多开发必备知识
在这里插入图片描述

你可能感兴趣的:(WIfi)