From 4ba2b326284765e942044db13a7f0dae702bec93 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 09:10:00 +0200 Subject: Adding upstream version 1.3.1. Signed-off-by: Daniel Baumann --- xdp-dump/xdpdump_xdp.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 xdp-dump/xdpdump_xdp.c (limited to 'xdp-dump/xdpdump_xdp.c') diff --git a/xdp-dump/xdpdump_xdp.c b/xdp-dump/xdpdump_xdp.c new file mode 100644 index 0000000..76e7509 --- /dev/null +++ b/xdp-dump/xdpdump_xdp.c @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: GPL-2.0 + +/***************************************************************************** + * Include files + *****************************************************************************/ +#include +#include +#include +#include +#include "xdpdump.h" + +/***************************************************************************** + * Macros + *****************************************************************************/ +#define min(x, y) ((x) < (y) ? x : y) + + +/***************************************************************************** + * Local definitions and global variables + *****************************************************************************/ +struct { + __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(max_entries, MAX_CPUS); + __type(key, int); + __type(value, __u32); +} xdpdump_perf_map SEC(".maps"); + + +/***************************************************************************** + * .data section value storing the capture configuration + *****************************************************************************/ +struct trace_configuration trace_cfg SEC(".data"); + + +/***************************************************************************** + * XDP trace program + *****************************************************************************/ +SEC("xdp") +int xdpdump(struct xdp_md *xdp) +{ + void *data_end = (void *)(long)xdp->data_end; + void *data = (void *)(long)xdp->data; + struct pkt_trace_metadata metadata; + + if (data >= data_end || + trace_cfg.capture_if_ifindex != xdp->ingress_ifindex) + return XDP_PASS; + + metadata.prog_index = trace_cfg.capture_prog_index; + metadata.ifindex = xdp->ingress_ifindex; + metadata.rx_queue = xdp->rx_queue_index; + metadata.pkt_len = (__u16)(data_end - data); + metadata.cap_len = min(metadata.pkt_len, trace_cfg.capture_snaplen); + metadata.action = 0; + metadata.flags = 0; + + bpf_perf_event_output(xdp, &xdpdump_perf_map, + ((__u64) metadata.cap_len << 32) | + BPF_F_CURRENT_CPU, + &metadata, sizeof(metadata)); + + return XDP_PASS; +} + + +/***************************************************************************** + * License + *****************************************************************************/ +char _license[] SEC("license") = "GPL"; -- cgit v1.2.3