Currently mesh uses mandatory rates as default basic rates. This patch
introduces basic rates to be configured at the time of joining mesh.

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

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 7319f25..4b65b1f 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -859,6 +859,7 @@ struct mesh_setup {
        bool is_authenticated;
        bool is_secure;
        int mcast_rate[IEEE80211_NUM_BANDS];
+       u32 basic_rates;
 };
 
 /**
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 498c94e..6348a6c 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1499,6 +1499,8 @@ static int copy_mesh_setup(struct ieee80211_if_mesh 
*ifmsh,
        /* mcast rate setting in Mesh Node */
        memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
                                                sizeof(setup->mcast_rate));
+       if (setup->basic_rates)
+               sdata->vif.bss_conf.basic_rates = setup->basic_rates;
 
        return 0;
 }
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index 2b814d5..f72c67d 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -612,9 +612,9 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data 
*sdata)
        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,
-                                         sdata->local->hw.conf.channel->band);
+       if (!sdata->vif.bss_conf.basic_rates)
+               sdata->vif.bss_conf.basic_rates =
+                       ieee80211_mandatory_rates(sdata, band);
        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON |
                                                BSS_CHANGED_BEACON_ENABLED |
                                                BSS_CHANGED_HT |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 7ae54b8..29d3723 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -6063,6 +6063,9 @@ static int nl80211_join_mesh(struct sk_buff *skb, struct 
genl_info *info)
 {
        struct cfg80211_registered_device *rdev = info->user_ptr[0];
        struct net_device *dev = info->user_ptr[1];
+       struct wireless_dev *wdev = dev->ieee80211_ptr;
+       struct wiphy *wiphy = &rdev->wiphy;
+       struct ieee80211_supported_band *sband;
        struct mesh_config cfg;
        struct mesh_setup setup;
        int err;
@@ -6085,6 +6088,20 @@ 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_BSS_BASIC_RATES] &&
+           !WARN_ON(!wdev->preset_chan)) {
+               u8 *rates =
+                       nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
+               int n_rates =
+                       nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
+               sband = wiphy->bands[wdev->preset_chan->band];
+
+               err = ieee80211_get_ratemask(sband, rates, n_rates,
+                                            &setup.basic_rates);
+               if (err)
+                       return err;
+       }
+
        if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
            !nl80211_parse_mcast_rate(rdev, setup.mcast_rate,
                            nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
-- 
1.7.5.4

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

Reply via email to