Add a new test in copy-mode for testing the copying of metadata from the buffer in kernel-space to user-space. This is accomplished by adding a new XDP program and using the bss map to store a counter that is written to the metadata field. This counter is incremented for every packet so that the number becomes unique and should be the same as the payload. It is store in the bss so the value can be reset between runs. The XDP program populates the metadata and the userspace program checks the value stored in the metadata field against the payload using the new is_metadata_correct() function. To turn this verification on or off, add a new parameter (use_metadata) to the ifobject structure. Signed-off-by: Tushar Vyavahare <tushar.vyavahare@intel.com> Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Link: https://lore.kernel.org/r/20230320102705.306187-1-tushar.vyavahare@intel.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
56 lines
1.1 KiB
C
56 lines
1.1 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2022 Intel */
|
|
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
#include "xsk_xdp_metadata.h"
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_XSKMAP);
|
|
__uint(max_entries, 1);
|
|
__uint(key_size, sizeof(int));
|
|
__uint(value_size, sizeof(int));
|
|
} xsk SEC(".maps");
|
|
|
|
static unsigned int idx;
|
|
int count = 0;
|
|
|
|
SEC("xdp") int xsk_def_prog(struct xdp_md *xdp)
|
|
{
|
|
return bpf_redirect_map(&xsk, 0, XDP_DROP);
|
|
}
|
|
|
|
SEC("xdp") int xsk_xdp_drop(struct xdp_md *xdp)
|
|
{
|
|
/* Drop every other packet */
|
|
if (idx++ % 2)
|
|
return XDP_DROP;
|
|
|
|
return bpf_redirect_map(&xsk, 0, XDP_DROP);
|
|
}
|
|
|
|
SEC("xdp") int xsk_xdp_populate_metadata(struct xdp_md *xdp)
|
|
{
|
|
void *data, *data_meta;
|
|
struct xdp_info *meta;
|
|
int err;
|
|
|
|
/* Reserve enough for all custom metadata. */
|
|
err = bpf_xdp_adjust_meta(xdp, -(int)sizeof(struct xdp_info));
|
|
if (err)
|
|
return XDP_DROP;
|
|
|
|
data = (void *)(long)xdp->data;
|
|
data_meta = (void *)(long)xdp->data_meta;
|
|
|
|
if (data_meta + sizeof(struct xdp_info) > data)
|
|
return XDP_DROP;
|
|
|
|
meta = data_meta;
|
|
meta->count = count++;
|
|
|
|
return bpf_redirect_map(&xsk, 0, XDP_DROP);
|
|
}
|
|
|
|
char _license[] SEC("license") = "GPL";
|