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