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