diff options
| author | Johannes Berg <johannes.berg@intel.com> | 2012-11-08 15:25:48 -0500 |
|---|---|---|
| committer | Johannes Berg <johannes.berg@intel.com> | 2012-11-26 06:42:58 -0500 |
| commit | 683b6d3b31a51956ea540df00abb0b78894924c1 (patch) | |
| tree | 558e0f316b56368ab259755cb4eeaeb40331853d /net/wireless/mesh.c | |
| parent | fe4b31810c06cc6518fb193efb9b3c3289b55832 (diff) | |
cfg80211: pass a channel definition struct
Instead of passing a channel pointer and channel type
to all functions and driver methods, pass a new channel
definition struct. Right now, this struct contains just
the control channel and channel type, but for VHT this
will change.
Also, add a small inline cfg80211_get_chandef_type() so
that drivers don't need to use the _type field of the
new structure all the time, which will change.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/mesh.c')
| -rw-r--r-- | net/wireless/mesh.c | 49 |
1 files changed, 18 insertions, 31 deletions
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c index 966cfc4cd79d..12b5a570a306 100644 --- a/net/wireless/mesh.c +++ b/net/wireless/mesh.c | |||
| @@ -73,8 +73,6 @@ const struct mesh_config default_mesh_config = { | |||
| 73 | 73 | ||
| 74 | const struct mesh_setup default_mesh_setup = { | 74 | const struct mesh_setup default_mesh_setup = { |
| 75 | /* cfg80211_join_mesh() will pick a channel if needed */ | 75 | /* cfg80211_join_mesh() will pick a channel if needed */ |
| 76 | .channel = NULL, | ||
| 77 | .channel_type = NL80211_CHAN_NO_HT, | ||
| 78 | .sync_method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET, | 76 | .sync_method = IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET, |
| 79 | .path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP, | 77 | .path_sel_proto = IEEE80211_PATH_PROTOCOL_HWMP, |
| 80 | .path_metric = IEEE80211_PATH_METRIC_AIRTIME, | 78 | .path_metric = IEEE80211_PATH_METRIC_AIRTIME, |
| @@ -111,13 +109,12 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, | |||
| 111 | if (!rdev->ops->join_mesh) | 109 | if (!rdev->ops->join_mesh) |
| 112 | return -EOPNOTSUPP; | 110 | return -EOPNOTSUPP; |
| 113 | 111 | ||
| 114 | if (!setup->channel) { | 112 | if (!setup->chandef.chan) { |
| 115 | /* if no channel explicitly given, use preset channel */ | 113 | /* if no channel explicitly given, use preset channel */ |
| 116 | setup->channel = wdev->preset_chan; | 114 | setup->chandef = wdev->preset_chandef; |
| 117 | setup->channel_type = wdev->preset_chantype; | ||
| 118 | } | 115 | } |
| 119 | 116 | ||
| 120 | if (!setup->channel) { | 117 | if (!setup->chandef.chan) { |
| 121 | /* if we don't have that either, use the first usable channel */ | 118 | /* if we don't have that either, use the first usable channel */ |
| 122 | enum ieee80211_band band; | 119 | enum ieee80211_band band; |
| 123 | 120 | ||
| @@ -137,26 +134,25 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, | |||
| 137 | IEEE80211_CHAN_DISABLED | | 134 | IEEE80211_CHAN_DISABLED | |
| 138 | IEEE80211_CHAN_RADAR)) | 135 | IEEE80211_CHAN_RADAR)) |
| 139 | continue; | 136 | continue; |
| 140 | setup->channel = chan; | 137 | setup->chandef.chan = chan; |
| 141 | break; | 138 | break; |
| 142 | } | 139 | } |
| 143 | 140 | ||
| 144 | if (setup->channel) | 141 | if (setup->chandef.chan) |
| 145 | break; | 142 | break; |
| 146 | } | 143 | } |
| 147 | 144 | ||
| 148 | /* no usable channel ... */ | 145 | /* no usable channel ... */ |
| 149 | if (!setup->channel) | 146 | if (!setup->chandef.chan) |
| 150 | return -EINVAL; | 147 | return -EINVAL; |
| 151 | 148 | ||
| 152 | setup->channel_type = NL80211_CHAN_NO_HT; | 149 | setup->chandef._type = NL80211_CHAN_NO_HT; |
| 153 | } | 150 | } |
| 154 | 151 | ||
| 155 | if (!cfg80211_can_beacon_sec_chan(&rdev->wiphy, setup->channel, | 152 | if (!cfg80211_reg_can_beacon(&rdev->wiphy, &setup->chandef)) |
| 156 | setup->channel_type)) | ||
| 157 | return -EINVAL; | 153 | return -EINVAL; |
| 158 | 154 | ||
| 159 | err = cfg80211_can_use_chan(rdev, wdev, setup->channel, | 155 | err = cfg80211_can_use_chan(rdev, wdev, setup->chandef.chan, |
| 160 | CHAN_MODE_SHARED); | 156 | CHAN_MODE_SHARED); |
| 161 | if (err) | 157 | if (err) |
| 162 | return err; | 158 | return err; |
| @@ -165,7 +161,7 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, | |||
| 165 | if (!err) { | 161 | if (!err) { |
| 166 | memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len); | 162 | memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len); |
| 167 | wdev->mesh_id_len = setup->mesh_id_len; | 163 | wdev->mesh_id_len = setup->mesh_id_len; |
| 168 | wdev->channel = setup->channel; | 164 | wdev->channel = setup->chandef.chan; |
| 169 | } | 165 | } |
| 170 | 166 | ||
| 171 | return err; | 167 | return err; |
| @@ -188,20 +184,12 @@ int cfg80211_join_mesh(struct cfg80211_registered_device *rdev, | |||
| 188 | return err; | 184 | return err; |
| 189 | } | 185 | } |
| 190 | 186 | ||
| 191 | int cfg80211_set_mesh_freq(struct cfg80211_registered_device *rdev, | 187 | int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev, |
| 192 | struct wireless_dev *wdev, int freq, | 188 | struct wireless_dev *wdev, |
| 193 | enum nl80211_channel_type channel_type) | 189 | struct cfg80211_chan_def *chandef) |
| 194 | { | 190 | { |
| 195 | struct ieee80211_channel *channel; | ||
| 196 | int err; | 191 | int err; |
| 197 | 192 | ||
| 198 | channel = rdev_freq_to_chan(rdev, freq, channel_type); | ||
| 199 | if (!channel || !cfg80211_can_beacon_sec_chan(&rdev->wiphy, | ||
| 200 | channel, | ||
| 201 | channel_type)) { | ||
| 202 | return -EINVAL; | ||
| 203 | } | ||
| 204 | |||
| 205 | /* | 193 | /* |
| 206 | * Workaround for libertas (only!), it puts the interface | 194 | * Workaround for libertas (only!), it puts the interface |
| 207 | * into mesh mode but doesn't implement join_mesh. Instead, | 195 | * into mesh mode but doesn't implement join_mesh. Instead, |
| @@ -210,21 +198,21 @@ int cfg80211_set_mesh_freq(struct cfg80211_registered_device *rdev, | |||
| 210 | * compatible with 802.11 mesh. | 198 | * compatible with 802.11 mesh. |
| 211 | */ | 199 | */ |
| 212 | if (rdev->ops->libertas_set_mesh_channel) { | 200 | if (rdev->ops->libertas_set_mesh_channel) { |
| 213 | if (channel_type != NL80211_CHAN_NO_HT) | 201 | if (chandef->_type != NL80211_CHAN_NO_HT) |
| 214 | return -EINVAL; | 202 | return -EINVAL; |
| 215 | 203 | ||
| 216 | if (!netif_running(wdev->netdev)) | 204 | if (!netif_running(wdev->netdev)) |
| 217 | return -ENETDOWN; | 205 | return -ENETDOWN; |
| 218 | 206 | ||
| 219 | err = cfg80211_can_use_chan(rdev, wdev, channel, | 207 | err = cfg80211_can_use_chan(rdev, wdev, chandef->chan, |
| 220 | CHAN_MODE_SHARED); | 208 | CHAN_MODE_SHARED); |
| 221 | if (err) | 209 | if (err) |
| 222 | return err; | 210 | return err; |
| 223 | 211 | ||
| 224 | err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev, | 212 | err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev, |
| 225 | channel); | 213 | chandef->chan); |
| 226 | if (!err) | 214 | if (!err) |
| 227 | wdev->channel = channel; | 215 | wdev->channel = chandef->chan; |
| 228 | 216 | ||
| 229 | return err; | 217 | return err; |
| 230 | } | 218 | } |
| @@ -232,8 +220,7 @@ int cfg80211_set_mesh_freq(struct cfg80211_registered_device *rdev, | |||
| 232 | if (wdev->mesh_id_len) | 220 | if (wdev->mesh_id_len) |
| 233 | return -EBUSY; | 221 | return -EBUSY; |
| 234 | 222 | ||
| 235 | wdev->preset_chan = channel; | 223 | wdev->preset_chandef = *chandef; |
| 236 | wdev->preset_chantype = channel_type; | ||
| 237 | return 0; | 224 | return 0; |
| 238 | } | 225 | } |
| 239 | 226 | ||
