Skip to content

Commit f143c11

Browse files
committed
tools: bpf: Use local copy of headers including uapi/linux/filter.h
Pulling header files directly out of the kernel sources for inclusion in userspace programs is highly error prone, not least because it bypasses the kbuild infrastructure entirely and so may end up referencing other header files that have not been generated. Subsequent patches will cause compiler.h to pull in the ungenerated asm/rwonce.h file via filter.h, breaking the build for tools/bpf: | $ make -C tools/bpf | make: Entering directory '/linux/tools/bpf' | CC bpf_jit_disasm.o | LINK bpf_jit_disasm | CC bpf_dbg.o | In file included from /linux/include/uapi/linux/filter.h:9, | from /linux/tools/bpf/bpf_dbg.c:41: | /linux/include/linux/compiler.h:247:10: fatal error: asm/rwonce.h: No such file or directory | #include <asm/rwonce.h> | ^~~~~~~~~~~~~~ | compilation terminated. | make: *** [Makefile:61: bpf_dbg.o] Error 1 | make: Leaving directory '/linux/tools/bpf' Take a copy of the installed version of linux/filter.h (i.e. the one created by the 'headers_install' target) into tools/include/uapi/linux/ and adjust the BPF tool Makefile to reference the local include directories instead of those in the main source tree. Cc: Masahiro Yamada <[email protected]> Acked-by: Peter Zijlstra (Intel) <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Suggested-by: Daniel Borkmann <[email protected]> Reported-by: Xiao Yang <[email protected]> Signed-off-by: Will Deacon <[email protected]>
1 parent 9ebcfad commit f143c11

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

tools/bpf/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ MAKE = make
99
INSTALL ?= install
1010

1111
CFLAGS += -Wall -O2
12-
CFLAGS += -D__EXPORTED_HEADERS__ -I$(srctree)/include/uapi -I$(srctree)/include
12+
CFLAGS += -D__EXPORTED_HEADERS__ -I$(srctree)/tools/include/uapi \
13+
-I$(srctree)/tools/include
1314

1415
# This will work when bpf is built in tools env. where srctree
1516
# isn't set and when invoked from selftests build, where srctree

tools/include/uapi/linux/filter.h

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2+
/*
3+
* Linux Socket Filter Data Structures
4+
*/
5+
6+
#ifndef __LINUX_FILTER_H__
7+
#define __LINUX_FILTER_H__
8+
9+
10+
#include <linux/types.h>
11+
#include <linux/bpf_common.h>
12+
13+
/*
14+
* Current version of the filter code architecture.
15+
*/
16+
#define BPF_MAJOR_VERSION 1
17+
#define BPF_MINOR_VERSION 1
18+
19+
/*
20+
* Try and keep these values and structures similar to BSD, especially
21+
* the BPF code definitions which need to match so you can share filters
22+
*/
23+
24+
struct sock_filter { /* Filter block */
25+
__u16 code; /* Actual filter code */
26+
__u8 jt; /* Jump true */
27+
__u8 jf; /* Jump false */
28+
__u32 k; /* Generic multiuse field */
29+
};
30+
31+
struct sock_fprog { /* Required for SO_ATTACH_FILTER. */
32+
unsigned short len; /* Number of filter blocks */
33+
struct sock_filter *filter;
34+
};
35+
36+
/* ret - BPF_K and BPF_X also apply */
37+
#define BPF_RVAL(code) ((code) & 0x18)
38+
#define BPF_A 0x10
39+
40+
/* misc */
41+
#define BPF_MISCOP(code) ((code) & 0xf8)
42+
#define BPF_TAX 0x00
43+
#define BPF_TXA 0x80
44+
45+
/*
46+
* Macros for filter block array initializers.
47+
*/
48+
#ifndef BPF_STMT
49+
#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k }
50+
#endif
51+
#ifndef BPF_JUMP
52+
#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k }
53+
#endif
54+
55+
/*
56+
* Number of scratch memory words for: BPF_ST and BPF_STX
57+
*/
58+
#define BPF_MEMWORDS 16
59+
60+
/* RATIONALE. Negative offsets are invalid in BPF.
61+
We use them to reference ancillary data.
62+
Unlike introduction new instructions, it does not break
63+
existing compilers/optimizers.
64+
*/
65+
#define SKF_AD_OFF (-0x1000)
66+
#define SKF_AD_PROTOCOL 0
67+
#define SKF_AD_PKTTYPE 4
68+
#define SKF_AD_IFINDEX 8
69+
#define SKF_AD_NLATTR 12
70+
#define SKF_AD_NLATTR_NEST 16
71+
#define SKF_AD_MARK 20
72+
#define SKF_AD_QUEUE 24
73+
#define SKF_AD_HATYPE 28
74+
#define SKF_AD_RXHASH 32
75+
#define SKF_AD_CPU 36
76+
#define SKF_AD_ALU_XOR_X 40
77+
#define SKF_AD_VLAN_TAG 44
78+
#define SKF_AD_VLAN_TAG_PRESENT 48
79+
#define SKF_AD_PAY_OFFSET 52
80+
#define SKF_AD_RANDOM 56
81+
#define SKF_AD_VLAN_TPID 60
82+
#define SKF_AD_MAX 64
83+
84+
#define SKF_NET_OFF (-0x100000)
85+
#define SKF_LL_OFF (-0x200000)
86+
87+
#define BPF_NET_OFF SKF_NET_OFF
88+
#define BPF_LL_OFF SKF_LL_OFF
89+
90+
#endif /* __LINUX_FILTER_H__ */

0 commit comments

Comments
 (0)