linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] {nl,cfg,mac}80211: set beacon interval and DTIM period on mesh join
@ 2012-12-05 22:06 Marco Porsch
  2012-12-05 22:57 ` [PATCH] {nl, cfg, mac}80211: " Thomas Pedersen
  2012-12-07 20:10 ` [RFC] iw: add beacon interval and DTIM period parameters to " Marco Porsch
  0 siblings, 2 replies; 6+ messages in thread
From: Marco Porsch @ 2012-12-05 22:06 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, devel, Marco Porsch

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).

Signed-off-by: Marco Porsch <marco.porsch@etit.tu-chemnitz.de>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] {nl, cfg, mac}80211: set beacon interval and DTIM period on mesh join
  2012-12-05 22:06 [PATCH] {nl,cfg,mac}80211: set beacon interval and DTIM period on mesh join Marco Porsch
@ 2012-12-05 22:57 ` Thomas Pedersen
  2012-12-06 10:50   ` Johannes Berg
  2012-12-07 20:10 ` [RFC] iw: add beacon interval and DTIM period parameters to " Marco Porsch
  1 sibling, 1 reply; 6+ messages in thread
From: Thomas Pedersen @ 2012-12-05 22:57 UTC (permalink / raw)
  To: devel; +Cc: johannes, linux-wireless

On Wed, Dec 5, 2012 at 2:06 PM, Marco Porsch
<marco.porsch@etit.tu-chemnitz.de> 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?

> Signed-off-by: Marco Porsch <marco.porsch@etit.tu-chemnitz.de>
> ---
>  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
> Devel@lists.open80211s.org
> http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] {nl, cfg, mac}80211: set beacon interval and DTIM period on mesh join
  2012-12-05 22:57 ` [PATCH] {nl, cfg, mac}80211: " Thomas Pedersen
@ 2012-12-06 10:50   ` Johannes Berg
  2012-12-07 20:25     ` Thomas Pedersen
  0 siblings, 1 reply; 6+ messages in thread
From: Johannes Berg @ 2012-12-06 10:50 UTC (permalink / raw)
  To: Thomas Pedersen; +Cc: devel, linux-wireless

On Wed, 2012-12-05 at 14:57 -0800, Thomas Pedersen wrote:
> On Wed, Dec 5, 2012 at 2:06 PM, Marco Porsch
> <marco.porsch@etit.tu-chemnitz.de> 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?

That's still ~2 seconds, no?

johannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [RFC] iw: add beacon interval and DTIM period parameters to mesh join
  2012-12-05 22:06 [PATCH] {nl,cfg,mac}80211: set beacon interval and DTIM period on mesh join Marco Porsch
  2012-12-05 22:57 ` [PATCH] {nl, cfg, mac}80211: " Thomas Pedersen
@ 2012-12-07 20:10 ` Marco Porsch
  1 sibling, 0 replies; 6+ messages in thread
From: Marco Porsch @ 2012-12-07 20:10 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, devel, Marco Porsch

Set the beacon interval and DTIM period with the mesh join command:
iw <dev> mesh join <meshid> beacon-interval <time in TUs> dtim-period <value>

Signed-off-by: Marco Porsch <marco@cozybit.com>
---
 mesh.c |   32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/mesh.c b/mesh.c
index 4fdad6a..958c2c0 100644
--- a/mesh.c
+++ b/mesh.c
@@ -383,6 +383,7 @@ static int join_mesh(struct nl80211_state *state, struct nl_cb *cb,
 {
 	struct nlattr *container;
 	float rate;
+	int bintval, dtim_period;
 	char *end;
 
 	if (argc < 1)
@@ -405,6 +406,32 @@ static int join_mesh(struct nl80211_state *state, struct nl_cb *cb,
 		argc--;
 	}
 
+	if (argc > 1 && strcmp(argv[0], "beacon-interval") == 0) {
+		argc--;
+		argv++;
+
+		bintval = strtoul(argv[0], &end, 10);
+		if (*end != '\0')
+			return 1;
+
+		NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL, bintval);
+		argv++;
+		argc--;
+	}
+
+	if (argc > 1 && strcmp(argv[0], "dtim-period") == 0) {
+		argc--;
+		argv++;
+
+		dtim_period = strtoul(argv[0], &end, 10);
+		if (*end != '\0')
+			return 1;
+
+		NLA_PUT_U32(msg, NL80211_ATTR_DTIM_PERIOD, dtim_period);
+		argv++;
+		argc--;
+	}
+
 	container = nla_nest_start(msg, NL80211_ATTR_MESH_SETUP);
 	if (!container)
 		return -ENOBUFS;
@@ -431,8 +458,9 @@ static int join_mesh(struct nl80211_state *state, struct nl_cb *cb,
  nla_put_failure:
 	return -ENOBUFS;
 }
-COMMAND(mesh, join, "<mesh ID> [mcast-rate <rate in Mbps>] [vendor_sync on|off]"
-	" [<param>=<value>]*",
+COMMAND(mesh, join, "<mesh ID> [mcast-rate <rate in Mbps>]"
+	" [beacon-interval <time in TUs>] [dtim-period <value>]"
+	" [vendor_sync on|off] [<param>=<value>]*",
 	NL80211_CMD_JOIN_MESH, 0, CIB_NETDEV, join_mesh,
 	"Join a mesh with the given mesh ID with mcast-rate and mesh parameters.");
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] {nl, cfg, mac}80211: set beacon interval and DTIM period on mesh join
  2012-12-06 10:50   ` Johannes Berg
@ 2012-12-07 20:25     ` Thomas Pedersen
  2012-12-07 20:46       ` Marco Porsch
  0 siblings, 1 reply; 6+ messages in thread
From: Thomas Pedersen @ 2012-12-07 20:25 UTC (permalink / raw)
  To: Johannes Berg; +Cc: devel, linux-wireless

On Thu, Dec 6, 2012 at 2:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote:
> On Wed, 2012-12-05 at 14:57 -0800, Thomas Pedersen wrote:
>> On Wed, Dec 5, 2012 at 2:06 PM, Marco Porsch
>> <marco.porsch@etit.tu-chemnitz.de> 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?
>
> That's still ~2 seconds, no?

Yeah I guess those would both be unsuitable for PS anyway, so it's fine as is.

Thomas

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] {nl, cfg, mac}80211: set beacon interval and DTIM period on mesh join
  2012-12-07 20:25     ` Thomas Pedersen
@ 2012-12-07 20:46       ` Marco Porsch
  0 siblings, 0 replies; 6+ messages in thread
From: Marco Porsch @ 2012-12-07 20:46 UTC (permalink / raw)
  To: devel; +Cc: Thomas Pedersen, Johannes Berg, linux-wireless

On 12/07/2012 12:25 PM, Thomas Pedersen wrote:
> On Thu, Dec 6, 2012 at 2:50 AM, Johannes Berg <johannes@sipsolutions.net> wrote:
>> On Wed, 2012-12-05 at 14:57 -0800, Thomas Pedersen wrote:
>>> On Wed, Dec 5, 2012 at 2:06 PM, Marco Porsch
>>> <marco.porsch@etit.tu-chemnitz.de> 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?
>>
>> That's still ~2 seconds, no?
>
> Yeah I guess those would both be unsuitable for PS anyway, so it's fine as is.

Snap, I just see carl9170 has a check for beacon interval and DTIM 
period [1].

I'll change the DTIM period default value.
To my best knowledge, it does not do any difference out of powersave 
mode, and for powersave DTIM period 1 is favourable. Any objections?

--Marco


[1]
/*
  * Therefore a hard limit for the broadcast traffic should
  * prevent false alarms.
  */
if (vif->type != NL80211_IFTYPE_STATION &&
     (bss_conf->beacon_int * bss_conf->dtim_period >=
      (CARL9170_QUEUE_STUCK_TIMEOUT / 2))) {
	err = -EINVAL;
	goto out;
}

(CARL9170_QUEUE_STUCK_TIMEOUT is 5500.)


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-12-07 20:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-05 22:06 [PATCH] {nl,cfg,mac}80211: set beacon interval and DTIM period on mesh join Marco Porsch
2012-12-05 22:57 ` [PATCH] {nl, cfg, mac}80211: " Thomas Pedersen
2012-12-06 10:50   ` Johannes Berg
2012-12-07 20:25     ` Thomas Pedersen
2012-12-07 20:46       ` Marco Porsch
2012-12-07 20:10 ` [RFC] iw: add beacon interval and DTIM period parameters to " Marco Porsch

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).