1f0a249dfSMagnus Karlsson // SPDX-License-Identifier: GPL-2.0
2f0a249dfSMagnus Karlsson /* Copyright (c) 2022 Intel */
3f0a249dfSMagnus Karlsson
4f0a249dfSMagnus Karlsson #include <linux/bpf.h>
5f0a249dfSMagnus Karlsson #include <bpf/bpf_helpers.h>
69a321fd3STushar Vyavahare #include "xsk_xdp_metadata.h"
7f0a249dfSMagnus Karlsson
8f0a249dfSMagnus Karlsson struct {
9f0a249dfSMagnus Karlsson __uint(type, BPF_MAP_TYPE_XSKMAP);
10f0a249dfSMagnus Karlsson __uint(max_entries, 1);
11f0a249dfSMagnus Karlsson __uint(key_size, sizeof(int));
12f0a249dfSMagnus Karlsson __uint(value_size, sizeof(int));
13f0a249dfSMagnus Karlsson } xsk SEC(".maps");
14f0a249dfSMagnus Karlsson
1580bea9acSMagnus Karlsson static unsigned int idx;
169a321fd3STushar Vyavahare int count = 0;
1780bea9acSMagnus Karlsson
xsk_def_prog(struct xdp_md * xdp)18f540d44eSMagnus Karlsson SEC("xdp.frags") int xsk_def_prog(struct xdp_md *xdp)
19f0a249dfSMagnus Karlsson {
20f0a249dfSMagnus Karlsson return bpf_redirect_map(&xsk, 0, XDP_DROP);
21f0a249dfSMagnus Karlsson }
22f0a249dfSMagnus Karlsson
xsk_xdp_drop(struct xdp_md * xdp)23f540d44eSMagnus Karlsson SEC("xdp.frags") int xsk_xdp_drop(struct xdp_md *xdp)
2480bea9acSMagnus Karlsson {
2580bea9acSMagnus Karlsson /* Drop every other packet */
2680bea9acSMagnus Karlsson if (idx++ % 2)
2780bea9acSMagnus Karlsson return XDP_DROP;
2880bea9acSMagnus Karlsson
2980bea9acSMagnus Karlsson return bpf_redirect_map(&xsk, 0, XDP_DROP);
3080bea9acSMagnus Karlsson }
3180bea9acSMagnus Karlsson
xsk_xdp_populate_metadata(struct xdp_md * xdp)32*f80ddbecSMagnus Karlsson SEC("xdp.frags") int xsk_xdp_populate_metadata(struct xdp_md *xdp)
339a321fd3STushar Vyavahare {
349a321fd3STushar Vyavahare void *data, *data_meta;
359a321fd3STushar Vyavahare struct xdp_info *meta;
369a321fd3STushar Vyavahare int err;
379a321fd3STushar Vyavahare
389a321fd3STushar Vyavahare /* Reserve enough for all custom metadata. */
399a321fd3STushar Vyavahare err = bpf_xdp_adjust_meta(xdp, -(int)sizeof(struct xdp_info));
409a321fd3STushar Vyavahare if (err)
419a321fd3STushar Vyavahare return XDP_DROP;
429a321fd3STushar Vyavahare
439a321fd3STushar Vyavahare data = (void *)(long)xdp->data;
449a321fd3STushar Vyavahare data_meta = (void *)(long)xdp->data_meta;
459a321fd3STushar Vyavahare
469a321fd3STushar Vyavahare if (data_meta + sizeof(struct xdp_info) > data)
479a321fd3STushar Vyavahare return XDP_DROP;
489a321fd3STushar Vyavahare
499a321fd3STushar Vyavahare meta = data_meta;
509a321fd3STushar Vyavahare meta->count = count++;
519a321fd3STushar Vyavahare
529a321fd3STushar Vyavahare return bpf_redirect_map(&xsk, 0, XDP_DROP);
539a321fd3STushar Vyavahare }
549a321fd3STushar Vyavahare
55f0a249dfSMagnus Karlsson char _license[] SEC("license") = "GPL";
56