1 // SPDX-License-Identifier: GPL-2.0-only
3 * KUnit tests for element fragmentation
5 * Copyright (C) 2023-2024 Intel Corporation
7 #include <linux/ieee80211.h>
8 #include <net/cfg80211.h>
9 #include <kunit/test.h>
11 static void defragment_0(struct kunit *test)
14 static const u8 input[] = {
15 [0] = WLAN_EID_EXTENSION,
17 [2] = WLAN_EID_EXT_EHT_MULTI_LINK,
20 [254 + 2] = WLAN_EID_FRAGMENT,
22 [254 + 3 + 7] = 0, /* for size */
24 u8 *data = kunit_kzalloc(test, sizeof(input), GFP_KERNEL);
26 KUNIT_ASSERT_NOT_NULL(test, data);
28 ret = cfg80211_defragment_element((void *)input,
32 KUNIT_EXPECT_EQ(test, ret, 253);
33 ret = cfg80211_defragment_element((void *)input,
37 KUNIT_EXPECT_EQ(test, ret, 253);
38 KUNIT_EXPECT_MEMEQ(test, data, input + 3, 253);
41 static void defragment_1(struct kunit *test)
44 static const u8 input[] = {
45 [0] = WLAN_EID_EXTENSION,
47 [2] = WLAN_EID_EXT_EHT_MULTI_LINK,
50 [255 + 2] = WLAN_EID_FRAGMENT,
53 [255 + 3 + 8] = WLAN_EID_FRAGMENT, /* not used */
55 [255 + 3 + 10] = 0, /* for size */
57 u8 *data = kunit_kzalloc(test, sizeof(input), GFP_KERNEL);
58 const struct element *elem;
61 KUNIT_ASSERT_NOT_NULL(test, data);
63 for_each_element(elem, input, sizeof(input))
66 /* check the elements are right */
67 KUNIT_ASSERT_EQ(test, count, 3);
69 ret = cfg80211_defragment_element((void *)input,
73 KUNIT_EXPECT_EQ(test, ret, 254 + 7);
74 ret = cfg80211_defragment_element((void *)input,
78 /* this means the last fragment was not used */
79 KUNIT_EXPECT_EQ(test, ret, 254 + 7);
80 KUNIT_EXPECT_MEMEQ(test, data, input + 3, 254);
81 KUNIT_EXPECT_MEMEQ(test, data + 254, input + 255 + 4, 7);
84 static void defragment_2(struct kunit *test)
87 static const u8 input[] = {
88 [0] = WLAN_EID_EXTENSION,
90 [2] = WLAN_EID_EXT_EHT_MULTI_LINK,
94 [257 + 0] = WLAN_EID_FRAGMENT,
98 [2 * 257 + 0] = WLAN_EID_FRAGMENT,
100 [2 * 257 + 2] = 0xcc,
101 [2 * 257 + 3] = WLAN_EID_FRAGMENT, /* not used */
103 [2 * 257 + 5] = 0, /* for size */
105 u8 *data = kunit_kzalloc(test, sizeof(input), GFP_KERNEL);
106 const struct element *elem;
109 KUNIT_ASSERT_NOT_NULL(test, data);
111 for_each_element(elem, input, sizeof(input))
114 /* check the elements are right */
115 KUNIT_ASSERT_EQ(test, count, 4);
117 ret = cfg80211_defragment_element((void *)input,
118 input, sizeof(input),
121 /* this means the last fragment was not used */
122 KUNIT_EXPECT_EQ(test, ret, 254 + 255 + 1);
123 ret = cfg80211_defragment_element((void *)input,
124 input, sizeof(input),
127 KUNIT_EXPECT_EQ(test, ret, 254 + 255 + 1);
128 KUNIT_EXPECT_MEMEQ(test, data, input + 3, 254);
129 KUNIT_EXPECT_MEMEQ(test, data + 254, input + 257 + 2, 255);
130 KUNIT_EXPECT_MEMEQ(test, data + 254 + 255, input + 2 * 257 + 2, 1);
133 static void defragment_at_end(struct kunit *test)
136 static const u8 input[] = {
137 [0] = WLAN_EID_EXTENSION,
139 [2] = WLAN_EID_EXT_EHT_MULTI_LINK,
142 [255 + 2] = WLAN_EID_FRAGMENT,
144 [255 + 3 + 7] = 0, /* for size */
146 u8 *data = kunit_kzalloc(test, sizeof(input), GFP_KERNEL);
148 KUNIT_ASSERT_NOT_NULL(test, data);
150 ret = cfg80211_defragment_element((void *)input,
151 input, sizeof(input),
154 KUNIT_EXPECT_EQ(test, ret, 254 + 7);
155 ret = cfg80211_defragment_element((void *)input,
156 input, sizeof(input),
159 KUNIT_EXPECT_EQ(test, ret, 254 + 7);
160 KUNIT_EXPECT_MEMEQ(test, data, input + 3, 254);
161 KUNIT_EXPECT_MEMEQ(test, data + 254, input + 255 + 4, 7);
164 static struct kunit_case element_fragmentation_test_cases[] = {
165 KUNIT_CASE(defragment_0),
166 KUNIT_CASE(defragment_1),
167 KUNIT_CASE(defragment_2),
168 KUNIT_CASE(defragment_at_end),
172 static struct kunit_suite element_fragmentation = {
173 .name = "cfg80211-element-defragmentation",
174 .test_cases = element_fragmentation_test_cases,
177 kunit_test_suite(element_fragmentation);