diff options
Diffstat (limited to '')
-rw-r--r-- | xdp-dump/xdpdump_xdp.c | 69 |
1 files changed, 69 insertions, 0 deletions
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 <stdbool.h> +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> +#include <bpf/bpf_trace_helpers.h> +#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"; |