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)