1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /*
3 * KUnit tests for channel helper functions
4 *
5 * Copyright (C) 2024-2025 Intel Corporation
6 */
7 #include <kunit/static_stub.h>
8
9 #include "utils.h"
10 #include "mld.h"
11 #include "link.h"
12 #include "iface.h"
13 #include "fw/api/mac-cfg.h"
14
15 static const struct missed_beacon_test_case {
16 const char *desc;
17 struct {
18 struct iwl_missed_beacons_notif notif;
19 bool emlsr;
20 } input;
21 struct {
22 bool disconnected;
23 bool emlsr;
24 } output;
25 } missed_beacon_cases[] = {
26 {
27 .desc = "no EMLSR, no disconnect",
28 .input.notif = {
29 .consec_missed_beacons = cpu_to_le32(4),
30 },
31 },
32 {
33 .desc = "no EMLSR, no beacon loss since Rx, no disconnect",
34 .input.notif = {
35 .consec_missed_beacons = cpu_to_le32(20),
36 },
37 },
38 {
39 .desc = "no EMLSR, beacon loss since Rx, disconnect",
40 .input.notif = {
41 .consec_missed_beacons = cpu_to_le32(20),
42 .consec_missed_beacons_since_last_rx =
43 cpu_to_le32(10),
44 },
45 .output.disconnected = true,
46 },
47 };
48
49 KUNIT_ARRAY_PARAM_DESC(test_missed_beacon, missed_beacon_cases, desc);
50
fake_ieee80211_connection_loss(struct ieee80211_vif * vif)51 static void fake_ieee80211_connection_loss(struct ieee80211_vif *vif)
52 {
53 vif->cfg.assoc = false;
54 }
55
test_missed_beacon(struct kunit * test)56 static void test_missed_beacon(struct kunit *test)
57 {
58 struct iwl_mld *mld = test->priv;
59 struct iwl_missed_beacons_notif *notif;
60 const struct missed_beacon_test_case *test_param =
61 (const void *)(test->param_value);
62 struct ieee80211_vif *vif;
63 struct iwl_rx_packet *pkt;
64 struct iwl_mld_kunit_link link1 = {
65 .id = 0,
66 .band = NL80211_BAND_6GHZ,
67 };
68 struct iwl_mld_kunit_link link2 = {
69 .id = 1,
70 .band = NL80211_BAND_5GHZ,
71 };
72
73 kunit_activate_static_stub(test, ieee80211_connection_loss,
74 fake_ieee80211_connection_loss);
75 pkt = iwl_mld_kunit_create_pkt(test_param->input.notif);
76 notif = (void *)pkt->data;
77
78 if (test_param->input.emlsr) {
79 vif = iwlmld_kunit_assoc_emlsr(&link1, &link2);
80 } else {
81 struct iwl_mld_vif *mld_vif;
82
83 vif = iwlmld_kunit_setup_non_mlo_assoc(&link1);
84 mld_vif = iwl_mld_vif_from_mac80211(vif);
85 notif->link_id = cpu_to_le32(mld_vif->deflink.fw_id);
86 }
87
88 wiphy_lock(mld->wiphy);
89
90 iwl_mld_handle_missed_beacon_notif(mld, pkt);
91
92 wiphy_unlock(mld->wiphy);
93
94 KUNIT_ASSERT_NE(test, vif->cfg.assoc, test_param->output.disconnected);
95
96 /* TODO: add test cases for esr and check */
97 }
98
99 static struct kunit_case link_cases[] = {
100 KUNIT_CASE_PARAM(test_missed_beacon, test_missed_beacon_gen_params),
101 {},
102 };
103
104 static struct kunit_suite link = {
105 .name = "iwlmld-link",
106 .test_cases = link_cases,
107 .init = iwlmld_kunit_test_init,
108 };
109
110 kunit_test_suite(link);
111