flow: add generic flow pattern for 5G flow enhancement
[vpp.git] / src / vnet / flow / flow.h
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef included_vnet_flow_flow_h
17 #define included_vnet_flow_flow_h
18
19 #include <vppinfra/clib.h>
20 #include <vppinfra/pcap.h>
21 #include <vnet/vnet.h>
22 #include <vnet/l3_types.h>
23 #include <vnet/ip/ip4_packet.h>
24 #include <vnet/ip/ip6_packet.h>
25 #include <vnet/ethernet/packet.h>
26
27 #define foreach_flow_type                                                     \
28   /* l2 flow*/                                                                \
29   _ (ETHERNET, ethernet, "ethernet")                                          \
30   /* l3 IP flow */                                                            \
31   _ (IP4, ip4, "ipv4")                                                        \
32   _ (IP6, ip6, "ipv6")                                                        \
33   /* IP tunnel flow */                                                        \
34   _ (IP4_L2TPV3OIP, ip4_l2tpv3oip, "ipv4-l2tpv3oip")                          \
35   _ (IP4_IPSEC_ESP, ip4_ipsec_esp, "ipv4-ipsec-esp")                          \
36   _ (IP4_IPSEC_AH, ip4_ipsec_ah, "ipv4-ipsec-ah")                             \
37   /* l4 flow*/                                                                \
38   _ (IP4_N_TUPLE, ip4_n_tuple, "ipv4-n-tuple")                                \
39   _ (IP6_N_TUPLE, ip6_n_tuple, "ipv6-n-tuple")                                \
40   _ (IP4_N_TUPLE_TAGGED, ip4_n_tuple_tagged, "ipv4-n-tuple-tagged")           \
41   _ (IP6_N_TUPLE_TAGGED, ip6_n_tuple_tagged, "ipv6-n-tuple-tagged")           \
42   /* L4 tunnel flow*/                                                         \
43   _ (IP4_VXLAN, ip4_vxlan, "ipv4-vxlan")                                      \
44   _ (IP6_VXLAN, ip6_vxlan, "ipv6-vxlan")                                      \
45   _ (IP4_GTPC, ip4_gtpc, "ipv4-gtpc")                                         \
46   _ (IP4_GTPU, ip4_gtpu, "ipv4-gtpu")                                         \
47   /* generic flow */                                                          \
48   _ (GENERIC, generic, "generic")
49
50 #define foreach_flow_entry_ethernet \
51   _fe(ethernet_header_t, eth_hdr)
52
53 #define foreach_flow_entry_ip4 \
54   _fe(ip4_address_and_mask_t, src_addr) \
55   _fe(ip4_address_and_mask_t, dst_addr) \
56   _fe(ip_prot_and_mask_t, protocol)
57
58 #define foreach_flow_entry_ip6 \
59   _fe(ip6_address_and_mask_t, src_addr) \
60   _fe(ip6_address_and_mask_t, dst_addr) \
61   _fe(ip_prot_and_mask_t, protocol)
62
63 #define foreach_flow_entry_ip4_l2tpv3oip \
64   foreach_flow_entry_ip4 \
65   _fe(u32, session_id)
66
67 #define foreach_flow_entry_ip4_ipsec_esp \
68   foreach_flow_entry_ip4 \
69   _fe(u32, spi)
70
71 #define foreach_flow_entry_ip4_ipsec_ah \
72   foreach_flow_entry_ip4 \
73   _fe(u32, spi)
74
75 #define foreach_flow_entry_ip4_n_tuple \
76   foreach_flow_entry_ip4 \
77   _fe(ip_port_and_mask_t, src_port) \
78   _fe(ip_port_and_mask_t, dst_port)
79
80 #define foreach_flow_entry_ip6_n_tuple \
81   foreach_flow_entry_ip6 \
82   _fe(ip_port_and_mask_t, src_port) \
83   _fe(ip_port_and_mask_t, dst_port)
84
85 #define foreach_flow_entry_ip4_n_tuple_tagged \
86   foreach_flow_entry_ip4 \
87   _fe(ip_port_and_mask_t, src_port) \
88   _fe(ip_port_and_mask_t, dst_port)
89
90 #define foreach_flow_entry_ip6_n_tuple_tagged \
91   foreach_flow_entry_ip6 \
92   _fe(ip_port_and_mask_t, src_port) \
93   _fe(ip_port_and_mask_t, dst_port)
94
95 #define foreach_flow_entry_ip4_vxlan                                          \
96   foreach_flow_entry_ip4_n_tuple _fe (u32, vni)
97
98 #define foreach_flow_entry_ip6_vxlan                                          \
99   foreach_flow_entry_ip6_n_tuple _fe (u32, vni)
100
101 #define foreach_flow_entry_ip4_gtpc \
102   foreach_flow_entry_ip4_n_tuple \
103   _fe(u32, teid)
104
105 #define foreach_flow_entry_ip4_gtpu \
106   foreach_flow_entry_ip4_n_tuple \
107   _fe(u32, teid)
108
109 #define foreach_flow_entry_generic _fe (generic_pattern_t, pattern)
110
111 #define foreach_flow_action \
112   _(0, COUNT, "count") \
113   _(1, MARK, "mark") \
114   _(2, BUFFER_ADVANCE, "buffer-advance") \
115   _(3, REDIRECT_TO_NODE, "redirect-to-node") \
116   _(4, REDIRECT_TO_QUEUE, "redirect-to-queue") \
117   _(5, RSS, "rss") \
118   _(6, DROP, "drop")
119
120 typedef enum
121 {
122 #define _(v,n,s)  VNET_FLOW_ACTION_##n = (1 << v),
123   foreach_flow_action
124 #undef _
125 } vnet_flow_action_t;
126
127 #define foreach_flow_error \
128   _( -1, NOT_SUPPORTED, "not supported")                        \
129   _( -2, ALREADY_DONE, "already done")                          \
130   _( -3, ALREADY_EXISTS, "already exists")                      \
131   _( -4, NO_SUCH_ENTRY, "no such entry")                        \
132   _( -5, NO_SUCH_INTERFACE, "no such interface")                \
133   _( -6, INTERNAL, "internal error")
134
135 #define foreach_flow_rss_types                                                \
136   _ (0, FRAG_IPV4, "ipv4-frag")                                               \
137   _ (1, IPV4_TCP, "ipv4-tcp")                                                 \
138   _ (2, IPV4_UDP, "ipv4-udp")                                                 \
139   _ (3, IPV4_SCTP, "ipv4-sctp")                                               \
140   _ (4, IPV4_OTHER, "ipv4-other")                                             \
141   _ (5, IPV4, "ipv4")                                                         \
142   _ (6, IPV6_TCP_EX, "ipv6-tcp-ex")                                           \
143   _ (7, IPV6_UDP_EX, "ipv6-udp-ex")                                           \
144   _ (8, FRAG_IPV6, "ipv6-frag")                                               \
145   _ (9, IPV6_TCP, "ipv6-tcp")                                                 \
146   _ (10, IPV6_UDP, "ipv6-udp")                                                \
147   _ (11, IPV6_SCTP, "ipv6-sctp")                                              \
148   _ (12, IPV6_OTHER, "ipv6-other")                                            \
149   _ (13, IPV6_EX, "ipv6-ex")                                                  \
150   _ (14, IPV6, "ipv6")                                                        \
151   _ (15, L2_PAYLOAD, "l2-payload")                                            \
152   _ (16, PORT, "port")                                                        \
153   _ (17, VXLAN, "vxlan")                                                      \
154   _ (18, GENEVE, "geneve")                                                    \
155   _ (19, NVGRE, "nvgre")                                                      \
156   _ (20, GTPU, "gtpu")                                                        \
157   _ (21, ESP, "esp")                                                          \
158   _ (60, L4_DST_ONLY, "l4-dst-only")                                          \
159   _ (61, L4_SRC_ONLY, "l4-src-only")                                          \
160   _ (62, L3_DST_ONLY, "l3-dst-only")                                          \
161   _ (63, L3_SRC_ONLY, "l3-src-only")
162
163 typedef enum
164 {
165 #define _(v, n, s) VNET_FLOW_RSS_TYPES_##n = v,
166   foreach_flow_rss_types
167 #undef _
168 } vnet_flow_rss_types_t;
169
170 #define foreach_rss_function           \
171   _(DEFAULT, "default")                \
172   _(TOEPLITZ, "toeplitz")              \
173   _(SIMPLE_XOR, "simple_xor")          \
174   _(SYMMETRIC_TOEPLITZ, "symmetric_toeplitz")
175
176 typedef enum
177 {
178   VNET_FLOW_NO_ERROR = 0,
179 #define _(v,n,s)  VNET_FLOW_ERROR_##n = v,
180   foreach_flow_error
181 #undef _
182 } vnet_flow_error_t;
183
184 typedef struct
185 {
186   u16 port, mask;
187 } ip_port_and_mask_t;
188
189 typedef struct
190 {
191   ip_protocol_t prot;
192   /* ip protocol mask should be either 0 or 0xFF */
193   /* other values are meanless */
194   u8 mask;
195 } ip_prot_and_mask_t;
196
197 typedef struct
198 {
199   u8 spec[1024];
200   u8 mask[1024];
201 } generic_pattern_t;
202
203 typedef enum
204 {
205   VNET_FLOW_TYPE_UNKNOWN,
206 #define _(a,b,c) VNET_FLOW_TYPE_##a,
207   foreach_flow_type
208 #undef _
209     VNET_FLOW_N_TYPES,
210 } vnet_flow_type_t;
211
212 typedef enum
213 {
214 #define _(a,b) VNET_RSS_FUNC_##a,
215   foreach_rss_function
216 #undef _
217     VNET_RSS_N_TYPES,
218 } vnet_rss_function_t;
219
220 /*
221  * Create typedef struct vnet_flow_XXX_t
222  */
223 #define _fe(a, b) a b;
224 #define _(a,b,c) \
225 typedef struct { \
226 int foo; \
227 foreach_flow_entry_##b \
228 } vnet_flow_##b##_t;
229 foreach_flow_type;
230 #undef _
231 #undef _fe
232
233 /* main flow struct */
234 typedef struct
235 {
236   /* flow type */
237   vnet_flow_type_t type;
238
239   /* flow index */
240   u32 index;
241
242   /* bitmap of flow actions (VNET_FLOW_ACTION_*) */
243   u32 actions;
244
245   /* flow id for VNET_FLOW_ACTION_MARK */
246   u32 mark_flow_id;
247
248   /* node index and next index for VNET_FLOW_ACTION_REDIRECT_TO_NODE */
249   u32 redirect_node_index;
250   u32 redirect_device_input_next_index;
251
252   /* queue for VNET_FLOW_ACTION_REDIRECT_TO_QUEUE */
253   u32 redirect_queue;
254
255   /* buffer offset for VNET_FLOW_ACTION_BUFFER_ADVANCE */
256   i32 buffer_advance;
257
258   /* RSS types, including IPv4/IPv6/TCP/UDP... */
259   u64 rss_types;
260
261   /* RSS functions, including IPv4/IPv6/TCP/UDP... */
262   vnet_rss_function_t rss_fun;
263
264   union
265   {
266 #define _(a,b,c) vnet_flow_##b##_t b;
267     foreach_flow_type
268 #undef _
269   };
270
271   /* per-interface private data */
272   uword *private_data;
273 } vnet_flow_t;
274
275 int vnet_flow_get_range (vnet_main_t * vnm, char *owner, u32 count,
276                          u32 * start);
277 int vnet_flow_add (vnet_main_t * vnm, vnet_flow_t * flow, u32 * flow_index);
278 int vnet_flow_enable (vnet_main_t * vnm, u32 flow_index, u32 hw_if_index);
279 int vnet_flow_disable (vnet_main_t * vnm, u32 flow_index, u32 hw_if_index);
280 int vnet_flow_del (vnet_main_t * vnm, u32 flow_index);
281 vnet_flow_t *vnet_get_flow (u32 flow_index);
282
283 typedef struct
284 {
285   u32 start;
286   u32 count;
287   u8 *owner;
288 } vnet_flow_range_t;
289
290 typedef struct
291 {
292   /* pool of device flow entries */
293   vnet_flow_t *global_flow_pool;
294
295   /* flow ids allocated */
296   u32 flows_used;
297
298   /* vector of flow ranges */
299   vnet_flow_range_t *ranges;
300
301   u16 msg_id_base;
302 } vnet_flow_main_t;
303
304 extern vnet_flow_main_t flow_main;
305
306 format_function_t format_flow_actions;
307 format_function_t format_flow_enabled_hw;
308
309 #endif /* included_vnet_flow_flow_h */
310
311 /*
312  * fd.io coding-style-patch-verification: ON
313  *
314  * Local Variables:
315  * eval: (c-set-style "gnu")
316  * End:
317  */