1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #include <linux/bpf.h>
- #include <bpf/bpf_helpers.h>
- 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";
|