New upstream version 18.02
[deb_dpdk.git] / drivers / net / tap / tap_bpf.h
1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2  * Copyright 2017 Mellanox Technologies, Ltd.
3  */
4
5 #ifndef __TAP_BPF_H__
6 #define __TAP_BPF_H__
7
8 #include <tap_autoconf.h>
9
10 /* Do not #include <linux/bpf.h> since eBPF must compile on different
11  * distros which may include partial definitions for eBPF (while the
12  * kernel itself may support eBPF). Instead define here all that is needed
13  */
14
15 /* BPF_MAP_UPDATE_ELEM command flags */
16 #define BPF_ANY 0 /* create a new element or update an existing */
17
18 /* BPF architecture instruction struct */
19 struct bpf_insn {
20         __u8    code;
21         __u8    dst_reg:4;
22         __u8    src_reg:4;
23         __s16   off;
24         __s32   imm; /* immediate value */
25 };
26
27 /* BPF program types */
28 enum bpf_prog_type {
29         BPF_PROG_TYPE_UNSPEC,
30         BPF_PROG_TYPE_SOCKET_FILTER,
31         BPF_PROG_TYPE_KPROBE,
32         BPF_PROG_TYPE_SCHED_CLS,
33         BPF_PROG_TYPE_SCHED_ACT,
34 };
35
36 /* BPF commands types */
37 enum bpf_cmd {
38         BPF_MAP_CREATE,
39         BPF_MAP_LOOKUP_ELEM,
40         BPF_MAP_UPDATE_ELEM,
41         BPF_MAP_DELETE_ELEM,
42         BPF_MAP_GET_NEXT_KEY,
43         BPF_PROG_LOAD,
44 };
45
46 /* BPF maps types */
47 enum bpf_map_type {
48         BPF_MAP_TYPE_UNSPEC,
49         BPF_MAP_TYPE_HASH,
50 };
51
52 /* union of anonymous structs used with TAP BPF commands */
53 union bpf_attr {
54         /* BPF_MAP_CREATE command */
55         struct {
56                 __u32   map_type;
57                 __u32   key_size;
58                 __u32   value_size;
59                 __u32   max_entries;
60                 __u32   map_flags;
61                 __u32   inner_map_fd;
62         };
63
64         /* BPF_MAP_UPDATE_ELEM, BPF_MAP_DELETE_ELEM commands */
65         struct {
66                 __u32           map_fd;
67                 __aligned_u64   key;
68                 union {
69                         __aligned_u64 value;
70                         __aligned_u64 next_key;
71                 };
72                 __u64           flags;
73         };
74
75         /* BPF_PROG_LOAD command */
76         struct {
77                 __u32           prog_type;
78                 __u32           insn_cnt;
79                 __aligned_u64   insns;
80                 __aligned_u64   license;
81                 __u32           log_level;
82                 __u32           log_size;
83                 __aligned_u64   log_buf;
84                 __u32           kern_version;
85                 __u32           prog_flags;
86         };
87 } __attribute__((aligned(8)));
88
89 #ifndef __NR_bpf
90 # if defined(__i386__)
91 #  define __NR_bpf 357
92 # elif defined(__x86_64__)
93 #  define __NR_bpf 321
94 # elif defined(__arm__)
95 #  define __NR_bpf 386
96 # elif defined(__aarch64__)
97 #  define __NR_bpf 280
98 # elif defined(__sparc__)
99 #  define __NR_bpf 349
100 # elif defined(__s390__)
101 #  define __NR_bpf 351
102 # elif defined(__powerpc__)
103 #  define __NR_bpf 361
104 # else
105 #  error __NR_bpf not defined
106 # endif
107 #endif
108
109 enum {
110         BPF_MAP_ID_KEY,
111         BPF_MAP_ID_SIMPLE,
112 };
113
114 static int bpf_load(enum bpf_prog_type type, const struct bpf_insn *insns,
115                 size_t insns_cnt, const char *license);
116
117 #endif /* __TAP_BPF_H__ */