310c8387c6
Rewrite the station-side connection handling. The connection flags (IEEE80211_DISABLE_*) are rather confusing, and they're not always maintained well. Additionally, for wider-bandwidth OFDMA support we need to know the precise bandwidth of the AP, which is currently somewhat difficult. Rewrite this to have a 'mode' (S1G/legacy/HT/...) and a limit on the bandwidth. This is not entirely clean because some of those modes aren't completely sequenced (as this assumes in some places), e.g. VHT doesn't exist on 2.4 GHz, but HE does. However, it still simplifies things and gives us a good idea what we're operating as, so we can parse elements accordingly etc. This leaves a FIXME for puncturing, this is addressed in a later patch. Reviewed-by: Ilan Peer <ilan.peer@intel.com> Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> Link: https://msgid.link/20240129194108.9451722c0110.I3e61f4cfe9da89008e1854160093c76a1e69dc2a@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
103 lines
2.6 KiB
C
103 lines
2.6 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* KUnit tests for element parsing
|
|
*
|
|
* Copyright (C) 2023 Intel Corporation
|
|
*/
|
|
#include <kunit/test.h>
|
|
#include "../ieee80211_i.h"
|
|
|
|
MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
|
|
|
|
static void mle_defrag(struct kunit *test)
|
|
{
|
|
struct ieee80211_elems_parse_params parse_params = {
|
|
.link_id = 12,
|
|
.from_ap = true,
|
|
.mode = IEEE80211_CONN_MODE_EHT,
|
|
};
|
|
struct ieee802_11_elems *parsed;
|
|
struct sk_buff *skb;
|
|
u8 *len_mle, *len_prof;
|
|
int i;
|
|
|
|
skb = alloc_skb(1024, GFP_KERNEL);
|
|
KUNIT_ASSERT_NOT_NULL(test, skb);
|
|
|
|
if (skb_pad(skb, skb_tailroom(skb))) {
|
|
KUNIT_FAIL(test, "failed to pad skb");
|
|
return;
|
|
}
|
|
|
|
/* build a multi-link element */
|
|
skb_put_u8(skb, WLAN_EID_EXTENSION);
|
|
len_mle = skb_put(skb, 1);
|
|
skb_put_u8(skb, WLAN_EID_EXT_EHT_MULTI_LINK);
|
|
|
|
put_unaligned_le16(IEEE80211_ML_CONTROL_TYPE_BASIC,
|
|
skb_put(skb, 2));
|
|
/* struct ieee80211_mle_basic_common_info */
|
|
skb_put_u8(skb, 7); /* includes len field */
|
|
skb_put_data(skb, "\x00\x00\x00\x00\x00\x00", ETH_ALEN); /* MLD addr */
|
|
|
|
/* with a STA profile inside */
|
|
skb_put_u8(skb, IEEE80211_MLE_SUBELEM_PER_STA_PROFILE);
|
|
len_prof = skb_put(skb, 1);
|
|
put_unaligned_le16(IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE |
|
|
parse_params.link_id,
|
|
skb_put(skb, 2));
|
|
skb_put_u8(skb, 1); /* fake sta_info_len - includes itself */
|
|
/* put a bunch of useless elements into it */
|
|
for (i = 0; i < 20; i++) {
|
|
skb_put_u8(skb, WLAN_EID_SSID);
|
|
skb_put_u8(skb, 20);
|
|
skb_put(skb, 20);
|
|
}
|
|
|
|
/* fragment STA profile */
|
|
ieee80211_fragment_element(skb, len_prof,
|
|
IEEE80211_MLE_SUBELEM_FRAGMENT);
|
|
/* fragment MLE */
|
|
ieee80211_fragment_element(skb, len_mle, WLAN_EID_FRAGMENT);
|
|
|
|
parse_params.start = skb->data;
|
|
parse_params.len = skb->len;
|
|
parsed = ieee802_11_parse_elems_full(&parse_params);
|
|
/* should return ERR_PTR or valid, not NULL */
|
|
KUNIT_EXPECT_NOT_NULL(test, parsed);
|
|
|
|
if (IS_ERR_OR_NULL(parsed))
|
|
goto free_skb;
|
|
|
|
KUNIT_EXPECT_NOT_NULL(test, parsed->ml_basic_elem);
|
|
KUNIT_EXPECT_EQ(test,
|
|
parsed->ml_basic_len,
|
|
2 /* control */ +
|
|
7 /* common info */ +
|
|
2 /* sta profile element header */ +
|
|
3 /* sta profile header */ +
|
|
20 * 22 /* sta profile data */ +
|
|
2 /* sta profile fragment element */);
|
|
KUNIT_EXPECT_NOT_NULL(test, parsed->prof);
|
|
KUNIT_EXPECT_EQ(test,
|
|
parsed->sta_prof_len,
|
|
3 /* sta profile header */ +
|
|
20 * 22 /* sta profile data */);
|
|
|
|
kfree(parsed);
|
|
free_skb:
|
|
kfree_skb(skb);
|
|
}
|
|
|
|
static struct kunit_case element_parsing_test_cases[] = {
|
|
KUNIT_CASE(mle_defrag),
|
|
{}
|
|
};
|
|
|
|
static struct kunit_suite element_parsing = {
|
|
.name = "mac80211-element-parsing",
|
|
.test_cases = element_parsing_test_cases,
|
|
};
|
|
|
|
kunit_test_suite(element_parsing);
|