Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
  1// SPDX-License-Identifier: GPL-2.0
  2/* Copyright Amazon.com Inc. or its affiliates */
  3#include <test_progs.h>
  4#include "csum_diff_test.skel.h"
  5
  6#define BUFF_SZ 512
  7
  8struct testcase {
  9	unsigned long long to_buff[BUFF_SZ / 8];
 10	unsigned int to_buff_len;
 11	unsigned long long from_buff[BUFF_SZ / 8];
 12	unsigned int from_buff_len;
 13	unsigned short seed;
 14	unsigned short result;
 15};
 16
 17#define NUM_PUSH_TESTS 4
 18
 19struct testcase push_tests[NUM_PUSH_TESTS] = {
 20	{
 21		.to_buff = {
 22			0xdeadbeefdeadbeef,
 23		},
 24		.to_buff_len = 8,
 25		.from_buff = {},
 26		.from_buff_len = 0,
 27		.seed = 0,
 28		.result = 0x3b3b
 29	},
 30	{
 31		.to_buff = {
 32			0xdeadbeefdeadbeef,
 33			0xbeefdeadbeefdead,
 34		},
 35		.to_buff_len = 16,
 36		.from_buff = {},
 37		.from_buff_len = 0,
 38		.seed = 0x1234,
 39		.result = 0x88aa
 40	},
 41	{
 42		.to_buff = {
 43			0xdeadbeefdeadbeef,
 44			0xbeefdeadbeefdead,
 45		},
 46		.to_buff_len = 15,
 47		.from_buff = {},
 48		.from_buff_len = 0,
 49		.seed = 0x1234,
 50#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
 51		.result = 0xcaa9
 52#else
 53		.result = 0x87fd
 54#endif
 55	},
 56	{
 57		.to_buff = {
 58			0x327b23c66b8b4567,
 59			0x66334873643c9869,
 60			0x19495cff74b0dc51,
 61			0x625558ec2ae8944a,
 62			0x46e87ccd238e1f29,
 63			0x507ed7ab3d1b58ba,
 64			0x41b71efb2eb141f2,
 65			0x7545e14679e2a9e3,
 66			0x5bd062c2515f007c,
 67			0x4db127f812200854,
 68			0x1f16e9e80216231b,
 69			0x66ef438d1190cde7,
 70			0x3352255a140e0f76,
 71			0x0ded7263109cf92e,
 72			0x1befd79f7fdcc233,
 73			0x6b68079a41a7c4c9,
 74			0x25e45d324e6afb66,
 75			0x431bd7b7519b500d,
 76			0x7c83e4583f2dba31,
 77			0x62bbd95a257130a3,
 78			0x628c895d436c6125,
 79			0x721da317333ab105,
 80			0x2d1d5ae92443a858,
 81			0x75a2a8d46763845e,
 82			0x79838cb208edbdab,
 83			0x0b03e0c64353d0cd,
 84			0x54e49eb4189a769b,
 85			0x2ca8861171f32454,
 86			0x02901d820836c40e,
 87			0x081386413a95f874,
 88			0x7c3dbd3d1e7ff521,
 89			0x6ceaf087737b8ddc,
 90			0x4516dde922221a70,
 91			0x614fd4a13006c83e,
 92			0x5577f8e1419ac241,
 93			0x05072367440badfc,
 94			0x77465f013804823e,
 95			0x5c482a977724c67e,
 96			0x5e884adc2463b9ea,
 97			0x2d51779651ead36b,
 98			0x153ea438580bd78f,
 99			0x70a64e2a3855585c,
100			0x2a487cb06a2342ec,
101			0x725a06fb1d4ed43b,
102			0x57e4ccaf2cd89a32,
103			0x4b588f547a6d8d3c,
104			0x6de91b18542289ec,
105			0x7644a45c38437fdb,
106			0x684a481a32fff902,
107			0x749abb43579478fe,
108			0x1ba026fa3dc240fb,
109			0x75c6c33a79a1deaa,
110			0x70c6a52912e685fb,
111			0x374a3fe6520eedd1,
112			0x23f9c13c4f4ef005,
113			0x275ac794649bb77c,
114			0x1cf10fd839386575,
115			0x235ba861180115be,
116			0x354fe9f947398c89,
117			0x741226bb15b5af5c,
118			0x10233c990d34b6a8,
119			0x615740953f6ab60f,
120			0x77ae35eb7e0c57b1,
121			0x310c50b3579be4f1,
122		},
123		.to_buff_len = 512,
124		.from_buff = {},
125		.from_buff_len = 0,
126		.seed = 0xffff,
127		.result = 0xca45
128	},
129};
130
131#define NUM_PULL_TESTS 4
132
133struct testcase pull_tests[NUM_PULL_TESTS] = {
134	{
135		.from_buff = {
136			0xdeadbeefdeadbeef,
137		},
138		.from_buff_len = 8,
139		.to_buff = {},
140		.to_buff_len = 0,
141		.seed = 0,
142		.result = 0xc4c4
143	},
144	{
145		.from_buff = {
146			0xdeadbeefdeadbeef,
147			0xbeefdeadbeefdead,
148		},
149		.from_buff_len = 16,
150		.to_buff = {},
151		.to_buff_len = 0,
152		.seed = 0x1234,
153		.result = 0x9bbd
154	},
155	{
156		.from_buff = {
157			0xdeadbeefdeadbeef,
158			0xbeefdeadbeefdead,
159		},
160		.from_buff_len = 15,
161		.to_buff = {},
162		.to_buff_len = 0,
163		.seed = 0x1234,
164#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
165		.result = 0x59be
166#else
167		.result = 0x9c6a
168#endif
169	},
170	{
171		.from_buff = {
172			0x327b23c66b8b4567,
173			0x66334873643c9869,
174			0x19495cff74b0dc51,
175			0x625558ec2ae8944a,
176			0x46e87ccd238e1f29,
177			0x507ed7ab3d1b58ba,
178			0x41b71efb2eb141f2,
179			0x7545e14679e2a9e3,
180			0x5bd062c2515f007c,
181			0x4db127f812200854,
182			0x1f16e9e80216231b,
183			0x66ef438d1190cde7,
184			0x3352255a140e0f76,
185			0x0ded7263109cf92e,
186			0x1befd79f7fdcc233,
187			0x6b68079a41a7c4c9,
188			0x25e45d324e6afb66,
189			0x431bd7b7519b500d,
190			0x7c83e4583f2dba31,
191			0x62bbd95a257130a3,
192			0x628c895d436c6125,
193			0x721da317333ab105,
194			0x2d1d5ae92443a858,
195			0x75a2a8d46763845e,
196			0x79838cb208edbdab,
197			0x0b03e0c64353d0cd,
198			0x54e49eb4189a769b,
199			0x2ca8861171f32454,
200			0x02901d820836c40e,
201			0x081386413a95f874,
202			0x7c3dbd3d1e7ff521,
203			0x6ceaf087737b8ddc,
204			0x4516dde922221a70,
205			0x614fd4a13006c83e,
206			0x5577f8e1419ac241,
207			0x05072367440badfc,
208			0x77465f013804823e,
209			0x5c482a977724c67e,
210			0x5e884adc2463b9ea,
211			0x2d51779651ead36b,
212			0x153ea438580bd78f,
213			0x70a64e2a3855585c,
214			0x2a487cb06a2342ec,
215			0x725a06fb1d4ed43b,
216			0x57e4ccaf2cd89a32,
217			0x4b588f547a6d8d3c,
218			0x6de91b18542289ec,
219			0x7644a45c38437fdb,
220			0x684a481a32fff902,
221			0x749abb43579478fe,
222			0x1ba026fa3dc240fb,
223			0x75c6c33a79a1deaa,
224			0x70c6a52912e685fb,
225			0x374a3fe6520eedd1,
226			0x23f9c13c4f4ef005,
227			0x275ac794649bb77c,
228			0x1cf10fd839386575,
229			0x235ba861180115be,
230			0x354fe9f947398c89,
231			0x741226bb15b5af5c,
232			0x10233c990d34b6a8,
233			0x615740953f6ab60f,
234			0x77ae35eb7e0c57b1,
235			0x310c50b3579be4f1,
236		},
237		.from_buff_len = 512,
238		.to_buff = {},
239		.to_buff_len = 0,
240		.seed = 0xffff,
241		.result = 0x35ba
242	},
243};
244
245#define NUM_DIFF_TESTS 4
246
247struct testcase diff_tests[NUM_DIFF_TESTS] = {
248	{
249		.from_buff = {
250			0xdeadbeefdeadbeef,
251		},
252		.from_buff_len = 8,
253		.to_buff = {
254			0xabababababababab,
255		},
256		.to_buff_len = 8,
257		.seed = 0,
258		.result = 0x7373
259	},
260	{
261		.from_buff = {
262			0xdeadbeefdeadbeef,
263		},
264		.from_buff_len = 7,
265		.to_buff = {
266			0xabababababababab,
267		},
268		.to_buff_len = 7,
269		.seed = 0,
270#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
271		.result = 0xa673
272#else
273		.result = 0x73b7
274#endif
275	},
276	{
277		.from_buff = {
278			0,
279		},
280		.from_buff_len = 8,
281		.to_buff = {
282			0xabababababababab,
283		},
284		.to_buff_len = 8,
285		.seed = 0,
286		.result = 0xaeae
287	},
288	{
289		.from_buff = {
290			0xdeadbeefdeadbeef
291		},
292		.from_buff_len = 8,
293		.to_buff = {
294			0,
295		},
296		.to_buff_len = 8,
297		.seed = 0xffff,
298		.result = 0xc4c4
299	},
300};
301
302#define NUM_EDGE_TESTS 4
303
304struct testcase edge_tests[NUM_EDGE_TESTS] = {
305	{
306		.from_buff = {},
307		.from_buff_len = 0,
308		.to_buff = {},
309		.to_buff_len = 0,
310		.seed = 0,
311		.result = 0
312	},
313	{
314		.from_buff = {
315			0x1234
316		},
317		.from_buff_len = 0,
318		.to_buff = {
319			0x1234
320		},
321		.to_buff_len = 0,
322		.seed = 0,
323		.result = 0
324	},
325	{
326		.from_buff = {},
327		.from_buff_len = 0,
328		.to_buff = {},
329		.to_buff_len = 0,
330		.seed = 0x1234,
331		.result = 0x1234
332	},
333	{
334		.from_buff = {},
335		.from_buff_len = 512,
336		.to_buff = {},
337		.to_buff_len = 0,
338		.seed = 0xffff,
339		.result = 0xffff
340	},
341};
342
343static unsigned short trigger_csum_diff(const struct csum_diff_test *skel)
344{
345	u8 tmp_out[64 << 2] = {};
346	u8 tmp_in[64] = {};
347	int err;
348	int pfd;
349
350	LIBBPF_OPTS(bpf_test_run_opts, topts,
351		.data_in = tmp_in,
352		.data_size_in = sizeof(tmp_in),
353		.data_out = tmp_out,
354		.data_size_out = sizeof(tmp_out),
355		.repeat = 1,
356	);
357	pfd = bpf_program__fd(skel->progs.compute_checksum);
358	err = bpf_prog_test_run_opts(pfd, &topts);
359	if (err)
360		return -1;
361
362	return skel->bss->result;
363}
364
365static void test_csum_diff(struct testcase *tests, int num_tests)
366{
367	struct csum_diff_test *skel;
368	unsigned short got;
369	int err;
370
371	for (int i = 0; i < num_tests; i++) {
372		skel = csum_diff_test__open();
373		if (!ASSERT_OK_PTR(skel, "csum_diff_test open"))
374			return;
375
376		skel->rodata->to_buff_len = tests[i].to_buff_len;
377		skel->rodata->from_buff_len = tests[i].from_buff_len;
378
379		err = csum_diff_test__load(skel);
380		if (!ASSERT_EQ(err, 0, "csum_diff_test load"))
381			goto out;
382
383		memcpy(skel->bss->to_buff, tests[i].to_buff, tests[i].to_buff_len);
384		memcpy(skel->bss->from_buff, tests[i].from_buff, tests[i].from_buff_len);
385		skel->bss->seed = tests[i].seed;
386
387		got = trigger_csum_diff(skel);
388		ASSERT_EQ(got, tests[i].result, "csum_diff result");
389
390		csum_diff_test__destroy(skel);
391	}
392
393	return;
394out:
395	csum_diff_test__destroy(skel);
396}
397
398void test_test_csum_diff(void)
399{
400	if (test__start_subtest("csum_diff_push"))
401		test_csum_diff(push_tests, NUM_PUSH_TESTS);
402	if (test__start_subtest("csum_diff_pull"))
403		test_csum_diff(pull_tests, NUM_PULL_TESTS);
404	if (test__start_subtest("csum_diff_diff"))
405		test_csum_diff(diff_tests, NUM_DIFF_TESTS);
406	if (test__start_subtest("csum_diff_edge"))
407		test_csum_diff(edge_tests, NUM_EDGE_TESTS);
408}