diff options
Diffstat (limited to 'net/wireless/wext-compat.c')
-rw-r--r-- | net/wireless/wext-compat.c | 236 |
1 files changed, 230 insertions, 6 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 0fd1db6e95bb..5ef82f2ca88f 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -10,8 +10,8 @@ | |||
10 | 10 | ||
11 | #include <linux/wireless.h> | 11 | #include <linux/wireless.h> |
12 | #include <linux/nl80211.h> | 12 | #include <linux/nl80211.h> |
13 | #include <linux/if_arp.h> | ||
13 | #include <net/iw_handler.h> | 14 | #include <net/iw_handler.h> |
14 | #include <net/wireless.h> | ||
15 | #include <net/cfg80211.h> | 15 | #include <net/cfg80211.h> |
16 | #include "core.h" | 16 | #include "core.h" |
17 | 17 | ||
@@ -57,7 +57,7 @@ int cfg80211_wext_giwname(struct net_device *dev, | |||
57 | 57 | ||
58 | return 0; | 58 | return 0; |
59 | } | 59 | } |
60 | EXPORT_SYMBOL(cfg80211_wext_giwname); | 60 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwname); |
61 | 61 | ||
62 | int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, | 62 | int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, |
63 | u32 *mode, char *extra) | 63 | u32 *mode, char *extra) |
@@ -108,7 +108,7 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, | |||
108 | 108 | ||
109 | return ret; | 109 | return ret; |
110 | } | 110 | } |
111 | EXPORT_SYMBOL(cfg80211_wext_siwmode); | 111 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwmode); |
112 | 112 | ||
113 | int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info, | 113 | int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info, |
114 | u32 *mode, char *extra) | 114 | u32 *mode, char *extra) |
@@ -143,7 +143,7 @@ int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info, | |||
143 | } | 143 | } |
144 | return 0; | 144 | return 0; |
145 | } | 145 | } |
146 | EXPORT_SYMBOL(cfg80211_wext_giwmode); | 146 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwmode); |
147 | 147 | ||
148 | 148 | ||
149 | int cfg80211_wext_giwrange(struct net_device *dev, | 149 | int cfg80211_wext_giwrange(struct net_device *dev, |
@@ -206,7 +206,6 @@ int cfg80211_wext_giwrange(struct net_device *dev, | |||
206 | range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | | 206 | range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | |
207 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; | 207 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; |
208 | 208 | ||
209 | |||
210 | for (band = 0; band < IEEE80211_NUM_BANDS; band ++) { | 209 | for (band = 0; band < IEEE80211_NUM_BANDS; band ++) { |
211 | int i; | 210 | int i; |
212 | struct ieee80211_supported_band *sband; | 211 | struct ieee80211_supported_band *sband; |
@@ -240,4 +239,229 @@ int cfg80211_wext_giwrange(struct net_device *dev, | |||
240 | 239 | ||
241 | return 0; | 240 | return 0; |
242 | } | 241 | } |
243 | EXPORT_SYMBOL(cfg80211_wext_giwrange); | 242 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwrange); |
243 | |||
244 | int cfg80211_wext_siwmlme(struct net_device *dev, | ||
245 | struct iw_request_info *info, | ||
246 | struct iw_point *data, char *extra) | ||
247 | { | ||
248 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
249 | struct iw_mlme *mlme = (struct iw_mlme *)extra; | ||
250 | struct cfg80211_registered_device *rdev; | ||
251 | union { | ||
252 | struct cfg80211_disassoc_request disassoc; | ||
253 | struct cfg80211_deauth_request deauth; | ||
254 | } cmd; | ||
255 | |||
256 | if (!wdev) | ||
257 | return -EOPNOTSUPP; | ||
258 | |||
259 | rdev = wiphy_to_dev(wdev->wiphy); | ||
260 | |||
261 | if (wdev->iftype != NL80211_IFTYPE_STATION) | ||
262 | return -EINVAL; | ||
263 | |||
264 | if (mlme->addr.sa_family != ARPHRD_ETHER) | ||
265 | return -EINVAL; | ||
266 | |||
267 | memset(&cmd, 0, sizeof(cmd)); | ||
268 | |||
269 | switch (mlme->cmd) { | ||
270 | case IW_MLME_DEAUTH: | ||
271 | if (!rdev->ops->deauth) | ||
272 | return -EOPNOTSUPP; | ||
273 | cmd.deauth.peer_addr = mlme->addr.sa_data; | ||
274 | cmd.deauth.reason_code = mlme->reason_code; | ||
275 | return rdev->ops->deauth(wdev->wiphy, dev, &cmd.deauth); | ||
276 | case IW_MLME_DISASSOC: | ||
277 | if (!rdev->ops->disassoc) | ||
278 | return -EOPNOTSUPP; | ||
279 | cmd.disassoc.peer_addr = mlme->addr.sa_data; | ||
280 | cmd.disassoc.reason_code = mlme->reason_code; | ||
281 | return rdev->ops->disassoc(wdev->wiphy, dev, &cmd.disassoc); | ||
282 | default: | ||
283 | return -EOPNOTSUPP; | ||
284 | } | ||
285 | } | ||
286 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwmlme); | ||
287 | |||
288 | |||
289 | /** | ||
290 | * cfg80211_wext_freq - get wext frequency for non-"auto" | ||
291 | * @wiphy: the wiphy | ||
292 | * @freq: the wext freq encoding | ||
293 | * | ||
294 | * Returns a channel, %NULL for auto, or an ERR_PTR for errors! | ||
295 | */ | ||
296 | struct ieee80211_channel *cfg80211_wext_freq(struct wiphy *wiphy, | ||
297 | struct iw_freq *freq) | ||
298 | { | ||
299 | if (freq->e == 0) { | ||
300 | if (freq->m < 0) | ||
301 | return NULL; | ||
302 | else | ||
303 | return ieee80211_get_channel(wiphy, | ||
304 | ieee80211_channel_to_frequency(freq->m)); | ||
305 | } else { | ||
306 | int i, div = 1000000; | ||
307 | for (i = 0; i < freq->e; i++) | ||
308 | div /= 10; | ||
309 | if (div > 0) | ||
310 | return ieee80211_get_channel(wiphy, freq->m / div); | ||
311 | else | ||
312 | return ERR_PTR(-EINVAL); | ||
313 | } | ||
314 | |||
315 | } | ||
316 | EXPORT_SYMBOL_GPL(cfg80211_wext_freq); | ||
317 | |||
318 | int cfg80211_wext_siwrts(struct net_device *dev, | ||
319 | struct iw_request_info *info, | ||
320 | struct iw_param *rts, char *extra) | ||
321 | { | ||
322 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
323 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | ||
324 | u32 orts = wdev->wiphy->rts_threshold; | ||
325 | int err; | ||
326 | |||
327 | if (rts->disabled || !rts->fixed) | ||
328 | wdev->wiphy->rts_threshold = (u32) -1; | ||
329 | else if (rts->value < 0) | ||
330 | return -EINVAL; | ||
331 | else | ||
332 | wdev->wiphy->rts_threshold = rts->value; | ||
333 | |||
334 | err = rdev->ops->set_wiphy_params(wdev->wiphy, | ||
335 | WIPHY_PARAM_RTS_THRESHOLD); | ||
336 | if (err) | ||
337 | wdev->wiphy->rts_threshold = orts; | ||
338 | |||
339 | return err; | ||
340 | } | ||
341 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwrts); | ||
342 | |||
343 | int cfg80211_wext_giwrts(struct net_device *dev, | ||
344 | struct iw_request_info *info, | ||
345 | struct iw_param *rts, char *extra) | ||
346 | { | ||
347 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
348 | |||
349 | rts->value = wdev->wiphy->rts_threshold; | ||
350 | rts->disabled = rts->value == (u32) -1; | ||
351 | rts->fixed = 1; | ||
352 | |||
353 | return 0; | ||
354 | } | ||
355 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwrts); | ||
356 | |||
357 | int cfg80211_wext_siwfrag(struct net_device *dev, | ||
358 | struct iw_request_info *info, | ||
359 | struct iw_param *frag, char *extra) | ||
360 | { | ||
361 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
362 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | ||
363 | u32 ofrag = wdev->wiphy->frag_threshold; | ||
364 | int err; | ||
365 | |||
366 | if (frag->disabled || !frag->fixed) | ||
367 | wdev->wiphy->frag_threshold = (u32) -1; | ||
368 | else if (frag->value < 256) | ||
369 | return -EINVAL; | ||
370 | else { | ||
371 | /* Fragment length must be even, so strip LSB. */ | ||
372 | wdev->wiphy->frag_threshold = frag->value & ~0x1; | ||
373 | } | ||
374 | |||
375 | err = rdev->ops->set_wiphy_params(wdev->wiphy, | ||
376 | WIPHY_PARAM_FRAG_THRESHOLD); | ||
377 | if (err) | ||
378 | wdev->wiphy->frag_threshold = ofrag; | ||
379 | |||
380 | return err; | ||
381 | } | ||
382 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwfrag); | ||
383 | |||
384 | int cfg80211_wext_giwfrag(struct net_device *dev, | ||
385 | struct iw_request_info *info, | ||
386 | struct iw_param *frag, char *extra) | ||
387 | { | ||
388 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
389 | |||
390 | frag->value = wdev->wiphy->frag_threshold; | ||
391 | frag->disabled = frag->value == (u32) -1; | ||
392 | frag->fixed = 1; | ||
393 | |||
394 | return 0; | ||
395 | } | ||
396 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwfrag); | ||
397 | |||
398 | int cfg80211_wext_siwretry(struct net_device *dev, | ||
399 | struct iw_request_info *info, | ||
400 | struct iw_param *retry, char *extra) | ||
401 | { | ||
402 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
403 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | ||
404 | u32 changed = 0; | ||
405 | u8 olong = wdev->wiphy->retry_long; | ||
406 | u8 oshort = wdev->wiphy->retry_short; | ||
407 | int err; | ||
408 | |||
409 | if (retry->disabled || | ||
410 | (retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) | ||
411 | return -EINVAL; | ||
412 | |||
413 | if (retry->flags & IW_RETRY_LONG) { | ||
414 | wdev->wiphy->retry_long = retry->value; | ||
415 | changed |= WIPHY_PARAM_RETRY_LONG; | ||
416 | } else if (retry->flags & IW_RETRY_SHORT) { | ||
417 | wdev->wiphy->retry_short = retry->value; | ||
418 | changed |= WIPHY_PARAM_RETRY_SHORT; | ||
419 | } else { | ||
420 | wdev->wiphy->retry_short = retry->value; | ||
421 | wdev->wiphy->retry_long = retry->value; | ||
422 | changed |= WIPHY_PARAM_RETRY_LONG; | ||
423 | changed |= WIPHY_PARAM_RETRY_SHORT; | ||
424 | } | ||
425 | |||
426 | if (!changed) | ||
427 | return 0; | ||
428 | |||
429 | err = rdev->ops->set_wiphy_params(wdev->wiphy, changed); | ||
430 | if (err) { | ||
431 | wdev->wiphy->retry_short = oshort; | ||
432 | wdev->wiphy->retry_long = olong; | ||
433 | } | ||
434 | |||
435 | return err; | ||
436 | } | ||
437 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwretry); | ||
438 | |||
439 | int cfg80211_wext_giwretry(struct net_device *dev, | ||
440 | struct iw_request_info *info, | ||
441 | struct iw_param *retry, char *extra) | ||
442 | { | ||
443 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
444 | |||
445 | retry->disabled = 0; | ||
446 | |||
447 | if (retry->flags == 0 || (retry->flags & IW_RETRY_SHORT)) { | ||
448 | /* | ||
449 | * First return short value, iwconfig will ask long value | ||
450 | * later if needed | ||
451 | */ | ||
452 | retry->flags |= IW_RETRY_LIMIT; | ||
453 | retry->value = wdev->wiphy->retry_short; | ||
454 | if (wdev->wiphy->retry_long != wdev->wiphy->retry_short) | ||
455 | retry->flags |= IW_RETRY_LONG; | ||
456 | |||
457 | return 0; | ||
458 | } | ||
459 | |||
460 | if (retry->flags & IW_RETRY_LONG) { | ||
461 | retry->flags = IW_RETRY_LIMIT | IW_RETRY_LONG; | ||
462 | retry->value = wdev->wiphy->retry_long; | ||
463 | } | ||
464 | |||
465 | return 0; | ||
466 | } | ||
467 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwretry); | ||