linux/tools/testing/selftests/bpf/progs/csum_diff_test.c
Puranjay Mohan 00c1f3dc66 selftests/bpf: Add a selftest for bpf_csum_diff()
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
2024-10-30 15:29:59 +01:00

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;
}