1 /*
2  * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3  */
4 
5 #include "blecfg_pub.h"
6 
7 #include "aos/kv.h"
8 
9 #include "lwip/icmp.h"
10 #include "lwip/sockets.h"
11 #include "lwip/netdb.h"
12 #include "lwip/prot/ip.h"
13 #include "lwip/inet_chksum.h"
14 
15 #define LIMIT_WIFI_SSID         256
16 #define LIMIT_WIFI_PASSWD       256
17 
18 typedef struct {
19     uint8_t ssid[LIMIT_WIFI_SSID];
20     uint8_t passwd[LIMIT_WIFI_PASSWD];
21 } wifi_info;
22 
23 static wifi_info s_wifi_info;
24 
BleCfg_wifi_kv_save(char * ssid,char * passwd)25 static int32_t BleCfg_wifi_kv_save(char *ssid, char *passwd)
26 {
27     int32_t ret;
28     int len;
29     char wifi_ssid[LIMIT_WIFI_SSID];
30     char wifi_passwd[LIMIT_WIFI_PASSWD];
31 
32     if ( ssid == NULL || strlen(ssid) >= LIMIT_WIFI_SSID
33       || passwd == NULL || strlen(passwd) >= LIMIT_WIFI_PASSWD ) {
34         BLECFG_LOG_ERROR("[%s]: input para error!\r\n", __func__);
35         return -1;
36     }
37 
38     len = LIMIT_WIFI_SSID;
39     ret = aos_kv_get("wifi_ssid", wifi_ssid, &len);
40     if(ret){
41         wifi_ssid[0] = 0;
42     }
43     len = LIMIT_WIFI_PASSWD;
44     ret = aos_kv_get("wifi_passwd", wifi_passwd, &len);
45     if(ret){
46         wifi_passwd[0] = 0;
47     }
48 
49     if ( strcmp(wifi_ssid, ssid) == 0
50       && strcmp(wifi_passwd, passwd) == 0 ) {
51         /* No need to save */
52         BLECFG_LOG_INFO("[%s]: kv already saved.\r\n", __func__);
53         return 0;
54     }
55 
56     ret = aos_kv_set("wifi_ssid", ssid, strlen(ssid)+1, 1);
57     if ( ret ){
58         BLECFG_LOG_ERROR("[%s]: set 'wifi_ssid' fail! ret = %d\r\n", __func__, ret);
59         return ret;
60     }
61 
62     ret = aos_kv_set("wifi_passwd", passwd, strlen(passwd)+1, 1);
63     if ( ret ) {
64         BLECFG_LOG_ERROR("[%s]: set 'wifi_passwd' fail! ret = %d\r\n", __func__, ret);
65         return ret;
66     }
67 
68     return 0;
69 }
70 
BleCfg_wifi_kv_load(char * ssid,char * passwd)71 static int32_t BleCfg_wifi_kv_load(char *ssid, char *passwd)
72 {
73     int32_t ret;
74     int len;
75 
76     len = LIMIT_WIFI_SSID;
77     ret = aos_kv_get("wifi_ssid", ssid, &len);
78     if(ret){
79         //BLECFG_LOG_INFO("%s: wifi_ssid not find", __func__);
80         return ret;
81     }
82     BLECFG_LOG_INFO("%s: wifi_ssid '%s'\r\n", __func__, ssid);
83 
84     len = LIMIT_WIFI_PASSWD;
85     ret = aos_kv_get("wifi_passwd", passwd, &len);
86     if(ret){
87         //BLECFG_LOG_INFO("%s: wifi_passwd not find", __func__);
88         return ret;
89     }
90     BLECFG_LOG_INFO("%s: wifi_passwd '%s'\r\n", __func__, passwd);
91 
92     return 0;
93 }
94 
95 /* wifi_info_stat_t: WIFI_INFO_NULL/WIFI_INFO_SAVED -> WIFI_INFO_AVAILABLE */
BleCfg_wifi_set(char * ssid,char * passwd)96 BLECFG_STATE BleCfg_wifi_set(char *ssid, char *passwd)
97 {
98     wifi_info *wifi_info = &s_wifi_info;
99 
100     if ( strlen(ssid) + 1 >= sizeof(wifi_info->ssid)
101       || strlen(passwd) + 1 >= sizeof(wifi_info->passwd) ) {
102         return BLECFG_COMMON_FAILED;
103     }
104 
105     strncpy(wifi_info->ssid, ssid, sizeof(wifi_info->ssid));
106     strncpy(wifi_info->passwd, passwd, sizeof(wifi_info->passwd));
107 
108     return BLECFG_SUCCESS;
109 }
110 
BleCfg_wifi_connect()111 BLECFG_STATE BleCfg_wifi_connect()
112 {
113     int32_t netmgr_handle, ret;
114     wifi_info *wifi_info = &s_wifi_info;
115     netmgr_connect_params_t netmgr_params;
116 
117     memset(&netmgr_params, 0, sizeof(netmgr_connect_params_t));
118     strncpy(netmgr_params.params.wifi_params.ssid, wifi_info->ssid, NETMGR_SSID_MAX_LEN);
119     strncpy(netmgr_params.params.wifi_params.pwd, wifi_info->passwd, NETMGR_PWD_MAX_LEN);
120     netmgr_params.params.wifi_params.timeout = 18000;
121 
122     netmgr_handle = netmgr_get_dev("/dev/wifi0");
123     ret = netmgr_connect(netmgr_handle, &netmgr_params);
124     BLECFG_LOG_INFO("%s: netmgr_connect return %d\r\n", __func__, ret);
125     if ( ret != 0 ) {
126         return BLECFG_COMMON_FAILED;
127     }
128 
129     return BLECFG_SUCCESS;
130 }
131 
132 /* wifi_info_stat_t: WIFI_INFO_AVAILABLE -> WIFI_INFO_SAVED */
BleCfg_wifi_save()133 BLECFG_STATE BleCfg_wifi_save()
134 {
135     int32_t ret;
136     wifi_info *wifi_info = &s_wifi_info;
137 
138     ret = BleCfg_wifi_kv_save(wifi_info->ssid, wifi_info->passwd);
139     if ( ret != 0 ) {
140         return BLECFG_COMMON_FAILED;
141     }
142 
143     return BLECFG_SUCCESS;
144 }
145 
146 
147 /* wifi_info_stat_t: WIFI_INFO_NULL -> WIFI_INFO_AVAILABLE */
BleCfg_wifi_restore()148 BLECFG_STATE BleCfg_wifi_restore()
149 {
150     int32_t ret;
151     wifi_info *wifi_info = &s_wifi_info;
152 
153     ret = BleCfg_wifi_kv_load(wifi_info->ssid, wifi_info->passwd);
154     if ( ret != 0 ) {
155         return BLECFG_COMMON_FAILED;
156     }
157 
158     return BLECFG_SUCCESS;
159 }
160 
BleCfg_netmgr_init(BleCfg_dhcp_cb dhcp_callback)161 BLECFG_STATE BleCfg_netmgr_init(BleCfg_dhcp_cb dhcp_callback)
162 {
163     int32_t ret;
164 
165     memset(&s_wifi_info, 0, sizeof(s_wifi_info));
166 
167     /* netmgr init */
168     event_service_init(NULL);
169     ret = netmgr_service_init(NULL);
170     if(ret) {
171         BLECFG_LOG_ERROR("%s: net mgr init, ret = %x\r\n", __func__, ret);
172         return BLECFG_COMMON_FAILED;
173     }
174 
175     event_subscribe(EVENT_NETMGR_DHCP_SUCCESS, dhcp_callback, NULL);
176 
177     return BLECFG_SUCCESS;
178 }
179 
180