ip: add classifier-based ACLs support on ip punt
[vpp.git] / src / vnet / classify / classify.api
1 /*
2  * Copyright (c) 2015-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 option version = "3.1.0";
17
18 import "vnet/interface_types.api";
19
20 /** \brief Add/Delete classification table request
21     @param client_index - opaque cookie to identify the sender
22     @param context - sender context, to match reply w/ request
23     @param is_add- if non-zero add the table, else delete it
24     @param del_chain - if non-zero delete the whole chain of tables
25     @param table_index - if add, returns index of the created table, else specifies the table to delete
26     @param nbuckets - number of buckets when adding a table
27     @param memory_size - memory size when adding a table
28     @param match_n_vectors - number of match vectors
29     @param next_table_index - index of next table
30     @param miss_next_index - index of miss table
31     @param current_data_flag - option to use current node's packet payload
32             as the starting point from where packets are classified,
33             This option is only valid for L2/L3 input ACL for now.
34             0: by default, classify data from the buffer's start location
35             1: classify packets from VPP node’s current data pointer
36     @param current_data_offset - a signed value to shift the start location of
37             the packet to be classified
38             For example, if input IP ACL node is used, L2 header’s first byte
39             can be accessible by configuring current_data_offset to -14
40             if there is no vlan tag.
41             This is valid only if current_data_flag is set to 1.
42     @param mask_len - length of match mask, should be equal to match_n_vectors * sizeof (u32x4)
43     @param mask - match mask
44 */
45 define classify_add_del_table
46 {
47   u32 client_index;
48   u32 context;
49   bool is_add;
50   bool del_chain;
51   u32 table_index [default=0xffffffff];
52   u32 nbuckets [default=2];
53   u32 memory_size [default=2097152];
54   u32 skip_n_vectors [default=0];
55   u32 match_n_vectors [default=1];
56   u32 next_table_index [default=0xffffffff];
57   u32 miss_next_index [default=0xffffffff];
58   u8 current_data_flag [default=0];
59   i16 current_data_offset [default=0];
60   u32 mask_len;
61   u8 mask[mask_len];
62 };
63
64 /** \brief Add/Delete classification table response
65     @param context - sender context, to match reply w/ request
66     @param retval - return code for the table add/del request
67     @param new_table_index - for add, returned index of the new table
68     @param skip_n_vectors - for add, returned value of skip_n_vectors in table
69     @param match_n_vectors -for add, returned value of match_n_vectors in table
70 */
71 define classify_add_del_table_reply
72 {
73   u32 context;
74   i32 retval;
75   u32 new_table_index;
76   u32 skip_n_vectors;
77   u32 match_n_vectors;
78 };
79
80 enum classify_action : u8
81 {
82   CLASSIFY_API_ACTION_NONE = 0,
83   CLASSIFY_API_ACTION_SET_IP4_FIB_INDEX = 1,
84   CLASSIFY_API_ACTION_SET_IP6_FIB_INDEX = 2,
85   CLASSIFY_API_ACTION_SET_METADATA = 3,
86 };
87
88 /** \brief Classify add / del session request
89     @param client_index - opaque cookie to identify the sender
90     @param context - sender context, to match reply w/ request
91     @param is_add - add session if non-zero, else delete
92     @param table_index - index of the table to add/del the session, required
93     @param hit_next_index - for add, hit_next_index of new session, required
94     @param opaque_index - for add, opaque_index of new session
95     @param advance -for add, advance value for session
96     @param action -
97            0: no action (by default)
98               metadata is not used.
99            1: Classified IP packets will be looked up from the
100               specified ipv4 fib table (configured by metadata as VRF id).
101               Only valid for L3 input ACL node
102            2: Classified IP packets will be looked up from the
103               specified ipv6 fib table (configured by metadata as VRF id).
104               Only valid for L3 input ACL node
105            3: Classified packet will be steered to source routing policy
106               of given index (in metadata).
107               This is only valid for IPv6 packets redirected to a source
108               routing node.
109     @param metadata - valid only if action != 0
110            VRF id if action is 1 or 2.
111            sr policy index if action is 3.
112     @param match_len - length of match, should be equal to skip_n_vectors plus match_n_vectors
113                        of target table times sizeof (u32x4)
114     @param match - for add, match value for session, required,
115                    needs to include bytes in front
116                    with length of skip_n_vectors of target table times sizeof (u32x4)
117                    (values of those bytes will be ignored)
118 */
119 autoreply define classify_add_del_session
120 {
121   u32 client_index;
122   u32 context;
123   bool is_add;
124   u32 table_index;
125   u32 hit_next_index [default=0xffffffff];
126   u32 opaque_index [default=0xffffffff];
127   i32 advance [default=0];
128   vl_api_classify_action_t action [default=0];
129   u32 metadata [default=0];
130   u32 match_len;
131   u8 match[match_len];
132 };
133
134 /** \brief Set/unset policer classify interface
135     @param client_index - opaque cookie to identify the sender
136     @param context - sender context, to match reply w/ request
137     @param sw_if_index - interface to set/unset policer classify
138     @param ip4_table_index - ip4 classify table index (~0 for skip)
139     @param ip6_table_index - ip6 classify table index (~0 for skip)
140     @param l2_table_index  -  l2 classify table index (~0 for skip)
141     @param is_add - Set if non-zero, else unset
142     Note: User is recommended to use just one valid table_index per call.
143           (ip4_table_index, ip6_table_index, or l2_table_index)
144 */
145 autoreply define policer_classify_set_interface
146 {
147   u32 client_index;
148   u32 context;
149   vl_api_interface_index_t sw_if_index;
150   u32 ip4_table_index;
151   u32 ip6_table_index;
152   u32 l2_table_index;
153   bool is_add;
154 };
155
156 enum policer_classify_table : u8
157 {
158   POLICER_CLASSIFY_API_TABLE_IP4,
159   POLICER_CLASSIFY_API_TABLE_IP6,
160   POLICER_CLASSIFY_API_TABLE_L2,
161 };
162
163
164 /** \brief Get list of policer classify interfaces and tables
165     @param client_index - opaque cookie to identify the sender
166     @param context - sender context, to match reply w/ request
167     @param type - classify table type
168     @param sw_if_index - filter on sw_if_index
169 */
170 define policer_classify_dump
171 {
172   u32 client_index;
173   u32 context;
174   vl_api_policer_classify_table_t type;
175   vl_api_interface_index_t sw_if_index;
176 };
177
178 /** \brief Policer classify operational state response.
179     @param context - sender context, to match reply w/ request
180     @param sw_if_index - software interface index
181     @param table_index - classify table index
182 */
183 define policer_classify_details
184 {
185   u32 context;
186   vl_api_interface_index_t sw_if_index;
187   u32 table_index;
188 };
189
190 /** \brief Classify get table IDs request
191     @param client_index - opaque cookie to identify the sender
192     @param context - sender context, to match reply w/ request
193 */
194 define classify_table_ids
195 {
196   u32 client_index;
197   u32 context;
198 };
199
200 /** \brief Reply for classify get table IDs request
201     @param context - sender context which was passed in the request
202     @param count - number of ids returned in response
203     @param ids - array of classify table ids
204 */
205 define classify_table_ids_reply
206 {
207   u32 context;
208   i32 retval;
209   u32 count;
210   u32 ids[count];
211 };
212
213 /** \brief Classify table ids by interface index request
214     @param client_index - opaque cookie to identify the sender
215     @param context - sender context, to match reply w/ request
216     @param sw_if_index - index of the interface
217 */
218 define classify_table_by_interface
219 {
220   u32 client_index;
221   u32 context;
222   vl_api_interface_index_t sw_if_index;
223 };
224
225 /** \brief Reply for classify table id by interface index request
226     @param context - sender context which was passed in the request
227     @param count - number of ids returned in response
228     @param sw_if_index - index of the interface
229     @param l2_table_id - l2 classify table index
230     @param ip4_table_id - ip4 classify table index
231     @param ip6_table_id - ip6 classify table index
232 */
233 define classify_table_by_interface_reply
234 {
235   u32 context;
236   i32 retval;
237   vl_api_interface_index_t sw_if_index;
238   u32 l2_table_id;
239   u32 ip4_table_id;
240   u32 ip6_table_id;
241 };
242
243 /** \brief Classify table info
244     @param client_index - opaque cookie to identify the sender
245     @param context - sender context, to match reply w/ request
246     @param table_id - classify table index
247 */
248 define classify_table_info
249 {
250   u32 client_index;
251   u32 context;
252   u32 table_id;
253 };
254
255 /** \brief Reply for classify table info request
256     @param context - sender context which was passed in the request
257     @param count - number of ids returned in response
258     @param table_id - classify table index
259     @param nbuckets - number of buckets when adding a table
260     @param match_n_vectors - number of match vectors
261     @param skip_n_vectors - number of skip_n_vectors
262     @param active_sessions - number of sessions (active entries)
263     @param next_table_index - index of next table
264     @param miss_next_index - index of miss table
265     @param mask[] - match mask
266 */
267 define classify_table_info_reply
268 {
269   u32 context;
270   i32 retval;
271   u32 table_id;
272   u32 nbuckets;
273   u32 match_n_vectors;
274   u32 skip_n_vectors;
275   u32 active_sessions;
276   u32 next_table_index;
277   u32 miss_next_index;
278   u32 mask_length;
279   u8 mask[mask_length];
280 };
281
282 /** \brief Classify sessions dump request
283     @param client_index - opaque cookie to identify the sender
284     @param context - sender context, to match reply w/ request
285     @param table_id - classify table index
286 */
287 define classify_session_dump
288 {
289   u32 client_index;
290   u32 context;
291   u32 table_id;
292 };
293
294 /** \brief Reply for classify table session dump request
295     @param context - sender context which was passed in the request
296     @param count - number of ids returned in response
297     @param table_id - classify table index
298     @param hit_next_index - hit_next_index of session
299     @param opaque_index - for add, opaque_index of session
300     @param advance - advance value of session
301     @param match[] - match value for session
302 */
303 define classify_session_details
304 {
305   u32 context;
306   i32 retval;
307   u32 table_id;
308   u32 hit_next_index;
309   i32 advance;
310   u32 opaque_index;
311   u32 match_length;
312   u8 match[match_length];
313 };
314
315 /** \brief Set/unset flow classify interface
316     @param client_index - opaque cookie to identify the sender
317     @param context - sender context, to match reply w/ request
318     @param sw_if_index - interface to set/unset flow classify
319     @param ip4_table_index - ip4 classify table index (~0 for skip)
320     @param ip6_table_index - ip6 classify table index (~0 for skip)
321     @param l2_table_index  -  l2 classify table index (~0 for skip)
322     @param is_add - Set if non-zero, else unset
323     Note: User is recommended to use just one valid table_index per call.
324           (ip4_table_index, ip6_table_index, or l2_table_index)
325 */
326 autoreply define flow_classify_set_interface {
327     u32 client_index;
328     u32 context;
329     vl_api_interface_index_t sw_if_index;
330     u32 ip4_table_index;
331     u32 ip6_table_index;
332     bool is_add;
333 };
334
335 enum flow_classify_table : u8
336 {
337   FLOW_CLASSIFY_API_TABLE_IP4,
338   FLOW_CLASSIFY_API_TABLE_IP6,
339 };
340
341 /** \brief Get list of flow classify interfaces and tables
342     @param client_index - opaque cookie to identify the sender
343     @param context - sender context, to match reply w/ request
344     @param type - flow classify table type
345     @param sw_if_index - filter on sw_if_index
346 */
347 define flow_classify_dump {
348     u32 client_index;
349     u32 context;
350     vl_api_flow_classify_table_t type;
351     vl_api_interface_index_t sw_if_index;
352 };
353
354 /** \brief Flow classify operational state response.
355     @param context - sender context, to match reply w/ request
356     @param sw_if_index - software interface index
357     @param table_index - classify table index
358 */
359 define flow_classify_details {
360     u32 context;
361     vl_api_interface_index_t sw_if_index;
362     u32 table_index;
363 };
364
365 /** \brief Set/unset the classification table for an interface request
366     @param client_index - opaque cookie to identify the sender
367     @param context - sender context, to match reply w/ request
368     @param is_ipv6 - ipv6 if non-zero, else ipv4
369     @param sw_if_index - interface to associate with the table
370     @param table_index - index of the table, if ~0 unset the table
371 */
372 autoreply define classify_set_interface_ip_table
373 {
374   u32 client_index;
375   u32 context;
376   bool is_ipv6;
377   vl_api_interface_index_t sw_if_index;
378   u32 table_index;              /* ~0 => off */
379 };
380
381 /** \brief Set/unset l2 classification tables for an interface request
382     @param client_index - opaque cookie to identify the sender
383     @param context - sender context, to match reply w/ request
384     @param sw_if_index - interface to set/unset tables for
385     @param ip4_table_index - ip4 index, use ~0 for all 3 indexes to unset
386     @param ip6_table_index - ip6 index
387     @param other_table_index - other index
388 */
389 autoreply define classify_set_interface_l2_tables
390 {
391   u32 client_index;
392   u32 context;
393   vl_api_interface_index_t sw_if_index;
394   /* 3 x ~0 => off */
395   u32 ip4_table_index;
396   u32 ip6_table_index;
397   u32 other_table_index;
398   bool is_input;
399 };
400
401 /** \brief Set/unset input ACL interface
402     @param client_index - opaque cookie to identify the sender
403     @param context - sender context, to match reply w/ request
404     @param sw_if_index - interface to set/unset input ACL
405     @param ip4_table_index - ip4 classify table index (~0 for skip)
406     @param ip6_table_index - ip6 classify table index (~0 for skip)
407     @param l2_table_index  -  l2 classify table index (~0 for skip)
408     @param is_add - Set input ACL if non-zero, else unset
409     Note: User is recommended to use just one valid table_index per call.
410           (ip4_table_index, ip6_table_index, or l2_table_index)
411 */
412 autoreply define input_acl_set_interface
413 {
414   u32 client_index;
415   u32 context;
416   vl_api_interface_index_t sw_if_index;
417   u32 ip4_table_index;
418   u32 ip6_table_index;
419   u32 l2_table_index;
420   bool is_add;
421 };
422
423 /** \brief Add/del punt ACL
424     @param client_index - opaque cookie to identify the sender
425     @param context - sender context, to match reply w/ request
426     @param ip4_table_index - ip4 punt classify table index (~0 for skip)
427     @param ip6_table_index - ip6 punt classify table index (~0 for skip)
428     @param is_add - add punt ACL if non-zero, else delete
429 */
430 autoreply define punt_acl_add_del
431 {
432   u32 client_index;
433   u32 context;
434   u32 ip4_table_index [default=0xffffffff];
435   u32 ip6_table_index [default=0xffffffff];
436   bool is_add [default=true];
437 };
438
439 /** \brief Set/unset output ACL interface
440     @param client_index - opaque cookie to identify the sender
441     @param context - sender context, to match reply w/ request
442     @param sw_if_index - interface to set/unset output ACL
443     @param ip4_table_index - ip4 classify table index (~0 for skip)
444     @param ip6_table_index - ip6 classify table index (~0 for skip)
445     @param l2_table_index  -  l2 classify table index (~0 for skip)
446     @param is_add - Set output ACL if non-zero, else unset
447     Note: User is recommended to use just one valid table_index per call.
448           (ip4_table_index, ip6_table_index, or l2_table_index)
449 */
450 autoreply define output_acl_set_interface
451 {
452   u32 client_index;
453   u32 context;
454   vl_api_interface_index_t sw_if_index;
455   u32 ip4_table_index;
456   u32 ip6_table_index;
457   u32 l2_table_index;
458   bool is_add;
459 };
460
461
462
463 /** \brief Find a compatible Classify table in a PCAP chain
464     @param client_index - opaque cookie to identify the sender
465     @param context - sender context, to match reply w/ request
466     @param sw_if_index - interface whose chain will be searched, 0==system-wide
467     @param skip_n_vectors - number of u32x4 skip vectors
468     @param match_n_vectors - number of u32x4 vectors, 1..5
469     @param mask_len - length of mask, match_n_vectors * sizeof(u32x4)
470     @param mask - match mask
471 */
472 define classify_pcap_lookup_table
473 {
474   u32 client_index;
475   u32 context;
476   vl_api_interface_index_t sw_if_index [default=0xffffffff];
477   u32 skip_n_vectors [default=0];
478   u32 match_n_vectors [default=1];
479   u32 mask_len;
480   u8 mask[mask_len];
481 };
482
483 /** \brief Classify pcap table lookup response
484     @param context - sender context, to match reply w/ request
485     @param retval - return code for the table lookup request
486     @param table_index - returned index of the found table, or ~0
487  */
488 define classify_pcap_lookup_table_reply
489 {
490   u32 context;
491   i32 retval;
492   u32 table_index;
493 };
494
495 /** \brief Add a Classify table into a PCAP chain on an interface
496     @param client_index - opaque cookie to identify the sender
497     @param context - sender context, to match reply w/ request
498     @param sw_if_index - interface whose chain will be searched, 0==system-wide
499     @param table_index - Classify table to be added
500     @param sort_masks - 1=sort masks into most-to-least specific order
501  */
502 define classify_pcap_set_table
503 {
504   u32 client_index;
505   u32 context;
506   vl_api_interface_index_t sw_if_index;
507   u32 table_index [default=0xffffffff];
508   bool sort_masks [default=0];
509 };
510
511 /** \brief Classify pcap table lookup response
512     @param context - sender context which was passed in the request
513     @param retval - return code for the table lookup request
514     @param table_index - returned index of the sorted table chain
515  */
516 define classify_pcap_set_table_reply
517 {
518   u32 context;
519   i32 retval;
520   u32 table_index;
521 };
522
523 /** \brief Classify get the PCAP table indices for an interface
524     @param client_index - opaque cookie to identify the sender
525     @param context - sender context, to match reply w/ request
526  */
527 define classify_pcap_get_tables
528 {
529   u32 client_index;
530   u32 context;
531   vl_api_interface_index_t sw_if_index;
532 };
533
534 /** \brief Classify get a PCAP tables response
535     @param context - sender context which was passed in the request
536     @param retval - return code for the request
537     @param count - number of ids returned in response
538     @param indices - array of classify table indices
539  */
540 define classify_pcap_get_tables_reply
541 {
542   u32 context;
543   i32 retval;
544   u32 count;
545   u32 indices[count];
546 };
547
548
549
550 /** \brief Find a mask-compatible Classify table in the Trace chain
551     @param client_index - opaque cookie to identify the sender
552     @param context - sender context, to match reply w/ request
553     @param skip_n_vectors - number of u32x4 skip vectors
554     @param match_n_vectors - number of u32x4 vectors, 1..5
555     @param mask_len - length of mask, match_n_vectors * sizeof(u32x4)
556     @param mask - match mask
557 */
558 define classify_trace_lookup_table
559 {
560   u32 client_index;
561   u32 context;
562   u32 skip_n_vectors [default=0];
563   u32 match_n_vectors [default=1];
564   u32 mask_len;
565   u8 mask[mask_len];
566 };
567
568 /** \brief Classify trace table lookup response
569     @param context - sender context which was passed in the request
570     @param retval - return code for the table lookup request
571     @param table_index - returned index of the found table, or ~0
572  */
573 define classify_trace_lookup_table_reply
574 {
575   u32 context;
576   i32 retval;
577   u32 table_index;
578 };
579
580 /** \brief Add a Classify table into the Trace chain
581     @param client_index - opaque cookie to identify the sender
582     @param context - sender context, to match reply w/ request
583     @param table_index - Classify table to be added
584     @param sort_masks - 1=sort masks into most-to-least specific order
585  */
586 define classify_trace_set_table
587 {
588   u32 client_index;
589   u32 context;
590   u32 table_index [default=0xffffffff];
591   bool sort_masks [default=0];
592 };
593
594 /** \brief Classify Trace table lookup response
595     @param context - sender context which was passed in the request
596     @param retval - return code for the table lookup request
597     @param table_index - returned index of the sorted table chain
598  */
599 define classify_trace_set_table_reply
600 {
601   u32 context;
602   i32 retval;
603   u32 table_index;
604 };
605
606 /** \brief Classify get the Trace table indices
607     @param client_index - opaque cookie to identify the sender
608     @param context - sender context, to match reply w/ request
609  */
610 define classify_trace_get_tables
611 {
612   u32 client_index;
613   u32 context;
614 };
615
616 /** \brief Classify get the Trace tables response
617     @param context - sender context which was passed in the request
618     @param retval - return code for the request
619     @param count - number of ids returned in response
620     @param indices - array of classify table indices
621  */
622 define classify_trace_get_tables_reply
623 {
624   u32 context;
625   i32 retval;
626   u32 count;
627   u32 indices[count];
628 };
629
630 /*
631  * Local Variables:
632  * eval: (c-set-style "gnu")
633  * End:
634  */