iwinfo: replace more wext calls with nl80211 equivalents, attempt to infer nl80211...
[openwrt/svn-archive/archive.git] / package / network / utils / iwinfo / src / iwinfo_lib.c
1 /*
2 * iwinfo - Wireless Information Library - Lua Bindings
3 *
4 * Copyright (C) 2009-2013 Jo-Philipp Wich <xm@subsignal.org>
5 *
6 * The iwinfo library is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
9 *
10 * The iwinfo library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 * See the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with the iwinfo library. If not, see http://www.gnu.org/licenses/.
17 */
18
19 #include "iwinfo.h"
20
21
22 /*
23 * name constants
24 */
25 const char *IWINFO_CIPHER_NAMES[] = {
26 "NONE",
27 "WEP40",
28 "TKIP",
29 "WRAP",
30 "CCMP",
31 "WEP104",
32 "AES-OCB",
33 "CKIP",
34 };
35
36 const char *IWINFO_KMGMT_NAMES[] = {
37 "NONE",
38 "802.1X",
39 "PSK",
40 };
41
42 const char *IWINFO_AUTH_NAMES[] = {
43 "OPEN",
44 "SHARED",
45 };
46
47 const char *IWINFO_OPMODE_NAMES[] = {
48 "Unknown",
49 "Master",
50 "Ad-Hoc",
51 "Client",
52 "Monitor",
53 "Master (VLAN)",
54 "WDS",
55 "Mesh Point",
56 "P2P Client",
57 "P2P Go",
58 };
59
60
61 /*
62 * ISO3166 country labels
63 */
64
65 const struct iwinfo_iso3166_label IWINFO_ISO3166_NAMES[] = {
66 { 0x3030 /* 00 */, "World" },
67 { 0x4144 /* AD */, "Andorra" },
68 { 0x4145 /* AE */, "United Arab Emirates" },
69 { 0x4146 /* AF */, "Afghanistan" },
70 { 0x4147 /* AG */, "Antigua and Barbuda" },
71 { 0x4149 /* AI */, "Anguilla" },
72 { 0x414C /* AL */, "Albania" },
73 { 0x414D /* AM */, "Armenia" },
74 { 0x414E /* AN */, "Netherlands Antilles" },
75 { 0x414F /* AO */, "Angola" },
76 { 0x4151 /* AQ */, "Antarctica" },
77 { 0x4152 /* AR */, "Argentina" },
78 { 0x4153 /* AS */, "American Samoa" },
79 { 0x4154 /* AT */, "Austria" },
80 { 0x4155 /* AU */, "Australia" },
81 { 0x4157 /* AW */, "Aruba" },
82 { 0x4158 /* AX */, "Aland Islands" },
83 { 0x415A /* AZ */, "Azerbaijan" },
84 { 0x4241 /* BA */, "Bosnia and Herzegovina" },
85 { 0x4242 /* BB */, "Barbados" },
86 { 0x4244 /* BD */, "Bangladesh" },
87 { 0x4245 /* BE */, "Belgium" },
88 { 0x4246 /* BF */, "Burkina Faso" },
89 { 0x4247 /* BG */, "Bulgaria" },
90 { 0x4248 /* BH */, "Bahrain" },
91 { 0x4249 /* BI */, "Burundi" },
92 { 0x424A /* BJ */, "Benin" },
93 { 0x424C /* BL */, "Saint Barthelemy" },
94 { 0x424D /* BM */, "Bermuda" },
95 { 0x424E /* BN */, "Brunei Darussalam" },
96 { 0x424F /* BO */, "Bolivia" },
97 { 0x4252 /* BR */, "Brazil" },
98 { 0x4253 /* BS */, "Bahamas" },
99 { 0x4254 /* BT */, "Bhutan" },
100 { 0x4256 /* BV */, "Bouvet Island" },
101 { 0x4257 /* BW */, "Botswana" },
102 { 0x4259 /* BY */, "Belarus" },
103 { 0x425A /* BZ */, "Belize" },
104 { 0x4341 /* CA */, "Canada" },
105 { 0x4343 /* CC */, "Cocos (Keeling) Islands" },
106 { 0x4344 /* CD */, "Congo" },
107 { 0x4346 /* CF */, "Central African Republic" },
108 { 0x4347 /* CG */, "Congo" },
109 { 0x4348 /* CH */, "Switzerland" },
110 { 0x4349 /* CI */, "Cote d'Ivoire" },
111 { 0x434B /* CK */, "Cook Islands" },
112 { 0x434C /* CL */, "Chile" },
113 { 0x434D /* CM */, "Cameroon" },
114 { 0x434E /* CN */, "China" },
115 { 0x434F /* CO */, "Colombia" },
116 { 0x4352 /* CR */, "Costa Rica" },
117 { 0x4355 /* CU */, "Cuba" },
118 { 0x4356 /* CV */, "Cape Verde" },
119 { 0x4358 /* CX */, "Christmas Island" },
120 { 0x4359 /* CY */, "Cyprus" },
121 { 0x435A /* CZ */, "Czech Republic" },
122 { 0x4445 /* DE */, "Germany" },
123 { 0x444A /* DJ */, "Djibouti" },
124 { 0x444B /* DK */, "Denmark" },
125 { 0x444D /* DM */, "Dominica" },
126 { 0x444F /* DO */, "Dominican Republic" },
127 { 0x445A /* DZ */, "Algeria" },
128 { 0x4543 /* EC */, "Ecuador" },
129 { 0x4545 /* EE */, "Estonia" },
130 { 0x4547 /* EG */, "Egypt" },
131 { 0x4548 /* EH */, "Western Sahara" },
132 { 0x4552 /* ER */, "Eritrea" },
133 { 0x4553 /* ES */, "Spain" },
134 { 0x4554 /* ET */, "Ethiopia" },
135 { 0x4649 /* FI */, "Finland" },
136 { 0x464A /* FJ */, "Fiji" },
137 { 0x464B /* FK */, "Falkland Islands" },
138 { 0x464D /* FM */, "Micronesia" },
139 { 0x464F /* FO */, "Faroe Islands" },
140 { 0x4652 /* FR */, "France" },
141 { 0x4741 /* GA */, "Gabon" },
142 { 0x4742 /* GB */, "United Kingdom" },
143 { 0x4744 /* GD */, "Grenada" },
144 { 0x4745 /* GE */, "Georgia" },
145 { 0x4746 /* GF */, "French Guiana" },
146 { 0x4747 /* GG */, "Guernsey" },
147 { 0x4748 /* GH */, "Ghana" },
148 { 0x4749 /* GI */, "Gibraltar" },
149 { 0x474C /* GL */, "Greenland" },
150 { 0x474D /* GM */, "Gambia" },
151 { 0x474E /* GN */, "Guinea" },
152 { 0x4750 /* GP */, "Guadeloupe" },
153 { 0x4751 /* GQ */, "Equatorial Guinea" },
154 { 0x4752 /* GR */, "Greece" },
155 { 0x4753 /* GS */, "South Georgia" },
156 { 0x4754 /* GT */, "Guatemala" },
157 { 0x4755 /* GU */, "Guam" },
158 { 0x4757 /* GW */, "Guinea-Bissau" },
159 { 0x4759 /* GY */, "Guyana" },
160 { 0x484B /* HK */, "Hong Kong" },
161 { 0x484D /* HM */, "Heard and McDonald Islands" },
162 { 0x484E /* HN */, "Honduras" },
163 { 0x4852 /* HR */, "Croatia" },
164 { 0x4854 /* HT */, "Haiti" },
165 { 0x4855 /* HU */, "Hungary" },
166 { 0x4944 /* ID */, "Indonesia" },
167 { 0x4945 /* IE */, "Ireland" },
168 { 0x494C /* IL */, "Israel" },
169 { 0x494D /* IM */, "Isle of Man" },
170 { 0x494E /* IN */, "India" },
171 { 0x494F /* IO */, "Chagos Islands" },
172 { 0x4951 /* IQ */, "Iraq" },
173 { 0x4952 /* IR */, "Iran" },
174 { 0x4953 /* IS */, "Iceland" },
175 { 0x4954 /* IT */, "Italy" },
176 { 0x4A45 /* JE */, "Jersey" },
177 { 0x4A4D /* JM */, "Jamaica" },
178 { 0x4A4F /* JO */, "Jordan" },
179 { 0x4A50 /* JP */, "Japan" },
180 { 0x4B45 /* KE */, "Kenya" },
181 { 0x4B47 /* KG */, "Kyrgyzstan" },
182 { 0x4B48 /* KH */, "Cambodia" },
183 { 0x4B49 /* KI */, "Kiribati" },
184 { 0x4B4D /* KM */, "Comoros" },
185 { 0x4B4E /* KN */, "Saint Kitts and Nevis" },
186 { 0x4B50 /* KP */, "North Korea" },
187 { 0x4B52 /* KR */, "South Korea" },
188 { 0x4B57 /* KW */, "Kuwait" },
189 { 0x4B59 /* KY */, "Cayman Islands" },
190 { 0x4B5A /* KZ */, "Kazakhstan" },
191 { 0x4C41 /* LA */, "Laos" },
192 { 0x4C42 /* LB */, "Lebanon" },
193 { 0x4C43 /* LC */, "Saint Lucia" },
194 { 0x4C49 /* LI */, "Liechtenstein" },
195 { 0x4C4B /* LK */, "Sri Lanka" },
196 { 0x4C52 /* LR */, "Liberia" },
197 { 0x4C53 /* LS */, "Lesotho" },
198 { 0x4C54 /* LT */, "Lithuania" },
199 { 0x4C55 /* LU */, "Luxembourg" },
200 { 0x4C56 /* LV */, "Latvia" },
201 { 0x4C59 /* LY */, "Libyan Arab Jamahiriya" },
202 { 0x4D41 /* MA */, "Morocco" },
203 { 0x4D43 /* MC */, "Monaco" },
204 { 0x4D44 /* MD */, "Moldova" },
205 { 0x4D45 /* ME */, "Montenegro" },
206 { 0x4D46 /* MF */, "Saint Martin (French part)" },
207 { 0x4D47 /* MG */, "Madagascar" },
208 { 0x4D48 /* MH */, "Marshall Islands" },
209 { 0x4D4B /* MK */, "Macedonia" },
210 { 0x4D4C /* ML */, "Mali" },
211 { 0x4D4D /* MM */, "Myanmar" },
212 { 0x4D4E /* MN */, "Mongolia" },
213 { 0x4D4F /* MO */, "Macao" },
214 { 0x4D50 /* MP */, "Northern Mariana Islands" },
215 { 0x4D51 /* MQ */, "Martinique" },
216 { 0x4D52 /* MR */, "Mauritania" },
217 { 0x4D53 /* MS */, "Montserrat" },
218 { 0x4D54 /* MT */, "Malta" },
219 { 0x4D55 /* MU */, "Mauritius" },
220 { 0x4D56 /* MV */, "Maldives" },
221 { 0x4D57 /* MW */, "Malawi" },
222 { 0x4D58 /* MX */, "Mexico" },
223 { 0x4D59 /* MY */, "Malaysia" },
224 { 0x4D5A /* MZ */, "Mozambique" },
225 { 0x4E41 /* NA */, "Namibia" },
226 { 0x4E43 /* NC */, "New Caledonia" },
227 { 0x4E45 /* NE */, "Niger" },
228 { 0x4E46 /* NF */, "Norfolk Island" },
229 { 0x4E47 /* NG */, "Nigeria" },
230 { 0x4E49 /* NI */, "Nicaragua" },
231 { 0x4E4C /* NL */, "Netherlands" },
232 { 0x4E4F /* NO */, "Norway" },
233 { 0x4E50 /* NP */, "Nepal" },
234 { 0x4E52 /* NR */, "Nauru" },
235 { 0x4E55 /* NU */, "Niue" },
236 { 0x4E5A /* NZ */, "New Zealand" },
237 { 0x4F4D /* OM */, "Oman" },
238 { 0x5041 /* PA */, "Panama" },
239 { 0x5045 /* PE */, "Peru" },
240 { 0x5046 /* PF */, "French Polynesia" },
241 { 0x5047 /* PG */, "Papua New Guinea" },
242 { 0x5048 /* PH */, "Philippines" },
243 { 0x504B /* PK */, "Pakistan" },
244 { 0x504C /* PL */, "Poland" },
245 { 0x504D /* PM */, "Saint Pierre and Miquelon" },
246 { 0x504E /* PN */, "Pitcairn" },
247 { 0x5052 /* PR */, "Puerto Rico" },
248 { 0x5053 /* PS */, "Palestinian Territory" },
249 { 0x5054 /* PT */, "Portugal" },
250 { 0x5057 /* PW */, "Palau" },
251 { 0x5059 /* PY */, "Paraguay" },
252 { 0x5141 /* QA */, "Qatar" },
253 { 0x5245 /* RE */, "Reunion" },
254 { 0x524F /* RO */, "Romania" },
255 { 0x5253 /* RS */, "Serbia" },
256 { 0x5255 /* RU */, "Russian Federation" },
257 { 0x5257 /* RW */, "Rwanda" },
258 { 0x5341 /* SA */, "Saudi Arabia" },
259 { 0x5342 /* SB */, "Solomon Islands" },
260 { 0x5343 /* SC */, "Seychelles" },
261 { 0x5344 /* SD */, "Sudan" },
262 { 0x5345 /* SE */, "Sweden" },
263 { 0x5347 /* SG */, "Singapore" },
264 { 0x5348 /* SH */, "St. Helena and Dependencies" },
265 { 0x5349 /* SI */, "Slovenia" },
266 { 0x534A /* SJ */, "Svalbard and Jan Mayen" },
267 { 0x534B /* SK */, "Slovakia" },
268 { 0x534C /* SL */, "Sierra Leone" },
269 { 0x534D /* SM */, "San Marino" },
270 { 0x534E /* SN */, "Senegal" },
271 { 0x534F /* SO */, "Somalia" },
272 { 0x5352 /* SR */, "Suriname" },
273 { 0x5354 /* ST */, "Sao Tome and Principe" },
274 { 0x5356 /* SV */, "El Salvador" },
275 { 0x5359 /* SY */, "Syrian Arab Republic" },
276 { 0x535A /* SZ */, "Swaziland" },
277 { 0x5443 /* TC */, "Turks and Caicos Islands" },
278 { 0x5444 /* TD */, "Chad" },
279 { 0x5446 /* TF */, "French Southern Territories" },
280 { 0x5447 /* TG */, "Togo" },
281 { 0x5448 /* TH */, "Thailand" },
282 { 0x544A /* TJ */, "Tajikistan" },
283 { 0x544B /* TK */, "Tokelau" },
284 { 0x544C /* TL */, "Timor-Leste" },
285 { 0x544D /* TM */, "Turkmenistan" },
286 { 0x544E /* TN */, "Tunisia" },
287 { 0x544F /* TO */, "Tonga" },
288 { 0x5452 /* TR */, "Turkey" },
289 { 0x5454 /* TT */, "Trinidad and Tobago" },
290 { 0x5456 /* TV */, "Tuvalu" },
291 { 0x5457 /* TW */, "Taiwan" },
292 { 0x545A /* TZ */, "Tanzania" },
293 { 0x5541 /* UA */, "Ukraine" },
294 { 0x5547 /* UG */, "Uganda" },
295 { 0x554D /* UM */, "U.S. Minor Outlying Islands" },
296 { 0x5553 /* US */, "United States" },
297 { 0x5559 /* UY */, "Uruguay" },
298 { 0x555A /* UZ */, "Uzbekistan" },
299 { 0x5641 /* VA */, "Vatican City State" },
300 { 0x5643 /* VC */, "St. Vincent and Grenadines" },
301 { 0x5645 /* VE */, "Venezuela" },
302 { 0x5647 /* VG */, "Virgin Islands, British" },
303 { 0x5649 /* VI */, "Virgin Islands, U.S." },
304 { 0x564E /* VN */, "Viet Nam" },
305 { 0x5655 /* VU */, "Vanuatu" },
306 { 0x5746 /* WF */, "Wallis and Futuna" },
307 { 0x5753 /* WS */, "Samoa" },
308 { 0x5945 /* YE */, "Yemen" },
309 { 0x5954 /* YT */, "Mayotte" },
310 { 0x5A41 /* ZA */, "South Africa" },
311 { 0x5A4D /* ZM */, "Zambia" },
312 { 0x5A57 /* ZW */, "Zimbabwe" },
313 { 0, "" }
314 };
315
316 /*
317 * hardware database
318 */
319
320 const char VENDOR_UBNT[] = "Ubiquiti";
321 const char VENDOR_ATH[] = "Atheros";
322 const char VENDOR_RALINK[] = "RaLink";
323
324 const struct iwinfo_hardware_entry IWINFO_HARDWARE_ENTRIES[] = {
325 /* { vendor, model, vendorid, deviceid, subsys vendorid, subsys deviceid, poweroff, freqoff } */
326 #if defined(USE_MADWIFI) || defined(USE_NL80211)
327 { VENDOR_UBNT, "PowerStation2 (18V)", 0xffff, 0xffff, 0xffff, 0xb102, 0, 0 },
328 { VENDOR_UBNT, "PowerStation2 (16D)", 0xffff, 0xffff, 0xffff, 0xb202, 0, 0 },
329 { VENDOR_UBNT, "PowerStation2 (EXT)", 0xffff, 0xffff, 0xffff, 0xb302, 0, 0 },
330 { VENDOR_UBNT, "PowerStation5 (22V)", 0xffff, 0xffff, 0xffff, 0xb105, 0, 0 },
331 { VENDOR_UBNT, "PowerStation5 (EXT)", 0xffff, 0xffff, 0xffff, 0xb305, 0, 0 },
332 { VENDOR_UBNT, "PicoStation2", 0xffff, 0xffff, 0xffff, 0xc302, 0, 0 },
333 { VENDOR_UBNT, "PicoStation2 HP", 0xffff, 0xffff, 0xffff, 0xc3a2, 10, 0 },
334 { VENDOR_UBNT, "WispStation5", 0xffff, 0xffff, 0xffff, 0xa105, 0, 0 },
335 { VENDOR_UBNT, "LiteStation2", 0xffff, 0xffff, 0xffff, 0xa002, 10, 0 },
336 { VENDOR_UBNT, "LiteStation5", 0xffff, 0xffff, 0xffff, 0xa005, 5, 0 },
337 { VENDOR_UBNT, "NanoStation2", 0xffff, 0xffff, 0xffff, 0xc002, 10, 0 },
338 { VENDOR_UBNT, "NanoStation5", 0xffff, 0xffff, 0xffff, 0xc005, 5, 0 },
339 { VENDOR_UBNT, "NanoStation Loco2", 0xffff, 0xffff, 0xffff, 0xc102, 10, 0 },
340 { VENDOR_UBNT, "NanoStation Loco5", 0xffff, 0xffff, 0xffff, 0xc105, 5, 0 },
341 { VENDOR_UBNT, "Bullet2", 0xffff, 0xffff, 0xffff, 0xc202, 10, 0 },
342 { VENDOR_UBNT, "Bullet5", 0xffff, 0xffff, 0xffff, 0xc205, 5, 0 },
343 { VENDOR_UBNT, "XR2", 0x168c, 0x001b, 0x0777, 0x3002, 10, 0 },
344 { VENDOR_UBNT, "XR2", 0x168c, 0x001b, 0x7777, 0x3002, 10, 0 },
345 { VENDOR_UBNT, "XR2.3", 0x168c, 0x001b, 0x0777, 0x3b02, 10, 0 },
346 { VENDOR_UBNT, "XR2.6", 0x168c, 0x001b, 0x0777, 0x3c02, 10, 0 },
347 { VENDOR_UBNT, "XR3-2.8", 0x168c, 0x001b, 0x0777, 0x3b03, 10, 0 },
348 { VENDOR_UBNT, "XR3-3.6", 0x168c, 0x001b, 0x0777, 0x3c03, 10, 0 },
349 { VENDOR_UBNT, "XR3", 0x168c, 0x001b, 0x0777, 0x3003, 10, 0 },
350 { VENDOR_UBNT, "XR4", 0x168c, 0x001b, 0x0777, 0x3004, 10, 0 },
351 { VENDOR_UBNT, "XR5", 0x168c, 0x001b, 0x0777, 0x3005, 10, 0 },
352 { VENDOR_UBNT, "XR5", 0x168c, 0x001b, 0x7777, 0x3005, 10, 0 },
353 { VENDOR_UBNT, "XR7", 0x168c, 0x001b, 0x0777, 0x3007, 10, 0 },
354 { VENDOR_UBNT, "XR9", 0x168c, 0x001b, 0x0777, 0x3009, 10, -1520 },
355 { VENDOR_ATH, "AR5413", 0x168c, 0x001b, 0x168c, 0x2063, 0, 0 },
356 { VENDOR_UBNT, "SRC", 0x168c, 0x0013, 0x168c, 0x1042, 1, 0 },
357 { VENDOR_UBNT, "SR2", 0x168c, 0x0013, 0x0777, 0x2041, 10, 0 },
358 { VENDOR_UBNT, "SR4", 0x168c, 0x0013, 0x0777, 0x2004, 6, 0 },
359 { VENDOR_UBNT, "SR4", 0x168c, 0x0013, 0x7777, 0x2004, 6, 0 },
360 { VENDOR_UBNT, "SR4C", 0x168c, 0x0013, 0x0777, 0x1004, 6, 0 },
361 { VENDOR_UBNT, "SR4C", 0x168c, 0x0013, 0x7777, 0x1004, 6, 0 },
362 { VENDOR_UBNT, "SR5", 0x168c, 0x0013, 0x168c, 0x2042, 7, 0 },
363 { VENDOR_UBNT, "SR9", 0x168c, 0x0013, 0x7777, 0x2009, 12, -1500 },
364 { VENDOR_UBNT, "SR71A", 0x168c, 0x0027, 0x168c, 0x2082, 10, 0 },
365 { VENDOR_UBNT, "SR71", 0x168c, 0x0027, 0x0777, 0x4082, 10, 0 },
366 #endif
367 #ifdef USE_NL80211
368 { VENDOR_UBNT, "PicoStation M2", 0x168c, 0x002a, 0x0777, 0xe302, 12, 0 }, /* ToDo: confirm offset */
369 { VENDOR_UBNT, "NanoStation M2", 0x168c, 0x002a, 0x0777, 0xe012, 12, 0 }, /* ToDo: confirm offset */
370 { VENDOR_UBNT, "NanoStation M5", 0x168c, 0x002a, 0x0777, 0xe005, 5, 0 }, /* ToDo: confirm offset */
371 { VENDOR_UBNT, "Bullet M2", 0x168c, 0x002a, 0x0777, 0xe202, 12, 0 },
372 { VENDOR_UBNT, "Bullet M5", 0x168c, 0x002a, 0x0777, 0xe805, 5, 0 },
373
374 { VENDOR_ATH, "AR9220", 0x168c, 0x0029, 0x168c, 0xa094, 0, 0 },
375 { VENDOR_ATH, "AR9223", 0x168c, 0x0029, 0x168c, 0xa095, 0, 0 },
376 { VENDOR_ATH, "AR9280", 0x168c, 0x002a, 0x168c, 0xa093, 0, 0 },
377 { VENDOR_ATH, "AR9285", 0x168c, 0x002b, 0x168c, 0xa091, 0, 0 },
378 { VENDOR_RALINK, "Rt3050", 0x1814, 0x3050, 0x1814, 0x0005, 0, 0 },
379 { VENDOR_RALINK, "Rt3052", 0x1814, 0x3052, 0x1814, 0x0008, 0, 0 },
380 { VENDOR_RALINK, "Rt3352", 0x1814, 0x3352, 0x1814, 0x000c, 0, 0 },
381 #endif
382 { NULL }
383 };
384
385
386 const char * iwinfo_type(const char *ifname)
387 {
388 #ifdef USE_NL80211
389 if (nl80211_probe(ifname))
390 return "nl80211";
391 else
392 #endif
393
394 #ifdef USE_MADWIFI
395 if (madwifi_probe(ifname))
396 return "madwifi";
397 else
398 #endif
399
400 #ifdef USE_WL
401 if (wl_probe(ifname))
402 return "wl";
403 else
404 #endif
405
406 if (wext_probe(ifname))
407 return "wext";
408
409 return NULL;
410 }
411
412 const struct iwinfo_ops * iwinfo_backend(const char *ifname)
413 {
414 const char *type;
415 struct iwinfo_ops *ops;
416
417 type = iwinfo_type(ifname);
418 if (!type)
419 return NULL;
420
421 #ifdef USE_NL80211
422 if (!strcmp(type, "nl80211"))
423 return &nl80211_ops;
424 else
425 #endif
426
427 #ifdef USE_MADWIFI
428 if (!strcmp(type, "madwifi"))
429 return &madwifi_ops;
430 else
431 #endif
432
433 #ifdef USE_WL
434 if (!strcmp(type, "wl"))
435 return &wl_ops;
436 else
437 #endif
438
439 if (!strcmp(type, "wext"))
440 return &wext_ops;
441
442 return NULL;
443 }
444
445 void iwinfo_finish(void)
446 {
447 #ifdef USE_WL
448 wl_close();
449 #endif
450 #ifdef USE_MADWIFI
451 madwifi_close();
452 #endif
453 #ifdef USE_NL80211
454 nl80211_close();
455 #endif
456 wext_close();
457 iwinfo_close();
458 }