xref: /linux/include/uapi/linux/bpf.h (revision 96be4325f443dbbfeb37d2a157675ac0736531a1)
1daedfb22SAlexei Starovoitov /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
2daedfb22SAlexei Starovoitov  *
3daedfb22SAlexei Starovoitov  * This program is free software; you can redistribute it and/or
4daedfb22SAlexei Starovoitov  * modify it under the terms of version 2 of the GNU General Public
5daedfb22SAlexei Starovoitov  * License as published by the Free Software Foundation.
6daedfb22SAlexei Starovoitov  */
7daedfb22SAlexei Starovoitov #ifndef _UAPI__LINUX_BPF_H__
8daedfb22SAlexei Starovoitov #define _UAPI__LINUX_BPF_H__
9daedfb22SAlexei Starovoitov 
10daedfb22SAlexei Starovoitov #include <linux/types.h>
11c15952dcSAlexei Starovoitov #include <linux/bpf_common.h>
12daedfb22SAlexei Starovoitov 
13daedfb22SAlexei Starovoitov /* Extended instruction set based on top of classic BPF */
14daedfb22SAlexei Starovoitov 
15daedfb22SAlexei Starovoitov /* instruction classes */
16daedfb22SAlexei Starovoitov #define BPF_ALU64	0x07	/* alu mode in double word width */
17daedfb22SAlexei Starovoitov 
18daedfb22SAlexei Starovoitov /* ld/ldx fields */
19daedfb22SAlexei Starovoitov #define BPF_DW		0x18	/* double word */
20daedfb22SAlexei Starovoitov #define BPF_XADD	0xc0	/* exclusive add */
21daedfb22SAlexei Starovoitov 
22daedfb22SAlexei Starovoitov /* alu/jmp fields */
23daedfb22SAlexei Starovoitov #define BPF_MOV		0xb0	/* mov reg to reg */
24daedfb22SAlexei Starovoitov #define BPF_ARSH	0xc0	/* sign extending arithmetic shift right */
25daedfb22SAlexei Starovoitov 
26daedfb22SAlexei Starovoitov /* change endianness of a register */
27daedfb22SAlexei Starovoitov #define BPF_END		0xd0	/* flags for endianness conversion: */
28daedfb22SAlexei Starovoitov #define BPF_TO_LE	0x00	/* convert to little-endian */
29daedfb22SAlexei Starovoitov #define BPF_TO_BE	0x08	/* convert to big-endian */
30daedfb22SAlexei Starovoitov #define BPF_FROM_LE	BPF_TO_LE
31daedfb22SAlexei Starovoitov #define BPF_FROM_BE	BPF_TO_BE
32daedfb22SAlexei Starovoitov 
33daedfb22SAlexei Starovoitov #define BPF_JNE		0x50	/* jump != */
34daedfb22SAlexei Starovoitov #define BPF_JSGT	0x60	/* SGT is signed '>', GT in x86 */
35daedfb22SAlexei Starovoitov #define BPF_JSGE	0x70	/* SGE is signed '>=', GE in x86 */
36daedfb22SAlexei Starovoitov #define BPF_CALL	0x80	/* function call */
37daedfb22SAlexei Starovoitov #define BPF_EXIT	0x90	/* function return */
38daedfb22SAlexei Starovoitov 
39daedfb22SAlexei Starovoitov /* Register numbers */
40daedfb22SAlexei Starovoitov enum {
41daedfb22SAlexei Starovoitov 	BPF_REG_0 = 0,
42daedfb22SAlexei Starovoitov 	BPF_REG_1,
43daedfb22SAlexei Starovoitov 	BPF_REG_2,
44daedfb22SAlexei Starovoitov 	BPF_REG_3,
45daedfb22SAlexei Starovoitov 	BPF_REG_4,
46daedfb22SAlexei Starovoitov 	BPF_REG_5,
47daedfb22SAlexei Starovoitov 	BPF_REG_6,
48daedfb22SAlexei Starovoitov 	BPF_REG_7,
49daedfb22SAlexei Starovoitov 	BPF_REG_8,
50daedfb22SAlexei Starovoitov 	BPF_REG_9,
51daedfb22SAlexei Starovoitov 	BPF_REG_10,
52daedfb22SAlexei Starovoitov 	__MAX_BPF_REG,
53daedfb22SAlexei Starovoitov };
54daedfb22SAlexei Starovoitov 
55daedfb22SAlexei Starovoitov /* BPF has 10 general purpose 64-bit registers and stack frame. */
56daedfb22SAlexei Starovoitov #define MAX_BPF_REG	__MAX_BPF_REG
57daedfb22SAlexei Starovoitov 
58daedfb22SAlexei Starovoitov struct bpf_insn {
59daedfb22SAlexei Starovoitov 	__u8	code;		/* opcode */
60daedfb22SAlexei Starovoitov 	__u8	dst_reg:4;	/* dest register */
61daedfb22SAlexei Starovoitov 	__u8	src_reg:4;	/* source register */
62daedfb22SAlexei Starovoitov 	__s16	off;		/* signed offset */
63daedfb22SAlexei Starovoitov 	__s32	imm;		/* signed immediate constant */
64daedfb22SAlexei Starovoitov };
65daedfb22SAlexei Starovoitov 
6699c55f7dSAlexei Starovoitov /* BPF syscall commands */
6799c55f7dSAlexei Starovoitov enum bpf_cmd {
6899c55f7dSAlexei Starovoitov 	/* create a map with given type and attributes
6999c55f7dSAlexei Starovoitov 	 * fd = bpf(BPF_MAP_CREATE, union bpf_attr *, u32 size)
7099c55f7dSAlexei Starovoitov 	 * returns fd or negative error
7199c55f7dSAlexei Starovoitov 	 * map is deleted when fd is closed
7299c55f7dSAlexei Starovoitov 	 */
7399c55f7dSAlexei Starovoitov 	BPF_MAP_CREATE,
74db20fd2bSAlexei Starovoitov 
75db20fd2bSAlexei Starovoitov 	/* lookup key in a given map
76db20fd2bSAlexei Starovoitov 	 * err = bpf(BPF_MAP_LOOKUP_ELEM, union bpf_attr *attr, u32 size)
77db20fd2bSAlexei Starovoitov 	 * Using attr->map_fd, attr->key, attr->value
78db20fd2bSAlexei Starovoitov 	 * returns zero and stores found elem into value
79db20fd2bSAlexei Starovoitov 	 * or negative error
80db20fd2bSAlexei Starovoitov 	 */
81db20fd2bSAlexei Starovoitov 	BPF_MAP_LOOKUP_ELEM,
82db20fd2bSAlexei Starovoitov 
83db20fd2bSAlexei Starovoitov 	/* create or update key/value pair in a given map
84db20fd2bSAlexei Starovoitov 	 * err = bpf(BPF_MAP_UPDATE_ELEM, union bpf_attr *attr, u32 size)
853274f520SAlexei Starovoitov 	 * Using attr->map_fd, attr->key, attr->value, attr->flags
86db20fd2bSAlexei Starovoitov 	 * returns zero or negative error
87db20fd2bSAlexei Starovoitov 	 */
88db20fd2bSAlexei Starovoitov 	BPF_MAP_UPDATE_ELEM,
89db20fd2bSAlexei Starovoitov 
90db20fd2bSAlexei Starovoitov 	/* find and delete elem by key in a given map
91db20fd2bSAlexei Starovoitov 	 * err = bpf(BPF_MAP_DELETE_ELEM, union bpf_attr *attr, u32 size)
92db20fd2bSAlexei Starovoitov 	 * Using attr->map_fd, attr->key
93db20fd2bSAlexei Starovoitov 	 * returns zero or negative error
94db20fd2bSAlexei Starovoitov 	 */
95db20fd2bSAlexei Starovoitov 	BPF_MAP_DELETE_ELEM,
96db20fd2bSAlexei Starovoitov 
97db20fd2bSAlexei Starovoitov 	/* lookup key in a given map and return next key
98db20fd2bSAlexei Starovoitov 	 * err = bpf(BPF_MAP_GET_NEXT_KEY, union bpf_attr *attr, u32 size)
99db20fd2bSAlexei Starovoitov 	 * Using attr->map_fd, attr->key, attr->next_key
100db20fd2bSAlexei Starovoitov 	 * returns zero and stores next key or negative error
101db20fd2bSAlexei Starovoitov 	 */
102db20fd2bSAlexei Starovoitov 	BPF_MAP_GET_NEXT_KEY,
10309756af4SAlexei Starovoitov 
10409756af4SAlexei Starovoitov 	/* verify and load eBPF program
10509756af4SAlexei Starovoitov 	 * prog_fd = bpf(BPF_PROG_LOAD, union bpf_attr *attr, u32 size)
10609756af4SAlexei Starovoitov 	 * Using attr->prog_type, attr->insns, attr->license
10709756af4SAlexei Starovoitov 	 * returns fd or negative error
10809756af4SAlexei Starovoitov 	 */
10909756af4SAlexei Starovoitov 	BPF_PROG_LOAD,
11099c55f7dSAlexei Starovoitov };
11199c55f7dSAlexei Starovoitov 
11299c55f7dSAlexei Starovoitov enum bpf_map_type {
11399c55f7dSAlexei Starovoitov 	BPF_MAP_TYPE_UNSPEC,
1140f8e4bd8SAlexei Starovoitov 	BPF_MAP_TYPE_HASH,
11528fbcfa0SAlexei Starovoitov 	BPF_MAP_TYPE_ARRAY,
11699c55f7dSAlexei Starovoitov };
11799c55f7dSAlexei Starovoitov 
11809756af4SAlexei Starovoitov enum bpf_prog_type {
11909756af4SAlexei Starovoitov 	BPF_PROG_TYPE_UNSPEC,
120ddd872bcSAlexei Starovoitov 	BPF_PROG_TYPE_SOCKET_FILTER,
121*96be4325SDaniel Borkmann 	BPF_PROG_TYPE_SCHED_CLS,
12209756af4SAlexei Starovoitov };
12309756af4SAlexei Starovoitov 
124f1a66f85SDaniel Borkmann #define BPF_PSEUDO_MAP_FD	1
125f1a66f85SDaniel Borkmann 
1263274f520SAlexei Starovoitov /* flags for BPF_MAP_UPDATE_ELEM command */
1273274f520SAlexei Starovoitov #define BPF_ANY		0 /* create new element or update existing */
1283274f520SAlexei Starovoitov #define BPF_NOEXIST	1 /* create new element if it didn't exist */
1293274f520SAlexei Starovoitov #define BPF_EXIST	2 /* update existing element */
1303274f520SAlexei Starovoitov 
13199c55f7dSAlexei Starovoitov union bpf_attr {
13299c55f7dSAlexei Starovoitov 	struct { /* anonymous struct used by BPF_MAP_CREATE command */
13399c55f7dSAlexei Starovoitov 		__u32	map_type;	/* one of enum bpf_map_type */
13499c55f7dSAlexei Starovoitov 		__u32	key_size;	/* size of key in bytes */
13599c55f7dSAlexei Starovoitov 		__u32	value_size;	/* size of value in bytes */
13699c55f7dSAlexei Starovoitov 		__u32	max_entries;	/* max number of entries in a map */
13799c55f7dSAlexei Starovoitov 	};
138db20fd2bSAlexei Starovoitov 
139db20fd2bSAlexei Starovoitov 	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
140db20fd2bSAlexei Starovoitov 		__u32		map_fd;
141db20fd2bSAlexei Starovoitov 		__aligned_u64	key;
142db20fd2bSAlexei Starovoitov 		union {
143db20fd2bSAlexei Starovoitov 			__aligned_u64 value;
144db20fd2bSAlexei Starovoitov 			__aligned_u64 next_key;
145db20fd2bSAlexei Starovoitov 		};
1463274f520SAlexei Starovoitov 		__u64		flags;
147db20fd2bSAlexei Starovoitov 	};
14809756af4SAlexei Starovoitov 
14909756af4SAlexei Starovoitov 	struct { /* anonymous struct used by BPF_PROG_LOAD command */
15009756af4SAlexei Starovoitov 		__u32		prog_type;	/* one of enum bpf_prog_type */
15109756af4SAlexei Starovoitov 		__u32		insn_cnt;
15209756af4SAlexei Starovoitov 		__aligned_u64	insns;
15309756af4SAlexei Starovoitov 		__aligned_u64	license;
154cbd35700SAlexei Starovoitov 		__u32		log_level;	/* verbosity level of verifier */
155cbd35700SAlexei Starovoitov 		__u32		log_size;	/* size of user buffer */
156cbd35700SAlexei Starovoitov 		__aligned_u64	log_buf;	/* user supplied buffer */
15709756af4SAlexei Starovoitov 	};
15899c55f7dSAlexei Starovoitov } __attribute__((aligned(8)));
15999c55f7dSAlexei Starovoitov 
16009756af4SAlexei Starovoitov /* integer value in 'imm' field of BPF_CALL instruction selects which helper
16109756af4SAlexei Starovoitov  * function eBPF program intends to call
16209756af4SAlexei Starovoitov  */
16309756af4SAlexei Starovoitov enum bpf_func_id {
16409756af4SAlexei Starovoitov 	BPF_FUNC_unspec,
165d0003ec0SAlexei Starovoitov 	BPF_FUNC_map_lookup_elem, /* void *map_lookup_elem(&map, &key) */
166d0003ec0SAlexei Starovoitov 	BPF_FUNC_map_update_elem, /* int map_update_elem(&map, &key, &value, flags) */
167d0003ec0SAlexei Starovoitov 	BPF_FUNC_map_delete_elem, /* int map_delete_elem(&map, &key) */
16809756af4SAlexei Starovoitov 	__BPF_FUNC_MAX_ID,
16909756af4SAlexei Starovoitov };
17009756af4SAlexei Starovoitov 
171daedfb22SAlexei Starovoitov #endif /* _UAPI__LINUX_BPF_H__ */
172