wifi: mac80211: rework ack_frame_id handling a bit
authorJohannes Berg <johannes.berg@intel.com>
Mon, 28 Aug 2023 13:09:24 +0000 (15:09 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 11 Sep 2023 09:27:18 +0000 (11:27 +0200)
Take one more free bit to indicate it's IDR vs. internal
usage, to be able to carve out some bits here for other
internal usage, other than IDR handling with a full ACK
SKB, that is.

Reviewed-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/ieee80211_i.h
net/mac80211/status.c
net/mac80211/tx.c

index 7c707358d15c8116cb2fb4dcd2d172e79c6c436d..7f3b6f00f8a2c0346e9ddc501315eb2c6a9e232d 100644 (file)
@@ -1115,7 +1115,9 @@ ieee80211_rate_get_vht_nss(const struct ieee80211_tx_rate *rate)
  *     not valid if the interface is an MLD since we won't know which
  *     link the frame will be transmitted on
  * @hw_queue: HW queue to put the frame on, skb_get_queue_mapping() gives the AC
- * @ack_frame_id: internal frame ID for TX status, used internally
+ * @status_data: internal data for TX status handling, assigned privately,
+ *     see also &enum ieee80211_status_data for the internal documentation
+ * @status_data_idr: indicates status data is IDR allocated ID for ack frame
  * @tx_time_est: TX time estimate in units of 4us, used internally
  * @control: union part for control data
  * @control.rates: TX rates array to try
@@ -1155,10 +1157,11 @@ struct ieee80211_tx_info {
        /* common information */
        u32 flags;
        u32 band:3,
-           ack_frame_id:13,
+           status_data_idr:1,
+           status_data:13,
            hw_queue:4,
            tx_time_est:10;
-       /* 2 free bits */
+       /* 1 free bit */
 
        union {
                struct {
index 45e7a5d9c7d94206f1af8f5ecf142d156deb6797..29a6da5ee77f084f5ca65048309227909b83c146 100644 (file)
@@ -4034,7 +4034,8 @@ int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
                return -ENOMEM;
        }
 
-       IEEE80211_SKB_CB(skb)->ack_frame_id = id;
+       IEEE80211_SKB_CB(skb)->status_data_idr = 1;
+       IEEE80211_SKB_CB(skb)->status_data = id;
 
        *cookie = ieee80211_mgmt_tx_cookie(local);
        IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie;
index 06bd406846d2984c3acbdadcaf1cc9c465678b66..7b74cf96ee0a17e1230943764d322beb6db18487 100644 (file)
@@ -85,6 +85,11 @@ extern const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS];
 
 #define IEEE80211_MAX_NAN_INSTANCE_ID 255
 
+enum ieee80211_status_data {
+       IEEE80211_STATUS_TYPE_MASK      = 0x00f,
+       IEEE80211_STATUS_TYPE_INVALID   = 0,
+       IEEE80211_STATUS_SUBDATA_MASK   = 0xff0,
+};
 
 /*
  * Keep a station's queues on the active list for deficit accounting purposes
index 44d83da60aee4475466fa87dcd00192cf2b1a5b3..f24aceb59db0d3a4ce7be5c9c4a1832f69d57009 100644 (file)
@@ -633,7 +633,7 @@ static void ieee80211_report_ack_skb(struct ieee80211_local *local,
        unsigned long flags;
 
        spin_lock_irqsave(&local->ack_status_lock, flags);
-       skb = idr_remove(&local->ack_status_frames, info->ack_frame_id);
+       skb = idr_remove(&local->ack_status_frames, info->status_data);
        spin_unlock_irqrestore(&local->ack_status_lock, flags);
 
        if (!skb)
@@ -759,7 +759,7 @@ static void ieee80211_report_used_skb(struct ieee80211_local *local,
                }
 
                rcu_read_unlock();
-       } else if (info->ack_frame_id) {
+       } else if (info->status_data_idr) {
                ieee80211_report_ack_skb(local, skb, acked, dropped,
                                         ack_hwtstamp);
        }
index 3a5b41c2ee3d18dd573ce2d429fed0b0c712c22b..ae33f727c6a8b2fdc46e74048502db46324cb479 100644 (file)
@@ -2942,7 +2942,10 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
        memset(info, 0, sizeof(*info));
 
        info->flags = info_flags;
-       info->ack_frame_id = info_id;
+       if (info_id) {
+               info->status_data = info_id;
+               info->status_data_idr = 1;
+       }
        info->band = band;
 
        if (likely(!cookie)) {
@@ -4639,9 +4642,12 @@ static void ieee80211_8023_xmit(struct ieee80211_sub_if_data *sdata,
        }
 
        if (unlikely(skb->sk &&
-                    skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS))
-               info->ack_frame_id = ieee80211_store_ack_skb(local, skb,
-                                                            &info->flags, NULL);
+                    skb_shinfo(skb)->tx_flags & SKBTX_WIFI_STATUS)) {
+               info->status_data = ieee80211_store_ack_skb(local, skb,
+                                                           &info->flags, NULL);
+               if (info->status_data)
+                       info->status_data_idr = 1;
+       }
 
        dev_sw_netstats_tx_add(dev, skbs, len);
        sta->deflink.tx_stats.packets[queue] += skbs;