lib: remove C++ include guard from private headers
[dpdk.git] / lib / bpf / bpf_def.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 1982, 1986, 1990, 1993
3  *      The Regents of the University of California.
4  * Copyright(c) 2018 Intel Corporation.
5  */
6
7 #ifndef _RTE_BPF_DEF_H_
8 #define _RTE_BPF_DEF_H_
9
10 /**
11  * @file
12  *
13  * classic BPF (cBPF) and extended BPF (eBPF) related defines.
14  * For more information regarding cBPF and eBPF ISA and their differences,
15  * please refer to:
16  * https://www.kernel.org/doc/Documentation/networking/filter.txt.
17  * As a rule of thumb for that file:
18  * all definitions used by both cBPF and eBPF start with bpf(BPF)_ prefix,
19  * while eBPF only ones start with ebpf(EBPF)) prefix.
20  */
21
22 #include <stdint.h>
23
24
25 /*
26  * The instruction encodings.
27  */
28
29 /* Instruction classes */
30 #define BPF_CLASS(code) ((code) & 0x07)
31 #define BPF_LD          0x00
32 #define BPF_LDX         0x01
33 #define BPF_ST          0x02
34 #define BPF_STX         0x03
35 #define BPF_ALU         0x04
36 #define BPF_JMP         0x05
37 #define BPF_RET         0x06
38 #define BPF_MISC        0x07
39
40 #define EBPF_ALU64      0x07
41
42 /* ld/ldx fields */
43 #define BPF_SIZE(code)  ((code) & 0x18)
44 #define BPF_W           0x00
45 #define BPF_H           0x08
46 #define BPF_B           0x10
47 #define EBPF_DW         0x18
48
49 #define BPF_MODE(code)  ((code) & 0xe0)
50 #define BPF_IMM         0x00
51 #define BPF_ABS         0x20
52 #define BPF_IND         0x40
53 #define BPF_MEM         0x60
54 #define BPF_LEN         0x80
55 #define BPF_MSH         0xa0
56
57 #define EBPF_XADD       0xc0
58
59 /* alu/jmp fields */
60 #define BPF_OP(code)    ((code) & 0xf0)
61 #define BPF_ADD         0x00
62 #define BPF_SUB         0x10
63 #define BPF_MUL         0x20
64 #define BPF_DIV         0x30
65 #define BPF_OR          0x40
66 #define BPF_AND         0x50
67 #define BPF_LSH         0x60
68 #define BPF_RSH         0x70
69 #define BPF_NEG         0x80
70 #define BPF_MOD         0x90
71 #define BPF_XOR         0xa0
72
73 #define EBPF_MOV        0xb0
74 #define EBPF_ARSH       0xc0
75 #define EBPF_END        0xd0
76
77 #define BPF_JA          0x00
78 #define BPF_JEQ         0x10
79 #define BPF_JGT         0x20
80 #define BPF_JGE         0x30
81 #define BPF_JSET        0x40
82
83 #define EBPF_JNE        0x50
84 #define EBPF_JSGT       0x60
85 #define EBPF_JSGE       0x70
86 #define EBPF_CALL       0x80
87 #define EBPF_EXIT       0x90
88 #define EBPF_JLT        0xa0
89 #define EBPF_JLE        0xb0
90 #define EBPF_JSLT       0xc0
91 #define EBPF_JSLE       0xd0
92
93 #define BPF_SRC(code)   ((code) & 0x08)
94 #define BPF_K           0x00
95 #define BPF_X           0x08
96
97 /* if BPF_OP(code) == EBPF_END */
98 #define EBPF_TO_LE      0x00  /* convert to little-endian */
99 #define EBPF_TO_BE      0x08  /* convert to big-endian */
100
101 /*
102  * eBPF registers
103  */
104 enum {
105         EBPF_REG_0,  /* return value from internal function/for eBPF program */
106         EBPF_REG_1,  /* 0-th argument to internal function */
107         EBPF_REG_2,  /* 1-th argument to internal function */
108         EBPF_REG_3,  /* 2-th argument to internal function */
109         EBPF_REG_4,  /* 3-th argument to internal function */
110         EBPF_REG_5,  /* 4-th argument to internal function */
111         EBPF_REG_6,  /* callee saved register */
112         EBPF_REG_7,  /* callee saved register */
113         EBPF_REG_8,  /* callee saved register */
114         EBPF_REG_9,  /* callee saved register */
115         EBPF_REG_10, /* stack pointer (read-only) */
116         EBPF_REG_NUM,
117 };
118
119 /*
120  * When EBPF_CALL instruction has src_reg == EBPF_PSEUDO_CALL,
121  * it should be treated as pseudo-call instruction, where
122  * imm value contains pc-relative offset to another EBPF function.
123  * Right now DPDK EBPF library doesn't support it.
124  */
125 #define EBPF_PSEUDO_CALL        EBPF_REG_1
126
127 /*
128  * eBPF instruction format
129  */
130 struct ebpf_insn {
131         uint8_t code;
132         uint8_t dst_reg:4;
133         uint8_t src_reg:4;
134         int16_t off;
135         int32_t imm;
136 };
137
138 /*
139  * eBPF allows functions with R1-R5 as arguments.
140  */
141 #define EBPF_FUNC_MAX_ARGS      (EBPF_REG_6 - EBPF_REG_1)
142
143 #endif /* RTE_BPF_DEF_H_ */