1*6db28e24SLorenzo Bianconi // SPDX-License-Identifier: GPL-2.0 2*6db28e24SLorenzo Bianconi /* 3*6db28e24SLorenzo Bianconi * This program is free software; you can redistribute it and/or 4*6db28e24SLorenzo Bianconi * modify it under the terms of version 2 of the GNU General Public 5*6db28e24SLorenzo Bianconi * License as published by the Free Software Foundation. 6*6db28e24SLorenzo Bianconi */ 7*6db28e24SLorenzo Bianconi #include <linux/bpf.h> 8*6db28e24SLorenzo Bianconi #include <linux/if_ether.h> 9*6db28e24SLorenzo Bianconi #include <bpf/bpf_helpers.h> 10*6db28e24SLorenzo Bianconi 11*6db28e24SLorenzo Bianconi int _version SEC("version") = 1; 12*6db28e24SLorenzo Bianconi 13*6db28e24SLorenzo Bianconi SEC("xdp.frags") xdp_adjust_frags(struct xdp_md * xdp)14*6db28e24SLorenzo Bianconiint xdp_adjust_frags(struct xdp_md *xdp) 15*6db28e24SLorenzo Bianconi { 16*6db28e24SLorenzo Bianconi __u8 *data_end = (void *)(long)xdp->data_end; 17*6db28e24SLorenzo Bianconi __u8 *data = (void *)(long)xdp->data; 18*6db28e24SLorenzo Bianconi __u8 val[16] = {}; 19*6db28e24SLorenzo Bianconi __u32 offset; 20*6db28e24SLorenzo Bianconi int err; 21*6db28e24SLorenzo Bianconi 22*6db28e24SLorenzo Bianconi if (data + sizeof(__u32) > data_end) 23*6db28e24SLorenzo Bianconi return XDP_DROP; 24*6db28e24SLorenzo Bianconi 25*6db28e24SLorenzo Bianconi offset = *(__u32 *)data; 26*6db28e24SLorenzo Bianconi err = bpf_xdp_load_bytes(xdp, offset, val, sizeof(val)); 27*6db28e24SLorenzo Bianconi if (err < 0) 28*6db28e24SLorenzo Bianconi return XDP_DROP; 29*6db28e24SLorenzo Bianconi 30*6db28e24SLorenzo Bianconi if (val[0] != 0xaa || val[15] != 0xaa) /* marker */ 31*6db28e24SLorenzo Bianconi return XDP_DROP; 32*6db28e24SLorenzo Bianconi 33*6db28e24SLorenzo Bianconi val[0] = 0xbb; /* update the marker */ 34*6db28e24SLorenzo Bianconi val[15] = 0xbb; 35*6db28e24SLorenzo Bianconi err = bpf_xdp_store_bytes(xdp, offset, val, sizeof(val)); 36*6db28e24SLorenzo Bianconi if (err < 0) 37*6db28e24SLorenzo Bianconi return XDP_DROP; 38*6db28e24SLorenzo Bianconi 39*6db28e24SLorenzo Bianconi return XDP_PASS; 40*6db28e24SLorenzo Bianconi } 41*6db28e24SLorenzo Bianconi 42*6db28e24SLorenzo Bianconi char _license[] SEC("license") = "GPL"; 43