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 &registerManager;
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, &param);
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