On 12/05/2012 02:57 PM, Thomas Pedersen wrote:
On Wed, Dec 5, 2012 at 2:06 PM, Marco Porsch
<[email protected]> wrote:
Move the default mesh beacon interval and DTIM period to cfg80211 and
make it accessible to nl80211. This enables setting both values when joining
an MBSS.

NOTE: In a mesh with links in PS mode it is not advised to use the default
parameters 1000:4, as these cause excessive buffering delays that exceed
various timeouts (e.g. HWMP path request).

Then make the default parameters reasonable? How is 1000:2?

For mesh PS the reasonable range would be around 400:1. But mesh PS will stay optional, so I would rather keep the default values unchanged. (It seems the driver chooses the default DTIM if none is set previously.)


Signed-off-by: Marco Porsch <[email protected]>
---
  include/net/cfg80211.h |    4 ++++
  net/mac80211/cfg.c     |    3 +++
  net/mac80211/mesh.c    |    1 -
  net/mac80211/mesh.h    |    2 --
  net/wireless/mesh.c    |    5 +++++
  net/wireless/nl80211.c |   14 ++++++++++++++
  6 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index e78db2c..a31e893 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1009,6 +1009,8 @@ struct mesh_config {
   * @ie_len: length of vendor information elements
   * @is_authenticated: this mesh requires authentication
   * @is_secure: this mesh uses security
+ * @dtim_period: DTIM period to use
+ * @beacon_interval: beacon interval to use
   * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a]
   *
   * These parameters are fixed when the mesh is created.
@@ -1024,6 +1026,8 @@ struct mesh_setup {
         u8 ie_len;
         bool is_authenticated;
         bool is_secure;
+       u8 dtim_period;
+       u16 beacon_interval;
         int mcast_rate[IEEE80211_NUM_BANDS];
  };

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 4965aa6..7227477 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1604,6 +1604,9 @@ static int copy_mesh_setup(struct ieee80211_if_mesh 
*ifmsh,
         memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
                                                 sizeof(setup->mcast_rate));

+       sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
+       sdata->vif.bss_conf.dtim_period = setup->dtim_period;
+
         return 0;
  }

diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index 1bf03f9..a4b332c 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -624,7 +624,6 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data 
*sdata)
         ieee80211_queue_work(&local->hw, &sdata->work);
         sdata->vif.bss_conf.ht_operation_mode =
                                 ifmsh->mshcfg.ht_opmode;
-       sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL;
         sdata->vif.bss_conf.basic_rates =
                 ieee80211_mandatory_rates(sdata->local,
                                           ieee80211_get_sdata_band(sdata));
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h
index 7c9215f..7f3a78f 100644
--- a/net/mac80211/mesh.h
+++ b/net/mac80211/mesh.h
@@ -191,8 +191,6 @@ struct mesh_rmc {
  #define IEEE80211_MESH_PEER_INACTIVITY_LIMIT (1800 * HZ)
  #define IEEE80211_MESH_HOUSEKEEPING_INTERVAL (60 * HZ)

-#define MESH_DEFAULT_BEACON_INTERVAL           1000    /* in 1024 us units */
-
  #define MESH_PATH_EXPIRE (600 * HZ)

  /* Default maximum number of plinks per interface */
diff --git a/net/wireless/mesh.c b/net/wireless/mesh.c
index 3ee5a72..38f3073 100644
--- a/net/wireless/mesh.c
+++ b/net/wireless/mesh.c
@@ -44,6 +44,9 @@

  #define MESH_SYNC_NEIGHBOR_OFFSET_MAX 50

+#define MESH_DEFAULT_BEACON_INTERVAL   1000    /* in 1024 us units (=TUs) */
+#define MESH_DEFAULT_DTIM_PERIOD       4
+
  const struct mesh_config default_mesh_config = {
         .dot11MeshRetryTimeout = MESH_RET_T,
         .dot11MeshConfirmTimeout = MESH_CONF_T,
@@ -79,6 +82,8 @@ const struct mesh_setup default_mesh_setup = {
         .ie = NULL,
         .ie_len = 0,
         .is_secure = false,
+       .beacon_interval = MESH_DEFAULT_BEACON_INTERVAL,
+       .dtim_period = MESH_DEFAULT_DTIM_PERIOD,
  };

  int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index d038fa4..00068a4 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6643,6 +6643,20 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct 
genl_info *info)
                             nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
                         return -EINVAL;

+       if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
+                       setup.beacon_interval =
+                               
nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
+                       if (setup.beacon_interval < 10 || setup.beacon_interval 
> 10000)
+                               return -EINVAL;
+       }
+
+       if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
+                       setup.dtim_period =
+                               
nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
+                       if (setup.dtim_period < 1 || setup.dtim_period > 100)
+                               return -EINVAL;
+       }
+
         if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
                 /* parse additional setup parameters if given */
                 err = nl80211_parse_mesh_setup(info, &setup);
--
1.7.9.5

_______________________________________________
Devel mailing list
[email protected]
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel
_______________________________________________
Devel mailing list
[email protected]
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel


_______________________________________________
Devel mailing list
[email protected]
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel

Reply via email to