10a7ce71fSopenharmony_ci/*
20a7ce71fSopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
30a7ce71fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40a7ce71fSopenharmony_ci * you may not use this file except in compliance with the License.
50a7ce71fSopenharmony_ci * You may obtain a copy of the License at
60a7ce71fSopenharmony_ci *
70a7ce71fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
80a7ce71fSopenharmony_ci *
90a7ce71fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100a7ce71fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110a7ce71fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120a7ce71fSopenharmony_ci * See the License for the specific language governing permissions and
130a7ce71fSopenharmony_ci * limitations under the License.
140a7ce71fSopenharmony_ci */
150a7ce71fSopenharmony_ci
160a7ce71fSopenharmony_ci#include "wifi_softap.h"
170a7ce71fSopenharmony_ci#include "hi_wifi_api.h"
180a7ce71fSopenharmony_ci#include "lwip/ip_addr.h"
190a7ce71fSopenharmony_ci#include "lwip/netifapi.h"
200a7ce71fSopenharmony_ci
210a7ce71fSopenharmony_ci#define APP_INIT_VAP_NUM    2
220a7ce71fSopenharmony_ci#define APP_INIT_USR_NUM    2
230a7ce71fSopenharmony_ci
240a7ce71fSopenharmony_cistatic struct netif *g_lwipNetif = NULL;
250a7ce71fSopenharmony_ci
260a7ce71fSopenharmony_ci/* clear netif's ip, gateway and netmask */
270a7ce71fSopenharmony_civoid HiSoftapResetAddr(const struct netif *pstLwipNetif)
280a7ce71fSopenharmony_ci{
290a7ce71fSopenharmony_ci    ip4_addr_t st_gw;
300a7ce71fSopenharmony_ci    ip4_addr_t st_ipaddr;
310a7ce71fSopenharmony_ci    ip4_addr_t st_netmask;
320a7ce71fSopenharmony_ci
330a7ce71fSopenharmony_ci    if (pstLwipNetif == NULL) {
340a7ce71fSopenharmony_ci        printf("hisi_reset_addr::Null param of netdev\r\n");
350a7ce71fSopenharmony_ci        return;
360a7ce71fSopenharmony_ci    }
370a7ce71fSopenharmony_ci
380a7ce71fSopenharmony_ci    IP4_ADDR(&st_ipaddr, 0, 0, 0, 0);
390a7ce71fSopenharmony_ci    IP4_ADDR(&st_gw, 0, 0, 0, 0);
400a7ce71fSopenharmony_ci    IP4_ADDR(&st_netmask, 0, 0, 0, 0);
410a7ce71fSopenharmony_ci
420a7ce71fSopenharmony_ci    netifapi_netif_set_addr(pstLwipNetif, &st_ipaddr, &st_netmask, &st_gw);
430a7ce71fSopenharmony_ci}
440a7ce71fSopenharmony_ci
450a7ce71fSopenharmony_ciint HiWifiStartSoftap(void)
460a7ce71fSopenharmony_ci{
470a7ce71fSopenharmony_ci    int ret;
480a7ce71fSopenharmony_ci    errno_t rc;
490a7ce71fSopenharmony_ci    char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};
500a7ce71fSopenharmony_ci    int len = sizeof(ifname);
510a7ce71fSopenharmony_ci    hi_wifi_softap_config hapd_conf = {0};
520a7ce71fSopenharmony_ci    const unsigned char wifiVapResNum = APP_INIT_VAP_NUM;
530a7ce71fSopenharmony_ci    const unsigned char wifiUserResNum = APP_INIT_USR_NUM;
540a7ce71fSopenharmony_ci    ip4_addr_t st_gw;
550a7ce71fSopenharmony_ci    ip4_addr_t st_ipaddr;
560a7ce71fSopenharmony_ci    ip4_addr_t st_netmask;
570a7ce71fSopenharmony_ci    ip4_addr_t st_port;
580a7ce71fSopenharmony_ci
590a7ce71fSopenharmony_ci    rc = memcpy_s(hapd_conf.ssid, HI_WIFI_MAX_SSID_LEN + 1, "XXXXXXXX", 9); /* 9:ssid length */
600a7ce71fSopenharmony_ci    if (rc != EOK) {
610a7ce71fSopenharmony_ci        return -1;
620a7ce71fSopenharmony_ci    }
630a7ce71fSopenharmony_ci    hapd_conf.authmode = HI_WIFI_SECURITY_OPEN;
640a7ce71fSopenharmony_ci    hapd_conf.channel_num = 1;
650a7ce71fSopenharmony_ci
660a7ce71fSopenharmony_ci    ret = hi_wifi_softap_start(&hapd_conf, ifname, &len);
670a7ce71fSopenharmony_ci    if (ret != HISI_OK) {
680a7ce71fSopenharmony_ci        printf("hi_wifi_softap_start\n");
690a7ce71fSopenharmony_ci        return -1;
700a7ce71fSopenharmony_ci    }
710a7ce71fSopenharmony_ci
720a7ce71fSopenharmony_ci    /* acquire netif for IP operation */
730a7ce71fSopenharmony_ci    g_lwipNetif = netifapi_netif_find(ifname);
740a7ce71fSopenharmony_ci    if (g_lwipNetif == NULL) {
750a7ce71fSopenharmony_ci        printf("%s: get netif failed\n", __FUNCTION__);
760a7ce71fSopenharmony_ci        return -1;
770a7ce71fSopenharmony_ci    }
780a7ce71fSopenharmony_ci
790a7ce71fSopenharmony_ci    IP4_ADDR(&st_gw, 192, 168, 1, 1);          /* input your IP for example: 192.168.1.1 */
800a7ce71fSopenharmony_ci    IP4_ADDR(&st_ipaddr, 192, 168, 1, 4);      /* input your netmask for example: 192.168.4.1 */
810a7ce71fSopenharmony_ci    IP4_ADDR(&st_netmask, 255, 255, 255, 0);     /* input your gateway for example: 255.255.255.0 */
820a7ce71fSopenharmony_ci    netifapi_netif_set_addr(g_lwipNetif, &st_ipaddr, &st_netmask, &st_gw);
830a7ce71fSopenharmony_ci
840a7ce71fSopenharmony_ci    netifapi_dhcps_start(g_lwipNetif, 0, 0);
850a7ce71fSopenharmony_ci
860a7ce71fSopenharmony_ci    return 0;
870a7ce71fSopenharmony_ci}
880a7ce71fSopenharmony_ci
890a7ce71fSopenharmony_civoid HiWifiStopSoftap(void)
900a7ce71fSopenharmony_ci{
910a7ce71fSopenharmony_ci    int ret;
920a7ce71fSopenharmony_ci
930a7ce71fSopenharmony_ci    netifapi_dhcps_stop(g_lwipNetif);
940a7ce71fSopenharmony_ci    HiSoftapResetAddr(g_lwipNetif);
950a7ce71fSopenharmony_ci
960a7ce71fSopenharmony_ci    ret = hi_wifi_softap_stop();
970a7ce71fSopenharmony_ci    if (ret != HISI_OK) {
980a7ce71fSopenharmony_ci        printf("failed to stop softap\n");
990a7ce71fSopenharmony_ci    }
1000a7ce71fSopenharmony_ci
1010a7ce71fSopenharmony_ci    ret = hi_wifi_deinit();
1020a7ce71fSopenharmony_ci    if (ret != HISI_OK) {
1030a7ce71fSopenharmony_ci        printf("failed to deinit wifi\n");
1040a7ce71fSopenharmony_ci    }
1050a7ce71fSopenharmony_ci
1060a7ce71fSopenharmony_ci    g_lwipNetif = NULL;
1070a7ce71fSopenharmony_ci}
1080a7ce71fSopenharmony_ci
109