ipsec: Split the SA add_del API into an separate add and del
[vpp.git] / src / vnet / ipsec / ipsec.api
1 /* Hey Emacs use -*- mode: C -*- */
2 /*
3  * Copyright (c) 2015-2016 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 option version = "5.0.2";
18
19 import "vnet/ipsec/ipsec_types.api";
20 import "vnet/interface_types.api";
21 import "vnet/ip/ip_types.api";
22 import "vnet/interface_types.api";
23 import "vnet/tunnel/tunnel_types.api";
24
25 /** \brief IPsec: Add/delete Security Policy Database
26     @param client_index - opaque cookie to identify the sender
27     @param context - sender context, to match reply w/ request
28     @param is_add - add SPD if non-zero, else delete
29     @param spd_id - SPD instance id (control plane allocated)
30 */
31
32 autoreply define ipsec_spd_add_del
33 {
34   u32 client_index;
35   u32 context;
36   bool is_add;
37   u32 spd_id;
38 };
39
40 /** \brief IPsec: Add/delete SPD from interface
41
42     @param client_index - opaque cookie to identify the sender
43     @param context - sender context, to match reply w/ request
44     @param is_add - add security mode if non-zero, else delete
45     @param sw_if_index - index of the interface
46     @param spd_id - SPD instance id to use for lookups
47 */
48
49
50 autoreply define ipsec_interface_add_del_spd
51 {
52   u32 client_index;
53   u32 context;
54
55   bool is_add;
56   vl_api_interface_index_t sw_if_index;
57   u32 spd_id;
58 };
59
60
61 enum ipsec_spd_action
62 {
63   /* bypass - no IPsec processing */
64   IPSEC_API_SPD_ACTION_BYPASS = 0,
65   /* discard - discard packet with ICMP processing */
66   IPSEC_API_SPD_ACTION_DISCARD,
67   /* resolve - send request to control plane for SA resolving */
68   IPSEC_API_SPD_ACTION_RESOLVE,
69   /* protect - apply IPsec policy using following parameters */
70   IPSEC_API_SPD_ACTION_PROTECT,
71 };
72
73 /** \brief IPsec: Security Policy Database entry
74
75     See RFC 4301, 4.4.1.1 on how to match packet to selectors
76
77     @param spd_id - SPD instance id (control plane allocated)
78     @param priority - priority of SPD entry (non-unique value).  Used to order SPD matching - higher priorities match before lower
79     @param is_outbound - entry applies to outbound traffic if non-zero, otherwise applies to inbound traffic
80     @param remote_address_start - start of remote address range to match
81     @param remote_address_stop - end of remote address range to match
82     @param local_address_start - start of local address range to match
83     @param local_address_stop - end of local address range to match
84     @param protocol - protocol type to match [0 means any] otherwise IANA value
85     @param remote_port_start - start of remote port range to match ...
86     @param remote_port_stop - end of remote port range to match [0 to 65535 means ANY, 65535 to 0 means OPAQUE]
87     @param local_port_start - start of local port range to match ...
88     @param local_port_stop - end of remote port range to match [0 to 65535 means ANY, 65535 to 0 means OPAQUE]
89     @param policy - action to perform on match
90     @param sa_id - SAD instance id (control plane allocated)
91 */
92 typedef ipsec_spd_entry
93 {
94   u32 spd_id;
95   i32 priority;
96   bool is_outbound;
97
98   u32 sa_id;
99   vl_api_ipsec_spd_action_t policy;
100   /* Which protocol?? */
101   u8 protocol;
102
103   // Selector
104   vl_api_address_t remote_address_start;
105   vl_api_address_t remote_address_stop;
106   vl_api_address_t local_address_start;
107   vl_api_address_t local_address_stop;
108
109   u16 remote_port_start;
110   u16 remote_port_stop;
111   u16 local_port_start;
112   u16 local_port_stop;
113 };
114
115 /** \brief IPsec: Add/delete Security Policy Database entry
116
117     @param client_index - opaque cookie to identify the sender
118     @param context - sender context, to match reply w/ request
119     @param is_add - add SPD if non-zero, else delete
120     @param entry - Description of the entry to add/dell
121 */
122 define ipsec_spd_entry_add_del
123 {
124   u32 client_index;
125   u32 context;
126   bool is_add;
127   vl_api_ipsec_spd_entry_t entry;
128 };
129
130 /** \brief IPsec: Reply Add/delete Security Policy Database entry
131
132     @param context - sender context, to match reply w/ request
133     @param retval - success/fail rutrun code
134     @param stat_index - An index for the policy in the stats segment @ /net/ipec/policy
135 */
136 define ipsec_spd_entry_add_del_reply
137 {
138   u32 context;
139   i32 retval;
140   u32 stat_index;
141 };
142
143 /** \brief Dump IPsec all SPD IDs
144     @param client_index - opaque cookie to identify the sender
145     @param context - sender context, to match reply w/ request
146 */
147 define ipsec_spds_dump {
148   u32 client_index;
149   u32 context;
150 };
151
152 /** \brief Dump IPsec all SPD IDs response
153     @param client_index - opaque cookie to identify the sender
154     @param spd_id - SPD instance id (control plane allocated)
155     @param npolicies - number of policies in SPD
156 */
157 define ipsec_spds_details {
158   u32 context;
159   u32 spd_id;
160   u32 npolicies;
161 };
162
163 /** \brief Dump ipsec policy database data
164     @param client_index - opaque cookie to identify the sender
165     @param context - sender context, to match reply w/ request
166     @param spd_id - SPD instance id
167     @param sa_id - SA id, optional, set to ~0 to see all policies in SPD
168 */
169 define ipsec_spd_dump {
170     u32 client_index;
171     u32 context;
172     u32 spd_id;
173     u32 sa_id;
174 };
175
176 /** \brief IPsec policy database response
177     @param context - sender context which was passed in the request
178     â‚¬param entry - The SPD entry.
179     @param bytes - byte count of packets matching this policy
180     @param packets - count of packets matching this policy
181 */
182 define ipsec_spd_details {
183     u32 context;
184     vl_api_ipsec_spd_entry_t entry;
185 };
186
187 /** \brief IPsec: Add/delete Security Association Database entry
188     @param client_index - opaque cookie to identify the sender
189     @param context - sender context, to match reply w/ request
190     @param entry - Entry to add or delete
191  */
192 define ipsec_sad_entry_add_del
193 {
194   option deprecated;
195   u32 client_index;
196   u32 context;
197   bool is_add;
198   vl_api_ipsec_sad_entry_t entry;
199 };
200 define ipsec_sad_entry_add_del_v2
201 {
202   u32 client_index;
203   u32 context;
204   bool is_add;
205   vl_api_ipsec_sad_entry_v2_t entry;
206 };
207 define ipsec_sad_entry_add_del_v3
208 {
209   u32 client_index;
210   u32 context;
211   bool is_add;
212   vl_api_ipsec_sad_entry_v3_t entry;
213 };
214 define ipsec_sad_entry_add
215 {
216   u32 client_index;
217   u32 context;
218   vl_api_ipsec_sad_entry_v3_t entry;
219 };
220 autoreply define ipsec_sad_entry_del
221 {
222   u32 client_index;
223   u32 context;
224   u32 id;
225 };
226
227 define ipsec_sad_entry_add_del_reply
228 {
229   option deprecated;
230   u32 context;
231   i32 retval;
232   u32 stat_index;
233 };
234 define ipsec_sad_entry_add_del_v2_reply
235 {
236   u32 context;
237   i32 retval;
238   u32 stat_index;
239 };
240 define ipsec_sad_entry_add_del_v3_reply
241 {
242   u32 context;
243   i32 retval;
244   u32 stat_index;
245 };
246 define ipsec_sad_entry_add_reply
247 {
248   u32 context;
249   i32 retval;
250   u32 stat_index;
251 };
252
253 /** \brief Add or Update Protection for a tunnel with IPSEC
254
255     Tunnel protection directly associates an SA with all packets
256     ingress and egress on the tunnel. This could also be achieved by
257     assigning an SPD to the tunnel, but that would incur an unnessccary
258     SPD entry lookup.
259
260     For tunnels the ESP acts on the post-encapsulated packet. So if this
261     packet:
262       +---------+------+
263       | Payload | O-IP |
264       +---------+------+
265     where O-IP is the overlay IP addrees that was routed into the tunnel,
266     the resulting encapsulated packet will be:
267       +---------+------+------+
268       | Payload | O-IP | T-IP |
269       +---------+------+------+
270     where T-IP is the tunnel's src.dst IP addresses.
271     If the SAs used for protection are in transport mode then the ESP is
272     inserted before T-IP, i.e.:
273       +---------+------+-----+------+
274       | Payload | O-IP | ESP | T-IP |
275       +---------+------+-----+------+
276     If the SAs used for protection are in tunnel mode then another
277     encapsulation occurs, i.e.:
278       +---------+------+------+-----+------+
279       | Payload | O-IP | T-IP | ESP | C-IP |
280       +---------+------+------+-----+------+
281     where C-IP are the crypto endpoint IP addresses defined as the tunnel
282     endpoints in the SA.
283     The mode for the inbound and outbound SA must be the same.
284
285     @param client_index - opaque cookie to identify the sender
286     @param context - sender context, to match reply w/ request
287     @param sw_id_index - Tunnel interface to protect
288     @param nh - The peer/next-hop on the tunnel to which the traffic
289                 should be protected. For a P2P interface set this to the
290                 all 0s address.
291     @param sa_in - The ID [set] of inbound SAs
292     @param sa_out - The ID of outbound SA
293 */
294 typedef ipsec_tunnel_protect
295 {
296   vl_api_interface_index_t sw_if_index;
297   vl_api_address_t nh;
298   u32 sa_out;
299   u8 n_sa_in;
300   u32 sa_in[n_sa_in];
301 };
302
303 autoreply define ipsec_tunnel_protect_update
304 {
305   u32 client_index;
306   u32 context;
307
308   vl_api_ipsec_tunnel_protect_t tunnel;
309 };
310
311 autoreply define ipsec_tunnel_protect_del
312 {
313   u32 client_index;
314   u32 context;
315
316   vl_api_interface_index_t sw_if_index;
317   vl_api_address_t nh;
318 };
319
320 /**
321  * @brief Dump all tunnel protections
322  */
323 define ipsec_tunnel_protect_dump
324 {
325   u32 client_index;
326   u32 context;
327   vl_api_interface_index_t sw_if_index;
328 };
329
330 define ipsec_tunnel_protect_details
331 {
332   u32 context;
333   vl_api_ipsec_tunnel_protect_t tun;
334 };
335
336 /** \brief IPsec: Get SPD interfaces
337     @param client_index - opaque cookie to identify the sender
338     @param context - sender context, to match reply w/ request
339     @param spd_index - SPD index
340     @param spd_index_valid - if 1 spd_index is used to filter
341       spd_index's, if 0 no filtering is done
342 */
343 define ipsec_spd_interface_dump {
344     u32 client_index;
345     u32 context;
346     u32 spd_index;
347     u8 spd_index_valid;
348 };
349
350 /** \brief IPsec: SPD interface response
351     @param context - sender context which was passed in the request
352     @param spd_index - SPD index
353     @param sw_if_index - index of the interface
354 */
355 define ipsec_spd_interface_details {
356     u32 context;
357     u32 spd_index;
358     vl_api_interface_index_t sw_if_index;
359 };
360
361 typedef ipsec_itf
362 {
363   u32 user_instance [default=0xffffffff];
364   vl_api_tunnel_mode_t mode;
365   vl_api_interface_index_t sw_if_index;
366 };
367
368 /** \brief Create an IPSec interface
369  */
370 define ipsec_itf_create {
371   u32 client_index;
372   u32 context;
373   vl_api_ipsec_itf_t itf;
374 };
375
376 /** \brief Add IPsec interface interface response
377     @param context - sender context, to match reply w/ request
378     @param retval - return status
379     @param sw_if_index - sw_if_index of new interface (for successful add)
380 */
381 define ipsec_itf_create_reply
382 {
383   u32 context;
384   i32 retval;
385   vl_api_interface_index_t sw_if_index;
386 };
387
388 autoreply define ipsec_itf_delete
389 {
390   u32 client_index;
391   u32 context;
392   vl_api_interface_index_t sw_if_index;
393 };
394
395 define ipsec_itf_dump
396 {
397   u32 client_index;
398   u32 context;
399   vl_api_interface_index_t sw_if_index;
400 };
401
402 define ipsec_itf_details
403 {
404   u32 context;
405   vl_api_ipsec_itf_t itf;
406 };
407
408 /** \brief Dump IPsec security association
409     @param client_index - opaque cookie to identify the sender
410     @param context - sender context, to match reply w/ request
411     @param sa_id - optional ID of an SA to dump, if ~0 dump all SAs in SAD
412 */
413 define ipsec_sa_dump
414 {
415   option deprecated;
416   u32 client_index;
417   u32 context;
418   u32 sa_id;
419 };
420 define ipsec_sa_v2_dump
421 {
422   u32 client_index;
423   u32 context;
424   u32 sa_id;
425 };
426 define ipsec_sa_v3_dump
427 {
428   u32 client_index;
429   u32 context;
430   u32 sa_id;
431 };
432
433 /** \brief IPsec security association database response
434     @param context - sender context which was passed in the request
435     @param entry - The SA details
436     @param sw_if_index - sw_if_index of tunnel interface, policy-based SAs = ~0
437     @param salt - 4 byte salt
438     @param seq - current sequence number for outbound
439     @param seq_hi - high 32 bits of ESN for outbound
440     @param last_seq - highest sequence number received inbound
441     @param last_seq_hi - high 32 bits of highest ESN received inbound
442     @param replay_window - bit map of seq nums received relative to last_seq if using anti-replay
443     @param stat_index - index for the SA in the stats segment @ /net/ipsec/sa
444 */
445 define ipsec_sa_details {
446   option deprecated;
447   u32 context;
448   vl_api_ipsec_sad_entry_t entry;
449
450   vl_api_interface_index_t sw_if_index;
451   u32 salt;
452   u64 seq_outbound;
453   u64 last_seq_inbound;
454   u64 replay_window;
455
456   u32 stat_index;
457 };
458 define ipsec_sa_v2_details {
459   u32 context;
460   vl_api_ipsec_sad_entry_v2_t entry;
461
462   vl_api_interface_index_t sw_if_index;
463   u32 salt;
464   u64 seq_outbound;
465   u64 last_seq_inbound;
466   u64 replay_window;
467
468   u32 stat_index;
469 };
470 define ipsec_sa_v3_details {
471   u32 context;
472   vl_api_ipsec_sad_entry_v3_t entry;
473
474   vl_api_interface_index_t sw_if_index;
475   u64 seq_outbound;
476   u64 last_seq_inbound;
477   u64 replay_window;
478
479   u32 stat_index;
480 };
481
482 /** \brief Dump IPsec backends
483     @param client_index - opaque cookie to identify the sender
484     @param context - sender context, to match reply w/ request
485 */
486 define ipsec_backend_dump {
487   u32 client_index;
488   u32 context;
489 };
490
491 /** \brief IPsec backend details
492     @param name - name of the backend
493     @param protocol - IPsec protocol (value from ipsec_protocol_t)
494     @param index - backend index
495     @param active - set to 1 if the backend is active, otherwise 0
496 */
497 define ipsec_backend_details {
498   u32 context;
499   string name[128];
500   vl_api_ipsec_proto_t protocol;
501   u8 index;
502   bool active;
503 };
504
505 /** \brief Select IPsec backend
506     @param client_index - opaque cookie to identify the sender
507     @param context - sender context, to match reply w/ request
508     @param protocol - IPsec protocol (value from ipsec_protocol_t)
509     @param index - backend index
510 */
511 autoreply define ipsec_select_backend {
512   u32 client_index;
513   u32 context;
514   vl_api_ipsec_proto_t protocol;
515   u8 index;
516 };
517
518
519 /** \brief IPsec Set Async mode
520     @param client_index - opaque cookie to identify the sender
521     @param context - sender context, to match reply w/ request
522     @param async_enable - ipsec async mode on or off
523 */
524 autoreply define ipsec_set_async_mode {
525   u32 client_index;
526   u32 context;
527   bool async_enable;
528 };
529
530 /*
531  * Local Variables:
532  * eval: (c-set-style "gnu")
533  * End:
534  */