Blame view

samples/bpf/libbpf.h 5.41 KB
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
1
2
3
4
5
6
7
  /* eBPF mini library */
  #ifndef __LIBBPF_H
  #define __LIBBPF_H
  
  struct bpf_insn;
  
  int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,
89b976070   Alexei Starovoitov   samples/bpf: add ...
8
  		   int max_entries, int map_flags);
ffb65f27a   Alexei Starovoitov   bpf: add a testsu...
9
  int bpf_update_elem(int fd, void *key, void *value, unsigned long long flags);
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
10
11
12
13
14
15
  int bpf_lookup_elem(int fd, void *key, void *value);
  int bpf_delete_elem(int fd, void *key);
  int bpf_get_next_key(int fd, void *key, void *next_key);
  
  int bpf_prog_load(enum bpf_prog_type prog_type,
  		  const struct bpf_insn *insns, int insn_len,
b896c4f95   Alexei Starovoitov   samples/bpf: Add ...
16
  		  const char *license, int kern_version);
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
17

42984d7c1   Daniel Borkmann   bpf: add sample u...
18
19
  int bpf_obj_pin(int fd, const char *pathname);
  int bpf_obj_get(const char *pathname);
a80857822   Alexei Starovoitov   samples: bpf: tri...
20
  #define LOG_BUF_SIZE 65536
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  extern char bpf_log_buf[LOG_BUF_SIZE];
  
  /* ALU ops on registers, bpf_add|sub|...: dst_reg += src_reg */
  
  #define BPF_ALU64_REG(OP, DST, SRC)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU64 | BPF_OP(OP) | BPF_X,	\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = 0,					\
  		.imm   = 0 })
  
  #define BPF_ALU32_REG(OP, DST, SRC)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU | BPF_OP(OP) | BPF_X,		\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = 0,					\
  		.imm   = 0 })
  
  /* ALU ops on immediates, bpf_add|sub|...: dst_reg += imm32 */
  
  #define BPF_ALU64_IMM(OP, DST, IMM)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU64 | BPF_OP(OP) | BPF_K,	\
  		.dst_reg = DST,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
  		.imm   = IMM })
  
  #define BPF_ALU32_IMM(OP, DST, IMM)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU | BPF_OP(OP) | BPF_K,		\
  		.dst_reg = DST,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
  		.imm   = IMM })
  
  /* Short form of mov, dst_reg = src_reg */
  
  #define BPF_MOV64_REG(DST, SRC)					\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU64 | BPF_MOV | BPF_X,		\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = 0,					\
  		.imm   = 0 })
bf5088773   Alexei Starovoitov   bpf: add unprivil...
68
69
70
71
72
73
74
  #define BPF_MOV32_REG(DST, SRC)					\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU | BPF_MOV | BPF_X,		\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = 0,					\
  		.imm   = 0 })
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
75
76
77
78
79
80
81
82
  /* Short form of mov, dst_reg = imm32 */
  
  #define BPF_MOV64_IMM(DST, IMM)					\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU64 | BPF_MOV | BPF_K,		\
  		.dst_reg = DST,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
484611357   Josef Bacik   bpf: allow access...
83
84
85
86
87
88
89
90
  		.imm   = IMM })
  
  #define BPF_MOV32_IMM(DST, IMM)					\
  	((struct bpf_insn) {					\
  		.code  = BPF_ALU | BPF_MOV | BPF_K,		\
  		.dst_reg = DST,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  		.imm   = IMM })
  
  /* BPF_LD_IMM64 macro encodes single 'load 64-bit immediate' insn */
  #define BPF_LD_IMM64(DST, IMM)					\
  	BPF_LD_IMM64_RAW(DST, 0, IMM)
  
  #define BPF_LD_IMM64_RAW(DST, SRC, IMM)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_LD | BPF_DW | BPF_IMM,		\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = 0,					\
  		.imm   = (__u32) (IMM) }),			\
  	((struct bpf_insn) {					\
  		.code  = 0, /* zero is reserved opcode */	\
  		.dst_reg = 0,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
  		.imm   = ((__u64) (IMM)) >> 32 })
f1a66f85b   Daniel Borkmann   ebpf: export BPF_...
110
111
112
  #ifndef BPF_PSEUDO_MAP_FD
  # define BPF_PSEUDO_MAP_FD	1
  #endif
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
113
114
115
116
  
  /* pseudo BPF_LD_IMM64 insn used to refer to process-local map_fd */
  #define BPF_LD_MAP_FD(DST, MAP_FD)				\
  	BPF_LD_IMM64_RAW(DST, BPF_PSEUDO_MAP_FD, MAP_FD)
03f4723ed   Alexei Starovoitov   samples: bpf: exa...
117
118
119
120
121
122
123
124
125
  /* Direct packet access, R0 = *(uint *) (skb->data + imm32) */
  
  #define BPF_LD_ABS(SIZE, IMM)					\
  	((struct bpf_insn) {					\
  		.code  = BPF_LD | BPF_SIZE(SIZE) | BPF_ABS,	\
  		.dst_reg = 0,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
  		.imm   = IMM })
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  /* Memory load, dst_reg = *(uint *) (src_reg + off16) */
  
  #define BPF_LDX_MEM(SIZE, DST, SRC, OFF)			\
  	((struct bpf_insn) {					\
  		.code  = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM,	\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = OFF,					\
  		.imm   = 0 })
  
  /* Memory store, *(uint *) (dst_reg + off16) = src_reg */
  
  #define BPF_STX_MEM(SIZE, DST, SRC, OFF)			\
  	((struct bpf_insn) {					\
  		.code  = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM,	\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = OFF,					\
  		.imm   = 0 })
  
  /* Memory store, *(uint *) (dst_reg + off16) = imm32 */
  
  #define BPF_ST_MEM(SIZE, DST, OFF, IMM)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM,	\
  		.dst_reg = DST,					\
  		.src_reg = 0,					\
  		.off   = OFF,					\
  		.imm   = IMM })
  
  /* Conditional jumps against registers, if (dst_reg 'op' src_reg) goto pc + off16 */
  
  #define BPF_JMP_REG(OP, DST, SRC, OFF)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_JMP | BPF_OP(OP) | BPF_X,		\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = OFF,					\
  		.imm   = 0 })
  
  /* Conditional jumps against immediates, if (dst_reg 'op' imm32) goto pc + off16 */
  
  #define BPF_JMP_IMM(OP, DST, IMM, OFF)				\
  	((struct bpf_insn) {					\
  		.code  = BPF_JMP | BPF_OP(OP) | BPF_K,		\
  		.dst_reg = DST,					\
  		.src_reg = 0,					\
  		.off   = OFF,					\
  		.imm   = IMM })
  
  /* Raw code statement block */
  
  #define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM)			\
  	((struct bpf_insn) {					\
  		.code  = CODE,					\
  		.dst_reg = DST,					\
  		.src_reg = SRC,					\
  		.off   = OFF,					\
  		.imm   = IMM })
  
  /* Program exit */
  
  #define BPF_EXIT_INSN()						\
  	((struct bpf_insn) {					\
  		.code  = BPF_JMP | BPF_EXIT,			\
  		.dst_reg = 0,					\
  		.src_reg = 0,					\
  		.off   = 0,					\
  		.imm   = 0 })
03f4723ed   Alexei Starovoitov   samples: bpf: exa...
195
196
  /* create RAW socket and bind to interface 'name' */
  int open_raw_sock(const char *name);
b896c4f95   Alexei Starovoitov   samples/bpf: Add ...
197
198
199
  struct perf_event_attr;
  int perf_event_open(struct perf_event_attr *attr, int pid, int cpu,
  		    int group_fd, unsigned long flags);
3c731eba4   Alexei Starovoitov   bpf: mini eBPF li...
200
  #endif