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