From nobody Fri Apr 18 14:37:29 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZfHRG5f5wz5stqs; Fri, 18 Apr 2025 14:37:30 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZfHRF4mBdz3LCT; Fri, 18 Apr 2025 14:37:29 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744987049; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=NeEMuIP6LsnjUNdU/ngF6TEiq8KG3AT/CbbYsY9nHxY=; b=FJV693TtRCFVYXWuTe4QGgeLD7FRqucz8wvbon9BIHrH6d2uk9QkfdXk1kCAFRdBPrL1du I8pbt0PtSIbi9JnYsA2qIBsVCO/lijfSfPSIE7ICzS+pYWtM2TNnFyDEFD31c4hFD3H3fD gSQcIWsUeRIET1XZXLYmWYMIrPHlmRZMRP9GssH0z+iXOK5NFz6ZsusFkGbrJrpEGznnMF icG8tb8zIytal2/tApxx2F5YMHA/G0LrBMDdZch9+xgxo477lAyW0XKyDUJuXB+Iq28Pqd zp3qNql/IQoZrUn7cHd5l0ROC9WQ2av72DwMCvhCmNj3e+Ww6n/mKajgR2JpEg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744987049; a=rsa-sha256; cv=none; b=H8fccm7Pz10GZUGTVev+weZ/vqJd5uuDrUXDLPfD4nxrledA2l3mGTBKpDMswgZVWRPviX FsLJQ/TdWdThF3QSRy/jkcPd2CCkhenSgE9d2mqEEvRpeHmdc98yYqTmh+irKSaKBgqQ+Z bTOBj/O7ce4LXsZinmlevV+bYIrd1mBuyn5j6pI4LGavxGg2sHbl3CBwT2bVyfzpRDGgmT eQolLzcVgkybfoia3IBBZTxx/Q2faUcTOLKEwXZUeqoZXJ0EJAF/1qynxo5E9PKXC/n9St j1R2va5Q35DJH75O99RFnLmCAXzBQxtcZvBIXV6PsTJotfvv7HIIKcZAUX3ktg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744987049; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=NeEMuIP6LsnjUNdU/ngF6TEiq8KG3AT/CbbYsY9nHxY=; b=unTb1PccBGRbN6MhK8iIhaTtBX1OqnFGgbPlQ4K44btSvJ7dSY2uEdoiu4rYe6725ZNNPr nAI8ZJZPPZLa1V9y7vpScy/ZWHPId4PNS4MxpkinLEV6q6vu1h9JOSrf1juHGq8J5p6r95 EKPe4Hp3W/qHmbePtfz7jKqsPs8vzLtmb7D8sOq5aXdLJ2lfRnt/amNxXO7pV8rT95mnuX S6cIDxGbuMz29YkAdvyEzktlSloN7I4lfSUNinxeo1mNIBgB+mcDmSyfHp3ILpdJJF273l 2KT7SdY1+4iIyQisu+v0szxozOWCyKf0c+0KbAAZ2A+31Xv4z0wScZgyYqWyqA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZfHRF4BVczdy0; Fri, 18 Apr 2025 14:37:29 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53IEbTIL092362; Fri, 18 Apr 2025 14:37:29 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53IEbTuZ092359; Fri, 18 Apr 2025 14:37:29 GMT (envelope-from git) Date: Fri, 18 Apr 2025 14:37:29 GMT Message-Id: <202504181437.53IEbTuZ092359@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 9996e4df555c - stable/14 - LinuxKPI; 802.11: start filling rxrate statistics List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 9996e4df555c7b7b4988526729fdf4230d796954 Auto-Submitted: auto-generated The branch stable/14 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=9996e4df555c7b7b4988526729fdf4230d796954 commit 9996e4df555c7b7b4988526729fdf4230d796954 Author: Bjoern A. Zeeb AuthorDate: 2025-04-13 23:05:46 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-04-18 14:36:03 +0000 LinuxKPI; 802.11: start filling rxrate statistics Start collecting rxrate information from the RX statistics which are passed per packet. Store them in the lsta and upon printing statistics, if no RX_BIRATE is provided copy them over from the lsta. This allows us to see rate information in both directions on modern iwlwifi chipsets, which are doing [tx]rate handling in firmware. Sponsored by: The FreeBSD Foundation (cherry picked from commit a1adefb139b3c8f95e5255c67705fb92f4d9fc04) --- sys/compat/linuxkpi/common/src/linux_80211.c | 72 +++++++++++++++++++++------- sys/compat/linuxkpi/common/src/linux_80211.h | 2 + 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c index 3dba41a4e547..98e0b28d9ef2 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.c +++ b/sys/compat/linuxkpi/common/src/linux_80211.c @@ -314,6 +314,13 @@ lkpi_80211_dump_stas(SYSCTL_HANDLER_ARGS) continue; } + /* If no RX_BITRATE is reported, try to fill it in from the lsta sinfo. */ + if ((sinfo.filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) == 0 && + (lsta->sinfo.filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE)) != 0) { + memcpy(&sinfo.rxrate, &lsta->sinfo.rxrate, sizeof(sinfo.rxrate)); + sinfo.filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); + } + lkpi_nl80211_sta_info_to_str(&s, " nl80211_sta_info (valid fields)", sinfo.filled); sbuf_printf(&s, " connected_time %u inactive_time %u\n", sinfo.connected_time, sinfo.inactive_time); @@ -6276,15 +6283,17 @@ lkpi_80211_lhw_rxq_task(void *ctx, int pending) } static void -lkpi_convert_rx_status(struct ieee80211_hw *hw, +lkpi_convert_rx_status(struct ieee80211_hw *hw, struct lkpi_sta *lsta, struct ieee80211_rx_status *rx_status, struct ieee80211_rx_stats *rx_stats, uint8_t *rssip) { struct ieee80211_supported_band *supband; + struct rate_info rxrate; int i; uint8_t rssi; + memset(&rxrate, 0, sizeof(rxrate)); memset(rx_stats, 0, sizeof(*rx_stats)); rx_stats->r_flags = IEEE80211_R_NF | IEEE80211_R_RSSI; /* XXX-BZ correct hardcoded noise floor, survey data? */ @@ -6351,30 +6360,56 @@ lkpi_convert_rx_status(struct ieee80211_hw *hw, switch (rx_status->encoding) { case RX_ENC_LEGACY: + { + uint32_t legacy = 0; + supband = hw->wiphy->bands[rx_status->band]; if (supband != NULL) - rx_stats->c_rate = supband->bitrates[rx_status->rate_idx].bitrate; + legacy = supband->bitrates[rx_status->rate_idx].bitrate; + rx_stats->c_rate = legacy; + rxrate.legacy = legacy; /* Is there a LinuxKPI way of reporting IEEE80211_RX_F_CCK / _OFDM? */ break; + } case RX_ENC_HT: rx_stats->c_pktflags |= IEEE80211_RX_F_HT; - if ((rx_status->enc_flags & RX_ENC_FLAG_SHORT_GI) != 0) - rx_stats->c_pktflags |= IEEE80211_RX_F_SHORTGI; rx_stats->c_rate = rx_status->rate_idx; /* mcs */ + rxrate.flags |= RATE_INFO_FLAGS_MCS; + rxrate.mcs = rx_status->rate_idx; + if ((rx_status->enc_flags & RX_ENC_FLAG_SHORT_GI) != 0) { + rx_stats->c_pktflags |= IEEE80211_RX_F_SHORTGI; + rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI; + } break; case RX_ENC_VHT: rx_stats->c_pktflags |= IEEE80211_RX_F_VHT; - if ((rx_status->enc_flags & RX_ENC_FLAG_SHORT_GI) != 0) - rx_stats->c_pktflags |= IEEE80211_RX_F_SHORTGI; rx_stats->c_rate = rx_status->rate_idx; /* mcs */ rx_stats->c_vhtnss = rx_status->nss; + rxrate.flags |= RATE_INFO_FLAGS_VHT_MCS; + rxrate.mcs = rx_status->rate_idx; + rxrate.nss = rx_status->nss; + if ((rx_status->enc_flags & RX_ENC_FLAG_SHORT_GI) != 0) { + rx_stats->c_pktflags |= IEEE80211_RX_F_SHORTGI; + rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI; + } break; case RX_ENC_HE: + rxrate.flags |= RATE_INFO_FLAGS_HE_MCS; + rxrate.mcs = rx_status->rate_idx; + rxrate.nss = rx_status->nss; + /* XXX TODO */ + TODO("net80211 has not matching encoding for %u", rx_status->encoding); + break; case RX_ENC_EHT: + rxrate.flags |= RATE_INFO_FLAGS_EHT_MCS; + rxrate.mcs = rx_status->rate_idx; + rxrate.nss = rx_status->nss; + /* XXX TODO */ TODO("net80211 has not matching encoding for %u", rx_status->encoding); break; } + rxrate.bw = rx_status->bw; switch (rx_status->bw) { case RATE_INFO_BW_20: rx_stats->c_width = IEEE80211_RX_FW_20MHZ; @@ -6425,6 +6460,11 @@ lkpi_convert_rx_status(struct ieee80211_hw *hw, if (rx_status->flag & RX_FLAG_FAILED_FCS_CRC) rx_stats->c_pktflags |= IEEE80211_RX_F_FAIL_FCSCRC; #endif + + if (lsta != NULL) { + memcpy(&lsta->sinfo.rxrate, &rxrate, sizeof(rxrate)); + lsta->sinfo.filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE); + } } /* For %list see comment towards the end of the function. */ @@ -6527,16 +6567,6 @@ linuxkpi_ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, no_trace_beacons: #endif - rssi = 0; - lkpi_convert_rx_status(hw, rx_status, &rx_stats, &rssi); - - ok = ieee80211_add_rx_params(m, &rx_stats); - if (ok == 0) { - m_freem(m); - counter_u64_add(ic->ic_ierrors, 1); - goto err; - } - lsta = NULL; if (sta != NULL) { lsta = STA_TO_LSTA(sta); @@ -6550,6 +6580,16 @@ no_trace_beacons: lsta = ni->ni_drv_data; } + rssi = 0; + lkpi_convert_rx_status(hw, lsta, rx_status, &rx_stats, &rssi); + + ok = ieee80211_add_rx_params(m, &rx_stats); + if (ok == 0) { + m_freem(m); + counter_u64_add(ic->ic_ierrors, 1); + goto err; + } + if (ni != NULL) vap = ni->ni_vap; else diff --git a/sys/compat/linuxkpi/common/src/linux_80211.h b/sys/compat/linuxkpi/common/src/linux_80211.h index ebf02994af47..e9c0d01af1bb 100644 --- a/sys/compat/linuxkpi/common/src/linux_80211.h +++ b/sys/compat/linuxkpi/common/src/linux_80211.h @@ -161,6 +161,8 @@ struct lkpi_sta { bool added_to_drv; /* Driver knows; i.e. we called ...(). */ bool in_mgd; /* XXX-BZ should this be per-vif? */ + struct station_info sinfo; /* statistics */ + /* Must be last! */ struct ieee80211_sta sta __aligned(CACHE_LINE_SIZE); };