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