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