/** * struct iwl_mld_rxq_dup_data - Duplication detection data, per STA & Rx queue * @last_seq: last sequence per tid. * @last_sub_frame_idx: the index of the last subframe in an A-MSDU. This value * will be zero if the packet is not part of an A-MSDU.
*/ struct iwl_mld_rxq_dup_data {
__le16 last_seq[IWL_MAX_TID_COUNT + 1];
u8 last_sub_frame_idx[IWL_MAX_TID_COUNT + 1];
} ____cacheline_aligned_in_smp;
/** * struct iwl_mld_link_sta - link-level station * * This represents the link-level sta - the driver level equivalent to the * ieee80211_link_sta * * @last_rate_n_flags: rate_n_flags from the last &iwl_tlc_update_notif * @signal_avg: the signal average coming from the firmware * @in_fw: whether the link STA is uploaded to the FW (false during restart) * @rcu_head: RCU head for freeing this object * @fw_id: the FW id of this link sta.
*/ struct iwl_mld_link_sta { /* Add here fields that need clean up on restart */
struct_group(zeroed_on_hw_restart,
u32 last_rate_n_flags; bool in_fw;
s8 signal_avg;
); /* And here fields that survive a fw restart */ struct rcu_head rcu_head;
u32 fw_id;
};
/* struct iwl_mld_ptk_pn - Holds Packet Number (PN) per TID. * @rcu_head: RCU head for freeing this data. * @pn: Array storing PN for each TID.
*/ struct iwl_mld_ptk_pn { struct rcu_head rcu_head; struct {
u8 pn[IWL_MAX_TID_COUNT][IEEE80211_CCMP_PN_LEN];
} ____cacheline_aligned_in_smp q[];
};
/** * struct iwl_mld_per_link_mpdu_counter - per-link TX/RX MPDU counters * * @tx: Number of TX MPDUs. * @rx: Number of RX MPDUs.
*/ struct iwl_mld_per_link_mpdu_counter {
u32 tx;
u32 rx;
};
/** * struct iwl_mld_per_q_mpdu_counter - per-queue MPDU counter * * @lock: Needed to protect the counters when modified from statistics. * @per_link: per-link counters. * @window_start_time: timestamp of the counting-window start
*/ struct iwl_mld_per_q_mpdu_counter {
spinlock_t lock; struct iwl_mld_per_link_mpdu_counter per_link[IWL_FW_MAX_LINK_ID + 1]; unsignedlong window_start_time;
} ____cacheline_aligned_in_smp;
/** * struct iwl_mld_sta - representation of a station in the driver. * * This represent the MLD-level sta, and will not be added to the FW. * Embedded in ieee80211_sta. * * @vif: pointer the vif object. * @sta_state: station state according to enum %ieee80211_sta_state * @sta_type: type of this station. See &enum iwl_fw_sta_type * @mld: a pointer to the iwl_mld object * @dup_data: per queue duplicate packet detection data * @data_tx_ant: stores the last TX antenna index; used for setting * TX rate_n_flags for injected data frames (toggles on every TX failure). * @tid_to_baid: a simple map of TID to Block-Ack fw id * @deflink: This holds the default link STA information, for non MLO STA all * link specific STA information is accessed through @deflink or through * link[0] which points to address of @deflink. For MLO Link STA * the first added link STA will point to deflink. * @link: reference to Link Sta entries. For Non MLO STA, except 1st link, * i.e link[0] all links would be assigned to NULL by default and * would access link information via @deflink or link[0]. For MLO * STA, first link STA being added will point its link pointer to * @deflink address and remaining would be allocated and the address * would be assigned to link[link_id] where link_id is the id assigned * by the AP. * @ptk_pn: Array of pointers to PTK PN data, used to track the Packet Number * per key index and per queue (TID). * @mpdu_counters: RX/TX MPDUs counters for each queue.
*/ struct iwl_mld_sta { /* Add here fields that need clean up on restart */
struct_group(zeroed_on_hw_restart, enum ieee80211_sta_state sta_state; enum iwl_fw_sta_type sta_type;
); /* And here fields that survive a fw restart */ struct iwl_mld *mld; struct ieee80211_vif *vif; struct iwl_mld_rxq_dup_data *dup_data;
u8 tid_to_baid[IWL_MAX_TID_COUNT];
u8 data_tx_ant;
if (!ieee80211_vif_is_mld(mld_sta->vif)) { /* not an MLD STA; only has the deflink with ID zero */
WARN_ON(link_id); continue;
}
if (mld_sta->vif->active_links & BIT(link_id)) continue;
/* Should not happen as link removal should always succeed */
WARN_ON(1);
RCU_INIT_POINTER(mld_sta->link[link_id], NULL);
RCU_INIT_POINTER(mld_sta->mld->fw_id_to_link_sta[mld_link_sta->fw_id],
NULL); if (mld_link_sta != &mld_sta->deflink)
kfree_rcu(mld_link_sta, rcu_head);
}
/** * struct iwl_mld_int_sta - representation of an internal station * (a station that exist in FW and in driver, but not in mac80211) * * @sta_id: the index of the station in the fw * @queue_id: the if of the queue used by the station * @sta_type: station type. One of &iwl_fw_sta_type
*/ struct iwl_mld_int_sta {
u8 sta_id;
u32 queue_id; enum iwl_fw_sta_type sta_type;
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.