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_pkt_md_access.c (1127B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/* Copyright (c) 2017 Facebook
      3 */
      4#include <stddef.h>
      5#include <string.h>
      6#include <linux/bpf.h>
      7#include <linux/pkt_cls.h>
      8#include <bpf/bpf_helpers.h>
      9
     10#if  __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
     11#define TEST_FIELD(TYPE, FIELD, MASK)					\
     12	{								\
     13		TYPE tmp = *(volatile TYPE *)&skb->FIELD;		\
     14		if (tmp != ((*(volatile __u32 *)&skb->FIELD) & MASK))	\
     15			return TC_ACT_SHOT;				\
     16	}
     17#else
     18#define TEST_FIELD_OFFSET(a, b)	((sizeof(a) - sizeof(b)) / sizeof(b))
     19#define TEST_FIELD(TYPE, FIELD, MASK)					\
     20	{								\
     21		TYPE tmp = *((volatile TYPE *)&skb->FIELD +		\
     22			      TEST_FIELD_OFFSET(skb->FIELD, TYPE));	\
     23		if (tmp != ((*(volatile __u32 *)&skb->FIELD) & MASK))	\
     24			return TC_ACT_SHOT;				\
     25	}
     26#endif
     27
     28SEC("tc")
     29int test_pkt_md_access(struct __sk_buff *skb)
     30{
     31	TEST_FIELD(__u8,  len, 0xFF);
     32	TEST_FIELD(__u16, len, 0xFFFF);
     33	TEST_FIELD(__u32, len, 0xFFFFFFFF);
     34	TEST_FIELD(__u16, protocol, 0xFFFF);
     35	TEST_FIELD(__u32, protocol, 0xFFFFFFFF);
     36	TEST_FIELD(__u8,  hash, 0xFF);
     37	TEST_FIELD(__u16, hash, 0xFFFF);
     38	TEST_FIELD(__u32, hash, 0xFFFFFFFF);
     39
     40	return TC_ACT_OK;
     41}