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