brintos

brintos / linux-shallow public Read only

0
0
Text · 1.2 KiB · a7c4a7d Raw
54 lines · c
1#include <linux/bpf.h>2#include <linux/if_ether.h>3#include <linux/pkt_cls.h>4 5#include <bpf/bpf_helpers.h>6 7#define __round_mask(x, y) ((__typeof__(x))((y) - 1))8#define round_up(x, y) ((((x) - 1) | __round_mask(x, y)) + 1)9#define ctx_ptr(ctx, mem) (void *)(unsigned long)ctx->mem10 11SEC("t")12int ing_cls(struct __sk_buff *ctx)13{14	__u8 *data, *data_meta, *data_end;15	__u32 diff = 0;16 17	data_meta = ctx_ptr(ctx, data_meta);18	data_end  = ctx_ptr(ctx, data_end);19	data      = ctx_ptr(ctx, data);20 21	if (data + ETH_ALEN > data_end ||22	    data_meta + round_up(ETH_ALEN, 4) > data)23		return TC_ACT_SHOT;24 25	diff |= ((__u32 *)data_meta)[0] ^ ((__u32 *)data)[0];26	diff |= ((__u16 *)data_meta)[2] ^ ((__u16 *)data)[2];27 28	return diff ? TC_ACT_SHOT : TC_ACT_OK;29}30 31SEC("x")32int ing_xdp(struct xdp_md *ctx)33{34	__u8 *data, *data_meta, *data_end;35	int ret;36 37	ret = bpf_xdp_adjust_meta(ctx, -round_up(ETH_ALEN, 4));38	if (ret < 0)39		return XDP_DROP;40 41	data_meta = ctx_ptr(ctx, data_meta);42	data_end  = ctx_ptr(ctx, data_end);43	data      = ctx_ptr(ctx, data);44 45	if (data + ETH_ALEN > data_end ||46	    data_meta + round_up(ETH_ALEN, 4) > data)47		return XDP_DROP;48 49	__builtin_memcpy(data_meta, data, ETH_ALEN);50	return XDP_PASS;51}52 53char _license[] SEC("license") = "GPL";54