linux/net/wireless/wext-compat.c
<<
>>
Prefs
   1/*
   2 * cfg80211 - wext compat code
   3 *
   4 * This is temporary code until all wireless functionality is migrated
   5 * into cfg80211, when that happens all the exports here go away and
   6 * we directly assign the wireless handlers of wireless interfaces.
   7 *
   8 * Copyright 2008       Johannes Berg <johannes@sipsolutions.net>
   9 */
  10
  11#include <linux/wireless.h>
  12#include <linux/nl80211.h>
  13#include <net/iw_handler.h>
  14#include <net/wireless.h>
  15#include <net/cfg80211.h>
  16#include "core.h"
  17
  18int cfg80211_wext_giwname(struct net_device *dev,
  19                          struct iw_request_info *info,
  20                          char *name, char *extra)
  21{
  22        struct wireless_dev *wdev = dev->ieee80211_ptr;
  23        struct ieee80211_supported_band *sband;
  24        bool is_ht = false, is_a = false, is_b = false, is_g = false;
  25
  26        if (!wdev)
  27                return -EOPNOTSUPP;
  28
  29        sband = wdev->wiphy->bands[IEEE80211_BAND_5GHZ];
  30        if (sband) {
  31                is_a = true;
  32                is_ht |= sband->ht_cap.ht_supported;
  33        }
  34
  35        sband = wdev->wiphy->bands[IEEE80211_BAND_2GHZ];
  36        if (sband) {
  37                int i;
  38                /* Check for mandatory rates */
  39                for (i = 0; i < sband->n_bitrates; i++) {
  40                        if (sband->bitrates[i].bitrate == 10)
  41                                is_b = true;
  42                        if (sband->bitrates[i].bitrate == 60)
  43                                is_g = true;
  44                }
  45                is_ht |= sband->ht_cap.ht_supported;
  46        }
  47
  48        strcpy(name, "IEEE 802.11");
  49        if (is_a)
  50                strcat(name, "a");
  51        if (is_b)
  52                strcat(name, "b");
  53        if (is_g)
  54                strcat(name, "g");
  55        if (is_ht)
  56                strcat(name, "n");
  57
  58        return 0;
  59}
  60EXPORT_SYMBOL(cfg80211_wext_giwname);
  61
  62int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info,
  63                          u32 *mode, char *extra)
  64{
  65        struct wireless_dev *wdev = dev->ieee80211_ptr;
  66        struct cfg80211_registered_device *rdev;
  67        struct vif_params vifparams;
  68        enum nl80211_iftype type;
  69
  70        if (!wdev)
  71                return -EOPNOTSUPP;
  72
  73        rdev = wiphy_to_dev(wdev->wiphy);
  74
  75        if (!rdev->ops->change_virtual_intf)
  76                return -EOPNOTSUPP;
  77
  78        /* don't support changing VLANs, you just re-create them */
  79        if (wdev->iftype == NL80211_IFTYPE_AP_VLAN)
  80                return -EOPNOTSUPP;
  81
  82        switch (*mode) {
  83        case IW_MODE_INFRA:
  84                type = NL80211_IFTYPE_STATION;
  85                break;
  86        case IW_MODE_ADHOC:
  87                type = NL80211_IFTYPE_ADHOC;
  88                break;
  89        case IW_MODE_REPEAT:
  90                type = NL80211_IFTYPE_WDS;
  91                break;
  92        case IW_MODE_MONITOR:
  93                type = NL80211_IFTYPE_MONITOR;
  94                break;
  95        default:
  96                return -EINVAL;
  97        }
  98
  99        memset(&vifparams, 0, sizeof(vifparams));
 100
 101        return rdev->ops->change_virtual_intf(wdev->wiphy, dev->ifindex, type,
 102                                              NULL, &vifparams);
 103}
 104EXPORT_SYMBOL(cfg80211_wext_siwmode);
 105
 106int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info,
 107                          u32 *mode, char *extra)
 108{
 109        struct wireless_dev *wdev = dev->ieee80211_ptr;
 110
 111        if (!wdev)
 112                return -EOPNOTSUPP;
 113
 114        switch (wdev->iftype) {
 115        case NL80211_IFTYPE_AP:
 116                *mode = IW_MODE_MASTER;
 117                break;
 118        case NL80211_IFTYPE_STATION:
 119                *mode = IW_MODE_INFRA;
 120                break;
 121        case NL80211_IFTYPE_ADHOC:
 122                *mode = IW_MODE_ADHOC;
 123                break;
 124        case NL80211_IFTYPE_MONITOR:
 125                *mode = IW_MODE_MONITOR;
 126                break;
 127        case NL80211_IFTYPE_WDS:
 128                *mode = IW_MODE_REPEAT;
 129                break;
 130        case NL80211_IFTYPE_AP_VLAN:
 131                *mode = IW_MODE_SECOND;         /* FIXME */
 132                break;
 133        default:
 134                *mode = IW_MODE_AUTO;
 135                break;
 136        }
 137        return 0;
 138}
 139EXPORT_SYMBOL(cfg80211_wext_giwmode);
 140