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