Current implementation of NL80211_CMD_GET_STATION does not work for multi-link operation(MLO) since in case of MLO only deflink (or one of the links) is considered and not all links. Hence, add the link_sinfo structure to provide infrastructure for link-level station statistics for multi-link operation(MLO). Additionally, accumulated stats for MLO are included in a concise manner to provide a comprehensive overview of the ML stations. NOTE: 1. Current code changes are done to get an early feedback on design. 2. Once RFC patches are approved will add the required driver changes. 3. Ath12k changes are included in this series for reference to other driver changes. Current flow: +-------------------------+ | From userspace - | | NL80211_CMD_GET_STATION | | | +-------------------------+ | | +---------------------------------------+ | nl80211_get_station() | | | | 1. Locally define sinfo | | 2. call cfg80211 ops - .get_station() | +---------------------------------------+ | | +-------------------------------------------+ | sta_set_sinfo() | | 1. call mac80211 ops - .sta_statistics() | | to fill sinfo structure | | 2. fill remaining sinfo structure, if | | not filled from driver | +-------------------------------------------+ Proposed flow: (Changes in last block) +-------------------------+ | From userspace - | | NL80211_CMD_GET_STATION | | | +-------------------------+ | | +---------------------------------------+ | nl80211_get_station() | | | | 1. Locally define sinfo | | 2. call cfg80211 ops - .get_station() | +---------------------------------------+ | | +----------------------------------------------------------+ | sta_set_sinfo() | | 1. fill sinfo structure- info related to station | | 2. if MLO | | a. call sta_set_link_sinfo() for each valid link | | i. Call mac80211 ops- .link_sta_statistics() | | to fill link_sinfo structure | | ii. fill remaining link_sinfo structure | | b. call sta_set_mld_info()- to fill accumulated | | stats at MLO level | | 3. if non-ML | | a. call sta_set_link_sinfo() for deflink | | i. Call mac80211 ops - .link_sta_statistics() | | to fill deflink link_sinfo structure | | ii. fill remaining link_sinfo structure | +----------------------------------------------------------+ Alternate approach: - Keep sinfo structure as it is and use this for non-ML or accumulated statistics for ML station. - Add link sinfo for links with only certain link specific statistics. - Keep mac_op_sta_statistics at MLD level and let driver fill the MLO and link level data, if driver not filling let mac80211 fill the data. - Corresponding changes done to embed statistics into the NL message based on the sinfo/link_sinfo. pseudo code for alternate approach: - cfg80211/mac80211: structure sinfo { filled packets bytes etc... //retain the structure as it was there before add structure link_sinfo{ filled packets bytes etc ... //all link level applicable fields } } - Call drv_sta_statistics at MLO level or deflink if non-ML and let driver fill MLO statistics and link level statistics. - Check if sinfo->filled is set if not fill the corresponding data in sinfo and link sinfo for MLO or sinfo for non-ML. Why not considered this approach for implementation: - The required changes here to other drivers are minimal. However, since sinfo is retained, every field needs to be filled at the MLO level. MLO statistics for tx_duration, pertid, etc., may not be very useful. - If these elements are not filled for MLO, they will remain unused in sinfo. Sarika Sharma (7): wifi: cfg80211: reorg sinfo structure elements for mesh wifi: cfg80211: reorg sinfo structure elements for MLO wifi: cfg80211: extend statistics for link level in sinfo wifi: cfg80211: add accumulated statistics for MLO links wifi: mac80211: add support to accumulate removed link statistics wifi: cfg80211: add additional MLO statistics wifi: ath12k: correctly fetch arsta for MLO drivers/net/wireless/ath/ath12k/mac.c | 51 +-- include/net/cfg80211.h | 204 ++++++---- include/net/mac80211.h | 21 +- net/mac80211/driver-ops.h | 14 +- net/mac80211/ethtool.c | 30 +- net/mac80211/ibss.c | 4 +- net/mac80211/sta_info.c | 537 ++++++++++++++++++-------- net/mac80211/sta_info.h | 30 +- net/mac80211/trace.h | 2 +- net/mac80211/util.c | 18 +- net/wireless/nl80211.c | 353 +++++++++++------ net/wireless/trace.h | 33 +- net/wireless/util.c | 10 +- net/wireless/wext-compat.c | 22 +- 14 files changed, 889 insertions(+), 440 deletions(-) base-commit: 7bf1659bad4e9413cdba132ef9cbd0caa9cabcc4 -- 2.34.1