diff options
Diffstat (limited to 'net/wireless/wext-compat.c')
-rw-r--r-- | net/wireless/wext-compat.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c new file mode 100644 index 000000000000..58e489fd4aed --- /dev/null +++ b/net/wireless/wext-compat.c | |||
@@ -0,0 +1,139 @@ | |||
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 | |||
18 | int 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 | } | ||
60 | EXPORT_SYMBOL(cfg80211_wext_giwname); | ||
61 | |||
62 | int 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 | } | ||
104 | EXPORT_SYMBOL(cfg80211_wext_siwmode); | ||
105 | |||
106 | int 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 | } | ||
139 | EXPORT_SYMBOL(cfg80211_wext_giwmode); | ||