source: src/router/services/tools/site_survey_ralink.c @ 32590

Last change on this file since 32590 was 32590, checked in by brainslayer, 3 weeks ago

format code

File size: 5.9 KB
Line 
1/*
2 * site_survey_madwifi.c
3 *
4 * Copyright (C) 2006 Sebastian Gottschall <gottschall@dd-wrt.com>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 *
20 * $Id:
21 */
22
23#include <sys/types.h>
24#include <sys/file.h>
25#include <sys/ioctl.h>
26#include <sys/socket.h>
27
28#include <unistd.h>
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <stdint.h>
33#include <ctype.h>
34#include <getopt.h>
35#include <err.h>
36#include <shutils.h>
37#include <wlutils.h>
38
39static int copy_essid(char buf[], size_t bufsize, const u_int8_t *essid, size_t essid_len)
40{
41        const u_int8_t *p;
42        int maxlen;
43        int i;
44
45        if (essid_len > bufsize)
46                maxlen = bufsize;
47        else
48                maxlen = essid_len;
49        /*
50         * determine printable or not
51         */
52        for (i = 0, p = essid; i < maxlen; i++, p++) {
53                if (*p < ' ' || *p > 0x7e)
54                        break;
55        }
56        if (i != maxlen) {      /* not printable, print as hex */
57                if (bufsize < 3)
58                        return 0;
59#if 0
60                strlcpy(buf, "0x", bufsize);
61#else
62                strncpy(buf, "0x", bufsize);
63#endif
64                bufsize -= 2;
65                p = essid;
66                for (i = 0; i < maxlen && bufsize >= 2; i++) {
67                        sprintf(&buf[2 + 2 * i], "%02x", *p++);
68                        bufsize -= 2;
69                }
70                maxlen = 2 + 2 * i;
71        } else {                /* printable, truncate as needed */
72                memcpy(buf, essid, maxlen);
73        }
74        if (maxlen != essid_len)
75                memcpy(buf + maxlen - 3, "...", 3);
76        return maxlen;
77}
78
79#define sys_restart() kill(1, SIGHUP)
80
81int write_site_survey(void);
82static int open_site_survey(void);
83int write_site_survey(void);
84
85static struct site_survey_list *site_survey_lists;
86
87static void skipline(FILE * in)
88{
89        while (1) {
90                int c = getc(in);
91
92                if (c == EOF)
93                        return;
94                if (c == 0x0)
95                        return;
96                if (c == 0xa)
97                        return;
98        }
99}
100
101#ifdef TEST
102int main(int argc, char *argv[])
103#else
104int site_survey_main(int argc, char *argv[])
105#endif
106{
107#define DOT11_CAP_ESS                           0x0001
108#define DOT11_CAP_IBSS                          0x0002
109#define DOT11_CAP_PRIVACY                       0x0010  /* d11 cap. privacy */
110
111        site_survey_lists = calloc(sizeof(struct site_survey_list) * SITE_SURVEY_NUM, 1);
112        unsigned char b1[32], b2[64], b3[32], b4[32], b5[32], b6[32], b7[32], ext[32];
113        int i = 0;
114
115        unlink(SITE_SURVEY_DB);
116        int ap = 0, oldap = 0;
117        int len;
118
119        char *ifn = nvram_safe_get("wifi_display");
120        if (nvram_nmatch("ap", "%s_mode", ifn)
121            || nvram_nmatch("apsta", "%s_mode", ifn)) {
122                eval("iwpriv", getRADev(ifn), "set", "SiteSurvey=1");   // only in ap mode
123                sleep(4);       //wait 4 seconds per spec
124        }
125        char openn[32];
126        sprintf(openn, "iwpriv %s get_site_survey", getRADev(ifn));
127        FILE *scan = popen(openn, "r");
128        skipline(scan);
129        skipline(scan);
130//      fscanf(scan, "%s %s", b1, b2);  // skip first line
131//      fscanf(scan, "%s %s %s %s %s %s %s", b1, b2, b3, b4, b5, b6, b7);       //skip second line
132        i = 0;
133        int c = 0;
134        do {
135                if (feof(scan))
136                        break;
137                fread(b1, 4, 1, scan);
138                b1[4] = 0;
139                b1[strlen(b1)] = 0;
140                fread(b2, 33, 1, scan);
141                b2[32] = 0;
142                b2[strlen(b2)] = 0;
143                //kill trailing blanks
144                for (c = 0; c < 32; c++) {
145                        if (b2[31 - c] != 0x20)
146                                break;
147                        b2[31 - c] = 0;
148                }
149                //skip leading blanks
150                for (c = 0; c < 32; c++) {
151                        if (b2[c] != 0x20)
152                                break;
153                }
154                if (c && c < 32) {
155                        for (i = 0; i < 32 - c; i++)
156                                b2[i] = b2[i + c];
157                }
158                int ret = fscanf(scan, "%s %s %s %s %s %s", b3, b4, b5, b6, ext, b7);   //skip second line
159                if (ret < 5)
160                        break;
161                if (ret == 6)
162                        skipline(scan);
163                else
164                        strncpy(b7, ext, 31);
165                site_survey_lists[i].channel = atoi(b1);        // channel
166                site_survey_lists[i].frequency = ieee80211_ieee2mhz(site_survey_lists[i].channel);
167                strcpy(site_survey_lists[i].SSID, b2);  //SSID
168                strcpy(site_survey_lists[i].BSSID, b3); //BSSID
169                site_survey_lists[i].phy_noise = -95;   // no way
170                strcpy(site_survey_lists[i].ENCINFO, b4);
171                site_survey_lists[i].RSSI = -atoi(b5);
172
173                if (!strcmp(b6, "11b/g"))
174                        site_survey_lists[i].rate_count = 12;
175                if (!strcmp(b6, "11b"))
176                        site_survey_lists[i].rate_count = 4;
177                if (!strcmp(b6, "11b/g/n"))
178                        site_survey_lists[i].rate_count = 300;
179
180                if (!strcmp(b7, "In"))
181                        site_survey_lists[i].capability = DOT11_CAP_ESS;
182
183                if (!strcmp(b7, "Ad"))
184                        site_survey_lists[i].capability = DOT11_CAP_IBSS;
185
186                if (strcmp(b4, "OPEN"))
187                        site_survey_lists[i].capability |= DOT11_CAP_PRIVACY;
188
189                i++;
190        }
191        while (1);
192        pclose(scan);
193        write_site_survey();
194        open_site_survey();
195        for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0]
196             && site_survey_lists[i].channel != 0; i++) {
197
198                fprintf(stderr,
199                        "[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d] enc[%s]\n",
200                        i, site_survey_lists[i].SSID,
201                        site_survey_lists[i].BSSID,
202                        site_survey_lists[i].channel,
203                        site_survey_lists[i].frequency,
204                        site_survey_lists[i].RSSI,
205                        site_survey_lists[i].phy_noise,
206                        site_survey_lists[i].beacon_period, site_survey_lists[i].capability, site_survey_lists[i].dtim_period, site_survey_lists[i].rate_count, site_survey_lists[i].ENCINFO);
207        }
208        free(site_survey_lists);
209        return 0;
210}
211
212int write_site_survey(void)
213{
214        FILE *fp;
215
216        if ((fp = fopen(SITE_SURVEY_DB, "w"))) {
217                fwrite(&site_survey_lists[0], sizeof(struct site_survey_list) * SITE_SURVEY_NUM, 1, fp);
218                fclose(fp);
219                return 0;
220        }
221        return 1;
222}
223
224static int open_site_survey(void)
225{
226        FILE *fp;
227
228        bzero(site_survey_lists, sizeof(site_survey_lists));
229
230        if ((fp = fopen(SITE_SURVEY_DB, "r"))) {
231                fread(&site_survey_lists[0], sizeof(struct site_survey_list) * SITE_SURVEY_NUM, 1, fp);
232                fclose(fp);
233                return 1;
234        }
235        return 0;
236}
Note: See TracBrowser for help on using the repository browser.