diff options
-rw-r--r-- | net/wireless/chan.c | 51 | ||||
-rw-r--r-- | net/wireless/core.h | 12 |
2 files changed, 63 insertions, 0 deletions
diff --git a/net/wireless/chan.c b/net/wireless/chan.c index c1999e45a07c..167e7cb60089 100644 --- a/net/wireless/chan.c +++ b/net/wireless/chan.c | |||
@@ -92,3 +92,54 @@ int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, | |||
92 | 92 | ||
93 | return rdev->ops->set_monitor_channel(&rdev->wiphy, chan, chantype); | 93 | return rdev->ops->set_monitor_channel(&rdev->wiphy, chan, chantype); |
94 | } | 94 | } |
95 | |||
96 | void | ||
97 | cfg80211_get_chan_state(struct cfg80211_registered_device *rdev, | ||
98 | struct wireless_dev *wdev, | ||
99 | struct ieee80211_channel **chan, | ||
100 | enum cfg80211_chan_mode *chanmode) | ||
101 | { | ||
102 | *chan = NULL; | ||
103 | *chanmode = CHAN_MODE_UNDEFINED; | ||
104 | |||
105 | ASSERT_RDEV_LOCK(rdev); | ||
106 | ASSERT_WDEV_LOCK(wdev); | ||
107 | |||
108 | if (!netif_running(wdev->netdev)) | ||
109 | return; | ||
110 | |||
111 | switch (wdev->iftype) { | ||
112 | case NL80211_IFTYPE_ADHOC: | ||
113 | if (wdev->current_bss) { | ||
114 | *chan = wdev->current_bss->pub.channel; | ||
115 | *chanmode = wdev->ibss_fixed | ||
116 | ? CHAN_MODE_SHARED | ||
117 | : CHAN_MODE_EXCLUSIVE; | ||
118 | return; | ||
119 | } | ||
120 | case NL80211_IFTYPE_STATION: | ||
121 | case NL80211_IFTYPE_P2P_CLIENT: | ||
122 | if (wdev->current_bss) { | ||
123 | *chan = wdev->current_bss->pub.channel; | ||
124 | *chanmode = CHAN_MODE_SHARED; | ||
125 | return; | ||
126 | } | ||
127 | break; | ||
128 | case NL80211_IFTYPE_AP: | ||
129 | case NL80211_IFTYPE_P2P_GO: | ||
130 | case NL80211_IFTYPE_MESH_POINT: | ||
131 | *chan = wdev->channel; | ||
132 | *chanmode = CHAN_MODE_SHARED; | ||
133 | return; | ||
134 | case NL80211_IFTYPE_MONITOR: | ||
135 | case NL80211_IFTYPE_AP_VLAN: | ||
136 | case NL80211_IFTYPE_WDS: | ||
137 | /* these interface types don't really have a channel */ | ||
138 | return; | ||
139 | case NL80211_IFTYPE_UNSPECIFIED: | ||
140 | case NUM_NL80211_IFTYPES: | ||
141 | WARN_ON(1); | ||
142 | } | ||
143 | |||
144 | return; | ||
145 | } | ||
diff --git a/net/wireless/core.h b/net/wireless/core.h index fef476d2117e..56f18c2eb919 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -241,6 +241,12 @@ struct cfg80211_cached_keys { | |||
241 | int def, defmgmt; | 241 | int def, defmgmt; |
242 | }; | 242 | }; |
243 | 243 | ||
244 | enum cfg80211_chan_mode { | ||
245 | CHAN_MODE_UNDEFINED, | ||
246 | CHAN_MODE_SHARED, | ||
247 | CHAN_MODE_EXCLUSIVE, | ||
248 | }; | ||
249 | |||
244 | 250 | ||
245 | /* free object */ | 251 | /* free object */ |
246 | extern void cfg80211_dev_free(struct cfg80211_registered_device *rdev); | 252 | extern void cfg80211_dev_free(struct cfg80211_registered_device *rdev); |
@@ -419,6 +425,12 @@ cfg80211_can_add_interface(struct cfg80211_registered_device *rdev, | |||
419 | return cfg80211_can_change_interface(rdev, NULL, iftype); | 425 | return cfg80211_can_change_interface(rdev, NULL, iftype); |
420 | } | 426 | } |
421 | 427 | ||
428 | void | ||
429 | cfg80211_get_chan_state(struct cfg80211_registered_device *rdev, | ||
430 | struct wireless_dev *wdev, | ||
431 | struct ieee80211_channel **chan, | ||
432 | enum cfg80211_chan_mode *chanmode); | ||
433 | |||
422 | struct ieee80211_channel * | 434 | struct ieee80211_channel * |
423 | rdev_freq_to_chan(struct cfg80211_registered_device *rdev, | 435 | rdev_freq_to_chan(struct cfg80211_registered_device *rdev, |
424 | int freq, enum nl80211_channel_type channel_type); | 436 | int freq, enum nl80211_channel_type channel_type); |