From: Louis Kotze <loukot@gmail.com>
To: johannes@sipsolutions.net
Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org,
loukot@gmail.com
Subject: [PATCH v2 2/2] wifi: cfg80211: tests: check BSS lookup failure reasons
Date: Tue, 21 Jul 2026 20:11:58 +0200 [thread overview]
Message-ID: <20260721181158.3004022-3-loukot@gmail.com> (raw)
In-Reply-To: <20260721181158.3004022-1-loukot@gmail.com>
Add a KUnit test for the extack failure reasons that
__cfg80211_get_bss() now reports: no matching scan entry at all, a
matching entry that is expired, and a matching entry whose use_for
flags do not allow the requested use. Also cover the cases that must
not report a failure (a fresh entry, and an expired-but-held entry),
the precedence for an entry that is both expired and unusable, and
the cross-entry precedence when one matching entry is expired and
another is current but unusable.
Signed-off-by: Louis Kotze <loukot@gmail.com>
---
net/wireless/tests/scan.c | 120 ++++++++++++++++++++++++++++++++++++++
1 file changed, 120 insertions(+)
diff --git a/net/wireless/tests/scan.c b/net/wireless/tests/scan.c
index 2fc717317ac3..e62b01f8cbe5 100644
--- a/net/wireless/tests/scan.c
+++ b/net/wireless/tests/scan.c
@@ -402,6 +402,125 @@ static void test_inform_bss_ssid_only(struct kunit *test)
cfg80211_put_bss(wiphy, bss);
}
+static void test_get_bss_miss_reason(struct kunit *test)
+{
+ struct inform_bss ctx = {
+ .test = test,
+ };
+ struct wiphy *wiphy = T_WIPHY(test, ctx);
+ struct cfg80211_inform_bss inform_bss = {
+ .signal = 50,
+ .drv_data = &ctx,
+ };
+ const u8 bssid[ETH_ALEN] = { 0x10, 0x22, 0x33, 0x44, 0x55, 0x66 };
+ const u8 other_bssid[ETH_ALEN] = { 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
+ static const u8 ies[] = {
+ [0] = WLAN_EID_SSID,
+ [1] = 4,
+ [2] = 'T', 'E', 'S', 'T'
+ };
+ struct cfg80211_internal_bss *ibss;
+ struct netlink_ext_ack extack = {};
+ struct cfg80211_bss *bss, *bss2, *found;
+
+ inform_bss.chan = ieee80211_get_channel_khz(wiphy, MHZ_TO_KHZ(2412));
+ KUNIT_ASSERT_NOT_NULL(test, inform_bss.chan);
+
+ bss = cfg80211_inform_bss_data(wiphy, &inform_bss,
+ CFG80211_BSS_FTYPE_PRESP, bssid, 0,
+ 0x1234, 100, ies, sizeof(ies),
+ GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, bss);
+ ibss = container_of(bss, struct cfg80211_internal_bss, pub);
+
+ /* Fresh usable entry: found, no message is set */
+ found = __cfg80211_get_bss(wiphy, NULL, bssid, NULL, 0,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_ASSERT_PTR_EQ(test, found, bss);
+ KUNIT_EXPECT_NULL(test, extack._msg);
+ cfg80211_put_bss(wiphy, found);
+
+ /* No entry at all for this BSSID */
+ found = __cfg80211_get_bss(wiphy, NULL, other_bssid, NULL, 0,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_EXPECT_NULL(test, found);
+ KUNIT_EXPECT_STREQ(test, extack._msg, "BSS not found in scan results");
+
+ /* Fresh entry that is not usable for the requested use */
+ extack._msg = NULL;
+ bss->use_for = 0;
+ found = __cfg80211_get_bss(wiphy, NULL, bssid, NULL, 0,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_EXPECT_NULL(test, found);
+ KUNIT_EXPECT_STREQ(test, extack._msg,
+ "BSS cannot be used for the requested operation");
+ bss->use_for = NL80211_BSS_USE_FOR_ALL;
+
+ /* Expired entry, > IEEE80211_SCAN_RESULT_EXPIRE (30s) old */
+ extack._msg = NULL;
+ ibss->ts = jiffies - 60 * HZ;
+ found = __cfg80211_get_bss(wiphy, NULL, bssid, NULL, 0,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_EXPECT_NULL(test, found);
+ KUNIT_EXPECT_STREQ(test, extack._msg,
+ "BSS entry is expired, scan again");
+
+ /* An entry both expired and unusable reports expired */
+ extack._msg = NULL;
+ bss->use_for = 0;
+ found = __cfg80211_get_bss(wiphy, NULL, bssid, NULL, 0,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_EXPECT_NULL(test, found);
+ KUNIT_EXPECT_STREQ(test, extack._msg,
+ "BSS entry is expired, scan again");
+ bss->use_for = NL80211_BSS_USE_FOR_ALL;
+
+ /* Expired but held entries are still usable, no message is set */
+ extack._msg = NULL;
+ atomic_set(&ibss->hold, 1);
+ found = __cfg80211_get_bss(wiphy, NULL, bssid, NULL, 0,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_ASSERT_PTR_EQ(test, found, bss);
+ KUNIT_EXPECT_NULL(test, extack._msg);
+ cfg80211_put_bss(wiphy, found);
+ atomic_set(&ibss->hold, 0);
+
+ /*
+ * With both an expired entry and a fresh-but-unusable entry
+ * matching, the unusable one determines the message: a current
+ * entry exists, so suggesting a rescan would be misleading.
+ */
+ bss2 = cfg80211_inform_bss_data(wiphy, &inform_bss,
+ CFG80211_BSS_FTYPE_PRESP, other_bssid,
+ 0, 0x1234, 100, ies, sizeof(ies),
+ GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, bss2);
+ bss2->use_for = 0;
+ extack._msg = NULL;
+ found = __cfg80211_get_bss(wiphy, NULL, NULL, "TEST", 4,
+ IEEE80211_BSS_TYPE_ANY,
+ IEEE80211_PRIVACY_ANY,
+ NL80211_BSS_USE_FOR_NORMAL, &extack);
+ KUNIT_EXPECT_NULL(test, found);
+ KUNIT_EXPECT_STREQ(test, extack._msg,
+ "BSS cannot be used for the requested operation");
+
+ cfg80211_put_bss(wiphy, bss2);
+ cfg80211_put_bss(wiphy, bss);
+}
+
static struct inform_bss_ml_sta_case {
const char *desc;
int mld_id;
@@ -855,6 +974,7 @@ kunit_test_suite(gen_new_ie);
static struct kunit_case inform_bss_test_cases[] = {
KUNIT_CASE(test_inform_bss_ssid_only),
+ KUNIT_CASE(test_get_bss_miss_reason),
KUNIT_CASE_PARAM(test_inform_bss_ml_sta, inform_bss_ml_sta_gen_params),
{}
};
--
2.55.0
prev parent reply other threads:[~2026-07-21 18:12 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-11 4:34 [PATCH] wifi: nl80211: say why the association BSS lookup failed Louis Kotze
2026-07-21 15:31 ` Johannes Berg
2026-07-21 18:11 ` [PATCH v2 0/2] wifi: cfg80211: say why the auth/assoc " Louis Kotze
2026-07-21 18:11 ` [PATCH v2 1/2] " Louis Kotze
2026-07-21 22:10 ` Johannes Berg
2026-07-21 18:11 ` Louis Kotze [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260721181158.3004022-3-loukot@gmail.com \
--to=loukot@gmail.com \
--cc=johannes@sipsolutions.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox