67 lines · c
1// SPDX-License-Identifier: GPL-2.02#include <linux/bpf.h>3#include <bpf/bpf_tracing.h>4#include <bpf/bpf_helpers.h>5 6char _license[] SEC("license") = "GPL";7 8struct net_device {9 /* Structure does not need to contain all entries,10 * as "preserve_access_index" will use BTF to fix this...11 */12 int ifindex;13} __attribute__((preserve_access_index));14 15struct xdp_rxq_info {16 /* Structure does not need to contain all entries,17 * as "preserve_access_index" will use BTF to fix this...18 */19 struct net_device *dev;20 __u32 queue_index;21} __attribute__((preserve_access_index));22 23struct xdp_buff {24 void *data;25 void *data_end;26 void *data_meta;27 void *data_hard_start;28 unsigned long handle;29 struct xdp_rxq_info *rxq;30} __attribute__((preserve_access_index));31 32struct meta {33 int ifindex;34 int pkt_len;35};36 37struct {38 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);39 __type(key, int);40 __type(value, int);41} perf_buf_map SEC(".maps");42 43__u64 test_result_fentry = 0;44SEC("fentry/FUNC")45int BPF_PROG(trace_on_entry, struct xdp_buff *xdp)46{47 struct meta meta;48 49 meta.ifindex = xdp->rxq->dev->ifindex;50 meta.pkt_len = bpf_xdp_get_buff_len((struct xdp_md *)xdp);51 bpf_xdp_output(xdp, &perf_buf_map,52 ((__u64) meta.pkt_len << 32) |53 BPF_F_CURRENT_CPU,54 &meta, sizeof(meta));55 56 test_result_fentry = xdp->rxq->dev->ifindex;57 return 0;58}59 60__u64 test_result_fexit = 0;61SEC("fexit/FUNC")62int BPF_PROG(trace_on_exit, struct xdp_buff *xdp, int ret)63{64 test_result_fexit = ret;65 return 0;66}67