@@ -81,6 +81,7 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
enum nl80211_channel_type channel_type)
{
struct ieee80211_channel *chan;
+ struct wireless_dev *passed_wdev = wdev;
int result;
if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR)
@@ -128,8 +129,8 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
if (result)
return result;
- if (wdev)
- wdev->channel = chan;
+ if (passed_wdev)
+ passed_wdev->channel = chan;
return 0;
}
@@ -819,6 +819,8 @@ int cfg80211_wext_giwfreq(struct net_device *dev,
struct iw_freq *freq, char *extra)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
+ struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
+ int result;
switch (wdev->iftype) {
case NL80211_IFTYPE_STATION:
@@ -828,6 +830,16 @@ int cfg80211_wext_giwfreq(struct net_device *dev,
default:
if (!wdev->channel)
return -EINVAL;
+ /* The actual working channel might have been changed, verify it
+ * by re-setting pretending we want to set channel for a monitor
+ * interface */
+ result = rdev->ops->set_channel(&rdev->wiphy, NULL,
+ wdev->channel,
+ NL80211_CHAN_NO_HT);
+ if (result) {
+ wdev->channel = NULL;
+ return -EINVAL;
+ }
freq->m = wdev->channel->center_freq;
freq->e = 6;
return 0;