ip: Router ID included in flow hash
[vpp.git] / src / vnet / ip / ip.api
1 /* Hey Emacs use -*- mode: C -*- */
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 /** \file
18
19     This file defines vpp IP control-plane API messages which are generally
20     called through a shared memory interface.
21 */
22
23 option version = "3.0.3";
24
25 import "vnet/interface_types.api";
26 import "vnet/fib/fib_types.api";
27 import "vnet/ethernet/ethernet_types.api";
28 import "vnet/mfib/mfib_types.api";
29 import "vnet/interface_types.api";
30
31 /** \brief An IP table
32     @param is_ipv6 - V4 or V6 table
33     @param table_id - table ID associated with the route
34                      This table ID will apply to both the unicast
35                       and multicast FIBs
36     @param name - A client provided name/tag for the table. If this is
37                   not set by the client, then VPP will generate something
38                   meaningful.
39 */
40 typedef ip_table
41 {
42   u32 table_id;
43   bool is_ip6;
44   string name[64];
45 };
46
47 /** \brief Add / del table request
48            A table can be added multiple times, but need be deleted only once.
49     @param client_index - opaque cookie to identify the sender
50     @param context - sender context, to match reply w/ request
51 */
52 autoreply define ip_table_add_del
53 {
54   u32 client_index;
55   u32 context;
56   bool is_add [default=true];
57   vl_api_ip_table_t table;
58 };
59
60 /** \brief Dump IP all fib tables
61     @param client_index - opaque cookie to identify the sender
62     @param context - sender context, to match reply w/ request
63 */
64 define ip_table_dump
65 {
66   u32 client_index;
67   u32 context;
68 };
69
70 /** \brief IP table replace being
71
72     The use-case is that, for some unspecified reason, the control plane
73     has a very different set of entries it wants in the table than VPP
74     currently has. The CP would thus like to 'replace' VPP's current table
75     only by specifying what the new set of entries shall be, i.e. it is not
76     going to delete anything that already exists.
77     the CP declares the start of this procedure with this begin_replace
78     API Call, and when it has populated all the entries it wants, it calls
79     the below end_replace API. From this point on it is of course free
80     to add and delete entries as usual.
81     The underlying mechanism by which VPP implements this replace is
82     purposefully left unspecified.
83
84     @param client_index - opaque cookie to identify the sender
85     @param context - sender context, to match reply w/ request
86     @param table - The table to resync
87 */
88 autoreply define ip_table_replace_begin
89 {
90   u32 client_index;
91   u32 context;
92   vl_api_ip_table_t table;
93 };
94
95 /** \brief IP table replace end
96
97     see replace start/
98
99     @param client_index - opaque cookie to identify the sender
100     @param context - sender context, to match reply w/ request
101     @param table - The table that has converged
102 */
103 autoreply define ip_table_replace_end
104 {
105   u32 client_index;
106   u32 context;
107   vl_api_ip_table_t table;
108 };
109
110 /** \brief IP table flush
111     Flush a table of all routes
112     @param client_index - opaque cookie to identify the sender
113     @param context - sender context, to match reply w/ request
114     @param table - The table to flush
115 */
116 autoreply define ip_table_flush
117 {
118   u32 client_index;
119   u32 context;
120   vl_api_ip_table_t table;
121 };
122
123 /** \brief IP FIB table response
124     @param context - sender context
125     @param table - description of the table
126 */
127 define ip_table_details
128 {
129   u32 context;
130   vl_api_ip_table_t table;
131 };
132
133 /** \brief An IP route
134   @param table_id The IP table the route is in
135   @param stats_index The index of the route in the stats segment
136   @param prefix the prefix for the route
137   @param n_paths The number of paths the route has
138   @param paths The paths of the route
139 */
140 typedef ip_route
141 {
142   u32 table_id;
143   u32 stats_index;
144   vl_api_prefix_t prefix;
145   u8 n_paths;
146   vl_api_fib_path_t paths[n_paths];
147 };
148
149 /** \brief Add / del route request
150     @param client_index - opaque cookie to identify the sender
151     @param context - sender context, to match reply w/ request
152     @param is_multipath - Set to 1 if these paths will be added/removed
153                           to/from the existing set, or 0 to replace
154                           the existing set.
155                           is_add=0 & is_multipath=0 implies delete all paths
156     @param is_add - Are the paths being added or removed
157 */
158 define ip_route_add_del
159 {
160   u32 client_index;
161   u32 context;
162   bool is_add [default=true];
163   bool is_multipath;
164   vl_api_ip_route_t route;
165 };
166 define ip_route_add_del_reply
167 {
168   u32 context;
169   i32 retval;
170   u32 stats_index;
171 };
172
173 /** \brief Dump IP routes from a table
174     @param client_index - opaque cookie to identify the sender
175     @param table - The table from which to dump routes (ony ID an AF are needed)
176 */
177 define ip_route_dump
178 {
179   u32 client_index;
180   u32 context;
181   vl_api_ip_table_t table;
182 };
183
184 /** \brief IP FIB table entry response
185     @param route The route entry in the table
186 */
187 define ip_route_details
188 {
189   u32 context;
190   vl_api_ip_route_t route;
191 };
192
193 /** \brief Lookup IP route from a table
194     @param client_index - opaque cookie to identify the sender
195     @param table_id - The IP table to look the route up in
196     @param exact - 0 for normal route lookup, 1 for exact match only
197     @param prefix - The prefix (or host) for route lookup.
198 */
199 define ip_route_lookup
200 {
201   u32 client_index;
202   u32 context;
203   u32 table_id;
204   u8 exact;
205   vl_api_prefix_t prefix;
206 };
207
208 /** \brief IP FIB table lookup response
209     @param retval - return code of the lookup
210     @param route - The route entry in the table if found
211 */
212 define ip_route_lookup_reply
213 {
214   u32 context;
215   i32 retval;
216   vl_api_ip_route_t route;
217 };
218
219 /** \brief Set the ip flow hash config for a fib request
220     @param client_index - opaque cookie to identify the sender
221     @param context - sender context, to match reply w/ request
222     @param vrf_id - vrf/fib id
223     @param is_ipv6 - if non-zero the fib is ip6, else ip4
224     @param src - if non-zero include src in flow hash
225     @param dst - if non-zero include dst in flow hash
226     @param sport - if non-zero include sport in flow hash
227     @param dport - if non-zero include dport in flow hash
228     @param proto -if non-zero include proto in flow hash
229     @param reverse - if non-zero include reverse in flow hash
230     @param symmetric - if non-zero include symmetry in flow hash
231 */
232 autoreply define set_ip_flow_hash
233 {
234   option deprecated;
235   u32 client_index;
236   u32 context;
237   u32 vrf_id;
238   bool is_ipv6;
239   bool src;
240   bool dst;
241   bool sport;
242   bool dport;
243   bool proto;
244   bool reverse;
245   bool symmetric;
246 };
247
248 /**
249     @brief flow hash settings for an IP table
250     @param src - include src in flow hash
251     @param dst - include dst in flow hash
252     @param sport - include sport in flow hash
253     @param dport - include dport in flow hash
254     @param proto - include proto in flow hash
255     @param reverse - include reverse in flow hash
256     @param symmetric - include symmetry in flow hash
257     @param flowlabel - include flowlabel in flow hash
258 */
259 enumflag ip_flow_hash_config
260 {
261   IP_API_FLOW_HASH_SRC_IP = 0x01,
262   IP_API_FLOW_HASH_DST_IP = 0x02,
263   IP_API_FLOW_HASH_SRC_PORT = 0x04,
264   IP_API_FLOW_HASH_DST_PORT = 0x08,
265   IP_API_FLOW_HASH_PROTO = 0x10,
266   IP_API_FLOW_HASH_REVERSE = 0x20,
267   IP_API_FLOW_HASH_SYMETRIC = 0x40,
268   IP_API_FLOW_HASH_FLOW_LABEL = 0x80,
269 };
270
271 autoreply define set_ip_flow_hash_v2
272 {
273   u32 client_index;
274   u32 context;
275   u32 table_id;
276   vl_api_address_family_t af;
277   vl_api_ip_flow_hash_config_t flow_hash_config;
278 };
279
280 /** \brief Set the ip flow hash router ID
281     @param client_index - opaque cookie to identify the sender
282     @param context - sender context, to match reply w/ request
283     @param router_id - The ID of the router. Mixed into the hash.
284                        Used to prevent polarisation across a network,
285                        since each router is assumed to have a different ID
286 */
287 autoreply define set_ip_flow_hash_router_id
288 {
289   u32 client_index;
290   u32 context;
291   u32 router_id;
292 };
293
294 /** \brief IPv6 interface enable / disable request
295     @param client_index - opaque cookie to identify the sender
296     @param context - sender context, to match reply w/ request
297     @param sw_if_index - interface used to reach neighbor
298     @param enable - if non-zero enable ip6 on interface, else disable
299 */
300 autoreply define sw_interface_ip6_enable_disable
301 {
302   u32 client_index;
303   u32 context;
304   vl_api_interface_index_t sw_if_index;
305   bool enable;                  /* set to true if enable */
306 };
307
308 /** \brief Dump IP multicast fib table
309     @param client_index - opaque cookie to identify the sender
310 */
311 define ip_mtable_dump
312 {
313   u32 client_index;
314   u32 context;
315 };
316 define ip_mtable_details
317 {
318   u32 client_index;
319   u32 context;
320   vl_api_ip_table_t table;
321 };
322
323 /** \brief Add / del route request
324
325     Adds a route, consisting both of the MFIB entry to match packets
326     (which may already exist) and a path to send those packets down.
327     Routes can be entered repeatedly to add multiple paths.  Deletions are
328     per-path.
329
330     @param client_index - opaque cookie to identify the sender
331     @param context - sender context, to match reply w/ request
332     @param table_id - fib table /vrf associated with the route
333     @param is_add - true if adding a route; false if deleting one
334     @param is_ipv6 - true iff all the addresses are v6
335     @param entry_flags - see fib_entry_flag_t
336     @param itf_flags - see mfib_entry_flags_t
337     @param next_hop_afi - see dpo_proto_t; the type of destination description
338     @param src_address - the source of the packet
339     @param grp_address - the group the packet is destined to
340     @param nh_address - the nexthop to forward the packet to
341     @param next_hop_sw_if_index - interface to emit packet on
342
343     BIER AFIs use the BIER imposition ID.  v4 and v6 AFIs use either the
344     interface or the nexthop address.
345
346     Note that if the route is source-specific (S is supplied, not all 0s),
347     the prefix match is treated as exact (prefixlen /32 or /128).
348
349     FIXME not complete yet
350 */
351 typedef ip_mroute
352 {
353   u32 table_id;
354   vl_api_mfib_entry_flags_t entry_flags;
355   u32 rpf_id;
356   vl_api_mprefix_t prefix;
357   u8 n_paths;
358   vl_api_mfib_path_t paths[n_paths];
359 };
360
361 define ip_mroute_add_del
362 {
363   u32 client_index;
364   u32 context;
365   bool is_add [default=true];
366   bool is_multipath;
367   vl_api_ip_mroute_t route;
368 };
369 define ip_mroute_add_del_reply
370 {
371   u32 context;
372   i32 retval;
373   u32 stats_index;
374 };
375
376 /** \brief Dump IP multicast fib table
377     @param table - The table from which to dump routes (ony ID an AF are needed)
378 */
379 define ip_mroute_dump
380 {
381   u32 client_index;
382   u32 context;
383   vl_api_ip_table_t table;
384 };
385
386 /** \brief IP Multicast Route Details
387     @param route - Details of the route
388 */
389 define ip_mroute_details
390 {
391   u32 context;
392   vl_api_ip_mroute_t route;
393 };
394
395 define ip_address_details
396 {
397   u32 context;
398   vl_api_interface_index_t sw_if_index;
399   vl_api_address_with_prefix_t prefix;
400 };
401
402 define ip_address_dump
403 {
404   u32 client_index;
405   u32 context;
406   vl_api_interface_index_t sw_if_index;
407   bool is_ipv6;
408 };
409
410 /** \brief IP unnumbered configurations
411     @param sw_if_index The interface that has unnumbered configuration
412     @param ip_sw_if_index The IP interface that it is unnumbered to
413 */
414 define ip_unnumbered_details
415 {
416   u32 context;
417   vl_api_interface_index_t sw_if_index;
418   vl_api_interface_index_t ip_sw_if_index;
419 };
420
421 /** \brief Dump IP unnumbered configurations
422     @param sw_if_index ~0 for all interfaces, else the interface desired
423 */
424 define ip_unnumbered_dump
425 {
426   u32 client_index;
427   u32 context;
428   vl_api_interface_index_t sw_if_index [default=0xffffffff];
429 };
430
431 define ip_details
432 {
433   u32 context;
434   vl_api_interface_index_t sw_if_index;
435   bool is_ipv6;
436 };
437
438 define ip_dump
439 {
440   u32 client_index;
441   u32 context;
442   bool is_ipv6;
443 };
444
445 define mfib_signal_dump
446 {
447   u32 client_index;
448   u32 context;
449 };
450
451 define mfib_signal_details
452 {
453   u32 context;
454   vl_api_interface_index_t sw_if_index;
455   u32 table_id;
456   vl_api_mprefix_t prefix;
457   u16 ip_packet_len;
458   u8 ip_packet_data[256];
459 };
460
461 /** \brief IP punt policer
462     @param client_index - opaque cookie to identify the sender
463     @param context - sender context, to match reply w/ request
464     @param is_add - 1 to add neighbor, 0 to delete
465     @param is_ipv6 - 1 for IPv6 neighbor, 0 for IPv4
466     @param policer_index - Index of policer to use
467 */
468 autoreply define ip_punt_police
469 {
470   u32 client_index;
471   u32 context;
472   u32 policer_index;
473   bool is_add [default=true];
474   bool is_ip6;
475 };
476
477 /** \brief Punt redirect type
478     @param rx_sw_if_index - specify the original RX interface of traffic
479                             that should be redirected. ~0 means any interface.
480     @param tx_sw_if_index - the TX interface to which traffic should be
481                             redirected.
482     @param nh - the next-hop to redirect the traffic to.
483     @param is_ipv6 - 1 for IPv6 neighbor, 0 for IPv4
484 */
485 typedef punt_redirect
486 {
487   vl_api_interface_index_t rx_sw_if_index;
488   vl_api_interface_index_t tx_sw_if_index;
489   vl_api_address_t nh;
490 };
491
492 /** \brief IP punt redirect
493     @param client_index - opaque cookie to identify the sender
494     @param context - sender context, to match reply w/ request
495     @param punt - punt definition
496     @param is_add - 1 to add neighbor, 0 to delete
497 */
498 autoreply define ip_punt_redirect
499 {
500   u32 client_index;
501   u32 context;
502   vl_api_punt_redirect_t punt;
503   bool is_add [default=true];
504 };
505
506 define ip_punt_redirect_dump
507 {
508   u32 client_index;
509   u32 context;
510   vl_api_interface_index_t sw_if_index;
511   bool is_ipv6;
512 };
513
514 define ip_punt_redirect_details
515 {
516   u32 context;
517   vl_api_punt_redirect_t punt;
518 };
519
520 autoreply define ip_container_proxy_add_del
521 {
522   u32 client_index;
523   u32 context;
524   vl_api_prefix_t pfx;
525   vl_api_interface_index_t sw_if_index;
526   bool is_add [default=true];
527 };
528
529 define ip_container_proxy_dump
530 {
531   u32 client_index;
532   u32 context;
533 };
534
535 define ip_container_proxy_details
536 {
537   u32 context;
538   vl_api_interface_index_t sw_if_index;
539   vl_api_prefix_t prefix;
540 };
541
542 /** \brief Configure IP source and L4 port-range check
543     @param client_index - opaque cookie to identify the sender
544     @param context - sender context, to match reply w/ request
545     @param is_ip6 - 1 if source address type is IPv6
546     @param is_add - 1 if add, 0 if delete
547     @param ip - prefix to match
548     @param number_of_ranges - length of low_port and high_port arrays (must match)
549     @param low_ports[32] - up to 32 low end of port range entries (must have corresponding high_ports entry)
550     @param high_ports[32] - up to 32 high end of port range entries (must have corresponding low_ports entry)
551     @param vrf_id - fib table/vrf id to associate the source and port-range check with
552     @note To specify a single port set low_port and high_port entry the same
553 */
554 autoreply define ip_source_and_port_range_check_add_del
555 {
556   u32 client_index;
557   u32 context;
558   bool is_add [default=true];
559   vl_api_prefix_t prefix;
560   u8 number_of_ranges;
561   u16 low_ports[32];
562   u16 high_ports[32];
563   u32 vrf_id;
564 };
565
566 /** \brief Set interface source and L4 port-range request
567     @param client_index - opaque cookie to identify the sender
568     @param context - sender context, to match reply w/ request
569     @param interface_id - interface index
570     @param tcp_vrf_id - VRF associated with source and TCP port-range check
571     @param udp_vrf_id - VRF associated with source and TCP port-range check
572 */
573 autoreply define ip_source_and_port_range_check_interface_add_del
574 {
575   u32 client_index;
576   u32 context;
577   bool is_add [default=true];
578   vl_api_interface_index_t sw_if_index;
579   u32 tcp_in_vrf_id;
580   u32 tcp_out_vrf_id;
581   u32 udp_in_vrf_id;
582   u32 udp_out_vrf_id;
583 };
584
585 /** \brief IPv6 set link local address on interface request
586     @param client_index - opaque cookie to identify the sender
587     @param context - sender context, to match reply w/ request
588     @param sw_if_index - interface to set link local on
589     @param ip - the new link local address
590 */
591 autoreply define sw_interface_ip6_set_link_local_address
592 {
593   u32 client_index;
594   u32 context;
595   vl_api_interface_index_t sw_if_index;
596   vl_api_ip6_address_t ip;
597 };
598
599 /** \brief IPv6 get link local address on interface request
600     @param client_index - opaque cookie to identify the sender
601     @param context - sender context, to match reply w/ request
602     @param sw_if_index - interface to set link local on
603 */
604 define sw_interface_ip6_get_link_local_address
605 {
606   u32 client_index;
607   u32 context;
608   vl_api_interface_index_t sw_if_index;
609 };
610
611 /** \brief IPv6 link local address detail
612     @param context - sender context, to match reply w/ request
613     @param ip - the link local address
614 */
615 define sw_interface_ip6_get_link_local_address_reply
616 {
617   u32 context;
618   i32 retval;
619   vl_api_ip6_address_t ip;
620 };
621
622 /** \brief IOAM enable : Enable in-band OAM
623     @param id - profile id
624     @param seqno - To enable Seqno Processing
625     @param analyse - Enabling analysis of iOAM at decap node
626     @param pow_enable - Proof of Work enabled or not flag
627     @param trace_enable - iOAM Trace enabled or not flag
628 */
629 autoreply define ioam_enable
630 {
631   u32 client_index;
632   u32 context;
633   u16 id;
634   bool seqno;
635   bool analyse;
636   bool pot_enable;
637   bool trace_enable;
638   u32 node_id;
639 };
640
641 /** \brief iOAM disable
642     @param client_index - opaque cookie to identify the sender
643     @param context - sender context, to match reply w/ request
644     @param index - MAP Domain index
645 */
646 autoreply define ioam_disable
647 {
648   u32 client_index;
649   u32 context;
650   u16 id;
651 };
652
653 enum ip_reass_type
654 {
655   IP_REASS_TYPE_FULL = 0,
656   IP_REASS_TYPE_SHALLOW_VIRTUAL = 0x1,
657 };
658
659 autoreply define ip_reassembly_set
660 {
661   u32 client_index;
662   u32 context;
663   u32 timeout_ms;
664   u32 max_reassemblies;
665   u32 max_reassembly_length;
666   u32 expire_walk_interval_ms;
667   bool is_ip6;
668   vl_api_ip_reass_type_t type;
669 };
670
671 define ip_reassembly_get
672 {
673   u32 client_index;
674   u32 context;
675   bool is_ip6;
676   vl_api_ip_reass_type_t type;
677 };
678
679 define ip_reassembly_get_reply
680 {
681   u32 context;
682   i32 retval;
683   u32 timeout_ms;
684   u32 max_reassemblies;
685   u32 max_reassembly_length;
686   u32 expire_walk_interval_ms;
687   bool is_ip6;
688 };
689
690 /** \brief Enable/disable reassembly feature
691     @param client_index - opaque cookie to identify the sender
692     @param context - sender context, to match reply w/ request
693     @param sw_if_index - interface to enable/disable feature on
694     @param enable_ip4 - enable ip4 reassembly if non-zero, disable if 0
695     @param enable_ip6 - enable ip6 reassembly if non-zero, disable if 0
696 */
697 autoreply define ip_reassembly_enable_disable
698 {
699   u32 client_index;
700   u32 context;
701   vl_api_interface_index_t sw_if_index;
702   bool enable_ip4;
703   bool enable_ip6;
704   vl_api_ip_reass_type_t type;
705 };
706
707 /*
708  * Local Variables:
709  * eval: (c-set-style "gnu")
710  * End:
711  */