wifi框架层流程之--Scan扫描流程
Scan扫描的接口整体调用流程:
Scan扫描流程关键代码:
所在文件:foundation\communication\wifi\wifi\frameworks\js\napi\src\wifi_napi_device.cpp
NO_SANITIZE("cfi") napi_value Scan(napi_env env, napi_callback_info info) {
ErrCode ret = wifiScanPtr->Scan(true);
}
所在文件:foundation\communication\wifi\wifi\frameworks\native\src\wifi_scan_impl.cpp
ErrCode WifiScanImpl::Scan(bool compatible) {
return client_->Scan(compatible);
}
所在文件:foundation\communication\wifi\wifi\frameworks\native\src\wifi_scan_proxy.cpp
ErrCode WifiScanProxy::Scan(bool compatible)
{
MessageOption option;
MessageParcel data;
data.WriteInt32(0);
data.WriteBool(compatible);
data.WriteString(GetBundleName());
int error =
Remote()->SendRequest(static_cast<uint32_t>(ScanInterfaceCode::WIFI_SVR_CMD_FULL_SCAN), data, reply, option);
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_scan_sa\wifi_scan_stub.cpp
handleFuncMap[static_cast<uint32_t>(ScanInterfaceCode::WIFI_SVR_CMD_FULL_SCAN)] = [this](uint32_t code,
MessageParcel &data, MessageParcel &reply, MessageOption &option) { return OnScan(code, data, reply, option); };
int WifiScanStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) {
HandleFuncMap::iterator iter = handleFuncMap.find(code);
(iter->second)(code, data, reply, option);
return 0;
}
int WifiScanStub::OnScan(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) {
ErrCode ret = Scan(compatible);
return ret;
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_scan_sa\wifi_scan_service_impl.cpp
ErrCode WifiScanServiceImpl::Scan(bool compatible) {
PermissionVerification();
}
ErrCode WifiScanServiceImpl::PermissionVerification() {
IScanService *pService = WifiServiceManager::GetInstance().GetScanServiceInst(m_instId);
pService->Scan(externFlag);
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_scan\scan_interface.cpp
ErrCode ScanInterface::Scan(bool externFlag, ScanType scanType){
return pScanService->Scan(externFlag ? ScanType::SCAN_TYPE_EXTERN : ScanType::SCAN_TYPE_NATIVE_EXTERN);
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_scan\scan_service.cpp
ErrCode ScanService::Scan(bool externFlag) {
ScanConfig scanConfig;
scanConfig.scanBand = SCAN_BAND_BOTH_WITH_DFS;
scanConfig.fullScanFlag = true;
scanConfig.scanType = scanType;
scanConfig.scanStyle = SCAN_TYPE_HIGH_ACCURACY; // 高准确性扫描
SingleScan();
}
bool ScanService::SingleScan(ScanConfig &scanConfig) {
/* Construct a message. */
InternalMessagePtr interMessage =
pScanStateMachine->CreateMessage(static_cast<int>(CMD_START_COMMON_SCAN), requestIndex);
pScanStateMachine->SendMessage(interMessage);
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_scan\scan_state_machine.cpp
void ScanStateMachine::CommonScanRequestProcess(InternalMessagePtr interMessage) {
int requestIndex = 0;
InterScanConfig scanConfig;
GetCommonScanRequestInfo(interMessage, requestIndex, scanConfig);
waitingScans.insert(std::pair<int, InterScanConfig>(requestIndex, scanConfig));
StartNewCommonScan();
}
void ScanStateMachine::StartNewCommonScan() {
StartSingleCommonScan(runningScanSettings);
SwitchState(commonScanningState);
}
bool ScanStateMachine::StartSingleCommonScan(WifiHalScanParam &scanParam) {
WIFI_LOGI("Begin call Scan.\n");
WifiErrorNo ret = WifiStaHalInterface::GetInstance().Scan(
WifiConfigCenter::GetInstance().GetStaIfaceName(), scanParam);
WIFI_LOGI("End call Scan.\n");
lastScanStartTime = GetElapsedMicrosecondsSinceBoot();
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_native\wifi_hal_interface\wifi_sta_hal_interface.cpp
WifiErrorNo WifiStaHalInterface::Scan(const std::string &ifaceName, const WifiHalScanParam &scanParam) {
ScanParams scanParams;
scanParams.ssids = scanParam.hiddenNetworkSsid;
scanParams.freqs = scanParam.scanFreqs;
if (!HalDeviceManager::GetInstance().Scan(ifaceName, scanParams)) {
return WIFI_HAL_OPT_FAILED;
}
return WIFI_HAL_OPT_OK;
}
所在文件:foundation\communication\wifi\wifi\services\wifi_standard\wifi_framework\wifi_manage\wifi_native\hal_device_manage\hal_device_manage.cpp
bool HalDeviceManager::Scan(const std::string &ifaceName, const ScanParams &scanParams) {
int32_t ret = iface->StartScan(scanParams);
}
所在文件:drivers\peripheral\wlan\chip\hdi_service\wifi_sta_iface.cpp
int32_t WifiStaIface::StartScan(const ScanParams& scanParam) {
WifiError status = vendorHal_.lock()->StartScan(ifname_, scanParam);
}
所在文件:drivers\peripheral\wlan\chip\hdi_service\wifi_vendor_hal.cpp
WifiError WifiVendorHal::StartScan(
const std::string& ifaceName, const ScanParams& params)
{
WifiError status = globalFuncTable_.wifiStartScan(GetIfaceHandle(ifaceName), params);
return status;
}
所在文件:drivers\peripheral\wlan\chip\wifi_hal\wifi_scan.cpp
WifiError WifiStartScan(wifiInterfaceHandle handle,
const OHOS::HDI::Wlan::Chip::V1_0::ScanParams& scanParam) {
ScanCommand scanCommand(handle, scanParam, wiphyInfo);
return (WifiError)scanCommand.Start();
}
int ScanCommand::start() {
WifiRequest request(FamilyId(), IfaceId());
int result = CreateSetupRequest(request);
auto lock = ReadLockData();
result = RequestResponse(request);
return HAL_SUCCESS;
}
所在文件:drivers\peripheral\wlan\chip\wifi_hal\cpp_bindings.cpp
int WifiCommand::RequestResponse(WifiRequest& request) {
pthread_mutex_lock(&g_responseMutex);
int err = 0;
struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
err = nl_send_auto_complete(mInfo->cmdSock, request.GetMessage()); /* send message */
err = 1;
nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, NoSeqCheck, NULL);
nl_cb_err(cb, NL_CB_CUSTOM, ErrorHandler, &err);
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, FinishHandler, &err);
nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, AckHandler, &err);
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, ResponseHandler, this);
while (err > 0) { /* Wait for reply */
int res = nl_recvmsgs(mInfo->cmdSock, cb);
if (res) {
HDF_LOGE("nl80211: %{public}s->nl_recvmsgs failed: %{public}d", __func__, res);
if (res == -NLE_NOMEM) {
break;
}
}
}
out:
nl_cb_put(cb);
pthread_mutex_unlock(&g_responseMutex);
return err;
}
ps:ScanCommand类基础自WifiCommand。最终调用接口WifiCommand::RequestResponse,直接将扫描请求通过netlink机制下发到内核驱动。(不是通过发送到wpa_supplicant,再由wpa_supplicant下发到内核驱动)
更多推荐
所有评论(0)