1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021-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 <string.h> 17094332d3Sopenharmony_ci#include <stdlib.h> 18094332d3Sopenharmony_ci#include <osal_mem.h> 19094332d3Sopenharmony_ci#include <pthread.h> 20094332d3Sopenharmony_ci#include "wifi_common_cmd.h" 21094332d3Sopenharmony_ci#include "hdf_log.h" 22094332d3Sopenharmony_ci#include "securec.h" 23094332d3Sopenharmony_ci 24094332d3Sopenharmony_ci#ifdef __cplusplus 25094332d3Sopenharmony_ci#if __cplusplus 26094332d3Sopenharmony_ciextern "C" { 27094332d3Sopenharmony_ci#endif 28094332d3Sopenharmony_ci#endif 29094332d3Sopenharmony_ci 30094332d3Sopenharmony_ci#ifndef EOK 31094332d3Sopenharmony_ci#define EOK 0 32094332d3Sopenharmony_ci#endif 33094332d3Sopenharmony_ci 34094332d3Sopenharmony_ci#define MAX_CALL_BACK_COUNT 10 35094332d3Sopenharmony_cistatic struct CallbackEvent *g_callbackEventMap[MAX_CALL_BACK_COUNT] = {NULL}; 36094332d3Sopenharmony_cistatic struct Hid2dEvent *g_hid2dEventMap[MAX_CALL_BACK_COUNT] = {NULL}; 37094332d3Sopenharmony_cistatic pthread_mutex_t g_callbackMutex; 38094332d3Sopenharmony_cistatic pthread_mutex_t g_hid2dEventMutex; 39094332d3Sopenharmony_ci 40094332d3Sopenharmony_ciint32_t InitEventcallbackMutex(void) 41094332d3Sopenharmony_ci{ 42094332d3Sopenharmony_ci if (pthread_mutex_init(&g_callbackMutex, NULL) != RET_CODE_SUCCESS) { 43094332d3Sopenharmony_ci HDF_LOGE("%s: init g_callbackMutex failed.", __FUNCTION__); 44094332d3Sopenharmony_ci return RET_CODE_FAILURE; 45094332d3Sopenharmony_ci } 46094332d3Sopenharmony_ci if (pthread_mutex_init(&g_hid2dEventMutex, NULL) != RET_CODE_SUCCESS) { 47094332d3Sopenharmony_ci HDF_LOGE("%s: init g_hid2dEventMutex failed.", __FUNCTION__); 48094332d3Sopenharmony_ci return RET_CODE_FAILURE; 49094332d3Sopenharmony_ci } 50094332d3Sopenharmony_ci return RET_CODE_SUCCESS; 51094332d3Sopenharmony_ci} 52094332d3Sopenharmony_ci 53094332d3Sopenharmony_civoid DeinitEventcallbackMutex(void) 54094332d3Sopenharmony_ci{ 55094332d3Sopenharmony_ci pthread_mutex_destroy(&g_callbackMutex); 56094332d3Sopenharmony_ci pthread_mutex_destroy(&g_hid2dEventMutex); 57094332d3Sopenharmony_ci} 58094332d3Sopenharmony_ci 59094332d3Sopenharmony_civoid WifiEventReport(const char *ifName, uint32_t event, void *data) 60094332d3Sopenharmony_ci{ 61094332d3Sopenharmony_ci HDF_LOGD("hal enter %{public}s", __FUNCTION__); 62094332d3Sopenharmony_ci uint32_t i; 63094332d3Sopenharmony_ci OnReceiveFunc callbackEventMap[MAX_CALL_BACK_COUNT] = {NULL}; 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ci pthread_mutex_lock(&g_callbackMutex); 66094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 67094332d3Sopenharmony_ci if (g_callbackEventMap[i] != NULL && (strcmp(g_callbackEventMap[i]->ifName, ifName) == 0) && 68094332d3Sopenharmony_ci (((1 << event) & g_callbackEventMap[i]->eventType) != 0)) { 69094332d3Sopenharmony_ci HDF_LOGD("send event=%{public}u, ifName=%{public}s, i=%{public}d", event, ifName, i); 70094332d3Sopenharmony_ci callbackEventMap[i] = g_callbackEventMap[i]->onRecFunc; 71094332d3Sopenharmony_ci } 72094332d3Sopenharmony_ci } 73094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 74094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 75094332d3Sopenharmony_ci if (callbackEventMap[i] != NULL) { 76094332d3Sopenharmony_ci HDF_LOGD("callbackEventMap i:%{public}d vent=%{public}u, ifName=%{public}s", i, event, ifName); 77094332d3Sopenharmony_ci callbackEventMap[i](event, data, ifName); 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci HDF_LOGD("hal exit %{public}s", __FUNCTION__); 81094332d3Sopenharmony_ci} 82094332d3Sopenharmony_ci 83094332d3Sopenharmony_ciint32_t WifiRegisterEventCallback(OnReceiveFunc onRecFunc, uint32_t eventType, const char *ifName) 84094332d3Sopenharmony_ci{ 85094332d3Sopenharmony_ci uint32_t i; 86094332d3Sopenharmony_ci struct CallbackEvent *callbackEvent = NULL; 87094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 88094332d3Sopenharmony_ci if (onRecFunc == NULL || ifName == NULL) { 89094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 90094332d3Sopenharmony_ci return RET_CODE_INVALID_PARAM; 91094332d3Sopenharmony_ci } 92094332d3Sopenharmony_ci pthread_mutex_lock(&g_callbackMutex); 93094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 94094332d3Sopenharmony_ci if (g_callbackEventMap[i] != NULL && g_callbackEventMap[i]->eventType == eventType && 95094332d3Sopenharmony_ci (strcmp(g_callbackEventMap[i]->ifName, ifName) == 0) && g_callbackEventMap[i]->onRecFunc == onRecFunc) { 96094332d3Sopenharmony_ci HDF_LOGI("i:%{public}d ifName:%{public}s the onRecFunc has been registered!", i, ifName); 97094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 98094332d3Sopenharmony_ci return RET_CODE_SUCCESS; 99094332d3Sopenharmony_ci } 100094332d3Sopenharmony_ci } 101094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 102094332d3Sopenharmony_ci callbackEvent = (struct CallbackEvent *)malloc(sizeof(struct CallbackEvent)); 103094332d3Sopenharmony_ci if (callbackEvent == NULL) { 104094332d3Sopenharmony_ci HDF_LOGE("%{public}s fail: malloc fail!", __FUNCTION__); 105094332d3Sopenharmony_ci return RET_CODE_FAILURE; 106094332d3Sopenharmony_ci } 107094332d3Sopenharmony_ci callbackEvent->eventType = eventType; 108094332d3Sopenharmony_ci if (strcpy_s(callbackEvent->ifName, IFNAMSIZ, ifName) != RET_CODE_SUCCESS) { 109094332d3Sopenharmony_ci free(callbackEvent); 110094332d3Sopenharmony_ci HDF_LOGE("%{public}s: ifName strcpy_s fail", __FUNCTION__); 111094332d3Sopenharmony_ci return RET_CODE_FAILURE; 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci callbackEvent->onRecFunc = onRecFunc; 114094332d3Sopenharmony_ci pthread_mutex_lock(&g_callbackMutex); 115094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 116094332d3Sopenharmony_ci if (g_callbackEventMap[i] == NULL) { 117094332d3Sopenharmony_ci g_callbackEventMap[i] = callbackEvent; 118094332d3Sopenharmony_ci HDF_LOGI("g_callbackEventMap successful, i:%{public}u, ifName:%{public}s, eventType:%{public}u", i, ifName, 119094332d3Sopenharmony_ci eventType); 120094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 121094332d3Sopenharmony_ci return RET_CODE_SUCCESS; 122094332d3Sopenharmony_ci } 123094332d3Sopenharmony_ci } 124094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 125094332d3Sopenharmony_ci free(callbackEvent); 126094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s fail register onRecFunc num more than %{public}d", __FUNCTION__, MAX_CALL_BACK_COUNT); 127094332d3Sopenharmony_ci return RET_CODE_FAILURE; 128094332d3Sopenharmony_ci} 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_civoid WifiUnregisterEventCallback(OnReceiveFunc onRecFunc, uint32_t eventType, const char *ifName) 131094332d3Sopenharmony_ci{ 132094332d3Sopenharmony_ci uint32_t i; 133094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 134094332d3Sopenharmony_ci if (onRecFunc == NULL || ifName == NULL) { 135094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 136094332d3Sopenharmony_ci return; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci pthread_mutex_lock(&g_callbackMutex); 139094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 140094332d3Sopenharmony_ci if (g_callbackEventMap[i] != NULL && g_callbackEventMap[i]->eventType == eventType && 141094332d3Sopenharmony_ci (strcmp(g_callbackEventMap[i]->ifName, ifName) == 0) && g_callbackEventMap[i]->onRecFunc == onRecFunc) { 142094332d3Sopenharmony_ci g_callbackEventMap[i]->onRecFunc = NULL; 143094332d3Sopenharmony_ci free(g_callbackEventMap[i]); 144094332d3Sopenharmony_ci g_callbackEventMap[i] = NULL; 145094332d3Sopenharmony_ci HDF_LOGI("%{public}s: g_callbackEventMap null, i:%{public}u, ifName:%{public}s, eventType:%{public}u", 146094332d3Sopenharmony_ci __FUNCTION__, i, ifName, eventType); 147094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 148094332d3Sopenharmony_ci return; 149094332d3Sopenharmony_ci } 150094332d3Sopenharmony_ci } 151094332d3Sopenharmony_ci pthread_mutex_unlock(&g_callbackMutex); 152094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 153094332d3Sopenharmony_ci} 154094332d3Sopenharmony_ci 155094332d3Sopenharmony_civoid Hid2dEventReport(const char *ifName, const uint8_t *msg, uint32_t msgLen) 156094332d3Sopenharmony_ci{ 157094332d3Sopenharmony_ci uint32_t i; 158094332d3Sopenharmony_ci Hid2dCallback hid2dEventMap[MAX_CALL_BACK_COUNT] = {NULL}; 159094332d3Sopenharmony_ci 160094332d3Sopenharmony_ci pthread_mutex_lock(&g_hid2dEventMutex); 161094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 162094332d3Sopenharmony_ci if (g_hid2dEventMap[i] != NULL && (strcmp(g_hid2dEventMap[i]->ifName, ifName) == 0)) { 163094332d3Sopenharmony_ci HDF_LOGI("%{public}s: Hid2dEventReport ifName = %s", __FUNCTION__, ifName); 164094332d3Sopenharmony_ci hid2dEventMap[i] = g_hid2dEventMap[i]->func; 165094332d3Sopenharmony_ci } 166094332d3Sopenharmony_ci } 167094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 168094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 169094332d3Sopenharmony_ci if (hid2dEventMap[i] != NULL) { 170094332d3Sopenharmony_ci hid2dEventMap[i](msg, msgLen); 171094332d3Sopenharmony_ci } 172094332d3Sopenharmony_ci } 173094332d3Sopenharmony_ci} 174094332d3Sopenharmony_ci 175094332d3Sopenharmony_ciint32_t WifiRegisterHid2dCallback(Hid2dCallback func, const char *ifName) 176094332d3Sopenharmony_ci{ 177094332d3Sopenharmony_ci struct Hid2dEvent *event = NULL; 178094332d3Sopenharmony_ci uint32_t i; 179094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 180094332d3Sopenharmony_ci if (func == NULL || ifName == NULL) { 181094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 182094332d3Sopenharmony_ci return RET_CODE_INVALID_PARAM; 183094332d3Sopenharmony_ci } 184094332d3Sopenharmony_ci pthread_mutex_lock(&g_hid2dEventMutex); 185094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 186094332d3Sopenharmony_ci if (g_hid2dEventMap[i] != NULL && (strcmp(g_hid2dEventMap[i]->ifName, ifName) == 0) && 187094332d3Sopenharmony_ci g_hid2dEventMap[i]->func == func) { 188094332d3Sopenharmony_ci HDF_LOGI("%{public}s: i:%{public}d ifName:%{public}s, the callback function has been registered!", 189094332d3Sopenharmony_ci __FUNCTION__, i, ifName); 190094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 191094332d3Sopenharmony_ci return RET_CODE_SUCCESS; 192094332d3Sopenharmony_ci } 193094332d3Sopenharmony_ci } 194094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 195094332d3Sopenharmony_ci event = (struct Hid2dEvent *)OsalMemCalloc(sizeof(struct Hid2dEvent)); 196094332d3Sopenharmony_ci if (event == NULL) { 197094332d3Sopenharmony_ci HDF_LOGE("%s fail: OsalMemCalloc fail!", __FUNCTION__); 198094332d3Sopenharmony_ci return RET_CODE_FAILURE; 199094332d3Sopenharmony_ci } 200094332d3Sopenharmony_ci do { 201094332d3Sopenharmony_ci if (strcpy_s(event->ifName, IFNAMSIZ + 1, ifName) != RET_CODE_SUCCESS) { 202094332d3Sopenharmony_ci HDF_LOGE("%s: ifName strcpy_s fail", __FUNCTION__); 203094332d3Sopenharmony_ci break; 204094332d3Sopenharmony_ci } 205094332d3Sopenharmony_ci event->func = func; 206094332d3Sopenharmony_ci pthread_mutex_lock(&g_hid2dEventMutex); 207094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 208094332d3Sopenharmony_ci if (g_hid2dEventMap[i] == NULL) { 209094332d3Sopenharmony_ci g_hid2dEventMap[i] = event; 210094332d3Sopenharmony_ci HDF_LOGI("%{public}s, g_hid2dEventMap i:%{public}d event!", __FUNCTION__, i); 211094332d3Sopenharmony_ci OsalMemFree(event); 212094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 213094332d3Sopenharmony_ci return RET_CODE_SUCCESS; 214094332d3Sopenharmony_ci } 215094332d3Sopenharmony_ci } 216094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 217094332d3Sopenharmony_ci } while (0); 218094332d3Sopenharmony_ci 219094332d3Sopenharmony_ci OsalMemFree(event); 220094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s fail: register onRecFunc num more than %d!", __FUNCTION__, MAX_CALL_BACK_COUNT); 221094332d3Sopenharmony_ci return RET_CODE_FAILURE; 222094332d3Sopenharmony_ci} 223094332d3Sopenharmony_ci 224094332d3Sopenharmony_civoid WifiUnregisterHid2dCallback(Hid2dCallback func, const char *ifName) 225094332d3Sopenharmony_ci{ 226094332d3Sopenharmony_ci uint32_t i; 227094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 228094332d3Sopenharmony_ci if (func == NULL || ifName == NULL) { 229094332d3Sopenharmony_ci HDF_LOGE("%s: input parameter invalid, line: %d", __FUNCTION__, __LINE__); 230094332d3Sopenharmony_ci return; 231094332d3Sopenharmony_ci } 232094332d3Sopenharmony_ci pthread_mutex_lock(&g_hid2dEventMutex); 233094332d3Sopenharmony_ci for (i = 0; i < MAX_CALL_BACK_COUNT; i++) { 234094332d3Sopenharmony_ci if (g_hid2dEventMap[i] != NULL && (strcmp(g_hid2dEventMap[i]->ifName, ifName) == 0) && 235094332d3Sopenharmony_ci g_hid2dEventMap[i]->func == func) { 236094332d3Sopenharmony_ci g_hid2dEventMap[i]->func = NULL; 237094332d3Sopenharmony_ci OsalMemFree(g_hid2dEventMap[i]); 238094332d3Sopenharmony_ci g_hid2dEventMap[i] = NULL; 239094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 240094332d3Sopenharmony_ci HDF_LOGI("%{public}s, g_hid2dEventMap i:%{public}d null!", __FUNCTION__, i); 241094332d3Sopenharmony_ci return; 242094332d3Sopenharmony_ci } 243094332d3Sopenharmony_ci } 244094332d3Sopenharmony_ci pthread_mutex_unlock(&g_hid2dEventMutex); 245094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 246094332d3Sopenharmony_ci} 247094332d3Sopenharmony_ci 248094332d3Sopenharmony_civoid FreeScanResult(WifiScanResult *res) 249094332d3Sopenharmony_ci{ 250094332d3Sopenharmony_ci if (res == NULL) { 251094332d3Sopenharmony_ci return; 252094332d3Sopenharmony_ci } 253094332d3Sopenharmony_ci if (res->bssid != NULL) { 254094332d3Sopenharmony_ci OsalMemFree(res->bssid); 255094332d3Sopenharmony_ci res->bssid = NULL; 256094332d3Sopenharmony_ci } 257094332d3Sopenharmony_ci if (res->ie != NULL) { 258094332d3Sopenharmony_ci OsalMemFree(res->ie); 259094332d3Sopenharmony_ci res->ie = NULL; 260094332d3Sopenharmony_ci } 261094332d3Sopenharmony_ci if (res->beaconIe != NULL) { 262094332d3Sopenharmony_ci OsalMemFree(res->beaconIe); 263094332d3Sopenharmony_ci res->beaconIe = NULL; 264094332d3Sopenharmony_ci } 265094332d3Sopenharmony_ci} 266094332d3Sopenharmony_ci 267094332d3Sopenharmony_civoid FreeScanResults(WifiScanResults *res) 268094332d3Sopenharmony_ci{ 269094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 270094332d3Sopenharmony_ci uint32_t i; 271094332d3Sopenharmony_ci if (res == NULL) { 272094332d3Sopenharmony_ci return; 273094332d3Sopenharmony_ci } 274094332d3Sopenharmony_ci for (i = 0; i < res->num; i++) { 275094332d3Sopenharmony_ci FreeScanResult(&res->scanResult[i]); 276094332d3Sopenharmony_ci } 277094332d3Sopenharmony_ci OsalMemFree(res->scanResult); 278094332d3Sopenharmony_ci res->scanResult = NULL; 279094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 280094332d3Sopenharmony_ci} 281094332d3Sopenharmony_ci 282094332d3Sopenharmony_ciint32_t InitScanResults(WifiScanResults *scanResults) 283094332d3Sopenharmony_ci{ 284094332d3Sopenharmony_ci HDF_LOGI("hal enter %{public}s", __FUNCTION__); 285094332d3Sopenharmony_ci if (scanResults == NULL) { 286094332d3Sopenharmony_ci HDF_LOGE("%s: scanResults is NULL", __FUNCTION__); 287094332d3Sopenharmony_ci return RET_CODE_FAILURE; 288094332d3Sopenharmony_ci } 289094332d3Sopenharmony_ci scanResults->scanResultCapacity = INIT_SCAN_RES_NUM; 290094332d3Sopenharmony_ci scanResults->num = 0; 291094332d3Sopenharmony_ci scanResults->scanResult = (WifiScanResult *)OsalMemCalloc(sizeof(WifiScanResult) * scanResults->scanResultCapacity); 292094332d3Sopenharmony_ci if (scanResults->scanResult == NULL) { 293094332d3Sopenharmony_ci HDF_LOGE("%s: scanResults->scanResult is NULL", __FUNCTION__); 294094332d3Sopenharmony_ci return RET_CODE_NOMEM; 295094332d3Sopenharmony_ci } 296094332d3Sopenharmony_ci HDF_LOGI("hal exit %{public}s", __FUNCTION__); 297094332d3Sopenharmony_ci return RET_CODE_SUCCESS; 298094332d3Sopenharmony_ci} 299094332d3Sopenharmony_ci#ifdef __cplusplus 300094332d3Sopenharmony_ci#if __cplusplus 301094332d3Sopenharmony_ci} 302094332d3Sopenharmony_ci#endif 303094332d3Sopenharmony_ci#endif 304