File Index
Files and directories
Sign in
FILE

agg.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/intel/iwlwifi/mld/agg.h C
  1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
  2/*
  3 * Copyright (C) 2024 Intel Corporation
  4 */
  5#ifndef __iwl_agg_h__
  6#define __iwl_agg_h__
  7
  8#include "mld.h"
  9#include "fw/api/rx.h"
 10
 11/**
 12 * struct iwl_mld_reorder_buffer - per ra/tid/queue reorder buffer
 13 * @head_sn: reorder window head sequence number
 14 * @num_stored: number of MPDUs stored in the buffer
 15 * @queue: queue of this reorder buffer
 16 * @valid: true if reordering is valid for this queue
 17 */
 18struct iwl_mld_reorder_buffer {
 19	u16 head_sn;
 20	u16 num_stored;
 21	int queue;
 22	bool valid;
 23} ____cacheline_aligned_in_smp;
 24
 25/**
 26 * struct iwl_mld_reorder_buf_entry - reorder buffer entry per-queue/per-seqno
 27 * @frames: list of skbs stored. a list is necessary because in an A-MSDU,
 28 *	all sub-frames share the same sequence number, so they are stored
 29 *	together in the same list.
 30 */
 31struct iwl_mld_reorder_buf_entry {
 32	struct sk_buff_head frames;
 33}
 34#ifndef __CHECKER__
 35/* sparse doesn't like this construct: "bad integer constant expression" */
 36__aligned(roundup_pow_of_two(sizeof(struct sk_buff_head)))
 37#endif
 38;
 39
 40/**
 41 * struct iwl_mld_baid_data - Block Ack session data
 42 * @rcu_head: RCU head for freeing this data
 43 * @sta_mask: station mask for the BAID
 44 * @tid: tid of the session
 45 * @baid: baid of the session
 46 * @buf_size: the reorder buffer size as set by the last ADDBA request
 47 * @entries_per_queue: number of buffers per queue, this actually gets
 48 *	aligned up to avoid cache line sharing between queues
 49 * @timeout: the timeout value specified in the ADDBA request.
 50 * @last_rx_timestamp: timestamp of the last received packet (in jiffies). This
 51 *	value is updated only when the configured @timeout has passed since
 52 *	the last update to minimize cache bouncing between RX queues.
 53 * @session_timer: timer is set to expire after 2 * @timeout (since we want
 54 *	to minimize the cache bouncing by updating @last_rx_timestamp only once
 55 *	after @timeout has passed). If no packets are received within this
 56 *	period, it informs mac80211 to initiate delBA flow, terminating the
 57 *	BA session.
 58 * @rcu_ptr: BA data RCU protected access
 59 * @mld: mld pointer, needed for timer context
 60 * @reorder_buf: reorder buffer, allocated per queue
 61 * @entries: data
 62 */
 63struct iwl_mld_baid_data {
 64	struct rcu_head rcu_head;
 65	u32 sta_mask;
 66	u8 tid;
 67	u8 baid;
 68	u16 buf_size;
 69	u16 entries_per_queue;
 70	u16 timeout;
 71	struct timer_list session_timer;
 72	unsigned long last_rx_timestamp;
 73	struct iwl_mld_baid_data __rcu **rcu_ptr;
 74	struct iwl_mld *mld;
 75	struct iwl_mld_reorder_buffer reorder_buf[IWL_MAX_RX_HW_QUEUES];
 76	struct iwl_mld_reorder_buf_entry entries[] ____cacheline_aligned_in_smp;
 77};
 78
 79/**
 80 * struct iwl_mld_delba_data - RX queue sync data for %IWL_MLD_RXQ_NOTIF_DEL_BA
 81 *
 82 * @baid: Block Ack id, used to identify the BA session to be removed
 83 */
 84struct iwl_mld_delba_data {
 85	u32 baid;
 86} __packed;
 87
 88/**
 89 * enum iwl_mld_reorder_result - Possible return values for iwl_mld_reorder()
 90 * indicating how the caller should handle the skb based on the result.
 91 *
 92 * @IWL_MLD_PASS_SKB: skb should be passed to upper layer.
 93 * @IWL_MLD_BUFFERED_SKB: skb has been buffered, don't pass it to upper layer.
 94 * @IWL_MLD_DROP_SKB: skb should be dropped and freed by the caller.
 95 */
 96enum iwl_mld_reorder_result {
 97	IWL_MLD_PASS_SKB,
 98	IWL_MLD_BUFFERED_SKB,
 99	IWL_MLD_DROP_SKB
100};
101
102int iwl_mld_ampdu_rx_start(struct iwl_mld *mld, struct ieee80211_sta *sta,
103			   int tid, u16 ssn, u16 buf_size, u16 timeout);
104int iwl_mld_ampdu_rx_stop(struct iwl_mld *mld, struct ieee80211_sta *sta,
105			  int tid);
106
107enum iwl_mld_reorder_result
108iwl_mld_reorder(struct iwl_mld *mld, struct napi_struct *napi,
109		int queue, struct ieee80211_sta *sta,
110		struct sk_buff *skb, struct iwl_rx_mpdu_desc *desc);
111
112void iwl_mld_handle_frame_release_notif(struct iwl_mld *mld,
113					struct napi_struct *napi,
114					struct iwl_rx_packet *pkt, int queue);
115void iwl_mld_handle_bar_frame_release_notif(struct iwl_mld *mld,
116					    struct napi_struct *napi,
117					    struct iwl_rx_packet *pkt,
118					    int queue);
119
120void iwl_mld_del_ba(struct iwl_mld *mld, int queue,
121		    struct iwl_mld_delba_data *data);
122
123int iwl_mld_update_sta_baids(struct iwl_mld *mld,
124			     u32 old_sta_mask,
125			     u32 new_sta_mask);
126
127#endif /* __iwl_agg_h__ */
~/ Read-only file preview.