diff options
author | Jacob Minshall <jacob@cozybit.com> | 2013-05-29 17:32:36 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-06-03 11:03:18 -0400 |
commit | e05ecccdf752122a439b03c3190458d2c8f0bac6 (patch) | |
tree | d6f791d3507a28ffe6ac3fba22f9b72219981735 | |
parent | 866403a7bdd3941cbb4e2085d8ac368dcabe800c (diff) |
mac80211: set mesh formation field properly
Cap max peerings at 63 in accordance with IEEE-2012 8.4.2.100.7.
Triggers a beacon regeneration every time the number of peerings changes.
Previously this would only happen if the "accepting peerings" bit changed.
Signed-off-by: Jacob Minshall <jacob@cozybit.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | include/linux/ieee80211.h | 1 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 3 | ||||
-rw-r--r-- | net/mac80211/mesh.h | 4 |
3 files changed, 4 insertions, 4 deletions
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index d826e5a84af0..b0dc87a2a376 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -146,6 +146,7 @@ static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2) | |||
146 | #define IEEE80211_MAX_RTS_THRESHOLD 2353 | 146 | #define IEEE80211_MAX_RTS_THRESHOLD 2353 |
147 | #define IEEE80211_MAX_AID 2007 | 147 | #define IEEE80211_MAX_AID 2007 |
148 | #define IEEE80211_MAX_TIM_LEN 251 | 148 | #define IEEE80211_MAX_TIM_LEN 251 |
149 | #define IEEE80211_MAX_MESH_PEERINGS 63 | ||
149 | /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section | 150 | /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section |
150 | 6.2.1.1.2. | 151 | 6.2.1.1.2. |
151 | 152 | ||
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index b3d1fdd46368..73a597bad6e0 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -274,8 +274,7 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, | |||
274 | *pos++ = ifmsh->mesh_auth_id; | 274 | *pos++ = ifmsh->mesh_auth_id; |
275 | /* Mesh Formation Info - number of neighbors */ | 275 | /* Mesh Formation Info - number of neighbors */ |
276 | neighbors = atomic_read(&ifmsh->estab_plinks); | 276 | neighbors = atomic_read(&ifmsh->estab_plinks); |
277 | /* Number of neighbor mesh STAs or 15 whichever is smaller */ | 277 | neighbors = min_t(int, neighbors, IEEE80211_MAX_MESH_PEERINGS); |
278 | neighbors = (neighbors > 15) ? 15 : neighbors; | ||
279 | *pos++ = neighbors << 1; | 278 | *pos++ = neighbors << 1; |
280 | /* Mesh capability */ | 279 | /* Mesh capability */ |
281 | *pos = IEEE80211_MESHCONF_CAPAB_FORWARDING; | 280 | *pos = IEEE80211_MESHCONF_CAPAB_FORWARDING; |
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index da158774eebb..8b4d9a3e9eee 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h | |||
@@ -324,14 +324,14 @@ static inline | |||
324 | u32 mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata) | 324 | u32 mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata) |
325 | { | 325 | { |
326 | atomic_inc(&sdata->u.mesh.estab_plinks); | 326 | atomic_inc(&sdata->u.mesh.estab_plinks); |
327 | return mesh_accept_plinks_update(sdata); | 327 | return mesh_accept_plinks_update(sdata) | BSS_CHANGED_BEACON; |
328 | } | 328 | } |
329 | 329 | ||
330 | static inline | 330 | static inline |
331 | u32 mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata) | 331 | u32 mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata) |
332 | { | 332 | { |
333 | atomic_dec(&sdata->u.mesh.estab_plinks); | 333 | atomic_dec(&sdata->u.mesh.estab_plinks); |
334 | return mesh_accept_plinks_update(sdata); | 334 | return mesh_accept_plinks_update(sdata) | BSS_CHANGED_BEACON; |
335 | } | 335 | } |
336 | 336 | ||
337 | static inline int mesh_plink_free_count(struct ieee80211_sub_if_data *sdata) | 337 | static inline int mesh_plink_free_count(struct ieee80211_sub_if_data *sdata) |