]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - tools/tools/ath/athradar/athradar.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / tools / tools / ath / athradar / athradar.c
1 /*
2  * Copyright (c) 2011 Adrian Chadd, Xenion Pty Ltd.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD$
26  */
27
28 #include "diag.h"
29
30 #include "ah.h"
31 #include "ah_internal.h"
32
33 #ifndef ATH_DEFAULT
34 #define ATH_DEFAULT     "ath0"
35 #endif
36
37 #include <getopt.h>
38 #include <errno.h>
39 #include <err.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <ctype.h>
43 #include <unistd.h>
44
45 struct radarhandler {
46         struct          ath_diag atd;
47         int             s;
48         struct ifreq    ifr;
49         int             ah_devid;
50 };
51
52 int
53 radar_opendev(struct radarhandler *radar, const char *devid)
54 {
55         HAL_REVS revs;
56
57         radar->s = socket(AF_INET, SOCK_DGRAM, 0);
58         if (radar->s < 0) {
59                 warn("socket");
60                 return 0;
61         }
62
63         strncpy(radar->atd.ad_name, devid, sizeof (radar->atd.ad_name));
64
65         /* Get the hardware revision, just to verify things are working */
66         radar->atd.ad_id = HAL_DIAG_REVS;
67         radar->atd.ad_out_data = (caddr_t) &revs;
68         radar->atd.ad_out_size = sizeof(revs);
69         if (ioctl(radar->s, SIOCGATHDIAG, &radar->atd) < 0) {
70                 warn(radar->atd.ad_name);
71                 return 0;
72         }
73         radar->ah_devid = revs.ah_devid;
74         return 1;
75 }
76
77 void
78 radar_closedev(struct radarhandler *radar)
79 {
80         close(radar->s);
81         radar->s = -1;
82 }
83
84 void
85 radarset(struct radarhandler *radar, int op, u_int32_t param)
86 {
87         HAL_PHYERR_PARAM pe;
88
89         pe.pe_firpwr = HAL_PHYERR_PARAM_NOVAL;
90         pe.pe_rrssi = HAL_PHYERR_PARAM_NOVAL;
91         pe.pe_height = HAL_PHYERR_PARAM_NOVAL;
92         pe.pe_prssi = HAL_PHYERR_PARAM_NOVAL;
93         pe.pe_inband = HAL_PHYERR_PARAM_NOVAL;
94         pe.pe_enabled = HAL_PHYERR_PARAM_NOVAL;
95
96         pe.pe_relpwr = HAL_PHYERR_PARAM_NOVAL;
97         pe.pe_relstep = HAL_PHYERR_PARAM_NOVAL;
98         pe.pe_maxlen = HAL_PHYERR_PARAM_NOVAL;
99         pe.pe_usefir128 = HAL_PHYERR_PARAM_NOVAL;
100         pe.pe_blockradar = HAL_PHYERR_PARAM_NOVAL;
101         pe.pe_enmaxrssi = HAL_PHYERR_PARAM_NOVAL;
102
103         pe.pe_extchannel = HAL_PHYERR_PARAM_NOVAL;
104         pe.pe_enrelpwr = HAL_PHYERR_PARAM_NOVAL;
105         pe.pe_en_relstep_check = HAL_PHYERR_PARAM_NOVAL;
106
107         switch (op) {
108         case DFS_PARAM_ENABLE:
109                 pe.pe_enabled = param;
110                 break;
111         case DFS_PARAM_FIRPWR:
112                 pe.pe_firpwr = param;
113                 break;
114         case DFS_PARAM_RRSSI:
115                 pe.pe_rrssi = param;
116                 break;
117         case DFS_PARAM_HEIGHT:
118                 pe.pe_height = param;
119                 break;
120         case DFS_PARAM_PRSSI:
121                 pe.pe_prssi = param;
122                 break;
123         case DFS_PARAM_INBAND:
124                 pe.pe_inband = param;
125                 break;
126         case DFS_PARAM_RELPWR:
127                 pe.pe_relpwr = param;
128                 break;
129         case DFS_PARAM_RELSTEP:
130                 pe.pe_relstep = param;
131                 break;
132         case DFS_PARAM_MAXLEN:
133                 pe.pe_maxlen = param;
134                 break;
135         case DFS_PARAM_USEFIR128:
136                 pe.pe_usefir128 = param;
137                 break;
138         case DFS_PARAM_BLOCKRADAR:
139                 pe.pe_blockradar = param;
140                 break;
141         case DFS_PARAM_MAXRSSI_EN:
142                 pe.pe_enmaxrssi = param;
143                 break;
144         case DFS_PARAM_EN_EXTCH:
145                 pe.pe_extchannel = param;
146                 break;
147         case DFS_PARAM_RELPWR_EN:
148                 pe.pe_enrelpwr = param;
149                 break;
150         case DFS_PARAM_RELSTEP_EN:
151                 pe.pe_en_relstep_check = param;
152                 break;
153         }
154
155         radar->atd.ad_id = DFS_SET_THRESH | ATH_DIAG_IN;
156         radar->atd.ad_out_data = NULL;
157         radar->atd.ad_out_size = 0;
158         radar->atd.ad_in_data = (caddr_t) &pe;
159         radar->atd.ad_in_size = sizeof(HAL_PHYERR_PARAM);
160         if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0)
161                 err(1, radar->atd.ad_name);
162 }
163
164 static void
165 radar_get(struct radarhandler *radar)
166 {
167         HAL_PHYERR_PARAM pe;
168
169         radar->atd.ad_id = DFS_GET_THRESH | ATH_DIAG_DYN;
170         memset(&pe, 0, sizeof(pe));
171
172         radar->atd.ad_in_data = NULL;
173         radar->atd.ad_in_size = 0;
174         radar->atd.ad_out_data = (caddr_t) &pe;
175         radar->atd.ad_out_size = sizeof(pe);
176
177         if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0)
178                 err(1, radar->atd.ad_name);
179
180         printf("Radar parameters (raw):\n");
181         printf("    pe_enabled: %d\n", pe.pe_enabled);
182         printf("    pe_firpwr: %d\n", pe.pe_firpwr);
183         printf("    pe_rrssi: %d\n", pe.pe_rrssi);
184         printf("    pe_height: %d\n", pe.pe_height);
185         printf("    pe_prssi: %d\n", pe.pe_prssi);
186         printf("    pe_inband: %d\n", pe.pe_inband);
187         printf("    pe_relpwr: %d\n", pe.pe_relpwr);
188         printf("    pe_relstep: %d\n", pe.pe_relstep);
189         printf("    pe_maxlen: %d\n", pe.pe_maxlen);
190         printf("    pe_usefir128: %d\n", pe.pe_usefir128);
191         printf("    pe_blockradar: %d\n", pe.pe_blockradar);
192         printf("    pe_enmaxrssi: %d\n", pe.pe_enmaxrssi);
193         printf("    pe_extchannel: %d\n", pe.pe_extchannel);
194         printf("    pe_enrelpwr: %d\n", pe.pe_enrelpwr);
195         printf("    pe_en_relstep_check: %d\n", pe.pe_en_relstep_check);
196 }
197
198 static int
199 radar_set_param(struct radarhandler *radar, const char *param,
200     const char *val)
201 {
202         int v;
203
204         v = atoi(val);
205
206         if (strcmp(param, "enabled") == 0) {
207                 radarset(radar, DFS_PARAM_ENABLE, v);
208         } else if (strcmp(param, "firpwr") == 0) {
209                 radarset(radar, DFS_PARAM_FIRPWR, v);
210         } else if (strcmp(param, "rrssi") == 0) {
211                 radarset(radar, DFS_PARAM_RRSSI, v);
212         } else if (strcmp(param, "height") == 0) {
213                 radarset(radar, DFS_PARAM_HEIGHT, v);
214         } else if (strcmp(param, "prssi") == 0) {
215                 radarset(radar, DFS_PARAM_PRSSI, v);
216         } else if (strcmp(param, "inband") == 0) {
217                 radarset(radar, DFS_PARAM_INBAND, v);
218         } else if (strcmp(param, "relpwr") == 0) {
219                 radarset(radar, DFS_PARAM_RELPWR, v);
220         } else if (strcmp(param, "relstep") == 0) {
221                 radarset(radar, DFS_PARAM_RELSTEP, v);
222         } else if (strcmp(param, "maxlen") == 0) {
223                 radarset(radar, DFS_PARAM_MAXLEN, v);
224         } else if (strcmp(param, "usefir128") == 0) {
225                 radarset(radar, DFS_PARAM_USEFIR128, v);
226         } else if (strcmp(param, "blockradar") == 0) {
227                 radarset(radar, DFS_PARAM_BLOCKRADAR, v);
228         } else if (strcmp(param, "enmaxrssi") == 0) {
229                 radarset(radar, DFS_PARAM_MAXRSSI_EN, v);
230         } else if (strcmp(param, "extchannel") == 0) {
231                 radarset(radar, DFS_PARAM_EN_EXTCH, v);
232         } else if (strcmp(param, "enrelpwr") == 0) {
233                 radarset(radar, DFS_PARAM_RELPWR_EN, v);
234         } else if (strcmp(param, "en_relstep_check") == 0) {
235                 radarset(radar, DFS_PARAM_RELSTEP_EN, v);
236         } else {
237                 return 0;
238         }
239
240         return 1;
241 }
242
243 void
244 usage(const char *progname)
245 {
246         printf("Usage:\n");
247         printf("\t%s: [-i <interface>] <cmd> (<arg>)\n", progname);
248         printf("\t%s: [-h]\n", progname);
249         printf("\n");
250         printf("Valid commands:\n");
251         printf("\tget:\t\tGet current radar parameters\n");
252         printf("\tset <param> <value>:\t\tSet radar parameter\n");
253 }
254
255 int
256 main(int argc, char *argv[])
257 {
258         struct radarhandler radar;
259         const char *devname = ATH_DEFAULT;
260         const char *progname = argv[0];
261
262         memset(&radar, 0, sizeof(radar));
263
264         /* Parse command line options */
265         if (argc >= 2 && strcmp(argv[1], "-h") == 0) {
266                 usage(progname);
267                 exit(0);
268         }
269         if (argc >= 2 && strcmp(argv[1], "-?") == 0) {
270                 usage(progname);
271                 exit(0);
272         }
273
274         if (argc >= 2 && strcmp(argv[1], "-i") == 0) {
275                 if (argc == 2) {
276                         usage(progname);
277                         exit(127);
278                 }
279                 devname = argv[2];
280                 argc -= 2; argv += 2;
281         }
282
283         /* At this point we require at least one command */
284         if (argc == 1) {
285                 usage(progname);
286                 exit(127);
287         }
288
289         if (radar_opendev(&radar, devname) == 0)
290                 exit(127);
291
292         if (strcasecmp(argv[1], "get") == 0) {
293                 radar_get(&radar);
294         } else if (strcasecmp(argv[1], "set") == 0) {
295                 if (argc < 4) {
296                         usage(progname);
297                         exit(127);
298                 }
299                 if (radar_set_param(&radar, argv[2], argv[3]) == 0) {
300                         usage(progname);
301                         exit(127);
302                 }
303         } else {
304                 usage(progname);
305                 exit(127);
306         }
307
308         /* wrap up */
309         radar_closedev(&radar);
310         exit(0);
311 }