mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Add a selftest for the bpf_csum_diff() helper. This selftests runs the helper in all three configurations(push, pull, and diff) and verifies its output. The correct results have been computed by hand and by the helper's older implementation. Signed-off-by: Puranjay Mohan <puranjay@kernel.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20241026125339.26459-5-puranjay@kernel.org
42 lines
1.2 KiB
C
42 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright Amazon.com Inc. or its affiliates */
|
|
#include <linux/types.h>
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
#include <bpf/bpf_tracing.h>
|
|
|
|
#define BUFF_SZ 512
|
|
|
|
/* Will be updated by benchmark before program loading */
|
|
char to_buff[BUFF_SZ];
|
|
const volatile unsigned int to_buff_len = 0;
|
|
char from_buff[BUFF_SZ];
|
|
const volatile unsigned int from_buff_len = 0;
|
|
unsigned short seed = 0;
|
|
|
|
short result;
|
|
|
|
char _license[] SEC("license") = "GPL";
|
|
|
|
SEC("tc")
|
|
int compute_checksum(void *ctx)
|
|
{
|
|
int to_len_half = to_buff_len / 2;
|
|
int from_len_half = from_buff_len / 2;
|
|
short result2;
|
|
|
|
/* Calculate checksum in one go */
|
|
result2 = bpf_csum_diff((void *)from_buff, from_buff_len,
|
|
(void *)to_buff, to_buff_len, seed);
|
|
|
|
/* Calculate checksum by concatenating bpf_csum_diff()*/
|
|
result = bpf_csum_diff((void *)from_buff, from_buff_len - from_len_half,
|
|
(void *)to_buff, to_buff_len - to_len_half, seed);
|
|
|
|
result = bpf_csum_diff((void *)from_buff + (from_buff_len - from_len_half), from_len_half,
|
|
(void *)to_buff + (to_buff_len - to_len_half), to_len_half, result);
|
|
|
|
result = (result == result2) ? result : 0;
|
|
|
|
return 0;
|
|
}
|