Android 12 WIFI扫描流程

packages/modules/Wifi/service/java/com/android/server/wifi/ConcreteClientModeManager.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ActiveModeWarden.java
packages/modules/Wifi/service/java/com/android/server/wifi/ScanRequestProxy.java
packages/modules/Wifi/framework/java/android/net/wifi/WifiScanner.java
packages/modules/Wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
packages/modules/Wifi/framework/java/android/net/wifi/WifiManager.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
packages/modules/Wifi/service/java/com/android/server/wifi/ScanRequestProxy.java
packages/modules/Wifi/service/java/com/android/server/wifi/scanner/WifiScannerImpl.java
modules/Wifi/service/java/com/android/server/wifi/scanner/WificondScannerImpl.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiNative.java
frameworks/base/wifi/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java

wifi打开后,状态机已切换到ConnectModeState
ConcreteClientModeManager.java =>ConcreteClientModeManager$ConnectModeState ->enter():updateConnectModeState(mConnectRoleChangeInfoToSetOnTransition.role,WIFI_STATE_ENABLED, WIFI_STATE_ENABLING);
                                 -->updateConnectModeState(ClientRole role, int newState, int currentState)//wifi状态发生改变,触发广播:WifiManager.WIFI_STATE_CHANGED_ACTION
---->ActiveModeWarden.java =>ActiveModeWarden$ClientListener ->onStartedOrRoleChanged(ConcreteClientModeManager clientModeManager):updateClientScanMode();
                             -->updateClientScanMode():
                                mScanRequestProxy.enableScanning(scanEnabled, scanningForHiddenNetworksEnabled);
-------->ScanRequestProxy.java => enableScanning(boolean enable, boolean enableScanningForHiddenNetworks):enableScanningInternal(true);
                                  -->enableScanningInternal(boolean enable):
                                     mWifiScanner.setScanningEnabled(enable);
                                     sendScanAvailableBroadcast(mContext, enable);//发送WifiManager.ACTION_WIFI_SCAN_AVAILABILITY_CHANGED广播
------------>WifiScanner.java=> setScanningEnabled(boolean enable):mAsyncChannel.sendMessage(enable ? CMD_ENABLE : CMD_DISABLE, Process.myTid(),Binder.getCallingPid(), mContext.getOpPackageName());
---------------->WifiScanningServiceImpl.java => WifiScanningServiceImpl$ClientHandler ->handleMessage(Message msg):
                                                                                         case WifiScanner.CMD_ENABLE:setupScannerImpls();
                                                 ->setupScannerImpls():WifiScannerImpl impl = mScannerImplFactory.create(mContext, mLooper, mClock, ifaceName);
-------------------->WifiTracker.java => final BroadcastReceiver mReceiver = new BroadcastReceiver():
                                         ->if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action))//接收到WifiManager.WIFI_STATE_CHANGED_ACTION广播
                                           updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_UNKNOWN));
                                         -->updateWifiState(int state):
                                            ->if (state == WifiManager.WIFI_STATE_ENABLED)//wifi启动,刷新Scanner
                                              mScanner.resume();
                                         -->WifiTracker$Scanner->resume():hasMessages(MSG_SCAN)
                                         -->handleMessage(Message message):mWifiManager.startScan()
------------------------>WifiManager.java =>startScan():startScan(null)
                                            -->startScan(WorkSource workSource):return mService.startScan(packageName, attributionTag);
---------------------------->WifiServiceImpl.java =>startScan(String packageName, String featureId):
                                                    Boolean scanSuccess = mWifiThreadRunner.call(() -> mScanRequestProxy.startScan(callingUid, packageName), null);
-------------------------------->ScanRequestProxy.java => startScan(int callingUid, String packageName):
                                                          mWifiScanner.startScan(settings, new HandlerExecutor(mHandler),new ScanRequestProxyScanListener(), workSource);
------------------------------------>WifiScanner.java =>startScan(ScanSettings settings, ScanListener listener):startScan(settings, listener, null);
                                                        -->startScan(ScanSettings settings, @Nullable @CallbackExecutor Executor executor,ScanListener listener, WorkSource workSource):
                                                           mAsyncChannel.sendMessage(CMD_START_SINGLE_SCAN, 0, key, scanParams);//发送CMD_START_SINGLE_SCAN消息
---------------------------------------->WifiScanningServiceImpl.java =>WifiScanningServiceImpl$DefaultState ->processMessage(Message msg):
                                                                                                               ->case WifiScanner.CMD_START_SINGLE_SCAN:handleScanStartMessage(ci, msg);
                                                                        -->handleScanStartMessage(ClientInfo ci, Message msg):
                                                                           if (validateScanRequest(ci, handler, scanSettings))
                                                                             ->if (getCurrentState() == mDefaultState && !scanSettings.ignoreLocationSettings)
                                                                                 replyFailed(msg, WifiScanner.REASON_UNSPECIFIED, "not available");//返回扫描失败并return
                                                                                 return;
                                                                             ->replySucceeded(msg);//返回扫描成功
                                                                             ->if (getCurrentState() == mIdleState)
                                                                                 tryToStartNewScan();
                                                                        -->tryToStartNewScan():
                                                                           if (mScannerImplsTracker.startSingleScan(settings))
                                                                             transitionTo(mScanningState);//状态机切换到ScanningState
                                                                        -->WifiScanningServiceImpl$ScannerImplsTracker ->startSingleScan(WifiNative.ScanSettings scanSettings):
                                                                           boolean success = impl.startSingleScan(scanSettings, new ScanEventHandler(ifaceName));
-------------------------------------------->WifiScannerImpl.java => public abstract boolean startSingleScan(WifiNative.ScanSettings settings,WifiNative.ScanEventHandler eventHandler);//抽象方法
------------------------------------------------>WificondScannerImpl.java => startSingleScan(WifiNative.ScanSettings settings,WifiNative.ScanEventHandler eventHandler):
                                                                             success = mWifiNative.scan(getIfaceName(), settings.scanType, freqs, hiddenNetworkSSIDSet,settings.enable6GhzRnr);
---------------------------------------------------->WifiNative.java =>scan(@NonNull String ifaceName, @WifiAnnotations.ScanType int scanType, Set<Integer> freqs,ist<String> hiddenNetworkSSIDs, boolean enable6GhzRnr)
-------------------------------------------------------->WifiNl80211Manager.java =>startScan(@NonNull String ifaceName, @WifiAnnotations.ScanType int scanType,@SuppressLint("NullableCollection") @Nullable Set<Integer> freqs,@SuppressLint("NullableCollection") @Nullable List<byte[]> hiddenNetworkSSIDs,@SuppressLint("NullableCollection") @Nullable Bundle extraScanningParams):
                                                                                   return scannerImpl.scan(settings);//通过HIDL执行到HAL层

system/connectivity/wificond/scanning/scanner_impl.cpp
system/connectivity/wificond/scanning/scan_utils.cpp
system/connectivity/wificond/net/netlink_manager.cpp

scanner_impl.cpp =>Status ScannerImpl::scan(const SingleScanSettings& scan_settings,bool* out_success) =>scan_utils_->Scan(interface_index_, request_random_mac, scan_type,scan_settings.enable_6ghz_rnr_, ssids, freqs, &error_code)
---->scan_utils.cpp =>bool ScanUtils::Scan(uint32_t interface_index,bool request_random_mac,int scan_type,bool enable_6ghz_rnr,const vector<vector<uint8_t>>& ssids,const vector<uint32_t>& freqs,int* error_code)
-------->netlink_manager.cpp =>bool NetlinkManager::SendMessageAndGetAckOrError(const NL80211Packet& packet,int* error_code) =>bool NetlinkManager::SendMessageAndGetSingleResponseOrError(const NL80211Packet& packet,unique_ptr<const NL80211Packet>* response) ==>SendMessageAndGetResponses(packet, &response_vec)
                               ==>bool NetlinkManager::SendMessageAndGetResponses(const NL80211Packet& packet,vector<unique_ptr<const NL80211Packet>>* response) =>SendMessageInternal(packet, sync_netlink_fd_.get())
                               ==>bool NetlinkManager::SendMessageInternal(const NL80211Packet& packet, int fd)


版权声明:本文为TSK_Amine原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。