The branch main has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=b3b61079ccc24792f1410840e42c36f71b9cab9f

commit b3b61079ccc24792f1410840e42c36f71b9cab9f
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2025-06-14 00:23:26 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2025-08-24 10:26:44 +0000

    LinuxKPI: 802.11: fill in sinfo for chains in case driver does not
    
    We are getting per-packet information on the rx chains.  Save them
    locally like we do for rx rate and add them to sinfo for the sysctl
    in case the driver does not fill in that information.
    Also note: chain_signal is a bitmask and not a number;  treat it
    accordingly.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      3 days
---
 sys/compat/linuxkpi/common/src/linux_80211.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c 
b/sys/compat/linuxkpi/common/src/linux_80211.c
index eb270fe7c8f6..91836b857727 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -325,6 +325,14 @@ lkpi_80211_dump_stas(SYSCTL_HANDLER_ARGS)
                        memcpy(&sinfo.rxrate, &lsta->sinfo.rxrate, 
sizeof(sinfo.rxrate));
                        sinfo.filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
                }
+               /* If no CHAIN_SIGNAL is reported,  try to fill it in from the 
lsta sinfo. */
+               if ((sinfo.filled & BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) == 
0 &&
+                   (lsta->sinfo.filled & 
BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL)) != 0) {
+                       sinfo.chains = lsta->sinfo.chains;
+                       memcpy(sinfo.chain_signal, lsta->sinfo.chain_signal,
+                           sizeof(sinfo.chain_signal));
+                       sinfo.filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
+               }
 
                lkpi_nl80211_sta_info_to_str(&s, " nl80211_sta_info (valid 
fields)", sinfo.filled);
                sbuf_printf(&s, " connected_time %u inactive_time %u\n",
@@ -341,11 +349,12 @@ lkpi_80211_dump_stas(SYSCTL_HANDLER_ARGS)
 
                sbuf_printf(&s, " signal %d signal_avg %d ack_signal %d 
avg_ack_signal %d\n",
                    sinfo.signal, sinfo.signal_avg, sinfo.ack_signal, 
sinfo.avg_ack_signal);
-
-               sbuf_printf(&s, " generation %d assoc_req_ies_len %zu chains 
%d\n",
+               sbuf_printf(&s, " generation %d assoc_req_ies_len %zu chains 
%#04x\n",
                    sinfo.generation, sinfo.assoc_req_ies_len, sinfo.chains);
 
-               for (int i = 0; i < sinfo.chains && i < IEEE80211_MAX_CHAINS; 
i++) {
+               for (int i = 0; i < nitems(sinfo.chain_signal) && i < 
IEEE80211_MAX_CHAINS; i++) {
+                       if (!(sinfo.chains & BIT(i)))
+                               continue;
                        sbuf_printf(&s, "  chain[%d] signal %d signal_avg %d\n",
                            i, (int8_t)sinfo.chain_signal[i], 
(int8_t)sinfo.chain_signal_avg[i]);
                }
@@ -6881,9 +6890,17 @@ lkpi_convert_rx_status(struct ieee80211_hw *hw, struct 
lkpi_sta *lsta,
                rx_stats->c_pktflags |= IEEE80211_RX_F_FAIL_FCSCRC;
 #endif
 
+       /* Fill in some sinfo bits to fill gaps not reported byt the driver. */
        if (lsta != NULL) {
                memcpy(&lsta->sinfo.rxrate, &rxrate, sizeof(rxrate));
                lsta->sinfo.filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
+
+               if (rx_status->chains != 0) {
+                       lsta->sinfo.chains = rx_status->chains;
+                       memcpy(lsta->sinfo.chain_signal, 
rx_status->chain_signal,
+                           sizeof(lsta->sinfo.chain_signal));
+                       lsta->sinfo.filled |= 
BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
+               }
        }
 }
 

Reply via email to