From 4bb62344e4703414fd253ceb07c163ac37da80d4 Mon Sep 17 00:00:00 2001 From: Chun-Yeow Yeoh Date: Thu, 24 Nov 2011 17:15:20 -0800 Subject: [PATCH] {nl,cfg,mac}80211: Allow Setting Multicast Rate in Mesh Signed-off-by: Chun-Yeow Yeoh Signed-off-by: Thomas Pedersen Signed-off-by: John W. Linville --- include/net/cfg80211.h | 2 ++ net/mac80211/cfg.c | 6 ++++++ net/mac80211/tx.c | 1 + net/wireless/nl80211.c | 5 +++++ 4 files changed, 14 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 38ce452da20..232d1a5c567 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -802,6 +802,7 @@ struct mesh_config { * @ie_len: length of vendor information elements * @is_authenticated: this mesh requires authentication * @is_secure: this mesh uses security + * @mcast_rate: multicat rate for Mesh Node [6Mbps is the default for 802.11a] * * These parameters are fixed when the mesh is created. */ @@ -814,6 +815,7 @@ struct mesh_setup { u8 ie_len; bool is_authenticated; bool is_secure; + int mcast_rate[IEEE80211_NUM_BANDS]; }; /** diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index a29f06c0bcf..7ccba83dc8c 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -1195,6 +1195,8 @@ static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh, { u8 *new_ie; const u8 *old_ie; + struct ieee80211_sub_if_data *sdata = container_of(ifmsh, + struct ieee80211_sub_if_data, u.mesh); /* allocate information elements */ new_ie = NULL; @@ -1221,6 +1223,10 @@ static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh, if (setup->is_secure) ifmsh->security |= IEEE80211_MESH_SEC_SECURED; + /* mcast rate setting in Mesh Node */ + memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate, + sizeof(setup->mcast_rate)); + return 0; } diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 5a75fc02080..655e3a97f92 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -640,6 +640,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) else txrc.max_rate_idx = fls(txrc.rate_idx_mask) - 1; txrc.bss = (tx->sdata->vif.type == NL80211_IFTYPE_AP || + tx->sdata->vif.type == NL80211_IFTYPE_MESH_POINT || tx->sdata->vif.type == NL80211_IFTYPE_ADHOC); /* set up RTS protection if desired */ diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 6026c29c338..5699c3b1aba 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -5667,6 +5667,11 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info) setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]); setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]); + if (info->attrs[NL80211_ATTR_MCAST_RATE] && + !nl80211_parse_mcast_rate(rdev, setup.mcast_rate, + nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]))) + return -EINVAL; + if (info->attrs[NL80211_ATTR_MESH_SETUP]) { /* parse additional setup parameters if given */ err = nl80211_parse_mesh_setup(info, &setup); -- 2.39.2