aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Porsch <marco@cozybit.com>2013-01-07 10:04:51 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-01-16 16:44:04 -0500
commit9bdbf04db099c11bbbaea9dcea7465c508531fb8 (patch)
tree777ad3519262076879f8a5a7c068a2704808d8f5
parenteac70c135def117849faa7cc8b7ccb941498085f (diff)
{cfg,nl,mac}80211: set beacon interval and DTIM period on mesh join
Move the default mesh beacon interval and DTIM period to cfg80211 and make them accessible to nl80211. This enables setting both values when joining an MBSS. Previously the DTIM parameter was not set by mac80211 so the driver's default value was used. Signed-off-by: Marco Porsch <marco@cozybit.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--include/net/cfg80211.h4
-rw-r--r--net/mac80211/cfg.c3
-rw-r--r--net/mac80211/mesh.c1
-rw-r--r--net/mac80211/mesh.h2
-rw-r--r--net/wireless/mesh.c5
-rw-r--r--net/wireless/nl80211.c15
6 files changed, 27 insertions, 3 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 3d8717a0d3b2..516aded3697f 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1036,6 +1036,8 @@ struct mesh_config {
1036 * @ie_len: length of vendor information elements 1036 * @ie_len: length of vendor information elements
1037 * @is_authenticated: this mesh requires authentication 1037 * @is_authenticated: this mesh requires authentication
1038 * @is_secure: this mesh uses security 1038 * @is_secure: this mesh uses security
1039 * @dtim_period: DTIM period to use
1040 * @beacon_interval: beacon interval to use
1039 * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a] 1041 * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]
1040 * 1042 *
1041 * These parameters are fixed when the mesh is created. 1043 * These parameters are fixed when the mesh is created.
@@ -1051,6 +1053,8 @@ struct mesh_setup {
1051 u8 ie_len; 1053 u8 ie_len;
1052 bool is_authenticated; 1054 bool is_authenticated;
1053 bool is_secure; 1055 bool is_secure;
1056 u8 dtim_period;
1057 u16 beacon_interval;
1054 int mcast_rate[IEEE80211_NUM_BANDS]; 1058 int mcast_rate[IEEE80211_NUM_BANDS];
1055}; 1059};
1056 1060
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 8a91dd22d571..36aa65f495ff 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1666,6 +1666,9 @@ static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
1666 memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate, 1666 memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
1667 sizeof(setup->mcast_rate)); 1667 sizeof(setup->mcast_rate));
1668 1668
1669 sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
1670 sdata->vif.bss_conf.dtim_period = setup->dtim_period;
1671
1669 return 0; 1672 return 0;
1670} 1673}
1671 1674
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index 245885841c8d..694e27376afa 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -625,7 +625,6 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
625 ieee80211_queue_work(&local->hw, &sdata->work); 625 ieee80211_queue_work(&local->hw, &sdata->work);
626 sdata->vif.bss_conf.ht_operation_mode = 626 sdata->vif.bss_conf.ht_operation_mode =
627 ifmsh->mshcfg.ht_opmode; 627 ifmsh->mshcfg.ht_opmode;
628 sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL;
629 sdata->vif.bss_conf.enable_beacon = true; 628 sdata->vif.bss_conf.enable_beacon = true;
630 sdata->vif.bss_conf.basic_rates = 629 sdata->vif.bss_conf.basic_rates =
631 ieee80211_mandatory_rates(local, band); 630 ieee80211_mandatory_rates(local, band);
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h
index c07f6fc63dc6..aff301544c7f 100644
--- a/net/mac80211/mesh.h
+++ b/net/mac80211/mesh.h
@@ -191,8 +191,6 @@ struct mesh_rmc {
191#define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ) 191#define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ)
192#define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ) 192#define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ)
193 193
194#define MESH_DEFAULT_BEACON_INTERVAL 1000 /* in 1024 us units */
195
196#define MESH_PATH_EXPIRE (600 * HZ) 194#define MESH_PATH_EXPIRE (600 * HZ)
197 195
198/* Default maximum number of plinks per interface */ 196/* Default maximum number of plinks per interface */
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c
index f9d6ce5cfabb..0fe8ceb5444e 100644
--- a/net/wireless/mesh.c
+++ b/net/wireless/mesh.c
@@ -44,6 +44,9 @@
44 44
45#define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50 45#define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50
46 46
47#define MESH_DEFAULT_BEACON_INTERVAL 1000 /* in 1024 us units (=TUs) */
48#define MESH_DEFAULT_DTIM_PERIOD 2
49
47const struct mesh_config default_mesh_config = { 50const struct mesh_config default_mesh_config = {
48 .dot11MeshRetryTimeout = MESH_RET_T, 51 .dot11MeshRetryTimeout = MESH_RET_T,
49 .dot11MeshConfirmTimeout = MESH_CONF_T, 52 .dot11MeshConfirmTimeout = MESH_CONF_T,
@@ -79,6 +82,8 @@ const struct mesh_setup default_mesh_setup = {
79 .ie = NULL, 82 .ie = NULL,
80 .ie_len = 0, 83 .ie_len = 0,
81 .is_secure = false, 84 .is_secure = false,
85 .beacon_interval = MESH_DEFAULT_BEACON_INTERVAL,
86 .dtim_period = MESH_DEFAULT_DTIM_PERIOD,
82}; 87};
83 88
84int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev, 89int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index ceb27fda9ec5..d5842eb35aec 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6669,6 +6669,21 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
6669 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) 6669 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
6670 return -EINVAL; 6670 return -EINVAL;
6671 6671
6672 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
6673 setup.beacon_interval =
6674 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
6675 if (setup.beacon_interval < 10 ||
6676 setup.beacon_interval > 10000)
6677 return -EINVAL;
6678 }
6679
6680 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
6681 setup.dtim_period =
6682 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
6683 if (setup.dtim_period < 1 || setup.dtim_period > 100)
6684 return -EINVAL;
6685 }
6686
6672 if (info->attrs[NL80211_ATTR_MESH_SETUP]) { 6687 if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
6673 /* parse additional setup parameters if given */ 6688 /* parse additional setup parameters if given */
6674 err = nl80211_parse_mesh_setup(info, &setup); 6689 err = nl80211_parse_mesh_setup(info, &setup);