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下发到内核驱动)

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐