1 /*
2 * Copyright (c) 2023 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 "hostapd_common_cmd.h"
17 #include <dlfcn.h>
18 #include <errno.h>
19 #include <hdf_base.h>
20 #include <hdf_log.h>
21 #include <osal_time.h>
22 #include <osal_mem.h>
23 #include <securec.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <unistd.h>
27 #include "ap/ap_config.h"
28 #include "ap/hostapd.h"
29 #include "ap_ctrl_iface.h"
30 #include "ap/ctrl_iface_ap.h"
31 #include "ap_main.h"
32 #include "hostapd_client.h"
33 #include "v1_0/ihostapd_callback.h"
34 #include "v1_0/ihostapd_interface.h"
35
36 pthread_t g_tid;
37 int32_t g_channel;
38
HdfHostapdStubDriver(void)39 struct HdfHostapdStubData *HdfHostapdStubDriver(void)
40 {
41 static struct HdfHostapdStubData registerManager;
42 return ®isterManager;
43 }
44
SplitCmdString(const char * startCmd,struct StApMainParam * pParam)45 static void SplitCmdString(const char *startCmd, struct StApMainParam *pParam)
46 {
47 if (pParam == NULL) {
48 return;
49 }
50 if (startCmd == NULL) {
51 pParam->argc = 0;
52 return;
53 }
54 const char *p = startCmd;
55 int i = 0;
56 int j = 0;
57 while (*p != '\0') {
58 if (*p == ' ') {
59 if (j <= MAX_WPA_MAIN_ARGV_LEN - 1) {
60 pParam->argv[i][j] = '\0';
61 } else {
62 pParam->argv[i][MAX_WPA_MAIN_ARGV_LEN - 1] = '\0';
63 }
64 ++i;
65 j = 0;
66 if (i >= MAX_WPA_MAIN_ARGC_NUM) {
67 break;
68 }
69 } else {
70 if (j < MAX_WPA_MAIN_ARGV_LEN - 1) {
71 pParam->argv[i][j] = *p;
72 ++j;
73 }
74 }
75 ++p;
76 }
77 if (i >= MAX_WPA_MAIN_ARGC_NUM) {
78 pParam->argc = MAX_WPA_MAIN_ARGC_NUM;
79 } else {
80 pParam->argc = i + 1;
81 }
82 return;
83 }
84
ApThreadMain(void * p)85 static void *ApThreadMain(void *p)
86 {
87 const char *startCmd;
88 struct StApMainParam param = {0};
89 char *tmpArgv[MAX_WPA_MAIN_ARGC_NUM] = {0};
90
91 if (p == NULL) {
92 HDF_LOGE("%{public}s: input parameter invalid", __func__);
93 return NULL;
94 }
95 startCmd = (const char *)p;
96 HDF_LOGI("%{public}s: startCmd: %{public}s", __func__, startCmd);
97 SplitCmdString(startCmd, ¶m);
98 for (int i = 0; i < param.argc; i++) {
99 tmpArgv[i] = param.argv[i];
100 HDF_LOGE("%{public}s: tmpArgv[%{public}d]: %{public}s", __func__, i, tmpArgv[i]);
101 }
102 int ret = ap_main(param.argc, tmpArgv);
103 HDF_LOGI("%{public}s: run ap_main ret:%{public}d", __func__, ret);
104 return NULL;
105 }
106
StartApMain(const char * moduleName,const char * startCmd)107 static int32_t StartApMain(const char *moduleName, const char *startCmd)
108 {
109 int32_t ret;
110
111 if (moduleName == NULL || startCmd == NULL) {
112 HDF_LOGE("%{public}s input parameter invalid", __func__);
113 return HDF_ERR_INVALID_PARAM ;
114 }
115 ret = pthread_create(&g_tid, NULL, ApThreadMain, (void *)startCmd);
116 if (ret != HDF_SUCCESS) {
117 HDF_LOGE("%{public}s: Create Ap thread failed, error code: %{public}d", __func__, ret);
118 return HDF_FAILURE;
119 }
120 pthread_setname_np(g_tid, "ApMainThread");
121 HDF_LOGE("%{public}s: pthread_create successfully.", __func__);
122 usleep(WPA_SLEEP_TIME);
123 return HDF_SUCCESS;
124 }
125
StartHostapdHal(int id)126 static int32_t StartHostapdHal(int id)
127 {
128 HDF_LOGI("Ready to init HostapdHal");
129 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
130 if (hostapdHalDevice == NULL) {
131 HDF_LOGE("hostapdHalDevice is NULL");
132 return HDF_FAILURE;
133 }
134 return HDF_SUCCESS;
135 }
136
StartHostapd(void)137 static int32_t StartHostapd(void)
138 {
139 char startCmd[WIFI_MULTI_CMD_MAX_LEN] = {0};
140 if (memcpy_s(startCmd, WIFI_MULTI_CMD_MAX_LEN, HOSTAPD_START_CMD,
141 strlen(HOSTAPD_START_CMD)) != EOK) {
142 HDF_LOGI("memcpy start cmd failed");
143 return HDF_FAILURE;
144 }
145 HDF_LOGI("Cmd is %{public}s", startCmd);
146 int32_t ret = StartApMain(WPA_HOSTAPD_NAME, startCmd);
147 if (ret != HDF_SUCCESS) {
148 HDF_LOGE("%{public}s:StartApMain error", __func__);
149 return ret;
150 }
151 return HDF_SUCCESS;
152 }
153
HostapdInterfaceEnableAp(struct IHostapdInterface * self,const char * ifName,int32_t id)154 int32_t HostapdInterfaceEnableAp(struct IHostapdInterface *self, const char *ifName,
155 int32_t id)
156 {
157 HDF_LOGI("Enter hdi %{public}s", __func__);
158 (void)self;
159 if (ifName == NULL) {
160 HDF_LOGE("%{public}s input parameter invalid", __func__);
161 return HDF_ERR_INVALID_PARAM ;
162 }
163 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
164 if (hostapdHalDevice == NULL) {
165 HDF_LOGE("hostapdHalDevice is NULL");
166 return HDF_FAILURE;
167 }
168 if (hostapdHalDevice->enableAp(id) != 0) {
169 HDF_LOGE("enableAp failed");
170 return HDF_FAILURE;
171 }
172 return HDF_SUCCESS;
173 }
174
HostapdInterfaceDisableAp(struct IHostapdInterface * self,const char * ifName,int32_t id)175 int32_t HostapdInterfaceDisableAp(struct IHostapdInterface *self, const char *ifName,
176 int32_t id)
177 {
178 HDF_LOGI("Enter hdi %{public}s", __func__);
179 (void)self;
180 if (ifName == NULL) {
181 HDF_LOGE("%{public}s input parameter invalid", __func__);
182 return HDF_ERR_INVALID_PARAM ;
183 }
184 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
185 if (hostapdHalDevice == NULL) {
186 HDF_LOGE("hostapdHalDevice is NULL");
187 return HDF_FAILURE;
188 }
189 if (hostapdHalDevice->disableAp(id) != 0) {
190 HDF_LOGE("disableAp failed");
191 return HDF_FAILURE;
192 }
193 return HDF_SUCCESS;
194 }
195
HostapdInterfaceStartAp(struct IHostapdInterface * self)196 int32_t HostapdInterfaceStartAp(struct IHostapdInterface *self)
197 {
198 HDF_LOGI("Enter hdi %{public}s, this interface is discarded", __func__);
199 /*This interface has been discarded. Please use the new interface HostapdInterfaceStartApWithCmd*/
200 return HDF_FAILURE;
201 }
202
HostapdInterfaceStartApWithCmd(struct IHostapdInterface * self,const char * ifName,int id)203 int32_t HostapdInterfaceStartApWithCmd(struct IHostapdInterface *self, const char *ifName, int id)
204 {
205 HDF_LOGI("Enter hdi %{public}s", __func__);
206 (void)self;
207 if (ifName == NULL) {
208 HDF_LOGE("%{public}s input parameter invalid", __func__);
209 return HDF_ERR_INVALID_PARAM ;
210 }
211 int32_t ret;
212 ret = InitCfg(ifName);
213 if (ret != HDF_SUCCESS) {
214 HDF_LOGE("%{public}s: InitCfg failed", __func__);
215 return HDF_FAILURE;
216 }
217
218 ret = StartHostapd();
219 if (ret != HDF_SUCCESS) {
220 HDF_LOGE("%{public}s: StartHostapd failed, error code: %{public}d", __func__, ret);
221 return HDF_FAILURE;
222 }
223
224 if (StartHostapdHal(id) != HDF_SUCCESS) {
225 HDF_LOGE("StartHostapdHal failed");
226 return HDF_FAILURE;
227 }
228
229 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
230 if (hostapdHalDevice == NULL) {
231 HDF_LOGE("hostapdHalDevice is NULL");
232 return HDF_FAILURE;
233 }
234 HDF_LOGI("%{public}s: hostapd start successfully", __func__);
235 return HDF_SUCCESS;
236 }
237
StopHostapdHal(int id)238 static int32_t StopHostapdHal(int id)
239 {
240 ReleaseHostapdDev(id);
241 return HDF_SUCCESS;
242 }
243
HostapdInterfaceStopAp(struct IHostapdInterface * self)244 int32_t HostapdInterfaceStopAp(struct IHostapdInterface *self)
245 {
246 HDF_LOGI("Enter hdi %{public}s", __func__);
247 (void)self;
248 int id = 0;
249 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
250 if (hostapdHalDevice == NULL) {
251 HDF_LOGE("hostapdHalDevice is NULL");
252 return HDF_FAILURE;
253 }
254
255 if (hostapdHalDevice->stopAp(id) != 0) {
256 HDF_LOGE("stopAp failed");
257 return HDF_FAILURE;
258 }
259
260 if (StopHostapdHal(id) != HDF_SUCCESS) {
261 HDF_LOGE("StopHostapdHal failed");
262 return HDF_FAILURE;
263 }
264 HDF_LOGI("%{public}s: hostapd stop successfully", __func__);
265 return HDF_SUCCESS;
266 }
267
HostapdInterfaceReloadApConfigInfo(struct IHostapdInterface * self,const char * ifName,int32_t id)268 int32_t HostapdInterfaceReloadApConfigInfo(struct IHostapdInterface *self, const char *ifName,
269 int32_t id)
270 {
271 HDF_LOGI("Enter hdi %{public}s", __func__);
272 (void)self;
273 if (ifName == NULL) {
274 HDF_LOGE("%{public}s input parameter invalid", __func__);
275 return HDF_ERR_INVALID_PARAM ;
276 }
277 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
278 if (hostapdHalDevice == NULL) {
279 HDF_LOGE("hostapdHalDevice is NULL");
280 return HDF_FAILURE;
281 }
282
283 if (hostapdHalDevice->reloadApConfigInfo(id) != 0) {
284 HDF_LOGE("reloadApConfigInfo failed");
285 return HDF_FAILURE;
286 }
287 return HDF_SUCCESS;
288 }
289
HostapdInterfaceSetApPasswd(struct IHostapdInterface * self,const char * ifName,const char * pass,int32_t id)290 int32_t HostapdInterfaceSetApPasswd(struct IHostapdInterface *self, const char *ifName,
291 const char *pass, int32_t id)
292 {
293 HDF_LOGI("Enter hdi %{public}s", __func__);
294 (void)self;
295 if (ifName == NULL || pass == NULL) {
296 HDF_LOGE("%{public}s input parameter invalid", __func__);
297 return HDF_ERR_INVALID_PARAM ;
298 }
299 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
300 if (hostapdHalDevice == NULL) {
301 HDF_LOGE("hostapdHalDevice is NULL");
302 return HDF_FAILURE;
303 }
304
305 if (hostapdHalDevice->setApPasswd(pass, id) != 0) {
306 HDF_LOGE("setApPasswd failed");
307 return HDF_FAILURE;
308 }
309 return HDF_SUCCESS;
310 }
311
HostapdInterfaceSetApName(struct IHostapdInterface * self,const char * ifName,const char * name,int32_t id)312 int32_t HostapdInterfaceSetApName(struct IHostapdInterface *self, const char *ifName,
313 const char *name, int32_t id)
314 {
315 HDF_LOGI("Enter hdi %{public}s", __func__);
316 (void)self;
317 if (ifName == NULL || name == NULL) {
318 HDF_LOGE("%{public}s input parameter invalid", __func__);
319 return HDF_ERR_INVALID_PARAM ;
320 }
321 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
322 if (hostapdHalDevice == NULL) {
323 HDF_LOGE("hostapdHalDevice is NULL");
324 return HDF_FAILURE;
325 }
326
327 if (hostapdHalDevice->setApName(name, id) != 0) {
328 HDF_LOGE("setApName failed");
329 return HDF_FAILURE;
330 }
331 return HDF_SUCCESS;
332 }
333
HostapdInterfaceSetApWpaValue(struct IHostapdInterface * self,const char * ifName,int32_t securityType,int32_t id)334 int32_t HostapdInterfaceSetApWpaValue(struct IHostapdInterface *self, const char *ifName,
335 int32_t securityType, int32_t id)
336 {
337 HDF_LOGI("Enter hdi %{public}s", __func__);
338 (void)self;
339 if (ifName == NULL) {
340 HDF_LOGE("%{public}s input parameter invalid", __func__);
341 return HDF_ERR_INVALID_PARAM ;
342 }
343 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
344 if (hostapdHalDevice == NULL) {
345 HDF_LOGE("hostapdHalDevice is NULL");
346 return HDF_FAILURE;
347 }
348
349 if (hostapdHalDevice->setApWpaValue(securityType, id) != 0) {
350 HDF_LOGE("setApWpaValue failed");
351 return HDF_FAILURE;
352 }
353 return HDF_SUCCESS;
354 }
355
HostapdInterfaceSetApBand(struct IHostapdInterface * self,const char * ifName,int32_t band,int32_t id)356 int32_t HostapdInterfaceSetApBand(struct IHostapdInterface *self, const char *ifName,
357 int32_t band, int32_t id)
358 {
359 HDF_LOGI("Enter hdi %{public}s", __func__);
360 (void)self;
361 if (ifName == NULL) {
362 HDF_LOGE("%{public}s input parameter invalid", __func__);
363 return HDF_ERR_INVALID_PARAM ;
364 }
365 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
366 if (hostapdHalDevice == NULL) {
367 HDF_LOGE("hostapdHalDevice is NULL");
368 return HDF_FAILURE;
369 }
370
371 if (hostapdHalDevice->setApBand(band, id) != 0) {
372 HDF_LOGE("setApBand failed");
373 return HDF_FAILURE;
374 }
375 return HDF_SUCCESS;
376 }
377
HostapdInterfaceSetAp80211n(struct IHostapdInterface * self,const char * ifName,int32_t value,int32_t id)378 int32_t HostapdInterfaceSetAp80211n(struct IHostapdInterface *self, const char *ifName,
379 int32_t value, int32_t id)
380 {
381 HDF_LOGI("Enter hdi %{public}s", __func__);
382 (void)self;
383 if (ifName == NULL) {
384 HDF_LOGE("%{public}s input parameter invalid", __func__);
385 return HDF_ERR_INVALID_PARAM ;
386 }
387 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
388 if (hostapdHalDevice == NULL) {
389 HDF_LOGE("hostapdHalDevice is NULL");
390 return HDF_FAILURE;
391 }
392
393 if (hostapdHalDevice->setAp80211n(value, id) != 0) {
394 HDF_LOGE("setAp80211n failed");
395 return HDF_FAILURE;
396 }
397 return HDF_SUCCESS;
398 }
399
HostapdInterfaceSetApWmm(struct IHostapdInterface * self,const char * ifName,int32_t value,int32_t id)400 int32_t HostapdInterfaceSetApWmm(struct IHostapdInterface *self, const char *ifName,
401 int32_t value, int32_t id)
402 {
403 HDF_LOGI("Enter hdi %{public}s", __func__);
404 (void)self;
405 if (ifName == NULL) {
406 HDF_LOGE("%{public}s input parameter invalid", __func__);
407 return HDF_ERR_INVALID_PARAM ;
408 }
409 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
410 if (hostapdHalDevice == NULL) {
411 HDF_LOGE("hostapdHalDevice is NULL");
412 return HDF_FAILURE;
413 }
414
415 if (hostapdHalDevice->setApWmm(value, id) != 0) {
416 HDF_LOGE("setApWmm failed");
417 return HDF_FAILURE;
418 }
419 return HDF_SUCCESS;
420 }
421
HostapdInterfaceSetApChannel(struct IHostapdInterface * self,const char * ifName,int32_t channel,int32_t id)422 int32_t HostapdInterfaceSetApChannel(struct IHostapdInterface *self, const char *ifName,
423 int32_t channel, int32_t id)
424 {
425 HDF_LOGI("Enter hdi %{public}s", __func__);
426 (void)self;
427 if (ifName == NULL) {
428 HDF_LOGE("%{public}s input parameter invalid", __func__);
429 return HDF_ERR_INVALID_PARAM ;
430 }
431 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
432 if (hostapdHalDevice == NULL) {
433 HDF_LOGE("hostapdHalDevice is NULL");
434 return HDF_FAILURE;
435 }
436
437 if (hostapdHalDevice->setApChannel(channel, id) != 0) {
438 HDF_LOGE("setApChannel failed");
439 return HDF_FAILURE;
440 }
441 return HDF_SUCCESS;
442 }
443
HostapdInterfaceSetApMaxConn(struct IHostapdInterface * self,const char * ifName,int32_t maxConn,int32_t id)444 int32_t HostapdInterfaceSetApMaxConn(struct IHostapdInterface *self, const char *ifName,
445 int32_t maxConn, int32_t id)
446 {
447 HDF_LOGI("Enter hdi %{public}s", __func__);
448 (void)self;
449 if (ifName == NULL) {
450 HDF_LOGE("%{public}s input parameter invalid", __func__);
451 return HDF_ERR_INVALID_PARAM;
452 }
453 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
454 if (hostapdHalDevice == NULL) {
455 HDF_LOGE("hostapdHalDevice is NULL");
456 return HDF_FAILURE;
457 }
458
459 if (hostapdHalDevice->setApMaxConn(maxConn, id) != 0) {
460 HDF_LOGE("setApMaxConn failed");
461 return HDF_FAILURE;
462 }
463 if (hostapdHalDevice->setApMaxConnHw(maxConn, g_channel) != 0) {
464 HDF_LOGE("setApMaxConnHw failed");
465 return HDF_FAILURE;
466 }
467 return HDF_SUCCESS;
468 }
469
HostapdInterfaceSetMacFilter(struct IHostapdInterface * self,const char * ifName,const char * mac,int32_t id)470 int32_t HostapdInterfaceSetMacFilter(struct IHostapdInterface *self, const char *ifName,
471 const char *mac, int32_t id)
472 {
473 HDF_LOGI("Enter hdi %{public}s", __func__);
474 (void)self;
475 if (ifName == NULL || mac == NULL) {
476 HDF_LOGE("%{public}s input parameter invalid", __func__);
477 return HDF_ERR_INVALID_PARAM ;
478 }
479 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
480 if (hostapdHalDevice == NULL) {
481 HDF_LOGE("hostapdHalDevice is NULL");
482 return HDF_FAILURE;
483 }
484
485 if (hostapdHalDevice->addBlocklist(mac, id) != 0) {
486 HDF_LOGE("addBlocklist failed");
487 return HDF_FAILURE;
488 }
489 return HDF_SUCCESS;
490 }
491
HostapdInterfaceDelMacFilter(struct IHostapdInterface * self,const char * ifName,const char * mac,int32_t id)492 int32_t HostapdInterfaceDelMacFilter(struct IHostapdInterface *self, const char *ifName,
493 const char *mac, int32_t id)
494 {
495 HDF_LOGI("Enter hdi %{public}s", __func__);
496 (void)self;
497 if (ifName == NULL || mac == NULL) {
498 HDF_LOGE("%{public}s input parameter invalid", __func__);
499 return HDF_ERR_INVALID_PARAM ;
500 }
501 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
502 if (hostapdHalDevice == NULL) {
503 HDF_LOGE("hostapdHalDevice is NULL");
504 return HDF_FAILURE;
505 }
506
507 if (hostapdHalDevice->delBlocklist(mac, id) != 0) {
508 HDF_LOGE("delBlocklist failed");
509 return HDF_FAILURE;
510 }
511 return HDF_SUCCESS;
512 }
513
HostapdInterfaceGetStaInfos(struct IHostapdInterface * self,const char * ifName,char * buf,uint32_t bufLen,int32_t size,int32_t id)514 int32_t HostapdInterfaceGetStaInfos(struct IHostapdInterface *self, const char *ifName,
515 char *buf, uint32_t bufLen, int32_t size, int32_t id)
516 {
517 HDF_LOGI("Enter hdi %{public}s", __func__);
518 (void)self;
519 if (ifName == NULL || buf == NULL) {
520 HDF_LOGE("%{public}s input parameter invalid", __func__);
521 return HDF_ERR_INVALID_PARAM ;
522 }
523 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
524 if (hostapdHalDevice == NULL) {
525 HDF_LOGE("hostapdHalDevice is NULL");
526 return HDF_FAILURE;
527 }
528
529 if (hostapdHalDevice->showConnectedDevList(buf, size, id) != 0) {
530 HDF_LOGE("showConnectedDevList failed");
531 return HDF_FAILURE;
532 }
533 bufLen = strlen(buf);
534 HDF_LOGD("bufLen is %{public}u", bufLen);
535 return HDF_SUCCESS;
536 }
537
HostapdInterfaceDisassociateSta(struct IHostapdInterface * self,const char * ifName,const char * mac,int32_t id)538 int32_t HostapdInterfaceDisassociateSta(struct IHostapdInterface *self, const char *ifName,
539 const char *mac, int32_t id)
540 {
541 HDF_LOGI("Enter hdi %{public}s", __func__);
542 (void)self;
543 if (ifName == NULL || mac == NULL) {
544 HDF_LOGE("%{public}s input parameter invalid", __func__);
545 return HDF_ERR_INVALID_PARAM ;
546 }
547 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
548 if (hostapdHalDevice == NULL) {
549 HDF_LOGE("hostapdHalDevice is NULL");
550 return HDF_FAILURE;
551 }
552
553 if (hostapdHalDevice->disConnectedDev(mac, id) != 0) {
554 HDF_LOGE("disConnectedDev failed");
555 return HDF_FAILURE;
556 }
557 return HDF_SUCCESS;
558 }
559
ProcessEventStaJoin(struct HdfHostapdRemoteNode * node,struct HostapdApCbParm * apCbParm,const char * ifName)560 static int32_t ProcessEventStaJoin(struct HdfHostapdRemoteNode *node,
561 struct HostapdApCbParm *apCbParm, const char *ifName)
562 {
563 struct HdiApCbParm *hdiApCbParm = NULL;
564 int32_t ret = HDF_FAILURE;
565
566 if (node == NULL || node->callbackObj == NULL || node->callbackObj->OnEventStaJoin == NULL || apCbParm == NULL) {
567 HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL", __func__);
568 return HDF_ERR_INVALID_PARAM;
569 }
570 hdiApCbParm = (struct HdiApCbParm *)OsalMemCalloc(sizeof(struct HdiApCbParm));
571 if (hdiApCbParm == NULL) {
572 HDF_LOGE("%{public}s: hdiApCbParm OsalMemCalloc fail", __func__);
573 return HDF_FAILURE;
574 } else {
575 hdiApCbParm->content = OsalMemCalloc(WIFI_HOSTAPD_CB_CONTENT_LENGTH);
576 if (hdiApCbParm->content == NULL) {
577 HDF_LOGE("%{public}s: hdiApCbParm->content OsalMemCalloc fail", __func__);
578 HdiApCbParmFree(hdiApCbParm, true);
579 return HDF_FAILURE;
580 } else {
581 if (memcpy_s(hdiApCbParm->content, WIFI_HOSTAPD_CB_CONTENT_LENGTH,
582 apCbParm->content, WIFI_HOSTAPD_CB_CONTENT_LENGTH) != 0) {
583 HDF_LOGE("%{public}s: memcpy_s fail", __func__);
584 HdiApCbParmFree(hdiApCbParm, true);
585 return HDF_FAILURE;
586 }
587 hdiApCbParm->id = apCbParm->id;
588 ret = node->callbackObj->OnEventStaJoin(node->callbackObj, hdiApCbParm, ifName);
589 HDF_LOGI("%{public}s: OnEventStaJoin send success, content is %{private}s", __func__,
590 hdiApCbParm->content);
591 }
592 }
593 HdiApCbParmFree(hdiApCbParm, true);
594 return ret;
595 }
596
ProcessEventApState(struct HdfHostapdRemoteNode * node,struct HostapdApCbParm * apCbParm,const char * ifName)597 static int32_t ProcessEventApState(struct HdfHostapdRemoteNode *node,
598 struct HostapdApCbParm *apCbParm, const char *ifName)
599 {
600 struct HdiApCbParm *hdiApCbParm = NULL;
601 int32_t ret = HDF_FAILURE;
602
603 if (node == NULL || node->callbackObj == NULL || node->callbackObj->OnEventApState == NULL || apCbParm == NULL) {
604 HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL", __func__);
605 return HDF_ERR_INVALID_PARAM;
606 }
607 hdiApCbParm = (struct HdiApCbParm *)OsalMemCalloc(sizeof(struct HdiApCbParm));
608 if (hdiApCbParm == NULL) {
609 HDF_LOGE("%{public}s: hdiApCbParm OsalMemCalloc fail", __func__);
610 return HDF_FAILURE;
611 } else {
612 hdiApCbParm->content = OsalMemCalloc(WIFI_HOSTAPD_CB_CONTENT_LENGTH);
613 if (hdiApCbParm->content == NULL) {
614 HDF_LOGE("%{public}s: hdiApCbParm->content OsalMemCalloc fail", __func__);
615 HdiApCbParmFree(hdiApCbParm, true);
616 return HDF_FAILURE;
617 } else {
618 if (memcpy_s(hdiApCbParm->content, WIFI_HOSTAPD_CB_CONTENT_LENGTH,
619 apCbParm->content, WIFI_HOSTAPD_CB_CONTENT_LENGTH) != 0) {
620 HDF_LOGE("%{public}s: memcpy_s fail", __func__);
621 HdiApCbParmFree(hdiApCbParm, true);
622 return HDF_FAILURE;
623 }
624 hdiApCbParm->id = apCbParm->id;
625 ret = node->callbackObj->OnEventApState(node->callbackObj, hdiApCbParm, ifName);
626 HDF_LOGI("%{public}s: OnEventApState send success, content is %{private}s", __func__,
627 hdiApCbParm->content);
628 }
629 }
630 HdiApCbParmFree(hdiApCbParm, true);
631 return ret;
632 }
633
ProcessEventHostapdNotify(struct HdfHostapdRemoteNode * node,char * notifyParam,const char * ifName)634 int32_t ProcessEventHostapdNotify(struct HdfHostapdRemoteNode *node, char *notifyParam, const char *ifName)
635 {
636 int32_t ret = HDF_FAILURE;
637
638 if (node == NULL || node->callbackObj == NULL || node->callbackObj->OnEventHostApdNotify == NULL) {
639 HDF_LOGE("%{public}s: hdf wlan remote node or callbackObj is NULL", __func__);
640 return HDF_ERR_INVALID_PARAM;
641 }
642 if (notifyParam == NULL || ifName == NULL) {
643 HDF_LOGE("%{public}s: input parameter invalid", __func__);
644 return HDF_ERR_INVALID_PARAM;
645 }
646 if (strlen(notifyParam) == 0) {
647 ret = HDF_FAILURE;
648 }
649 return ret;
650 }
651
HdfHostapdCallbackFun(uint32_t event,void * data,const char * ifName)652 static int32_t HdfHostapdCallbackFun(uint32_t event, void *data, const char *ifName)
653 {
654 struct HdfHostapdRemoteNode *pos = NULL;
655 struct DListHead *head = NULL;
656 int32_t ret = HDF_FAILURE;
657
658 (void)OsalMutexLock(&HdfHostapdStubDriver()->mutex);
659 head = &HdfHostapdStubDriver()->remoteListHead;
660 HDF_LOGD("%s: enter HdfHostapdCallbackFun event =%u ", __FUNCTION__, event);
661 if (data == NULL || ifName == NULL) {
662 HDF_LOGE("%{public}s: data or ifName is NULL", __func__);
663 (void)OsalMutexUnlock(&HdfHostapdStubDriver()->mutex);
664 return HDF_ERR_INVALID_PARAM;
665 }
666 DLIST_FOR_EACH_ENTRY(pos, head, struct HdfHostapdRemoteNode, node) {
667 if (pos == NULL) {
668 HDF_LOGE("%{public}s: pos is NULL", __func__);
669 break;
670 }
671 if (pos->service == NULL || pos->callbackObj == NULL) {
672 HDF_LOGW("%{public}s: pos->service or pos->callbackObj NULL", __func__);
673 continue;
674 }
675 switch (event) {
676 case HOSTAPD_EVENT_STA_JOIN:
677 ret = ProcessEventStaJoin(pos, (struct HostapdApCbParm *)data, ifName);
678 break;
679 case HOSTAPD_EVENT_AP_STATE:
680 ret = ProcessEventApState(pos, (struct HostapdApCbParm *)data, ifName);
681 break;
682 case HOSTAPD_EVENT_HOSTAPD_NOTIFY:
683 ret = ProcessEventHostapdNotify(pos, (char *)data, ifName);
684 break;
685 default:
686 HDF_LOGE("%{public}s: unknown eventId:%{public}d", __func__, event);
687 break;
688 }
689 if (ret != HDF_SUCCESS) {
690 HDF_LOGE("%{public}s: dispatch code fialed, error code: %{public}d", __func__, ret);
691 }
692 }
693 (void)OsalMutexUnlock(&HdfHostapdStubDriver()->mutex);
694 return ret;
695 }
696
OnRemoteServiceDied(struct HdfDeathRecipient * deathRecipient,struct HdfRemoteService * remote)697 static void OnRemoteServiceDied(struct HdfDeathRecipient *deathRecipient, struct HdfRemoteService *remote)
698 {
699 HDF_LOGI("enter %{public}s ", __func__);
700 int id = 0;
701 WifiHostapdHalDevice *hostapdHalDevice = GetWifiHostapdDev(id);
702 if (hostapdHalDevice == NULL) {
703 HDF_LOGE("hostapdHalDevice is NULL");
704 return;
705 }
706
707 if (hostapdHalDevice->stopAp(id) != 0) {
708 HDF_LOGE("stopAp failed");
709 return;
710 }
711
712 if (StopHostapdHal(id) != HDF_SUCCESS) {
713 HDF_LOGE("StopHostapdHal failed");
714 return;
715 }
716 HDF_LOGI("%{public}s: hostapd stop successfully", __func__);
717 }
718
719 static struct RemoteServiceDeathRecipient g_deathRecipient = {
720 .recipient = {
721 .OnRemoteDied = OnRemoteServiceDied,
722 }
723 };
724
AddDeathRecipientForService(struct IHostapdCallback * cbFunc)725 static void AddDeathRecipientForService(struct IHostapdCallback *cbFunc)
726 {
727 HDF_LOGI("enter %{public}s ", __func__);
728 if (cbFunc == NULL) {
729 HDF_LOGE("invalid parameter");
730 return;
731 }
732 struct HdfRemoteService *remote = cbFunc->AsObject(cbFunc);
733 if (remote == NULL) {
734 HDF_LOGE("remote is NULL");
735 return;
736 }
737 HdfRemoteServiceAddDeathRecipient(remote, &g_deathRecipient.recipient);
738 }
HdfHostapdAddRemoteObj(struct IHostapdCallback * self)739 static int32_t HdfHostapdAddRemoteObj(struct IHostapdCallback *self)
740 {
741 struct HdfHostapdRemoteNode *pos = NULL;
742 struct DListHead *head = &HdfHostapdStubDriver()->remoteListHead;
743
744 if (self == NULL) {
745 HDF_LOGE("%{public}s:self is null", __func__);
746 return HDF_ERR_INVALID_PARAM;
747 }
748 if (!DListIsEmpty(head)) {
749 DLIST_FOR_EACH_ENTRY(pos, head, struct HdfHostapdRemoteNode, node) {
750 if (pos->service == self->AsObject(self)) {
751 HDF_LOGE("%{public}s: pos->service == self", __func__);
752 return HDF_FAILURE;
753 }
754 }
755 }
756 struct HdfHostapdRemoteNode *newRemoteNode =
757 (struct HdfHostapdRemoteNode *)OsalMemCalloc(sizeof(struct HdfHostapdRemoteNode));
758 if (newRemoteNode == NULL) {
759 HDF_LOGE("%{public}s:newRemoteNode is NULL", __func__);
760 return HDF_FAILURE;
761 }
762 newRemoteNode->callbackObj = self;
763 newRemoteNode->service = self->AsObject(self);
764 DListInsertTail(&newRemoteNode->node, head);
765 AddDeathRecipientForService(self);
766 return HDF_SUCCESS;
767 }
768
HdfHostapdDelRemoteObj(struct IHostapdCallback * self)769 static void HdfHostapdDelRemoteObj(struct IHostapdCallback *self)
770 {
771 struct HdfHostapdRemoteNode *pos = NULL;
772 struct HdfHostapdRemoteNode *tmp = NULL;
773 struct DListHead *head = &HdfHostapdStubDriver()->remoteListHead;
774
775 DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct HdfHostapdRemoteNode, node) {
776 if (pos->service->index == self->AsObject(self)->index) {
777 DListRemove(&(pos->node));
778 IHostapdCallbackRelease(pos->callbackObj);
779 OsalMemFree(pos);
780 pos = NULL;
781 break;
782 }
783 }
784 IHostapdCallbackRelease(self);
785 }
786
HostapdInterfaceRegisterEventCallback(struct IHostapdInterface * self,struct IHostapdCallback * cbFunc,const char * ifName)787 int32_t HostapdInterfaceRegisterEventCallback(struct IHostapdInterface *self,
788 struct IHostapdCallback *cbFunc, const char *ifName)
789 {
790 HDF_LOGI("Enter hdi %{public}s", __func__);
791 int32_t ret = HDF_FAILURE;
792
793 (void)self;
794 if (cbFunc == NULL || ifName == NULL) {
795 HDF_LOGE("%{public}s: input parameter invalid", __func__);
796 return HDF_ERR_INVALID_PARAM;
797 }
798 (void)OsalMutexLock(&HdfHostapdStubDriver()->mutex);
799 do {
800 ret = HdfHostapdAddRemoteObj(cbFunc);
801 if (ret != HDF_SUCCESS) {
802 HDF_LOGE("%{public}s: HdfSensorAddRemoteObj false", __func__);
803 break;
804 }
805 ret = HostapdRegisterEventCallback(HdfHostapdCallbackFun, WIFI_HOSTAPD_TO_HAL_CLIENT, ifName);
806 if (ret != HDF_SUCCESS) {
807 HDF_LOGE("%{public}s: Register failed!, error code: %{public}d", __func__, ret);
808 HdfHostapdDelRemoteObj(cbFunc);
809 break;
810 }
811 } while (0);
812 (void)OsalMutexUnlock(&HdfHostapdStubDriver()->mutex);
813 return ret;
814 }
815
HostapdInterfaceUnregisterEventCallback(struct IHostapdInterface * self,struct IHostapdCallback * cbFunc,const char * ifName)816 int32_t HostapdInterfaceUnregisterEventCallback(struct IHostapdInterface *self,
817 struct IHostapdCallback *cbFunc, const char *ifName)
818 {
819 HDF_LOGI("Enter hdi %{public}s", __func__);
820
821 (void)self;
822 if (cbFunc == NULL || ifName == NULL) {
823 HDF_LOGE("%{public}s: input parameter invalid", __func__);
824 return HDF_ERR_INVALID_PARAM;
825 }
826 (void)OsalMutexLock(&HdfHostapdStubDriver()->mutex);
827 HdfHostapdDelRemoteObj(cbFunc);
828 if (DListIsEmpty(&HdfHostapdStubDriver()->remoteListHead)) {
829 int32_t ret = HostapdUnregisterEventCallback(HdfHostapdCallbackFun, WIFI_HOSTAPD_TO_HAL_CLIENT, ifName);
830 if (ret != HDF_SUCCESS) {
831 HDF_LOGE("%{public}s: Unregister failed!, error code: %{public}d", __func__, ret);
832 }
833 }
834 (void)OsalMutexUnlock(&HdfHostapdStubDriver()->mutex);
835 return HDF_SUCCESS;
836 }
837
HostApdInterfaceShellCmd(struct IHostapdInterface * self,const char * ifName,const char * cmd)838 int32_t HostApdInterfaceShellCmd(struct IHostapdInterface *self, const char *ifName, const char *cmd)
839 {
840 HDF_LOGI("Enter hdi %{public}s", __func__);
841 struct hostapd_data *hostApd;
842
843 (void)self;
844 if (ifName == NULL || cmd == NULL) {
845 HDF_LOGE("%{public}s: input parameter invalid", __func__);
846 return HDF_ERR_INVALID_PARAM;
847 }
848 hostApd = getHostapd();
849 if (hostApd == NULL) {
850 HDF_LOGE("%{public}s hostApd is NULL", __func__);
851 return HDF_FAILURE;
852 }
853 return HDF_SUCCESS;
854 }
855