// SPDX-License-Identifier: GPL-2.0-only
/*
 * KUnit tests for inform_bss functions
 *
 * Copyright (C) 2023 Intel Corporation
 */
#include <linux/ieee80211.h>
#include <net/cfg80211.h>
#include <kunit/test.h>
#include <kunit/skbuff.h>
#include "../core.h"
#include "util.h"

/* mac80211 helpers for element building */
#include "../../mac80211/ieee80211_i.h"

MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);

struct test_elem {
	u8 id;
	u8 len;
	union {
		u8 data[255];
		struct {
			u8 eid;
			u8 edata[254];
		};
	};
};

static struct gen_new_ie_case {
	const char *desc;
	struct test_elem parent_ies[16];
	struct test_elem child_ies[16];
	struct test_elem result_ies[16];
} gen_new_ie_cases[] = {
	{
		.desc = "ML not inherited",
		.parent_ies = {
			{ .id = WLAN_EID_EXTENSION, .len = 255,
			  .eid = WLAN_EID_EXT_EHT_MULTI_LINK },
		},
		.child_ies = {
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
		.result_ies = {
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
	{
		.desc = "fragments are ignored if previous len not 255",
		.parent_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 254, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
		},
		.child_ies = {
			{ .id = WLAN_EID_SSID, .len = 2 },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
		},
		.result_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 254, },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
	{
		.desc = "fragments inherited",
		.parent_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
		},
		.child_ies = {
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
		.result_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
	{
		.desc = "fragments copied",
		.parent_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
		},
		.child_ies = {
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
		.result_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
	{
		.desc = "multiple elements inherit",
		.parent_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 123, },
		},
		.child_ies = {
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
		.result_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 123, },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
	{
		.desc = "one child element overrides",
		.parent_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 255, },
			{ .id = WLAN_EID_FRAGMENT, .len = 125, },
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 123, },
		},
		.child_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 127, },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
		.result_ies = {
			{ .id = WLAN_EID_REDUCED_NEIGHBOR_REPORT, .len = 127, },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
	{
		.desc = "empty elements from parent",
		.parent_ies = {
			{ .id = 0x1, .len = 0, },
			{ .id = WLAN_EID_EXTENSION, .len = 1, .eid = 0x10 },
		},
		.child_ies = {
		},
		.result_ies = {
			{ .id = 0x1, .len = 0, },
			{ .id = WLAN_EID_EXTENSION, .len = 1, .eid = 0x10 },
		},
	},
	{
		.desc = "empty elements from child",
		.parent_ies = {
		},
		.child_ies = {
			{ .id = 0x1, .len = 0, },
			{ .id = WLAN_EID_EXTENSION, .len = 1, .eid = 0x10 },
		},
		.result_ies = {
			{ .id = 0x1, .len = 0, },
			{ .id = WLAN_EID_EXTENSION, .len = 1, .eid = 0x10 },
		},
	},
	{
		.desc = "invalid extended elements ignored",
		.parent_ies = {
			{ .id = WLAN_EID_EXTENSION, .len = 0 },
		},
		.child_ies = {
			{ .id = WLAN_EID_EXTENSION, .len = 0 },
		},
		.result_ies = {
		},
	},
	{
		.desc = "multiple extended elements",
		.parent_ies = {
			{ .id = WLAN_EID_EXTENSION, .len = 3,
			  .eid = WLAN_EID_EXT_HE_CAPABILITY },
			{ .id = WLAN_EID_EXTENSION, .len = 5,
			  .eid = WLAN_EID_EXT_ASSOC_DELAY_INFO },
			{ .id = WLAN_EID_EXTENSION, .len = 7,
			  .eid = WLAN_EID_EXT_HE_OPERATION },
			{ .id = WLAN_EID_EXTENSION, .len = 11,
			  .eid = WLAN_EID_EXT_FILS_REQ_PARAMS },
		},
		.child_ies = {
			{ .id = WLAN_EID_SSID, .len = 13 },
			{ .id = WLAN_EID_EXTENSION, .len = 17,
			  .eid = WLAN_EID_EXT_HE_CAPABILITY },
			{ .id = WLAN_EID_EXTENSION, .len = 11,
			  .eid = WLAN_EID_EXT_FILS_KEY_CONFIRM },
			{ .id = WLAN_EID_EXTENSION, .len = 19,
			  .eid = WLAN_EID_EXT_HE_OPERATION },
		},
		.result_ies = {
			{ .id = WLAN_EID_EXTENSION, .len = 17,
			  .eid = WLAN_EID_EXT_HE_CAPABILITY },
			{ .id = WLAN_EID_EXTENSION, .len = 5,
			  .eid = WLAN_EID_EXT_ASSOC_DELAY_INFO },
			{ .id = WLAN_EID_EXTENSION, .len = 19,
			  .eid = WLAN_EID_EXT_HE_OPERATION },
			{ .id = WLAN_EID_EXTENSION, .len = 11,
			  .eid = WLAN_EID_EXT_FILS_REQ_PARAMS },
			{ .id = WLAN_EID_SSID, .len = 13 },
			{ .id = WLAN_EID_EXTENSION, .len = 11,
			  .eid = WLAN_EID_EXT_FILS_KEY_CONFIRM },
		},
	},
	{
		.desc = "non-inherit element",
		.parent_ies = {
			{ .id = 0x1, .len = 7, },
			{ .id = 0x2, .len = 11, },
			{ .id = 0x3, .len = 13, },
			{ .id = WLAN_EID_EXTENSION, .len = 17, .eid = 0x10 },
			{ .id = WLAN_EID_EXTENSION, .len = 19, .eid = 0x11 },
			{ .id = WLAN_EID_EXTENSION, .len = 23, .eid = 0x12 },
			{ .id = WLAN_EID_EXTENSION, .len = 29, .eid = 0x14 },
		},
		.child_ies = {
			{ .id = WLAN_EID_EXTENSION,
			  .eid = WLAN_EID_EXT_NON_INHERITANCE,
			  .len = 10,
			  .edata = { 0x3, 0x1, 0x2, 0x3,
				     0x4, 0x10, 0x11, 0x13, 0x14 } },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
		.result_ies = {
			{ .id = WLAN_EID_EXTENSION, .len = 23, .eid = 0x12 },
			{ .id = WLAN_EID_SSID, .len = 2 },
		},
	},
};
KUNIT_ARRAY_PARAM_DESC(gen_new_ie, gen_new_ie_cases, desc)

static void test_gen_new_ie(struct kunit *test)
{
	const struct gen_new_ie_case *params = test->param_value;
	struct sk_buff *parent = kunit_zalloc_skb(test, 1024, GFP_KERNEL);
	struct sk_buff *child = kunit_zalloc_skb(test, 1024, GFP_KERNEL);
	struct sk_buff *reference = kunit_zalloc_skb(test, 1024, GFP_KERNEL);
	u8 *out = kunit_kzalloc(test, IEEE80211_MAX_DATA_LEN, GFP_KERNEL);
	size_t len;
	int i;

	KUNIT_ASSERT_NOT_NULL(test, parent);
	KUNIT_ASSERT_NOT_NULL(test, child);
	KUNIT_ASSERT_NOT_NULL(test, reference);
	KUNIT_ASSERT_NOT_NULL(test, out);

	for (i = 0; i < ARRAY_SIZE(params->parent_ies); i++) {
		if (params->parent_ies[i].len != 0) {
			skb_put_u8(parent, params->parent_ies[i].id);
			skb_put_u8(parent, params->parent_ies[i].len);
			skb_put_data(parent, params->parent_ies[i].data,
				     params->parent_ies[i].len);
		}

		if (params->child_ies[i].len != 0) {
			skb_put_u8(child, params->child_ies[i].id);
			skb_put_u8(child, params->child_ies[i].len);
			skb_put_data(child, params->child_ies[i].data,
				     params->child_ies[i].len);
		}

		if (params->result_ies[i].len != 0) {
			skb_put_u8(reference, params->result_ies[i].id);
			skb_put_u8(reference, params->result_ies[i].len);
			skb_put_data(reference, params->result_ies[i].data,
				     params->result_ies[i].len);
		}
	}

	len = cfg80211_gen_new_ie(parent->data, parent->len,
				  child->data, child->len,
				  out, IEEE80211_MAX_DATA_LEN);
	KUNIT_EXPECT_EQ(test, len, reference->len);
	KUNIT_EXPECT_MEMEQ(test, out, reference->data, reference->len);
	memset(out, 0, IEEE80211_MAX_DATA_LEN);

	/* Exactly enough space */
	len = cfg80211_gen_new_ie(parent->data, parent->len,
				  child->data, child->len,
				  out, reference->len);
	KUNIT_EXPECT_EQ(test, len, reference->len);
	KUNIT_EXPECT_MEMEQ(test, out, reference->data, reference->len);
	memset(out, 0, IEEE80211_MAX_DATA_LEN);

	/* Not enough space (or expected zero length) */
	len = cfg80211_gen_new_ie(parent->data, parent->len,
				  child->data, child->len,
				  out, reference->len - 1);
	KUNIT_EXPECT_EQ(test, len, 0);
}

static void test_gen_new_ie_malformed(struct kunit *test)
{
	struct sk_buff *malformed = kunit_zalloc_skb(test, 1024, GFP_KERNEL);
	u8 *out = kunit_kzalloc(test, IEEE80211_MAX_DATA_LEN, GFP_KERNEL);
	size_t len;

	KUNIT_ASSERT_NOT_NULL(test, malformed);
	KUNIT_ASSERT_NOT_NULL(test, out);

	skb_put_u8(malformed, WLAN_EID_SSID);
	skb_put_u8(malformed, 3);
	skb_put(malformed, 3);
	skb_put_u8(malformed, WLAN_EID_REDUCED_NEIGHBOR_REPORT);
	skb_put_u8(malformed, 10);
	skb_put(malformed, 9);

	len = cfg80211_gen_new_ie(malformed->data, malformed->len,
				  out, 0,
				  out, IEEE80211_MAX_DATA_LEN);
	KUNIT_EXPECT_EQ(test, len, 5);

	len = cfg80211_gen_new_ie(out, 0,
				  malformed->data, malformed->len,
				  out, IEEE80211_MAX_DATA_LEN);
	KUNIT_EXPECT_EQ(test, len, 5);
}

struct inform_bss {
	struct kunit *test;

	int inform_bss_count;
};

static void inform_bss_inc_counter(struct wiphy *wiphy,
				   struct cfg80211_bss *bss,
				   const struct cfg80211_bss_ies *ies,
				   void *drv_data)
{
	struct inform_bss *ctx = t_wiphy_ctx(wiphy);

	ctx->inform_bss_count++;

	rcu_read_lock();
	KUNIT_EXPECT_PTR_EQ(ctx->test, drv_data, ctx);
	KUNIT_EXPECT_PTR_EQ(ctx->test, ies, rcu_dereference(bss->ies));
	rcu_read_unlock();
}

static void test_inform_bss_ssid_only(struct kunit *test)
{
	struct inform_bss ctx = {
		.test = test,
	};
	struct wiphy *wiphy = T_WIPHY(test, ctx);
	struct t_wiphy_priv *w_priv = wiphy_priv(wiphy);
	struct cfg80211_inform_bss inform_bss = {
		.signal = 50,
		.drv_data = &ctx,
	};
	const u8 bssid[ETH_ALEN] = { 0x10, 0x22, 0x33, 0x44, 0x55, 0x66 };
	u64 tsf = 0x1000000000000000ULL;
	int beacon_int = 100;
	u16 capability = 0x1234;
	static const u8 input[] = {
		[0] = WLAN_EID_SSID,
		[1] = 4,
		[2] = 'T', 'E', 'S', 'T'
	};
	struct cfg80211_bss *bss, *other;
	const struct cfg80211_bss_ies *ies;

	w_priv->ops->inform_bss = inform_bss_inc_counter;

	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, tsf,
				       capability, beacon_int,
				       input, sizeof(input),
				       GFP_KERNEL);
	KUNIT_EXPECT_NOT_NULL(test, bss);
	KUNIT_EXPECT_EQ(test, ctx.inform_bss_count, 1);

	/* Check values in returned bss are correct */
	KUNIT_EXPECT_EQ(test, bss->signal, inform_bss.signal);
	KUNIT_EXPECT_EQ(test, bss->beacon_interval, beacon_int);
	KUNIT_EXPECT_EQ(test, bss->capability, capability);
	KUNIT_EXPECT_EQ(test, bss->bssid_index, 0);
	KUNIT_EXPECT_PTR_EQ(test, bss->channel, inform_bss.chan);
	KUNIT_EXPECT_MEMEQ(test, bssid, bss->bssid, sizeof(bssid));

	/* Check the IEs have the expected value */
	rcu_read_lock();
	ies = rcu_dereference(bss->ies);
	KUNIT_EXPECT_NOT_NULL(test, ies);
	KUNIT_EXPECT_EQ(test, ies->tsf, tsf);
	KUNIT_EXPECT_EQ(test, ies->len, sizeof(input));
	KUNIT_EXPECT_MEMEQ(test, ies->data, input, sizeof(input));
	rcu_read_unlock();

	/* Check we can look up the BSS - by SSID */
	other = cfg80211_get_bss(wiphy, NULL, NULL, "TEST", 4,
				 IEEE80211_BSS_TYPE_ANY,
				 IEEE80211_PRIVACY_ANY);
	KUNIT_EXPECT_PTR_EQ(test, bss, other);
	cfg80211_put_bss(wiphy, other);

	/* Check we can look up the BSS - by BSSID */
	other = cfg80211_get_bss(wiphy, NULL, bssid, NULL, 0,
				 IEEE80211_BSS_TYPE_ANY,
				 IEEE80211_PRIVACY_ANY);
	KUNIT_EXPECT_PTR_EQ(test, bss, other);
	cfg80211_put_bss(wiphy, other);

	cfg80211_put_bss(wiphy, bss);
}

static struct inform_bss_ml_sta_case {
	const char *desc;
	int mld_id;
	bool sta_prof_vendor_elems;
} inform_bss_ml_sta_cases[] = {
	{ .desc = "no_mld_id", .mld_id = 0, .sta_prof_vendor_elems = false },
	{ .desc = "mld_id_eq_1", .mld_id = 1, .sta_prof_vendor_elems = true },
};
KUNIT_ARRAY_PARAM_DESC(inform_bss_ml_sta, inform_bss_ml_sta_cases, desc)

static void test_inform_bss_ml_sta(struct kunit *test)
{
	const struct inform_bss_ml_sta_case *params = test->param_value;
	struct inform_bss ctx = {
		.test = test,
	};
	struct wiphy *wiphy = T_WIPHY(test, ctx);
	struct t_wiphy_priv *w_priv = wiphy_priv(wiphy);
	struct cfg80211_inform_bss inform_bss = {
		.signal = 50,
		.drv_data = &ctx,
	};
	struct cfg80211_bss *bss, *link_bss;
	const struct cfg80211_bss_ies *ies;

	/* sending station */
	const u8 bssid[ETH_ALEN] = { 0x10, 0x22, 0x33, 0x44, 0x55, 0x66 };
	u64 tsf = 0x1000000000000000ULL;
	int beacon_int = 100;
	u16 capability = 0x1234;

	/* Building the frame *************************************************/
	struct sk_buff *input = kunit_zalloc_skb(test, 1024, GFP_KERNEL);
	u8 *len_mle, *len_prof;
	u8 link_id = 2;
	struct {
		struct ieee80211_neighbor_ap_info info;
		struct ieee80211_tbtt_info_ge_11 ap;
	} __packed rnr = {
		.info = {
			.tbtt_info_hdr = u8_encode_bits(0, IEEE80211_AP_INFO_TBTT_HDR_COUNT),
			.tbtt_info_len = sizeof(struct ieee80211_tbtt_info_ge_11),
			.op_class = 81,
			.channel = 11,
		},
		.ap = {
			.tbtt_offset = 0xff,
			.bssid = { 0x10, 0x22, 0x33, 0x44, 0x55, 0x67 },
			.short_ssid = 0, /* unused */
			.bss_params = 0,
			.psd_20 = 0,
			.mld_params.mld_id = params->mld_id,
			.mld_params.params =
				le16_encode_bits(link_id,
						 IEEE80211_RNR_MLD_PARAMS_LINK_ID),
		}
	};
	struct {
		__le16 control;
		u8 var_len;
		u8 mld_mac_addr[ETH_ALEN];
		u8 link_id_info;
		u8 params_change_count;
		__le16 mld_caps_and_ops;
		u8 mld_id;
		__le16 ext_mld_caps_and_ops;
	} __packed mle_basic_common_info = {
		.control =
			cpu_to_le16(IEEE80211_ML_CONTROL_TYPE_BASIC |
				    IEEE80211_MLC_BASIC_PRES_BSS_PARAM_CH_CNT |
				    IEEE80211_MLC_BASIC_PRES_LINK_ID |
				    (params->mld_id ? IEEE80211_MLC_BASIC_PRES_MLD_ID : 0) |
				    IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP),
		.mld_id = params->mld_id,
		.mld_caps_and_ops = cpu_to_le16(0x0102),
		.ext_mld_caps_and_ops = cpu_to_le16(0x0304),
		.var_len = sizeof(mle_basic_common_info) - 2 -
			   (params->mld_id ? 0 : 1),
		.mld_mac_addr = { 0x10, 0x22, 0x33, 0x44, 0x55, 0x60 },
	};
	struct {
		__le16 control;
		u8 var_len;
		u8 bssid[ETH_ALEN];
		__le16 beacon_int;
		__le64 tsf_offset;
		__le16 capabilities; /* already part of payload */
	} __packed sta_prof = {
		.control =
			cpu_to_le16(IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE |
				    IEEE80211_MLE_STA_CONTROL_STA_MAC_ADDR_PRESENT |
				    IEEE80211_MLE_STA_CONTROL_BEACON_INT_PRESENT |
				    IEEE80211_MLE_STA_CONTROL_TSF_OFFS_PRESENT |
				    u16_encode_bits(link_id,
						    IEEE80211_MLE_STA_CONTROL_LINK_ID)),
		.var_len = sizeof(sta_prof) - 2 - 2,
		.bssid = { *rnr.ap.bssid },
		.beacon_int = cpu_to_le16(101),
		.tsf_offset = cpu_to_le64(-123ll),
		.capabilities = cpu_to_le16(0xdead),
	};

	KUNIT_ASSERT_NOT_NULL(test, input);

	w_priv->ops->inform_bss = inform_bss_inc_counter;

	inform_bss.chan = ieee80211_get_channel_khz(wiphy, MHZ_TO_KHZ(2412));
	KUNIT_ASSERT_NOT_NULL(test, inform_bss.chan);

	skb_put_u8(input, WLAN_EID_SSID);
	skb_put_u8(input, 4);
	skb_put_data(input, "TEST", 4);

	skb_put_u8(input, WLAN_EID_REDUCED_NEIGHBOR_REPORT);
	skb_put_u8(input, sizeof(rnr));
	skb_put_data(input, &rnr, sizeof(rnr));

	/* build a multi-link element */
	skb_put_u8(input, WLAN_EID_EXTENSION);
	len_mle = skb_put(input, 1);
	skb_put_u8(input, WLAN_EID_EXT_EHT_MULTI_LINK);
	skb_put_data(input, &mle_basic_common_info, sizeof(mle_basic_common_info));
	if (!params->mld_id)
		t_skb_remove_member(input, typeof(mle_basic_common_info), mld_id);
	/* with a STA profile inside */
	skb_put_u8(input, IEEE80211_MLE_SUBELEM_PER_STA_PROFILE);
	len_prof = skb_put(input, 1);
	skb_put_data(input, &sta_prof, sizeof(sta_prof));

	if (params->sta_prof_vendor_elems) {
		/* Put two (vendor) element into sta_prof */
		skb_put_u8(input, WLAN_EID_VENDOR_SPECIFIC);
		skb_put_u8(input, 160);
		skb_put(input, 160);

		skb_put_u8(input, WLAN_EID_VENDOR_SPECIFIC);
		skb_put_u8(input, 165);
		skb_put(input, 165);
	}

	/* fragment STA profile */
	ieee80211_fragment_element(input, len_prof,
				   IEEE80211_MLE_SUBELEM_FRAGMENT);
	/* fragment MLE */
	ieee80211_fragment_element(input, len_mle, WLAN_EID_FRAGMENT);

	/* Put a (vendor) element after the ML element */
	skb_put_u8(input, WLAN_EID_VENDOR_SPECIFIC);
	skb_put_u8(input, 155);
	skb_put(input, 155);

	/* Submit *************************************************************/
	bss = cfg80211_inform_bss_data(wiphy, &inform_bss,
				       CFG80211_BSS_FTYPE_PRESP, bssid, tsf,
				       capability, beacon_int,
				       input->data, input->len,
				       GFP_KERNEL);
	KUNIT_EXPECT_NOT_NULL(test, bss);
	KUNIT_EXPECT_EQ(test, ctx.inform_bss_count, 2);

	/* Check link_bss *****************************************************/
	link_bss = cfg80211_get_bss(wiphy, NULL, sta_prof.bssid, NULL, 0,
				    IEEE80211_BSS_TYPE_ANY,
				    IEEE80211_PRIVACY_ANY);
	KUNIT_ASSERT_NOT_NULL(test, link_bss);
	KUNIT_EXPECT_EQ(test, link_bss->signal, 0);
	KUNIT_EXPECT_EQ(test, link_bss->beacon_interval,
			      le16_to_cpu(sta_prof.beacon_int));
	KUNIT_EXPECT_EQ(test, link_bss->capability,
			      le16_to_cpu(sta_prof.capabilities));
	KUNIT_EXPECT_EQ(test, link_bss->bssid_index, 0);
	KUNIT_EXPECT_PTR_EQ(test, link_bss->channel,
			    ieee80211_get_channel_khz(wiphy, MHZ_TO_KHZ(2462)));

	rcu_read_lock();
	ies = rcu_dereference(link_bss->ies);
	KUNIT_EXPECT_NOT_NULL(test, ies);
	KUNIT_EXPECT_EQ(test, ies->tsf, tsf + le64_to_cpu(sta_prof.tsf_offset));
	/* Resulting length should be:
	 * SSID (inherited) + RNR (inherited) + vendor element(s) +
	 * MLE common info + MLE header and control
	 */
	if (params->sta_prof_vendor_elems)
		KUNIT_EXPECT_EQ(test, ies->len,
				6 + 2 + sizeof(rnr) + 2 + 160 + 2 + 165 +
				mle_basic_common_info.var_len + 5);
	else
		KUNIT_EXPECT_EQ(test, ies->len,
				6 + 2 + sizeof(rnr) + 2 + 155 +
				mle_basic_common_info.var_len + 5);
	rcu_read_unlock();

	cfg80211_put_bss(wiphy, bss);
	cfg80211_put_bss(wiphy, link_bss);
}

static struct kunit_case gen_new_ie_test_cases[] = {
	KUNIT_CASE_PARAM(test_gen_new_ie, gen_new_ie_gen_params),
	KUNIT_CASE(test_gen_new_ie_malformed),
	{}
};

static struct kunit_suite gen_new_ie = {
	.name = "cfg80211-ie-generation",
	.test_cases = gen_new_ie_test_cases,
};

kunit_test_suite(gen_new_ie);

static struct kunit_case inform_bss_test_cases[] = {
	KUNIT_CASE(test_inform_bss_ssid_only),
	KUNIT_CASE_PARAM(test_inform_bss_ml_sta, inform_bss_ml_sta_gen_params),
	{}
};

static struct kunit_suite inform_bss = {
	.name = "cfg80211-inform-bss",
	.test_cases = inform_bss_test_cases,
};

kunit_test_suite(inform_bss);
