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