diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2012-06-29 06:46:58 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-06-29 07:39:15 -0400 |
commit | f4489ebeffa436c8427a20e2f05004e783708cde (patch) | |
tree | f113512858b0114cc108375b81cab004e8a8369b /net/wireless | |
parent | ac800140c20e7ae51117e71289065bedd4930fc2 (diff) |
cfg80211: add channel tracking for AP and mesh
We need to know which channel is used by a running
AP and mesh for channel context accounting and
finding matching/active interface combination.
STA/IBSS have current_bss already which allows us
to check which channel a vif is tuned to.
Non-fixed channel IBSS can be handled with
additional changes.
Monitor mode is going to be handled differently.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/ap.c | 4 | ||||
-rw-r--r-- | net/wireless/mesh.c | 18 | ||||
-rw-r--r-- | net/wireless/mlme.c | 1 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 1 |
4 files changed, 19 insertions, 5 deletions
diff --git a/net/wireless/ap.c b/net/wireless/ap.c index 45199cca63d5..fcc60d8dbefa 100644 --- a/net/wireless/ap.c +++ b/net/wireless/ap.c | |||
@@ -24,8 +24,10 @@ static int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev, | |||
24 | return -ENOENT; | 24 | return -ENOENT; |
25 | 25 | ||
26 | err = rdev->ops->stop_ap(&rdev->wiphy, dev); | 26 | err = rdev->ops->stop_ap(&rdev->wiphy, dev); |
27 | if (!err) | 27 | if (!err) { |
28 | wdev->beacon_interval = 0; | 28 | wdev->beacon_interval = 0; |
29 | wdev->channel = NULL; | ||
30 | } | ||
29 | 31 | ||
30 | return err; | 32 | return err; |
31 | } | 33 | } |
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c index 3b73b07486cf..bab381344723 100644 --- a/net/wireless/mesh.c +++ b/net/wireless/mesh.c | |||
@@ -159,6 +159,7 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, | |||
159 | if (!err) { | 159 | if (!err) { |
160 | memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len); | 160 | memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len); |
161 | wdev->mesh_id_len = setup->mesh_id_len; | 161 | wdev->mesh_id_len = setup->mesh_id_len; |
162 | wdev->channel = setup->channel; | ||
162 | } | 163 | } |
163 | 164 | ||
164 | return err; | 165 | return err; |
@@ -184,6 +185,7 @@ int cfg80211_set_mesh_freq(struct cfg80211_registered_device *rdev, | |||
184 | enum nl80211_channel_type channel_type) | 185 | enum nl80211_channel_type channel_type) |
185 | { | 186 | { |
186 | struct ieee80211_channel *channel; | 187 | struct ieee80211_channel *channel; |
188 | int err; | ||
187 | 189 | ||
188 | channel = rdev_freq_to_chan(rdev, freq, channel_type); | 190 | channel = rdev_freq_to_chan(rdev, freq, channel_type); |
189 | if (!channel || !cfg80211_can_beacon_sec_chan(&rdev->wiphy, | 191 | if (!channel || !cfg80211_can_beacon_sec_chan(&rdev->wiphy, |
@@ -205,9 +207,14 @@ int cfg80211_set_mesh_freq(struct cfg80211_registered_device *rdev, | |||
205 | 207 | ||
206 | if (!netif_running(wdev->netdev)) | 208 | if (!netif_running(wdev->netdev)) |
207 | return -ENETDOWN; | 209 | return -ENETDOWN; |
208 | return rdev->ops->libertas_set_mesh_channel(&rdev->wiphy, | 210 | |
209 | wdev->netdev, | 211 | err = rdev->ops->libertas_set_mesh_channel(&rdev->wiphy, |
210 | channel); | 212 | wdev->netdev, |
213 | channel); | ||
214 | if (!err) | ||
215 | wdev->channel = channel; | ||
216 | |||
217 | return err; | ||
211 | } | 218 | } |
212 | 219 | ||
213 | if (wdev->mesh_id_len) | 220 | if (wdev->mesh_id_len) |
@@ -249,8 +256,11 @@ static int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, | |||
249 | return -ENOTCONN; | 256 | return -ENOTCONN; |
250 | 257 | ||
251 | err = rdev->ops->leave_mesh(&rdev->wiphy, dev); | 258 | err = rdev->ops->leave_mesh(&rdev->wiphy, dev); |
252 | if (!err) | 259 | if (!err) { |
253 | wdev->mesh_id_len = 0; | 260 | wdev->mesh_id_len = 0; |
261 | wdev->channel = NULL; | ||
262 | } | ||
263 | |||
254 | return err; | 264 | return err; |
255 | } | 265 | } |
256 | 266 | ||
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index da4406f11929..a7882eb8c46e 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -947,6 +947,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev, int freq, | |||
947 | if (WARN_ON(!chan)) | 947 | if (WARN_ON(!chan)) |
948 | goto out; | 948 | goto out; |
949 | 949 | ||
950 | wdev->channel = chan; | ||
950 | nl80211_ch_switch_notify(rdev, dev, freq, type, GFP_KERNEL); | 951 | nl80211_ch_switch_notify(rdev, dev, freq, type, GFP_KERNEL); |
951 | out: | 952 | out: |
952 | wdev_unlock(wdev); | 953 | wdev_unlock(wdev); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 20d0fd6d1286..12096b4ebf62 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2488,6 +2488,7 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) | |||
2488 | wdev->preset_chan = params.channel; | 2488 | wdev->preset_chan = params.channel; |
2489 | wdev->preset_chantype = params.channel_type; | 2489 | wdev->preset_chantype = params.channel_type; |
2490 | wdev->beacon_interval = params.beacon_interval; | 2490 | wdev->beacon_interval = params.beacon_interval; |
2491 | wdev->channel = params.channel; | ||
2491 | } | 2492 | } |
2492 | return err; | 2493 | return err; |
2493 | } | 2494 | } |