session: remove ipv6 lookup threading assert
[vpp.git] / src / plugins / af_xdp / af_xdp.h
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2018 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17
18 #ifndef _AF_XDP_H_
19 #define _AF_XDP_H_
20
21 #include <vlib/log.h>
22 #include <vnet/interface.h>
23 #include <xdp/xsk.h>
24
25 #define AF_XDP_NUM_RX_QUEUES_ALL        ((u16)-1)
26
27 #define af_xdp_log(lvl, dev, f, ...) \
28   vlib_log(lvl, af_xdp_main.log_class, "%v: " f, (dev)->name, ##__VA_ARGS__)
29
30 #define foreach_af_xdp_device_flags                                           \
31   _ (0, INITIALIZED, "initialized")                                           \
32   _ (1, ERROR, "error")                                                       \
33   _ (2, ADMIN_UP, "admin-up")                                                 \
34   _ (3, LINK_UP, "link-up")                                                   \
35   _ (4, ZEROCOPY, "zero-copy")                                                \
36   _ (5, SYSCALL_LOCK, "syscall-lock")
37
38 enum
39 {
40 #define _(a, b, c) AF_XDP_DEVICE_F_##b = (1 << a),
41   foreach_af_xdp_device_flags
42 #undef _
43 };
44
45 #define af_xdp_device_error(dev, fmt, ...) \
46   if (!(dev)->error) \
47     { \
48       clib_error_t *err_ = clib_error_return_unix (0, fmt, ## __VA_ARGS__); \
49       if (!clib_atomic_bool_cmp_and_swap (&(dev)->error, 0, err_)) \
50         clib_error_free(err_); \
51     }
52
53 typedef enum
54 {
55   AF_XDP_RXQ_MODE_UNKNOWN,
56   AF_XDP_RXQ_MODE_POLLING,
57   AF_XDP_RXQ_MODE_INTERRUPT,
58 } __clib_packed af_xdp_rxq_mode_t;
59
60 typedef struct
61 {
62   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
63
64   /* fields below are accessed in data-plane (hot) */
65
66   clib_spinlock_t syscall_lock;
67   struct xsk_ring_cons rx;
68   struct xsk_ring_prod fq;
69   int xsk_fd;
70
71   /* fields below are accessed in control-plane only (cold) */
72
73   uword file_index;
74   u32 queue_index;
75   af_xdp_rxq_mode_t mode;
76 } af_xdp_rxq_t;
77
78 typedef struct
79 {
80   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
81
82   /* fields below are accessed in data-plane (hot) */
83
84   clib_spinlock_t lock;
85   clib_spinlock_t syscall_lock;
86   struct xsk_ring_prod tx;
87   struct xsk_ring_cons cq;
88   int xsk_fd;
89
90   /* fields below are accessed in control-plane only (cold) */
91
92   u32 queue_index;
93 } af_xdp_txq_t;
94
95 typedef struct
96 {
97   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
98
99   /* fields below are accessed in data-plane (hot) */
100
101   af_xdp_rxq_t *rxqs;
102   af_xdp_txq_t *txqs;
103   vlib_buffer_t *buffer_template;
104   u32 per_interface_next_index;
105   u32 sw_if_index;
106   u32 hw_if_index;
107   u32 flags;
108   u8 pool;                      /* buffer pool index */
109   u8 txq_num;
110
111   /* fields below are accessed in control-plane only (cold) */
112
113   char *name;
114   char *linux_ifname;
115   u32 dev_instance;
116   u8 hwaddr[6];
117
118   u8 rxq_num;
119
120   char *netns;
121
122   struct xsk_umem **umem;
123   struct xsk_socket **xsk;
124
125   struct bpf_object *bpf_obj;
126   unsigned linux_ifindex;
127
128   /* error */
129   clib_error_t *error;
130 } af_xdp_device_t;
131
132 typedef struct
133 {
134   af_xdp_device_t *devices;
135   vlib_log_class_t log_class;
136   u16 msg_id_base;
137 } af_xdp_main_t;
138
139 extern af_xdp_main_t af_xdp_main;
140
141 typedef enum
142 {
143   AF_XDP_MODE_AUTO = 0,
144   AF_XDP_MODE_COPY = 1,
145   AF_XDP_MODE_ZERO_COPY = 2,
146 } af_xdp_mode_t;
147
148 typedef enum
149 {
150   AF_XDP_CREATE_FLAGS_NO_SYSCALL_LOCK = 1,
151 } af_xdp_create_flag_t;
152
153 typedef struct
154 {
155   char *linux_ifname;
156   char *name;
157   char *prog;
158   char *netns;
159   af_xdp_mode_t mode;
160   af_xdp_create_flag_t flags;
161   u32 rxq_size;
162   u32 txq_size;
163   u32 rxq_num;
164
165   /* return */
166   int rv;
167   u32 sw_if_index;
168   clib_error_t *error;
169 } af_xdp_create_if_args_t;
170
171 void af_xdp_create_if (vlib_main_t * vm, af_xdp_create_if_args_t * args);
172 void af_xdp_delete_if (vlib_main_t * vm, af_xdp_device_t * ad);
173
174 void af_xdp_device_input_refill (af_xdp_device_t *ad);
175
176 extern vlib_node_registration_t af_xdp_input_node;
177 extern vnet_device_class_t af_xdp_device_class;
178
179 /* format.c */
180 format_function_t format_af_xdp_device;
181 format_function_t format_af_xdp_device_name;
182 format_function_t format_af_xdp_input_trace;
183
184 /* unformat.c */
185 unformat_function_t unformat_af_xdp_create_if_args;
186
187 typedef struct
188 {
189   u32 next_index;
190   u32 hw_if_index;
191 } af_xdp_input_trace_t;
192
193 #define foreach_af_xdp_tx_func_error                                          \
194   _ (NO_FREE_SLOTS, "no free tx slots")                                       \
195   _ (SYSCALL_REQUIRED, "syscall required")                                    \
196   _ (SYSCALL_FAILURES, "syscall failures")
197
198 typedef enum
199 {
200 #define _(f,s) AF_XDP_TX_ERROR_##f,
201   foreach_af_xdp_tx_func_error
202 #undef _
203     AF_XDP_TX_N_ERROR,
204 } af_xdp_tx_func_error_t;
205
206 #endif /* _AF_XDP_H_ */
207
208 /*
209  * fd.io coding-style-patch-verification: ON
210  *
211  * Local Variables:
212  * eval: (c-set-style "gnu")
213  * End:
214  */