diff options
Diffstat (limited to 'net/wireless/wext-compat.c')
-rw-r--r-- | net/wireless/wext-compat.c | 108 |
1 files changed, 106 insertions, 2 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 58e489fd4aed..0fd1db6e95bb 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
@@ -66,6 +66,7 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, | |||
66 | struct cfg80211_registered_device *rdev; | 66 | struct cfg80211_registered_device *rdev; |
67 | struct vif_params vifparams; | 67 | struct vif_params vifparams; |
68 | enum nl80211_iftype type; | 68 | enum nl80211_iftype type; |
69 | int ret; | ||
69 | 70 | ||
70 | if (!wdev) | 71 | if (!wdev) |
71 | return -EOPNOTSUPP; | 72 | return -EOPNOTSUPP; |
@@ -96,10 +97,16 @@ int cfg80211_wext_siwmode(struct net_device *dev, struct iw_request_info *info, | |||
96 | return -EINVAL; | 97 | return -EINVAL; |
97 | } | 98 | } |
98 | 99 | ||
100 | if (type == wdev->iftype) | ||
101 | return 0; | ||
102 | |||
99 | memset(&vifparams, 0, sizeof(vifparams)); | 103 | memset(&vifparams, 0, sizeof(vifparams)); |
100 | 104 | ||
101 | return rdev->ops->change_virtual_intf(wdev->wiphy, dev->ifindex, type, | 105 | ret = rdev->ops->change_virtual_intf(wdev->wiphy, dev->ifindex, type, |
102 | NULL, &vifparams); | 106 | NULL, &vifparams); |
107 | WARN_ON(!ret && wdev->iftype != type); | ||
108 | |||
109 | return ret; | ||
103 | } | 110 | } |
104 | EXPORT_SYMBOL(cfg80211_wext_siwmode); | 111 | EXPORT_SYMBOL(cfg80211_wext_siwmode); |
105 | 112 | ||
@@ -137,3 +144,100 @@ int cfg80211_wext_giwmode(struct net_device *dev, struct iw_request_info *info, | |||
137 | return 0; | 144 | return 0; |
138 | } | 145 | } |
139 | EXPORT_SYMBOL(cfg80211_wext_giwmode); | 146 | EXPORT_SYMBOL(cfg80211_wext_giwmode); |
147 | |||
148 | |||
149 | int cfg80211_wext_giwrange(struct net_device *dev, | ||
150 | struct iw_request_info *info, | ||
151 | struct iw_point *data, char *extra) | ||
152 | { | ||
153 | struct wireless_dev *wdev = dev->ieee80211_ptr; | ||
154 | struct iw_range *range = (struct iw_range *) extra; | ||
155 | enum ieee80211_band band; | ||
156 | int c = 0; | ||
157 | |||
158 | if (!wdev) | ||
159 | return -EOPNOTSUPP; | ||
160 | |||
161 | data->length = sizeof(struct iw_range); | ||
162 | memset(range, 0, sizeof(struct iw_range)); | ||
163 | |||
164 | range->we_version_compiled = WIRELESS_EXT; | ||
165 | range->we_version_source = 21; | ||
166 | range->retry_capa = IW_RETRY_LIMIT; | ||
167 | range->retry_flags = IW_RETRY_LIMIT; | ||
168 | range->min_retry = 0; | ||
169 | range->max_retry = 255; | ||
170 | range->min_rts = 0; | ||
171 | range->max_rts = 2347; | ||
172 | range->min_frag = 256; | ||
173 | range->max_frag = 2346; | ||
174 | |||
175 | range->encoding_size[0] = 5; | ||
176 | range->encoding_size[1] = 13; | ||
177 | range->num_encoding_sizes = 2; | ||
178 | range->max_encoding_tokens = 4; | ||
179 | |||
180 | range->max_qual.updated = IW_QUAL_NOISE_INVALID; | ||
181 | |||
182 | switch (wdev->wiphy->signal_type) { | ||
183 | case CFG80211_SIGNAL_TYPE_NONE: | ||
184 | break; | ||
185 | case CFG80211_SIGNAL_TYPE_MBM: | ||
186 | range->max_qual.level = -110; | ||
187 | range->max_qual.qual = 70; | ||
188 | range->avg_qual.qual = 35; | ||
189 | range->max_qual.updated |= IW_QUAL_DBM; | ||
190 | range->max_qual.updated |= IW_QUAL_QUAL_UPDATED; | ||
191 | range->max_qual.updated |= IW_QUAL_LEVEL_UPDATED; | ||
192 | break; | ||
193 | case CFG80211_SIGNAL_TYPE_UNSPEC: | ||
194 | range->max_qual.level = 100; | ||
195 | range->max_qual.qual = 100; | ||
196 | range->avg_qual.qual = 50; | ||
197 | range->max_qual.updated |= IW_QUAL_QUAL_UPDATED; | ||
198 | range->max_qual.updated |= IW_QUAL_LEVEL_UPDATED; | ||
199 | break; | ||
200 | } | ||
201 | |||
202 | range->avg_qual.level = range->max_qual.level / 2; | ||
203 | range->avg_qual.noise = range->max_qual.noise / 2; | ||
204 | range->avg_qual.updated = range->max_qual.updated; | ||
205 | |||
206 | range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | | ||
207 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; | ||
208 | |||
209 | |||
210 | for (band = 0; band < IEEE80211_NUM_BANDS; band ++) { | ||
211 | int i; | ||
212 | struct ieee80211_supported_band *sband; | ||
213 | |||
214 | sband = wdev->wiphy->bands[band]; | ||
215 | |||
216 | if (!sband) | ||
217 | continue; | ||
218 | |||
219 | for (i = 0; i < sband->n_channels && c < IW_MAX_FREQUENCIES; i++) { | ||
220 | struct ieee80211_channel *chan = &sband->channels[i]; | ||
221 | |||
222 | if (!(chan->flags & IEEE80211_CHAN_DISABLED)) { | ||
223 | range->freq[c].i = | ||
224 | ieee80211_frequency_to_channel( | ||
225 | chan->center_freq); | ||
226 | range->freq[c].m = chan->center_freq; | ||
227 | range->freq[c].e = 6; | ||
228 | c++; | ||
229 | } | ||
230 | } | ||
231 | } | ||
232 | range->num_channels = c; | ||
233 | range->num_frequency = c; | ||
234 | |||
235 | IW_EVENT_CAPA_SET_KERNEL(range->event_capa); | ||
236 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); | ||
237 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); | ||
238 | |||
239 | range->scan_capa |= IW_SCAN_CAPA_ESSID; | ||
240 | |||
241 | return 0; | ||
242 | } | ||
243 | EXPORT_SYMBOL(cfg80211_wext_giwrange); | ||