Skip to contentSkip to conversation

RFC: Store premable and g-mode flags in ieee80211_tx_info

PATCH Ben Greear 2 participants 6 messages Sep 28, 2010 mac80211

lore
Share & tools
lore

Ben Greear

author
#0 lore raw

This way, you don't need to pass vif to ieee80211_rts_duration.

include/net/mac80211.h +4 -0
index fe8b9da..5d3de80 100644
@@ -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
index e1733dc..0ed22b5 100644
@@ -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
index aba025d..bd2227d 100644
@@ -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
maintainer
#1 lore raw
Quoted 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

author
#2 lore raw
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
maintainer
#3 lore raw
Quoted 3 lines · Ben Greear

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.

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

author
#4 lore raw
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 the ieee80211_rts_duration, so it needs to be stored in the tx_info structure.

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?

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
maintainer
#5 lore raw
Quoted 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 the ieee80211_rts_duration, so it needs to be stored in the tx_info structure.

Quoted 5 lines
Quoted 2 lines

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?

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