This is great! We will even have better throughput in 2.4GHz. Will give it a try later.
--- Chun-Yeow On Sat, Jan 26, 2013 at 9:52 AM, Thomas Pedersen <[email protected]> wrote: > The standard mandates mesh STAs to set the ERP Short Slot > Time capability info bit in beacons to 0. Even though this > is their way of disallowing short slot time for mesh STAs, > there should be no harm in enabling it if we determine all > STAs in the current MBSS support ERP rates. > > Increases throughput about 20% for legacy rates. > > Signed-off-by: Thomas Pedersen <[email protected]> > --- > > Applies on mac80211-next/master. > > net/mac80211/mesh.c | 5 ---- > net/mac80211/mesh_plink.c | 66 > +++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 66 insertions(+), 5 deletions(-) > > diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c > index 694e273..f920da1 100644 > --- a/net/mac80211/mesh.c > +++ b/net/mac80211/mesh.c > @@ -629,11 +629,6 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data > *sdata) > sdata->vif.bss_conf.basic_rates = > ieee80211_mandatory_rates(local, band); > > - if (band == IEEE80211_BAND_5GHZ) { > - sdata->vif.bss_conf.use_short_slot = true; > - changed |= BSS_CHANGED_ERP_SLOT; > - } > - > ieee80211_bss_info_change_notify(sdata, changed); > > netif_carrier_on(sdata->dev); > diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c > index 4e1d406..6775fa4 100644 > --- a/net/mac80211/mesh_plink.c > +++ b/net/mac80211/mesh_plink.c > @@ -55,6 +55,69 @@ static inline void mesh_plink_fsm_restart(struct sta_info > *sta) > sta->plink_retries = 0; > } > > +/* > + * mesh_set_short_slot_time - enable / disable ERP short slot time. > + * > + * The standard indirectly mandates mesh STAs to turn off short slot time by > + * disallowing advertising this (802.11-2012 8.4.1.4), but that doesn't mean > we > + * can't be sneaky about it. Enable short slot time if all mesh STAs in the > + * MBSS support ERP rates. > + * > + * Returns BSS_CHANGED_ERP_SLOT or 0 for no change. > + */ > +static u32 mesh_set_short_slot_time(struct ieee80211_sub_if_data *sdata) > +{ > + struct ieee80211_local *local = sdata->local; > + enum ieee80211_band band = ieee80211_get_sdata_band(sdata); > + struct ieee80211_rate *bitrates; > + struct ieee80211_supported_band *sband; > + struct sta_info *sta; > + u32 rates, changed = 0; > + int i; > + bool short_slot = false; > + > + if (band == IEEE80211_BAND_5GHZ) { > + /* (IEEE 802.11-2012 19.4.5) */ > + short_slot = true; > + goto out; > + } else if (band != IEEE80211_BAND_2GHZ || > + (band == IEEE80211_BAND_2GHZ && > + local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE)) > + goto out; > + > + sband = local->hw.wiphy->bands[band]; > + bitrates = sband->bitrates; > + > + rcu_read_lock(); > + list_for_each_entry_rcu(sta, &local->sta_list, list) { > + if (sdata != sta->sdata || > + sta->plink_state != NL80211_PLINK_ESTAB) > + continue; > + > + rates = sta->sta.supp_rates[band]; > + for_each_set_bit(i, (unsigned long *)&rates, > + sizeof(rates) * BITS_PER_BYTE) { > + if (bitrates[i].flags & IEEE80211_RATE_ERP_G) { > + short_slot = true; > + break; > + } > + } > + > + if (!short_slot) > + break; > + } > + rcu_read_unlock(); > + > +out: > + if (sdata->vif.bss_conf.use_short_slot != short_slot) { > + sdata->vif.bss_conf.use_short_slot = short_slot; > + changed = BSS_CHANGED_ERP_SLOT; > + mpl_dbg(sdata, "mesh_plink %pM: ERP short slot time %d\n", > + sdata->vif.addr, short_slot); > + } > + return changed; > +} > + > /** > * mesh_set_ht_prot_mode - set correct HT protection mode > * > @@ -894,6 +957,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data > *sdata, struct ieee80211_m > spin_unlock_bh(&sta->lock); > changed |= mesh_plink_inc_estab_count(sdata); > changed |= mesh_set_ht_prot_mode(sdata); > + changed |= mesh_set_short_slot_time(sdata); > mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n", > sta->sta.addr); > break; > @@ -929,6 +993,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data > *sdata, struct ieee80211_m > spin_unlock_bh(&sta->lock); > changed |= mesh_plink_inc_estab_count(sdata); > changed |= mesh_set_ht_prot_mode(sdata); > + changed |= mesh_set_short_slot_time(sdata); > mpl_dbg(sdata, "Mesh plink with %pM ESTABLISHED\n", > sta->sta.addr); > mesh_plink_frame_tx(sdata, > @@ -952,6 +1017,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data > *sdata, struct ieee80211_m > mod_plink_timer(sta, mshcfg->dot11MeshHoldingTimeout); > spin_unlock_bh(&sta->lock); > changed |= mesh_set_ht_prot_mode(sdata); > + changed |= mesh_set_short_slot_time(sdata); > mesh_plink_frame_tx(sdata, WLAN_SP_MESH_PEERING_CLOSE, > sta->sta.addr, llid, plid, > reason); > break; > -- > 1.7.10.4 > > _______________________________________________ > 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
