1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "wlan_callback_impl.h" 17094332d3Sopenharmony_ci#include <securec.h> 18094332d3Sopenharmony_ci#include <hdf_base.h> 19094332d3Sopenharmony_ci#include <hdf_log.h> 20094332d3Sopenharmony_ci#include <osal_mem.h> 21094332d3Sopenharmony_ci 22094332d3Sopenharmony_ci#define WLAN_EID_SSID 0 23094332d3Sopenharmony_ci#define MAX_SSID_LEN 32 24094332d3Sopenharmony_ci 25094332d3Sopenharmony_cistruct ElementHeader { 26094332d3Sopenharmony_ci uint8_t id; 27094332d3Sopenharmony_ci uint8_t datalen; 28094332d3Sopenharmony_ci}; 29094332d3Sopenharmony_ci 30094332d3Sopenharmony_cistatic int32_t WlanCallbackResetDriver(struct IWlanCallback *self, uint32_t event, int32_t code, const char *ifName) 31094332d3Sopenharmony_ci{ 32094332d3Sopenharmony_ci (void)self; 33094332d3Sopenharmony_ci HDF_LOGE("WlanCallbackResetDriver: receive resetStatus=%{public}d", code); 34094332d3Sopenharmony_ci return HDF_SUCCESS; 35094332d3Sopenharmony_ci} 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_cistatic void PrintSsid(const uint8_t *ie, uint32_t len) 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci char ssid[MAX_SSID_LEN] = {0}; 40094332d3Sopenharmony_ci uint8_t *pos = NULL; 41094332d3Sopenharmony_ci struct ElementHeader *hdr = (struct ElementHeader *)ie; 42094332d3Sopenharmony_ci 43094332d3Sopenharmony_ci if (ie == NULL || len < sizeof(struct ElementHeader)) { 44094332d3Sopenharmony_ci return; 45094332d3Sopenharmony_ci } 46094332d3Sopenharmony_ci while ((ie + len) >= ((uint8_t *)hdr + sizeof(*hdr) + hdr->datalen)) { 47094332d3Sopenharmony_ci pos = (uint8_t *)hdr + sizeof(*hdr); 48094332d3Sopenharmony_ci if (hdr->id == WLAN_EID_SSID) { 49094332d3Sopenharmony_ci if (hdr->datalen < MAX_SSID_LEN && memcpy_s(ssid, MAX_SSID_LEN, pos, hdr->datalen) == EOK) { 50094332d3Sopenharmony_ci HDF_LOGE("ssid: %{public}s", ssid); 51094332d3Sopenharmony_ci } 52094332d3Sopenharmony_ci return; 53094332d3Sopenharmony_ci } 54094332d3Sopenharmony_ci hdr = (struct ElementHeader *)(pos + hdr->datalen); 55094332d3Sopenharmony_ci } 56094332d3Sopenharmony_ci} 57094332d3Sopenharmony_ci 58094332d3Sopenharmony_cistatic int32_t WlanCallbackScanResult(struct IWlanCallback *self, uint32_t event, 59094332d3Sopenharmony_ci const struct HdfWifiScanResult *scanResult, const char *ifName) 60094332d3Sopenharmony_ci{ 61094332d3Sopenharmony_ci (void)self; 62094332d3Sopenharmony_ci if (scanResult == NULL || ifName == NULL) { 63094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 64094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci HDF_LOGE("HdiProcessScanResult: flags=%{public}d, caps=%{public}d, freq=%{public}d, beaconInt=%{public}d", 67094332d3Sopenharmony_ci scanResult->flags, scanResult->caps, scanResult->freq, scanResult->beaconInt); 68094332d3Sopenharmony_ci HDF_LOGE("HdiProcessScanResult: qual=%{public}d, beaconIeLen=%{public}d, level=%{public}d", scanResult->qual, 69094332d3Sopenharmony_ci scanResult->beaconIeLen, scanResult->level); 70094332d3Sopenharmony_ci HDF_LOGE("HdiProcessScanResult: age=%{public}d, ieLen=%{public}d", scanResult->age, scanResult->ieLen); 71094332d3Sopenharmony_ci PrintSsid(scanResult->ie, scanResult->ieLen); 72094332d3Sopenharmony_ci return HDF_SUCCESS; 73094332d3Sopenharmony_ci} 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_cistatic int32_t WlanCallbackScanResults(struct IWlanCallback *self, uint32_t event, 76094332d3Sopenharmony_ci const struct HdfWifiScanResults *scanResults, const char *ifName) 77094332d3Sopenharmony_ci{ 78094332d3Sopenharmony_ci uint32_t i; 79094332d3Sopenharmony_ci (void)self; 80094332d3Sopenharmony_ci if (scanResults == NULL || ifName == NULL) { 81094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 82094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 83094332d3Sopenharmony_ci } 84094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Receive %u scan results!", __func__, scanResults->resLen); 85094332d3Sopenharmony_ci for (i = 0; i < scanResults->resLen; i++) { 86094332d3Sopenharmony_ci struct HdfWifiScanResultExt *scanResult = &scanResults->res[i]; 87094332d3Sopenharmony_ci HDF_LOGI("HdiProcessScanResult: flags=%{public}d, caps=%{public}d, freq=%{public}d, beaconInt=%{public}d", 88094332d3Sopenharmony_ci scanResult->flags, scanResult->caps, scanResult->freq, scanResult->beaconInt); 89094332d3Sopenharmony_ci HDF_LOGI("HdiProcessScanResult: qual=%{public}d, beaconIeLen=%{public}d, level=%{public}d", scanResult->qual, 90094332d3Sopenharmony_ci scanResult->beaconIeLen, scanResult->level); 91094332d3Sopenharmony_ci HDF_LOGI("HdiProcessScanResult: age=%{public}d, ieLen=%{public}d", scanResult->age, scanResult->ieLen); 92094332d3Sopenharmony_ci PrintSsid(scanResult->ie, scanResult->ieLen); 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci return HDF_SUCCESS; 95094332d3Sopenharmony_ci} 96094332d3Sopenharmony_ci 97094332d3Sopenharmony_cistatic int32_t WlanCallbackNetlinkMessage(struct IWlanCallback *self, const uint8_t *msg, uint32_t msgLen) 98094332d3Sopenharmony_ci{ 99094332d3Sopenharmony_ci uint32_t i; 100094332d3Sopenharmony_ci (void)self; 101094332d3Sopenharmony_ci if (msg == NULL) { 102094332d3Sopenharmony_ci HDF_LOGE("%{public}s: input parameter invalid!", __func__); 103094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 104094332d3Sopenharmony_ci } 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_ci HDF_LOGI("%{public}s: receive message from netlink", __func__); 107094332d3Sopenharmony_ci for (i = 0; i < msgLen; i++) { 108094332d3Sopenharmony_ci HDF_LOGI("%02x", msg[i]); 109094332d3Sopenharmony_ci } 110094332d3Sopenharmony_ci return HDF_SUCCESS; 111094332d3Sopenharmony_ci} 112094332d3Sopenharmony_ci 113094332d3Sopenharmony_cistruct IWlanCallback *WlanCallbackServiceGet(void) 114094332d3Sopenharmony_ci{ 115094332d3Sopenharmony_ci struct WlanCallbackService *service = 116094332d3Sopenharmony_ci (struct WlanCallbackService *)OsalMemCalloc(sizeof(struct WlanCallbackService)); 117094332d3Sopenharmony_ci if (service == NULL) { 118094332d3Sopenharmony_ci HDF_LOGE("%{public}s: malloc WlanCallbackService obj failed!", __func__); 119094332d3Sopenharmony_ci return NULL; 120094332d3Sopenharmony_ci } 121094332d3Sopenharmony_ci 122094332d3Sopenharmony_ci service->interface.ResetDriverResult = WlanCallbackResetDriver; 123094332d3Sopenharmony_ci service->interface.ScanResult = WlanCallbackScanResult; 124094332d3Sopenharmony_ci service->interface.WifiNetlinkMessage = WlanCallbackNetlinkMessage; 125094332d3Sopenharmony_ci service->interface.ScanResults = WlanCallbackScanResults; 126094332d3Sopenharmony_ci return &service->interface; 127094332d3Sopenharmony_ci} 128094332d3Sopenharmony_ci 129094332d3Sopenharmony_civoid WlanCallbackServiceRelease(struct IWlanCallback *instance) 130094332d3Sopenharmony_ci{ 131094332d3Sopenharmony_ci struct WlanCallbackService *service = (struct WlanCallbackService *)instance; 132094332d3Sopenharmony_ci if (service == NULL) { 133094332d3Sopenharmony_ci return; 134094332d3Sopenharmony_ci } 135094332d3Sopenharmony_ci 136094332d3Sopenharmony_ci OsalMemFree(service); 137094332d3Sopenharmony_ci} 138