FD.io VPP  v19.08.3-2-gbabecb413
Vector Packet Processing
ipsec_api.c
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * ipsec_api.c - ipsec api
4  *
5  * Copyright (c) 2016 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19 
20 #include <vnet/vnet.h>
21 #include <vlibmemory/api.h>
22 
23 #include <vnet/interface.h>
24 #include <vnet/api_errno.h>
25 #include <vnet/ip/ip.h>
26 #include <vnet/ip/ip_types_api.h>
27 #include <vnet/fib/fib.h>
28 
29 #include <vnet/vnet_msg_enum.h>
30 
31 #if WITH_LIBSSL > 0
32 #include <vnet/ipsec/ipsec.h>
33 #include <vnet/ipsec/ipsec_tun.h>
34 #endif /* IPSEC */
35 
36 #define vl_typedefs /* define message structures */
37 #include <vnet/vnet_all_api_h.h>
38 #undef vl_typedefs
39 
40 #define vl_endianfun /* define message structures */
41 #include <vnet/vnet_all_api_h.h>
42 #undef vl_endianfun
43 
44 /* instantiate all the print functions we know about */
45 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
46 #define vl_printfun
47 #include <vnet/vnet_all_api_h.h>
48 #undef vl_printfun
49 
51 
52 #define foreach_vpe_api_msg \
53 _(IPSEC_SPD_ADD_DEL, ipsec_spd_add_del) \
54 _(IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd) \
55 _(IPSEC_SPD_ENTRY_ADD_DEL, ipsec_spd_entry_add_del) \
56 _(IPSEC_SAD_ENTRY_ADD_DEL, ipsec_sad_entry_add_del) \
57 _(IPSEC_SA_DUMP, ipsec_sa_dump) \
58 _(IPSEC_SPDS_DUMP, ipsec_spds_dump) \
59 _(IPSEC_SPD_DUMP, ipsec_spd_dump) \
60 _(IPSEC_SPD_INTERFACE_DUMP, ipsec_spd_interface_dump) \
61 _(IPSEC_TUNNEL_IF_ADD_DEL, ipsec_tunnel_if_add_del) \
62 _(IPSEC_TUNNEL_IF_SET_SA, ipsec_tunnel_if_set_sa) \
63 _(IPSEC_SELECT_BACKEND, ipsec_select_backend) \
64 _(IPSEC_BACKEND_DUMP, ipsec_backend_dump) \
65 _(IPSEC_TUNNEL_PROTECT_UPDATE, ipsec_tunnel_protect_update) \
66 _(IPSEC_TUNNEL_PROTECT_DEL, ipsec_tunnel_protect_del) \
67 _(IPSEC_TUNNEL_PROTECT_DUMP, ipsec_tunnel_protect_dump)
68 
69 static void
71 {
72 #if WITH_LIBSSL == 0
73  clib_warning ("unimplemented");
74 #else
75 
76  vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
77  vl_api_ipsec_spd_add_del_reply_t *rmp;
78  int rv;
79 
80  rv = ipsec_add_del_spd (vm, ntohl (mp->spd_id), mp->is_add);
81 
82  REPLY_MACRO (VL_API_IPSEC_SPD_ADD_DEL_REPLY);
83 #endif
84 }
85 
88 {
89  vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
90  vl_api_ipsec_interface_add_del_spd_reply_t *rmp;
91  int rv;
92  u32 sw_if_index __attribute__ ((unused));
93  u32 spd_id __attribute__ ((unused));
94 
95  sw_if_index = ntohl (mp->sw_if_index);
96  spd_id = ntohl (mp->spd_id);
97 
99 
100 #if WITH_LIBSSL > 0
101  rv = ipsec_set_interface_spd (vm, sw_if_index, spd_id, mp->is_add);
102 #else
103  rv = VNET_API_ERROR_UNIMPLEMENTED;
104 #endif
105 
107 
108  REPLY_MACRO (VL_API_IPSEC_INTERFACE_ADD_DEL_SPD_REPLY);
109 }
110 
113 {
114  vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
115  vl_api_ipsec_tunnel_protect_update_reply_t *rmp;
116  u32 sw_if_index, ii, *sa_ins = NULL;
117  int rv;
118 
119  sw_if_index = ntohl (mp->tunnel.sw_if_index);
120 
121  VALIDATE_SW_IF_INDEX (&(mp->tunnel));
122 
123 #if WITH_LIBSSL > 0
124 
125  for (ii = 0; ii < mp->tunnel.n_sa_in; ii++)
126  vec_add1 (sa_ins, ntohl (mp->tunnel.sa_in[ii]));
127 
128  rv = ipsec_tun_protect_update (sw_if_index,
129  ntohl (mp->tunnel.sa_out), sa_ins);
130 #else
131  rv = VNET_API_ERROR_UNIMPLEMENTED;
132 #endif
133 
135 
136  REPLY_MACRO (VL_API_IPSEC_TUNNEL_PROTECT_UPDATE_REPLY);
137 }
138 
141 {
142  vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
143  vl_api_ipsec_tunnel_protect_del_reply_t *rmp;
144  int rv;
146 
147  sw_if_index = ntohl (mp->sw_if_index);
148 
150 
151 #if WITH_LIBSSL > 0
152  rv = ipsec_tun_protect_del (sw_if_index);
153 #else
154  rv = VNET_API_ERROR_UNIMPLEMENTED;
155 #endif
156 
158 
159  REPLY_MACRO (VL_API_IPSEC_TUNNEL_PROTECT_DEL_REPLY);
160 }
161 
163 {
167 
168 static walk_rc_t
170 {
173  ipsec_tun_protect_t *itp;
174  u32 ii = 0;
175  ipsec_sa_t *sa;
176 
177  itp = ipsec_tun_protect_get (itpi);
178 
179 
180  mp = vl_msg_api_alloc (sizeof (*mp) + (sizeof (u32) * itp->itp_n_sa_in));
181  clib_memset (mp, 0, sizeof (*mp));
182  mp->_vl_msg_id = ntohs (VL_API_IPSEC_TUNNEL_PROTECT_DETAILS);
183  mp->context = ctx->context;
184 
185  mp->tun.sw_if_index = htonl (itp->itp_sw_if_index);
186 
187  sa = ipsec_sa_get (itp->itp_out_sa);
188  mp->tun.sa_out = htonl (sa->id);
189  mp->tun.n_sa_in = itp->itp_n_sa_in;
190  /* *INDENT-OFF* */
192  ({
193  mp->tun.sa_in[ii++] = htonl (sa->id);
194  }));
195  /* *INDENT-ON* */
196 
197  vl_api_send_msg (ctx->reg, (u8 *) mp);
198 
199  return (WALK_CONTINUE);
200 }
201 
202 static void
204  * mp)
205 {
208 
209 #if WITH_LIBSSL > 0
211  if (!reg)
212  return;
213 
215  .reg = reg,
216  .context = mp->context,
217  };
218 
219  sw_if_index = ntohl (mp->sw_if_index);
220 
221  if (~0 == sw_if_index)
222  {
224  }
225  else
226  {
227  index_t itpi;
228 
229  itpi = ipsec_tun_protect_find (sw_if_index);
230 
231  if (INDEX_INVALID != itpi)
233  }
234 #else
235  clib_warning ("unimplemented");
236 #endif
237 }
238 
239 static int
240 ipsec_spd_action_decode (vl_api_ipsec_spd_action_t in,
241  ipsec_policy_action_t * out)
242 {
243  in = clib_net_to_host_u32 (in);
244 
245  switch (in)
246  {
247 #define _(v,f,s) case IPSEC_API_SPD_ACTION_##f: \
248  *out = IPSEC_POLICY_ACTION_##f; \
249  return (0);
251 #undef _
252  }
253  return (VNET_API_ERROR_UNIMPLEMENTED);
254 }
255 
258 {
259  vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
261  ip46_type_t itype;
262  u32 stat_index;
263  int rv;
264 
265  stat_index = ~0;
266 
267 #if WITH_LIBSSL > 0
268  ipsec_policy_t p;
269 
270  clib_memset (&p, 0, sizeof (p));
271 
272  p.id = ntohl (mp->entry.spd_id);
273  p.priority = ntohl (mp->entry.priority);
274 
275  itype = ip_address_decode (&mp->entry.remote_address_start, &p.raddr.start);
276  ip_address_decode (&mp->entry.remote_address_stop, &p.raddr.stop);
277  ip_address_decode (&mp->entry.local_address_start, &p.laddr.start);
278  ip_address_decode (&mp->entry.local_address_stop, &p.laddr.stop);
279 
280  p.is_ipv6 = (itype == IP46_TYPE_IP6);
281 
282  p.protocol = mp->entry.protocol;
283  p.rport.start = ntohs (mp->entry.remote_port_start);
284  p.rport.stop = ntohs (mp->entry.remote_port_stop);
285  p.lport.start = ntohs (mp->entry.local_port_start);
286  p.lport.stop = ntohs (mp->entry.local_port_stop);
287 
288  rv = ipsec_spd_action_decode (mp->entry.policy, &p.policy);
289 
290  if (rv)
291  goto out;
292 
293  /* policy action resolve unsupported */
294  if (p.policy == IPSEC_POLICY_ACTION_RESOLVE)
295  {
296  clib_warning ("unsupported action: 'resolve'");
297  rv = VNET_API_ERROR_UNIMPLEMENTED;
298  goto out;
299  }
300  p.sa_id = ntohl (mp->entry.sa_id);
301  rv =
302  ipsec_policy_mk_type (mp->entry.is_outbound, p.is_ipv6, p.policy,
303  &p.type);
304  if (rv)
305  goto out;
306 
307  rv = ipsec_add_del_policy (vm, &p, mp->is_add, &stat_index);
308  if (rv)
309  goto out;
310 
311 #else
312  rv = VNET_API_ERROR_UNIMPLEMENTED;
313  goto out;
314 #endif
315 
316 out:
317  /* *INDENT-OFF* */
318  REPLY_MACRO2 (VL_API_IPSEC_SPD_ENTRY_ADD_DEL_REPLY,
319  ({
320  rmp->stat_index = ntohl(stat_index);
321  }));
322  /* *INDENT-ON* */
323 }
324 
325 static int
326 ipsec_proto_decode (vl_api_ipsec_proto_t in, ipsec_protocol_t * out)
327 {
328  in = clib_net_to_host_u32 (in);
329 
330  switch (in)
331  {
332  case IPSEC_API_PROTO_ESP:
333  *out = IPSEC_PROTOCOL_ESP;
334  return (0);
335  case IPSEC_API_PROTO_AH:
336  *out = IPSEC_PROTOCOL_AH;
337  return (0);
338  }
339  return (VNET_API_ERROR_INVALID_PROTOCOL);
340 }
341 
342 static vl_api_ipsec_proto_t
344 {
345  switch (p)
346  {
347  case IPSEC_PROTOCOL_ESP:
348  return clib_host_to_net_u32 (IPSEC_API_PROTO_ESP);
349  case IPSEC_PROTOCOL_AH:
350  return clib_host_to_net_u32 (IPSEC_API_PROTO_AH);
351  }
352  return (VNET_API_ERROR_UNIMPLEMENTED);
353 }
354 
355 static int
356 ipsec_crypto_algo_decode (vl_api_ipsec_crypto_alg_t in,
357  ipsec_crypto_alg_t * out)
358 {
359  in = clib_net_to_host_u32 (in);
360 
361  switch (in)
362  {
363 #define _(v,f,s) case IPSEC_API_CRYPTO_ALG_##f: \
364  *out = IPSEC_CRYPTO_ALG_##f; \
365  return (0);
367 #undef _
368  }
369  return (VNET_API_ERROR_INVALID_ALGORITHM);
370 }
371 
372 static vl_api_ipsec_crypto_alg_t
374 {
375  switch (c)
376  {
377 #define _(v,f,s) case IPSEC_CRYPTO_ALG_##f: \
378  return clib_host_to_net_u32(IPSEC_API_CRYPTO_ALG_##f);
380 #undef _
381  case IPSEC_CRYPTO_N_ALG:
382  break;
383  }
384  ASSERT (0);
385  return (VNET_API_ERROR_UNIMPLEMENTED);
386 }
387 
388 
389 static int
390 ipsec_integ_algo_decode (vl_api_ipsec_integ_alg_t in, ipsec_integ_alg_t * out)
391 {
392  in = clib_net_to_host_u32 (in);
393 
394  switch (in)
395  {
396 #define _(v,f,s) case IPSEC_API_INTEG_ALG_##f: \
397  *out = IPSEC_INTEG_ALG_##f; \
398  return (0);
400 #undef _
401  }
402  return (VNET_API_ERROR_INVALID_ALGORITHM);
403 }
404 
405 static vl_api_ipsec_integ_alg_t
407 {
408  switch (i)
409  {
410 #define _(v,f,s) case IPSEC_INTEG_ALG_##f: \
411  return (clib_host_to_net_u32(IPSEC_API_INTEG_ALG_##f));
413 #undef _
414  case IPSEC_INTEG_N_ALG:
415  break;
416  }
417  ASSERT (0);
418  return (VNET_API_ERROR_UNIMPLEMENTED);
419 }
420 
421 static void
422 ipsec_key_decode (const vl_api_key_t * key, ipsec_key_t * out)
423 {
424  ipsec_mk_key (out, key->data, key->length);
425 }
426 
427 static void
428 ipsec_key_encode (const ipsec_key_t * in, vl_api_key_t * out)
429 {
430  out->length = in->len;
431  clib_memcpy (out->data, in->data, out->length);
432 }
433 
434 static ipsec_sa_flags_t
435 ipsec_sa_flags_decode (vl_api_ipsec_sad_flags_t in)
436 {
437  ipsec_sa_flags_t flags = IPSEC_SA_FLAG_NONE;
438  in = clib_net_to_host_u32 (in);
439 
441  flags |= IPSEC_SA_FLAG_USE_ESN;
443  flags |= IPSEC_SA_FLAG_USE_ANTI_REPLAY;
445  flags |= IPSEC_SA_FLAG_IS_TUNNEL;
447  flags |= IPSEC_SA_FLAG_IS_TUNNEL_V6;
449  flags |= IPSEC_SA_FLAG_UDP_ENCAP;
451  flags |= IPSEC_SA_FLAG_IS_INBOUND;
452 
453  return (flags);
454 }
455 
456 static vl_api_ipsec_sad_flags_t
458 {
459  vl_api_ipsec_sad_flags_t flags = IPSEC_API_SAD_FLAG_NONE;
460 
461  if (ipsec_sa_is_set_USE_ESN (sa))
463  if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
465  if (ipsec_sa_is_set_IS_TUNNEL (sa))
467  if (ipsec_sa_is_set_IS_TUNNEL_V6 (sa))
469  if (ipsec_sa_is_set_UDP_ENCAP (sa))
471  if (ipsec_sa_is_set_IS_INBOUND (sa))
473 
474  return clib_host_to_net_u32 (flags);
475 }
476 
479 {
480  vlib_main_t *vm __attribute__ ((unused)) = vlib_get_main ();
482  ip46_address_t tun_src = { }, tun_dst =
483  {
484  };
485  ipsec_key_t crypto_key, integ_key;
486  ipsec_crypto_alg_t crypto_alg;
487  ipsec_integ_alg_t integ_alg;
490  u32 id, spi, sa_index = ~0;
491  int rv;
492 
493 #if WITH_LIBSSL > 0
494 
495  id = ntohl (mp->entry.sad_id);
496  spi = ntohl (mp->entry.spi);
497 
498  rv = ipsec_proto_decode (mp->entry.protocol, &proto);
499 
500  if (rv)
501  goto out;
502 
503  rv = ipsec_crypto_algo_decode (mp->entry.crypto_algorithm, &crypto_alg);
504 
505  if (rv)
506  goto out;
507 
508  rv = ipsec_integ_algo_decode (mp->entry.integrity_algorithm, &integ_alg);
509 
510  if (rv)
511  goto out;
512 
513  ipsec_key_decode (&mp->entry.crypto_key, &crypto_key);
514  ipsec_key_decode (&mp->entry.integrity_key, &integ_key);
515 
516  flags = ipsec_sa_flags_decode (mp->entry.flags);
517 
518  ip_address_decode (&mp->entry.tunnel_src, &tun_src);
519  ip_address_decode (&mp->entry.tunnel_dst, &tun_dst);
520 
521  if (mp->is_add)
522  rv = ipsec_sa_add_and_lock (id, spi, proto,
523  crypto_alg, &crypto_key,
524  integ_alg, &integ_key, flags,
525  0, mp->entry.salt, &tun_src, &tun_dst,
526  &sa_index);
527  else
528  rv = ipsec_sa_unlock_id (id);
529 
530 #else
531  rv = VNET_API_ERROR_UNIMPLEMENTED;
532 #endif
533 
534 out:
535  /* *INDENT-OFF* */
536  REPLY_MACRO2 (VL_API_IPSEC_SAD_ENTRY_ADD_DEL_REPLY,
537  {
538  rmp->stat_index = htonl (sa_index);
539  });
540  /* *INDENT-ON* */
541 }
542 
543 static void
545  u32 context)
546 {
548  u32 n_policies = 0;
549 
550  mp = vl_msg_api_alloc (sizeof (*mp));
551  clib_memset (mp, 0, sizeof (*mp));
552  mp->_vl_msg_id = ntohs (VL_API_IPSEC_SPDS_DETAILS);
553  mp->context = context;
554 
555  mp->spd_id = htonl (spd->id);
556 #define _(s, n) n_policies += vec_len (spd->policies[IPSEC_SPD_POLICY_##s]);
558 #undef _
559  mp->npolicies = htonl (n_policies);
560 
561  vl_api_send_msg (reg, (u8 *) mp);
562 }
563 
564 static void
566 {
568  ipsec_main_t *im = &ipsec_main;
569  ipsec_spd_t *spd;
570 #if WITH_LIBSSL > 0
572  if (!reg)
573  return;
574 
575  /* *INDENT-OFF* */
576  pool_foreach (spd, im->spds, ({
577  send_ipsec_spds_details (spd, reg, mp->context);
578  }));
579  /* *INDENT-ON* */
580 #else
581  clib_warning ("unimplemented");
582 #endif
583 }
584 
585 vl_api_ipsec_spd_action_t
587 {
588  vl_api_ipsec_spd_action_t out = IPSEC_API_SPD_ACTION_BYPASS;
589 
590  switch (in)
591  {
592 #define _(v,f,s) case IPSEC_POLICY_ACTION_##f: \
593  out = IPSEC_API_SPD_ACTION_##f; \
594  break;
596 #undef _
597  }
598  return (clib_host_to_net_u32 (out));
599 }
600 
601 static void
603  u32 context)
604 {
606 
607  mp = vl_msg_api_alloc (sizeof (*mp));
608  clib_memset (mp, 0, sizeof (*mp));
609  mp->_vl_msg_id = ntohs (VL_API_IPSEC_SPD_DETAILS);
610  mp->context = context;
611 
612  mp->entry.spd_id = htonl (p->id);
613  mp->entry.priority = htonl (p->priority);
614  mp->entry.is_outbound = ((p->type == IPSEC_SPD_POLICY_IP6_OUTBOUND) ||
615  (p->type == IPSEC_SPD_POLICY_IP4_OUTBOUND));
616 
618  &mp->entry.local_address_start);
620  &mp->entry.local_address_stop);
622  &mp->entry.remote_address_start);
624  &mp->entry.remote_address_stop);
625  mp->entry.local_port_start = htons (p->lport.start);
626  mp->entry.local_port_stop = htons (p->lport.stop);
627  mp->entry.remote_port_start = htons (p->rport.start);
628  mp->entry.remote_port_stop = htons (p->rport.stop);
629  mp->entry.protocol = p->protocol;
630  mp->entry.policy = ipsec_spd_action_encode (p->policy);
631  mp->entry.sa_id = htonl (p->sa_id);
632 
633  vl_api_send_msg (reg, (u8 *) mp);
634 }
635 
636 static void
638 {
640  ipsec_main_t *im = &ipsec_main;
643  ipsec_spd_t *spd;
644  uword *p;
645  u32 spd_index, *ii;
646 #if WITH_LIBSSL > 0
648  if (!reg)
649  return;
650 
651  p = hash_get (im->spd_index_by_spd_id, ntohl (mp->spd_id));
652  if (!p)
653  return;
654 
655  spd_index = p[0];
656  spd = pool_elt_at_index (im->spds, spd_index);
657 
658  /* *INDENT-OFF* */
660  vec_foreach(ii, spd->policies[ptype])
661  {
662  policy = pool_elt_at_index(im->policies, *ii);
663 
664  if (mp->sa_id == ~(0) || ntohl (mp->sa_id) == policy->sa_id)
665  send_ipsec_spd_details (policy, reg, mp->context);
666  }
667  }
668  /* *INDENT-ON* */
669 #else
670  clib_warning ("unimplemented");
671 #endif
672 }
673 
674 static void
677 {
679 
680  mp = vl_msg_api_alloc (sizeof (*mp));
681  clib_memset (mp, 0, sizeof (*mp));
682  mp->_vl_msg_id = ntohs (VL_API_IPSEC_SPD_INTERFACE_DETAILS);
683  mp->context = context;
684 
685  mp->spd_index = htonl (spd_index);
686  mp->sw_if_index = htonl (sw_if_index);
687 
688  vl_api_send_msg (reg, (u8 *) mp);
689 }
690 
691 static void
693  mp)
694 {
695  ipsec_main_t *im = &ipsec_main;
697  u32 k, v, spd_index;
698 
699 #if WITH_LIBSSL > 0
701  if (!reg)
702  return;
703 
704  if (mp->spd_index_valid)
705  {
706  spd_index = ntohl (mp->spd_index);
707  /* *INDENT-OFF* */
709  if (v == spd_index)
710  send_ipsec_spd_interface_details(reg, v, k, mp->context);
711  }));
712  /* *INDENT-ON* */
713  }
714  else
715  {
716  /* *INDENT-OFF* */
718  send_ipsec_spd_interface_details(reg, v, k, mp->context);
719  }));
720  /* *INDENT-ON* */
721  }
722 
723 #else
724  clib_warning ("unimplemented");
725 #endif
726 }
727 
728 static void
730  mp)
731 {
733  ipsec_main_t *im = &ipsec_main;
734  vnet_main_t *vnm = im->vnet_main;
735  u32 sw_if_index = ~0;
736  ip46_type_t itype;
737  int rv;
738 
739 #if WITH_LIBSSL > 0
741 
742  clib_memset (&tun, 0, sizeof (ipsec_add_del_tunnel_args_t));
743 
744  tun.is_add = mp->is_add;
745  tun.esn = mp->esn;
746  tun.anti_replay = mp->anti_replay;
747  tun.local_spi = ntohl (mp->local_spi);
748  tun.remote_spi = ntohl (mp->remote_spi);
749  tun.crypto_alg = mp->crypto_alg;
752  tun.integ_alg = mp->integ_alg;
755  tun.udp_encap = mp->udp_encap;
756  tun.tx_table_id = ntohl (mp->tx_table_id);
757  tun.salt = mp->salt;
758  itype = ip_address_decode (&mp->local_ip, &tun.local_ip);
759  itype = ip_address_decode (&mp->remote_ip, &tun.remote_ip);
760  tun.is_ip6 = (IP46_TYPE_IP6 == itype);
761  memcpy (&tun.local_crypto_key, &mp->local_crypto_key,
763  memcpy (&tun.remote_crypto_key, &mp->remote_crypto_key,
765  memcpy (&tun.local_integ_key, &mp->local_integ_key,
766  mp->local_integ_key_len);
767  memcpy (&tun.remote_integ_key, &mp->remote_integ_key,
769  tun.renumber = mp->renumber;
770  tun.show_instance = ntohl (mp->show_instance);
771 
772  rv = ipsec_add_del_tunnel_if_internal (vnm, &tun, &sw_if_index);
773 
774 #else
775  rv = VNET_API_ERROR_UNIMPLEMENTED;
776 #endif
777 
778  /* *INDENT-OFF* */
779  REPLY_MACRO2 (VL_API_IPSEC_TUNNEL_IF_ADD_DEL_REPLY,
780  ({
781  rmp->sw_if_index = htonl (sw_if_index);
782  }));
783  /* *INDENT-ON* */
784 }
785 
786 static void
789 {
791 
792  mp = vl_msg_api_alloc (sizeof (*mp));
793  clib_memset (mp, 0, sizeof (*mp));
794  mp->_vl_msg_id = ntohs (VL_API_IPSEC_SA_DETAILS);
795  mp->context = context;
796 
797  mp->entry.sad_id = htonl (sa->id);
798  mp->entry.spi = htonl (sa->spi);
799  mp->entry.protocol = ipsec_proto_encode (sa->protocol);
800  mp->entry.tx_table_id =
802 
803  mp->entry.crypto_algorithm = ipsec_crypto_algo_encode (sa->crypto_alg);
804  ipsec_key_encode (&sa->crypto_key, &mp->entry.crypto_key);
805 
806  mp->entry.integrity_algorithm = ipsec_integ_algo_encode (sa->integ_alg);
807  ipsec_key_encode (&sa->integ_key, &mp->entry.integrity_key);
808 
809  mp->entry.flags = ipsec_sad_flags_encode (sa);
810 
811  if (ipsec_sa_is_set_IS_TUNNEL (sa))
812  {
814  &mp->entry.tunnel_src);
816  &mp->entry.tunnel_dst);
817  }
818 
819  mp->sw_if_index = htonl (sw_if_index);
820  mp->salt = clib_host_to_net_u32 (sa->salt);
821  mp->seq_outbound = clib_host_to_net_u64 (((u64) sa->seq));
822  mp->last_seq_inbound = clib_host_to_net_u64 (((u64) sa->last_seq));
823  if (ipsec_sa_is_set_USE_ESN (sa))
824  {
825  mp->seq_outbound |= (u64) (clib_host_to_net_u32 (sa->seq_hi));
826  mp->last_seq_inbound |= (u64) (clib_host_to_net_u32 (sa->last_seq_hi));
827  }
828  if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
829  mp->replay_window = clib_host_to_net_u64 (sa->replay_window);
830 
831  vl_api_send_msg (reg, (u8 *) mp);
832 }
833 
834 
835 static void
837 {
839  ipsec_main_t *im = &ipsec_main;
840  vnet_main_t *vnm = im->vnet_main;
841  ipsec_sa_t *sa;
843  u32 *sa_index_to_tun_if_index = 0;
844 
845 #if WITH_LIBSSL > 0
847  if (!reg || pool_elts (im->sad) == 0)
848  return;
849 
850  vec_validate_init_empty (sa_index_to_tun_if_index, vec_len (im->sad) - 1,
851  ~0);
852 
853  /* *INDENT-OFF* */
855  ({
856  vnet_hw_interface_t *hi;
857  u32 sw_if_index = ~0;
858 
859  hi = vnet_get_hw_interface (vnm, t->hw_if_index);
860  sw_if_index = hi->sw_if_index;
861  sa_index_to_tun_if_index[t->input_sa_index] = sw_if_index;
862  sa_index_to_tun_if_index[t->output_sa_index] = sw_if_index;
863  }));
864 
865  pool_foreach (sa, im->sad,
866  ({
867  if (mp->sa_id == ~(0) || ntohl (mp->sa_id) == sa->id)
868  send_ipsec_sa_details (sa, reg, mp->context,
869  sa_index_to_tun_if_index[sa - im->sad]);
870  }));
871  /* *INDENT-ON* */
872 
873  vec_free (sa_index_to_tun_if_index);
874 #else
875  clib_warning ("unimplemented");
876 #endif
877 }
878 
879 static void
881 {
882  vl_api_ipsec_tunnel_if_set_sa_reply_t *rmp;
883  ipsec_main_t *im = &ipsec_main;
884  vnet_main_t *vnm = im->vnet_main;
886  int rv;
887 
888 #if WITH_LIBSSL > 0
889  sw = vnet_get_sw_interface (vnm, ntohl (mp->sw_if_index));
890 
891  rv = ipsec_set_interface_sa (vnm, sw->hw_if_index, ntohl (mp->sa_id),
892  mp->is_outbound);
893 #else
894  clib_warning ("unimplemented");
895 #endif
896 
897  REPLY_MACRO (VL_API_IPSEC_TUNNEL_IF_SET_SA_REPLY);
898 }
899 
900 static void
902 {
904  ipsec_main_t *im = &ipsec_main;
905  u32 context = mp->context;
906 
908 
909  if (rp == 0)
910  {
911  clib_warning ("Client %d AWOL", mp->client_index);
912  return;
913  }
914 
915  ipsec_ah_backend_t *ab;
917  /* *INDENT-OFF* */
918  pool_foreach (ab, im->ah_backends, {
919  vl_api_ipsec_backend_details_t *mp = vl_msg_api_alloc (sizeof (*mp));
920  clib_memset (mp, 0, sizeof (*mp));
921  mp->_vl_msg_id = ntohs (VL_API_IPSEC_BACKEND_DETAILS);
922  mp->context = context;
923  snprintf ((char *)mp->name, sizeof (mp->name), "%.*s", vec_len (ab->name),
924  ab->name);
925  mp->protocol = ntohl (IPSEC_API_PROTO_AH);
926  mp->index = ab - im->ah_backends;
927  mp->active = mp->index == im->ah_current_backend ? 1 : 0;
928  vl_api_send_msg (rp, (u8 *)mp);
929  });
930  pool_foreach (eb, im->esp_backends, {
931  vl_api_ipsec_backend_details_t *mp = vl_msg_api_alloc (sizeof (*mp));
932  clib_memset (mp, 0, sizeof (*mp));
933  mp->_vl_msg_id = ntohs (VL_API_IPSEC_BACKEND_DETAILS);
934  mp->context = context;
935  snprintf ((char *)mp->name, sizeof (mp->name), "%.*s", vec_len (eb->name),
936  eb->name);
937  mp->protocol = ntohl (IPSEC_API_PROTO_ESP);
938  mp->index = eb - im->esp_backends;
939  mp->active = mp->index == im->esp_current_backend ? 1 : 0;
940  vl_api_send_msg (rp, (u8 *)mp);
941  });
942  /* *INDENT-ON* */
943 }
944 
945 static void
947 {
948  ipsec_main_t *im = &ipsec_main;
949  vl_api_ipsec_select_backend_reply_t *rmp;
951  int rv = 0;
952  if (pool_elts (im->sad) > 0)
953  {
954  rv = VNET_API_ERROR_INSTANCE_IN_USE;
955  goto done;
956  }
957 
958  rv = ipsec_proto_decode (mp->protocol, &protocol);
959 
960  if (rv)
961  goto done;
962 
963 #if WITH_LIBSSL > 0
964  switch (protocol)
965  {
966  case IPSEC_PROTOCOL_ESP:
967  rv = ipsec_select_esp_backend (im, mp->index);
968  break;
969  case IPSEC_PROTOCOL_AH:
970  rv = ipsec_select_ah_backend (im, mp->index);
971  break;
972  default:
973  rv = VNET_API_ERROR_INVALID_PROTOCOL;
974  break;
975  }
976 #else
977  clib_warning ("unimplemented"); /* FIXME */
978 #endif
979 done:
980  REPLY_MACRO (VL_API_IPSEC_SELECT_BACKEND_REPLY);
981 }
982 
983 /*
984  * ipsec_api_hookup
985  * Add vpe's API message handlers to the table.
986  * vlib has already mapped shared memory and
987  * added the client registration handlers.
988  * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process()
989  */
990 #define vl_msg_name_crc_list
991 #include <vnet/vnet_all_api_h.h>
992 #undef vl_msg_name_crc_list
993 
994 static void
996 {
997 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
998  foreach_vl_msg_name_crc_ipsec;
999 #undef _
1000 }
1001 
1002 static clib_error_t *
1004 {
1005  api_main_t *am = &api_main;
1006 
1007 #define _(N,n) \
1008  vl_msg_api_set_handlers(VL_API_##N, #n, \
1009  vl_api_##n##_t_handler, \
1010  vl_noop_handler, \
1011  vl_api_##n##_t_endian, \
1012  vl_api_##n##_t_print, \
1013  sizeof(vl_api_##n##_t), 1);
1015 #undef _
1016 
1017  /*
1018  * Set up the (msg_name, crc, message-id) table
1019  */
1021 
1022  return 0;
1023 }
1024 
1026 
1027 /*
1028  * fd.io coding-style-patch-verification: ON
1029  *
1030  * Local Variables:
1031  * eval: (c-set-style "gnu")
1032  * End:
1033  */
ipsec_spd_t * spds
Definition: ipsec.h:95
IPsec: Add/delete Security Policy Database entry.
Definition: ipsec.api:118
u32 flags
Definition: vhost_user.h:141
vl_api_ipsec_spd_action_t ipsec_spd_action_encode(ipsec_policy_action_t in)
Definition: ipsec_api.c:586
ipsec_tunnel_if_t * tunnel_interfaces
Definition: ipsec.h:102
ip46_address_t tunnel_src_addr
Definition: ipsec_sa.h:154
enum ipsec_spd_policy_t_ ipsec_spd_policy_type_t
IPsec: SPD interface response.
Definition: ipsec.api:405
ip46_address_t local_ip
Definition: ipsec_if.h:38
Dump IPsec backends.
Definition: ipsec.api:546
ipsec_integ_alg_t
Definition: ipsec_sa.h:58
VLIB_API_INIT_FUNCTION(ipsec_api_hookup)
static vl_api_ipsec_crypto_alg_t ipsec_crypto_algo_encode(ipsec_crypto_alg_t c)
Definition: ipsec_api.c:373
unsigned long u64
Definition: types.h:89
ip46_address_range_t laddr
#define REPLY_MACRO2(t, body)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
#define foreach_ipsec_crypto_alg
Definition: ipsec_sa.h:22
#define FOR_EACH_IPSEC_SPD_POLICY_TYPE(_t)
Definition: ipsec_spd.h:36
int ipsec_set_interface_sa(vnet_main_t *vnm, u32 hw_if_index, u32 sa_id, u8 is_outbound)
Definition: ipsec_if.c:454
int ipsec_policy_mk_type(bool is_outbound, bool is_ipv6, ipsec_policy_action_t action, ipsec_spd_policy_type_t *type)
static void vl_api_send_msg(vl_api_registration_t *rp, u8 *elem)
Definition: api.h:35
ipsec_key_t crypto_key
Definition: ipsec_sa.h:147
ipsec_integ_alg_t integ_alg
Definition: ipsec_sa.h:150
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
Definition: dpo.h:41
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:522
ipsec_protocol_t
Definition: ipsec_sa.h:66
static void setup_message_id_table(api_main_t *am)
Definition: ipsec_api.c:995
int i
#define foreach_ipsec_integ_alg
Definition: ipsec_sa.h:49
vl_api_ipsec_spd_action_t policy
Definition: ipsec.api:96
static void vl_api_ipsec_sa_dump_t_handler(vl_api_ipsec_sa_dump_t *mp)
Definition: ipsec_api.c:836
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
int ipsec_select_ah_backend(ipsec_main_t *im, u32 backend_idx)
Definition: ipsec.c:218
#define FOR_EACH_IPSEC_PROTECT_INPUT_SA(_itp, _sa, body)
Definition: ipsec_tun.h:60
A Secruity Policy Database.
Definition: ipsec_spd.h:44
static ipsec_sa_flags_t ipsec_sa_flags_decode(vl_api_ipsec_sad_flags_t in)
Definition: ipsec_api.c:435
void * vl_msg_api_alloc(int nbytes)
void ipsec_tun_protect_walk(ipsec_tun_protect_walk_cb_t fn, void *ctx)
Definition: ipsec_tun.c:370
void ipsec_mk_key(ipsec_key_t *key, const u8 *data, u8 len)
Definition: ipsec_sa.c:56
u8 is_add
Definition: ipsec.api:122
unsigned char u8
Definition: types.h:56
#define foreach_vpe_api_msg
Definition: ipsec_api.c:52
vl_api_interface_index_t sw_if_index
Definition: ipsec.api:377
vl_api_address_t remote_ip
Definition: ipsec.api:445
u32 seq_hi
Definition: ipsec_sa.h:119
uword * spd_index_by_sw_if_index
Definition: ipsec.h:112
static void vl_api_ipsec_interface_add_del_spd_t_handler(vl_api_ipsec_interface_add_del_spd_t *mp)
Definition: ipsec_api.c:87
#define clib_memcpy(d, s, n)
Definition: string.h:180
enum walk_rc_t_ walk_rc_t
Walk return code.
vl_api_interface_index_t sw_if_index
Definition: ipsec.api:370
u64 replay_window
Definition: ipsec_sa.h:122
vl_api_key_t crypto_key
Definition: ipsec.api:279
Select IPsec backend.
Definition: ipsec.api:571
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:493
vl_api_interface_index_t sw_if_index
Definition: gre.api:50
static int ipsec_proto_decode(vl_api_ipsec_proto_t in, ipsec_protocol_t *out)
Definition: ipsec_api.c:326
ipsec_main_t ipsec_main
Definition: ipsec.c:28
Definition: ipsec.api:304
static void vl_api_ipsec_tunnel_if_add_del_t_handler(vl_api_ipsec_tunnel_if_add_del_t *mp)
Definition: ipsec_api.c:729
static void vl_api_ipsec_backend_dump_t_handler(vl_api_ipsec_backend_dump_t *mp)
Definition: ipsec_api.c:901
int ipsec_select_esp_backend(ipsec_main_t *im, u32 backend_idx)
Definition: ipsec.c:241
#define hash_foreach(key_var, value_var, h, body)
Definition: hash.h:442
static void vl_api_ipsec_spd_dump_t_handler(vl_api_ipsec_spd_dump_t *mp)
Definition: ipsec_api.c:637
static void vl_api_ipsec_spd_interface_dump_t_handler(vl_api_ipsec_spd_interface_dump_t *mp)
Definition: ipsec_api.c:692
vl_api_address_t local_ip
Definition: ipsec.api:444
int ipsec_sa_unlock_id(u32 id)
Definition: ipsec_sa.c:332
port_range_t rport
unsigned int u32
Definition: types.h:88
IPsec: Reply Add/delete Security Policy Database entry.
Definition: ipsec.api:132
ip46_type_t ip_address_decode(const vl_api_address_t *in, ip46_address_t *out)
Definition: ip_types_api.c:161
static void vl_api_ipsec_spd_add_del_t_handler(vl_api_ipsec_spd_add_del_t *mp)
Definition: ipsec_api.c:70
u32 last_seq
Definition: ipsec_sa.h:120
#define hash_get(h, key)
Definition: hash.h:249
IPsec: Add/delete Security Association Database entry.
Definition: ipsec.api:297
u32 tx_fib_index
Definition: ipsec_sa.h:160
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:514
Dump IPsec all SPD IDs response.
Definition: ipsec.api:153
Add/delete IPsec tunnel interface response.
Definition: ipsec.api:470
long ctx[MAX_CONNS]
Definition: main.c:144
vl_api_ip_proto_t protocol
Definition: punt.api:39
IPsec: Add/delete Security Policy Database.
Definition: ipsec.api:29
u32 salt
Definition: ipsec_sa.h:163
vnet_main_t * vnet_main
Definition: ipsec.h:108
vl_api_ipsec_tunnel_protect_t tun
Definition: ipsec.api:383
int ipsec_add_del_policy(vlib_main_t *vm, ipsec_policy_t *policy, int is_add, u32 *stat_index)
Add/Delete a SPD.
u32 last_seq_hi
Definition: ipsec_sa.h:121
static int ipsec_spd_action_decode(vl_api_ipsec_spd_action_t in, ipsec_policy_action_t *out)
Definition: ipsec_api.c:240
ip46_address_t remote_ip
Definition: ipsec_if.h:38
#define REPLY_MACRO(t)
vl_api_ipsec_tunnel_protect_t tunnel
Definition: ipsec.api:362
ipsec_spd_policy_type_t type
static vl_api_ipsec_sad_flags_t ipsec_sad_flags_encode(const ipsec_sa_t *sa)
Definition: ipsec_api.c:457
int ipsec_tun_protect_del(u32 sw_if_index)
Definition: ipsec_tun.c:339
static void send_ipsec_sa_details(ipsec_sa_t *sa, vl_api_registration_t *reg, u32 context, u32 sw_if_index)
Definition: ipsec_api.c:787
static ipsec_sa_t * ipsec_sa_get(u32 sa_index)
Definition: ipsec.h:244
ipsec_policy_action_t
uword * spd_index_by_spd_id
Definition: ipsec.h:111
static void vl_api_ipsec_tunnel_if_set_sa_t_handler(vl_api_ipsec_tunnel_if_set_sa_t *mp)
Definition: ipsec_api.c:880
API main structure, used by both vpp and binary API clients.
Definition: api_common.h:203
ip46_address_t tunnel_dst_addr
Definition: ipsec_sa.h:155
An API client registration, only in vpp/vlib.
Definition: api_common.h:46
#define BAD_SW_IF_INDEX_LABEL
IPsec: Add/delete SPD from interface.
Definition: ipsec.api:47
ipsec_crypto_alg_t crypto_alg
Definition: ipsec_if.h:41
svmdb_client_t * c
vlib_main_t * vm
Definition: buffer.c:323
int ipsec_tun_protect_update(u32 sw_if_index, u32 sa_out, u32 *sas_in)
Definition: ipsec_tun.c:224
ipsec_ah_backend_t * ah_backends
Definition: ipsec.h:150
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:341
Dump IPsec all SPD IDs.
Definition: ipsec.api:143
vl_api_ipsec_sad_entry_t entry
Definition: ipsec.api:302
ipsec_policy_action_t policy
ip46_address_t start
#define clib_warning(format, args...)
Definition: error.h:59
static int ipsec_crypto_algo_decode(vl_api_ipsec_crypto_alg_t in, ipsec_crypto_alg_t *out)
Definition: ipsec_api.c:356
enum ipsec_sad_flags_t_ ipsec_sa_flags_t
vl_api_ipsec_proto_t protocol
Definition: ipsec.api:574
vl_api_registration_t * reg
Definition: ipsec_api.c:164
Set new SA on IPsec interface.
Definition: ipsec.api:534
static vl_api_registration_t * vl_api_client_index_to_registration(u32 index)
Definition: api.h:57
A Secruity Policy.
static void vl_api_ipsec_spds_dump_t_handler(vl_api_ipsec_spds_dump_t *mp)
Definition: ipsec_api.c:565
static void vl_api_ipsec_tunnel_protect_dump_t_handler(vl_api_ipsec_tunnel_protect_dump_t *mp)
Definition: ipsec_api.c:203
static void send_ipsec_spd_interface_details(vl_api_registration_t *reg, u32 spd_index, u32 sw_if_index, u32 context)
Definition: ipsec_api.c:675
vl_api_ipsec_sad_entry_t entry
Definition: ipsec.api:516
static void send_ipsec_spd_details(ipsec_policy_t *p, vl_api_registration_t *reg, u32 context)
Definition: ipsec_api.c:602
u8 data[IPSEC_KEY_MAX_LEN]
Definition: ipsec_sa.h:76
#define ASSERT(truth)
u32 spi
Definition: ipsec.api:274
static void vl_api_ipsec_spd_entry_add_del_t_handler(vl_api_ipsec_spd_entry_add_del_t *mp)
Definition: ipsec_api.c:257
ipsec_policy_t * policies
Definition: ipsec.h:99
Dump IPsec security association.
Definition: ipsec.api:481
ipsec_integ_alg_t integ_alg
Definition: ipsec_if.h:46
ip46_type_t
Definition: ip6_packet.h:70
ipsec_sa_t * sad
Definition: ipsec.h:97
u32 fib_table_get_table_id(u32 fib_index, fib_protocol_t proto)
Get the Table-ID of the FIB from protocol and index.
Definition: fib_table.c:1069
static ipsec_tun_protect_t * ipsec_tun_protect_get(u32 index)
Definition: ipsec_tun.h:103
u32 * policies[IPSEC_SPD_POLICY_N_TYPES]
vectors for each of the policy types
Definition: ipsec_spd.h:49
Dump ipsec policy database data.
Definition: ipsec.api:165
u32 stat_index
Definition: ipsec.api:136
ipsec_protocol_t protocol
Definition: ipsec_sa.h:144
static void vl_api_ipsec_tunnel_protect_update_t_handler(vl_api_ipsec_tunnel_protect_update_t *mp)
Definition: ipsec_api.c:112
static void send_ipsec_spds_details(ipsec_spd_t *spd, vl_api_registration_t *reg, u32 context)
Definition: ipsec_api.c:544
static vl_api_ipsec_proto_t ipsec_proto_encode(ipsec_protocol_t p)
Definition: ipsec_api.c:343
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
IPsec policy database response.
Definition: ipsec.api:178
IPsec: Get SPD interfaces.
Definition: ipsec.api:393
vl_api_ipsec_spd_entry_t entry
Definition: ipsec.api:180
vl_api_ipsec_spd_entry_t entry
Definition: ipsec.api:123
int ipsec_sa_add_and_lock(u32 id, u32 spi, ipsec_protocol_t proto, ipsec_crypto_alg_t crypto_alg, const ipsec_key_t *ck, ipsec_integ_alg_t integ_alg, const ipsec_key_t *ik, ipsec_sa_flags_t flags, u32 tx_table_id, u32 salt, const ip46_address_t *tun_src, const ip46_address_t *tun_dst, u32 *sa_out_index)
Definition: ipsec_sa.c:127
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
ip46_address_range_t raddr
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
Definition: dpo.h:47
u64 uword
Definition: types.h:112
ipsec_crypto_alg_t
Definition: ipsec_sa.h:36
typedef key
Definition: ipsec.api:247
static int ipsec_integ_algo_decode(vl_api_ipsec_integ_alg_t in, ipsec_integ_alg_t *out)
Definition: ipsec_api.c:390
u8 is_add
Definition: ipsec.api:301
int ipsec_set_interface_spd(vlib_main_t *vm, u32 sw_if_index, u32 spd_id, int is_add)
Bind/attach a SPD to an interface.
Definition: ipsec_spd.c:63
static vl_api_ipsec_integ_alg_t ipsec_integ_algo_encode(ipsec_integ_alg_t i)
Definition: ipsec_api.c:406
vl_api_gbp_endpoint_tun_t tun
Definition: gbp.api:125
void ip_address_encode(const ip46_address_t *in, ip46_type_t type, vl_api_address_t *out)
Definition: ip_types_api.c:178
static void ipsec_key_decode(const vl_api_key_t *key, ipsec_key_t *out)
Definition: ipsec_api.c:422
u32 id
the User&#39;s ID for this policy
Definition: ipsec_spd.h:47
static void ipsec_key_encode(const ipsec_key_t *in, vl_api_key_t *out)
Definition: ipsec_api.c:428
struct ipsec_tunnel_protect_walk_ctx_t_ ipsec_tunnel_protect_walk_ctx_t
ipsec_crypto_alg_t crypto_alg
Definition: ipsec_sa.h:146
port_range_t lport
index_t ipsec_tun_protect_find(u32 sw_if_index)
Definition: ipsec_tun.c:215
int ipsec_add_del_spd(vlib_main_t *vm, u32 spd_id, int is_add)
Add/Delete a SPD.
Definition: ipsec_spd.c:20
static clib_error_t * ipsec_api_hookup(vlib_main_t *vm)
Definition: ipsec_api.c:1003
#define foreach_ipsec_spd_policy_type
Definition: ipsec_spd.h:20
static void vl_api_ipsec_tunnel_protect_del_t_handler(vl_api_ipsec_tunnel_protect_del_t *mp)
Definition: ipsec_api.c:140
#define vec_foreach(var, vec)
Vector iterator.
u32 id
Definition: udp.api:45
int ipsec_add_del_tunnel_if_internal(vnet_main_t *vnm, ipsec_add_del_tunnel_args_t *args, u32 *sw_if_index_p)
Definition: ipsec_if.c:269
static walk_rc_t send_ipsec_tunnel_protect_details(index_t itpi, void *arg)
Definition: ipsec_api.c:169
static void vl_api_ipsec_select_backend_t_handler(vl_api_ipsec_select_backend_t *mp)
Definition: ipsec_api.c:946
IPsec security association database response.
Definition: ipsec.api:514
ipsec_esp_backend_t * esp_backends
Definition: ipsec.h:152
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header, unspecified alignment)
Definition: vec.h:486
ipsec_key_t integ_key
Definition: ipsec_sa.h:151
api_main_t api_main
Definition: api_shared.c:35
Add or delete IPsec tunnel interface.
Definition: ipsec.api:438
vl_api_fib_path_nh_proto_t proto
Definition: fib_types.api:125
#define VALIDATE_SW_IF_INDEX(mp)
u32 stat_index
Definition: ipsec.api:308
static void vl_api_ipsec_sad_entry_add_del_t_handler(vl_api_ipsec_sad_entry_add_del_t *mp)
Definition: ipsec_api.c:478
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:128