cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

test_xdp_meta.c (1251B)


      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->mem
     10
     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";