| Alexei Starovoitov | daedfb2 | 2014-09-04 22:17:18 -0700 | [diff] [blame] | 1 | /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com | 
 | 2 |  * | 
 | 3 |  * This program is free software; you can redistribute it and/or | 
 | 4 |  * modify it under the terms of version 2 of the GNU General Public | 
 | 5 |  * License as published by the Free Software Foundation. | 
 | 6 |  */ | 
 | 7 | #ifndef _UAPI__LINUX_BPF_H__ | 
 | 8 | #define _UAPI__LINUX_BPF_H__ | 
 | 9 |  | 
 | 10 | #include <linux/types.h> | 
| Alexei Starovoitov | c15952d | 2014-10-14 02:08:54 -0700 | [diff] [blame] | 11 | #include <linux/bpf_common.h> | 
| Alexei Starovoitov | daedfb2 | 2014-09-04 22:17:18 -0700 | [diff] [blame] | 12 |  | 
 | 13 | /* Extended instruction set based on top of classic BPF */ | 
 | 14 |  | 
 | 15 | /* instruction classes */ | 
 | 16 | #define BPF_ALU64	0x07	/* alu mode in double word width */ | 
 | 17 |  | 
 | 18 | /* ld/ldx fields */ | 
 | 19 | #define BPF_DW		0x18	/* double word */ | 
 | 20 | #define BPF_XADD	0xc0	/* exclusive add */ | 
 | 21 |  | 
 | 22 | /* alu/jmp fields */ | 
 | 23 | #define BPF_MOV		0xb0	/* mov reg to reg */ | 
 | 24 | #define BPF_ARSH	0xc0	/* sign extending arithmetic shift right */ | 
 | 25 |  | 
 | 26 | /* change endianness of a register */ | 
 | 27 | #define BPF_END		0xd0	/* flags for endianness conversion: */ | 
 | 28 | #define BPF_TO_LE	0x00	/* convert to little-endian */ | 
 | 29 | #define BPF_TO_BE	0x08	/* convert to big-endian */ | 
 | 30 | #define BPF_FROM_LE	BPF_TO_LE | 
 | 31 | #define BPF_FROM_BE	BPF_TO_BE | 
 | 32 |  | 
 | 33 | #define BPF_JNE		0x50	/* jump != */ | 
 | 34 | #define BPF_JSGT	0x60	/* SGT is signed '>', GT in x86 */ | 
 | 35 | #define BPF_JSGE	0x70	/* SGE is signed '>=', GE in x86 */ | 
 | 36 | #define BPF_CALL	0x80	/* function call */ | 
 | 37 | #define BPF_EXIT	0x90	/* function return */ | 
 | 38 |  | 
 | 39 | /* Register numbers */ | 
 | 40 | enum { | 
 | 41 | 	BPF_REG_0 = 0, | 
 | 42 | 	BPF_REG_1, | 
 | 43 | 	BPF_REG_2, | 
 | 44 | 	BPF_REG_3, | 
 | 45 | 	BPF_REG_4, | 
 | 46 | 	BPF_REG_5, | 
 | 47 | 	BPF_REG_6, | 
 | 48 | 	BPF_REG_7, | 
 | 49 | 	BPF_REG_8, | 
 | 50 | 	BPF_REG_9, | 
 | 51 | 	BPF_REG_10, | 
 | 52 | 	__MAX_BPF_REG, | 
 | 53 | }; | 
 | 54 |  | 
 | 55 | /* BPF has 10 general purpose 64-bit registers and stack frame. */ | 
 | 56 | #define MAX_BPF_REG	__MAX_BPF_REG | 
 | 57 |  | 
 | 58 | struct bpf_insn { | 
 | 59 | 	__u8	code;		/* opcode */ | 
 | 60 | 	__u8	dst_reg:4;	/* dest register */ | 
 | 61 | 	__u8	src_reg:4;	/* source register */ | 
 | 62 | 	__s16	off;		/* signed offset */ | 
 | 63 | 	__s32	imm;		/* signed immediate constant */ | 
 | 64 | }; | 
 | 65 |  | 
| Daniel Borkmann | b219775 | 2015-10-29 14:58:09 +0100 | [diff] [blame] | 66 | /* BPF syscall commands, see bpf(2) man-page for details. */ | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 67 | enum bpf_cmd { | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 68 | 	BPF_MAP_CREATE, | 
| Alexei Starovoitov | db20fd2 | 2014-09-26 00:16:59 -0700 | [diff] [blame] | 69 | 	BPF_MAP_LOOKUP_ELEM, | 
| Alexei Starovoitov | db20fd2 | 2014-09-26 00:16:59 -0700 | [diff] [blame] | 70 | 	BPF_MAP_UPDATE_ELEM, | 
| Alexei Starovoitov | db20fd2 | 2014-09-26 00:16:59 -0700 | [diff] [blame] | 71 | 	BPF_MAP_DELETE_ELEM, | 
| Alexei Starovoitov | db20fd2 | 2014-09-26 00:16:59 -0700 | [diff] [blame] | 72 | 	BPF_MAP_GET_NEXT_KEY, | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 73 | 	BPF_PROG_LOAD, | 
| Daniel Borkmann | b219775 | 2015-10-29 14:58:09 +0100 | [diff] [blame] | 74 | 	BPF_OBJ_PIN, | 
 | 75 | 	BPF_OBJ_GET, | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 76 | }; | 
 | 77 |  | 
 | 78 | enum bpf_map_type { | 
 | 79 | 	BPF_MAP_TYPE_UNSPEC, | 
| Alexei Starovoitov | 0f8e4bd | 2014-11-13 17:36:45 -0800 | [diff] [blame] | 80 | 	BPF_MAP_TYPE_HASH, | 
| Alexei Starovoitov | 28fbcfa | 2014-11-13 17:36:46 -0800 | [diff] [blame] | 81 | 	BPF_MAP_TYPE_ARRAY, | 
| Alexei Starovoitov | 04fd61a | 2015-05-19 16:59:03 -0700 | [diff] [blame] | 82 | 	BPF_MAP_TYPE_PROG_ARRAY, | 
| Kaixu Xia | ea317b2 | 2015-08-06 07:02:34 +0000 | [diff] [blame] | 83 | 	BPF_MAP_TYPE_PERF_EVENT_ARRAY, | 
| Alexei Starovoitov | 824bd0c | 2016-02-01 22:39:53 -0800 | [diff] [blame] | 84 | 	BPF_MAP_TYPE_PERCPU_HASH, | 
| Alexei Starovoitov | a10423b | 2016-02-01 22:39:54 -0800 | [diff] [blame] | 85 | 	BPF_MAP_TYPE_PERCPU_ARRAY, | 
| Alexei Starovoitov | d5a3b1f | 2016-02-17 19:58:58 -0800 | [diff] [blame] | 86 | 	BPF_MAP_TYPE_STACK_TRACE, | 
| Martin KaFai Lau | 4ed8ec5 | 2016-06-30 10:28:43 -0700 | [diff] [blame] | 87 | 	BPF_MAP_TYPE_CGROUP_ARRAY, | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 88 | }; | 
 | 89 |  | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 90 | enum bpf_prog_type { | 
 | 91 | 	BPF_PROG_TYPE_UNSPEC, | 
| Alexei Starovoitov | ddd872b | 2014-12-01 15:06:34 -0800 | [diff] [blame] | 92 | 	BPF_PROG_TYPE_SOCKET_FILTER, | 
| Alexei Starovoitov | 2541517 | 2015-03-25 12:49:20 -0700 | [diff] [blame] | 93 | 	BPF_PROG_TYPE_KPROBE, | 
| Daniel Borkmann | 96be432 | 2015-03-01 12:31:46 +0100 | [diff] [blame] | 94 | 	BPF_PROG_TYPE_SCHED_CLS, | 
| Daniel Borkmann | 94caee8 | 2015-03-20 15:11:11 +0100 | [diff] [blame] | 95 | 	BPF_PROG_TYPE_SCHED_ACT, | 
| Alexei Starovoitov | 98b5c2c | 2016-04-06 18:43:25 -0700 | [diff] [blame] | 96 | 	BPF_PROG_TYPE_TRACEPOINT, | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 97 | }; | 
 | 98 |  | 
| Daniel Borkmann | f1a66f8 | 2015-03-01 12:31:43 +0100 | [diff] [blame] | 99 | #define BPF_PSEUDO_MAP_FD	1 | 
 | 100 |  | 
| Alexei Starovoitov | 3274f52 | 2014-11-13 17:36:44 -0800 | [diff] [blame] | 101 | /* flags for BPF_MAP_UPDATE_ELEM command */ | 
 | 102 | #define BPF_ANY		0 /* create new element or update existing */ | 
 | 103 | #define BPF_NOEXIST	1 /* create new element if it didn't exist */ | 
 | 104 | #define BPF_EXIST	2 /* update existing element */ | 
 | 105 |  | 
| Alexei Starovoitov | 6c90598 | 2016-03-07 21:57:15 -0800 | [diff] [blame] | 106 | #define BPF_F_NO_PREALLOC	(1U << 0) | 
 | 107 |  | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 108 | union bpf_attr { | 
 | 109 | 	struct { /* anonymous struct used by BPF_MAP_CREATE command */ | 
 | 110 | 		__u32	map_type;	/* one of enum bpf_map_type */ | 
 | 111 | 		__u32	key_size;	/* size of key in bytes */ | 
 | 112 | 		__u32	value_size;	/* size of value in bytes */ | 
 | 113 | 		__u32	max_entries;	/* max number of entries in a map */ | 
| Alexei Starovoitov | 6c90598 | 2016-03-07 21:57:15 -0800 | [diff] [blame] | 114 | 		__u32	map_flags;	/* prealloc or not */ | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 115 | 	}; | 
| Alexei Starovoitov | db20fd2 | 2014-09-26 00:16:59 -0700 | [diff] [blame] | 116 |  | 
 | 117 | 	struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ | 
 | 118 | 		__u32		map_fd; | 
 | 119 | 		__aligned_u64	key; | 
 | 120 | 		union { | 
 | 121 | 			__aligned_u64 value; | 
 | 122 | 			__aligned_u64 next_key; | 
 | 123 | 		}; | 
| Alexei Starovoitov | 3274f52 | 2014-11-13 17:36:44 -0800 | [diff] [blame] | 124 | 		__u64		flags; | 
| Alexei Starovoitov | db20fd2 | 2014-09-26 00:16:59 -0700 | [diff] [blame] | 125 | 	}; | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 126 |  | 
 | 127 | 	struct { /* anonymous struct used by BPF_PROG_LOAD command */ | 
 | 128 | 		__u32		prog_type;	/* one of enum bpf_prog_type */ | 
 | 129 | 		__u32		insn_cnt; | 
 | 130 | 		__aligned_u64	insns; | 
 | 131 | 		__aligned_u64	license; | 
| Alexei Starovoitov | cbd3570 | 2014-09-26 00:17:03 -0700 | [diff] [blame] | 132 | 		__u32		log_level;	/* verbosity level of verifier */ | 
 | 133 | 		__u32		log_size;	/* size of user buffer */ | 
 | 134 | 		__aligned_u64	log_buf;	/* user supplied buffer */ | 
| Alexei Starovoitov | 2541517 | 2015-03-25 12:49:20 -0700 | [diff] [blame] | 135 | 		__u32		kern_version;	/* checked when prog_type=kprobe */ | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 136 | 	}; | 
| Daniel Borkmann | b219775 | 2015-10-29 14:58:09 +0100 | [diff] [blame] | 137 |  | 
 | 138 | 	struct { /* anonymous struct used by BPF_OBJ_* commands */ | 
 | 139 | 		__aligned_u64	pathname; | 
 | 140 | 		__u32		bpf_fd; | 
 | 141 | 	}; | 
| Alexei Starovoitov | 99c55f7 | 2014-09-26 00:16:57 -0700 | [diff] [blame] | 142 | } __attribute__((aligned(8))); | 
 | 143 |  | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 144 | /* integer value in 'imm' field of BPF_CALL instruction selects which helper | 
 | 145 |  * function eBPF program intends to call | 
 | 146 |  */ | 
 | 147 | enum bpf_func_id { | 
 | 148 | 	BPF_FUNC_unspec, | 
| Alexei Starovoitov | d0003ec | 2014-11-13 17:36:49 -0800 | [diff] [blame] | 149 | 	BPF_FUNC_map_lookup_elem, /* void *map_lookup_elem(&map, &key) */ | 
 | 150 | 	BPF_FUNC_map_update_elem, /* int map_update_elem(&map, &key, &value, flags) */ | 
 | 151 | 	BPF_FUNC_map_delete_elem, /* int map_delete_elem(&map, &key) */ | 
| Alexei Starovoitov | 2541517 | 2015-03-25 12:49:20 -0700 | [diff] [blame] | 152 | 	BPF_FUNC_probe_read,      /* int bpf_probe_read(void *dst, int size, void *src) */ | 
| Alexei Starovoitov | d9847d3 | 2015-03-25 12:49:21 -0700 | [diff] [blame] | 153 | 	BPF_FUNC_ktime_get_ns,    /* u64 bpf_ktime_get_ns(void) */ | 
| Alexei Starovoitov | 9c959c8 | 2015-03-25 12:49:22 -0700 | [diff] [blame] | 154 | 	BPF_FUNC_trace_printk,    /* int bpf_trace_printk(const char *fmt, int fmt_size, ...) */ | 
| Daniel Borkmann | 03e69b5 | 2015-03-14 02:27:16 +0100 | [diff] [blame] | 155 | 	BPF_FUNC_get_prandom_u32, /* u32 prandom_u32(void) */ | 
| Daniel Borkmann | c04167c | 2015-03-14 02:27:17 +0100 | [diff] [blame] | 156 | 	BPF_FUNC_get_smp_processor_id, /* u32 raw_smp_processor_id(void) */ | 
| Alexei Starovoitov | 91bc4822 | 2015-04-01 17:12:13 -0700 | [diff] [blame] | 157 |  | 
 | 158 | 	/** | 
 | 159 | 	 * skb_store_bytes(skb, offset, from, len, flags) - store bytes into packet | 
 | 160 | 	 * @skb: pointer to skb | 
| Alexei Starovoitov | a166151 | 2015-04-15 12:55:45 -0700 | [diff] [blame] | 161 | 	 * @offset: offset within packet from skb->mac_header | 
| Alexei Starovoitov | 91bc4822 | 2015-04-01 17:12:13 -0700 | [diff] [blame] | 162 | 	 * @from: pointer where to copy bytes from | 
 | 163 | 	 * @len: number of bytes to store into packet | 
 | 164 | 	 * @flags: bit 0 - if true, recompute skb->csum | 
 | 165 | 	 *         other bits - reserved | 
 | 166 | 	 * Return: 0 on success | 
 | 167 | 	 */ | 
 | 168 | 	BPF_FUNC_skb_store_bytes, | 
 | 169 |  | 
 | 170 | 	/** | 
 | 171 | 	 * l3_csum_replace(skb, offset, from, to, flags) - recompute IP checksum | 
 | 172 | 	 * @skb: pointer to skb | 
 | 173 | 	 * @offset: offset within packet where IP checksum is located | 
 | 174 | 	 * @from: old value of header field | 
 | 175 | 	 * @to: new value of header field | 
 | 176 | 	 * @flags: bits 0-3 - size of header field | 
 | 177 | 	 *         other bits - reserved | 
 | 178 | 	 * Return: 0 on success | 
 | 179 | 	 */ | 
 | 180 | 	BPF_FUNC_l3_csum_replace, | 
 | 181 |  | 
 | 182 | 	/** | 
 | 183 | 	 * l4_csum_replace(skb, offset, from, to, flags) - recompute TCP/UDP checksum | 
 | 184 | 	 * @skb: pointer to skb | 
 | 185 | 	 * @offset: offset within packet where TCP/UDP checksum is located | 
 | 186 | 	 * @from: old value of header field | 
 | 187 | 	 * @to: new value of header field | 
 | 188 | 	 * @flags: bits 0-3 - size of header field | 
 | 189 | 	 *         bit 4 - is pseudo header | 
 | 190 | 	 *         other bits - reserved | 
 | 191 | 	 * Return: 0 on success | 
 | 192 | 	 */ | 
 | 193 | 	BPF_FUNC_l4_csum_replace, | 
| Alexei Starovoitov | 04fd61a | 2015-05-19 16:59:03 -0700 | [diff] [blame] | 194 |  | 
 | 195 | 	/** | 
 | 196 | 	 * bpf_tail_call(ctx, prog_array_map, index) - jump into another BPF program | 
 | 197 | 	 * @ctx: context pointer passed to next program | 
 | 198 | 	 * @prog_array_map: pointer to map which type is BPF_MAP_TYPE_PROG_ARRAY | 
 | 199 | 	 * @index: index inside array that selects specific program to run | 
 | 200 | 	 * Return: 0 on success | 
 | 201 | 	 */ | 
 | 202 | 	BPF_FUNC_tail_call, | 
| Alexei Starovoitov | 3896d65 | 2015-06-02 16:03:14 -0700 | [diff] [blame] | 203 |  | 
 | 204 | 	/** | 
 | 205 | 	 * bpf_clone_redirect(skb, ifindex, flags) - redirect to another netdev | 
 | 206 | 	 * @skb: pointer to skb | 
 | 207 | 	 * @ifindex: ifindex of the net device | 
 | 208 | 	 * @flags: bit 0 - if set, redirect to ingress instead of egress | 
 | 209 | 	 *         other bits - reserved | 
 | 210 | 	 * Return: 0 on success | 
 | 211 | 	 */ | 
 | 212 | 	BPF_FUNC_clone_redirect, | 
| Alexei Starovoitov | ffeedaf | 2015-06-12 19:39:12 -0700 | [diff] [blame] | 213 |  | 
 | 214 | 	/** | 
 | 215 | 	 * u64 bpf_get_current_pid_tgid(void) | 
 | 216 | 	 * Return: current->tgid << 32 | current->pid | 
 | 217 | 	 */ | 
 | 218 | 	BPF_FUNC_get_current_pid_tgid, | 
 | 219 |  | 
 | 220 | 	/** | 
 | 221 | 	 * u64 bpf_get_current_uid_gid(void) | 
 | 222 | 	 * Return: current_gid << 32 | current_uid | 
 | 223 | 	 */ | 
 | 224 | 	BPF_FUNC_get_current_uid_gid, | 
 | 225 |  | 
 | 226 | 	/** | 
 | 227 | 	 * bpf_get_current_comm(char *buf, int size_of_buf) | 
 | 228 | 	 * stores current->comm into buf | 
 | 229 | 	 * Return: 0 on success | 
 | 230 | 	 */ | 
 | 231 | 	BPF_FUNC_get_current_comm, | 
| Daniel Borkmann | 8d20aab | 2015-07-15 14:21:42 +0200 | [diff] [blame] | 232 |  | 
 | 233 | 	/** | 
 | 234 | 	 * bpf_get_cgroup_classid(skb) - retrieve a proc's classid | 
 | 235 | 	 * @skb: pointer to skb | 
 | 236 | 	 * Return: classid if != 0 | 
 | 237 | 	 */ | 
 | 238 | 	BPF_FUNC_get_cgroup_classid, | 
| Alexei Starovoitov | 4e10df9 | 2015-07-20 20:34:18 -0700 | [diff] [blame] | 239 | 	BPF_FUNC_skb_vlan_push, /* bpf_skb_vlan_push(skb, vlan_proto, vlan_tci) */ | 
 | 240 | 	BPF_FUNC_skb_vlan_pop,  /* bpf_skb_vlan_pop(skb) */ | 
| Alexei Starovoitov | d3aa45c | 2015-07-30 15:36:57 -0700 | [diff] [blame] | 241 |  | 
 | 242 | 	/** | 
 | 243 | 	 * bpf_skb_[gs]et_tunnel_key(skb, key, size, flags) | 
 | 244 | 	 * retrieve or populate tunnel metadata | 
 | 245 | 	 * @skb: pointer to skb | 
 | 246 | 	 * @key: pointer to 'struct bpf_tunnel_key' | 
 | 247 | 	 * @size: size of 'struct bpf_tunnel_key' | 
 | 248 | 	 * @flags: room for future extensions | 
 | 249 | 	 * Retrun: 0 on success | 
 | 250 | 	 */ | 
 | 251 | 	BPF_FUNC_skb_get_tunnel_key, | 
 | 252 | 	BPF_FUNC_skb_set_tunnel_key, | 
| Kaixu Xia | 35578d7 | 2015-08-06 07:02:35 +0000 | [diff] [blame] | 253 | 	BPF_FUNC_perf_event_read,	/* u64 bpf_perf_event_read(&map, index) */ | 
| Alexei Starovoitov | 27b29f6 | 2015-09-15 23:05:43 -0700 | [diff] [blame] | 254 | 	/** | 
 | 255 | 	 * bpf_redirect(ifindex, flags) - redirect to another netdev | 
 | 256 | 	 * @ifindex: ifindex of the net device | 
 | 257 | 	 * @flags: bit 0 - if set, redirect to ingress instead of egress | 
 | 258 | 	 *         other bits - reserved | 
 | 259 | 	 * Return: TC_ACT_REDIRECT | 
 | 260 | 	 */ | 
 | 261 | 	BPF_FUNC_redirect, | 
| Daniel Borkmann | c46646d | 2015-09-30 01:41:51 +0200 | [diff] [blame] | 262 |  | 
 | 263 | 	/** | 
 | 264 | 	 * bpf_get_route_realm(skb) - retrieve a dst's tclassid | 
 | 265 | 	 * @skb: pointer to skb | 
 | 266 | 	 * Return: realm if != 0 | 
 | 267 | 	 */ | 
 | 268 | 	BPF_FUNC_get_route_realm, | 
| Alexei Starovoitov | a43eec3 | 2015-10-20 20:02:34 -0700 | [diff] [blame] | 269 |  | 
 | 270 | 	/** | 
 | 271 | 	 * bpf_perf_event_output(ctx, map, index, data, size) - output perf raw sample | 
 | 272 | 	 * @ctx: struct pt_regs* | 
 | 273 | 	 * @map: pointer to perf_event_array map | 
 | 274 | 	 * @index: index of event in the map | 
 | 275 | 	 * @data: data on stack to be output as raw data | 
 | 276 | 	 * @size: size of data | 
 | 277 | 	 * Return: 0 on success | 
 | 278 | 	 */ | 
 | 279 | 	BPF_FUNC_perf_event_output, | 
| Daniel Borkmann | 05c74e5 | 2015-12-17 23:51:53 +0100 | [diff] [blame] | 280 | 	BPF_FUNC_skb_load_bytes, | 
| Alexei Starovoitov | d5a3b1f | 2016-02-17 19:58:58 -0800 | [diff] [blame] | 281 |  | 
 | 282 | 	/** | 
 | 283 | 	 * bpf_get_stackid(ctx, map, flags) - walk user or kernel stack and return id | 
 | 284 | 	 * @ctx: struct pt_regs* | 
 | 285 | 	 * @map: pointer to stack_trace map | 
 | 286 | 	 * @flags: bits 0-7 - numer of stack frames to skip | 
 | 287 | 	 *         bit 8 - collect user stack instead of kernel | 
 | 288 | 	 *         bit 9 - compare stacks by hash only | 
 | 289 | 	 *         bit 10 - if two different stacks hash into the same stackid | 
 | 290 | 	 *                  discard old | 
 | 291 | 	 *         other bits - reserved | 
 | 292 | 	 * Return: >= 0 stackid on success or negative error | 
 | 293 | 	 */ | 
 | 294 | 	BPF_FUNC_get_stackid, | 
| Daniel Borkmann | 7d67234 | 2016-02-19 23:05:23 +0100 | [diff] [blame] | 295 |  | 
 | 296 | 	/** | 
 | 297 | 	 * bpf_csum_diff(from, from_size, to, to_size, seed) - calculate csum diff | 
 | 298 | 	 * @from: raw from buffer | 
 | 299 | 	 * @from_size: length of from buffer | 
 | 300 | 	 * @to: raw to buffer | 
 | 301 | 	 * @to_size: length of to buffer | 
 | 302 | 	 * @seed: optional seed | 
 | 303 | 	 * Return: csum result | 
 | 304 | 	 */ | 
 | 305 | 	BPF_FUNC_csum_diff, | 
| Daniel Borkmann | 14ca075 | 2016-03-04 15:15:06 +0100 | [diff] [blame] | 306 |  | 
 | 307 | 	/** | 
 | 308 | 	 * bpf_skb_[gs]et_tunnel_opt(skb, opt, size) | 
 | 309 | 	 * retrieve or populate tunnel options metadata | 
 | 310 | 	 * @skb: pointer to skb | 
 | 311 | 	 * @opt: pointer to raw tunnel option data | 
 | 312 | 	 * @size: size of @opt | 
 | 313 | 	 * Return: 0 on success for set, option size for get | 
 | 314 | 	 */ | 
 | 315 | 	BPF_FUNC_skb_get_tunnel_opt, | 
 | 316 | 	BPF_FUNC_skb_set_tunnel_opt, | 
| Daniel Borkmann | 6578171 | 2016-06-28 12:18:27 +0200 | [diff] [blame] | 317 |  | 
 | 318 | 	/** | 
 | 319 | 	 * bpf_skb_change_proto(skb, proto, flags) | 
 | 320 | 	 * Change protocol of the skb. Currently supported is | 
 | 321 | 	 * v4 -> v6, v6 -> v4 transitions. The helper will also | 
 | 322 | 	 * resize the skb. eBPF program is expected to fill the | 
 | 323 | 	 * new headers via skb_store_bytes and lX_csum_replace. | 
 | 324 | 	 * @skb: pointer to skb | 
 | 325 | 	 * @proto: new skb->protocol type | 
 | 326 | 	 * @flags: reserved | 
 | 327 | 	 * Return: 0 on success or negative error | 
 | 328 | 	 */ | 
 | 329 | 	BPF_FUNC_skb_change_proto, | 
 | 330 |  | 
| Daniel Borkmann | d2485c4 | 2016-06-28 12:18:28 +0200 | [diff] [blame] | 331 | 	/** | 
 | 332 | 	 * bpf_skb_change_type(skb, type) | 
 | 333 | 	 * Change packet type of skb. | 
 | 334 | 	 * @skb: pointer to skb | 
 | 335 | 	 * @type: new skb->pkt_type type | 
 | 336 | 	 * Return: 0 on success or negative error | 
 | 337 | 	 */ | 
 | 338 | 	BPF_FUNC_skb_change_type, | 
 | 339 |  | 
| Martin KaFai Lau | 4a482f3 | 2016-06-30 10:28:44 -0700 | [diff] [blame] | 340 | 	/** | 
 | 341 | 	 * bpf_skb_in_cgroup(skb, map, index) - Check cgroup2 membership of skb | 
 | 342 | 	 * @skb: pointer to skb | 
 | 343 | 	 * @map: pointer to bpf_map in BPF_MAP_TYPE_CGROUP_ARRAY type | 
 | 344 | 	 * @index: index of the cgroup in the bpf_map | 
 | 345 | 	 * Return: | 
 | 346 | 	 *   == 0 skb failed the cgroup2 descendant test | 
 | 347 | 	 *   == 1 skb succeeded the cgroup2 descendant test | 
 | 348 | 	 *    < 0 error | 
 | 349 | 	 */ | 
 | 350 | 	BPF_FUNC_skb_in_cgroup, | 
| Daniel Borkmann | 13c5c24 | 2016-07-03 01:28:47 +0200 | [diff] [blame^] | 351 |  | 
 | 352 | 	/** | 
 | 353 | 	 * bpf_get_hash_recalc(skb) | 
 | 354 | 	 * Retrieve and possibly recalculate skb->hash. | 
 | 355 | 	 * @skb: pointer to skb | 
 | 356 | 	 * Return: hash | 
 | 357 | 	 */ | 
 | 358 | 	BPF_FUNC_get_hash_recalc, | 
 | 359 |  | 
| Alexei Starovoitov | 09756af | 2014-09-26 00:17:00 -0700 | [diff] [blame] | 360 | 	__BPF_FUNC_MAX_ID, | 
 | 361 | }; | 
 | 362 |  | 
| Daniel Borkmann | 781c53b | 2016-01-11 01:16:38 +0100 | [diff] [blame] | 363 | /* All flags used by eBPF helper functions, placed here. */ | 
 | 364 |  | 
 | 365 | /* BPF_FUNC_skb_store_bytes flags. */ | 
 | 366 | #define BPF_F_RECOMPUTE_CSUM		(1ULL << 0) | 
| Daniel Borkmann | 8afd54c | 2016-03-04 15:15:03 +0100 | [diff] [blame] | 367 | #define BPF_F_INVALIDATE_HASH		(1ULL << 1) | 
| Daniel Borkmann | 781c53b | 2016-01-11 01:16:38 +0100 | [diff] [blame] | 368 |  | 
 | 369 | /* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. | 
 | 370 |  * First 4 bits are for passing the header field size. | 
 | 371 |  */ | 
 | 372 | #define BPF_F_HDR_FIELD_MASK		0xfULL | 
 | 373 |  | 
 | 374 | /* BPF_FUNC_l4_csum_replace flags. */ | 
 | 375 | #define BPF_F_PSEUDO_HDR		(1ULL << 4) | 
| Daniel Borkmann | 2f72959 | 2016-02-19 23:05:26 +0100 | [diff] [blame] | 376 | #define BPF_F_MARK_MANGLED_0		(1ULL << 5) | 
| Daniel Borkmann | 781c53b | 2016-01-11 01:16:38 +0100 | [diff] [blame] | 377 |  | 
 | 378 | /* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ | 
 | 379 | #define BPF_F_INGRESS			(1ULL << 0) | 
 | 380 |  | 
| Daniel Borkmann | c6c3345 | 2016-01-11 01:16:39 +0100 | [diff] [blame] | 381 | /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ | 
 | 382 | #define BPF_F_TUNINFO_IPV6		(1ULL << 0) | 
 | 383 |  | 
| Alexei Starovoitov | d5a3b1f | 2016-02-17 19:58:58 -0800 | [diff] [blame] | 384 | /* BPF_FUNC_get_stackid flags. */ | 
 | 385 | #define BPF_F_SKIP_FIELD_MASK		0xffULL | 
 | 386 | #define BPF_F_USER_STACK		(1ULL << 8) | 
 | 387 | #define BPF_F_FAST_STACK_CMP		(1ULL << 9) | 
 | 388 | #define BPF_F_REUSE_STACKID		(1ULL << 10) | 
 | 389 |  | 
| Daniel Borkmann | 2da897e | 2016-02-23 02:05:26 +0100 | [diff] [blame] | 390 | /* BPF_FUNC_skb_set_tunnel_key flags. */ | 
 | 391 | #define BPF_F_ZERO_CSUM_TX		(1ULL << 1) | 
| Daniel Borkmann | 2208087 | 2016-03-04 15:15:05 +0100 | [diff] [blame] | 392 | #define BPF_F_DONT_FRAGMENT		(1ULL << 2) | 
| Daniel Borkmann | 2da897e | 2016-02-23 02:05:26 +0100 | [diff] [blame] | 393 |  | 
| Daniel Borkmann | 6816a7f | 2016-06-28 12:18:25 +0200 | [diff] [blame] | 394 | /* BPF_FUNC_perf_event_output and BPF_FUNC_perf_event_read flags. */ | 
| Daniel Borkmann | 1e33759 | 2016-04-18 21:01:23 +0200 | [diff] [blame] | 395 | #define BPF_F_INDEX_MASK		0xffffffffULL | 
 | 396 | #define BPF_F_CURRENT_CPU		BPF_F_INDEX_MASK | 
 | 397 |  | 
| Alexei Starovoitov | 9bac3d6 | 2015-03-13 11:57:42 -0700 | [diff] [blame] | 398 | /* user accessible mirror of in-kernel sk_buff. | 
 | 399 |  * new fields can only be added to the end of this structure | 
 | 400 |  */ | 
 | 401 | struct __sk_buff { | 
 | 402 | 	__u32 len; | 
 | 403 | 	__u32 pkt_type; | 
 | 404 | 	__u32 mark; | 
 | 405 | 	__u32 queue_mapping; | 
| Alexei Starovoitov | c249739 | 2015-03-16 18:06:02 -0700 | [diff] [blame] | 406 | 	__u32 protocol; | 
 | 407 | 	__u32 vlan_present; | 
 | 408 | 	__u32 vlan_tci; | 
| Michal Sekletar | 27cd545 | 2015-03-24 14:48:41 +0100 | [diff] [blame] | 409 | 	__u32 vlan_proto; | 
| Daniel Borkmann | bcad571 | 2015-04-03 20:52:24 +0200 | [diff] [blame] | 410 | 	__u32 priority; | 
| Alexei Starovoitov | 37e82c2 | 2015-05-27 15:30:39 -0700 | [diff] [blame] | 411 | 	__u32 ingress_ifindex; | 
 | 412 | 	__u32 ifindex; | 
| Alexei Starovoitov | d691f9e | 2015-06-04 10:11:54 -0700 | [diff] [blame] | 413 | 	__u32 tc_index; | 
 | 414 | 	__u32 cb[5]; | 
| Daniel Borkmann | ba7591d | 2015-08-01 00:46:29 +0200 | [diff] [blame] | 415 | 	__u32 hash; | 
| Daniel Borkmann | 045efa8 | 2015-09-15 23:05:42 -0700 | [diff] [blame] | 416 | 	__u32 tc_classid; | 
| Alexei Starovoitov | 969bf05 | 2016-05-05 19:49:10 -0700 | [diff] [blame] | 417 | 	__u32 data; | 
 | 418 | 	__u32 data_end; | 
| Alexei Starovoitov | 9bac3d6 | 2015-03-13 11:57:42 -0700 | [diff] [blame] | 419 | }; | 
 | 420 |  | 
| Alexei Starovoitov | d3aa45c | 2015-07-30 15:36:57 -0700 | [diff] [blame] | 421 | struct bpf_tunnel_key { | 
 | 422 | 	__u32 tunnel_id; | 
| Daniel Borkmann | c6c3345 | 2016-01-11 01:16:39 +0100 | [diff] [blame] | 423 | 	union { | 
 | 424 | 		__u32 remote_ipv4; | 
 | 425 | 		__u32 remote_ipv6[4]; | 
 | 426 | 	}; | 
 | 427 | 	__u8 tunnel_tos; | 
 | 428 | 	__u8 tunnel_ttl; | 
| Daniel Borkmann | c0e760c | 2016-03-30 00:02:00 +0200 | [diff] [blame] | 429 | 	__u16 tunnel_ext; | 
| Daniel Borkmann | 4018ab1 | 2016-03-09 03:00:05 +0100 | [diff] [blame] | 430 | 	__u32 tunnel_label; | 
| Alexei Starovoitov | d3aa45c | 2015-07-30 15:36:57 -0700 | [diff] [blame] | 431 | }; | 
 | 432 |  | 
| Alexei Starovoitov | daedfb2 | 2014-09-04 22:17:18 -0700 | [diff] [blame] | 433 | #endif /* _UAPI__LINUX_BPF_H__ */ |