Line data Source code
1 : /* SPDX-License-Identifier: Apache-2.0
2 : * Copyright(c) 2021 Cisco Systems, Inc.
3 : */
4 :
5 : #include <vat/vat.h>
6 : #include <vlibapi/api.h>
7 : #include <vlibmemory/api.h>
8 : #include <vppinfra/error.h>
9 : #include <vpp/api/types.h>
10 :
11 : #include <vnet/ipsec/ipsec.h>
12 : #include <vnet/ip/ip_types_api.h>
13 :
14 : #define __plugin_msg_base ipsec_test_main.msg_id_base
15 : #include <vlibapi/vat_helper_macros.h>
16 :
17 : #include <vlibmemory/vlib.api_enum.h>
18 : #include <vlibmemory/vlib.api_types.h>
19 :
20 : /* Declare message IDs */
21 : #include <vnet/format_fns.h>
22 : #include <vnet/ipsec/ipsec.api_enum.h>
23 : #include <vnet/ipsec/ipsec.api_types.h>
24 :
25 : #define vl_endianfun /* define message structures */
26 : #include <vnet/ipsec/ipsec.api.h>
27 : #undef vl_endianfun
28 :
29 : #define vl_calcsizefun
30 : #include <vnet/ipsec/ipsec.api.h>
31 : #undef vl_calcsizefun
32 :
33 : typedef struct
34 : {
35 : /* API message ID base */
36 : u16 msg_id_base;
37 : u32 ping_id;
38 : vat_main_t *vat_main;
39 : } ipsec_test_main_t;
40 :
41 : static ipsec_test_main_t ipsec_test_main;
42 :
43 : static void
44 0 : vl_api_ipsec_spds_details_t_handler (vl_api_ipsec_spds_details_t *mp)
45 : {
46 0 : }
47 :
48 : static void
49 0 : vl_api_ipsec_itf_details_t_handler (vl_api_ipsec_itf_details_t *mp)
50 : {
51 0 : }
52 :
53 : static int
54 0 : api_ipsec_itf_delete (vat_main_t *vat)
55 : {
56 0 : return -1;
57 : }
58 :
59 : static int
60 0 : api_ipsec_itf_create (vat_main_t *vat)
61 : {
62 0 : return -1;
63 : }
64 :
65 : static void
66 0 : vl_api_ipsec_itf_create_reply_t_handler (vl_api_ipsec_itf_create_reply_t *vat)
67 : {
68 0 : }
69 :
70 : static int
71 0 : api_ipsec_spd_entry_add_del (vat_main_t *vam)
72 : {
73 0 : unformat_input_t *i = vam->input;
74 : vl_api_ipsec_spd_entry_add_del_t *mp;
75 0 : u8 is_add = 1, is_outbound = 0;
76 0 : u32 spd_id = 0, sa_id = 0, protocol = IPSEC_POLICY_PROTOCOL_ANY, policy = 0;
77 0 : i32 priority = 0;
78 0 : u32 rport_start = 0, rport_stop = (u32) ~0;
79 0 : u32 lport_start = 0, lport_stop = (u32) ~0;
80 0 : vl_api_address_t laddr_start = {}, laddr_stop = {}, raddr_start = {},
81 0 : raddr_stop = {};
82 : int ret;
83 :
84 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
85 : {
86 0 : if (unformat (i, "del"))
87 0 : is_add = 0;
88 0 : if (unformat (i, "outbound"))
89 0 : is_outbound = 1;
90 0 : if (unformat (i, "inbound"))
91 0 : is_outbound = 0;
92 0 : else if (unformat (i, "spd_id %d", &spd_id))
93 : ;
94 0 : else if (unformat (i, "sa_id %d", &sa_id))
95 : ;
96 0 : else if (unformat (i, "priority %d", &priority))
97 : ;
98 0 : else if (unformat (i, "protocol %d", &protocol))
99 : ;
100 0 : else if (unformat (i, "lport_start %d", &lport_start))
101 : ;
102 0 : else if (unformat (i, "lport_stop %d", &lport_stop))
103 : ;
104 0 : else if (unformat (i, "rport_start %d", &rport_start))
105 : ;
106 0 : else if (unformat (i, "rport_stop %d", &rport_stop))
107 : ;
108 0 : else if (unformat (i, "laddr_start %U", unformat_vl_api_address,
109 : &laddr_start))
110 : ;
111 0 : else if (unformat (i, "laddr_stop %U", unformat_vl_api_address,
112 : &laddr_stop))
113 : ;
114 0 : else if (unformat (i, "raddr_start %U", unformat_vl_api_address,
115 : &raddr_start))
116 : ;
117 0 : else if (unformat (i, "raddr_stop %U", unformat_vl_api_address,
118 : &raddr_stop))
119 : ;
120 0 : else if (unformat (i, "action %U", unformat_ipsec_policy_action,
121 : &policy))
122 : {
123 0 : if (policy == IPSEC_POLICY_ACTION_RESOLVE)
124 : {
125 0 : clib_warning ("unsupported action: 'resolve'");
126 0 : return -99;
127 : }
128 : }
129 : else
130 : {
131 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
132 0 : return -99;
133 : }
134 : }
135 :
136 0 : M (IPSEC_SPD_ENTRY_ADD_DEL, mp);
137 :
138 0 : mp->is_add = is_add;
139 :
140 0 : mp->entry.spd_id = ntohl (spd_id);
141 0 : mp->entry.priority = ntohl (priority);
142 0 : mp->entry.is_outbound = is_outbound;
143 :
144 0 : clib_memcpy (&mp->entry.remote_address_start, &raddr_start,
145 : sizeof (vl_api_address_t));
146 0 : clib_memcpy (&mp->entry.remote_address_stop, &raddr_stop,
147 : sizeof (vl_api_address_t));
148 0 : clib_memcpy (&mp->entry.local_address_start, &laddr_start,
149 : sizeof (vl_api_address_t));
150 0 : clib_memcpy (&mp->entry.local_address_stop, &laddr_stop,
151 : sizeof (vl_api_address_t));
152 :
153 0 : mp->entry.protocol = protocol ? (u8) protocol : IPSEC_POLICY_PROTOCOL_ANY;
154 0 : mp->entry.local_port_start = ntohs ((u16) lport_start);
155 0 : mp->entry.local_port_stop = ntohs ((u16) lport_stop);
156 0 : mp->entry.remote_port_start = ntohs ((u16) rport_start);
157 0 : mp->entry.remote_port_stop = ntohs ((u16) rport_stop);
158 0 : mp->entry.policy = (u8) policy;
159 0 : mp->entry.sa_id = ntohl (sa_id);
160 :
161 0 : S (mp);
162 0 : W (ret);
163 0 : return ret;
164 : }
165 :
166 : static int
167 0 : api_ipsec_spd_entry_add_del_v2 (vat_main_t *vam)
168 : {
169 0 : unformat_input_t *i = vam->input;
170 : vl_api_ipsec_spd_entry_add_del_t *mp;
171 0 : u8 is_add = 1, is_outbound = 0;
172 0 : u32 spd_id = 0, sa_id = 0, protocol = IPSEC_POLICY_PROTOCOL_ANY, policy = 0;
173 0 : i32 priority = 0;
174 0 : u32 rport_start = 0, rport_stop = (u32) ~0;
175 0 : u32 lport_start = 0, lport_stop = (u32) ~0;
176 0 : vl_api_address_t laddr_start = {}, laddr_stop = {}, raddr_start = {},
177 0 : raddr_stop = {};
178 : int ret;
179 :
180 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
181 : {
182 0 : if (unformat (i, "del"))
183 0 : is_add = 0;
184 0 : if (unformat (i, "outbound"))
185 0 : is_outbound = 1;
186 0 : if (unformat (i, "inbound"))
187 0 : is_outbound = 0;
188 0 : else if (unformat (i, "spd_id %d", &spd_id))
189 : ;
190 0 : else if (unformat (i, "sa_id %d", &sa_id))
191 : ;
192 0 : else if (unformat (i, "priority %d", &priority))
193 : ;
194 0 : else if (unformat (i, "protocol %d", &protocol))
195 : ;
196 0 : else if (unformat (i, "lport_start %d", &lport_start))
197 : ;
198 0 : else if (unformat (i, "lport_stop %d", &lport_stop))
199 : ;
200 0 : else if (unformat (i, "rport_start %d", &rport_start))
201 : ;
202 0 : else if (unformat (i, "rport_stop %d", &rport_stop))
203 : ;
204 0 : else if (unformat (i, "laddr_start %U", unformat_vl_api_address,
205 : &laddr_start))
206 : ;
207 0 : else if (unformat (i, "laddr_stop %U", unformat_vl_api_address,
208 : &laddr_stop))
209 : ;
210 0 : else if (unformat (i, "raddr_start %U", unformat_vl_api_address,
211 : &raddr_start))
212 : ;
213 0 : else if (unformat (i, "raddr_stop %U", unformat_vl_api_address,
214 : &raddr_stop))
215 : ;
216 0 : else if (unformat (i, "action %U", unformat_ipsec_policy_action,
217 : &policy))
218 : {
219 0 : if (policy == IPSEC_POLICY_ACTION_RESOLVE)
220 : {
221 0 : clib_warning ("unsupported action: 'resolve'");
222 0 : return -99;
223 : }
224 : }
225 : else
226 : {
227 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
228 0 : return -99;
229 : }
230 : }
231 :
232 0 : M (IPSEC_SPD_ENTRY_ADD_DEL, mp);
233 :
234 0 : mp->is_add = is_add;
235 :
236 0 : mp->entry.spd_id = ntohl (spd_id);
237 0 : mp->entry.priority = ntohl (priority);
238 0 : mp->entry.is_outbound = is_outbound;
239 :
240 0 : clib_memcpy (&mp->entry.remote_address_start, &raddr_start,
241 : sizeof (vl_api_address_t));
242 0 : clib_memcpy (&mp->entry.remote_address_stop, &raddr_stop,
243 : sizeof (vl_api_address_t));
244 0 : clib_memcpy (&mp->entry.local_address_start, &laddr_start,
245 : sizeof (vl_api_address_t));
246 0 : clib_memcpy (&mp->entry.local_address_stop, &laddr_stop,
247 : sizeof (vl_api_address_t));
248 :
249 0 : mp->entry.protocol = (u8) protocol;
250 0 : mp->entry.local_port_start = ntohs ((u16) lport_start);
251 0 : mp->entry.local_port_stop = ntohs ((u16) lport_stop);
252 0 : mp->entry.remote_port_start = ntohs ((u16) rport_start);
253 0 : mp->entry.remote_port_stop = ntohs ((u16) rport_stop);
254 0 : mp->entry.policy = (u8) policy;
255 0 : mp->entry.sa_id = ntohl (sa_id);
256 :
257 0 : S (mp);
258 0 : W (ret);
259 0 : return ret;
260 : }
261 :
262 : static void
263 0 : vl_api_ipsec_spd_details_t_handler (vl_api_ipsec_spd_details_t *mp)
264 : {
265 0 : }
266 :
267 : static void
268 0 : vl_api_ipsec_sad_entry_add_del_reply_t_handler (
269 : vl_api_ipsec_sad_entry_add_del_reply_t *mp)
270 : {
271 0 : }
272 :
273 : static void
274 0 : vl_api_ipsec_sad_entry_add_del_v3_reply_t_handler (
275 : vl_api_ipsec_sad_entry_add_del_v3_reply_t *mp)
276 : {
277 0 : }
278 :
279 : static void
280 0 : vl_api_ipsec_sad_entry_add_reply_t_handler (
281 : vl_api_ipsec_sad_entry_add_reply_t *mp)
282 : {
283 0 : }
284 :
285 : static int
286 0 : api_ipsec_sad_entry_del (vat_main_t *vat)
287 : {
288 0 : return -1;
289 : }
290 :
291 : static int
292 0 : api_ipsec_sad_bind (vat_main_t *vat)
293 : {
294 0 : return -1;
295 : }
296 :
297 : static int
298 0 : api_ipsec_sad_unbind (vat_main_t *vat)
299 : {
300 0 : return -1;
301 : }
302 :
303 : static void
304 0 : vl_api_ipsec_sad_entry_add_del_v2_reply_t_handler (
305 : vl_api_ipsec_sad_entry_add_del_v2_reply_t *mp)
306 : {
307 0 : }
308 :
309 : static void
310 0 : vl_api_ipsec_spd_interface_details_t_handler (
311 : vl_api_ipsec_spd_interface_details_t *vat)
312 : {
313 0 : }
314 :
315 : static int
316 0 : api_ipsec_sad_entry_add_del_v3 (vat_main_t *vat)
317 : {
318 0 : return -1;
319 : }
320 :
321 : static int
322 0 : api_ipsec_sad_entry_update (vat_main_t *vat)
323 : {
324 0 : return -1;
325 : }
326 :
327 : static int
328 0 : api_ipsec_tunnel_protect_update (vat_main_t *vat)
329 : {
330 0 : return -1;
331 : }
332 :
333 : static void
334 0 : vl_api_ipsec_backend_details_t_handler (vl_api_ipsec_backend_details_t *mp)
335 : {
336 0 : }
337 :
338 : static int
339 0 : api_ipsec_sa_v3_dump (vat_main_t *vat)
340 : {
341 0 : return -1;
342 : }
343 :
344 : static int
345 0 : api_ipsec_tunnel_protect_dump (vat_main_t *vat)
346 : {
347 0 : return -1;
348 : }
349 :
350 : static int
351 0 : api_ipsec_tunnel_protect_del (vat_main_t *vat)
352 : {
353 0 : return -1;
354 : }
355 :
356 : static void
357 0 : vl_api_ipsec_tunnel_protect_details_t_handler (
358 : vl_api_ipsec_tunnel_protect_details_t *mp)
359 : {
360 0 : }
361 :
362 : static int
363 0 : api_ipsec_sad_entry_add (vat_main_t *vat)
364 : {
365 0 : return -1;
366 : }
367 :
368 : static void
369 0 : vl_api_ipsec_spd_entry_add_del_reply_t_handler (
370 : vl_api_ipsec_spd_entry_add_del_reply_t *mp)
371 : {
372 0 : }
373 :
374 : static void
375 0 : vl_api_ipsec_spd_entry_add_del_v2_reply_t_handler (
376 : vl_api_ipsec_spd_entry_add_del_v2_reply_t *mp)
377 : {
378 0 : }
379 :
380 : static int
381 0 : api_ipsec_spds_dump (vat_main_t *vam)
382 : {
383 0 : return -1;
384 : }
385 :
386 : static int
387 0 : api_ipsec_itf_dump (vat_main_t *vam)
388 : {
389 0 : return -1;
390 : }
391 :
392 : static void
393 0 : vl_api_ipsec_sa_v3_details_t_handler (vl_api_ipsec_sa_v3_details_t *mp)
394 : {
395 0 : }
396 :
397 : static int
398 0 : api_ipsec_spd_interface_dump (vat_main_t *vat)
399 : {
400 0 : return -1;
401 : }
402 :
403 : static void
404 0 : vl_api_ipsec_sa_v2_details_t_handler (vl_api_ipsec_sa_v2_details_t *mp)
405 : {
406 0 : }
407 :
408 : static int
409 0 : api_ipsec_sa_v2_dump (vat_main_t *mp)
410 : {
411 0 : return -1;
412 : }
413 :
414 : static int
415 0 : api_ipsec_sa_dump (vat_main_t *vam)
416 : {
417 0 : unformat_input_t *i = vam->input;
418 : vl_api_ipsec_sa_dump_t *mp;
419 : vl_api_control_ping_t *mp_ping;
420 0 : u32 sa_id = ~0;
421 : int ret;
422 :
423 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
424 : {
425 0 : if (unformat (i, "sa_id %d", &sa_id))
426 : ;
427 : else
428 : {
429 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
430 0 : return -99;
431 : }
432 : }
433 :
434 0 : M (IPSEC_SA_DUMP, mp);
435 :
436 0 : mp->sa_id = ntohl (sa_id);
437 :
438 0 : S (mp);
439 :
440 : /* Use a control ping for synchronization */
441 0 : PING (&ipsec_test_main, mp_ping);
442 0 : S (mp_ping);
443 :
444 0 : W (ret);
445 0 : return ret;
446 : }
447 :
448 : static void
449 0 : vl_api_ipsec_sa_v4_details_t_handler (vl_api_ipsec_sa_v4_details_t *mp)
450 : {
451 0 : }
452 :
453 : static int
454 0 : api_ipsec_sa_v4_dump (vat_main_t *mp)
455 : {
456 0 : return -1;
457 : }
458 :
459 : static void
460 0 : vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t *mp)
461 : {
462 0 : vat_main_t *vam = &vat_main;
463 :
464 0 : print (vam->ofp,
465 : "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
466 : "crypto_key %U integ_alg %u integ_key %U flags %x "
467 : "tunnel_src_addr %U tunnel_dst_addr %U "
468 : "salt %u seq_outbound %lu last_seq_inbound %lu "
469 : "replay_window %lu stat_index %u\n",
470 : ntohl (mp->entry.sad_id), ntohl (mp->sw_if_index),
471 0 : ntohl (mp->entry.spi), ntohl (mp->entry.protocol),
472 0 : ntohl (mp->entry.crypto_algorithm), format_hex_bytes,
473 0 : mp->entry.crypto_key.data, mp->entry.crypto_key.length,
474 0 : ntohl (mp->entry.integrity_algorithm), format_hex_bytes,
475 0 : mp->entry.integrity_key.data, mp->entry.integrity_key.length,
476 0 : ntohl (mp->entry.flags), format_vl_api_address, &mp->entry.tunnel_src,
477 : format_vl_api_address, &mp->entry.tunnel_dst, ntohl (mp->salt),
478 : clib_net_to_host_u64 (mp->seq_outbound),
479 : clib_net_to_host_u64 (mp->last_seq_inbound),
480 : clib_net_to_host_u64 (mp->replay_window), ntohl (mp->stat_index));
481 0 : }
482 :
483 : static int
484 0 : api_ipsec_spd_dump (vat_main_t *vam)
485 : {
486 0 : return -1;
487 : }
488 :
489 : uword
490 0 : unformat_ipsec_api_crypto_alg (unformat_input_t *input, va_list *args)
491 : {
492 0 : u32 *r = va_arg (*args, u32 *);
493 :
494 : if (0)
495 : ;
496 : #define _(v, f, s) else if (unformat (input, s)) *r = IPSEC_API_CRYPTO_ALG_##f;
497 0 : foreach_ipsec_crypto_alg
498 : #undef _
499 0 : else return 0;
500 0 : return 1;
501 : }
502 :
503 : uword
504 0 : unformat_ipsec_api_integ_alg (unformat_input_t *input, va_list *args)
505 : {
506 0 : u32 *r = va_arg (*args, u32 *);
507 :
508 : if (0)
509 : ;
510 : #define _(v, f, s) else if (unformat (input, s)) *r = IPSEC_API_INTEG_ALG_##f;
511 0 : foreach_ipsec_integ_alg
512 : #undef _
513 0 : else return 0;
514 0 : return 1;
515 : }
516 :
517 : static int
518 0 : api_ipsec_sad_entry_add_del (vat_main_t *vam)
519 : {
520 0 : unformat_input_t *i = vam->input;
521 : vl_api_ipsec_sad_entry_add_del_t *mp;
522 0 : u32 sad_id = 0, spi = 0;
523 0 : u8 *ck = 0, *ik = 0;
524 0 : u8 is_add = 1;
525 :
526 0 : vl_api_ipsec_crypto_alg_t crypto_alg = IPSEC_API_CRYPTO_ALG_NONE;
527 0 : vl_api_ipsec_integ_alg_t integ_alg = IPSEC_API_INTEG_ALG_NONE;
528 0 : vl_api_ipsec_sad_flags_t flags = IPSEC_API_SAD_FLAG_NONE;
529 0 : vl_api_ipsec_proto_t protocol = IPSEC_API_PROTO_AH;
530 : vl_api_address_t tun_src, tun_dst;
531 : int ret;
532 :
533 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
534 : {
535 0 : if (unformat (i, "del"))
536 0 : is_add = 0;
537 0 : else if (unformat (i, "sad_id %d", &sad_id))
538 : ;
539 0 : else if (unformat (i, "spi %d", &spi))
540 : ;
541 0 : else if (unformat (i, "esp"))
542 0 : protocol = IPSEC_API_PROTO_ESP;
543 0 : else if (unformat (i, "tunnel_src %U", unformat_vl_api_address,
544 : &tun_src))
545 : {
546 0 : flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
547 0 : if (ADDRESS_IP6 == tun_src.af)
548 0 : flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
549 : }
550 0 : else if (unformat (i, "tunnel_dst %U", unformat_vl_api_address,
551 : &tun_dst))
552 : {
553 0 : flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
554 0 : if (ADDRESS_IP6 == tun_src.af)
555 0 : flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
556 : }
557 0 : else if (unformat (i, "crypto_alg %U", unformat_ipsec_api_crypto_alg,
558 : &crypto_alg))
559 : ;
560 0 : else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
561 : ;
562 0 : else if (unformat (i, "integ_alg %U", unformat_ipsec_api_integ_alg,
563 : &integ_alg))
564 : ;
565 0 : else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
566 : ;
567 : else
568 : {
569 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
570 0 : return -99;
571 : }
572 : }
573 :
574 0 : M (IPSEC_SAD_ENTRY_ADD_DEL, mp);
575 :
576 0 : mp->is_add = is_add;
577 0 : mp->entry.sad_id = ntohl (sad_id);
578 0 : mp->entry.protocol = protocol;
579 0 : mp->entry.spi = ntohl (spi);
580 0 : mp->entry.flags = flags;
581 :
582 0 : mp->entry.crypto_algorithm = crypto_alg;
583 0 : mp->entry.integrity_algorithm = integ_alg;
584 0 : mp->entry.crypto_key.length = vec_len (ck);
585 0 : mp->entry.integrity_key.length = vec_len (ik);
586 :
587 0 : if (mp->entry.crypto_key.length > sizeof (mp->entry.crypto_key.data))
588 0 : mp->entry.crypto_key.length = sizeof (mp->entry.crypto_key.data);
589 :
590 0 : if (mp->entry.integrity_key.length > sizeof (mp->entry.integrity_key.data))
591 0 : mp->entry.integrity_key.length = sizeof (mp->entry.integrity_key.data);
592 :
593 0 : if (ck)
594 0 : clib_memcpy (mp->entry.crypto_key.data, ck, mp->entry.crypto_key.length);
595 0 : if (ik)
596 0 : clib_memcpy (mp->entry.integrity_key.data, ik,
597 : mp->entry.integrity_key.length);
598 :
599 0 : if (flags & IPSEC_API_SAD_FLAG_IS_TUNNEL)
600 : {
601 0 : clib_memcpy (&mp->entry.tunnel_src, &tun_src,
602 : sizeof (mp->entry.tunnel_src));
603 0 : clib_memcpy (&mp->entry.tunnel_dst, &tun_dst,
604 : sizeof (mp->entry.tunnel_dst));
605 : }
606 :
607 0 : S (mp);
608 0 : W (ret);
609 0 : return ret;
610 : }
611 :
612 : static int
613 0 : api_ipsec_sad_entry_add_del_v2 (vat_main_t *vam)
614 : {
615 0 : return -1;
616 : }
617 :
618 : static int
619 0 : api_ipsec_interface_add_del_spd (vat_main_t *vam)
620 : {
621 0 : vnet_main_t *vnm = vnet_get_main ();
622 0 : unformat_input_t *i = vam->input;
623 : vl_api_ipsec_interface_add_del_spd_t *mp;
624 : u32 sw_if_index;
625 0 : u8 sw_if_index_set = 0;
626 0 : u32 spd_id = (u32) ~0;
627 0 : u8 is_add = 1;
628 : int ret;
629 :
630 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
631 : {
632 0 : if (unformat (i, "del"))
633 0 : is_add = 0;
634 0 : else if (unformat (i, "spd_id %d", &spd_id))
635 : ;
636 0 : else if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
637 : &sw_if_index))
638 0 : sw_if_index_set = 1;
639 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
640 0 : sw_if_index_set = 1;
641 : else
642 : {
643 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
644 0 : return -99;
645 : }
646 : }
647 :
648 0 : if (spd_id == (u32) ~0)
649 : {
650 0 : errmsg ("spd_id must be set");
651 0 : return -99;
652 : }
653 :
654 0 : if (sw_if_index_set == 0)
655 : {
656 0 : errmsg ("missing interface name or sw_if_index");
657 0 : return -99;
658 : }
659 :
660 0 : M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
661 :
662 0 : mp->spd_id = ntohl (spd_id);
663 0 : mp->sw_if_index = ntohl (sw_if_index);
664 0 : mp->is_add = is_add;
665 :
666 0 : S (mp);
667 0 : W (ret);
668 0 : return ret;
669 : }
670 :
671 : static int
672 0 : api_ipsec_backend_dump (vat_main_t *vam)
673 : {
674 0 : return -1;
675 : }
676 :
677 : static int
678 0 : api_ipsec_select_backend (vat_main_t *vam)
679 : {
680 0 : return -1;
681 : }
682 :
683 : static int
684 0 : api_ipsec_set_async_mode (vat_main_t *vam)
685 : {
686 0 : return -1;
687 : }
688 :
689 : static int
690 0 : api_ipsec_spd_add_del (vat_main_t *vam)
691 : {
692 0 : unformat_input_t *i = vam->input;
693 : vl_api_ipsec_spd_add_del_t *mp;
694 0 : u32 spd_id = ~0;
695 0 : u8 is_add = 1;
696 : int ret;
697 :
698 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
699 : {
700 0 : if (unformat (i, "spd_id %d", &spd_id))
701 : ;
702 0 : else if (unformat (i, "del"))
703 0 : is_add = 0;
704 : else
705 : {
706 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
707 0 : return -99;
708 : }
709 : }
710 0 : if (spd_id == ~0)
711 : {
712 0 : errmsg ("spd_id must be set");
713 0 : return -99;
714 : }
715 :
716 0 : M (IPSEC_SPD_ADD_DEL, mp);
717 :
718 0 : mp->spd_id = ntohl (spd_id);
719 0 : mp->is_add = is_add;
720 :
721 0 : S (mp);
722 0 : W (ret);
723 0 : return ret;
724 : }
725 :
726 : #include <vnet/ipsec/ipsec.api_test.c>
727 :
728 : /*
729 : * Local Variables:
730 : * eval: (c-set-style "gnu")
731 : * End:
732 : */
|