• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "../wifi_common_cmd.h"
17 #include "hdf_io_service.h"
18 #include "hdf_sbuf.h"
19 #include "hilog/log.h"
20 #include "securec.h"
21 #include "wifi_driver_client.h"
22 
23 #ifdef __cplusplus
24 #if __cplusplus
25 extern "C" {
26 #endif
27 #endif
28 
WifiEventNewStaProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)29 static void WifiEventNewStaProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
30 {
31     WifiNewStaInfo staInfo;
32     uint32_t len = 0;
33 
34     if (!HdfSbufReadInt32(reqData, &staInfo.reassoc)) {
35         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get reassoc", __FUNCTION__);
36         return;
37     }
38     if (!HdfSbufReadBuffer(reqData, (const void **)(&staInfo.ie), &staInfo.ieLen)) {
39         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get ie", __FUNCTION__);
40         return;
41     }
42     if (!HdfSbufReadBuffer(reqData, (const void **)(&staInfo.macAddr), &len) || (len != ETH_ADDR_LEN)) {
43         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get macAddr", __FUNCTION__);
44         return;
45     }
46     WifiEventReport(ifName, event, &staInfo);
47 }
48 
WifiEventDelStaProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)49 static void WifiEventDelStaProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
50 {
51     uint8_t *addr = NULL;
52     uint32_t len = 0;
53 
54     if ((!HdfSbufReadBuffer(reqData, (const void **)(&addr), &len)) || (len != ETH_ADDR_LEN)) {
55         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get macAddr", __FUNCTION__);
56         return;
57     }
58     WifiEventReport(ifName, event, addr);
59 }
60 
WifiEventRxMgmtProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)61 static void WifiEventRxMgmtProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
62 {
63     WifiRxMgmt rxMgmt;
64 
65     if (!HdfSbufReadInt32(reqData, &rxMgmt.freq)) {
66         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get freq", __FUNCTION__);
67         return;
68     }
69     if (!HdfSbufReadInt32(reqData, &rxMgmt.sigMbm)) {
70         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get sigMbm", __FUNCTION__);
71         return;
72     }
73     if (!HdfSbufReadBuffer(reqData, (const void **)(&rxMgmt.buf), &rxMgmt.len)) {
74         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get buf", __FUNCTION__);
75         return;
76     }
77     WifiEventReport(ifName, event, &rxMgmt);
78 }
79 
WifiEventTxStatusProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)80 static void WifiEventTxStatusProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
81 {
82     WifiTxStatus txStatus;
83 
84     if (!HdfSbufReadUint8(reqData, &txStatus.ack)) {
85         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get ack", __FUNCTION__);
86         return;
87     }
88     if (!HdfSbufReadBuffer(reqData, (const void **)(&txStatus.buf), &txStatus.len)) {
89         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get buf", __FUNCTION__);
90         return;
91     }
92     WifiEventReport(ifName, event, &txStatus);
93 }
94 
WifiEventScanDoneProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)95 static void WifiEventScanDoneProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
96 {
97     uint32_t status;
98 
99     if (!HdfSbufReadUint32(reqData, &status)) {
100         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get status", __FUNCTION__);
101         return;
102     }
103     WifiEventReport(ifName, event, &status);
104 }
105 
WifiEventScanResultProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)106 static void WifiEventScanResultProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
107 {
108     WifiScanResult scanResult = { 0 };
109     uint32_t len = 0;
110 
111     if (!HdfSbufReadInt16(reqData, &(scanResult.beaconInt))) {
112         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get beaconInt", __FUNCTION__);
113         return;
114     }
115     if (!HdfSbufReadInt16(reqData, &(scanResult.caps))) {
116         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get caps", __FUNCTION__);
117         return;
118     }
119     if (!HdfSbufReadInt32(reqData, &(scanResult.level))) {
120         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get level", __FUNCTION__);
121         return;
122     }
123     if (!HdfSbufReadInt32(reqData, &(scanResult.freq))) {
124         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get freq", __FUNCTION__);
125         return;
126     }
127     if (!HdfSbufReadInt32(reqData, &(scanResult.flags))) {
128         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get flags", __FUNCTION__);
129         return;
130     }
131     if ((!HdfSbufReadBuffer(reqData, (const void **)(&(scanResult.bssid)), &len)) || len != ETH_ADDR_LEN) {
132         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get bssid", __FUNCTION__);
133         return;
134     }
135     if (!HdfSbufReadBuffer(reqData, (const void **)(&(scanResult.ie)), &(scanResult.ieLen))) {
136         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get ie", __FUNCTION__);
137         return;
138     }
139     if (!HdfSbufReadBuffer(reqData, (const void **)(&(scanResult.beaconIe)), &(scanResult.beaconIeLen))) {
140         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get beaconIe", __FUNCTION__);
141         return;
142     }
143     WifiEventReport(ifName, event, &scanResult);
144 }
145 
WifiEventConnectResultProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)146 static void WifiEventConnectResultProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
147 {
148     WifiConnectResult result;
149     uint32_t len = 0;
150 
151     if (!HdfSbufReadUint16(reqData, &(result.status))) {
152         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get status", __FUNCTION__);
153         return;
154     }
155     if (!HdfSbufReadUint16(reqData, &(result.freq))) {
156         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get freq", __FUNCTION__);
157         return;
158     }
159     if ((!HdfSbufReadBuffer(reqData, (const void **)(&(result.bssid)), &len)) || len != ETH_ADDR_LEN) {
160         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get bssid", __FUNCTION__);
161         return;
162     }
163     if (!HdfSbufReadBuffer(reqData, (const void **)(&(result.reqIe)), &(result.reqIeLen))) {
164         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get reqIe", __FUNCTION__);
165         return;
166     }
167     if (!HdfSbufReadBuffer(reqData, (const void **)(&(result.respIe)), &(result.respIeLen))) {
168         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get respIe", __FUNCTION__);
169         return;
170     }
171     WifiEventReport(ifName, event, &result);
172 }
173 
WifiEventDisconnectProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)174 static void WifiEventDisconnectProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
175 {
176     WifiDisconnect result;
177 
178     if (!HdfSbufReadUint16(reqData, &(result.reason))) {
179         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get reason", __FUNCTION__);
180         return;
181     }
182     if (!HdfSbufReadBuffer(reqData, (const void **)(&(result.ie)), &(result.ieLen))) {
183         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get bssid", __FUNCTION__);
184         return;
185     }
186     WifiEventReport(ifName, event, &result);
187 }
188 
WifiDriverEventEapolRecvProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)189 static void WifiDriverEventEapolRecvProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
190 {
191     WifiEventReport(ifName, event, reqData);
192 }
193 
WifiEventResetDriverProcess(const char * ifName,int32_t event,struct HdfSBuf * reqData)194 static void WifiEventResetDriverProcess(const char *ifName, int32_t event, struct HdfSBuf *reqData)
195 {
196     unsigned char chipId;
197     int resetStatus;
198 
199     if (!HdfSbufReadInt32(reqData, &resetStatus)) {
200         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get resetStatus, line: %d", __FUNCTION__, __LINE__);
201         return;
202     }
203     if (!HdfSbufReadUint8(reqData, &chipId)) {
204         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get chipId, line: %d", __FUNCTION__, __LINE__);
205         return;
206     }
207     WifiEventReport(ifName, event, &resetStatus);
208 }
209 
WifiDriverEventRemainOnChannelProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)210 static void WifiDriverEventRemainOnChannelProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
211 {
212     WifiOnChannel result = {0};
213     if (!HdfSbufReadUint32(reqData, &(result.freq))) {
214         HILOG_ERROR(LOG_DOMAIN, "%s failed to get frequence.", __FUNCTION__);
215         return;
216     }
217     if (!HdfSbufReadUint32(reqData, &(result.duration))) {
218         HILOG_ERROR(LOG_DOMAIN, "%s failed to get duration.", __FUNCTION__);
219         return;
220     }
221     WifiEventReport(ifName, event, &result);
222 }
223 
WifiDriverEventCancelRemainOnChannelProcess(const char * ifName,uint32_t event,struct HdfSBuf * reqData)224 static void WifiDriverEventCancelRemainOnChannelProcess(const char *ifName, uint32_t event, struct HdfSBuf *reqData)
225 {
226     WifiOnChannel result = {0};
227     if (!HdfSbufReadUint32(reqData, &(result.freq))) {
228         HILOG_ERROR(LOG_DOMAIN, "%s: fail to get freq", __FUNCTION__);
229         return;
230     }
231     WifiEventReport(ifName, event, &result);
232 }
OnWiFiEvents(struct HdfDevEventlistener * listener,struct HdfIoService * service,uint32_t eventId,struct HdfSBuf * data)233 int OnWiFiEvents(struct HdfDevEventlistener *listener,
234     struct HdfIoService *service, uint32_t eventId, struct HdfSBuf *data)
235 {
236     (void)listener;
237     (void)service;
238     (void)data;
239 
240     if (data == NULL) {
241         HILOG_ERROR(LOG_DOMAIN, "%s: params is NULL, line: %d", __FUNCTION__, __LINE__);
242         return RET_CODE_FAILURE;
243     }
244     const char *ifName = HdfSbufReadString(data);
245     if (ifName == NULL) {
246         HILOG_ERROR(LOG_DOMAIN, "%s fail to get ifname", __FUNCTION__);
247         return RET_CODE_FAILURE;
248     }
249     HILOG_INFO(LOG_DOMAIN, "%s: WifiDriverEventProcess event=%d", __FUNCTION__, eventId);
250     switch (eventId) {
251         case WIFI_EVENT_NEW_STA:
252             WifiEventNewStaProcess(ifName, eventId, data);
253             break;
254         case WIFI_EVENT_DEL_STA:
255             WifiEventDelStaProcess(ifName, eventId, data);
256             break;
257         case WIFI_EVENT_RX_MGMT:
258             WifiEventRxMgmtProcess(ifName, eventId, data);
259             break;
260         case WIFI_EVENT_TX_STATUS:
261             WifiEventTxStatusProcess(ifName, eventId, data);
262             break;
263         case WIFI_EVENT_SCAN_DONE:
264             WifiEventScanDoneProcess(ifName, eventId, data);
265             break;
266         case WIFI_EVENT_SCAN_RESULT:
267             WifiEventScanResultProcess(ifName, eventId, data);
268             break;
269         case WIFI_EVENT_CONNECT_RESULT:
270             WifiEventConnectResultProcess(ifName, eventId, data);
271             break;
272         case WIFI_EVENT_DISCONNECT:
273             WifiEventDisconnectProcess(ifName, eventId, data);
274             break;
275         case WIFI_EVENT_EAPOL_RECV:
276             WifiDriverEventEapolRecvProcess(ifName, eventId, data);
277             break;
278         case WIFI_EVENT_RESET_DRIVER:
279             WifiEventResetDriverProcess(ifName, eventId, data);
280             break;
281         case WIFI_EVENT_REMAIN_ON_CHANNEL:
282             WifiDriverEventRemainOnChannelProcess(ifName, eventId, data);
283             break;
284         case WIFI_EVENT_CANCEL_REMAIN_ON_CHANNEL:
285             WifiDriverEventCancelRemainOnChannelProcess(ifName, eventId, data);
286             break;
287         default:
288             break;
289     }
290     return RET_CODE_SUCCESS;
291 }
292 
293 #ifdef __cplusplus
294 #if __cplusplus
295 }
296 #endif
297 #endif
298