From patchwork Wed Nov 30 23:33:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ruth X-Patchwork-Id: 1710771 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=htCV0YjG; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=IxZsCx9+; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NMx132l84z23nT for ; Thu, 1 Dec 2022 10:55:51 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=PdmGdvdLCWoXeiNGwsaQNt48GaUbdf0eE9e1SyEYZ5A=; b=htCV0YjGflxJxK WjvBmh97HAvNH2XprzPUrILTNnNCD8AUbcgjuvQ1x+3o80f9GOlxBMDB1+vlSMPKCqdw61GxGfYDh L04JGPml2aFRF34/D9m/ZkLMshmuqare8038ev0eo0PASq1UOzb5tI6NQDrmIhIQoXU8d7fMybK2o 7i2s1x4tejaMXkbOHJ3sz5LPrSPVjZaSAl/zCUX9OXiQycsZbIwMGNAEIrzbRA3eBXQWKYMyPELlP 5UyDDBZ/vw9N8mzU0gLa2jGQwpbp83+y7FAW4o2uVgXlhZeEFSvNl5ybSk4XD5iD7PlwgQGfwMjQF j45UTz6ORjuUw8corNMA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1p0Wui-003PQw-W8; Wed, 30 Nov 2022 23:54:53 +0000 Received: from mail-qt1-x82d.google.com ([2607:f8b0:4864:20::82d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1p0WaG-003GNC-8P for hostap@lists.infradead.org; Wed, 30 Nov 2022 23:33:49 +0000 Received: by mail-qt1-x82d.google.com with SMTP id h16so12295118qtu.2 for ; Wed, 30 Nov 2022 15:33:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Ox8+bF9eYQWRjj5hkIbkr+EcYq46IbFeuhQJGgMc8pA=; b=IxZsCx9+bNwmSgATPj/11CErjcNe/SwyQE8u2nOX+RwZzTP3lJ3Rq1xL17pyXH/mF0 fxAT9sUXLi1qZKMYNIPjNHWC7C9EF1/YH+iIDejT520kIlK94YB0sBMdIdXzYDSX3oKL 5rtBHtvZP4HLNTgZTKa87x+oI5twQyH8tgf/Y= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Ox8+bF9eYQWRjj5hkIbkr+EcYq46IbFeuhQJGgMc8pA=; b=UwuHkIeaD7t9D6d0zseRoJvBYUJkeGqS7b4ujXJEANBpEM2BH1yiBLo3BdyfI4SFHp lHj9u93mBKvXOJzwt0nGA5XIDr8ZcR3FfON8i5pxY/fbHQdSv7U5J9Dp+iJ4QHKmIlRb u34GTv+c4grlPwSTLj4CzDE+9Bcqd1IV+oI9LSikYRuD5QBRO+bBqprBnnZP5RudTkvD amwTw53jeNhpkrpWR0ZC67cSa6G9ti8Rv2sDu2cLmAxwr6QC6md1jl6zAPFcPRRQEaqX HmcQl166xpFlO7nfKkw3Jz2/K9E/xelFRlF+Jx417IIqdG2ZMnKJnBGDNnL1kH8TxeuD DnTA== X-Gm-Message-State: ANoB5pnVdpczGJ20B5AElfz8uonTEL3m/zKovcTlYZ4f+pXw3b8/jxSk QQyMWwtl6vfF6d9m8+dr/usAk3tjVCFgAg== X-Google-Smtp-Source: AA0mqf7fLGpJYgjZzsaFFzEMNNEDpqUbjq2LP8b8b7965Wo2OrSZzG41TGfGXHUNLlwIr8t70uSsPg== X-Received: by 2002:a05:622a:8cf:b0:3a4:ef5c:c69d with SMTP id i15-20020a05622a08cf00b003a4ef5cc69dmr19979837qte.194.1669851219913; Wed, 30 Nov 2022 15:33:39 -0800 (PST) Received: from localhost (228.221.150.34.bc.googleusercontent.com. [34.150.221.228]) by smtp.gmail.com with UTF8SMTPSA id hf13-20020a05622a608d00b003a5c60686b0sm1620473qtb.22.2022.11.30.15.33.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 30 Nov 2022 15:33:38 -0800 (PST) From: David Ruth To: Hostap Mailing List Cc: David Ruth Subject: [PATCH 1/2] Add more nl80211 info to wpa_signal_info Date: Wed, 30 Nov 2022 23:33:09 +0000 Message-Id: <20221130233310.3559058-1-druth@chromium.org> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221130_153344_395938_0AEFFFD9 X-CRM114-Status: GOOD ( 19.57 ) X-Spam-Score: -0.4 (/) X-Spam-Report: Spam detection software, running on the system "bombadil.infradead.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Facilitate emitting more station information over D-Bus for use by the connection manager. * Add storage for more NL80211_STA_INFO_* fields to data structures, and move them through the system. * Reorder NL80211_STA_INFO_* fields in driver_nl80211.c to match the ordering in nl80211.h. * Con [...] Content analysis details: (-0.4 points, 5.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [2607:f8b0:4864:20:0:0:0:82d listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.2 DKIMWL_WL_HIGH DKIMwl.org - High trust sender X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Facilitate emitting more station information over D-Bus for use by the connection manager. * Add storage for more NL80211_STA_INFO_* fields to data structures, and move them through the system. * Reorder NL80211_STA_INFO_* fields in driver_nl80211.c to match the ordering in nl80211.h. * Convert signal field to an integer to support holding WPA_INVALID_NOISE and avoid changing logging. * Add fields to hostap_sta_driver_data to capture more information * fcs_error_count * beacon_loss_count * expected_throughput * rx_drop_misc * rx_mpdus * rx_hemcs * tx_hemcs * rx_he_nss * tx_he_nss * avg_signal * avg_beacon_signal * avg_ack_signal * Add hostap_sta_driver_data to wpa_signal_info and remove redundant fields * Change logging when printing txrate to handle unsigned long value Signed-off-by: David Ruth --- src/ap/ctrl_iface_ap.c | 2 +- src/drivers/driver.h | 29 ++-- src/drivers/driver_nl80211.c | 192 ++++++++++++------------ src/drivers/driver_nl80211.h | 2 +- src/drivers/driver_nl80211_event.c | 8 +- src/drivers/driver_wext.c | 4 +- wpa_supplicant/bgscan_learn.c | 2 +- wpa_supplicant/bgscan_simple.c | 2 +- wpa_supplicant/ctrl_iface.c | 26 ++-- wpa_supplicant/dbus/dbus_new_handlers.c | 8 +- wpa_supplicant/events.c | 18 +-- wpa_supplicant/wpa_supplicant.c | 12 +- 12 files changed, 159 insertions(+), 146 deletions(-) diff --git a/src/ap/ctrl_iface_ap.c b/src/ap/ctrl_iface_ap.c index a02917c5f..6d379d444 100644 --- a/src/ap/ctrl_iface_ap.c +++ b/src/ap/ctrl_iface_ap.c @@ -131,7 +131,7 @@ static int hostapd_get_sta_info(struct hostapd_data *hapd, len += ret; ret = os_snprintf(buf + len, buflen - len, "tx_rate_info=%lu", - data.current_tx_rate); + data.current_tx_rate / 100); if (os_snprintf_error(buflen - len, ret)) return len; len += ret; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 0b019e3af..c594abb9e 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2231,11 +2231,16 @@ struct hostapd_data; #define STA_DRV_DATA_RX_SHORT_GI BIT(7) #define STA_DRV_DATA_LAST_ACK_RSSI BIT(8) #define STA_DRV_DATA_CONN_TIME BIT(9) +#define STA_DRV_DATA_TX_HE_MCS BIT(10) +#define STA_DRV_DATA_RX_HE_MCS BIT(11) +#define STA_DRV_DATA_TX_HE_NSS BIT(12) +#define STA_DRV_DATA_RX_HE_NSS BIT(13) struct hostap_sta_driver_data { unsigned long rx_packets, tx_packets; unsigned long long rx_bytes, tx_bytes; unsigned long long rx_airtime, tx_airtime; + unsigned long long beacons_count; int bytes_64bit; /* whether 64-bit byte counters are supported */ unsigned long current_tx_rate; unsigned long current_rx_rate; @@ -2248,13 +2253,25 @@ struct hostap_sta_driver_data { s8 last_ack_rssi; unsigned long backlog_packets; unsigned long backlog_bytes; - s8 signal; + unsigned long fcs_error_count; + unsigned long beacon_loss_count; + unsigned long expected_throughput; + unsigned long rx_drop_misc; + unsigned long rx_mpdus; + int signal; + u8 rx_hemcs; + u8 tx_hemcs; u8 rx_vhtmcs; u8 tx_vhtmcs; u8 rx_mcs; u8 tx_mcs; + u8 rx_he_nss; + u8 tx_he_nss; u8 rx_vht_nss; u8 tx_vht_nss; + s8 avg_signal; + s8 avg_beacon_signal; + s8 avg_ack_signal; }; struct hostapd_sta_add_params { @@ -2381,11 +2398,8 @@ enum smps_mode { * @frequency: control frequency * @above_threshold: true if the above threshold was crossed * (relevant for a CQM event) - * @current_signal: in dBm - * @avg_signal: in dBm - * @avg_beacon_signal: in dBm + * @data: sta information * @current_noise: %WPA_INVALID_NOISE if not supported - * @current_txrate: current TX rate * @chanwidth: channel width * @center_frq1: center frequency for the first segment * @center_frq2: center frequency for the second segment (if relevant) @@ -2393,11 +2407,8 @@ enum smps_mode { struct wpa_signal_info { u32 frequency; int above_threshold; - int current_signal; - int avg_signal; - int avg_beacon_signal; + struct hostap_sta_driver_data data; int current_noise; - int current_txrate; enum chan_width chanwidth; int center_frq1; int center_frq2; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index c3e6594f3..ffdcade09 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -1638,86 +1638,6 @@ try_again: } -static int get_link_signal(struct nl_msg *msg, void *arg) -{ - struct nlattr *tb[NL80211_ATTR_MAX + 1]; - struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); - struct nlattr *sinfo[NL80211_STA_INFO_MAX + 1]; - static struct nla_policy policy[NL80211_STA_INFO_MAX + 1] = { - [NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 }, - [NL80211_STA_INFO_SIGNAL_AVG] = { .type = NLA_U8 }, - [NL80211_STA_INFO_BEACON_SIGNAL_AVG] = { .type = NLA_U8 }, - }; - struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1]; - static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = { - [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 }, - [NL80211_RATE_INFO_MCS] = { .type = NLA_U8 }, - [NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG }, - [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, - }; - struct wpa_signal_info *sig_change = arg; - - nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), - genlmsg_attrlen(gnlh, 0), NULL); - if (!tb[NL80211_ATTR_STA_INFO] || - nla_parse_nested(sinfo, NL80211_STA_INFO_MAX, - tb[NL80211_ATTR_STA_INFO], policy)) - return NL_SKIP; - if (!sinfo[NL80211_STA_INFO_SIGNAL]) - return NL_SKIP; - - sig_change->current_signal = - (s8) nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL]); - - if (sinfo[NL80211_STA_INFO_SIGNAL_AVG]) - sig_change->avg_signal = - (s8) nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL_AVG]); - else - sig_change->avg_signal = 0; - - if (sinfo[NL80211_STA_INFO_BEACON_SIGNAL_AVG]) - sig_change->avg_beacon_signal = - (s8) - nla_get_u8(sinfo[NL80211_STA_INFO_BEACON_SIGNAL_AVG]); - else - sig_change->avg_beacon_signal = 0; - - if (sinfo[NL80211_STA_INFO_TX_BITRATE]) { - if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, - sinfo[NL80211_STA_INFO_TX_BITRATE], - rate_policy)) { - sig_change->current_txrate = 0; - } else { - if (rinfo[NL80211_RATE_INFO_BITRATE]) { - sig_change->current_txrate = - nla_get_u16(rinfo[ - NL80211_RATE_INFO_BITRATE]) * 100; - } - } - } - - return NL_SKIP; -} - - -int nl80211_get_link_signal(struct wpa_driver_nl80211_data *drv, - const u8 *bssid, struct wpa_signal_info *sig) -{ - struct nl_msg *msg; - - sig->current_signal = -WPA_INVALID_NOISE; - sig->current_txrate = 0; - - if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_STATION)) || - nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) { - nlmsg_free(msg); - return -ENOBUFS; - } - - return send_and_recv_msgs(drv, msg, get_link_signal, sig, NULL, NULL); -} - - static int get_link_noise(struct nl_msg *msg, void *arg) { struct nlattr *tb[NL80211_ATTR_MAX + 1]; @@ -7214,14 +7134,24 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) [NL80211_STA_INFO_INACTIVE_TIME] = { .type = NLA_U32 }, [NL80211_STA_INFO_RX_BYTES] = { .type = NLA_U32 }, [NL80211_STA_INFO_TX_BYTES] = { .type = NLA_U32 }, - [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 }, - [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 }, - [NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 }, [NL80211_STA_INFO_RX_BYTES64] = { .type = NLA_U64 }, [NL80211_STA_INFO_TX_BYTES64] = { .type = NLA_U64 }, [NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 }, - [NL80211_STA_INFO_ACK_SIGNAL] = { .type = NLA_U8 }, + [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 }, + [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 }, + [NL80211_STA_INFO_TX_RETRIES] = { .type = NLA_U32 }, + [NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 }, + [NL80211_STA_INFO_SIGNAL_AVG] = { .type = NLA_U8 }, + [NL80211_STA_INFO_BEACON_LOSS] = { .type = NLA_U32 }, + [NL80211_STA_INFO_EXPECTED_THROUGHPUT] = { .type = NLA_U32 }, + [NL80211_STA_INFO_RX_DROP_MISC] = { .type = NLA_U64 }, + [NL80211_STA_INFO_BEACON_RX] = { .type = NLA_U64 }, + [NL80211_STA_INFO_BEACON_SIGNAL_AVG] = { .type = NLA_U8}, [NL80211_STA_INFO_RX_DURATION] = { .type = NLA_U64 }, + [NL80211_STA_INFO_ACK_SIGNAL] = { .type = NLA_U8 }, + [NL80211_STA_INFO_ACK_SIGNAL_AVG] = { .type = NLA_S8 }, + [NL80211_STA_INFO_RX_MPDUS] = { .type = NLA_U32 }, + [NL80211_STA_INFO_FCS_ERROR_COUNT] = { .type = NLA_U32 }, [NL80211_STA_INFO_TX_DURATION] = { .type = NLA_U64 }, [NL80211_STA_INFO_CONNECTED_TIME] = { .type = NLA_U32 }, }; @@ -7233,6 +7163,8 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) [NL80211_RATE_INFO_VHT_MCS] = { .type = NLA_U8 }, [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, [NL80211_RATE_INFO_VHT_NSS] = { .type = NLA_U8 }, + [NL80211_RATE_INFO_HE_MCS] = { .type = NLA_U8 }, + [NL80211_RATE_INFO_HE_NSS] = { .type = NLA_U8 }, }; nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), @@ -7275,28 +7207,56 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) nla_get_u64(stats[NL80211_STA_INFO_TX_BYTES64]); data->bytes_64bit = 1; } + if (stats[NL80211_STA_INFO_SIGNAL]) + data->signal = (s8) nla_get_u8(stats[NL80211_STA_INFO_SIGNAL]); if (stats[NL80211_STA_INFO_RX_PACKETS]) data->rx_packets = nla_get_u32(stats[NL80211_STA_INFO_RX_PACKETS]); if (stats[NL80211_STA_INFO_TX_PACKETS]) data->tx_packets = nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]); - if (stats[NL80211_STA_INFO_RX_DURATION]) - data->rx_airtime = - nla_get_u64(stats[NL80211_STA_INFO_RX_DURATION]); - if (stats[NL80211_STA_INFO_TX_DURATION]) - data->tx_airtime = - nla_get_u64(stats[NL80211_STA_INFO_TX_DURATION]); + if (stats[NL80211_STA_INFO_TX_RETRIES]) + data->tx_retry_count = + nla_get_u32(stats[NL80211_STA_INFO_TX_FAILED]); if (stats[NL80211_STA_INFO_TX_FAILED]) data->tx_retry_failed = nla_get_u32(stats[NL80211_STA_INFO_TX_FAILED]); - if (stats[NL80211_STA_INFO_SIGNAL]) - data->signal = nla_get_u8(stats[NL80211_STA_INFO_SIGNAL]); + if (stats[NL80211_STA_INFO_SIGNAL_AVG]) + data->avg_signal = + (s8) nla_get_u8(stats[NL80211_STA_INFO_SIGNAL_AVG]); + if (stats[NL80211_STA_INFO_BEACON_LOSS]) + data->beacon_loss_count = + nla_get_u32(stats[NL80211_STA_INFO_BEACON_LOSS]); + if (stats[NL80211_STA_INFO_EXPECTED_THROUGHPUT]) + data->expected_throughput = + nla_get_u32(stats[NL80211_STA_INFO_EXPECTED_THROUGHPUT]); + if (stats[NL80211_STA_INFO_RX_DROP_MISC]) + data->rx_drop_misc = + nla_get_u32(stats[NL80211_STA_INFO_RX_DROP_MISC]); + if (stats[NL80211_STA_INFO_BEACON_RX]) + data->beacons_count = + nla_get_u64(stats[NL80211_STA_INFO_BEACON_RX]); + if (stats[NL80211_STA_INFO_BEACON_SIGNAL_AVG]) + data->avg_beacon_signal = + (s8) nla_get_u8(stats[NL80211_STA_INFO_BEACON_SIGNAL_AVG]); + if (stats[NL80211_STA_INFO_RX_DURATION]) + data->rx_airtime = + nla_get_u64(stats[NL80211_STA_INFO_RX_DURATION]); if (stats[NL80211_STA_INFO_ACK_SIGNAL]) { data->last_ack_rssi = nla_get_u8(stats[NL80211_STA_INFO_ACK_SIGNAL]); data->flags |= STA_DRV_DATA_LAST_ACK_RSSI; } + if (stats[NL80211_STA_INFO_ACK_SIGNAL_AVG]) + data->avg_ack_signal = nla_get_s8(stats[NL80211_STA_INFO_ACK_SIGNAL_AVG]); + if (stats[NL80211_STA_INFO_RX_MPDUS]) + data->rx_mpdus = nla_get_u32(stats[NL80211_STA_INFO_RX_MPDUS]); + if (stats[NL80211_STA_INFO_FCS_ERROR_COUNT]) + data->fcs_error_count = + nla_get_u32(stats[NL80211_STA_INFO_FCS_ERROR_COUNT]); + if (stats[NL80211_STA_INFO_TX_DURATION]) + data->tx_airtime = + nla_get_u64(stats[NL80211_STA_INFO_TX_DURATION]); if (stats[NL80211_STA_INFO_CONNECTED_TIME]) { data->connected_sec = @@ -7315,6 +7275,10 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) data->current_tx_rate = nla_get_u16(rate[NL80211_RATE_INFO_BITRATE]); + // Convert from 100kbps to kbps; it's a more convenient + // unit. It's also safe up until ~1Tbps. + data->current_tx_rate = data->current_tx_rate * 100; + if (rate[NL80211_RATE_INFO_MCS]) { data->tx_mcs = nla_get_u8(rate[NL80211_RATE_INFO_MCS]); data->flags |= STA_DRV_DATA_TX_MCS; @@ -7331,6 +7295,14 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]); data->flags |= STA_DRV_DATA_TX_VHT_NSS; } + if (rate[NL80211_RATE_INFO_HE_MCS]) { + data->tx_hemcs = nla_get_u8(rate[NL80211_RATE_INFO_HE_MCS]); + data->flags |= STA_DRV_DATA_TX_HE_MCS; + } + if (rate[NL80211_RATE_INFO_HE_NSS]) { + data->tx_he_nss = nla_get_u8(rate[NL80211_RATE_INFO_HE_NSS]); + data->flags |= STA_DRV_DATA_TX_HE_NSS; + } } if (stats[NL80211_STA_INFO_RX_BITRATE] && @@ -7344,6 +7316,10 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) data->current_rx_rate = nla_get_u16(rate[NL80211_RATE_INFO_BITRATE]); + // Convert from 100kbps to kbps; it's a more convenient + // unit. It's also safe up until ~1Tbps. + data->current_rx_rate = data->current_rx_rate * 100; + if (rate[NL80211_RATE_INFO_MCS]) { data->rx_mcs = nla_get_u8(rate[NL80211_RATE_INFO_MCS]); @@ -7361,6 +7337,14 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) nla_get_u8(rate[NL80211_RATE_INFO_VHT_NSS]); data->flags |= STA_DRV_DATA_RX_VHT_NSS; } + if (rate[NL80211_RATE_INFO_HE_MCS]) { + data->rx_hemcs = nla_get_u8(rate[NL80211_RATE_INFO_HE_MCS]); + data->flags |= STA_DRV_DATA_RX_HE_MCS; + } + if (rate[NL80211_RATE_INFO_HE_NSS]) { + data->rx_he_nss = nla_get_u8(rate[NL80211_RATE_INFO_HE_NSS]); + data->flags |= STA_DRV_DATA_RX_HE_NSS; + } } if (stats[NL80211_STA_INFO_TID_STATS]) @@ -7369,6 +7353,24 @@ static int get_sta_handler(struct nl_msg *msg, void *arg) return NL_SKIP; } +int nl80211_get_link_signal(struct wpa_driver_nl80211_data *drv, + const u8 *bssid, struct hostap_sta_driver_data *data) +{ + struct nl_msg *msg; + + data->signal = -WPA_INVALID_NOISE; + data->current_tx_rate = 0; + + if (!(msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_STATION)) || + nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, bssid)) { + nlmsg_free(msg); + return -ENOBUFS; + } + + return send_and_recv_msgs(drv, msg, get_sta_handler, data, NULL, NULL); +} + + static int i802_read_sta_data(struct i802_bss *bss, struct hostap_sta_driver_data *data, const u8 *addr) @@ -8783,12 +8785,12 @@ static int nl80211_signal_poll(void *priv, struct wpa_signal_info *si) int res; os_memset(si, 0, sizeof(*si)); - res = nl80211_get_link_signal(drv, drv->bssid, si); + res = nl80211_get_link_signal(drv, drv->bssid, &si->data); if (res) { if (drv->nlmode != NL80211_IFTYPE_ADHOC && drv->nlmode != NL80211_IFTYPE_MESH_POINT) return res; - si->current_signal = 0; + si->data.signal = 0; } res = nl80211_get_channel_width(drv, si); @@ -8937,7 +8939,7 @@ static int nl80211_mlo_signal_poll(void *priv, res = nl80211_get_link_signal(drv, drv->sta_mlo_info.links[i].bssid, - &mlo_si->links[i]); + &mlo_si->links[i].data); if (res != 0) return res; diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h index 0740e064a..24387c0f8 100644 --- a/src/drivers/driver_nl80211.h +++ b/src/drivers/driver_nl80211.h @@ -269,7 +269,7 @@ int is_ap_interface(enum nl80211_iftype nlmode); int is_sta_interface(enum nl80211_iftype nlmode); int wpa_driver_nl80211_authenticate_retry(struct wpa_driver_nl80211_data *drv); int nl80211_get_link_signal(struct wpa_driver_nl80211_data *drv, - const u8 *bssid, struct wpa_signal_info *sig); + const u8 *bssid, struct hostap_sta_driver_data *data); int nl80211_get_link_noise(struct wpa_driver_nl80211_data *drv, struct wpa_signal_info *sig_change); int nl80211_get_wiphy_index(struct i802_bss *bss); diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c index c10c31a37..8243e99fb 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -1834,11 +1834,11 @@ static void nl80211_cqm_event(struct wpa_driver_nl80211_data *drv, * nl80211_get_link_signal() and nl80211_get_link_noise() set default * values in case querying the driver fails. */ - res = nl80211_get_link_signal(drv, drv->bssid, &ed.signal_change); + res = nl80211_get_link_signal(drv, drv->bssid, &ed.signal_change.data); if (res == 0) { - wpa_printf(MSG_DEBUG, "nl80211: Signal: %d dBm txrate: %d", - ed.signal_change.current_signal, - ed.signal_change.current_txrate); + wpa_printf(MSG_DEBUG, "nl80211: Signal: %d dBm txrate: %lu", + ed.signal_change.data.signal, + ed.signal_change.data.current_tx_rate); } else { wpa_printf(MSG_DEBUG, "nl80211: Querying the driver for signal info failed"); diff --git a/src/drivers/driver_wext.c b/src/drivers/driver_wext.c index 0f0ad1f53..cf201fe86 100644 --- a/src/drivers/driver_wext.c +++ b/src/drivers/driver_wext.c @@ -2424,7 +2424,7 @@ static int wpa_driver_wext_signal_poll(void *priv, struct wpa_signal_info *si) struct iwreq iwr; os_memset(si, 0, sizeof(*si)); - si->current_signal = -WPA_INVALID_NOISE; + si->data.signal = -WPA_INVALID_NOISE; si->current_noise = WPA_INVALID_NOISE; si->chanwidth = CHAN_WIDTH_UNKNOWN; @@ -2440,7 +2440,7 @@ static int wpa_driver_wext_signal_poll(void *priv, struct wpa_signal_info *si) return -1; } - si->current_signal = stats.qual.level - + si->data.signal = stats.qual.level - ((stats.qual.updated & IW_QUAL_DBM) ? 0x100 : 0); si->current_noise = stats.qual.noise - ((stats.qual.updated & IW_QUAL_DBM) ? 0x100 : 0); diff --git a/wpa_supplicant/bgscan_learn.c b/wpa_supplicant/bgscan_learn.c index cb732f709..75bdec1c0 100644 --- a/wpa_supplicant/bgscan_learn.c +++ b/wpa_supplicant/bgscan_learn.c @@ -422,7 +422,7 @@ static void * bgscan_learn_init(struct wpa_supplicant *wpa_s, /* Poll for signal info to set initial scan interval */ struct wpa_signal_info siginfo; if (wpa_drv_signal_poll(wpa_s, &siginfo) == 0 && - siginfo.current_signal >= data->signal_threshold) + siginfo.data.signal >= data->signal_threshold) data->scan_interval = data->long_interval; } diff --git a/wpa_supplicant/bgscan_simple.c b/wpa_supplicant/bgscan_simple.c index 41a26df0d..5a8f97c2a 100644 --- a/wpa_supplicant/bgscan_simple.c +++ b/wpa_supplicant/bgscan_simple.c @@ -137,7 +137,7 @@ static void * bgscan_simple_init(struct wpa_supplicant *wpa_s, /* Poll for signal info to set initial scan interval */ struct wpa_signal_info siginfo; if (wpa_drv_signal_poll(wpa_s, &siginfo) == 0 && - siginfo.current_signal >= data->signal_threshold) + siginfo.data.signal >= data->signal_threshold) data->scan_interval = data->long_interval; } wpa_printf(MSG_DEBUG, "bgscan simple: Init scan interval: %d", diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index e91bf4ebe..49fc8caaf 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -8101,9 +8101,9 @@ static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, char *buf, pos = buf; end = buf + buflen; - ret = os_snprintf(pos, end - pos, "RSSI=%d\nLINKSPEED=%d\n" + ret = os_snprintf(pos, end - pos, "RSSI=%d\nLINKSPEED=%lu\n" "NOISE=%d\nFREQUENCY=%u\n", - si.current_signal, si.current_txrate / 1000, + si.data.signal, si.data.current_tx_rate / 1000, si.current_noise, si.frequency); if (os_snprintf_error(end - pos, ret)) return -1; @@ -8133,17 +8133,17 @@ static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, char *buf, pos += ret; } - if (si.avg_signal) { + if (si.data.avg_signal) { ret = os_snprintf(pos, end - pos, - "AVG_RSSI=%d\n", si.avg_signal); + "AVG_RSSI=%d\n", si.data.avg_signal); if (os_snprintf_error(end - pos, ret)) return -1; pos += ret; } - if (si.avg_beacon_signal) { + if (si.data.avg_beacon_signal) { ret = os_snprintf(pos, end - pos, - "AVG_BEACON_RSSI=%d\n", si.avg_beacon_signal); + "AVG_BEACON_RSSI=%d\n", si.data.avg_beacon_signal); if (os_snprintf_error(end - pos, ret)) return -1; pos += ret; @@ -11565,10 +11565,10 @@ static int wpas_ctrl_iface_mlo_signal_poll(struct wpa_supplicant *wpa_s, continue; ret = os_snprintf(pos, end - pos, - "LINK_ID=%d\nRSSI=%d\nLINKSPEED=%d\n" + "LINK_ID=%d\nRSSI=%d\nLINKSPEED=%lu\n" "NOISE=%d\nFREQUENCY=%u\n", - i, mlo_si.links[i].current_signal, - mlo_si.links[i].current_txrate / 1000, + i, mlo_si.links[i].data.signal, + mlo_si.links[i].data.current_tx_rate / 1000, mlo_si.links[i].current_noise, mlo_si.links[i].frequency); if (os_snprintf_error(end - pos, ret)) @@ -11600,19 +11600,19 @@ static int wpas_ctrl_iface_mlo_signal_poll(struct wpa_supplicant *wpa_s, pos += ret; } - if (mlo_si.links[i].avg_signal) { + if (mlo_si.links[i].data.avg_signal) { ret = os_snprintf(pos, end - pos, "AVG_RSSI=%d\n", - mlo_si.links[i].avg_signal); + mlo_si.links[i].data.avg_signal); if (os_snprintf_error(end - pos, ret)) return -1; pos += ret; } - if (mlo_si.links[i].avg_beacon_signal) { + if (mlo_si.links[i].data.avg_beacon_signal) { ret = os_snprintf(pos, end - pos, "AVG_BEACON_RSSI=%d\n", - mlo_si.links[i].avg_beacon_signal); + mlo_si.links[i].data.avg_beacon_signal); if (os_snprintf_error(end - pos, ret)) return -1; pos += ret; diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c index b45ab4022..69fdf6036 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers.c +++ b/wpa_supplicant/dbus/dbus_new_handlers.c @@ -1969,9 +1969,9 @@ DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, "a{sv}", &variant_iter) || !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || !wpa_dbus_dict_append_int32(&iter_dict, "rssi", - si.current_signal) || + si.data.signal) || !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", - si.current_txrate / 1000) || + si.data.current_tx_rate / 1000) || !wpa_dbus_dict_append_int32(&iter_dict, "noise", si.current_noise) || !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", @@ -1985,9 +1985,9 @@ DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, si.center_frq1) || !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", si.center_frq2))) || - (si.avg_signal && + (si.data.avg_signal && !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", - si.avg_signal)) || + si.data.avg_signal)) || !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || !dbus_message_iter_close_container(&iter, &variant_iter)) goto nomem; diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index fe8ab50ff..ee2271d67 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -2004,9 +2004,9 @@ int wpa_supplicant_need_to_roam_within_ess(struct wpa_supplicant *wpa_s, * information about our currently associated AP. */ if (wpa_drv_signal_poll(wpa_s, &si) == 0 && - (si.avg_beacon_signal || si.avg_signal)) { - cur_level = si.avg_beacon_signal ? si.avg_beacon_signal : - si.avg_signal; + (si.data.avg_beacon_signal || si.data.avg_signal)) { + cur_level = si.data.avg_beacon_signal ? si.data.avg_beacon_signal : + si.data.avg_signal; cur_snr = wpas_get_snr_signal_info(si.frequency, cur_level, si.current_noise); @@ -5769,18 +5769,18 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, break; case EVENT_SIGNAL_CHANGE: wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_SIGNAL_CHANGE - "above=%d signal=%d noise=%d txrate=%d", + "above=%d signal=%d noise=%d txrate=%lu", data->signal_change.above_threshold, - data->signal_change.current_signal, + data->signal_change.data.signal, data->signal_change.current_noise, - data->signal_change.current_txrate); + data->signal_change.data.current_tx_rate); wpa_bss_update_level(wpa_s->current_bss, - data->signal_change.current_signal); + data->signal_change.data.signal); bgscan_notify_signal_change( wpa_s, data->signal_change.above_threshold, - data->signal_change.current_signal, + data->signal_change.data.signal, data->signal_change.current_noise, - data->signal_change.current_txrate); + data->signal_change.data.current_tx_rate); break; case EVENT_INTERFACE_MAC_CHANGED: wpa_supplicant_update_mac_addr(wpa_s); diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index fa91648d0..f86ca0f77 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -8888,17 +8888,17 @@ int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s, continue; wpa_printf(MSG_DEBUG, "Override driver signal_poll information: current_signal: %d->%d avg_signal: %d->%d avg_beacon_signal: %d->%d current_noise: %d->%d", - si->current_signal, + si->data.signal, dso->si_current_signal, - si->avg_signal, + si->data.avg_signal, dso->si_avg_signal, - si->avg_beacon_signal, + si->data.avg_beacon_signal, dso->si_avg_beacon_signal, si->current_noise, dso->si_current_noise); - si->current_signal = dso->si_current_signal; - si->avg_signal = dso->si_avg_signal; - si->avg_beacon_signal = dso->si_avg_beacon_signal; + si->data.signal = dso->si_current_signal; + si->data.avg_signal = dso->si_avg_signal; + si->data.avg_beacon_signal = dso->si_avg_beacon_signal; si->current_noise = dso->si_current_noise; break; } From patchwork Wed Nov 30 23:33:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Ruth X-Patchwork-Id: 1710775 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=n9air9jc; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=chromium.org header.i=@chromium.org header.a=rsa-sha256 header.s=google header.b=arBDL51I; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NMx283DwVz23pF for ; Thu, 1 Dec 2022 10:56:48 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=yem5VEqeZQIGP7oCY/kM+UBqRuaVeS6jAE9jPYvCNGw=; b=n9air9jceYpHTW rUuwgljQNdzbCH068XJIfXAI85Z3Ha39mO85dcmBTBf+3NbjM7qLcqISftn00E2n2usspddwsF+a+ 8Yo92Jmh1G4XRWmbq9w1BWUpaxJXohbkV3vuHGevx+rYTHDYIYcgal/lVBn8Z7BWBLmF3mapVmNBn 5VxzIUb8f+jiMAoCdyYkb+u6q/+BKSN/A9iZRH9tNkawmzVB1k1FjqnYcgOQudePoIu1UCaszJsMz SldIebEhobbgRUvPvudv2B2rhuLx9JBQ34kh2Sc4fVLmtf53vZCs51aWwYYJV066jK/lsLiH83aCr IRBSTgWMpr6f2oUiHlNA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1p0Wvc-003Pmq-4V; Wed, 30 Nov 2022 23:55:48 +0000 Received: from mail-qt1-x82d.google.com ([2607:f8b0:4864:20::82d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1p0WaP-003GNC-39 for hostap@lists.infradead.org; Wed, 30 Nov 2022 23:33:55 +0000 Received: by mail-qt1-x82d.google.com with SMTP id h16so12295343qtu.2 for ; Wed, 30 Nov 2022 15:33:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fyrRJ5gGEuhaCCwxAGtZ7qkaLJjcX2oFvQ9UfIh6eZc=; b=arBDL51IFMz7Ay4t94JKaNF3APl948pLEIAaQWi37dpXmvDeQ5edm0SO/PVj4hJ8iS G0S/YJHnbKGNauIvlM6n+zqwu1+4qZFuPLUH0rv/whI0ndWnNc/I7c0S3Co/VFHepCq5 0y6eSQr9JX2F9YxgqvjDP2NjkcilQTgFgFSl0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fyrRJ5gGEuhaCCwxAGtZ7qkaLJjcX2oFvQ9UfIh6eZc=; b=IAGv69GWmVYUTyX9iP/rBcLl/IzqbS0yJzirexe2gIqxI++iGPfogJhxoIQH8cJ6kJ nztO8xZUAC9B/nrv+MrweTGvbLUlAidQZFTsM5isMAAony+6mUUpDzeJuitSQNmGwjN9 MPfOQigrLzSb49FJFFneQJR+JFg8KSPCPhnQ3tiuDkKE9eQYG6ai6jjqUA8ZnmCv1rEB ZC3ViOk/bz3vXtCZ/id34+cbCMSelyXteT0uCTazrcrQLO0mmUqYamFKm0pwp3IG36Cx S14FLEDu5oM9Jiq74RCYjTraTjf3BfMjHi9s1LS3YI2wAp+cCdVzT+WDVc/Cx85DIrwY r4gg== X-Gm-Message-State: ANoB5pnAJBcqwzAKeicUGNkSzzayqEdXG2ADiMVq80KKmtbF0qajLwqT BgTRdjLaEAgb9Q9Tmb+euYb3+sKP8V/HsQ== X-Google-Smtp-Source: AA0mqf46mEXtJMw7wU9sMAnSmT5MmWaBN+33R+9rIaq/xcbNGqMMsRuKBLi2P1rDZP4inna7DqHwiQ== X-Received: by 2002:ac8:741a:0:b0:3a5:2932:3a77 with SMTP id p26-20020ac8741a000000b003a529323a77mr59919777qtq.591.1669851231753; Wed, 30 Nov 2022 15:33:51 -0800 (PST) Received: from localhost (228.221.150.34.bc.googleusercontent.com. [34.150.221.228]) by smtp.gmail.com with UTF8SMTPSA id u10-20020a05620a430a00b006fa9d101775sm2167941qko.33.2022.11.30.15.33.50 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 30 Nov 2022 15:33:50 -0800 (PST) From: David Ruth To: Hostap Mailing List Cc: David Ruth Subject: [PATCH 2/2] Emit more information over D-Bus. Date: Wed, 30 Nov 2022 23:33:10 +0000 Message-Id: <20221130233310.3559058-2-druth@chromium.org> X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog In-Reply-To: <20221130233310.3559058-1-druth@chromium.org> References: <20221130233310.3559058-1-druth@chromium.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221130_153353_193291_C02C760E X-CRM114-Status: GOOD ( 21.01 ) X-Spam-Score: -0.4 (/) X-Spam-Report: =?unknown-8bit?q?Spam_detection_software=2C_running_on_the_sy?= =?unknown-8bit?q?stem_=22bombadil=2Einfradead=2Eorg=22=2C?= =?unknown-8bit?q?_has_NOT_identified_this_incoming_email_as_spam=2E__The_ori?= =?unknown-8bit?q?ginal?= =?unknown-8bit?q?_message_has_been_attached_to_this_so_you_can_view_it_or_la?= =?unknown-8bit?q?bel?= =?unknown-8bit?q?_similar_future_email=2E__If_you_have_any_questions=2C_see?= =?unknown-8bit?q?_the_administrator_of_that_system_for_details=2E?= =?unknown-8bit?q?_?= =?unknown-8bit?q?_Content_preview=3A__Allows_informing_the_connection_manage?= =?unknown-8bit?q?r_of_additional_information?= =?unknown-8bit?q?_on_CQM_events=2E=C2=A0_Allows_the_connection_manager_to_re?= =?unknown-8bit?q?quest_the_same_information?= =?unknown-8bit?q?_on_demand_by_using_the_existing_=22SignalPoll=22_method=2E?= =?unknown-8bit?q?_*_Add_new_property_=22SignalChange=22?= =?unknown-8bit?b?IMKgwqDCoMKgwqDCoMKgwqAqIEFkZCBzdG9yYWdlIGZvciB3cGFfc2ln?= =?unknown-8bit?b?bmFsX2luZm8gaW50byB3cGFfc3VwcGxpY2FudCBjb250ZXh0?= =?unknown-8bit?b?IMKgwqDCoMKgwqDCoMKgwqDCoMKgb2JqZWN0IMKgwqDCoMKgwqDCoMKg?= =?unknown-8bit?b?wqAqIENvcHkgbWVtb3J5IGZyb20gZXZlbnQgdG8gY29udGV4dA==?= =?unknown-8bit?b?IG9iamVjdCBvbiBbLi4uXSA=?= =?unknown-8bit?q?_?= =?unknown-8bit?q?_Content_analysis_details=3A___=28-0=2E4_points=2C_5=2E0_re?= =?unknown-8bit?q?quired=29?= =?unknown-8bit?q?_?= =?unknown-8bit?q?_pts_rule_name______________description?= =?unknown-8bit?q?_----_----------------------_------------------------------?= =?unknown-8bit?q?--------------------?= =?unknown-8bit?q?_-0=2E0_RCVD=5FIN=5FDNSWL=5FNONE_____RBL=3A_Sender_listed_a?= =?unknown-8bit?q?t_https=3A//www=2Ednswl=2Eorg/=2C?= =?unknown-8bit?q?_no_trust?= =?unknown-8bit?b?IFsyNjA3OmY4YjA6NDg2NDoyMDowOjA6MDo4MmQgbGlzdGVkIGluXQ==?= =?unknown-8bit?b?IFtsaXN0LmRuc3dsLm9yZ10=?= =?unknown-8bit?q?_-0=2E0_SPF=5FPASS_______________SPF=3A_sender_matches_SPF_?= =?unknown-8bit?q?record?= =?unknown-8bit?q?_0=2E0_SPF=5FHELO=5FNONE__________SPF=3A_HELO_does_not_publ?= =?unknown-8bit?q?ish_an_SPF_Record?= =?unknown-8bit?q?_-0=2E1_DKIM=5FVALID=5FAU__________Message_has_a_valid_DKIM?= =?unknown-8bit?q?_or_DK_signature_from?= =?unknown-8bit?q?_author=27s_domain?= =?unknown-8bit?q?_-0=2E1_DKIM=5FVALID_____________Message_has_at_least_one_v?= =?unknown-8bit?q?alid_DKIM_or_DK_signature?= =?unknown-8bit?q?_0=2E1_DKIM=5FSIGNED____________Message_has_a_DKIM_or_DK_si?= =?unknown-8bit?q?gnature=2C_not_necessarily?= =?unknown-8bit?q?_valid?= =?unknown-8bit?q?_-0=2E1_DKIM=5FVALID=5FEF__________Message_has_a_valid_DKIM?= =?unknown-8bit?q?_or_DK_signature_from?= =?unknown-8bit?q?_envelope-from_domain?= =?unknown-8bit?q?_-0=2E2_DKIMWL=5FWL=5FHIGH_________DKIMwl=2Eorg_-_High_trus?= =?unknown-8bit?q?t_sender?= X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Allows informing the connection manager of additional information on CQM events.  Allows the connection manager to request the same information on demand by using the existing "SignalPoll" method. * Add new property "SignalChange"         * Add storage for wpa_signal_info into wpa_supplicant context           object         * Copy memory from event to context object on CQM Event * Write a common conversion method to be used by both "SignalPoll" and   this property Signed-off-by: David Ruth --- doc/dbus.doxygen | 29 +++++- wpa_supplicant/dbus/dbus_dict_helpers.c | 19 ++++ wpa_supplicant/dbus/dbus_dict_helpers.h | 4 + wpa_supplicant/dbus/dbus_new.c | 8 ++ wpa_supplicant/dbus/dbus_new.h | 2 + wpa_supplicant/dbus/dbus_new_handlers.c | 52 +++++----- wpa_supplicant/dbus/dbus_new_handlers.h | 2 + wpa_supplicant/dbus/dbus_new_helpers.c | 126 ++++++++++++++++++++++++ wpa_supplicant/dbus/dbus_new_helpers.h | 4 + wpa_supplicant/events.c | 2 + wpa_supplicant/notify.c | 4 + wpa_supplicant/notify.h | 1 + wpa_supplicant/wpa_supplicant_i.h | 2 + 13 files changed, 228 insertions(+), 27 deletions(-) diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen index 504db7540..b00fdf6b6 100644 --- a/doc/dbus.doxygen +++ b/doc/dbus.doxygen @@ -647,6 +647,33 @@ fi.w1.wpa_supplicant1.CreateInterface. avg-rssiiAverage RSSI (dBm)No center-frq1iVHT segment 1 frequency (MHz)No center-frq2iVHT segment 2 frequency (MHz)No + rx-bytesiBytes recievedNo + tx-bytesiBytes sentNo + rx-packetsiPackets recievedNo + tx-packetsiPackets sentNo + beaconsiBeacons receivedNo + linkrxspeediLink Speed (RX, kbps)No + linktxspeediLink Speed (TX, kbps)No + retries-failediRetries (failed)No + retriesiRetriesNo + last-ack-rssiiRSSI of last ACK frame (dBm)No + fcs-errorsiFCS errorsNo + beacon-lossesiBeacons lostNo + expected-throughputiExpected Throughput (kbps)No + rx-drop-misciRX packets dropped for unspecified reasonsNo + rx-mpdusiRecieved packetsNo + rx-he-mcsiMCS index (rx, he)No + tx-he-mcsiMCS index (tx, he)No + rx-vht-mcsiMCS index (rx, vht)No + tx-vht-mcsiMCS index (tx, vht)No + rx-mcsiMCS index (rx)No + tx-mcsiMCS index (tx)No + rx-he-nssiNumber of streams (rx, he)No + tx-he-nssiNumber of streams (tx, he)No + rx-vht-nssiNumber of streams (rx, vht)No + tx-vht-nssiNumber of streams (tx, vht)No + avg-beacon-rssiiAverage Beacon RSSI (dBm)No + avg-ack-rssiiAverage ACK frame RSSI (dBm)No @@ -1240,7 +1267,7 @@ fi.w1.wpa_supplicant1.CreateInterface.

Arguments

a{sv} : properties
-
A dictionary with pairs of properties names which have changed and theirs new values. Possible dictionary keys are: "ApScan", "Scanning", "State", "CurrentBSS", "CurrentNetwork"
+
A dictionary with pairs of properties names which have changed and their new values. Possible dictionary keys are: "ApScan", "Scanning", "State", "CurrentBSS", "CurrentNetwork", "SignalChange"
diff --git a/wpa_supplicant/dbus/dbus_dict_helpers.c b/wpa_supplicant/dbus/dbus_dict_helpers.c index e4e9b8da9..0e4753450 100644 --- a/wpa_supplicant/dbus/dbus_dict_helpers.c +++ b/wpa_supplicant/dbus/dbus_dict_helpers.c @@ -298,6 +298,25 @@ dbus_bool_t wpa_dbus_dict_append_uint32(DBusMessageIter *iter_dict, } +/** + * Add a 64-bit unsigned integer entry to the dict. + * + * @param iter_dict A valid DBusMessageIter returned from + * wpa_dbus_dict_open_write() + * @param key The key of the dict item + * @param value The 64-bit unsigned integer value + * @return TRUE on success, FALSE on failure + * + */ +dbus_bool_t wpa_dbus_dict_append_uint64(DBusMessageIter *iter_dict, + const char *key, + const dbus_uint64_t value) +{ + return _wpa_dbus_add_dict_entry_basic(iter_dict, key, DBUS_TYPE_UINT64, + &value); +} + + /** * Add a DBus object path entry to the dict. * diff --git a/wpa_supplicant/dbus/dbus_dict_helpers.h b/wpa_supplicant/dbus/dbus_dict_helpers.h index 94a0efdbe..44685ea4a 100644 --- a/wpa_supplicant/dbus/dbus_dict_helpers.h +++ b/wpa_supplicant/dbus/dbus_dict_helpers.h @@ -46,6 +46,10 @@ dbus_bool_t wpa_dbus_dict_append_uint32(DBusMessageIter *iter_dict, const char *key, const dbus_uint32_t value); +dbus_bool_t wpa_dbus_dict_append_uint64(DBusMessageIter *iter_dict, + const char *key, + const dbus_uint64_t value); + dbus_bool_t wpa_dbus_dict_append_object_path(DBusMessageIter *iter_dict, const char *key, const char *value); diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c index 9279ae4d5..2127554f2 100644 --- a/wpa_supplicant/dbus/dbus_new.c +++ b/wpa_supplicant/dbus/dbus_new.c @@ -2344,6 +2344,9 @@ void wpas_dbus_signal_prop_changed(struct wpa_supplicant *wpa_s, case WPAS_DBUS_PROP_BSS_TM_STATUS: prop = "BSSTMStatus"; break; + case WPAS_DBUS_PROP_SIGNAL_CHANGE: + prop = "SignalChange"; + break; default: wpa_printf(MSG_ERROR, "dbus: %s: Unknown Property value %d", __func__, property); @@ -3939,6 +3942,11 @@ static const struct wpa_dbus_property_desc wpas_dbus_interface_properties[] = { wpas_dbus_setter_mac_address_randomization_mask, NULL }, + { "SignalChange", WPAS_DBUS_NEW_IFACE_INTERFACE, "a{sv}", + wpas_dbus_getter_signal_change, + NULL, + NULL + }, { NULL, NULL, NULL, NULL, NULL, NULL } }; diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h index 26bdcb548..cb6a55be5 100644 --- a/wpa_supplicant/dbus/dbus_new.h +++ b/wpa_supplicant/dbus/dbus_new.h @@ -11,6 +11,7 @@ #define CTRL_IFACE_DBUS_NEW_H #include "common/defs.h" +#include "drivers/driver.h" #include "p2p/p2p.h" struct wpa_global; @@ -38,6 +39,7 @@ enum wpas_dbus_prop { WPAS_DBUS_PROP_ROAM_COMPLETE, WPAS_DBUS_PROP_SESSION_LENGTH, WPAS_DBUS_PROP_BSS_TM_STATUS, + WPAS_DBUS_PROP_SIGNAL_CHANGE, }; enum wpas_dbus_bss_prop { diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c index 69fdf6036..145c7a2ff 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers.c +++ b/wpa_supplicant/dbus/dbus_new_handlers.c @@ -1950,7 +1950,7 @@ DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, { struct wpa_signal_info si; DBusMessage *reply = NULL; - DBusMessageIter iter, iter_dict, variant_iter; + DBusMessageIter iter; int ret; ret = wpa_drv_signal_poll(wpa_s, &si); @@ -1965,31 +1965,7 @@ DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message, dbus_message_iter_init_append(reply, &iter); - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, - "a{sv}", &variant_iter) || - !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || - !wpa_dbus_dict_append_int32(&iter_dict, "rssi", - si.data.signal) || - !wpa_dbus_dict_append_int32(&iter_dict, "linkspeed", - si.data.current_tx_rate / 1000) || - !wpa_dbus_dict_append_int32(&iter_dict, "noise", - si.current_noise) || - !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", - si.frequency) || - (si.chanwidth != CHAN_WIDTH_UNKNOWN && - !wpa_dbus_dict_append_string( - &iter_dict, "width", - channel_width_to_string(si.chanwidth))) || - (si.center_frq1 > 0 && si.center_frq2 > 0 && - (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", - si.center_frq1) || - !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", - si.center_frq2))) || - (si.data.avg_signal && - !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", - si.data.avg_signal)) || - !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || - !dbus_message_iter_close_container(&iter, &variant_iter)) + if (wpas_dbus_new_from_signal_information(&iter, &si) != 0) goto nomem; return reply; @@ -6099,3 +6075,27 @@ dbus_bool_t wpas_dbus_getter_mesh_group( } #endif /* CONFIG_MESH */ + +/** + * wpas_dbus_getter_signal_change - Get signal change + * @iter: Pointer to incoming dbus message iter + * @error: Location to store error on failure + * @user_data: Function specific data + * Returns: TRUE on success, FALSE on failure + * + * Getter for "SignalChange" property. + */ +dbus_bool_t wpas_dbus_getter_signal_change( + const struct wpa_dbus_property_desc *property_desc, + DBusMessageIter *iter, DBusError *error, void *user_data) +{ + struct wpa_supplicant *wpa_s = user_data; + struct wpa_signal_info si = wpa_s->last_signal_info; + + if (wpas_dbus_new_from_signal_information(iter, &si) != 0) { + dbus_set_error(error, DBUS_ERROR_FAILED, + "%s: error constructing reply", __func__); + return FALSE; + } + return TRUE; +} diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h b/wpa_supplicant/dbus/dbus_new_handlers.h index a421083f7..2fc8434cb 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers.h +++ b/wpa_supplicant/dbus/dbus_new_handlers.h @@ -246,6 +246,8 @@ DECLARE_ACCESSOR(wpas_dbus_setter_wps_device_device_type); DECLARE_ACCESSOR(wpas_dbus_getter_mesh_peers); DECLARE_ACCESSOR(wpas_dbus_getter_mesh_group); +DECLARE_ACCESSOR(wpas_dbus_getter_signal_change); + DBusMessage * wpas_dbus_handler_tdls_discover(DBusMessage *message, struct wpa_supplicant *wpa_s); DBusMessage * wpas_dbus_handler_tdls_setup(DBusMessage *message, diff --git a/wpa_supplicant/dbus/dbus_new_helpers.c b/wpa_supplicant/dbus/dbus_new_helpers.c index d9009ba85..b8d3e0131 100644 --- a/wpa_supplicant/dbus/dbus_new_helpers.c +++ b/wpa_supplicant/dbus/dbus_new_helpers.c @@ -1023,3 +1023,129 @@ DBusMessage * wpas_dbus_reply_new_from_error(DBusMessage *message, } return NULL; } + +/** + * wpas_dbus_new_from_signal_information - Adds a wpa_signal_info + * to a DBusMessage. + * @msg: Pointer to message to append fields to + * @si: Pointer to wpa_signal_info to add to the message + * Returns: 0 on success, otherwise, an errorcode + * + * Adds all the pertinent fields from a wpa_signal_info to a DBusMessage. + * The same logic is useful in both responding to signal_poll calls, and + * sending signal_change signals. + */ +int wpas_dbus_new_from_signal_information(DBusMessageIter *iter, + struct wpa_signal_info *si) +{ + DBusMessageIter iter_dict, variant_iter; + if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, + "a{sv}", &variant_iter) || + !wpa_dbus_dict_open_write(&variant_iter, &iter_dict) || + !wpa_dbus_dict_append_int32(&iter_dict, "rssi", + si->data.signal) || + !wpa_dbus_dict_append_uint32(&iter_dict, "linkspeed", + si->data.current_tx_rate / 1000) || + !wpa_dbus_dict_append_int32(&iter_dict, "noise", + si->current_noise) || + !wpa_dbus_dict_append_uint32(&iter_dict, "frequency", + si->frequency) || + (si->chanwidth != CHAN_WIDTH_UNKNOWN && + !wpa_dbus_dict_append_string( + &iter_dict, "width", + channel_width_to_string(si->chanwidth))) || + (si->center_frq1 > 0 && si->center_frq2 > 0 && + (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1", + si->center_frq1) || + !wpa_dbus_dict_append_int32(&iter_dict, "center-frq2", + si->center_frq2))) || + (si->data.avg_signal && + !wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi", + si->data.avg_signal)) || + (si->data.rx_bytes && + !wpa_dbus_dict_append_uint64(&iter_dict, "rx-bytes", + si->data.rx_bytes)) || + (si->data.tx_bytes && + !wpa_dbus_dict_append_uint64(&iter_dict, "tx-bytes", + si->data.tx_bytes)) || + (si->data.rx_packets && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-packets", + si->data.rx_packets)) || + (si->data.tx_packets && + !wpa_dbus_dict_append_uint32(&iter_dict, "tx-packets", + si->data.tx_packets)) || + (si->data.beacons_count && + !wpa_dbus_dict_append_uint64(&iter_dict, "beacons", + si->data.beacons_count)) || + (si->data.current_rx_rate && + !wpa_dbus_dict_append_uint32(&iter_dict, "linkrxspeed", + si->data.current_rx_rate )) || + (si->data.current_rx_rate && + !wpa_dbus_dict_append_uint32(&iter_dict, "linktxspeed", + si->data.current_tx_rate )) || + (si->data.tx_retry_failed && + !wpa_dbus_dict_append_uint32(&iter_dict, "retries-failed", + si->data.tx_retry_failed)) || + (si->data.tx_retry_count && + !wpa_dbus_dict_append_uint32(&iter_dict, "retries", + si->data.tx_retry_count)) || + (si->data.last_ack_rssi && + !wpa_dbus_dict_append_int32(&iter_dict, "last-ack-rssi", + si->data.last_ack_rssi)) || + (si->data.fcs_error_count && + !wpa_dbus_dict_append_uint32(&iter_dict, "fcs-errors", + si->data.fcs_error_count)) || + (si->data.beacon_loss_count && + !wpa_dbus_dict_append_uint32(&iter_dict, "beacon-losses", + si->data.beacon_loss_count)) || + (si->data.expected_throughput && + !wpa_dbus_dict_append_uint32(&iter_dict, "expected-throughput", + si->data.expected_throughput)) || + (si->data.rx_drop_misc && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-drop-misc", + si->data.rx_drop_misc)) || + (si->data.rx_mpdus && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-mpdus", + si->data.rx_mpdus)) || + (si->data.rx_hemcs && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-he-mcs", + si->data.rx_hemcs)) || + (si->data.tx_hemcs && + !wpa_dbus_dict_append_uint32(&iter_dict, "tx-he-mcs", + si->data.tx_hemcs)) || + (si->data.rx_vhtmcs && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-vht-mcs", + si->data.rx_vhtmcs)) || + (si->data.tx_vhtmcs && + !wpa_dbus_dict_append_uint32(&iter_dict, "tx-vht-mcs", + si->data.tx_vhtmcs)) || + (si->data.rx_mcs && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-mcs", + si->data.rx_mcs)) || + (si->data.tx_mcs && + !wpa_dbus_dict_append_uint32(&iter_dict, "tx-mcs", + si->data.tx_mcs)) || + (si->data.rx_he_nss && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-he-nss", + si->data.rx_he_nss)) || + (si->data.tx_he_nss && + !wpa_dbus_dict_append_uint32(&iter_dict, "tx-he-nss", + si->data.tx_he_nss)) || + (si->data.rx_vht_nss && + !wpa_dbus_dict_append_uint32(&iter_dict, "rx-vht-nss", + si->data.rx_vht_nss)) || + (si->data.tx_vht_nss && + !wpa_dbus_dict_append_uint32(&iter_dict, "tx-vht-nss", + si->data.tx_vht_nss)) || + (si->data.avg_beacon_signal && + !wpa_dbus_dict_append_int32(&iter_dict, "avg-beacon-rssi", + si->data.avg_beacon_signal)) || + (si->data.avg_ack_signal && + !wpa_dbus_dict_append_int32(&iter_dict, "avg-ack-rssi", + si->data.avg_ack_signal)) || + !wpa_dbus_dict_close_write(&variant_iter, &iter_dict) || + !dbus_message_iter_close_container(iter, &variant_iter)) + return -ENOMEM; + + return 0; +} diff --git a/wpa_supplicant/dbus/dbus_new_helpers.h b/wpa_supplicant/dbus/dbus_new_helpers.h index 7b63b28d7..4eb0e286c 100644 --- a/wpa_supplicant/dbus/dbus_new_helpers.h +++ b/wpa_supplicant/dbus/dbus_new_helpers.h @@ -11,6 +11,7 @@ #define WPA_DBUS_CTRL_H #include +#include "drivers/driver.h" typedef DBusMessage * (*WPADBusMethodHandler)(DBusMessage *message, void *user_data); @@ -151,4 +152,7 @@ DBusMessage *wpas_dbus_reply_new_from_error(DBusMessage *message, const char *fallback_name, const char *fallback_string); + +int wpas_dbus_new_from_signal_information(DBusMessageIter *iter, + struct wpa_signal_info *si); #endif /* WPA_DBUS_CTRL_H */ diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index ee2271d67..bc89b2087 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -5781,6 +5781,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, data->signal_change.data.signal, data->signal_change.current_noise, data->signal_change.data.current_tx_rate); + os_memcpy(&wpa_s->last_signal_info, data, sizeof(struct wpa_signal_info)); + wpas_notify_signal_change(wpa_s); break; case EVENT_INTERFACE_MAC_CHANGED: wpa_supplicant_update_mac_addr(wpa_s); diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index 427405da9..466f26804 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -976,6 +976,10 @@ void wpas_notify_interworking_select_done(struct wpa_supplicant *wpa_s) wpas_dbus_signal_interworking_select_done(wpa_s); } +void wpas_notify_signal_change(struct wpa_supplicant *wpa_s) +{ + wpas_dbus_signal_prop_changed(wpa_s, WPAS_DBUS_PROP_SIGNAL_CHANGE); +} #endif /* CONFIG_INTERWORKING */ diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index f26f4286d..41b4258c2 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -166,5 +166,6 @@ void wpas_notify_interworking_ap_added(struct wpa_supplicant *wpa_s, void wpas_notify_interworking_select_done(struct wpa_supplicant *wpa_s); void wpas_notify_pmk_cache_added(struct wpa_supplicant *wpa_s, struct rsn_pmksa_cache_entry *entry); +void wpas_notify_signal_change(struct wpa_supplicant *wpa_s); #endif /* NOTIFY_H */ diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 0cc8633ee..f5c44115c 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1523,6 +1523,8 @@ struct wpa_supplicant { unsigned int enable_dscp_policy_capa:1; unsigned int connection_dscp:1; unsigned int wait_for_dscp_req:1; + + struct wpa_signal_info last_signal_info; };