]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - tools/tools/ath/athradar/athradar.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.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
105         switch (op) {
106         case DFS_PARAM_ENABLE:
107                 pe.pe_enabled = param;
108                 break;
109         case DFS_PARAM_FIRPWR:
110                 pe.pe_firpwr = param;
111                 break;
112         case DFS_PARAM_RRSSI:
113                 pe.pe_rrssi = param;
114                 break;
115         case DFS_PARAM_HEIGHT:
116                 pe.pe_height = param;
117                 break;
118         case DFS_PARAM_PRSSI:
119                 pe.pe_prssi = param;
120                 break;
121         case DFS_PARAM_INBAND:
122                 pe.pe_inband = param;
123                 break;
124         case DFS_PARAM_RELPWR:
125                 pe.pe_relpwr = param;
126                 break;
127         case DFS_PARAM_RELSTEP:
128                 pe.pe_relstep = param;
129                 break;
130         case DFS_PARAM_MAXLEN:
131                 pe.pe_maxlen = param;
132                 break;
133         case DFS_PARAM_USEFIR128:
134                 pe.pe_usefir128 = param;
135                 break;
136         case DFS_PARAM_BLOCKRADAR:
137                 pe.pe_blockradar = param;
138                 break;
139         case DFS_PARAM_MAXRSSI_EN:
140                 pe.pe_enmaxrssi = param;
141                 break;
142         case DFS_PARAM_EN_EXTCH:
143                 pe.pe_extchannel = param;
144                 break;
145         }
146         radar->atd.ad_id = DFS_SET_THRESH | ATH_DIAG_IN;
147         radar->atd.ad_out_data = NULL;
148         radar->atd.ad_out_size = 0;
149         radar->atd.ad_in_data = (caddr_t) &pe;
150         radar->atd.ad_in_size = sizeof(HAL_PHYERR_PARAM);
151         if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0)
152                 err(1, radar->atd.ad_name);
153 }
154
155 static void
156 radar_get(struct radarhandler *radar)
157 {
158         HAL_PHYERR_PARAM pe;
159
160         radar->atd.ad_id = DFS_GET_THRESH | ATH_DIAG_DYN;
161         memset(&pe, 0, sizeof(pe));
162
163         radar->atd.ad_in_data = NULL;
164         radar->atd.ad_in_size = 0;
165         radar->atd.ad_out_data = (caddr_t) &pe;
166         radar->atd.ad_out_size = sizeof(pe);
167
168         if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0)
169                 err(1, radar->atd.ad_name);
170
171         printf("Radar parameters (raw):\n");
172         printf("    pe_enabled: %d\n", pe.pe_enabled);
173         printf("    pe_firpwr: %d\n", pe.pe_firpwr);
174         printf("    pe_rrssi: %d\n", pe.pe_rrssi);
175         printf("    pe_height: %d\n", pe.pe_height);
176         printf("    pe_prssi: %d\n", pe.pe_prssi);
177         printf("    pe_inband: %d\n", pe.pe_inband);
178         printf("    pe_relpwr: %d\n", pe.pe_relpwr);
179         printf("    pe_relstep: %d\n", pe.pe_relstep);
180         printf("    pe_maxlen: %d\n", pe.pe_maxlen);
181         printf("    pe_usefir128: %d\n", pe.pe_usefir128);
182         printf("    pe_blockradar: %d\n", pe.pe_blockradar);
183         printf("    pe_enmaxrssi: %d\n", pe.pe_enmaxrssi);
184         printf("    pe_extchannel: %d\n", pe.pe_extchannel);
185 }
186
187 static int
188 radar_set_param(struct radarhandler *radar, const char *param, const char *val)
189 {
190         int v;
191
192         v = atoi(val);
193
194         if (strcmp(param, "firpwr") == 0) {
195                 radarset(radar, DFS_PARAM_FIRPWR, v);
196         } else if (strcmp(param, "rrssi") == 0) {
197                 radarset(radar, DFS_PARAM_RRSSI, v);
198         } else if (strcmp(param, "height") == 0) {
199                 radarset(radar, DFS_PARAM_HEIGHT, v);
200         } else if (strcmp(param, "prssi") == 0) {
201                 radarset(radar, DFS_PARAM_PRSSI, v);
202         } else if (strcmp(param, "inband") == 0) {
203                 radarset(radar, DFS_PARAM_INBAND, v);
204         } else if (strcmp(param, "relpwr") == 0) {
205                 radarset(radar, DFS_PARAM_RELPWR, v);
206         } else if (strcmp(param, "relstep") == 0) {
207                 radarset(radar, DFS_PARAM_RELSTEP, v);
208         } else if (strcmp(param, "maxlen") == 0) {
209                 radarset(radar, DFS_PARAM_MAXLEN, v);
210         } else if (strcmp(param, "extchannel") == 0) {
211                 radarset(radar, DFS_PARAM_EN_EXTCH, v);
212         } else {
213                 return 0;
214         }
215
216         return 1;
217 }
218
219 void
220 usage(const char *progname)
221 {
222         printf("Usage:\n");
223         printf("\t%s: [-i <interface>] <cmd> (<arg>)\n", progname);
224         printf("\t%s: [-h]\n", progname);
225         printf("\n");
226         printf("Valid commands:\n");
227         printf("\tget:\t\tGet current radar parameters\n");
228         printf("\tset <param> <value>:\t\tSet radar parameter\n");
229 }
230
231 int
232 main(int argc, char *argv[])
233 {
234         struct radarhandler radar;
235         const char *devname = ATH_DEFAULT;
236         const char *progname = argv[0];
237
238         memset(&radar, 0, sizeof(radar));
239
240         /* Parse command line options */
241         if (argc >= 2 && strcmp(argv[1], "-h") == 0) {
242                 usage(progname);
243                 exit(0);
244         }
245         if (argc >= 2 && strcmp(argv[1], "-?") == 0) {
246                 usage(progname);
247                 exit(0);
248         }
249
250         if (argc >= 2 && strcmp(argv[1], "-i") == 0) {
251                 if (argc == 2) {
252                         usage(progname);
253                         exit(127);
254                 }
255                 devname = argv[2];
256                 argc -= 2; argv += 2;
257         }
258
259         /* At this point we require at least one command */
260         if (argc == 1) {
261                 usage(progname);
262                 exit(127);
263         }
264
265         if (radar_opendev(&radar, devname) == 0)
266                 exit(127);
267
268         if (strcasecmp(argv[1], "get") == 0) {
269                 radar_get(&radar);
270         } else if (strcasecmp(argv[1], "set") == 0) {
271                 if (argc < 4) {
272                         usage(progname);
273                         exit(127);
274                 }
275                 if (radar_set_param(&radar, argv[2], argv[3]) == 0) {
276                         usage(progname);
277                         exit(127);
278                 }
279         } else {
280                 usage(progname);
281                 exit(127);
282         }
283
284         /* wrap up */
285         radar_closedev(&radar);
286         exit(0);
287 }