xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/wlan_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2007 The Android Open Source Project
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <errno.h>
18*4882a593Smuzhiyun #include <sys/types.h>
19*4882a593Smuzhiyun #include <sys/uio.h>
20*4882a593Smuzhiyun #include <sys/stat.h>
21*4882a593Smuzhiyun #include <sys/time.h>
22*4882a593Smuzhiyun #include <stdio.h>
23*4882a593Smuzhiyun #include <stdlib.h>
24*4882a593Smuzhiyun #include <string.h>
25*4882a593Smuzhiyun #include <unistd.h>
26*4882a593Smuzhiyun #include <utime.h>
27*4882a593Smuzhiyun #include <fcntl.h>
28*4882a593Smuzhiyun #include <cutils/log.h>
29*4882a593Smuzhiyun #include "common.h"
30*4882a593Smuzhiyun //#include "extra-functions.h"
31*4882a593Smuzhiyun #include "wlan_test.h"
32*4882a593Smuzhiyun #include "test_case.h"
33*4882a593Smuzhiyun #include "language.h"
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define TAG	"[PCBA,WIFI]: "
36*4882a593Smuzhiyun #define LOG(x...)	printf(TAG x)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define MAX_SCAN_COUNTS	(64)
39*4882a593Smuzhiyun #define SCAN_RESULT_LENGTH	(128 * MAX_SCAN_COUNTS)
40*4882a593Smuzhiyun #define SCAN_RESULT_FILE	"/data/scan_result.txt"
41*4882a593Smuzhiyun #define SCAN_RESULT_FILE2	"/data/scan_result2.txt"
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static char ssids[MAX_SCAN_COUNTS][128];
44*4882a593Smuzhiyun static char rssis[MAX_SCAN_COUNTS][128];
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun static char wifi_type[64] = {0};
47*4882a593Smuzhiyun extern int check_wifi_chip_type_string(char *type);
48*4882a593Smuzhiyun static const char RECOGNIZE_WIFI_CHIP[] = "/data/misc/wifi/wifi_chip";
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #if 0
51*4882a593Smuzhiyun /*
52*4882a593Smuzhiyun  * RSSI Levels as used by notification icon
53*4882a593Smuzhiyun  *
54*4882a593Smuzhiyun  * Level 4  -55 <= RSSI
55*4882a593Smuzhiyun  * Level 3  -66 <= RSSI < -55
56*4882a593Smuzhiyun  * Level 2  -77 <= RSSI < -67
57*4882a593Smuzhiyun  * Level 1  -88 <= RSSI < -78
58*4882a593Smuzhiyun  * Level 0         RSSI < -88
59*4882a593Smuzhiyun  */
60*4882a593Smuzhiyun static int calc_rssi_lvl(int rssi)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	rssi *= -1;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	if (rssi >= -55)
65*4882a593Smuzhiyun 		return 4;
66*4882a593Smuzhiyun 	else if (rssi >= -66)
67*4882a593Smuzhiyun 		return 3;
68*4882a593Smuzhiyun 	else if (rssi >= -77)
69*4882a593Smuzhiyun 		return 2;
70*4882a593Smuzhiyun 	else if (rssi >= -88)
71*4882a593Smuzhiyun 		return 1;
72*4882a593Smuzhiyun 	else
73*4882a593Smuzhiyun 		return 0;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun static void process_ssid(char *dst, char *src, char *src2)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun 	char *p, *p2, *tmp, *tmp2;
79*4882a593Smuzhiyun 	int i, j, dbm, dbm2 = 99, index = 0, rssi;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	for (i = 0; i < MAX_SCAN_COUNTS; i++) {
82*4882a593Smuzhiyun 		/* ESSID:"PocketAP_Home" */
83*4882a593Smuzhiyun 		tmp = &ssids[i][0];
84*4882a593Smuzhiyun 		p = strstr(src, "ESSID:");
85*4882a593Smuzhiyun 		if (p == NULL)
86*4882a593Smuzhiyun 			break;
87*4882a593Smuzhiyun 		/* skip "ESSID:" */
88*4882a593Smuzhiyun 		p += strlen("ESSID:");
89*4882a593Smuzhiyun 		while ((*p != '\0') && (*p != '\n'))
90*4882a593Smuzhiyun 			*tmp++ = *p++;
91*4882a593Smuzhiyun 		*tmp++ = '\0';
92*4882a593Smuzhiyun 		src = p;
93*4882a593Smuzhiyun 		/* LOG("src = %s\n", src); */
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 		/* Quality:4/5  Signal level:-59 dBm  Noise level:-96 dBm */
96*4882a593Smuzhiyun 		tmp2 = &rssis[i][0];
97*4882a593Smuzhiyun 		p2 = strstr(src2, "Signal level");
98*4882a593Smuzhiyun 		if (p2 == NULL)
99*4882a593Smuzhiyun 			break;
100*4882a593Smuzhiyun 		/* skip "level=" */
101*4882a593Smuzhiyun 		p2 += strlen("Signal level") + 1;
102*4882a593Smuzhiyun 		/* like "-90 dBm", total 3 chars */
103*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* '-' */
104*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* '9' */
105*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* '0' */
106*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* ' ' */
107*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* 'd' */
108*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* 'B' */
109*4882a593Smuzhiyun 		*tmp2++ = *p2++;	/* 'm' */
110*4882a593Smuzhiyun 		*tmp2++ = '\0';
111*4882a593Smuzhiyun 		src2 = p2;
112*4882a593Smuzhiyun 		/* LOG("src2 = %s\n", src2); */
113*4882a593Smuzhiyun 		LOG("i = %d, %s, %s\n", i, &ssids[i][0], &rssis[i][0]);
114*4882a593Smuzhiyun 	}
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	LOG("total = %d\n", i);
117*4882a593Smuzhiyun 	if (i == 0)
118*4882a593Smuzhiyun 		return;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	for (j = 0; j < i; j++) {
121*4882a593Smuzhiyun 		dbm = atoi(&rssis[j][1]);	/* skip '-' */
122*4882a593Smuzhiyun 		if (dbm == 0)
123*4882a593Smuzhiyun 			continue;
124*4882a593Smuzhiyun 		if (dbm < dbm2) {		/* get max rssi */
125*4882a593Smuzhiyun 			dbm2 = dbm;
126*4882a593Smuzhiyun 			index = j;
127*4882a593Smuzhiyun 		}
128*4882a593Smuzhiyun 	}
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	LOG("index = %d, dbm = %d\n", index, dbm2);
131*4882a593Smuzhiyun 	LOG("select ap: %s, %s\n", &ssids[index][0], &rssis[index][0]);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	rssi = calc_rssi_lvl(atoi(&rssis[index][1]));
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	sprintf(dst, "{ %s \"%d\" }", &ssids[index][0], rssi);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun int save_wifi_chip_type(char *type)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun 	int ret;
141*4882a593Smuzhiyun 	int fd;
142*4882a593Smuzhiyun 	int len;
143*4882a593Smuzhiyun 	char buf[64];
144*4882a593Smuzhiyun 	ret = access(RECOGNIZE_WIFI_CHIP, R_OK|W_OK);
145*4882a593Smuzhiyun 	if ((ret == 0) || (errno == EACCES)) {
146*4882a593Smuzhiyun 		if ((ret != 0) && (chmod(RECOGNIZE_WIFI_CHIP, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) != 0)) {
147*4882a593Smuzhiyun 			LOG("Cannot set RW to %s : %s\n", RECOGNIZE_WIFI_CHIP,strerror(errno));
148*4882a593Smuzhiyun 			return -1;
149*4882a593Smuzhiyun 		}
150*4882a593Smuzhiyun 		LOG("%s is exit\n", RECOGNIZE_WIFI_CHIP);
151*4882a593Smuzhiyun 		return 0;
152*4882a593Smuzhiyun 	}
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	fd = TEMP_FAILURE_RETRY(open(RECOGNIZE_WIFI_CHIP, O_CREAT|O_RDWR, 0664));
155*4882a593Smuzhiyun 	if (fd < 0) {
156*4882a593Smuzhiyun 		LOG("Cannot create %s : %s\n", RECOGNIZE_WIFI_CHIP,strerror(errno));
157*4882a593Smuzhiyun 		return -1;
158*4882a593Smuzhiyun 	}
159*4882a593Smuzhiyun 	LOG("is not exit,save wifi chip %s\n", RECOGNIZE_WIFI_CHIP);
160*4882a593Smuzhiyun 	strcpy(buf, type);
161*4882a593Smuzhiyun 	LOG("recognized wifi chip = %s , save to %s\n",buf, RECOGNIZE_WIFI_CHIP);
162*4882a593Smuzhiyun 	len = strlen(buf)+1;
163*4882a593Smuzhiyun 	if (TEMP_FAILURE_RETRY(write(fd, buf, len)) != len) {
164*4882a593Smuzhiyun 		LOG("Error writing %s : %s\n", RECOGNIZE_WIFI_CHIP, strerror(errno));
165*4882a593Smuzhiyun 		close(fd);
166*4882a593Smuzhiyun 		return -1;
167*4882a593Smuzhiyun 	}
168*4882a593Smuzhiyun 	close(fd);
169*4882a593Smuzhiyun 	if (chmod(RECOGNIZE_WIFI_CHIP, 0664) < 0) {
170*4882a593Smuzhiyun 		LOG("Error changing permissions of %s to 0664: %s\n", RECOGNIZE_WIFI_CHIP, strerror(errno));
171*4882a593Smuzhiyun 		unlink(RECOGNIZE_WIFI_CHIP);
172*4882a593Smuzhiyun 		return -1;
173*4882a593Smuzhiyun 	}
174*4882a593Smuzhiyun 	return 1;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun #endif
177*4882a593Smuzhiyun 
wlan_test(void * argv)178*4882a593Smuzhiyun void *wlan_test(void *argv)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	int ret = 0, y;
181*4882a593Smuzhiyun 	FILE *fp = NULL;
182*4882a593Smuzhiyun 	FILE *fp2 = NULL;
183*4882a593Smuzhiyun 	char *results = NULL;
184*4882a593Smuzhiyun 	char *results2 = NULL;
185*4882a593Smuzhiyun 	char ssid[100];
186*4882a593Smuzhiyun 	struct testcase_info *tc_info = (struct testcase_info *)argv;
187*4882a593Smuzhiyun 	char wifi_pcba_node = 1;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	/* remind ddr test */
190*4882a593Smuzhiyun 	if (tc_info->y <= 0)
191*4882a593Smuzhiyun 		tc_info->y = get_cur_print_y();
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	y = tc_info->y;
194*4882a593Smuzhiyun 	ui_print_xy_rgba(0, y, 255, 255, 0, 255, "%s:[%s..]\n", PCBA_WIFI,
195*4882a593Smuzhiyun 			 PCBA_TESTING);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun #if 0
198*4882a593Smuzhiyun 	if (wifi_type[0] == 0) {
199*4882a593Smuzhiyun 		check_wifi_chip_type_string(wifi_type);
200*4882a593Smuzhiyun 		save_wifi_chip_type(wifi_type);
201*4882a593Smuzhiyun 	}
202*4882a593Smuzhiyun 	ret = __system("busybox chmod 777 /res/wifi.sh");
203*4882a593Smuzhiyun 	if (ret)
204*4882a593Smuzhiyun 		LOG("chmod wifi.sh failed :%d\n", ret);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	ret = __system("/res/wifi.sh");
207*4882a593Smuzhiyun 	if (ret <= 0)
208*4882a593Smuzhiyun 		goto error_exit;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	results = malloc(SCAN_RESULT_LENGTH);
211*4882a593Smuzhiyun 	results2 = malloc(SCAN_RESULT_LENGTH);
212*4882a593Smuzhiyun 	if (results == NULL || results2 == NULL)
213*4882a593Smuzhiyun 		goto error_exit;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	fp = fopen(SCAN_RESULT_FILE, "r");
216*4882a593Smuzhiyun 	fp2 = fopen(SCAN_RESULT_FILE2, "r");
217*4882a593Smuzhiyun 	if (fp == NULL || fp2 == NULL)
218*4882a593Smuzhiyun 		goto error_exit;
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	memset(results, 0, SCAN_RESULT_LENGTH);
221*4882a593Smuzhiyun 	fread(results, SCAN_RESULT_LENGTH, 1, fp);
222*4882a593Smuzhiyun 	results[SCAN_RESULT_LENGTH - 1] = '\0';
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	memset(results2, 0, SCAN_RESULT_LENGTH);
225*4882a593Smuzhiyun 	fread(results2, SCAN_RESULT_LENGTH, 1, fp2);
226*4882a593Smuzhiyun 	results2[SCAN_RESULT_LENGTH - 1] = '\0';
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	memset(ssid, 0, 100);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	process_ssid(ssid, results, results2);
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	ui_print_xy_rgba(0, y, 0, 255, 0, 255, "%s:[%s] %s\n", PCBA_WIFI,
234*4882a593Smuzhiyun 			 PCBA_SECCESS, ssid);
235*4882a593Smuzhiyun 	tc_info->result = 0;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	fclose(fp);
238*4882a593Smuzhiyun 	fclose(fp2);
239*4882a593Smuzhiyun 	free(results);
240*4882a593Smuzhiyun 	free(results2);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	LOG("wlan_test success.\n");
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	return 0;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun error_exit:
247*4882a593Smuzhiyun 	if (fp)
248*4882a593Smuzhiyun 		fclose(fp);
249*4882a593Smuzhiyun 	if (fp2)
250*4882a593Smuzhiyun 		fclose(fp2);
251*4882a593Smuzhiyun 	if (results)
252*4882a593Smuzhiyun 		free(results);
253*4882a593Smuzhiyun 	if (results2)
254*4882a593Smuzhiyun 		free(results2);
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	ui_print_xy_rgba(0, y, 225, 0, 0, 255, "%s:[%s] %s\n", PCBA_WIFI,
257*4882a593Smuzhiyun 			 PCBA_FAILED, ssid);
258*4882a593Smuzhiyun 	tc_info->result = -1;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	LOG("wlan_test failed.\n");
261*4882a593Smuzhiyun #else   //Linux pcba test
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun     int rst;
264*4882a593Smuzhiyun     char ssid_buf[128] = {0};
265*4882a593Smuzhiyun     char result_filename[100] = {0};
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun     printf("======================start wifi test=============================\n");
268*4882a593Smuzhiyun     rst = run_test_item_cmd("echo_auto_test echo_wlan_test");
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun     if(rst == 0) {
271*4882a593Smuzhiyun         snprintf(result_filename, sizeof(result_filename),
272*4882a593Smuzhiyun 		        "%s/echo_wlan_test_result", "/tmp");
273*4882a593Smuzhiyun         ret = parse_test_result(result_filename, "wlan_test", ssid_buf);
274*4882a593Smuzhiyun LOG("000 %s\n", ssid_buf);
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun     }else  {
277*4882a593Smuzhiyun         return NULL;
278*4882a593Smuzhiyun     }
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun     if(ret == 0) {
281*4882a593Smuzhiyun         if(strstr(ssid_buf, "SSID") != NULL) {
282*4882a593Smuzhiyun             char ch;
283*4882a593Smuzhiyun             char *result = NULL, *p;
284*4882a593Smuzhiyun             char delims[] = " ";
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun             memset(ssid, 0, sizeof(ssid));
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun             ch = *ssid_buf;
289*4882a593Smuzhiyun             p = ssid_buf;
290*4882a593Smuzhiyun             while (ch != '\0')
291*4882a593Smuzhiyun             {
292*4882a593Smuzhiyun                 if (ch == '<' || ch == '>')
293*4882a593Smuzhiyun                     *(p-1) = ' ';
294*4882a593Smuzhiyun                 ch = *p++;
295*4882a593Smuzhiyun             }
296*4882a593Smuzhiyun             LOG("111 %s\n", ssid_buf);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun             result = strtok(ssid_buf, delims);
299*4882a593Smuzhiyun             while( result != NULL ) {
300*4882a593Smuzhiyun                 printf("result is \"%s\"\n", result);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun                 if(strstr(result,"SSID")!= NULL){
303*4882a593Smuzhiyun                     strcat(ssid, result);
304*4882a593Smuzhiyun                     strcat(ssid, " ");
305*4882a593Smuzhiyun                 }
306*4882a593Smuzhiyun                 if(strstr(result, "Signal")!= NULL){
307*4882a593Smuzhiyun                     strcat(ssid, result);
308*4882a593Smuzhiyun                     strcat(ssid, " ");
309*4882a593Smuzhiyun                 }
310*4882a593Smuzhiyun                 if(strstr(result, "Level")!= NULL){
311*4882a593Smuzhiyun                     strcat(ssid, result);
312*4882a593Smuzhiyun                     strcat(ssid, " ");
313*4882a593Smuzhiyun                 }
314*4882a593Smuzhiyun                 if(strstr(result, "RSSI")!= NULL){
315*4882a593Smuzhiyun                     strcat(ssid, result);
316*4882a593Smuzhiyun                 }
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun                 result = strtok( NULL, delims );
319*4882a593Smuzhiyun             }
320*4882a593Smuzhiyun         }
321*4882a593Smuzhiyun         ui_print_xy_rgba(0, y, 0, 255, 0, 255, "%s:[%s] { %s }\n", PCBA_WIFI,
322*4882a593Smuzhiyun                  PCBA_SECCESS, ssid);
323*4882a593Smuzhiyun         tc_info->result = 0;
324*4882a593Smuzhiyun         LOG("wlan_test success.\n");
325*4882a593Smuzhiyun     } else {
326*4882a593Smuzhiyun         if(ssid[0] == 0)
327*4882a593Smuzhiyun             strcpy(ssid, "Not found specfied ssid.");
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun         ui_print_xy_rgba(0, y, 225, 0, 0, 255, "%s:[%s] { %s }\n", PCBA_WIFI,
330*4882a593Smuzhiyun                  PCBA_FAILED, ssid);
331*4882a593Smuzhiyun         tc_info->result = -1;
332*4882a593Smuzhiyun         LOG("wlan_test failed.\n");
333*4882a593Smuzhiyun     }
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun #endif
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	return argv;
338*4882a593Smuzhiyun }
339