RFC: Store premable and g-mode flags in ieee80211_tx_info
This way, you don't need to pass vif to ieee80211_rts_duration.
include/net/mac80211.h +4 -0
@@ -321,6 +321,8 @@ struct ieee80211_bss_conf {* @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this * frame and selects the maximum number of streams that it can use. +* @IEEE80211_TX_SHORT_PREAMBLE: Sdata->vif is configured for short_preamble. +* @IEEE80211_TX_GMODE: Sdata is configured for GMode. * * Note: If you have to add new flags to the enumeration, then don't * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
@@ -349,6 +351,8 @@ enum mac80211_tx_control_flags {IEEE80211_TX_INTFL_NL80211_FRAME_TX =BIT (21 ),IEEE80211_TX_CTL_LDPC =BIT (22 ),IEEE80211_TX_CTL_STBC =BIT (23 ) |BIT (24 ), +IEEE80211_TX_SHORT_PREABLE =BIT (25 ), + IEEE80211_TX_GMODE = BIT(26), };#define IEEE80211_TX_CTL_STBC_SHIFT 23
net/mac80211/tx.c +8 -0
@@ -1264,6 +1264,14 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, } info->flags |=IEEE80211_TX_CTL_FIRST_FRAGMENT ; +/* Set this here so drivers don't need to reference vif +* when calling ieee80211_rts_duration +*/ +if (sdata->vif.bss_conf.use_short_preamble) + tx.flags |=IEEE80211_TX_SHORT_PREABLE ; +if (sdata->flags &IEEE80211_SDATA_OPERATING_GMODE ) + tx.flags |= IEEE80211_TX_GMODE +return TX_CONTINUE ; }
net/mac80211/util.c +4 -0
@@ -209,6 +209,10 @@ __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, short_preamble = sdata->vif.bss_conf.use_short_preamble;if (sdata->flags &IEEE80211_SDATA_OPERATING_GMODE ) erp = rate->flags &IEEE80211_RATE_ERP_G ; + }else { + short_preamble = !!(frame_txctl->flags &IEEE80211_TX_SHORT_PREABLE ); +if (frame_txctl->flags &IEEE80211_TX_GMODE ) + erp = rate->flags &IEEE80211_RATE_ERP_G ; }/* CTS duration */
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Johannes Berg
maintainerQuoted 6 lines · Ben Greear
This way, you don't need to pass vif to
ieee80211_rts_duration.
net/mac80211/tx.c ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, · line 1273
Quoted 10 lines
net/mac80211/tx.c +7
-0@@ -1264,6 +1264,14 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, } info->flags |=IEEE80211_TX_CTL_FIRST_FRAGMENT ; +/* Set this here so drivers don't need to reference vif +* when calling ieee80211_rts_duration +*/ +if (sdata->vif.bss_conf.use_short_preamble) + tx.flags |=IEEE80211_TX_SHORT_PREABLE ; +if (sdata->flags &IEEE80211_SDATA_OPERATING_GMODE ) + tx.flags |=IEEE80211_TX_GMODE
Don't understand -- tx.flags? Drivers don't reference that? How would a driver use this?
johannes
Quoted 10 lines · Johannes Berg
Quoted 9 lines · Ben Greear
This way, you don't need to pass vif to
ieee80211_rts_duration.net/mac80211/tx.c +0
-0@@ -1264,6 +1264,14 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, } info->flags |=IEEE80211_TX_CTL_FIRST_FRAGMENT ;
Quoted 10 lines
net/mac80211/tx.c ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, · line 1273
Quoted 7 lines
net/mac80211/tx.c +7
-0+/* Set this here so drivers don't need to reference vif +* when calling ieee80211_rts_duration +*/ +if (sdata->vif.bss_conf.use_short_preamble) + tx.flags |=IEEE80211_TX_SHORT_PREABLE ; +if (sdata->flags&IEEE80211_SDATA_OPERATING_GMODE ) + tx.flags |=IEEE80211_TX_GMODE Don't understand -- tx.flags? Drivers don't reference that? How would a driver use this?
Sorry, it should be info->flags,
and missing a semi-colon...I guess I forgot to compile :P
Anyway, the reason is that the driver may not know the VIF (and
vif may be deleted) when calling the ieee80211_rts_duration, so it needs to be stored in the tx_info structure.
Thanks,
Ben
Quoted 2 lines
johannes
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Johannes Berg
maintainerQuoted 3 lines · Ben Greear
Anyway, the reason is that the driver may not know the VIF (and
vif may be deleted) when calling theieee80211_rts_duration, so it needs to be stored in thetx_infostructure.
But the vif pointer in the tx_info structure is valid during the entire tx() call, why would you need to call rts_duration during TX status?
johannes
Quoted 8 lines · Johannes Berg
Quoted 3 lines · Ben Greear
Anyway, the reason is that the driver may not know the VIF (and
vif may be deleted) when calling theieee80211_rts_duration, so it needs to be stored in thetx_infostructure.But the vif pointer in the
tx_infostructure is valid during the entiretx()call, why would you need to callrts_durationduring TX status?
Err, I guess you are right. I was thinking it might retransmit sometime later, but at least ath5k doesn't appear to do this.
I'll remove that part of the patch unless someone thinks of a reason to keep it.
Thanks,
Ben
Quoted 2 lines
johannes
Signature · 2 lines
Ben Greear <[email protected]> Candela Technologies Inc http://www.candelatech.com
Johannes Berg
maintainerQuoted 7 lines · Ben Greear
Quoted 6 lines · Johannes Berg
Quoted 3 lines · Ben Greear
Anyway, the reason is that the driver may not know the VIF (and
vif may be deleted) when calling theieee80211_rts_duration, so it needs to be stored in thetx_infostructure.
Quoted 5 lines
Quoted 2 lines
But the vif pointer in the
tx_infostructure is valid during the entiretx()call, why would you need to callrts_durationduring TX status?Err, I guess you are right. I was thinking it might retransmit sometime later, but at least ath5k doesn't appear to do this.
mac80211 has retransmit support, but that'll go through TX with a valid vif pointer again ...
johannes