On Sat, Oct 11, 2008 at 1:51 AM, Johannes Berg <johannes@xxxxxxxxxxxxxxxx> wrote: > Move bss_conf into the vif struct so that drivers can > access it during ->tx without having to store it in > the private data or similar. No driver updates because > this is only for when they want to start using it. What protection should driver take to be sure it won't be changed underneath ? With prive copy you know this is changed only in bss_info changed is called. Thanks Tomas > > Signed-off-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx> > --- > include/net/mac80211.h | 3 +++ > net/mac80211/cfg.c | 6 +++--- > net/mac80211/debugfs_netdev.c | 2 +- > net/mac80211/ieee80211_i.h | 3 --- > net/mac80211/iface.c | 2 +- > net/mac80211/main.c | 8 ++++---- > net/mac80211/mlme.c | 30 +++++++++++++++--------------- > net/mac80211/tx.c | 16 ++++++++-------- > net/mac80211/util.c | 6 +++--- > 9 files changed, 38 insertions(+), 38 deletions(-) > > --- everything.orig/include/net/mac80211.h 2008-10-11 01:46:05.000000000 +0200 > +++ everything/include/net/mac80211.h 2008-10-11 01:46:29.000000000 +0200 > @@ -519,11 +519,14 @@ struct ieee80211_conf { > * use during the life of a virtual interface. > * > * @type: type of this virtual interface > + * @bss_conf: BSS configuration for this interface, either our own > + * or the BSS we're associated to > * @drv_priv: data area for driver use, will always be aligned to > * sizeof(void *). > */ > struct ieee80211_vif { > enum nl80211_iftype type; > + struct ieee80211_bss_conf bss_conf; > /* must be last */ > u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *)))); > }; > --- everything.orig/net/mac80211/ieee80211_i.h 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/ieee80211_i.h 2008-10-11 01:46:29.000000000 +0200 > @@ -440,9 +440,6 @@ struct ieee80211_sub_if_data { > > u16 sequence_number; > > - /* BSS configuration for this interface. */ > - struct ieee80211_bss_conf bss_conf; > - > /* > * AP this belongs to: self in AP mode and > * corresponding AP in VLAN mode, NULL for > --- everything.orig/net/mac80211/main.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/main.c 2008-10-11 01:46:29.000000000 +0200 > @@ -249,15 +249,15 @@ void ieee80211_bss_info_change_notify(st > if (local->ops->bss_info_changed) > local->ops->bss_info_changed(local_to_hw(local), > &sdata->vif, > - &sdata->bss_conf, > + &sdata->vif.bss_conf, > changed); > } > > u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata) > { > - sdata->bss_conf.use_cts_prot = false; > - sdata->bss_conf.use_short_preamble = false; > - sdata->bss_conf.use_short_slot = false; > + sdata->vif.bss_conf.use_cts_prot = false; > + sdata->vif.bss_conf.use_short_preamble = false; > + sdata->vif.bss_conf.use_short_slot = false; > return BSS_CHANGED_ERP_CTS_PROT | > BSS_CHANGED_ERP_PREAMBLE | > BSS_CHANGED_ERP_SLOT; > --- everything.orig/net/mac80211/iface.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/iface.c 2008-10-11 01:46:29.000000000 +0200 > @@ -695,7 +695,7 @@ int ieee80211_if_change_type(struct ieee > ieee80211_setup_sdata(sdata, type); > > /* reset some values that shouldn't be kept across type changes */ > - sdata->bss_conf.basic_rates = > + sdata->vif.bss_conf.basic_rates = > ieee80211_mandatory_rates(sdata->local, > sdata->local->hw.conf.channel->band); > sdata->drop_unencrypted = 0; > --- everything.orig/net/mac80211/mlme.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/mlme.c 2008-10-11 01:46:29.000000000 +0200 > @@ -572,7 +572,7 @@ static void ieee80211_sta_wmm_params(str > static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, > u16 capab, bool erp_valid, u8 erp) > { > - struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf; > + struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; > #ifdef CONFIG_MAC80211_VERBOSE_DEBUG > struct ieee80211_if_sta *ifsta = &sdata->u.sta; > DECLARE_MAC_BUF(mac); > @@ -720,9 +720,9 @@ static void ieee80211_set_associated(str > ifsta->ssid, ifsta->ssid_len); > if (bss) { > /* set timing information */ > - sdata->bss_conf.beacon_int = bss->beacon_int; > - sdata->bss_conf.timestamp = bss->timestamp; > - sdata->bss_conf.dtim_period = bss->dtim_period; > + sdata->vif.bss_conf.beacon_int = bss->beacon_int; > + sdata->vif.bss_conf.timestamp = bss->timestamp; > + sdata->vif.bss_conf.dtim_period = bss->dtim_period; > > changed |= ieee80211_handle_bss_capability(sdata, > bss->capability, bss->has_erp_value, bss->erp_value); > @@ -732,9 +732,9 @@ static void ieee80211_set_associated(str > > if (conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) { > changed |= BSS_CHANGED_HT; > - sdata->bss_conf.assoc_ht = 1; > - sdata->bss_conf.ht_cap = &conf->ht_cap; > - sdata->bss_conf.ht_bss_conf = &conf->ht_bss_conf; > + sdata->vif.bss_conf.assoc_ht = 1; > + sdata->vif.bss_conf.ht_cap = &conf->ht_cap; > + sdata->vif.bss_conf.ht_bss_conf = &conf->ht_bss_conf; > } > > ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET; > @@ -744,7 +744,7 @@ static void ieee80211_set_associated(str > ifsta->last_probe = jiffies; > ieee80211_led_assoc(local, 1); > > - sdata->bss_conf.assoc = 1; > + sdata->vif.bss_conf.assoc = 1; > /* > * For now just always ask the driver to update the basic rateset > * when we have associated, we aren't checking whether it actually > @@ -853,15 +853,15 @@ static void ieee80211_set_disassoc(struc > ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; > changed |= ieee80211_reset_erp_info(sdata); > > - if (sdata->bss_conf.assoc_ht) > + if (sdata->vif.bss_conf.assoc_ht) > changed |= BSS_CHANGED_HT; > > - sdata->bss_conf.assoc_ht = 0; > - sdata->bss_conf.ht_cap = NULL; > - sdata->bss_conf.ht_bss_conf = NULL; > + sdata->vif.bss_conf.assoc_ht = 0; > + sdata->vif.bss_conf.ht_cap = NULL; > + sdata->vif.bss_conf.ht_bss_conf = NULL; > > ieee80211_led_assoc(local, 0); > - sdata->bss_conf.assoc = 0; > + sdata->vif.bss_conf.assoc = 0; > > ieee80211_sta_send_apinfo(sdata, ifsta); > > @@ -1194,7 +1194,7 @@ static void ieee80211_rx_mgmt_assoc_resp > u64 rates, basic_rates; > u16 capab_info, status_code, aid; > struct ieee802_11_elems elems; > - struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf; > + struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; > u8 *pos; > int i, j; > DECLARE_MAC_BUF(mac); > @@ -1337,7 +1337,7 @@ static void ieee80211_rx_mgmt_assoc_resp > } > > sta->sta.supp_rates[local->hw.conf.channel->band] = rates; > - sdata->bss_conf.basic_rates = basic_rates; > + sdata->vif.bss_conf.basic_rates = basic_rates; > > /* cf. IEEE 802.11 9.2.12 */ > if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ && > --- everything.orig/net/mac80211/cfg.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/cfg.c 2008-10-11 01:46:29.000000000 +0200 > @@ -966,16 +966,16 @@ static int ieee80211_change_bss(struct w > return -EINVAL; > > if (params->use_cts_prot >= 0) { > - sdata->bss_conf.use_cts_prot = params->use_cts_prot; > + sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot; > changed |= BSS_CHANGED_ERP_CTS_PROT; > } > if (params->use_short_preamble >= 0) { > - sdata->bss_conf.use_short_preamble = > + sdata->vif.bss_conf.use_short_preamble = > params->use_short_preamble; > changed |= BSS_CHANGED_ERP_PREAMBLE; > } > if (params->use_short_slot_time >= 0) { > - sdata->bss_conf.use_short_slot = > + sdata->vif.bss_conf.use_short_slot = > params->use_short_slot_time; > changed |= BSS_CHANGED_ERP_SLOT; > } > --- everything.orig/net/mac80211/debugfs_netdev.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/debugfs_netdev.c 2008-10-11 01:46:29.000000000 +0200 > @@ -120,7 +120,7 @@ static ssize_t ieee80211_if_fmt_flags( > sdata->u.sta.flags & IEEE80211_STA_AUTHENTICATED ? "AUTH\n" : "", > sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED ? "ASSOC\n" : "", > sdata->u.sta.flags & IEEE80211_STA_PROBEREQ_POLL ? "PROBEREQ POLL\n" : "", > - sdata->bss_conf.use_cts_prot ? "CTS prot\n" : ""); > + sdata->vif.bss_conf.use_cts_prot ? "CTS prot\n" : ""); > } > __IEEE80211_IF_FILE(flags); > > --- everything.orig/net/mac80211/tx.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/tx.c 2008-10-11 01:46:29.000000000 +0200 > @@ -116,7 +116,7 @@ static __le16 ieee80211_duration(struct > if (r->bitrate > txrate->bitrate) > break; > > - if (tx->sdata->bss_conf.basic_rates & BIT(i)) > + if (tx->sdata->vif.bss_conf.basic_rates & BIT(i)) > rate = r->bitrate; > > switch (sband->band) { > @@ -150,7 +150,7 @@ static __le16 ieee80211_duration(struct > * to closest integer */ > > dur = ieee80211_frame_duration(local, 10, rate, erp, > - tx->sdata->bss_conf.use_short_preamble); > + tx->sdata->vif.bss_conf.use_short_preamble); > > if (next_frag_len) { > /* Frame is fragmented: duration increases with time needed to > @@ -159,7 +159,7 @@ static __le16 ieee80211_duration(struct > /* next fragment */ > dur += ieee80211_frame_duration(local, next_frag_len, > txrate->bitrate, erp, > - tx->sdata->bss_conf.use_short_preamble); > + tx->sdata->vif.bss_conf.use_short_preamble); > } > > return cpu_to_le16(dur); > @@ -465,7 +465,7 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 > } else > info->control.retries[0].rate_idx = -1; > > - if (tx->sdata->bss_conf.use_cts_prot && > + if (tx->sdata->vif.bss_conf.use_cts_prot && > (tx->flags & IEEE80211_TX_FRAGMENTED) && (rsel.nonerp_idx >= 0)) { > tx->last_frag_rate_idx = tx->rate_idx; > if (rsel.probe_idx >= 0) > @@ -531,7 +531,7 @@ ieee80211_tx_h_misc(struct ieee80211_tx_ > if ((tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) && > (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_ERP_G) && > (tx->flags & IEEE80211_TX_UNICAST) && > - tx->sdata->bss_conf.use_cts_prot && > + tx->sdata->vif.bss_conf.use_cts_prot && > !(info->flags & IEEE80211_TX_CTL_USE_RTS_CTS)) > info->flags |= IEEE80211_TX_CTL_USE_CTS_PROTECT; > > @@ -540,7 +540,7 @@ ieee80211_tx_h_misc(struct ieee80211_tx_ > * available on the network at the current point in time. */ > if (ieee80211_is_data(hdr->frame_control) && > (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) && > - tx->sdata->bss_conf.use_short_preamble && > + tx->sdata->vif.bss_conf.use_short_preamble && > (!tx->sta || test_sta_flags(tx->sta, WLAN_STA_SHORT_PREAMBLE))) { > info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; > } > @@ -560,7 +560,7 @@ ieee80211_tx_h_misc(struct ieee80211_tx_ > for (idx = 0; idx < sband->n_bitrates; idx++) { > if (sband->bitrates[idx].bitrate > rate->bitrate) > continue; > - if (tx->sdata->bss_conf.basic_rates & BIT(idx) && > + if (tx->sdata->vif.bss_conf.basic_rates & BIT(idx) && > (baserate < 0 || > (sband->bitrates[baserate].bitrate > < sband->bitrates[idx].bitrate))) > @@ -1981,7 +1981,7 @@ struct sk_buff *ieee80211_beacon_get(str > info->flags |= IEEE80211_TX_CTL_NO_ACK; > info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; > info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; > - if (sdata->bss_conf.use_short_preamble && > + if (sdata->vif.bss_conf.use_short_preamble && > sband->bitrates[rsel.rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) > info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; > > --- everything.orig/net/mac80211/util.c 2008-10-11 01:46:05.000000000 +0200 > +++ everything/net/mac80211/util.c 2008-10-11 01:46:29.000000000 +0200 > @@ -239,7 +239,7 @@ __le16 ieee80211_generic_frame_duration( > erp = 0; > if (vif) { > sdata = vif_to_sdata(vif); > - short_preamble = sdata->bss_conf.use_short_preamble; > + short_preamble = sdata->vif.bss_conf.use_short_preamble; > if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) > erp = rate->flags & IEEE80211_RATE_ERP_G; > } > @@ -272,7 +272,7 @@ __le16 ieee80211_rts_duration(struct iee > erp = 0; > if (vif) { > sdata = vif_to_sdata(vif); > - short_preamble = sdata->bss_conf.use_short_preamble; > + short_preamble = sdata->vif.bss_conf.use_short_preamble; > if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) > erp = rate->flags & IEEE80211_RATE_ERP_G; > } > @@ -312,7 +312,7 @@ __le16 ieee80211_ctstoself_duration(stru > erp = 0; > if (vif) { > sdata = vif_to_sdata(vif); > - short_preamble = sdata->bss_conf.use_short_preamble; > + short_preamble = sdata->vif.bss_conf.use_short_preamble; > if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) > erp = rate->flags & IEEE80211_RATE_ERP_G; > } > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html