1 /*
2 * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3 */
4 #include "wifi_provision_internal.h"
5
6 #ifdef AWSS_SUPPORT_STATIS
7
8 #define DROUTE_START g_awss_statis.droute.conn_router_start
9 #define DROUTE_END g_awss_statis.droute.conn_router_end
10 #define DROUTE_CNT g_awss_statis.droute.conn_router_cnt
11 #define DROUTE_SUC g_awss_statis.droute.conn_router_suc
12 #define DROUTE_TMIN g_awss_statis.droute.conn_router_time_min
13 #define DROUTE_TMAX g_awss_statis.droute.conn_router_time_max
14 #define DROUTE_TMEAN g_awss_statis.droute.conn_router_time_mean
15
16 #ifdef AWSS_SUPPORT_SMARTCONFIG
17 #ifdef AWSS_SUPPORT_SMARTCONFIG_WPS
18 #define WPS_CNT g_awss_statis.wps.wps_parse_cnt
19 #define WPS_CRC_ERR g_awss_statis.wps.wps_parse_crc_err
20 #define WPS_PW_ERR g_awss_statis.wps.wps_parse_passwd_err
21 #define WPS_SUC g_awss_statis.wps.wps_parse_suc
22 #endif
23 #define SM_CNT g_awss_statis.sm.sm_parse_cnt
24 #define SM_CRC_ERR g_awss_statis.sm.sm_parse_crc_err
25 #define SM_PW_ERR g_awss_statis.sm.sm_parse_passwd_err
26 #define SM_SUC g_awss_statis.sm.sm_parse_suc
27 #define SM_START g_awss_statis.sm.sm_parse_start
28 #define SM_END g_awss_statis.sm.sm_parse_end
29 #define SM_TMIN g_awss_statis.sm.sm_time_min
30 #define SM_TMAX g_awss_statis.sm.sm_time_max
31 #define SM_TMEAN g_awss_statis.sm.sm_time_mean
32 #endif
33
34 #ifdef AWSS_SUPPORT_AHA
35 #define PAP_CNT g_awss_statis.pap.aha_cnt
36 #define PAP_SUC g_awss_statis.pap.aha_suc
37 #define PAP_TMIN g_awss_statis.pap.aha_time_min
38 #define PAP_TMAX g_awss_statis.pap.aha_time_max
39 #define PAP_TMEAN g_awss_statis.pap.aha_time_mean
40 #define PAP_START g_awss_statis.pap.aha_start
41 #define PAP_END g_awss_statis.pap.aha_end
42 #define PAP_SSTART g_awss_statis.pap.aha_scan_start
43 #define PAP_SSTOP g_awss_statis.pap.aha_scan_end
44 #define PAP_SAP g_awss_statis.pap.aha_switch_ap
45 #define PAP_PW_ERR g_awss_statis.pap.aha_passwd_err
46 #endif
47
48 #ifdef AWSS_SUPPORT_DEV_AP
49 #define DAP_CNT g_awss_statis.dap.dev_ap_cnt
50 #define DAP_SUC g_awss_statis.dap.dev_ap_suc
51 #define DAP_TMIN g_awss_statis.dap.dev_ap_time_min
52 #define DAP_TMAX g_awss_statis.dap.dev_ap_time_max
53 #define DAP_TMEAN g_awss_statis.dap.dev_ap_time_mean
54 #define DAP_START g_awss_statis.dap.dev_ap_start
55 #define DAP_END g_awss_statis.dap.dev_ap_end
56 #define DAP_PW_ERR g_awss_statis.dap.dev_ap_passwd_err
57 #endif
58
59 #ifndef AWSS_DISABLE_ENROLLEE
60 #define ZC_CNT g_awss_statis.zconfig.zc_cnt
61 #define ZC_SUC g_awss_statis.zconfig.zc_suc
62 #define ZC_PW_ERR g_awss_statis.zconfig.zc_passwd_err
63 #endif
64
65 #define AWSS_STATIS_BUF_LEN (768)
66
67 static void *awss_statis_mutex = NULL;
68 static uint32_t awss_statis_trace_id = 0;
69 static uint32_t awss_statis_report_id = 0;
70 static struct awss_statis_t g_awss_statis = { 0 };
71
awss_report_statis(const char * module)72 int awss_report_statis(const char *module)
73 {
74 const char *elem_fmt =
75 "[%s max:%u min:%u mean:%u cnt:%u suc:%u crc-err:%u pw-err:%u],";
76 int log_buf_len = AWSS_STATIS_BUF_LEN + strlen(AWSS_STATIS_FMT) + 21;
77 char statis_topic[TOPIC_LEN_MAX] = { 0 };
78 char *log_content = NULL;
79 char id_str[21] = { 0 };
80 char *log_buf = NULL;
81 int len = 0;
82 int ret;
83
84 log_content = awss_zalloc(AWSS_STATIS_BUF_LEN + 1);
85 if (log_content == NULL)
86 goto STATIS_ERR;
87 log_buf = awss_zalloc(log_buf_len + 1);
88 if (log_buf == NULL)
89 goto STATIS_ERR;
90
91 if (awss_build_topic(TOPIC_POST_STATIS, statis_topic, TOPIC_LEN_MAX) ==
92 NULL) {
93 awss_err("awss build statis topic fail\n");
94 goto STATIS_ERR;
95 }
96
97 if (awss_statis_mutex)
98 HAL_MutexLock(awss_statis_mutex);
99
100 if (DROUTE_CNT > 0) {
101 len += HAL_Snprintf(log_buf + len, log_buf_len - len, elem_fmt,
102 "ConnRouter", DROUTE_TMAX, DROUTE_TMIN,
103 DROUTE_TMEAN, DROUTE_CNT, DROUTE_SUC, 0, 0);
104 }
105
106 #ifdef AWSS_SUPPORT_SMARTCONFIG
107 if (SM_CNT > 0) {
108 len += HAL_Snprintf(log_buf + len, log_buf_len - len, elem_fmt,
109 "Smartconfig", SM_TMAX, SM_TMIN, SM_TMEAN, SM_CNT,
110 SM_SUC, SM_CRC_ERR, SM_PW_ERR);
111 }
112 #ifdef AWSS_SUPPORT_SMARTCONFIG_WPS
113 if (WPS_CNT > 0) {
114 len += HAL_Snprintf(log_buf + len, log_buf_len - len, elem_fmt,
115 "Smartconfig-wps", 0, 0, 0, WPS_CNT, WPS_SUC,
116 WPS_CRC_ERR, WPS_PW_ERR);
117 }
118 #endif
119 #endif
120 #ifdef AWSS_SUPPORT_AHA
121 if (PAP_CNT > 0) {
122 len += HAL_Snprintf(log_buf + len, log_buf_len - len, elem_fmt, "Aha",
123 PAP_TMAX, PAP_TMIN, PAP_TMEAN, PAP_CNT, PAP_SUC, 0,
124 PAP_PW_ERR);
125 }
126 #endif
127 #ifndef AWSS_DISABLE_ENROLLEE
128 if (ZC_CNT > 0) {
129 len += HAL_Snprintf(log_buf + len, log_buf_len - len, elem_fmt,
130 "Zconfig", 0, 0, 0, ZC_CNT, ZC_SUC, 0, ZC_PW_ERR);
131 }
132 #endif
133 #ifdef AWSS_SUPPORT_DEV_AP
134 if (DAP_CNT > 0) {
135 len += HAL_Snprintf(log_buf + len, log_buf_len - len, elem_fmt,
136 "Dev-ap", DAP_TMAX, DAP_TMIN, DAP_TMEAN, DAP_CNT,
137 DAP_SUC, 0, DAP_PW_ERR);
138 }
139 #endif
140
141 do {
142 if (len == 0) /* no need to report log */
143 break;
144 log_buf[len - 1] = '\0'; /* remove end of ',' */
145
146 HAL_Snprintf(log_content, AWSS_STATIS_BUF_LEN, AWSS_STATIS_FMT,
147 (uint32_t)HAL_UptimeMs(), "AWSS_TRACE",
148 module == NULL ? "default" : module, awss_statis_trace_id,
149 log_buf);
150
151 HAL_Snprintf(id_str, sizeof(id_str), "%u", ++awss_statis_report_id);
152
153 awss_build_packet(AWSS_CMP_PKT_TYPE_REQ, id_str, ILOP_VER,
154 METHOD_LOG_POST, log_content, 0, log_buf,
155 &log_buf_len);
156
157 awss_debug("%s\n", log_buf);
158
159 ret = awss_cmp_mqtt_send(statis_topic, log_buf, strlen(log_buf), 0);
160
161 awss_info("awss report statis %s\n", ret == 0 ? "success" : "fail");
162 } while (0);
163
164 if (awss_statis_mutex)
165 HAL_MutexUnlock(awss_statis_mutex);
166
167 HAL_Free(log_buf);
168 HAL_Free(log_content);
169
170 return 0;
171
172 STATIS_ERR:
173 if (log_content)
174 HAL_Free(log_content);
175 if (log_buf)
176 HAL_Free(log_buf);
177 return -1;
178 }
179
awss_disp_statis()180 void awss_disp_statis()
181 {
182 if (awss_statis_mutex)
183 HAL_MutexLock(awss_statis_mutex);
184
185 awss_debug(
186 "--------------------------------AWSS "
187 "STATIS-----------------------------------");
188 awss_debug("name\t\tmax\tmin\tmean\tcnt\tsuc\tcrc-err\tpasswd-err");
189 awss_debug("ConnRouter \t%u\t%u\t%u\t%u\t%u\t%u\t%u\t", DROUTE_TMAX,
190 DROUTE_TMIN, DROUTE_TMEAN, DROUTE_CNT, DROUTE_SUC, 0, 0);
191 #ifdef AWSS_SUPPORT_SMARTCONFIG
192 awss_debug("Smartconfig \t%u\t%u\t%u\t%u\t%u\t%u\t%u\t", SM_TMAX,
193 SM_TMIN, SM_TMEAN, SM_CNT, SM_SUC, SM_CRC_ERR, SM_PW_ERR);
194 #ifdef AWSS_SUPPORT_SMARTCONFIG_WPS
195 awss_debug("Smartconfig-wps \t%u\t%u\t%u\t%u\t%u\t%u\t%u\t", 0, 0, 0,
196 WPS_CNT, WPS_SUC, WPS_CRC_ERR, WPS_PW_ERR);
197 #endif
198 #endif
199 #ifdef AWSS_SUPPORT_AHA
200 awss_debug("Aha \t%u\t%u\t%u\t%u\t%u\t%u\t%u\t", PAP_TMAX,
201 PAP_TMIN, PAP_TMEAN, PAP_CNT, PAP_SUC, 0, PAP_PW_ERR);
202 #endif
203 #ifndef AWSS_DISABLE_ENROLLEE
204 awss_debug("Zconfig \t%u\t%u\t%u\t%u\t%u\t%u\t%u\t", 0, 0, 0,
205 ZC_CNT, ZC_SUC, 0, ZC_PW_ERR);
206 #endif
207 #ifdef AWSS_SUPPORT_DEV_AP
208 awss_debug("Dev-ap \t%u\t%u\t%u\t%u\t%u\t%u\t%u\t", DAP_TMAX,
209 DAP_TMIN, DAP_TMEAN, DAP_CNT, DAP_SUC, 0, DAP_PW_ERR);
210 #endif
211 awss_debug(
212 "----------------------------------------------------------------------"
213 "--------");
214
215 if (awss_statis_mutex)
216 HAL_MutexUnlock(awss_statis_mutex);
217 }
218
awss_clear_statis()219 void awss_clear_statis()
220 {
221 if (awss_statis_mutex)
222 HAL_MutexLock(awss_statis_mutex);
223
224 memset(&g_awss_statis, 0, sizeof(g_awss_statis));
225
226 awss_statis_trace_id = 0;
227 awss_statis_report_id = 0;
228
229 if (awss_statis_mutex) {
230 HAL_MutexUnlock(awss_statis_mutex);
231 HAL_MutexDestroy(awss_statis_mutex);
232 }
233 awss_statis_mutex = NULL;
234 }
235
awss_update_statis(int awss_statis_idx,int type)236 void awss_update_statis(int awss_statis_idx, int type)
237 {
238 uint32_t time = HAL_UptimeMs();
239
240 if (awss_statis_mutex == NULL) {
241 awss_statis_mutex = HAL_MutexCreate();
242 if (awss_statis_mutex == NULL) {
243 awss_debug("a-statis am fail\n");
244 return;
245 }
246 }
247
248 HAL_MutexLock(awss_statis_mutex);
249
250 if (type == AWSS_STATIS_TYPE_TIME_START)
251 awss_statis_trace_id++;
252
253 switch (awss_statis_idx) {
254 case AWSS_STATIS_CONN_ROUTER_IDX:
255 switch (type) {
256 case AWSS_STATIS_TYPE_TIME_START:
257 DROUTE_CNT++;
258 DROUTE_START = time;
259 break;
260 case AWSS_STATIS_TYPE_TIME_SUC:
261 DROUTE_SUC++;
262 DROUTE_END = time;
263 time = (uint32_t)(DROUTE_END - DROUTE_START);
264 if (DROUTE_SUC > 0) {
265 DROUTE_TMEAN = (DROUTE_TMEAN + time) / (DROUTE_SUC);
266 } else {
267 DROUTE_TMEAN = time;
268 DROUTE_SUC = 1;
269 }
270 if (DROUTE_TMIN == 0 || DROUTE_TMIN > time)
271 DROUTE_TMIN = time;
272 if (DROUTE_TMAX == 0 || DROUTE_TMAX < time)
273 DROUTE_TMAX = time;
274 break;
275 default:
276 break;
277 }
278 break;
279 #ifdef AWSS_SUPPORT_SMARTCONFIG
280 #ifdef AWSS_SUPPORT_SMARTCONFIG_WPS
281 case AWSS_STATIS_WPS_IDX:
282 switch (type) {
283 case AWSS_STATIS_TYPE_TIME_START:
284 WPS_CNT++;
285 break;
286 case AWSS_STATIS_TYPE_TIME_SUC:
287 WPS_SUC++;
288 break;
289 case AWSS_STATIS_TYPE_PASSWD_ERR:
290 WPS_PW_ERR++;
291 break;
292 case AWSS_STATIS_TYPE_CRC_ERR:
293 WPS_CRC_ERR++;
294 break;
295 default:
296 break;
297 }
298 break;
299 #endif
300 case AWSS_STATIS_SM_IDX:
301 switch (type) {
302 case AWSS_STATIS_TYPE_TIME_START:
303 SM_CNT++;
304 SM_START = time;
305 break;
306 case AWSS_STATIS_TYPE_TIME_SUC:
307 SM_SUC++;
308 SM_END = time;
309 time = (uint32_t)(SM_END - SM_START);
310 if (SM_SUC > 0) {
311 SM_TMEAN = (SM_TMEAN + time) / (SM_SUC);
312 } else {
313 SM_TMEAN = time;
314 SM_SUC = 1;
315 }
316
317 if (SM_TMIN == 0 || SM_TMIN > time)
318 SM_TMIN = time;
319 if (SM_TMAX == 0 || SM_TMAX < time)
320 SM_TMAX = time;
321 break;
322 case AWSS_STATIS_TYPE_PASSWD_ERR:
323 SM_PW_ERR++;
324 break;
325 case AWSS_STATIS_TYPE_CRC_ERR:
326 SM_CRC_ERR++;
327 break;
328 default:
329 break;
330 }
331 break;
332 #endif
333 #ifdef AWSS_SUPPORT_AHA
334 case AWSS_STATIS_PAP_IDX:
335 switch (type) {
336 case AWSS_STATIS_TYPE_TIME_START:
337 PAP_CNT++;
338 PAP_START = time;
339 break;
340 case AWSS_STATIS_TYPE_TIME_SUC:
341 PAP_SUC++;
342 PAP_END = time;
343 time = (uint32_t)(PAP_END - PAP_START);
344 if (PAP_SUC > 0) {
345 PAP_TMEAN = (PAP_TMEAN + time) / (PAP_SUC);
346 } else {
347 PAP_TMEAN = time;
348 PAP_SUC = 1;
349 }
350 if (PAP_TMIN == 0 || PAP_TMIN > time)
351 PAP_TMIN = time;
352 if (PAP_TMAX == 0 || PAP_TMAX < time)
353 PAP_TMAX = time;
354 break;
355 case AWSS_STATIS_TYPE_PASSWD_ERR:
356 PAP_PW_ERR++;
357 break;
358 case AWSS_STATIS_TYPE_SCAN_START:
359 PAP_SSTART = time;
360 break;
361 case AWSS_STATIS_TYPE_SCAN_STOP:
362 PAP_SSTOP = time;
363 break;
364 case AWSS_STATIS_TYPE_SWITCHAP:
365 PAP_SAP++;
366 break;
367 default:
368 break;
369 }
370 break;
371 #endif
372 #ifdef AWSS_SUPPORT_DEV_AP
373 case AWSS_STATIS_DAP_IDX:
374 switch (type) {
375 case AWSS_STATIS_TYPE_TIME_START:
376 DAP_CNT++;
377 DAP_START = time;
378 break;
379 case AWSS_STATIS_TYPE_TIME_SUC:
380 DAP_SUC++;
381 DAP_END = time;
382 time = (uint32_t)(DAP_END - DAP_START);
383 if (DAP_SUC > 0) {
384 DAP_TMEAN = (DAP_TMEAN + time) / (DAP_SUC);
385 } else {
386 DAP_TMEAN = time;
387 DAP_SUC = 1;
388 }
389 if (DAP_TMIN == 0 || DAP_TMIN > time)
390 DAP_TMIN = time;
391 if (DAP_TMAX == 0 || DAP_TMAX < time)
392 DAP_TMAX = time;
393 break;
394 case AWSS_STATIS_TYPE_PASSWD_ERR:
395 DAP_PW_ERR++;
396 break;
397 default:
398 break;
399 }
400 break;
401 #endif
402 #ifndef AWSS_DISABLE_ENROLLEE
403 case AWSS_STATIS_ZCONFIG_IDX:
404 switch (type) {
405 case AWSS_STATIS_TYPE_TIME_START:
406 ZC_CNT++;
407 break;
408 case AWSS_STATIS_TYPE_TIME_SUC:
409 ZC_SUC++;
410 break;
411 case AWSS_STATIS_TYPE_PASSWD_ERR:
412 ZC_PW_ERR++;
413 break;
414 default:
415 break;
416 }
417 break;
418 #endif
419 default:
420 break;
421 }
422 HAL_MutexUnlock(awss_statis_mutex);
423 }
424
425 #endif
426