#include #include const int XDP_ACTION_MAX = (XDP_TX + 1); struct datarec { __u64 rx_packets; }; // stats keyed by XDP Action struct bpf_map_def SEC("maps") xdp_stats_map = { .type = BPF_MAP_TYPE_ARRAY, .key_size = sizeof(__u32), .value_size = sizeof(struct datarec), .max_entries = XDP_ACTION_MAX, }; // tracks number of times called struct bpf_map_def SEC("maps") prog_stats_map = { .type = BPF_MAP_TYPE_ARRAY, .key_size = sizeof(__u32), .value_size = sizeof(__u64), .max_entries = 1, }; SEC("xdp/stats") int xdp_stats(struct xdp_md *ctx) { __u64 *stats; struct datarec *rec; __u32 key = XDP_PASS; __u32 k1 = 0; stats = bpf_map_lookup_elem(&prog_stats_map, &k1); if (!stats) return XDP_ABORTED; __sync_fetch_and_add(stats, 1); rec = bpf_map_lookup_elem(&xdp_stats_map, &key); if (!rec) return XDP_ABORTED; __sync_fetch_and_add(&rec->rx_packets, 1); return XDP_PASS; } char _license[] SEC("license") = "GPL";