ikev2: fix memory leaks
[vpp.git] / src / plugins / ikev2 / ikev2.c
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #include <vlib/vlib.h>
17 #include <vlib/unix/plugin.h>
18 #include <vlibmemory/api.h>
19 #include <vpp/app/version.h>
20 #include <vnet/vnet.h>
21 #include <vnet/pg/pg.h>
22 #include <vppinfra/error.h>
23 #include <vppinfra/random.h>
24 #include <vnet/udp/udp.h>
25 #include <vnet/ipsec/ipsec.h>
26 #include <vnet/ipsec/ipsec_tun.h>
27 #include <vnet/ipip/ipip.h>
28 #include <plugins/ikev2/ikev2.h>
29 #include <plugins/ikev2/ikev2_priv.h>
30 #include <openssl/sha.h>
31 #include <vnet/ipsec/ipsec_punt.h>
32
33 #define IKEV2_LIVENESS_RETRIES 3
34 #define IKEV2_LIVENESS_PERIOD_CHECK 30
35
36 ikev2_main_t ikev2_main;
37
38 static int ikev2_delete_tunnel_interface (vnet_main_t * vnm,
39                                           ikev2_sa_t * sa,
40                                           ikev2_child_sa_t * child);
41
42 #define ikev2_set_state(sa, v) do { \
43     (sa)->state = v; \
44     ikev2_elog_sa_state("ispi %lx SA state changed to " #v, sa->ispi); \
45   } while(0);
46
47 typedef struct
48 {
49   u32 next_index;
50   u32 sw_if_index;
51 } ikev2_trace_t;
52
53 static u8 *
54 format_ikev2_trace (u8 * s, va_list * args)
55 {
56   CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
57   CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
58   ikev2_trace_t *t = va_arg (*args, ikev2_trace_t *);
59
60   s = format (s, "ikev2: sw_if_index %d, next index %d",
61               t->sw_if_index, t->next_index);
62   return s;
63 }
64
65 static vlib_node_registration_t ikev2_node;
66
67 #define foreach_ikev2_error \
68 _(PROCESSED, "IKEv2 packets processed") \
69 _(IKE_SA_INIT_RETRANSMIT, "IKE_SA_INIT retransmit ") \
70 _(IKE_SA_INIT_IGNORE, "IKE_SA_INIT ignore (IKE SA already auth)") \
71 _(IKE_REQ_RETRANSMIT, "IKE request retransmit") \
72 _(IKE_REQ_IGNORE, "IKE request ignore (old msgid)") \
73 _(NOT_IKEV2, "Non IKEv2 packets received") \
74 _(BAD_LENGTH, "Bad packet length")
75
76 typedef enum
77 {
78 #define _(sym,str) IKEV2_ERROR_##sym,
79   foreach_ikev2_error
80 #undef _
81     IKEV2_N_ERROR,
82 } ikev2_error_t;
83
84 static char *ikev2_error_strings[] = {
85 #define _(sym,string) string,
86   foreach_ikev2_error
87 #undef _
88 };
89
90 typedef enum
91 {
92   IKEV2_NEXT_IP4_LOOKUP,
93   IKEV2_NEXT_ERROR_DROP,
94   IKEV2_N_NEXT,
95 } ikev2_next_t;
96
97 typedef u32 ikev2_non_esp_marker;
98
99 static_always_inline u16
100 ikev2_get_port (ikev2_sa_t * sa)
101 {
102   return sa->natt ? IKEV2_PORT_NATT : IKEV2_PORT;
103 }
104
105 static_always_inline int
106 ikev2_insert_non_esp_marker (ike_header_t * ike, int len)
107 {
108   memmove ((u8 *) ike + sizeof (ikev2_non_esp_marker), ike, len);
109   clib_memset (ike, 0, sizeof (ikev2_non_esp_marker));
110   return len + sizeof (ikev2_non_esp_marker);
111 }
112
113 static ikev2_sa_transform_t *
114 ikev2_find_transform_data (ikev2_sa_transform_t * t)
115 {
116   ikev2_main_t *km = &ikev2_main;
117   ikev2_sa_transform_t *td;
118
119   vec_foreach (td, km->supported_transforms)
120   {
121     if (td->type != t->type)
122       continue;
123
124     if (td->transform_id != t->transform_id)
125       continue;
126
127     if (td->type == IKEV2_TRANSFORM_TYPE_ENCR)
128       {
129         if (vec_len (t->attrs) != 4 || t->attrs[0] != 0x80
130             || t->attrs[1] != 14)
131           continue;
132
133         if (((t->attrs[2] << 8 | t->attrs[3]) / 8) != td->key_len)
134           continue;
135       }
136     return td;
137   }
138   return 0;
139 }
140
141 static ikev2_sa_proposal_t *
142 ikev2_select_proposal (ikev2_sa_proposal_t * proposals,
143                        ikev2_protocol_id_t prot_id)
144 {
145   ikev2_sa_proposal_t *rv = 0;
146   ikev2_sa_proposal_t *proposal;
147   ikev2_sa_transform_t *transform, *new_t;
148   u8 mandatory_bitmap, optional_bitmap;
149
150   if (prot_id == IKEV2_PROTOCOL_IKE)
151     {
152       mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_ENCR) |
153         (1 << IKEV2_TRANSFORM_TYPE_PRF) | (1 << IKEV2_TRANSFORM_TYPE_DH);
154       optional_bitmap = mandatory_bitmap | (1 << IKEV2_TRANSFORM_TYPE_INTEG);
155     }
156   else if (prot_id == IKEV2_PROTOCOL_ESP)
157     {
158       mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_ENCR) |
159         (1 << IKEV2_TRANSFORM_TYPE_ESN);
160       optional_bitmap = mandatory_bitmap |
161         (1 << IKEV2_TRANSFORM_TYPE_INTEG) | (1 << IKEV2_TRANSFORM_TYPE_DH);
162     }
163   else if (prot_id == IKEV2_PROTOCOL_AH)
164     {
165       mandatory_bitmap = (1 << IKEV2_TRANSFORM_TYPE_INTEG) |
166         (1 << IKEV2_TRANSFORM_TYPE_ESN);
167       optional_bitmap = mandatory_bitmap | (1 << IKEV2_TRANSFORM_TYPE_DH);
168     }
169   else
170     return 0;
171
172   vec_add2 (rv, proposal, 1);
173
174   vec_foreach (proposal, proposals)
175   {
176     u8 bitmap = 0;
177     if (proposal->protocol_id != prot_id)
178       continue;
179
180     vec_foreach (transform, proposal->transforms)
181     {
182       if ((1 << transform->type) & bitmap)
183         continue;
184
185       if (ikev2_find_transform_data (transform))
186         {
187           bitmap |= 1 << transform->type;
188           vec_add2 (rv->transforms, new_t, 1);
189           clib_memcpy_fast (new_t, transform, sizeof (*new_t));
190           new_t->attrs = vec_dup (transform->attrs);
191         }
192     }
193
194     if ((bitmap & mandatory_bitmap) == mandatory_bitmap &&
195         (bitmap & ~optional_bitmap) == 0)
196       {
197         rv->proposal_num = proposal->proposal_num;
198         rv->protocol_id = proposal->protocol_id;
199         RAND_bytes ((u8 *) & rv->spi, sizeof (rv->spi));
200         goto done;
201       }
202     else
203       {
204         vec_free (rv->transforms);
205       }
206   }
207
208   vec_free (rv);
209 done:
210   return rv;
211 }
212
213 ikev2_sa_transform_t *
214 ikev2_sa_get_td_for_type (ikev2_sa_proposal_t * p,
215                           ikev2_transform_type_t type)
216 {
217   ikev2_sa_transform_t *t;
218
219   if (!p)
220     return 0;
221
222   vec_foreach (t, p->transforms)
223   {
224     if (t->type == type)
225       return ikev2_find_transform_data (t);
226   }
227   return 0;
228 }
229
230 ikev2_child_sa_t *
231 ikev2_sa_get_child (ikev2_sa_t * sa, u32 spi, ikev2_protocol_id_t prot_id,
232                     int by_initiator)
233 {
234   ikev2_child_sa_t *c;
235   vec_foreach (c, sa->childs)
236   {
237     ikev2_sa_proposal_t *proposal =
238       by_initiator ? &c->i_proposals[0] : &c->r_proposals[0];
239     if (proposal && proposal->spi == spi && proposal->protocol_id == prot_id)
240       return c;
241   }
242
243   return 0;
244 }
245
246 void
247 ikev2_sa_free_proposal_vector (ikev2_sa_proposal_t ** v)
248 {
249   ikev2_sa_proposal_t *p;
250   ikev2_sa_transform_t *t;
251
252   if (!*v)
253     return;
254
255   vec_foreach (p, *v)
256   {
257     vec_foreach (t, p->transforms)
258     {
259       vec_free (t->attrs);
260     }
261     vec_free (p->transforms);
262   }
263   vec_free (*v);
264 };
265
266 static void
267 ikev2_sa_free_child_sa (ikev2_child_sa_t * c)
268 {
269   ikev2_sa_free_proposal_vector (&c->r_proposals);
270   ikev2_sa_free_proposal_vector (&c->i_proposals);
271   vec_free (c->sk_ai);
272   vec_free (c->sk_ar);
273   vec_free (c->sk_ei);
274   vec_free (c->sk_er);
275   vec_free (c->tsi);
276   vec_free (c->tsr);
277 }
278
279 static void
280 ikev2_sa_free_all_child_sa (ikev2_child_sa_t ** childs)
281 {
282   ikev2_child_sa_t *c;
283   vec_foreach (c, *childs) ikev2_sa_free_child_sa (c);
284
285   vec_free (*childs);
286 }
287
288 static void
289 ikev2_sa_del_child_sa (ikev2_sa_t * sa, ikev2_child_sa_t * child)
290 {
291   ikev2_sa_free_child_sa (child);
292   vec_del1 (sa->childs, child - sa->childs);
293 }
294
295 static void
296 ikev2_sa_free_all_vec (ikev2_sa_t * sa)
297 {
298   vec_free (sa->i_nonce);
299   vec_free (sa->r_nonce);
300
301   vec_free (sa->dh_shared_key);
302   vec_free (sa->dh_private_key);
303   vec_free (sa->i_dh_data);
304   vec_free (sa->r_dh_data);
305
306   ikev2_sa_free_proposal_vector (&sa->r_proposals);
307   ikev2_sa_free_proposal_vector (&sa->i_proposals);
308
309   vec_free (sa->sk_d);
310   vec_free (sa->sk_ai);
311   vec_free (sa->sk_ar);
312   vec_free (sa->sk_ei);
313   vec_free (sa->sk_er);
314   vec_free (sa->sk_pi);
315   vec_free (sa->sk_pr);
316
317   vec_free (sa->i_id.data);
318   vec_free (sa->r_id.data);
319
320   vec_free (sa->i_auth.data);
321   if (sa->i_auth.key)
322     EVP_PKEY_free (sa->i_auth.key);
323   vec_free (sa->r_auth.data);
324   if (sa->r_auth.key)
325     EVP_PKEY_free (sa->r_auth.key);
326
327   vec_free (sa->del);
328
329   vec_free (sa->rekey);
330
331   vec_free (sa->last_sa_init_req_packet_data);
332   vec_free (sa->last_sa_init_res_packet_data);
333
334   vec_free (sa->last_res_packet_data);
335
336   ikev2_sa_free_all_child_sa (&sa->childs);
337 }
338
339 static void
340 ikev2_delete_sa (ikev2_sa_t * sa)
341 {
342   ikev2_main_t *km = &ikev2_main;
343   u32 thread_index = vlib_get_thread_index ();
344   uword *p;
345
346   ikev2_sa_free_all_vec (sa);
347
348   p = hash_get (km->per_thread_data[thread_index].sa_by_rspi, sa->rspi);
349   if (p)
350     {
351       hash_unset (km->per_thread_data[thread_index].sa_by_rspi, sa->rspi);
352       pool_put (km->per_thread_data[thread_index].sas, sa);
353     }
354 }
355
356 static void
357 ikev2_generate_sa_init_data (ikev2_sa_t * sa)
358 {
359   ikev2_sa_transform_t *t = 0, *t2;
360   ikev2_main_t *km = &ikev2_main;
361
362   if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
363     {
364       return;
365     }
366
367   /* check if received DH group is on our list of supported groups */
368   vec_foreach (t2, km->supported_transforms)
369   {
370     if (t2->type == IKEV2_TRANSFORM_TYPE_DH && sa->dh_group == t2->dh_type)
371       {
372         t = t2;
373         break;
374       }
375   }
376
377   if (!t)
378     {
379       sa->dh_group = IKEV2_TRANSFORM_DH_TYPE_NONE;
380       return;
381     }
382
383   if (sa->is_initiator)
384     {
385       /* generate rspi */
386       RAND_bytes ((u8 *) & sa->ispi, 8);
387
388       /* generate nonce */
389       sa->i_nonce = vec_new (u8, IKEV2_NONCE_SIZE);
390       RAND_bytes ((u8 *) sa->i_nonce, IKEV2_NONCE_SIZE);
391     }
392   else
393     {
394       /* generate rspi */
395       RAND_bytes ((u8 *) & sa->rspi, 8);
396
397       /* generate nonce */
398       sa->r_nonce = vec_new (u8, IKEV2_NONCE_SIZE);
399       RAND_bytes ((u8 *) sa->r_nonce, IKEV2_NONCE_SIZE);
400     }
401
402   /* generate dh keys */
403   ikev2_generate_dh (sa, t);
404
405 }
406
407 static void
408 ikev2_complete_sa_data (ikev2_sa_t * sa, ikev2_sa_t * sai)
409 {
410   ikev2_sa_transform_t *t = 0, *t2;
411   ikev2_main_t *km = &ikev2_main;
412
413   /*move some data to the new SA */
414 #define _(A) ({void* __tmp__ = (A); (A) = 0; __tmp__;})
415   sa->i_nonce = _(sai->i_nonce);
416   sa->i_dh_data = _(sai->i_dh_data);
417   sa->dh_private_key = _(sai->dh_private_key);
418   sa->iaddr.as_u32 = sai->iaddr.as_u32;
419   sa->raddr.as_u32 = sai->raddr.as_u32;
420   sa->is_initiator = sai->is_initiator;
421   sa->i_id.type = sai->i_id.type;
422   sa->r_id.type = sai->r_id.type;
423   sa->profile_index = sai->profile_index;
424   sa->tun_itf = sai->tun_itf;
425   sa->is_tun_itf_set = sai->is_tun_itf_set;
426   sa->i_id.data = _(sai->i_id.data);
427   sa->r_id.data = _(sai->r_id.data);
428   sa->i_auth.method = sai->i_auth.method;
429   sa->i_auth.hex = sai->i_auth.hex;
430   sa->i_auth.data = _(sai->i_auth.data);
431   sa->i_auth.key = _(sai->i_auth.key);
432   sa->last_sa_init_req_packet_data = _(sai->last_sa_init_req_packet_data);
433   sa->childs = _(sai->childs);
434   sa->udp_encap = sai->udp_encap;
435   sa->ipsec_over_udp_port = sai->ipsec_over_udp_port;
436   sa->dst_port = sai->dst_port;
437   sa->sw_if_index = sai->sw_if_index;
438 #undef _
439
440
441   if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
442     {
443       return;
444     }
445
446   /* check if received DH group is on our list of supported groups */
447   vec_foreach (t2, km->supported_transforms)
448   {
449     if (t2->type == IKEV2_TRANSFORM_TYPE_DH && sa->dh_group == t2->dh_type)
450       {
451         t = t2;
452         break;
453       }
454   }
455
456   if (!t)
457     {
458       sa->dh_group = IKEV2_TRANSFORM_DH_TYPE_NONE;
459       return;
460     }
461
462
463   /* generate dh keys */
464   ikev2_complete_dh (sa, t);
465
466 }
467
468 static void
469 ikev2_calc_keys (ikev2_sa_t * sa)
470 {
471   u8 *tmp;
472   /* calculate SKEYSEED = prf(Ni | Nr, g^ir) */
473   u8 *skeyseed = 0;
474   u8 *s = 0;
475   u16 integ_key_len = 0, salt_len = 0;
476   ikev2_sa_transform_t *tr_encr, *tr_prf, *tr_integ;
477   tr_encr =
478     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
479   tr_prf =
480     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
481   tr_integ =
482     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
483
484   if (tr_integ)
485     integ_key_len = tr_integ->key_len;
486   else
487     salt_len = sizeof (u32);
488
489   vec_append (s, sa->i_nonce);
490   vec_append (s, sa->r_nonce);
491   skeyseed = ikev2_calc_prf (tr_prf, s, sa->dh_shared_key);
492
493   /* Calculate S = Ni | Nr | SPIi | SPIr */
494   u64 *spi;
495   vec_add2 (s, tmp, 2 * sizeof (*spi));
496   spi = (u64 *) tmp;
497   spi[0] = clib_host_to_net_u64 (sa->ispi);
498   spi[1] = clib_host_to_net_u64 (sa->rspi);
499
500   /* calculate PRFplus */
501   u8 *keymat;
502   int len = tr_prf->key_trunc + /* SK_d */
503     integ_key_len * 2 +         /* SK_ai, SK_ar */
504     tr_encr->key_len * 2 +      /* SK_ei, SK_er */
505     tr_prf->key_len * 2 +       /* SK_pi, SK_pr */
506     salt_len * 2;
507
508   keymat = ikev2_calc_prfplus (tr_prf, skeyseed, s, len);
509   vec_free (skeyseed);
510   vec_free (s);
511
512   int pos = 0;
513
514   /* SK_d */
515   sa->sk_d = vec_new (u8, tr_prf->key_trunc);
516   clib_memcpy_fast (sa->sk_d, keymat + pos, tr_prf->key_trunc);
517   pos += tr_prf->key_trunc;
518
519   if (integ_key_len)
520     {
521       /* SK_ai */
522       sa->sk_ai = vec_new (u8, integ_key_len);
523       clib_memcpy_fast (sa->sk_ai, keymat + pos, integ_key_len);
524       pos += integ_key_len;
525
526       /* SK_ar */
527       sa->sk_ar = vec_new (u8, integ_key_len);
528       clib_memcpy_fast (sa->sk_ar, keymat + pos, integ_key_len);
529       pos += integ_key_len;
530     }
531
532   /* SK_ei */
533   sa->sk_ei = vec_new (u8, tr_encr->key_len + salt_len);
534   clib_memcpy_fast (sa->sk_ei, keymat + pos, tr_encr->key_len + salt_len);
535   pos += tr_encr->key_len + salt_len;
536
537   /* SK_er */
538   sa->sk_er = vec_new (u8, tr_encr->key_len + salt_len);
539   clib_memcpy_fast (sa->sk_er, keymat + pos, tr_encr->key_len + salt_len);
540   pos += tr_encr->key_len + salt_len;
541
542   /* SK_pi */
543   sa->sk_pi = vec_new (u8, tr_prf->key_len);
544   clib_memcpy_fast (sa->sk_pi, keymat + pos, tr_prf->key_len);
545   pos += tr_prf->key_len;
546
547   /* SK_pr */
548   sa->sk_pr = vec_new (u8, tr_prf->key_len);
549   clib_memcpy_fast (sa->sk_pr, keymat + pos, tr_prf->key_len);
550   pos += tr_prf->key_len;
551
552   vec_free (keymat);
553   sa->keys_generated = 1;
554 }
555
556 static void
557 ikev2_calc_child_keys (ikev2_sa_t * sa, ikev2_child_sa_t * child)
558 {
559   u8 *s = 0;
560   u16 integ_key_len = 0;
561   u8 salt_len = 0;
562
563   ikev2_sa_transform_t *tr_prf, *ctr_encr, *ctr_integ;
564   tr_prf =
565     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
566   ctr_encr =
567     ikev2_sa_get_td_for_type (child->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
568   ctr_integ =
569     ikev2_sa_get_td_for_type (child->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
570
571   if (ctr_integ)
572     integ_key_len = ctr_integ->key_len;
573   else
574     salt_len = sizeof (u32);
575
576   vec_append (s, sa->i_nonce);
577   vec_append (s, sa->r_nonce);
578   /* calculate PRFplus */
579   u8 *keymat;
580   int len = ctr_encr->key_len * 2 + integ_key_len * 2 + salt_len * 2;
581
582   keymat = ikev2_calc_prfplus (tr_prf, sa->sk_d, s, len);
583
584   int pos = 0;
585
586   /* SK_ei */
587   child->sk_ei = vec_new (u8, ctr_encr->key_len);
588   clib_memcpy_fast (child->sk_ei, keymat + pos, ctr_encr->key_len);
589   pos += ctr_encr->key_len;
590
591   if (ctr_integ)
592     {
593       /* SK_ai */
594       child->sk_ai = vec_new (u8, ctr_integ->key_len);
595       clib_memcpy_fast (child->sk_ai, keymat + pos, ctr_integ->key_len);
596       pos += ctr_integ->key_len;
597     }
598   else
599     {
600       clib_memcpy (&child->salt_ei, keymat + pos, salt_len);
601       pos += salt_len;
602     }
603
604   /* SK_er */
605   child->sk_er = vec_new (u8, ctr_encr->key_len);
606   clib_memcpy_fast (child->sk_er, keymat + pos, ctr_encr->key_len);
607   pos += ctr_encr->key_len;
608
609   if (ctr_integ)
610     {
611       /* SK_ar */
612       child->sk_ar = vec_new (u8, integ_key_len);
613       clib_memcpy_fast (child->sk_ar, keymat + pos, integ_key_len);
614       pos += integ_key_len;
615     }
616   else
617     {
618       clib_memcpy (&child->salt_er, keymat + pos, salt_len);
619       pos += salt_len;
620     }
621
622   ASSERT (pos == len);
623
624   vec_free (keymat);
625 }
626
627 static_always_inline u8 *
628 ikev2_compute_nat_sha1 (u64 ispi, u64 rspi, u32 ip, u16 port)
629 {
630   /* ispi, rspi, ip, port */
631   u8 buf[8 + 8 + 4 + 2];
632   u8 *res = vec_new (u8, 20);
633
634   clib_memcpy_fast (&buf[0], &ispi, sizeof (ispi));
635   clib_memcpy_fast (&buf[8], &rspi, sizeof (rspi));
636   clib_memcpy_fast (&buf[8 + 8], &ip, sizeof (ip));
637   clib_memcpy_fast (&buf[8 + 8 + 4], &port, sizeof (port));
638   SHA1 (buf, sizeof (buf), res);
639   return res;
640 }
641
642 static void
643 ikev2_process_sa_init_req (vlib_main_t * vm, ikev2_sa_t * sa,
644                            ike_header_t * ike, udp_header_t * udp, u32 len)
645 {
646   int p = 0;
647   u8 payload = ike->nextpayload;
648
649   ikev2_elog_exchange ("ispi %lx rspi %lx IKE_INIT request received "
650                        "from %d.%d.%d.%d",
651                        clib_net_to_host_u64 (ike->ispi),
652                        clib_net_to_host_u64 (ike->rspi), sa->iaddr.as_u32);
653
654   sa->ispi = clib_net_to_host_u64 (ike->ispi);
655
656   /* store whole IKE payload - needed for PSK auth */
657   vec_reset_length (sa->last_sa_init_req_packet_data);
658   vec_add (sa->last_sa_init_req_packet_data, ike, len);
659
660   while (p < len && payload != IKEV2_PAYLOAD_NONE)
661     {
662       ike_payload_header_t *ikep = (ike_payload_header_t *) & ike->payload[p];
663       u32 plen = clib_net_to_host_u16 (ikep->length);
664
665       if (plen < sizeof (ike_payload_header_t))
666         return;
667
668       if (payload == IKEV2_PAYLOAD_SA)
669         {
670           ikev2_sa_free_proposal_vector (&sa->i_proposals);
671           sa->i_proposals = ikev2_parse_sa_payload (ikep);
672         }
673       else if (payload == IKEV2_PAYLOAD_KE)
674         {
675           ike_ke_payload_header_t *ke = (ike_ke_payload_header_t *) ikep;
676           sa->dh_group = clib_net_to_host_u16 (ke->dh_group);
677           vec_free (sa->i_dh_data);
678           vec_add (sa->i_dh_data, ke->payload, plen - sizeof (*ke));
679         }
680       else if (payload == IKEV2_PAYLOAD_NONCE)
681         {
682           vec_free (sa->i_nonce);
683           vec_add (sa->i_nonce, ikep->payload, plen - sizeof (*ikep));
684         }
685       else if (payload == IKEV2_PAYLOAD_NOTIFY)
686         {
687           ikev2_notify_t *n = ikev2_parse_notify_payload (ikep);
688           if (n->msg_type == IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP)
689             {
690               u8 *src_sha =
691                 ikev2_compute_nat_sha1 (clib_net_to_host_u64 (ike->ispi), 0,
692                                         clib_net_to_host_u32 (sa->
693                                                               iaddr.as_u32),
694                                         udp->src_port);
695               if (clib_memcmp (src_sha, n->data, vec_len (src_sha)))
696                 {
697                   sa->natt = 1;
698                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx initiator"
699                                    " behind NAT", sa->ispi);
700                 }
701               vec_free (src_sha);
702             }
703           else if (n->msg_type ==
704                    IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP)
705             {
706               u8 *dst_sha =
707                 ikev2_compute_nat_sha1 (clib_net_to_host_u64 (ike->ispi), 0,
708                                         clib_net_to_host_u32 (sa->
709                                                               raddr.as_u32),
710                                         udp->dst_port);
711               if (clib_memcmp (dst_sha, n->data, vec_len (dst_sha)))
712                 {
713                   sa->natt = 1;
714                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx responder"
715                                    " (self) behind NAT", sa->ispi);
716                 }
717               vec_free (dst_sha);
718             }
719           vec_free (n);
720         }
721       else if (payload == IKEV2_PAYLOAD_VENDOR)
722         {
723           ikev2_parse_vendor_payload (ikep);
724         }
725       else
726         {
727           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
728                            payload);
729           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
730             {
731               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
732               sa->unsupported_cp = payload;
733               return;
734             }
735         }
736
737       payload = ikep->nextpayload;
738       p += plen;
739     }
740
741   ikev2_set_state (sa, IKEV2_STATE_SA_INIT);
742 }
743
744 static void
745 ikev2_process_sa_init_resp (vlib_main_t * vm, ikev2_sa_t * sa,
746                             ike_header_t * ike, udp_header_t * udp, u32 len)
747 {
748   int p = 0;
749   u8 payload = ike->nextpayload;
750
751   sa->ispi = clib_net_to_host_u64 (ike->ispi);
752   sa->rspi = clib_net_to_host_u64 (ike->rspi);
753
754   ikev2_elog_exchange ("ispi %lx rspi %lx IKE_INIT response received "
755                        "from %d.%d.%d.%d", sa->ispi, sa->rspi,
756                        sa->raddr.as_u32);
757
758   /* store whole IKE payload - needed for PSK auth */
759   vec_reset_length (sa->last_sa_init_res_packet_data);
760   vec_add (sa->last_sa_init_res_packet_data, ike, len);
761
762   while (p < len && payload != IKEV2_PAYLOAD_NONE)
763     {
764       ike_payload_header_t *ikep = (ike_payload_header_t *) & ike->payload[p];
765       u32 plen = clib_net_to_host_u16 (ikep->length);
766
767       if (plen < sizeof (ike_payload_header_t))
768         return;
769
770       if (payload == IKEV2_PAYLOAD_SA)
771         {
772           ikev2_sa_free_proposal_vector (&sa->r_proposals);
773           sa->r_proposals = ikev2_parse_sa_payload (ikep);
774           if (sa->r_proposals)
775             {
776               ikev2_set_state (sa, IKEV2_STATE_SA_INIT);
777               ike->msgid =
778                 clib_host_to_net_u32 (clib_net_to_host_u32 (ike->msgid) + 1);
779             }
780         }
781       else if (payload == IKEV2_PAYLOAD_KE)
782         {
783           ike_ke_payload_header_t *ke = (ike_ke_payload_header_t *) ikep;
784           sa->dh_group = clib_net_to_host_u16 (ke->dh_group);
785           vec_free (sa->r_dh_data);
786           vec_add (sa->r_dh_data, ke->payload, plen - sizeof (*ke));
787         }
788       else if (payload == IKEV2_PAYLOAD_NONCE)
789         {
790           vec_free (sa->r_nonce);
791           vec_add (sa->r_nonce, ikep->payload, plen - sizeof (*ikep));
792         }
793       else if (payload == IKEV2_PAYLOAD_NOTIFY)
794         {
795           ikev2_notify_t *n = ikev2_parse_notify_payload (ikep);
796           if (n->msg_type == IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP)
797             {
798               u8 *src_sha = ikev2_compute_nat_sha1 (ike->ispi,
799                                                     ike->rspi,
800                                                     clib_net_to_host_u32
801                                                     (sa->raddr.as_u32),
802                                                     udp->src_port);
803               if (clib_memcmp (src_sha, n->data, vec_len (src_sha)))
804                 {
805                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx responder"
806                                    " behind NAT, unsupported", sa->ispi);
807                 }
808               vec_free (src_sha);
809             }
810           else if (n->msg_type ==
811                    IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP)
812             {
813               u8 *dst_sha = ikev2_compute_nat_sha1 (ike->ispi,
814                                                     ike->rspi,
815                                                     sa->iaddr.as_u32,
816                                                     udp->dst_port);
817               if (clib_memcmp (dst_sha, n->data, vec_len (dst_sha)))
818                 {
819                   sa->natt = 1;
820                   ikev2_elog_uint (IKEV2_LOG_DEBUG, "ispi %lx initiator"
821                                    " (self) behind NAT", sa->ispi);
822                 }
823               vec_free (dst_sha);
824             }
825           vec_free (n);
826         }
827       else if (payload == IKEV2_PAYLOAD_VENDOR)
828         {
829           ikev2_parse_vendor_payload (ikep);
830         }
831       else
832         {
833           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
834                            payload);
835           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
836             {
837               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
838               sa->unsupported_cp = payload;
839               return;
840             }
841         }
842
843       payload = ikep->nextpayload;
844       p += plen;
845     }
846 }
847
848 static u8 *
849 ikev2_decrypt_sk_payload (ikev2_sa_t * sa, ike_header_t * ike, u8 * payload,
850                           u32 len)
851 {
852   ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
853   int p = 0;
854   u8 last_payload = 0, *plaintext = 0;
855   u8 *hmac = 0;
856   ike_payload_header_t *ikep = 0;
857   u32 plen = 0;
858   ikev2_sa_transform_t *tr_integ;
859   ikev2_sa_transform_t *tr_encr;
860   tr_integ =
861     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
862   tr_encr =
863     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
864   int is_aead = tr_encr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
865
866   if ((!sa->sk_ar || !sa->sk_ai) && !is_aead)
867     return 0;
868
869   while (p < len &&
870          *payload != IKEV2_PAYLOAD_NONE && last_payload != IKEV2_PAYLOAD_SK)
871     {
872       ikep = (ike_payload_header_t *) & ike->payload[p];
873       plen = clib_net_to_host_u16 (ikep->length);
874
875       if (plen < sizeof (*ikep))
876         return 0;
877
878       if (*payload == IKEV2_PAYLOAD_SK)
879         {
880           last_payload = *payload;
881         }
882       else
883         {
884           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
885                            *payload);
886           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
887             {
888               sa->unsupported_cp = *payload;
889               return 0;
890             }
891         }
892
893       *payload = ikep->nextpayload;
894       p += plen;
895     }
896
897   if (last_payload != IKEV2_PAYLOAD_SK)
898     {
899       ikev2_elog_error ("Last payload must be SK");
900       return 0;
901     }
902
903   if (is_aead)
904     {
905       if (plen < sizeof (*ikep) + IKEV2_GCM_ICV_SIZE)
906         return 0;
907
908       plen -= sizeof (*ikep) + IKEV2_GCM_ICV_SIZE;
909       u8 *aad = (u8 *) ike;
910       u32 aad_len = ikep->payload - aad;
911       u8 *tag = ikep->payload + plen;
912
913       plaintext = ikev2_decrypt_aead_data (ptd, sa, tr_encr, ikep->payload,
914                                            plen, aad, aad_len, tag);
915     }
916   else
917     {
918       if (len < tr_integ->key_trunc)
919         return 0;
920
921       hmac =
922         ikev2_calc_integr (tr_integ, sa->is_initiator ? sa->sk_ar : sa->sk_ai,
923                            (u8 *) ike, len - tr_integ->key_trunc);
924
925       if (plen < sizeof (*ikep) + tr_integ->key_trunc)
926         return 0;
927
928       plen = plen - sizeof (*ikep) - tr_integ->key_trunc;
929
930       if (memcmp (hmac, &ikep->payload[plen], tr_integ->key_trunc))
931         {
932           ikev2_elog_error ("message integrity check failed");
933           vec_free (hmac);
934           return 0;
935         }
936       vec_free (hmac);
937
938       plaintext = ikev2_decrypt_data (ptd, sa, tr_encr, ikep->payload, plen);
939     }
940
941   return plaintext;
942 }
943
944 static_always_inline int
945 ikev2_is_id_equal (ikev2_id_t * i1, ikev2_id_t * i2)
946 {
947   if (i1->type != i2->type)
948     return 0;
949
950   if (vec_len (i1->data) != vec_len (i2->data))
951     return 0;
952
953   if (memcmp (i1->data, i2->data, vec_len (i1->data)))
954     return 0;
955
956   return 1;
957 }
958
959 static void
960 ikev2_initial_contact_cleanup (ikev2_sa_t * sa)
961 {
962   ikev2_main_t *km = &ikev2_main;
963   ikev2_sa_t *tmp;
964   u32 i, *delete = 0;
965   ikev2_child_sa_t *c;
966   u32 thread_index = vlib_get_thread_index ();
967
968   if (!sa->initial_contact)
969     return;
970
971   /* find old IKE SAs with the same authenticated identity */
972   /* *INDENT-OFF* */
973   pool_foreach (tmp, km->per_thread_data[thread_index].sas, ({
974         if (!ikev2_is_id_equal (&tmp->i_id, &sa->i_id)
975             || !ikev2_is_id_equal(&tmp->r_id, &sa->r_id))
976           continue;
977
978         if (sa->rspi != tmp->rspi)
979           vec_add1(delete, tmp - km->per_thread_data[thread_index].sas);
980   }));
981   /* *INDENT-ON* */
982
983   for (i = 0; i < vec_len (delete); i++)
984     {
985       tmp =
986         pool_elt_at_index (km->per_thread_data[thread_index].sas, delete[i]);
987       vec_foreach (c,
988                    tmp->childs) ikev2_delete_tunnel_interface (km->vnet_main,
989                                                                tmp, c);
990       ikev2_delete_sa (tmp);
991     }
992
993   vec_free (delete);
994   sa->initial_contact = 0;
995 }
996
997 static void
998 ikev2_process_auth_req (vlib_main_t * vm, ikev2_sa_t * sa, ike_header_t * ike,
999                         u32 len)
1000 {
1001   ikev2_child_sa_t *first_child_sa;
1002   int p = 0;
1003   u8 payload = ike->nextpayload;
1004   u8 *plaintext = 0;
1005   ike_payload_header_t *ikep;
1006   u32 plen;
1007
1008   ikev2_elog_exchange ("ispi %lx rspi %lx EXCHANGE_IKE_AUTH received "
1009                        "from %d.%d.%d.%d", clib_host_to_net_u64 (ike->ispi),
1010                        clib_host_to_net_u64 (ike->rspi),
1011                        sa->is_initiator ? sa->raddr.as_u32 : sa->
1012                        iaddr.as_u32);
1013
1014   ikev2_calc_keys (sa);
1015
1016   plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len);
1017
1018   if (!plaintext)
1019     {
1020       if (sa->unsupported_cp)
1021         ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
1022       goto cleanup_and_exit;
1023     }
1024
1025   /* select or create 1st child SA */
1026   if (sa->is_initiator)
1027     {
1028       first_child_sa = &sa->childs[0];
1029     }
1030   else
1031     {
1032       ikev2_sa_free_all_child_sa (&sa->childs);
1033       vec_add2 (sa->childs, first_child_sa, 1);
1034     }
1035
1036
1037   /* process encrypted payload */
1038   p = 0;
1039   while (p < vec_len (plaintext) && payload != IKEV2_PAYLOAD_NONE)
1040     {
1041       ikep = (ike_payload_header_t *) & plaintext[p];
1042       plen = clib_net_to_host_u16 (ikep->length);
1043
1044       if (plen < sizeof (ike_payload_header_t))
1045         goto cleanup_and_exit;
1046
1047       if (payload == IKEV2_PAYLOAD_SA)  /* 33 */
1048         {
1049           if (sa->is_initiator)
1050             {
1051               ikev2_sa_free_proposal_vector (&first_child_sa->r_proposals);
1052               first_child_sa->r_proposals = ikev2_parse_sa_payload (ikep);
1053             }
1054           else
1055             {
1056               ikev2_sa_free_proposal_vector (&first_child_sa->i_proposals);
1057               first_child_sa->i_proposals = ikev2_parse_sa_payload (ikep);
1058             }
1059         }
1060       else if (payload == IKEV2_PAYLOAD_IDI)    /* 35 */
1061         {
1062           ike_id_payload_header_t *id = (ike_id_payload_header_t *) ikep;
1063
1064           sa->i_id.type = id->id_type;
1065           vec_free (sa->i_id.data);
1066           vec_add (sa->i_id.data, id->payload, plen - sizeof (*id));
1067         }
1068       else if (payload == IKEV2_PAYLOAD_IDR)    /* 36 */
1069         {
1070           ike_id_payload_header_t *id = (ike_id_payload_header_t *) ikep;
1071
1072           sa->r_id.type = id->id_type;
1073           vec_free (sa->r_id.data);
1074           vec_add (sa->r_id.data, id->payload, plen - sizeof (*id));
1075         }
1076       else if (payload == IKEV2_PAYLOAD_AUTH)   /* 39 */
1077         {
1078           ike_auth_payload_header_t *a = (ike_auth_payload_header_t *) ikep;
1079
1080           if (sa->is_initiator)
1081             {
1082               sa->r_auth.method = a->auth_method;
1083               vec_free (sa->r_auth.data);
1084               vec_add (sa->r_auth.data, a->payload, plen - sizeof (*a));
1085             }
1086           else
1087             {
1088               sa->i_auth.method = a->auth_method;
1089               vec_free (sa->i_auth.data);
1090               vec_add (sa->i_auth.data, a->payload, plen - sizeof (*a));
1091             }
1092         }
1093       else if (payload == IKEV2_PAYLOAD_NOTIFY) /* 41 */
1094         {
1095           ikev2_notify_t *n = ikev2_parse_notify_payload (ikep);
1096           if (n->msg_type == IKEV2_NOTIFY_MSG_INITIAL_CONTACT)
1097             {
1098               sa->initial_contact = 1;
1099             }
1100           vec_free (n);
1101         }
1102       else if (payload == IKEV2_PAYLOAD_VENDOR) /* 43 */
1103         {
1104           ikev2_parse_vendor_payload (ikep);
1105         }
1106       else if (payload == IKEV2_PAYLOAD_TSI)    /* 44 */
1107         {
1108           vec_free (first_child_sa->tsi);
1109           first_child_sa->tsi = ikev2_parse_ts_payload (ikep);
1110         }
1111       else if (payload == IKEV2_PAYLOAD_TSR)    /* 45 */
1112         {
1113           vec_free (first_child_sa->tsr);
1114           first_child_sa->tsr = ikev2_parse_ts_payload (ikep);
1115         }
1116       else
1117         {
1118           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1119                            payload);
1120
1121           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1122             {
1123               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
1124               sa->unsupported_cp = payload;
1125               return;
1126             }
1127         }
1128
1129       payload = ikep->nextpayload;
1130       p += plen;
1131     }
1132
1133 cleanup_and_exit:
1134   vec_free (plaintext);
1135 }
1136
1137 static void
1138 ikev2_process_informational_req (vlib_main_t * vm, ikev2_sa_t * sa,
1139                                  ike_header_t * ike, u32 len)
1140 {
1141   int p = 0;
1142   u8 payload = ike->nextpayload;
1143   u8 *plaintext = 0;
1144   ike_payload_header_t *ikep;
1145   u32 plen;
1146
1147   sa->liveness_retries = 0;
1148   ikev2_elog_exchange ("ispi %lx rspi %lx INFORMATIONAL received "
1149                        "from %d.%d.%d.%d", clib_host_to_net_u64 (ike->ispi),
1150                        clib_host_to_net_u64 (ike->rspi), sa->iaddr.as_u32);
1151
1152   plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len);
1153
1154   if (!plaintext)
1155     goto cleanup_and_exit;
1156
1157   /* process encrypted payload */
1158   p = 0;
1159   while (p < vec_len (plaintext) && payload != IKEV2_PAYLOAD_NONE)
1160     {
1161       ikep = (ike_payload_header_t *) & plaintext[p];
1162       plen = clib_net_to_host_u16 (ikep->length);
1163
1164       if (plen < sizeof (ike_payload_header_t))
1165         goto cleanup_and_exit;
1166
1167       if (payload == IKEV2_PAYLOAD_NOTIFY)      /* 41 */
1168         {
1169           ikev2_notify_t *n = ikev2_parse_notify_payload (ikep);
1170           if (n->msg_type == IKEV2_NOTIFY_MSG_AUTHENTICATION_FAILED)
1171             ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1172           vec_free (n);
1173         }
1174       else if (payload == IKEV2_PAYLOAD_DELETE) /* 42 */
1175         {
1176           sa->del = ikev2_parse_delete_payload (ikep);
1177         }
1178       else if (payload == IKEV2_PAYLOAD_VENDOR) /* 43 */
1179         {
1180           ikev2_parse_vendor_payload (ikep);
1181         }
1182       else
1183         {
1184           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1185                            payload);
1186           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1187             {
1188               sa->unsupported_cp = payload;
1189               return;
1190             }
1191         }
1192
1193       payload = ikep->nextpayload;
1194       p += plen;
1195     }
1196
1197 cleanup_and_exit:
1198   vec_free (plaintext);
1199 }
1200
1201 static void
1202 ikev2_process_create_child_sa_req (vlib_main_t * vm, ikev2_sa_t * sa,
1203                                    ike_header_t * ike, u32 len)
1204 {
1205   int p = 0;
1206   u8 payload = ike->nextpayload;
1207   u8 *plaintext = 0;
1208   u8 rekeying = 0;
1209   u8 nonce[IKEV2_NONCE_SIZE];
1210
1211   ike_payload_header_t *ikep;
1212   u32 plen;
1213   ikev2_notify_t *n = 0;
1214   ikev2_ts_t *tsi = 0;
1215   ikev2_ts_t *tsr = 0;
1216   ikev2_sa_proposal_t *proposal = 0;
1217   ikev2_child_sa_t *child_sa;
1218
1219   ikev2_elog_exchange ("ispi %lx rspi %lx CREATE_CHILD_SA received "
1220                        "from %d.%d.%d.%d", clib_host_to_net_u64 (ike->ispi),
1221                        clib_host_to_net_u64 (ike->rspi), sa->raddr.as_u32);
1222
1223   plaintext = ikev2_decrypt_sk_payload (sa, ike, &payload, len);
1224
1225   if (!plaintext)
1226     goto cleanup_and_exit;
1227
1228   /* process encrypted payload */
1229   p = 0;
1230   while (p < vec_len (plaintext) && payload != IKEV2_PAYLOAD_NONE)
1231     {
1232       ikep = (ike_payload_header_t *) & plaintext[p];
1233       plen = clib_net_to_host_u16 (ikep->length);
1234
1235       if (plen < sizeof (ike_payload_header_t))
1236         goto cleanup_and_exit;
1237
1238       else if (payload == IKEV2_PAYLOAD_SA)
1239         {
1240           proposal = ikev2_parse_sa_payload (ikep);
1241         }
1242       else if (payload == IKEV2_PAYLOAD_NOTIFY)
1243         {
1244           n = ikev2_parse_notify_payload (ikep);
1245           if (n->msg_type == IKEV2_NOTIFY_MSG_REKEY_SA)
1246             {
1247               rekeying = 1;
1248             }
1249         }
1250       else if (payload == IKEV2_PAYLOAD_DELETE)
1251         {
1252           sa->del = ikev2_parse_delete_payload (ikep);
1253         }
1254       else if (payload == IKEV2_PAYLOAD_VENDOR)
1255         {
1256           ikev2_parse_vendor_payload (ikep);
1257         }
1258       else if (payload == IKEV2_PAYLOAD_NONCE)
1259         {
1260           clib_memcpy_fast (nonce, ikep->payload, plen - sizeof (*ikep));
1261         }
1262       else if (payload == IKEV2_PAYLOAD_TSI)
1263         {
1264           tsi = ikev2_parse_ts_payload (ikep);
1265         }
1266       else if (payload == IKEV2_PAYLOAD_TSR)
1267         {
1268           tsr = ikev2_parse_ts_payload (ikep);
1269         }
1270       else
1271         {
1272           ikev2_elog_uint (IKEV2_LOG_ERROR, "Unknown payload! type=%d",
1273                            payload);
1274           if (ikep->flags & IKEV2_PAYLOAD_FLAG_CRITICAL)
1275             {
1276               sa->unsupported_cp = payload;
1277               goto cleanup_and_exit;
1278             }
1279         }
1280
1281       payload = ikep->nextpayload;
1282       p += plen;
1283     }
1284
1285   if (sa->is_initiator && proposal->protocol_id == IKEV2_PROTOCOL_ESP)
1286     {
1287       ikev2_rekey_t *rekey = &sa->rekey[0];
1288       rekey->protocol_id = proposal->protocol_id;
1289       rekey->i_proposal =
1290         ikev2_select_proposal (proposal, IKEV2_PROTOCOL_ESP);
1291       rekey->i_proposal->spi = rekey->spi;
1292       rekey->r_proposal = proposal;
1293       rekey->tsi = tsi;
1294       rekey->tsr = tsr;
1295       /* update Nr */
1296       vec_free (sa->r_nonce);
1297       vec_add (sa->r_nonce, nonce, IKEV2_NONCE_SIZE);
1298       child_sa = ikev2_sa_get_child (sa, rekey->ispi, IKEV2_PROTOCOL_ESP, 1);
1299       if (child_sa)
1300         {
1301           child_sa->rekey_retries = 0;
1302         }
1303     }
1304   else if (rekeying)
1305     {
1306       ikev2_rekey_t *rekey;
1307       child_sa = ikev2_sa_get_child (sa, n->spi, n->protocol_id, 1);
1308       if (!child_sa)
1309         {
1310           ikev2_elog_uint (IKEV2_LOG_ERROR, "child SA spi %lx not found",
1311                            n->spi);
1312           goto cleanup_and_exit;
1313         }
1314       vec_add2 (sa->rekey, rekey, 1);
1315       rekey->protocol_id = n->protocol_id;
1316       rekey->spi = n->spi;
1317       rekey->i_proposal = proposal;
1318       rekey->r_proposal =
1319         ikev2_select_proposal (proposal, IKEV2_PROTOCOL_ESP);
1320       rekey->tsi = tsi;
1321       rekey->tsr = tsr;
1322       /* update Ni */
1323       vec_free (sa->i_nonce);
1324       vec_add (sa->i_nonce, nonce, IKEV2_NONCE_SIZE);
1325       /* generate new Nr */
1326       vec_free (sa->r_nonce);
1327       sa->r_nonce = vec_new (u8, IKEV2_NONCE_SIZE);
1328       RAND_bytes ((u8 *) sa->r_nonce, IKEV2_NONCE_SIZE);
1329     }
1330
1331 cleanup_and_exit:
1332   vec_free (plaintext);
1333   vec_free (n);
1334 }
1335
1336 static u8 *
1337 ikev2_sa_generate_authmsg (ikev2_sa_t * sa, int is_responder)
1338 {
1339   u8 *authmsg = 0;
1340   u8 *data;
1341   u8 *nonce;
1342   ikev2_id_t *id;
1343   u8 *key;
1344   u8 *packet_data;
1345   ikev2_sa_transform_t *tr_prf;
1346
1347   tr_prf =
1348     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1349
1350   if (is_responder)
1351     {
1352       id = &sa->r_id;
1353       key = sa->sk_pr;
1354       nonce = sa->i_nonce;
1355       packet_data = sa->last_sa_init_res_packet_data;
1356     }
1357   else
1358     {
1359       id = &sa->i_id;
1360       key = sa->sk_pi;
1361       nonce = sa->r_nonce;
1362       packet_data = sa->last_sa_init_req_packet_data;
1363     }
1364
1365   data = vec_new (u8, 4);
1366   data[0] = id->type;
1367   vec_append (data, id->data);
1368
1369   u8 *id_hash = ikev2_calc_prf (tr_prf, key, data);
1370   vec_append (authmsg, packet_data);
1371   vec_append (authmsg, nonce);
1372   vec_append (authmsg, id_hash);
1373   vec_free (id_hash);
1374   vec_free (data);
1375
1376   return authmsg;
1377 }
1378
1379 static int
1380 ikev2_ts_cmp (ikev2_ts_t * ts1, ikev2_ts_t * ts2)
1381 {
1382   if (ts1->ts_type == ts2->ts_type && ts1->protocol_id == ts2->protocol_id &&
1383       ts1->start_port == ts2->start_port && ts1->end_port == ts2->end_port &&
1384       ts1->start_addr.as_u32 == ts2->start_addr.as_u32 &&
1385       ts1->end_addr.as_u32 == ts2->end_addr.as_u32)
1386     return 1;
1387
1388   return 0;
1389 }
1390
1391 static void
1392 ikev2_sa_match_ts (ikev2_sa_t * sa)
1393 {
1394   ikev2_main_t *km = &ikev2_main;
1395   ikev2_profile_t *p;
1396   ikev2_ts_t *ts, *p_tsi, *p_tsr, *tsi = 0, *tsr = 0;
1397   ikev2_id_t *id_rem, *id_loc;
1398
1399   /* *INDENT-OFF* */
1400   pool_foreach (p, km->profiles, ({
1401
1402     if (sa->is_initiator)
1403       {
1404         p_tsi = &p->loc_ts;
1405         p_tsr = &p->rem_ts;
1406         id_rem = &sa->r_id;
1407         id_loc = &sa->i_id;
1408       }
1409     else
1410       {
1411         p_tsi = &p->rem_ts;
1412         p_tsr = &p->loc_ts;
1413         id_rem = &sa->i_id;
1414         id_loc = &sa->r_id;
1415       }
1416
1417     /* check id */
1418     if (!ikev2_is_id_equal (&p->rem_id, id_rem)
1419           || !ikev2_is_id_equal (&p->loc_id, id_loc))
1420       continue;
1421
1422     sa->profile_index = p - km->profiles;
1423
1424     vec_foreach(ts, sa->childs[0].tsi)
1425       {
1426         if (ikev2_ts_cmp(p_tsi, ts))
1427           {
1428             vec_add1 (tsi, ts[0]);
1429             break;
1430           }
1431       }
1432
1433     vec_foreach(ts, sa->childs[0].tsr)
1434       {
1435         if (ikev2_ts_cmp(p_tsr, ts))
1436           {
1437             vec_add1 (tsr, ts[0]);
1438             break;
1439           }
1440       }
1441
1442     break;
1443   }));
1444   /* *INDENT-ON* */
1445
1446   if (tsi && tsr)
1447     {
1448       vec_free (sa->childs[0].tsi);
1449       vec_free (sa->childs[0].tsr);
1450       sa->childs[0].tsi = tsi;
1451       sa->childs[0].tsr = tsr;
1452     }
1453   else
1454     {
1455       vec_free (tsi);
1456       vec_free (tsr);
1457       ikev2_set_state (sa, IKEV2_STATE_TS_UNACCEPTABLE);
1458     }
1459 }
1460
1461 static void
1462 ikev2_sa_auth (ikev2_sa_t * sa)
1463 {
1464   ikev2_main_t *km = &ikev2_main;
1465   ikev2_profile_t *p, *sel_p = 0;
1466   u8 *authmsg, *key_pad, *psk = 0, *auth = 0;
1467   ikev2_sa_transform_t *tr_prf;
1468
1469   tr_prf =
1470     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1471
1472   /* only shared key and rsa signature */
1473   if (!(sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC ||
1474         sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG))
1475     {
1476       ikev2_elog_uint (IKEV2_LOG_ERROR,
1477                        "unsupported authentication method %u",
1478                        sa->i_auth.method);
1479       ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1480       return;
1481     }
1482
1483   key_pad = format (0, "%s", IKEV2_KEY_PAD);
1484   authmsg = ikev2_sa_generate_authmsg (sa, sa->is_initiator);
1485
1486   ikev2_id_t *id_rem, *id_loc;
1487   ikev2_auth_t *sa_auth;
1488
1489   if (sa->is_initiator)
1490     {
1491       id_rem = &sa->r_id;
1492       id_loc = &sa->i_id;
1493       sa_auth = &sa->r_auth;
1494     }
1495   else
1496     {
1497       id_rem = &sa->i_id;
1498       id_loc = &sa->r_id;
1499       sa_auth = &sa->i_auth;
1500     }
1501
1502   /* *INDENT-OFF* */
1503   pool_foreach (p, km->profiles, ({
1504
1505     /* check id */
1506     if (!ikev2_is_id_equal (&p->rem_id, id_rem)
1507           || !ikev2_is_id_equal (&p->loc_id, id_loc))
1508       continue;
1509
1510     if (sa_auth->method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1511       {
1512         if (!p->auth.data ||
1513              p->auth.method != IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1514           continue;
1515
1516         psk = ikev2_calc_prf(tr_prf, p->auth.data, key_pad);
1517         auth = ikev2_calc_prf(tr_prf, psk, authmsg);
1518
1519         if (!memcmp(auth, sa_auth->data, vec_len(sa_auth->data)))
1520           {
1521             ikev2_set_state(sa, IKEV2_STATE_AUTHENTICATED);
1522             vec_free(auth);
1523             sel_p = p;
1524             break;
1525           }
1526
1527       }
1528     else if (sa_auth->method == IKEV2_AUTH_METHOD_RSA_SIG)
1529       {
1530         if (p->auth.method != IKEV2_AUTH_METHOD_RSA_SIG)
1531           continue;
1532
1533         if (ikev2_verify_sign(p->auth.key, sa_auth->data, authmsg) == 1)
1534           {
1535             ikev2_set_state(sa, IKEV2_STATE_AUTHENTICATED);
1536             sel_p = p;
1537             break;
1538           }
1539       }
1540
1541     vec_free(auth);
1542     vec_free(psk);
1543   }));
1544   /* *INDENT-ON* */
1545
1546   if (sel_p)
1547     {
1548       sa->udp_encap = sel_p->udp_encap;
1549       sa->ipsec_over_udp_port = sel_p->ipsec_over_udp_port;
1550     }
1551   vec_free (authmsg);
1552
1553   if (sa->state == IKEV2_STATE_AUTHENTICATED)
1554     {
1555       if (!sa->is_initiator)
1556         {
1557           vec_free (sa->r_id.data);
1558           sa->r_id.data = vec_dup (sel_p->loc_id.data);
1559           sa->r_id.type = sel_p->loc_id.type;
1560           sa->i_id.data = vec_dup (sel_p->rem_id.data);
1561           sa->i_id.type = sel_p->rem_id.type;
1562
1563           /* generate our auth data */
1564           authmsg = ikev2_sa_generate_authmsg (sa, 1);
1565           if (sel_p->auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1566             {
1567               sa->r_auth.data = ikev2_calc_prf (tr_prf, psk, authmsg);
1568               sa->r_auth.method = IKEV2_AUTH_METHOD_SHARED_KEY_MIC;
1569             }
1570           else if (sel_p->auth.method == IKEV2_AUTH_METHOD_RSA_SIG)
1571             {
1572               sa->r_auth.data = ikev2_calc_sign (km->pkey, authmsg);
1573               sa->r_auth.method = IKEV2_AUTH_METHOD_RSA_SIG;
1574             }
1575           vec_free (authmsg);
1576
1577           /* select transforms for 1st child sa */
1578           ikev2_sa_free_proposal_vector (&sa->childs[0].r_proposals);
1579           sa->childs[0].r_proposals =
1580             ikev2_select_proposal (sa->childs[0].i_proposals,
1581                                    IKEV2_PROTOCOL_ESP);
1582
1583           if (~0 != sel_p->tun_itf)
1584             {
1585               sa->is_tun_itf_set = 1;
1586               sa->tun_itf = sel_p->tun_itf;
1587             }
1588         }
1589     }
1590   else
1591     {
1592       ikev2_elog_uint (IKEV2_LOG_ERROR, "authentication failed, no matching "
1593                        "profile found! ispi %lx", sa->ispi);
1594       ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1595     }
1596   vec_free (psk);
1597   vec_free (key_pad);
1598 }
1599
1600
1601 static void
1602 ikev2_sa_auth_init (ikev2_sa_t * sa)
1603 {
1604   ikev2_main_t *km = &ikev2_main;
1605   u8 *authmsg, *key_pad, *psk = 0;
1606   ikev2_sa_transform_t *tr_prf;
1607
1608   tr_prf =
1609     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_PRF);
1610
1611   /* only shared key and rsa signature */
1612   if (!(sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC ||
1613         sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG))
1614     {
1615       ikev2_elog_uint (IKEV2_LOG_ERROR,
1616                        "unsupported authentication method %u",
1617                        sa->i_auth.method);
1618       ikev2_set_state (sa, IKEV2_STATE_AUTH_FAILED);
1619       return;
1620     }
1621
1622   key_pad = format (0, "%s", IKEV2_KEY_PAD);
1623   authmsg = ikev2_sa_generate_authmsg (sa, 0);
1624   psk = ikev2_calc_prf (tr_prf, sa->i_auth.data, key_pad);
1625
1626   if (sa->i_auth.method == IKEV2_AUTH_METHOD_SHARED_KEY_MIC)
1627     {
1628       sa->i_auth.data = ikev2_calc_prf (tr_prf, psk, authmsg);
1629       sa->i_auth.method = IKEV2_AUTH_METHOD_SHARED_KEY_MIC;
1630     }
1631   else if (sa->i_auth.method == IKEV2_AUTH_METHOD_RSA_SIG)
1632     {
1633       sa->i_auth.data = ikev2_calc_sign (km->pkey, authmsg);
1634       sa->i_auth.method = IKEV2_AUTH_METHOD_RSA_SIG;
1635     }
1636
1637   vec_free (psk);
1638   vec_free (key_pad);
1639   vec_free (authmsg);
1640 }
1641
1642 static u32
1643 ikev2_mk_local_sa_id (u32 sai, u32 ci, u32 ti)
1644 {
1645   return (0x80000000 | (ti << 24) | (sai << 12) | ci);
1646 }
1647
1648 static u32
1649 ikev2_mk_remote_sa_id (u32 sai, u32 ci, u32 ti)
1650 {
1651   return (0xc0000000 | (ti << 24) | (sai << 12) | ci);
1652 }
1653
1654 typedef struct
1655 {
1656   u32 sw_if_index;
1657   u32 salt_local;
1658   u32 salt_remote;
1659   u32 local_sa_id;
1660   u32 remote_sa_id;
1661   ipsec_sa_flags_t flags;
1662   u32 local_spi;
1663   u32 remote_spi;
1664   ipsec_crypto_alg_t encr_type;
1665   ipsec_integ_alg_t integ_type;
1666   ip46_address_t local_ip;
1667   ip46_address_t remote_ip;
1668   ipsec_key_t loc_ckey, rem_ckey, loc_ikey, rem_ikey;
1669   u8 is_rekey;
1670   u32 old_remote_sa_id;
1671   u16 ipsec_over_udp_port;
1672   u16 src_port;
1673   u16 dst_port;
1674 } ikev2_add_ipsec_tunnel_args_t;
1675
1676 static void
1677 ikev2_add_tunnel_from_main (ikev2_add_ipsec_tunnel_args_t * a)
1678 {
1679   ikev2_main_t *km = &ikev2_main;
1680   u32 sw_if_index;
1681   int rv = 0;
1682
1683   if (~0 == a->sw_if_index)
1684     {
1685       /* no tunnel associated with the SA/profile - create a new one */
1686       rv = ipip_add_tunnel (IPIP_TRANSPORT_IP4, ~0,
1687                             &a->local_ip, &a->remote_ip, 0,
1688                             TUNNEL_ENCAP_DECAP_FLAG_NONE, IP_DSCP_CS0,
1689                             TUNNEL_MODE_P2P, &sw_if_index);
1690
1691       if (rv == VNET_API_ERROR_IF_ALREADY_EXISTS)
1692         {
1693           if (hash_get (km->sw_if_indices, sw_if_index))
1694             /* interface is managed by IKE; proceed with updating SAs */
1695             rv = 0;
1696         }
1697       hash_set1 (km->sw_if_indices, sw_if_index);
1698     }
1699   else
1700     {
1701       sw_if_index = a->sw_if_index;
1702       vnet_sw_interface_admin_up (vnet_get_main (), sw_if_index);
1703     }
1704
1705   if (rv)
1706     {
1707       ikev2_elog_peers (IKEV2_LOG_ERROR, "installing ipip tunnel failed! "
1708                         "loc:%d.%d.%d.%d rem:%d.%d.%d.%d",
1709                         a->local_ip.ip4.as_u32, a->remote_ip.ip4.as_u32);
1710       return;
1711     }
1712
1713   u32 *sas_in = NULL;
1714   vec_add1 (sas_in, a->remote_sa_id);
1715   if (a->is_rekey)
1716     {
1717       ipsec_tun_protect_del (sw_if_index, NULL);
1718
1719       /* replace local SA immediately */
1720       ipsec_sa_unlock_id (a->local_sa_id);
1721
1722       /* keep the old sa */
1723       vec_add1 (sas_in, a->old_remote_sa_id);
1724     }
1725
1726   rv |= ipsec_sa_add_and_lock (a->local_sa_id,
1727                                a->local_spi,
1728                                IPSEC_PROTOCOL_ESP, a->encr_type,
1729                                &a->loc_ckey, a->integ_type, &a->loc_ikey,
1730                                a->flags, 0, a->salt_local, &a->local_ip,
1731                                &a->remote_ip, NULL, a->src_port, a->dst_port);
1732   rv |= ipsec_sa_add_and_lock (a->remote_sa_id, a->remote_spi,
1733                                IPSEC_PROTOCOL_ESP, a->encr_type, &a->rem_ckey,
1734                                a->integ_type, &a->rem_ikey,
1735                                (a->flags | IPSEC_SA_FLAG_IS_INBOUND), 0,
1736                                a->salt_remote, &a->remote_ip,
1737                                &a->local_ip, NULL, a->ipsec_over_udp_port,
1738                                a->ipsec_over_udp_port);
1739
1740   rv |= ipsec_tun_protect_update (sw_if_index, NULL, a->local_sa_id, sas_in);
1741 }
1742
1743 static int
1744 ikev2_create_tunnel_interface (vlib_main_t * vm,
1745                                u32 thread_index,
1746                                ikev2_sa_t * sa,
1747                                ikev2_child_sa_t * child, u32 sa_index,
1748                                u32 child_index, u8 is_rekey)
1749 {
1750   ikev2_main_t *km = &ikev2_main;
1751   ipsec_crypto_alg_t encr_type;
1752   ipsec_integ_alg_t integ_type;
1753   ikev2_profile_t *p = 0;
1754   ikev2_sa_transform_t *tr;
1755   ikev2_sa_proposal_t *proposals;
1756   u8 is_aead = 0;
1757   ikev2_add_ipsec_tunnel_args_t a;
1758
1759   clib_memset (&a, 0, sizeof (a));
1760
1761   if (!child->r_proposals)
1762     {
1763       ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1764       return 1;
1765     }
1766
1767   if (sa->is_initiator)
1768     {
1769       ip46_address_set_ip4 (&a.local_ip, &sa->iaddr);
1770       ip46_address_set_ip4 (&a.remote_ip, &sa->raddr);
1771       proposals = child->r_proposals;
1772       a.local_spi = child->r_proposals[0].spi;
1773       a.remote_spi = child->i_proposals[0].spi;
1774     }
1775   else
1776     {
1777       ip46_address_set_ip4 (&a.local_ip, &sa->raddr);
1778       ip46_address_set_ip4 (&a.remote_ip, &sa->iaddr);
1779       proposals = child->i_proposals;
1780       a.local_spi = child->i_proposals[0].spi;
1781       a.remote_spi = child->r_proposals[0].spi;
1782     }
1783
1784   a.flags = IPSEC_SA_FLAG_USE_ANTI_REPLAY;
1785   if (sa->udp_encap)
1786     {
1787       a.flags |= IPSEC_SA_FLAG_IS_TUNNEL;
1788       a.flags |= IPSEC_SA_FLAG_UDP_ENCAP;
1789     }
1790   if (sa->natt)
1791     a.flags |= IPSEC_SA_FLAG_UDP_ENCAP;
1792   a.is_rekey = is_rekey;
1793
1794   tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_ESN);
1795   if (tr && tr->esn_type)
1796     a.flags |= IPSEC_SA_FLAG_USE_ESN;
1797
1798   tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_ENCR);
1799   if (tr)
1800     {
1801       if (tr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_CBC && tr->key_len)
1802         {
1803           switch (tr->key_len)
1804             {
1805             case 16:
1806               encr_type = IPSEC_CRYPTO_ALG_AES_CBC_128;
1807               break;
1808             case 24:
1809               encr_type = IPSEC_CRYPTO_ALG_AES_CBC_192;
1810               break;
1811             case 32:
1812               encr_type = IPSEC_CRYPTO_ALG_AES_CBC_256;
1813               break;
1814             default:
1815               ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1816               return 1;
1817               break;
1818             }
1819         }
1820       else if (tr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16
1821                && tr->key_len)
1822         {
1823           switch (tr->key_len)
1824             {
1825             case 16:
1826               encr_type = IPSEC_CRYPTO_ALG_AES_GCM_128;
1827               break;
1828             case 24:
1829               encr_type = IPSEC_CRYPTO_ALG_AES_GCM_192;
1830               break;
1831             case 32:
1832               encr_type = IPSEC_CRYPTO_ALG_AES_GCM_256;
1833               break;
1834             default:
1835               ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1836               return 1;
1837               break;
1838             }
1839           is_aead = 1;
1840         }
1841       else
1842         {
1843           ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1844           return 1;
1845         }
1846     }
1847   else
1848     {
1849       ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1850       return 1;
1851     }
1852   a.encr_type = encr_type;
1853
1854   if (!is_aead)
1855     {
1856       tr = ikev2_sa_get_td_for_type (proposals, IKEV2_TRANSFORM_TYPE_INTEG);
1857       if (tr)
1858         {
1859           switch (tr->integ_type)
1860             {
1861             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_256_128:
1862               integ_type = IPSEC_INTEG_ALG_SHA_256_128;
1863               break;
1864             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_384_192:
1865               integ_type = IPSEC_INTEG_ALG_SHA_384_192;
1866               break;
1867             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA2_512_256:
1868               integ_type = IPSEC_INTEG_ALG_SHA_512_256;
1869               break;
1870             case IKEV2_TRANSFORM_INTEG_TYPE_AUTH_HMAC_SHA1_96:
1871               integ_type = IPSEC_INTEG_ALG_SHA1_96;
1872               break;
1873             default:
1874               ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1875               return 1;
1876             }
1877         }
1878       else
1879         {
1880           ikev2_set_state (sa, IKEV2_STATE_NO_PROPOSAL_CHOSEN);
1881           return 1;
1882         }
1883     }
1884   else
1885     {
1886       integ_type = IPSEC_INTEG_ALG_NONE;
1887     }
1888
1889   a.integ_type = integ_type;
1890   ikev2_calc_child_keys (sa, child);
1891
1892   if (sa->is_initiator)
1893     {
1894       ipsec_mk_key (&a.loc_ikey, child->sk_ai, vec_len (child->sk_ai));
1895       ipsec_mk_key (&a.rem_ikey, child->sk_ar, vec_len (child->sk_ar));
1896       ipsec_mk_key (&a.loc_ckey, child->sk_ei, vec_len (child->sk_ei));
1897       ipsec_mk_key (&a.rem_ckey, child->sk_er, vec_len (child->sk_er));
1898       if (is_aead)
1899         {
1900           a.salt_remote = child->salt_er;
1901           a.salt_local = child->salt_ei;
1902         }
1903       a.dst_port = a.src_port = sa->ipsec_over_udp_port;
1904     }
1905   else
1906     {
1907       ipsec_mk_key (&a.loc_ikey, child->sk_ar, vec_len (child->sk_ar));
1908       ipsec_mk_key (&a.rem_ikey, child->sk_ai, vec_len (child->sk_ai));
1909       ipsec_mk_key (&a.loc_ckey, child->sk_er, vec_len (child->sk_er));
1910       ipsec_mk_key (&a.rem_ckey, child->sk_ei, vec_len (child->sk_ei));
1911       if (is_aead)
1912         {
1913           a.salt_remote = child->salt_ei;
1914           a.salt_local = child->salt_er;
1915         }
1916       a.dst_port = sa->natt ? sa->dst_port : sa->ipsec_over_udp_port;
1917       a.src_port = sa->ipsec_over_udp_port;
1918     }
1919
1920   if (sa->is_initiator && sa->profile_index != ~0)
1921     p = pool_elt_at_index (km->profiles, sa->profile_index);
1922
1923   if (p && p->lifetime)
1924     {
1925       child->time_to_expiration = vlib_time_now (vm) + p->lifetime;
1926       if (p->lifetime_jitter)
1927         {
1928           // This is not much better than rand(3), which Coverity warns
1929           // is unsuitable for security applications; random_u32 is
1930           // however fast. If this perturbance to the expiration time
1931           // needs to use a better RNG then we may need to use something
1932           // like /dev/urandom which has significant overhead.
1933           u32 rnd = (u32) (vlib_time_now (vm) * 1e6);
1934           rnd = random_u32 (&rnd);
1935
1936           child->time_to_expiration += 1 + (rnd % p->lifetime_jitter);
1937         }
1938     }
1939
1940   if (thread_index & 0xffffffc0)
1941     ikev2_elog_error ("error: thread index exceeds max range 0x3f!");
1942
1943   if (child_index & 0xfffff000 || sa_index & 0xfffff000)
1944     ikev2_elog_error ("error: sa/child index exceeds max range 0xfff!");
1945
1946   child->local_sa_id =
1947     a.local_sa_id =
1948     ikev2_mk_local_sa_id (sa_index, child_index, thread_index);
1949
1950   u32 remote_sa_id = ikev2_mk_remote_sa_id (sa_index, child_index,
1951                                             thread_index);
1952
1953   if (is_rekey)
1954     {
1955       /* create a new remote SA ID to keep the old SA for a bit longer
1956        * so the peer has some time to swap their SAs */
1957
1958       /* use most significat bit of child index part in id */
1959       u32 mask = 0x800;
1960       if (sa->current_remote_id_mask)
1961         {
1962           sa->old_remote_id = a.old_remote_sa_id = remote_sa_id | mask;
1963           sa->current_remote_id_mask = 0;
1964         }
1965       else
1966         {
1967           sa->old_remote_id = a.old_remote_sa_id = remote_sa_id;
1968           sa->current_remote_id_mask = mask;
1969           remote_sa_id |= mask;
1970         }
1971       sa->old_id_expiration = 3.0;
1972       sa->old_remote_id_present = 1;
1973     }
1974
1975   child->remote_sa_id = a.remote_sa_id = remote_sa_id;
1976
1977   a.sw_if_index = (sa->is_tun_itf_set ? sa->tun_itf : ~0);
1978   a.ipsec_over_udp_port = sa->ipsec_over_udp_port;
1979
1980   vl_api_rpc_call_main_thread (ikev2_add_tunnel_from_main,
1981                                (u8 *) & a, sizeof (a));
1982   return 0;
1983 }
1984
1985 typedef struct
1986 {
1987   ip46_address_t local_ip;
1988   ip46_address_t remote_ip;
1989   u32 remote_sa_id;
1990   u32 local_sa_id;
1991   u32 sw_if_index;
1992 } ikev2_del_ipsec_tunnel_args_t;
1993
1994 static_always_inline u32
1995 ikev2_flip_alternate_sa_bit (u32 id)
1996 {
1997   u32 mask = 0x800;
1998   if (mask & id)
1999     return id & ~mask;
2000   return id | mask;
2001 }
2002
2003 static void
2004 ikev2_del_tunnel_from_main (ikev2_del_ipsec_tunnel_args_t * a)
2005 {
2006   ikev2_main_t *km = &ikev2_main;
2007   ipip_tunnel_t *ipip = NULL;
2008   u32 sw_if_index;
2009
2010   if (~0 == a->sw_if_index)
2011     {
2012     /* *INDENT-OFF* */
2013     ipip_tunnel_key_t key = {
2014       .src = a->local_ip,
2015       .dst = a->remote_ip,
2016       .transport = IPIP_TRANSPORT_IP4,
2017       .fib_index = 0,
2018     };
2019     /* *INDENT-ON* */
2020
2021       ipip = ipip_tunnel_db_find (&key);
2022
2023       if (ipip)
2024         {
2025           sw_if_index = ipip->sw_if_index;
2026           hash_unset (km->sw_if_indices, ipip->sw_if_index);
2027         }
2028       else
2029         sw_if_index = ~0;
2030     }
2031   else
2032     {
2033       sw_if_index = a->sw_if_index;
2034       vnet_sw_interface_admin_down (vnet_get_main (), sw_if_index);
2035     }
2036
2037   if (~0 != sw_if_index)
2038     ipsec_tun_protect_del (sw_if_index, NULL);
2039
2040   ipsec_sa_unlock_id (a->remote_sa_id);
2041   ipsec_sa_unlock_id (a->local_sa_id);
2042   ipsec_sa_unlock_id (ikev2_flip_alternate_sa_bit (a->remote_sa_id));
2043
2044   if (ipip)
2045     ipip_del_tunnel (ipip->sw_if_index);
2046 }
2047
2048 static int
2049 ikev2_delete_tunnel_interface (vnet_main_t * vnm, ikev2_sa_t * sa,
2050                                ikev2_child_sa_t * child)
2051 {
2052   ikev2_del_ipsec_tunnel_args_t a;
2053
2054   clib_memset (&a, 0, sizeof (a));
2055
2056   if (sa->is_initiator)
2057     {
2058       ip46_address_set_ip4 (&a.local_ip, &sa->iaddr);
2059       ip46_address_set_ip4 (&a.remote_ip, &sa->raddr);
2060     }
2061   else
2062     {
2063       ip46_address_set_ip4 (&a.local_ip, &sa->raddr);
2064       ip46_address_set_ip4 (&a.remote_ip, &sa->iaddr);
2065     }
2066
2067   a.remote_sa_id = child->remote_sa_id;
2068   a.local_sa_id = child->local_sa_id;
2069   a.sw_if_index = (sa->is_tun_itf_set ? sa->tun_itf : ~0);
2070
2071   vl_api_rpc_call_main_thread (ikev2_del_tunnel_from_main, (u8 *) & a,
2072                                sizeof (a));
2073   return 0;
2074 }
2075
2076 static u32
2077 ikev2_generate_message (ikev2_sa_t * sa, ike_header_t * ike, void *user,
2078                         udp_header_t * udp)
2079 {
2080   v8 *integ = 0;
2081   ike_payload_header_t *ph;
2082   u16 plen;
2083   u32 tlen = 0;
2084
2085   ikev2_sa_transform_t *tr_encr, *tr_integ;
2086   tr_encr =
2087     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_ENCR);
2088   tr_integ =
2089     ikev2_sa_get_td_for_type (sa->r_proposals, IKEV2_TRANSFORM_TYPE_INTEG);
2090
2091   ikev2_payload_chain_t *chain = 0;
2092   ikev2_payload_new_chain (chain);
2093
2094   if (ike->exchange == IKEV2_EXCHANGE_SA_INIT)
2095     {
2096       if (sa->r_proposals == 0)
2097         {
2098           ikev2_payload_add_notify (chain,
2099                                     IKEV2_NOTIFY_MSG_NO_PROPOSAL_CHOSEN, 0);
2100           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2101         }
2102       else if (sa->dh_group == IKEV2_TRANSFORM_DH_TYPE_NONE)
2103         {
2104           u8 *data = vec_new (u8, 2);
2105           ikev2_sa_transform_t *tr_dh;
2106           tr_dh =
2107             ikev2_sa_get_td_for_type (sa->r_proposals,
2108                                       IKEV2_TRANSFORM_TYPE_DH);
2109           ASSERT (tr_dh && tr_dh->dh_type);
2110
2111           data[0] = (tr_dh->dh_type >> 8) & 0xff;
2112           data[1] = (tr_dh->dh_type) & 0xff;
2113
2114           ikev2_payload_add_notify (chain,
2115                                     IKEV2_NOTIFY_MSG_INVALID_KE_PAYLOAD,
2116                                     data);
2117           vec_free (data);
2118           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2119         }
2120       else if (sa->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2121         {
2122           u8 *data = vec_new (u8, 1);
2123
2124           data[0] = sa->unsupported_cp;
2125           ikev2_payload_add_notify (chain,
2126                                     IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2127                                     data);
2128           vec_free (data);
2129         }
2130       else
2131         {
2132           ASSERT (udp);
2133
2134           ike->rspi = clib_host_to_net_u64 (sa->rspi);
2135           ikev2_payload_add_sa (chain, sa->r_proposals);
2136           ikev2_payload_add_ke (chain, sa->dh_group, sa->r_dh_data);
2137           ikev2_payload_add_nonce (chain, sa->r_nonce);
2138
2139           u8 *nat_detection_sha1 =
2140             ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
2141                                     clib_host_to_net_u64 (sa->rspi),
2142                                     clib_host_to_net_u32 (sa->raddr.as_u32),
2143                                     udp->dst_port);
2144           ikev2_payload_add_notify (chain,
2145                                     IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
2146                                     nat_detection_sha1);
2147           vec_free (nat_detection_sha1);
2148           nat_detection_sha1 =
2149             ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
2150                                     clib_host_to_net_u64 (sa->rspi),
2151                                     sa->iaddr.as_u32, udp->src_port);
2152           ikev2_payload_add_notify (chain,
2153                                     IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
2154                                     nat_detection_sha1);
2155           vec_free (nat_detection_sha1);
2156         }
2157     }
2158   else if (ike->exchange == IKEV2_EXCHANGE_IKE_AUTH)
2159     {
2160       if (sa->state == IKEV2_STATE_AUTHENTICATED)
2161         {
2162           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2163           ikev2_payload_add_id (chain, &sa->i_id, IKEV2_PAYLOAD_IDI);
2164           ikev2_payload_add_auth (chain, &sa->r_auth);
2165           ikev2_payload_add_sa (chain, sa->childs[0].r_proposals);
2166           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2167           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2168         }
2169       else if (sa->state == IKEV2_STATE_AUTH_FAILED)
2170         {
2171           ikev2_payload_add_notify (chain,
2172                                     IKEV2_NOTIFY_MSG_AUTHENTICATION_FAILED,
2173                                     0);
2174           ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2175         }
2176       else if (sa->state == IKEV2_STATE_TS_UNACCEPTABLE)
2177         {
2178           ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_TS_UNACCEPTABLE,
2179                                     0);
2180           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2181           ikev2_payload_add_auth (chain, &sa->r_auth);
2182         }
2183       else if (sa->state == IKEV2_STATE_NO_PROPOSAL_CHOSEN)
2184         {
2185           ikev2_payload_add_notify (chain,
2186                                     IKEV2_NOTIFY_MSG_NO_PROPOSAL_CHOSEN, 0);
2187           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2188           ikev2_payload_add_auth (chain, &sa->r_auth);
2189           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2190           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2191         }
2192       else if (sa->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2193         {
2194           u8 *data = vec_new (u8, 1);
2195
2196           data[0] = sa->unsupported_cp;
2197           ikev2_payload_add_notify (chain,
2198                                     IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2199                                     data);
2200           vec_free (data);
2201         }
2202       else if (sa->state == IKEV2_STATE_SA_INIT)
2203         {
2204           ikev2_payload_add_id (chain, &sa->i_id, IKEV2_PAYLOAD_IDI);
2205           ikev2_payload_add_id (chain, &sa->r_id, IKEV2_PAYLOAD_IDR);
2206           ikev2_payload_add_auth (chain, &sa->i_auth);
2207           ikev2_payload_add_sa (chain, sa->childs[0].i_proposals);
2208           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2209           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2210           ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_INITIAL_CONTACT,
2211                                     0);
2212         }
2213       else
2214         {
2215           ikev2_set_state (sa, IKEV2_STATE_DELETED);
2216           goto done;
2217         }
2218     }
2219   else if (ike->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
2220     {
2221       /* if pending delete */
2222       if (sa->del)
2223         {
2224           if (sa->del[0].protocol_id == IKEV2_PROTOCOL_IKE)
2225             {
2226               if (sa->is_initiator)
2227                 ikev2_payload_add_delete (chain, sa->del);
2228
2229               /* The response to a request that deletes the IKE SA is an empty
2230                  INFORMATIONAL response. */
2231               ikev2_set_state (sa, IKEV2_STATE_NOTIFY_AND_DELETE);
2232             }
2233           /* The response to a request that deletes ESP or AH SAs will contain
2234              delete payloads for the paired SAs going in the other direction. */
2235           else
2236             {
2237               ikev2_payload_add_delete (chain, sa->del);
2238             }
2239           vec_free (sa->del);
2240           sa->del = 0;
2241         }
2242       /* received N(AUTHENTICATION_FAILED) */
2243       else if (sa->state == IKEV2_STATE_AUTH_FAILED)
2244         {
2245           ikev2_set_state (sa, IKEV2_STATE_DELETED);
2246           goto done;
2247         }
2248       /* received unsupported critical payload */
2249       else if (sa->unsupported_cp)
2250         {
2251           u8 *data = vec_new (u8, 1);
2252
2253           data[0] = sa->unsupported_cp;
2254           ikev2_payload_add_notify (chain,
2255                                     IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2256                                     data);
2257           vec_free (data);
2258           sa->unsupported_cp = 0;
2259         }
2260       /* else send empty response */
2261     }
2262   else if (ike->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
2263     {
2264       if (sa->is_initiator)
2265         {
2266
2267           ikev2_sa_proposal_t *proposals = (ikev2_sa_proposal_t *) user;
2268           ikev2_notify_t notify;
2269           u8 *data = vec_new (u8, 4);
2270           clib_memset (&notify, 0, sizeof (notify));
2271           notify.protocol_id = IKEV2_PROTOCOL_ESP;
2272           notify.spi = sa->childs[0].i_proposals->spi;
2273           *(u32 *) data = clib_host_to_net_u32 (notify.spi);
2274
2275           ikev2_payload_add_sa (chain, proposals);
2276           ikev2_payload_add_nonce (chain, sa->i_nonce);
2277           ikev2_payload_add_ts (chain, sa->childs[0].tsi, IKEV2_PAYLOAD_TSI);
2278           ikev2_payload_add_ts (chain, sa->childs[0].tsr, IKEV2_PAYLOAD_TSR);
2279           ikev2_payload_add_notify_2 (chain, IKEV2_NOTIFY_MSG_REKEY_SA, data,
2280                                       &notify);
2281
2282           vec_free (data);
2283         }
2284       else
2285         {
2286           if (vec_len (sa->rekey) > 0)
2287             {
2288               ikev2_payload_add_sa (chain, sa->rekey[0].r_proposal);
2289               ikev2_payload_add_nonce (chain, sa->r_nonce);
2290               ikev2_payload_add_ts (chain, sa->rekey[0].tsi,
2291                                     IKEV2_PAYLOAD_TSI);
2292               ikev2_payload_add_ts (chain, sa->rekey[0].tsr,
2293                                     IKEV2_PAYLOAD_TSR);
2294               vec_del1 (sa->rekey, 0);
2295             }
2296           else if (sa->unsupported_cp)
2297             {
2298               u8 *data = vec_new (u8, 1);
2299
2300               data[0] = sa->unsupported_cp;
2301               ikev2_payload_add_notify (chain,
2302                                         IKEV2_NOTIFY_MSG_UNSUPPORTED_CRITICAL_PAYLOAD,
2303                                         data);
2304               vec_free (data);
2305               sa->unsupported_cp = 0;
2306             }
2307           else
2308             {
2309               ikev2_payload_add_notify (chain,
2310                                         IKEV2_NOTIFY_MSG_NO_ADDITIONAL_SAS,
2311                                         0);
2312             }
2313         }
2314     }
2315
2316   /* IKEv2 header */
2317   ike->version = IKE_VERSION_2;
2318   ike->nextpayload = IKEV2_PAYLOAD_SK;
2319   tlen = sizeof (*ike);
2320   if (sa->is_initiator)
2321     {
2322       ike->flags = IKEV2_HDR_FLAG_INITIATOR;
2323       sa->last_init_msg_id = clib_net_to_host_u32 (ike->msgid);
2324     }
2325   else
2326     {
2327       ike->flags = IKEV2_HDR_FLAG_RESPONSE;
2328     }
2329
2330
2331   if (ike->exchange == IKEV2_EXCHANGE_SA_INIT)
2332     {
2333       tlen += vec_len (chain->data);
2334       ike->nextpayload = chain->first_payload_type;
2335       ike->length = clib_host_to_net_u32 (tlen);
2336       clib_memcpy_fast (ike->payload, chain->data, vec_len (chain->data));
2337
2338       /* store whole IKE payload - needed for PSK auth */
2339       vec_reset_length (sa->last_sa_init_res_packet_data);
2340       vec_add (sa->last_sa_init_res_packet_data, ike, tlen);
2341     }
2342   else
2343     {
2344       ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
2345       ikev2_payload_chain_add_padding (chain, tr_encr->block_size);
2346
2347       /* SK payload */
2348       plen = sizeof (*ph);
2349       ph = (ike_payload_header_t *) & ike->payload[0];
2350       ph->nextpayload = chain->first_payload_type;
2351       ph->flags = 0;
2352       int is_aead =
2353         tr_encr->encr_type == IKEV2_TRANSFORM_ENCR_TYPE_AES_GCM_16;
2354       int iv_len = is_aead ? IKEV2_GCM_IV_SIZE : tr_encr->block_size;
2355       plen += vec_len (chain->data) + iv_len;
2356
2357       /* add space for hmac/tag */
2358       if (tr_integ)
2359         plen += tr_integ->key_trunc;
2360       else
2361         plen += IKEV2_GCM_ICV_SIZE;
2362       tlen += plen;
2363
2364       /* payload and total length */
2365       ph->length = clib_host_to_net_u16 (plen);
2366       ike->length = clib_host_to_net_u32 (tlen);
2367
2368       if (is_aead)
2369         {
2370           ikev2_encrypt_aead_data (ptd, sa, tr_encr, chain->data,
2371                                    ph->payload, (u8 *) ike,
2372                                    sizeof (*ike) + sizeof (*ph),
2373                                    ph->payload + plen - sizeof (*ph) -
2374                                    IKEV2_GCM_ICV_SIZE);
2375         }
2376       else
2377         {
2378           ikev2_encrypt_data (ptd, sa, tr_encr, chain->data, ph->payload);
2379           integ =
2380             ikev2_calc_integr (tr_integ,
2381                                sa->is_initiator ? sa->sk_ai : sa->sk_ar,
2382                                (u8 *) ike, tlen - tr_integ->key_trunc);
2383           clib_memcpy_fast (ike->payload + tlen - tr_integ->key_trunc -
2384                             sizeof (*ike), integ, tr_integ->key_trunc);
2385         }
2386
2387       /* store whole IKE payload - needed for retransmit */
2388       vec_reset_length (sa->last_res_packet_data);
2389       vec_add (sa->last_res_packet_data, ike, tlen);
2390     }
2391
2392 done:
2393   ikev2_payload_destroy_chain (chain);
2394   vec_free (integ);
2395   return tlen;
2396 }
2397
2398 static u32
2399 ikev2_retransmit_sa_init (ike_header_t * ike,
2400                           ip4_address_t iaddr, ip4_address_t raddr, u32 rlen)
2401 {
2402   ikev2_main_t *km = &ikev2_main;
2403   ikev2_sa_t *sa;
2404   u32 thread_index = vlib_get_thread_index ();
2405
2406   /* *INDENT-OFF* */
2407   pool_foreach (sa, km->per_thread_data[thread_index].sas, ({
2408     if (sa->ispi == clib_net_to_host_u64(ike->ispi) &&
2409         sa->iaddr.as_u32 == iaddr.as_u32 &&
2410         sa->raddr.as_u32 == raddr.as_u32)
2411       {
2412         int p = 0;
2413         u8 payload = ike->nextpayload;
2414
2415         while (p < rlen && payload!= IKEV2_PAYLOAD_NONE) {
2416           ike_payload_header_t * ikep = (ike_payload_header_t *) &ike->payload[p];
2417           u32 plen = clib_net_to_host_u16(ikep->length);
2418
2419           if (plen < sizeof(ike_payload_header_t))
2420             return -1;
2421
2422           if (payload == IKEV2_PAYLOAD_NONCE)
2423             {
2424               if (!memcmp(sa->i_nonce, ikep->payload, plen - sizeof(*ikep)))
2425                 {
2426                   /* req is retransmit */
2427                   if (sa->state == IKEV2_STATE_SA_INIT)
2428                     {
2429                       ike_header_t * tmp = (ike_header_t*)sa->last_sa_init_res_packet_data;
2430                       u32 slen = clib_net_to_host_u32(tmp->length);
2431                       ike->ispi = tmp->ispi;
2432                       ike->rspi = tmp->rspi;
2433                       ike->nextpayload = tmp->nextpayload;
2434                       ike->version = tmp->version;
2435                       ike->exchange = tmp->exchange;
2436                       ike->flags = tmp->flags;
2437                       ike->msgid = tmp->msgid;
2438                       ike->length = tmp->length;
2439                       clib_memcpy_fast(ike->payload, tmp->payload, slen - sizeof(*ike));
2440                       ikev2_elog_uint_peers (IKEV2_LOG_DEBUG,
2441                                              "ispi %lx IKE_SA_INIT retransmit "
2442                                              "from %d.%d.%d.%d to %d.%d.%d.%d",
2443                                              ike->ispi,
2444                                              raddr.as_u32, iaddr.as_u32);
2445                       return slen;
2446                     }
2447                   /* else ignore req */
2448                   else
2449                     {
2450                       ikev2_elog_uint_peers (IKEV2_LOG_DEBUG,
2451                                              "ispi %lx IKE_SA_INIT ignore "
2452                                              "from %d.%d.%d.%d to %d.%d.%d.%d",
2453                                              ike->ispi,
2454                                              raddr.as_u32, iaddr.as_u32);
2455                       return ~0;
2456                     }
2457                 }
2458             }
2459           payload = ikep->nextpayload;
2460           p+=plen;
2461         }
2462       }
2463   }));
2464   /* *INDENT-ON* */
2465
2466   /* req is not retransmit */
2467   return 0;
2468 }
2469
2470 static u32
2471 ikev2_retransmit_resp (ikev2_sa_t * sa, ike_header_t * ike, u32 rlen)
2472 {
2473   u32 msg_id = clib_net_to_host_u32 (ike->msgid);
2474
2475   /* new req */
2476   if (msg_id > sa->last_msg_id)
2477     {
2478       sa->last_msg_id = msg_id;
2479       return 0;
2480     }
2481
2482   /* retransmitted req */
2483   if (msg_id == sa->last_msg_id)
2484     {
2485       ike_header_t *tmp = (ike_header_t *) sa->last_res_packet_data;
2486       u32 slen = clib_net_to_host_u32 (tmp->length);
2487       ike->ispi = tmp->ispi;
2488       ike->rspi = tmp->rspi;
2489       ike->nextpayload = tmp->nextpayload;
2490       ike->version = tmp->version;
2491       ike->exchange = tmp->exchange;
2492       ike->flags = tmp->flags;
2493       ike->msgid = tmp->msgid;
2494       ike->length = tmp->length;
2495       clib_memcpy_fast (ike->payload, tmp->payload, slen - sizeof (*ike));
2496       ikev2_elog_uint_peers (IKEV2_LOG_DEBUG, "IKE retransmit msgid %d",
2497                              msg_id, sa->raddr.as_u32, sa->iaddr.as_u32);
2498       return slen;
2499     }
2500
2501   /* old req ignore */
2502   ikev2_elog_uint_peers (IKEV2_LOG_DEBUG, "IKE req ignore msgid %d",
2503                          msg_id, sa->raddr.as_u32, sa->iaddr.as_u32);
2504   return ~0;
2505 }
2506
2507 static void
2508 ikev2_init_sa (vlib_main_t * vm, ikev2_sa_t * sa)
2509 {
2510   ikev2_main_t *km = &ikev2_main;
2511   sa->liveness_period_check = vlib_time_now (vm) + km->liveness_period;
2512   sa->profile_index = ~0;
2513 }
2514
2515 static void
2516 ikev2_del_sa_init_from_main (u64 * ispi)
2517 {
2518   ikev2_main_t *km = &ikev2_main;
2519   uword *p = hash_get (km->sa_by_ispi, *ispi);
2520   if (p)
2521     {
2522       ikev2_sa_t *sai = pool_elt_at_index (km->sais, p[0]);
2523       hash_unset (km->sa_by_ispi, sai->ispi);
2524       ikev2_sa_free_all_vec (sai);
2525       pool_put (km->sais, sai);
2526     }
2527 }
2528
2529 static void
2530 ikev2_del_sa_init (u64 ispi)
2531 {
2532   vl_api_rpc_call_main_thread (ikev2_del_sa_init_from_main, (u8 *) & ispi,
2533                                sizeof (ispi));
2534 }
2535
2536 static uword
2537 ikev2_node_fn (vlib_main_t * vm,
2538                vlib_node_runtime_t * node, vlib_frame_t * frame)
2539 {
2540   u32 n_left_from, *from, *to_next;
2541   ikev2_next_t next_index;
2542   ikev2_main_t *km = &ikev2_main;
2543   u32 thread_index = vlib_get_thread_index ();
2544
2545   from = vlib_frame_vector_args (frame);
2546   n_left_from = frame->n_vectors;
2547   next_index = node->cached_next_index;
2548
2549   while (n_left_from > 0)
2550     {
2551       u32 n_left_to_next;
2552
2553       vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
2554
2555       while (n_left_from > 0 && n_left_to_next > 0)
2556         {
2557           u32 bi0;
2558           vlib_buffer_t *b0;
2559           u32 next0 = IKEV2_NEXT_ERROR_DROP;
2560           u32 sw_if_index0;
2561           ip4_header_t *ip40;
2562           udp_header_t *udp0;
2563           ike_header_t *ike0;
2564           ikev2_sa_t *sa0 = 0;
2565           ikev2_sa_t sa;        /* temporary store for SA */
2566           u32 rlen, slen = 0;
2567           int is_req = 0, has_non_esp_marker = 0;
2568
2569           /* speculatively enqueue b0 to the current next frame */
2570           bi0 = from[0];
2571           to_next[0] = bi0;
2572           from += 1;
2573           to_next += 1;
2574           n_left_from -= 1;
2575           n_left_to_next -= 1;
2576
2577           b0 = vlib_get_buffer (vm, bi0);
2578
2579           if (b0->punt_reason == ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0])
2580             {
2581               u8 *ptr = vlib_buffer_get_current (b0);
2582               ip40 = (ip4_header_t *) ptr;
2583               ptr += sizeof (*ip40);
2584               udp0 = (udp_header_t *) ptr;
2585               ptr += sizeof (*udp0);
2586               ike0 = (ike_header_t *) ptr;
2587             }
2588           else
2589             {
2590               ike0 = vlib_buffer_get_current (b0);
2591               vlib_buffer_advance (b0, -sizeof (*udp0));
2592               udp0 = vlib_buffer_get_current (b0);
2593               vlib_buffer_advance (b0, -sizeof (*ip40));
2594               ip40 = vlib_buffer_get_current (b0);
2595             }
2596
2597           rlen = b0->current_length - sizeof (*ip40) - sizeof (*udp0);
2598
2599           /* check for non-esp marker */
2600           if (*((u32 *) ike0) == 0)
2601             {
2602               ike0 =
2603                 (ike_header_t *) ((u8 *) ike0 +
2604                                   sizeof (ikev2_non_esp_marker));
2605               rlen -= sizeof (ikev2_non_esp_marker);
2606               has_non_esp_marker = 1;
2607             }
2608
2609           if (clib_net_to_host_u32 (ike0->length) != rlen)
2610             {
2611               vlib_node_increment_counter (vm, ikev2_node.index,
2612                                            IKEV2_ERROR_BAD_LENGTH, 1);
2613               goto dispatch0;
2614             }
2615
2616           if (ike0->version != IKE_VERSION_2)
2617             {
2618               vlib_node_increment_counter (vm, ikev2_node.index,
2619                                            IKEV2_ERROR_NOT_IKEV2, 1);
2620               goto dispatch0;
2621             }
2622
2623           if (ike0->exchange == IKEV2_EXCHANGE_SA_INIT)
2624             {
2625               sa0 = &sa;
2626               clib_memset (sa0, 0, sizeof (*sa0));
2627
2628               if (ike0->flags & IKEV2_HDR_FLAG_INITIATOR)
2629                 {
2630                   if (ike0->rspi == 0)
2631                     {
2632                       sa0->raddr.as_u32 = ip40->dst_address.as_u32;
2633                       sa0->iaddr.as_u32 = ip40->src_address.as_u32;
2634                       sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
2635
2636                       slen =
2637                         ikev2_retransmit_sa_init (ike0, sa0->iaddr,
2638                                                   sa0->raddr, rlen);
2639                       if (slen)
2640                         {
2641                           vlib_node_increment_counter (vm, ikev2_node.index,
2642                                                        ~0 ==
2643                                                        slen ?
2644                                                        IKEV2_ERROR_IKE_SA_INIT_IGNORE
2645                                                        :
2646                                                        IKEV2_ERROR_IKE_SA_INIT_RETRANSMIT,
2647                                                        1);
2648                           goto dispatch0;
2649                         }
2650
2651                       ikev2_process_sa_init_req (vm, sa0, ike0, udp0, rlen);
2652
2653                       if (sa0->state == IKEV2_STATE_SA_INIT)
2654                         {
2655                           ikev2_sa_free_proposal_vector (&sa0->r_proposals);
2656                           sa0->r_proposals =
2657                             ikev2_select_proposal (sa0->i_proposals,
2658                                                    IKEV2_PROTOCOL_IKE);
2659                           ikev2_generate_sa_init_data (sa0);
2660                         }
2661
2662                       if (sa0->state == IKEV2_STATE_SA_INIT
2663                           || sa0->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2664                         {
2665                           slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2666                         }
2667
2668                       if (sa0->state == IKEV2_STATE_SA_INIT)
2669                         {
2670                           /* add SA to the pool */
2671                           pool_get (km->per_thread_data[thread_index].sas,
2672                                     sa0);
2673                           clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
2674                           ikev2_init_sa (vm, sa0);
2675                           hash_set (km->
2676                                     per_thread_data[thread_index].sa_by_rspi,
2677                                     sa0->rspi,
2678                                     sa0 -
2679                                     km->per_thread_data[thread_index].sas);
2680                         }
2681                       else
2682                         {
2683                           ikev2_sa_free_all_vec (sa0);
2684                         }
2685                     }
2686                 }
2687               else              //received sa_init without initiator flag
2688                 {
2689                   sa0->raddr.as_u32 = ip40->src_address.as_u32;
2690                   sa0->iaddr.as_u32 = ip40->dst_address.as_u32;
2691                   ikev2_process_sa_init_resp (vm, sa0, ike0, udp0, rlen);
2692
2693                   if (sa0->state == IKEV2_STATE_SA_INIT)
2694                     {
2695                       is_req = 1;
2696                       ike0->exchange = IKEV2_EXCHANGE_IKE_AUTH;
2697                       uword *p = hash_get (km->sa_by_ispi, ike0->ispi);
2698                       if (p)
2699                         {
2700                           ikev2_sa_t *sai =
2701                             pool_elt_at_index (km->sais, p[0]);
2702
2703                           if (clib_atomic_bool_cmp_and_swap
2704                               (&sai->init_response_received, 0, 1))
2705                             {
2706                               ikev2_complete_sa_data (sa0, sai);
2707                               ikev2_calc_keys (sa0);
2708                               ikev2_sa_auth_init (sa0);
2709                               slen =
2710                                 ikev2_generate_message (sa0, ike0, 0, udp0);
2711                             }
2712                           else
2713                             {
2714                               /* we've already processed sa-init response */
2715                               sa0->state = IKEV2_STATE_UNKNOWN;
2716                             }
2717                         }
2718                     }
2719
2720                   if (sa0->state == IKEV2_STATE_SA_INIT)
2721                     {
2722                       /* add SA to the pool */
2723                       pool_get (km->per_thread_data[thread_index].sas, sa0);
2724                       clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
2725                       hash_set (km->per_thread_data[thread_index].sa_by_rspi,
2726                                 sa0->rspi,
2727                                 sa0 - km->per_thread_data[thread_index].sas);
2728                     }
2729                   else
2730                     {
2731                       ikev2_sa_free_all_vec (sa0);
2732                     }
2733                 }
2734             }
2735           else if (ike0->exchange == IKEV2_EXCHANGE_IKE_AUTH)
2736             {
2737               uword *p;
2738               p = hash_get (km->per_thread_data[thread_index].sa_by_rspi,
2739                             clib_net_to_host_u64 (ike0->rspi));
2740               if (p)
2741                 {
2742                   sa0 =
2743                     pool_elt_at_index (km->per_thread_data[thread_index].sas,
2744                                        p[0]);
2745
2746                   slen = ikev2_retransmit_resp (sa0, ike0, rlen);
2747                   if (slen)
2748                     {
2749                       vlib_node_increment_counter (vm, ikev2_node.index,
2750                                                    ~0 ==
2751                                                    slen ?
2752                                                    IKEV2_ERROR_IKE_REQ_IGNORE
2753                                                    :
2754                                                    IKEV2_ERROR_IKE_REQ_RETRANSMIT,
2755                                                    1);
2756                       goto dispatch0;
2757                     }
2758
2759                   sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
2760                   ikev2_process_auth_req (vm, sa0, ike0, rlen);
2761                   ikev2_sa_auth (sa0);
2762                   if (sa0->state == IKEV2_STATE_AUTHENTICATED)
2763                     {
2764                       ikev2_initial_contact_cleanup (sa0);
2765                       ikev2_sa_match_ts (sa0);
2766                       if (sa0->state != IKEV2_STATE_TS_UNACCEPTABLE)
2767                         ikev2_create_tunnel_interface (vm, thread_index, sa0,
2768                                                        &sa0->childs[0],
2769                                                        p[0], 0, 0);
2770                     }
2771
2772                   if (sa0->is_initiator)
2773                     {
2774                       ikev2_del_sa_init (ike0->ispi);
2775                     }
2776                   else
2777                     {
2778                       slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2779                     }
2780                 }
2781             }
2782           else if (ike0->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
2783             {
2784               uword *p;
2785               p = hash_get (km->per_thread_data[thread_index].sa_by_rspi,
2786                             clib_net_to_host_u64 (ike0->rspi));
2787               if (p)
2788                 {
2789                   sa0 =
2790                     pool_elt_at_index (km->per_thread_data[thread_index].sas,
2791                                        p[0]);
2792
2793                   slen = ikev2_retransmit_resp (sa0, ike0, rlen);
2794                   if (slen)
2795                     {
2796                       vlib_node_increment_counter (vm, ikev2_node.index,
2797                                                    ~0 ==
2798                                                    slen ?
2799                                                    IKEV2_ERROR_IKE_REQ_IGNORE
2800                                                    :
2801                                                    IKEV2_ERROR_IKE_REQ_RETRANSMIT,
2802                                                    1);
2803                       goto dispatch0;
2804                     }
2805
2806                   ikev2_process_informational_req (vm, sa0, ike0, rlen);
2807                   if (sa0->del)
2808                     {
2809                       if (sa0->del[0].protocol_id != IKEV2_PROTOCOL_IKE)
2810                         {
2811                           ikev2_delete_t *d, *tmp, *resp = 0;
2812                           vec_foreach (d, sa0->del)
2813                           {
2814                             ikev2_child_sa_t *ch_sa;
2815                             ch_sa = ikev2_sa_get_child (sa0, d->spi,
2816                                                         d->protocol_id,
2817                                                         !sa0->is_initiator);
2818                             if (ch_sa)
2819                               {
2820                                 ikev2_delete_tunnel_interface (km->vnet_main,
2821                                                                sa0, ch_sa);
2822                                 if (!sa0->is_initiator)
2823                                   {
2824                                     vec_add2 (resp, tmp, 1);
2825                                     tmp->protocol_id = d->protocol_id;
2826                                     tmp->spi = ch_sa->r_proposals[0].spi;
2827                                   }
2828                                 ikev2_sa_del_child_sa (sa0, ch_sa);
2829                               }
2830                           }
2831                           if (!sa0->is_initiator)
2832                             {
2833                               vec_free (sa0->del);
2834                               sa0->del = resp;
2835                             }
2836                         }
2837                     }
2838                   if (!(ike0->flags & IKEV2_HDR_FLAG_RESPONSE))
2839                     {
2840                       ike0->flags |= IKEV2_HDR_FLAG_RESPONSE;
2841                       slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2842                     }
2843                 }
2844             }
2845           else if (ike0->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
2846             {
2847               uword *p;
2848               p = hash_get (km->per_thread_data[thread_index].sa_by_rspi,
2849                             clib_net_to_host_u64 (ike0->rspi));
2850               if (p)
2851                 {
2852                   sa0 =
2853                     pool_elt_at_index (km->per_thread_data[thread_index].sas,
2854                                        p[0]);
2855
2856                   slen = ikev2_retransmit_resp (sa0, ike0, rlen);
2857                   if (slen)
2858                     {
2859                       vlib_node_increment_counter (vm, ikev2_node.index,
2860                                                    ~0 ==
2861                                                    slen ?
2862                                                    IKEV2_ERROR_IKE_REQ_IGNORE
2863                                                    :
2864                                                    IKEV2_ERROR_IKE_REQ_RETRANSMIT,
2865                                                    1);
2866                       goto dispatch0;
2867                     }
2868
2869                   ikev2_process_create_child_sa_req (vm, sa0, ike0, rlen);
2870                   if (sa0->rekey)
2871                     {
2872                       if (sa0->rekey[0].protocol_id != IKEV2_PROTOCOL_IKE)
2873                         {
2874                           if (sa0->childs)
2875                             ikev2_sa_free_all_child_sa (&sa0->childs);
2876                           ikev2_child_sa_t *child;
2877                           vec_add2 (sa0->childs, child, 1);
2878                           clib_memset (child, 0, sizeof (*child));
2879                           child->r_proposals = sa0->rekey[0].r_proposal;
2880                           child->i_proposals = sa0->rekey[0].i_proposal;
2881                           child->tsi = sa0->rekey[0].tsi;
2882                           child->tsr = sa0->rekey[0].tsr;
2883                           ikev2_create_tunnel_interface (vm, thread_index,
2884                                                          sa0, child, p[0],
2885                                                          child - sa0->childs,
2886                                                          1);
2887                         }
2888                       if (sa0->is_initiator)
2889                         {
2890                           vec_free (sa0->rekey);
2891                         }
2892                       else
2893                         {
2894                           slen = ikev2_generate_message (sa0, ike0, 0, udp0);
2895                         }
2896                     }
2897                 }
2898             }
2899           else
2900             {
2901               ikev2_elog_uint_peers (IKEV2_LOG_WARNING, "IKEv2 exchange %d "
2902                                      "received from %d.%d.%d.%d to %d.%d.%d.%d",
2903                                      ike0->exchange,
2904                                      ip40->src_address.as_u32,
2905                                      ip40->dst_address.as_u32);
2906             }
2907
2908         dispatch0:
2909           /* if we are sending packet back, rewrite headers */
2910           if (slen && ~0 != slen)
2911             {
2912               next0 = IKEV2_NEXT_IP4_LOOKUP;
2913               if (sa0->is_initiator)
2914                 {
2915                   ip40->dst_address.as_u32 = sa0->raddr.as_u32;
2916                   ip40->src_address.as_u32 = sa0->iaddr.as_u32;
2917                 }
2918               else
2919                 {
2920                   ip40->dst_address.as_u32 = sa0->iaddr.as_u32;
2921                   ip40->src_address.as_u32 = sa0->raddr.as_u32;
2922                 }
2923
2924               if (is_req)
2925                 {
2926                   udp0->dst_port = udp0->src_port =
2927                     clib_net_to_host_u16 (ikev2_get_port (sa0));
2928
2929                   if (udp0->dst_port == clib_net_to_host_u16 (IKEV2_PORT_NATT)
2930                       && sa0->natt)
2931                     {
2932                       if (!has_non_esp_marker)
2933                         slen = ikev2_insert_non_esp_marker (ike0, slen);
2934                     }
2935                 }
2936               else
2937                 {
2938                   if (has_non_esp_marker)
2939                     slen += sizeof (ikev2_non_esp_marker);
2940
2941                   u16 tp = udp0->dst_port;
2942                   udp0->dst_port = udp0->src_port;
2943                   udp0->src_port = tp;
2944                 }
2945
2946               udp0->length =
2947                 clib_host_to_net_u16 (slen + sizeof (udp_header_t));
2948               udp0->checksum = 0;
2949               b0->current_length =
2950                 slen + sizeof (ip4_header_t) + sizeof (udp_header_t);
2951               ip40->length = clib_host_to_net_u16 (b0->current_length);
2952               ip40->checksum = ip4_header_checksum (ip40);
2953             }
2954           /* delete sa */
2955           if (sa0 && (sa0->state == IKEV2_STATE_DELETED ||
2956                       sa0->state == IKEV2_STATE_NOTIFY_AND_DELETE))
2957             {
2958               ikev2_child_sa_t *c;
2959
2960               vec_foreach (c, sa0->childs)
2961                 ikev2_delete_tunnel_interface (km->vnet_main, sa0, c);
2962
2963               ikev2_delete_sa (sa0);
2964             }
2965           sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
2966
2967           if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)
2968                              && (b0->flags & VLIB_BUFFER_IS_TRACED)))
2969             {
2970               ikev2_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
2971               t->sw_if_index = sw_if_index0;
2972               t->next_index = next0;
2973             }
2974
2975           vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
2976                                            n_left_to_next, bi0, next0);
2977         }
2978
2979       vlib_put_next_frame (vm, node, next_index, n_left_to_next);
2980     }
2981
2982   vlib_node_increment_counter (vm, ikev2_node.index,
2983                                IKEV2_ERROR_PROCESSED, frame->n_vectors);
2984   return frame->n_vectors;
2985 }
2986
2987 /* *INDENT-OFF* */
2988 VLIB_REGISTER_NODE (ikev2_node,static) = {
2989   .function = ikev2_node_fn,
2990   .name = "ikev2",
2991   .vector_size = sizeof (u32),
2992   .format_trace = format_ikev2_trace,
2993   .type = VLIB_NODE_TYPE_INTERNAL,
2994
2995   .n_errors = ARRAY_LEN(ikev2_error_strings),
2996   .error_strings = ikev2_error_strings,
2997
2998   .n_next_nodes = IKEV2_N_NEXT,
2999
3000   .next_nodes = {
3001     [IKEV2_NEXT_IP4_LOOKUP] = "ip4-lookup",
3002         [IKEV2_NEXT_ERROR_DROP] = "error-drop",
3003   },
3004 };
3005 /* *INDENT-ON* */
3006
3007 // set ikev2 proposals when vpp is used as initiator
3008 static clib_error_t *
3009 ikev2_set_initiator_proposals (vlib_main_t * vm, ikev2_sa_t * sa,
3010                                ikev2_transforms_set * ts,
3011                                ikev2_sa_proposal_t ** proposals, int is_ike)
3012 {
3013   clib_error_t *r;
3014   ikev2_main_t *km = &ikev2_main;
3015   ikev2_sa_proposal_t *proposal;
3016   vec_add2 (*proposals, proposal, 1);
3017   ikev2_sa_transform_t *td;
3018   int error;
3019
3020   /* Encryption */
3021   error = 1;
3022   vec_foreach (td, km->supported_transforms)
3023   {
3024     if (td->type == IKEV2_TRANSFORM_TYPE_ENCR
3025         && td->encr_type == ts->crypto_alg
3026         && td->key_len == ts->crypto_key_size / 8)
3027       {
3028         u16 attr[2];
3029         attr[0] = clib_host_to_net_u16 (14 | (1 << 15));
3030         attr[1] = clib_host_to_net_u16 (td->key_len << 3);
3031         vec_add (td->attrs, (u8 *) attr, 4);
3032         vec_add1 (proposal->transforms, *td);
3033         td->attrs = 0;
3034
3035         error = 0;
3036         break;
3037       }
3038   }
3039   if (error)
3040     {
3041       r = clib_error_return (0, "Unsupported algorithm");
3042       return r;
3043     }
3044
3045   if (IKEV2_TRANSFORM_INTEG_TYPE_NONE != ts->integ_alg)
3046     {
3047       /* Integrity */
3048       error = 1;
3049       vec_foreach (td, km->supported_transforms)
3050       {
3051         if (td->type == IKEV2_TRANSFORM_TYPE_INTEG
3052             && td->integ_type == ts->integ_alg)
3053           {
3054             vec_add1 (proposal->transforms, *td);
3055             error = 0;
3056             break;
3057           }
3058       }
3059       if (error)
3060         {
3061           ikev2_elog_error
3062             ("Didn't find any supported algorithm for IKEV2_TRANSFORM_TYPE_INTEG");
3063           r = clib_error_return (0, "Unsupported algorithm");
3064           return r;
3065         }
3066     }
3067
3068   /* PRF */
3069   if (is_ike)
3070     {
3071       error = 1;
3072       vec_foreach (td, km->supported_transforms)
3073       {
3074         if (td->type == IKEV2_TRANSFORM_TYPE_PRF
3075             && td->prf_type == IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_256)
3076           {
3077             vec_add1 (proposal->transforms, *td);
3078             error = 0;
3079             break;
3080           }
3081       }
3082       if (error)
3083         {
3084           r = clib_error_return (0, "Unsupported algorithm");
3085           return r;
3086         }
3087     }
3088
3089   /* DH */
3090   if (is_ike)
3091     {
3092       error = 1;
3093       vec_foreach (td, km->supported_transforms)
3094       {
3095         if (td->type == IKEV2_TRANSFORM_TYPE_DH && td->dh_type == ts->dh_type)
3096           {
3097             vec_add1 (proposal->transforms, *td);
3098             if (is_ike)
3099               {
3100                 sa->dh_group = td->dh_type;
3101               }
3102             error = 0;
3103             break;
3104           }
3105       }
3106       if (error)
3107         {
3108           r = clib_error_return (0, "Unsupported algorithm");
3109           return r;
3110         }
3111     }
3112
3113   if (!is_ike)
3114     {
3115       error = 1;
3116       vec_foreach (td, km->supported_transforms)
3117       {
3118         if (td->type == IKEV2_TRANSFORM_TYPE_ESN)
3119           {
3120             vec_add1 (proposal->transforms, *td);
3121             error = 0;
3122           }
3123       }
3124       if (error)
3125         {
3126           r = clib_error_return (0, "Unsupported algorithm");
3127           return r;
3128         }
3129     }
3130
3131
3132   return 0;
3133 }
3134
3135 static ikev2_profile_t *
3136 ikev2_profile_index_by_name (u8 * name)
3137 {
3138   ikev2_main_t *km = &ikev2_main;
3139   uword *p;
3140
3141   p = mhash_get (&km->profile_index_by_name, name);
3142   if (!p)
3143     return 0;
3144
3145   return pool_elt_at_index (km->profiles, p[0]);
3146 }
3147
3148
3149 static void
3150 ikev2_send_ike (vlib_main_t * vm, ip4_address_t * src, ip4_address_t * dst,
3151                 u32 bi0, u32 len, u16 src_port, u16 dst_port, u32 sw_if_index)
3152 {
3153   ip4_header_t *ip40;
3154   udp_header_t *udp0;
3155   vlib_buffer_t *b0;
3156   vlib_frame_t *f;
3157   u32 *to_next;
3158
3159   b0 = vlib_get_buffer (vm, bi0);
3160   vlib_buffer_advance (b0, -sizeof (udp_header_t));
3161   udp0 = vlib_buffer_get_current (b0);
3162   vlib_buffer_advance (b0, -sizeof (ip4_header_t));
3163   ip40 = vlib_buffer_get_current (b0);
3164
3165
3166   ip40->ip_version_and_header_length = 0x45;
3167   ip40->tos = 0;
3168   ip40->fragment_id = 0;
3169   ip40->flags_and_fragment_offset = 0;
3170   ip40->ttl = 0xff;
3171   ip40->protocol = IP_PROTOCOL_UDP;
3172   ip40->dst_address.as_u32 = dst->as_u32;
3173   ip40->src_address.as_u32 = src->as_u32;
3174   udp0->dst_port = clib_host_to_net_u16 (dst_port);
3175   udp0->src_port = clib_host_to_net_u16 (src_port);
3176   udp0->length = clib_host_to_net_u16 (len + sizeof (udp_header_t));
3177   udp0->checksum = 0;
3178   b0->current_length = len + sizeof (ip4_header_t) + sizeof (udp_header_t);
3179   ip40->length = clib_host_to_net_u16 (b0->current_length);
3180   ip40->checksum = ip4_header_checksum (ip40);
3181
3182   vnet_buffer (b0)->sw_if_index[VLIB_RX] = sw_if_index;
3183   vnet_buffer (b0)->sw_if_index[VLIB_TX] = ~0;
3184
3185   /* send the request */
3186   f = vlib_get_frame_to_node (vm, ip4_lookup_node.index);
3187   to_next = vlib_frame_vector_args (f);
3188   to_next[0] = bi0;
3189   f->n_vectors = 1;
3190   vlib_put_frame_to_node (vm, ip4_lookup_node.index, f);
3191
3192 }
3193
3194 static u32
3195 ikev2_get_new_ike_header_buff (vlib_main_t * vm, ike_header_t ** ike)
3196 {
3197   u32 bi0;
3198   if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
3199     {
3200       *ike = 0;
3201       return 0;
3202     }
3203   vlib_buffer_t *b0 = vlib_get_buffer (vm, bi0);
3204   *ike = vlib_buffer_get_current (b0);
3205   return bi0;
3206 }
3207
3208 clib_error_t *
3209 ikev2_set_local_key (vlib_main_t * vm, u8 * file)
3210 {
3211   ikev2_main_t *km = &ikev2_main;
3212
3213   if (km->pkey)
3214     EVP_PKEY_free (km->pkey);
3215   km->pkey = ikev2_load_key_file (file);
3216   if (km->pkey == NULL)
3217     return clib_error_return (0, "load key '%s' failed", file);
3218
3219   return 0;
3220 }
3221
3222 static_always_inline vnet_api_error_t
3223 ikev2_register_udp_port (ikev2_profile_t * p, u16 port)
3224 {
3225   ikev2_main_t *km = &ikev2_main;
3226   udp_dst_port_info_t *pi;
3227
3228   uword *v = hash_get (km->udp_ports, port);
3229   pi = udp_get_dst_port_info (&udp_main, port, UDP_IP4);
3230
3231   if (v)
3232     {
3233       /* IKE already uses this port, only increment reference counter */
3234       ASSERT (pi);
3235       v[0]++;
3236     }
3237   else
3238     {
3239       if (pi)
3240         return VNET_API_ERROR_UDP_PORT_TAKEN;
3241
3242       udp_register_dst_port (km->vlib_main, port,
3243                              ipsec4_tun_input_node.index, 1);
3244       hash_set (km->udp_ports, port, 1);
3245     }
3246   p->ipsec_over_udp_port = port;
3247   return 0;
3248 }
3249
3250 static_always_inline void
3251 ikev2_unregister_udp_port (ikev2_profile_t * p)
3252 {
3253   ikev2_main_t *km = &ikev2_main;
3254   uword *v;
3255
3256   if (p->ipsec_over_udp_port == IPSEC_UDP_PORT_NONE)
3257     return;
3258
3259   v = hash_get (km->udp_ports, p->ipsec_over_udp_port);
3260   if (!v)
3261     return;
3262
3263   v[0]--;
3264
3265   if (v[0] == 0)
3266     {
3267       udp_unregister_dst_port (km->vlib_main, p->ipsec_over_udp_port, 1);
3268       hash_unset (km->udp_ports, p->ipsec_over_udp_port);
3269     }
3270
3271   p->ipsec_over_udp_port = IPSEC_UDP_PORT_NONE;
3272 }
3273
3274 static void
3275 ikev2_initiate_delete_ike_sa_internal (vlib_main_t * vm,
3276                                        ikev2_main_per_thread_data_t * tkm,
3277                                        ikev2_sa_t * sa)
3278 {
3279   ikev2_main_t *km = &ikev2_main;
3280   ip4_address_t *src, *dst;
3281
3282   /* Create the Initiator notification for IKE SA removal */
3283   ike_header_t *ike0;
3284   u32 bi0 = 0;
3285   int len;
3286
3287   bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3288   if (!bi0)
3289     {
3290       ikev2_log_error ("buffer alloc failure");
3291       return;
3292     }
3293
3294   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
3295   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3296   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3297   vec_resize (sa->del, 1);
3298   sa->del->protocol_id = IKEV2_PROTOCOL_IKE;
3299   sa->del->spi = sa->ispi;
3300   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
3301   sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
3302   len = ikev2_generate_message (sa, ike0, 0, 0);
3303
3304   if (sa->is_initiator)
3305     {
3306       src = &sa->iaddr;
3307       dst = &sa->raddr;
3308     }
3309   else
3310     {
3311       dst = &sa->iaddr;
3312       src = &sa->raddr;
3313     }
3314
3315   ikev2_send_ike (vm, src, dst, bi0, len,
3316                   ikev2_get_port (sa), sa->dst_port, 0);
3317
3318   /* delete local SA */
3319   ikev2_child_sa_t *c;
3320   vec_foreach (c, sa->childs)
3321     ikev2_delete_tunnel_interface (km->vnet_main, sa, c);
3322
3323   u64 rspi = sa->rspi;
3324   ikev2_sa_free_all_vec (sa);
3325   uword *p = hash_get (tkm->sa_by_rspi, rspi);
3326   if (p)
3327     {
3328       hash_unset (tkm->sa_by_rspi, rspi);
3329       pool_put (tkm->sas, sa);
3330     }
3331 }
3332
3333 static void
3334 ikev2_cleanup_profile_sessions (ikev2_main_t * km, ikev2_profile_t * p)
3335 {
3336   ikev2_main_per_thread_data_t *tkm;
3337   ikev2_sa_t *sa;
3338   u32 pi = p - km->profiles;
3339   u32 *sai;
3340   u32 *del_sai = 0;
3341
3342   vec_foreach (tkm, km->per_thread_data)
3343   {
3344     /* *INDENT-OFF* */
3345     pool_foreach (sa, tkm->sas, ({
3346       if (sa->profile_index != ~0 && pi == sa->profile_index)
3347         vec_add1 (del_sai, sa - tkm->sas);
3348     }));
3349     /* *INDENT-ON* */
3350
3351     vec_foreach (sai, del_sai)
3352     {
3353       sa = pool_elt_at_index (tkm->sas, sai[0]);
3354       ikev2_initiate_delete_ike_sa_internal (km->vlib_main, tkm, sa);
3355     }
3356
3357     vec_reset_length (del_sai);
3358   }
3359
3360   vec_free (del_sai);
3361 }
3362
3363 static void
3364 ikev2_profile_free (ikev2_profile_t * p)
3365 {
3366   vec_free (p->name);
3367
3368   vec_free (p->auth.data);
3369   if (p->auth.key)
3370     EVP_PKEY_free (p->auth.key);
3371
3372   vec_free (p->loc_id.data);
3373   vec_free (p->rem_id.data);
3374 }
3375
3376 clib_error_t *
3377 ikev2_add_del_profile (vlib_main_t * vm, u8 * name, int is_add)
3378 {
3379   ikev2_main_t *km = &ikev2_main;
3380   ikev2_profile_t *p;
3381
3382   if (is_add)
3383     {
3384       if (ikev2_profile_index_by_name (name))
3385         return clib_error_return (0, "policy %v already exists", name);
3386
3387       pool_get (km->profiles, p);
3388       clib_memset (p, 0, sizeof (*p));
3389       p->name = vec_dup (name);
3390       p->ipsec_over_udp_port = IPSEC_UDP_PORT_NONE;
3391       p->responder.sw_if_index = ~0;
3392       p->tun_itf = ~0;
3393       uword index = p - km->profiles;
3394       mhash_set_mem (&km->profile_index_by_name, name, &index, 0);
3395     }
3396   else
3397     {
3398       p = ikev2_profile_index_by_name (name);
3399       if (!p)
3400         return clib_error_return (0, "policy %v does not exists", name);
3401
3402       ikev2_unregister_udp_port (p);
3403       ikev2_cleanup_profile_sessions (km, p);
3404
3405       ikev2_profile_free (p);
3406       pool_put (km->profiles, p);
3407       mhash_unset (&km->profile_index_by_name, name, 0);
3408     }
3409   return 0;
3410 }
3411
3412 clib_error_t *
3413 ikev2_set_profile_auth (vlib_main_t * vm, u8 * name, u8 auth_method,
3414                         u8 * auth_data, u8 data_hex_format)
3415 {
3416   ikev2_profile_t *p;
3417   clib_error_t *r;
3418
3419   p = ikev2_profile_index_by_name (name);
3420
3421   if (!p)
3422     {
3423       r = clib_error_return (0, "unknown profile %v", name);
3424       return r;
3425     }
3426
3427   if (p->auth.key)
3428     EVP_PKEY_free (p->auth.key);
3429   vec_free (p->auth.data);
3430
3431   p->auth.method = auth_method;
3432   p->auth.data = vec_dup (auth_data);
3433   p->auth.hex = data_hex_format;
3434
3435   if (auth_method == IKEV2_AUTH_METHOD_RSA_SIG)
3436     {
3437       vec_add1 (p->auth.data, 0);
3438       p->auth.key = ikev2_load_cert_file (p->auth.data);
3439       if (p->auth.key == NULL)
3440         return clib_error_return (0, "load cert '%s' failed", p->auth.data);
3441     }
3442
3443   return 0;
3444 }
3445
3446 clib_error_t *
3447 ikev2_set_profile_id (vlib_main_t * vm, u8 * name, u8 id_type, u8 * data,
3448                       int is_local)
3449 {
3450   ikev2_profile_t *p;
3451   clib_error_t *r;
3452
3453   if (id_type > IKEV2_ID_TYPE_ID_RFC822_ADDR
3454       && id_type < IKEV2_ID_TYPE_ID_KEY_ID)
3455     {
3456       r = clib_error_return (0, "unsupported identity type %U",
3457                              format_ikev2_id_type, id_type);
3458       return r;
3459     }
3460
3461   p = ikev2_profile_index_by_name (name);
3462
3463   if (!p)
3464     {
3465       r = clib_error_return (0, "unknown profile %v", name);
3466       return r;
3467     }
3468
3469   if (is_local)
3470     {
3471       vec_free (p->loc_id.data);
3472       p->loc_id.type = id_type;
3473       p->loc_id.data = vec_dup (data);
3474     }
3475   else
3476     {
3477       vec_free (p->rem_id.data);
3478       p->rem_id.type = id_type;
3479       p->rem_id.data = vec_dup (data);
3480     }
3481
3482   return 0;
3483 }
3484
3485 clib_error_t *
3486 ikev2_set_profile_ts (vlib_main_t * vm, u8 * name, u8 protocol_id,
3487                       u16 start_port, u16 end_port, ip4_address_t start_addr,
3488                       ip4_address_t end_addr, int is_local)
3489 {
3490   ikev2_profile_t *p;
3491   clib_error_t *r;
3492
3493   p = ikev2_profile_index_by_name (name);
3494
3495   if (!p)
3496     {
3497       r = clib_error_return (0, "unknown profile %v", name);
3498       return r;
3499     }
3500
3501   if (is_local)
3502     {
3503       p->loc_ts.start_addr.as_u32 = start_addr.as_u32;
3504       p->loc_ts.end_addr.as_u32 = end_addr.as_u32;
3505       p->loc_ts.start_port = start_port;
3506       p->loc_ts.end_port = end_port;
3507       p->loc_ts.protocol_id = protocol_id;
3508       p->loc_ts.ts_type = 7;
3509     }
3510   else
3511     {
3512       p->rem_ts.start_addr.as_u32 = start_addr.as_u32;
3513       p->rem_ts.end_addr.as_u32 = end_addr.as_u32;
3514       p->rem_ts.start_port = start_port;
3515       p->rem_ts.end_port = end_port;
3516       p->rem_ts.protocol_id = protocol_id;
3517       p->rem_ts.ts_type = 7;
3518     }
3519
3520   return 0;
3521 }
3522
3523
3524 clib_error_t *
3525 ikev2_set_profile_responder (vlib_main_t * vm, u8 * name,
3526                              u32 sw_if_index, ip4_address_t ip4)
3527 {
3528   ikev2_profile_t *p;
3529   clib_error_t *r;
3530
3531   p = ikev2_profile_index_by_name (name);
3532
3533   if (!p)
3534     {
3535       r = clib_error_return (0, "unknown profile %v", name);
3536       return r;
3537     }
3538
3539   p->responder.sw_if_index = sw_if_index;
3540   p->responder.ip4 = ip4;
3541
3542   return 0;
3543 }
3544
3545 clib_error_t *
3546 ikev2_set_profile_ike_transforms (vlib_main_t * vm, u8 * name,
3547                                   ikev2_transform_encr_type_t crypto_alg,
3548                                   ikev2_transform_integ_type_t integ_alg,
3549                                   ikev2_transform_dh_type_t dh_type,
3550                                   u32 crypto_key_size)
3551 {
3552   ikev2_profile_t *p;
3553   clib_error_t *r;
3554
3555   p = ikev2_profile_index_by_name (name);
3556
3557   if (!p)
3558     {
3559       r = clib_error_return (0, "unknown profile %v", name);
3560       return r;
3561     }
3562
3563   p->ike_ts.crypto_alg = crypto_alg;
3564   p->ike_ts.integ_alg = integ_alg;
3565   p->ike_ts.dh_type = dh_type;
3566   p->ike_ts.crypto_key_size = crypto_key_size;
3567   return 0;
3568 }
3569
3570 clib_error_t *
3571 ikev2_set_profile_esp_transforms (vlib_main_t * vm, u8 * name,
3572                                   ikev2_transform_encr_type_t crypto_alg,
3573                                   ikev2_transform_integ_type_t integ_alg,
3574                                   u32 crypto_key_size)
3575 {
3576   ikev2_profile_t *p;
3577   clib_error_t *r;
3578
3579   p = ikev2_profile_index_by_name (name);
3580
3581   if (!p)
3582     {
3583       r = clib_error_return (0, "unknown profile %v", name);
3584       return r;
3585     }
3586
3587   p->esp_ts.crypto_alg = crypto_alg;
3588   p->esp_ts.integ_alg = integ_alg;
3589   p->esp_ts.crypto_key_size = crypto_key_size;
3590   return 0;
3591 }
3592
3593 clib_error_t *
3594 ikev2_set_profile_tunnel_interface (vlib_main_t * vm,
3595                                     u8 * name, u32 sw_if_index)
3596 {
3597   ikev2_profile_t *p;
3598   clib_error_t *r;
3599
3600   p = ikev2_profile_index_by_name (name);
3601
3602   if (!p)
3603     {
3604       r = clib_error_return (0, "unknown profile %v", name);
3605       return r;
3606     }
3607
3608   p->tun_itf = sw_if_index;
3609
3610   return 0;
3611 }
3612
3613 vnet_api_error_t
3614 ikev2_set_profile_ipsec_udp_port (vlib_main_t * vm, u8 * name, u16 port,
3615                                   u8 is_set)
3616 {
3617   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
3618   ikev2_main_t *km = &ikev2_main;
3619   vnet_api_error_t rv = 0;
3620   uword *v;
3621
3622   if (!p)
3623     return VNET_API_ERROR_INVALID_VALUE;
3624
3625   if (is_set)
3626     {
3627       if (p->ipsec_over_udp_port != IPSEC_UDP_PORT_NONE)
3628         return VNET_API_ERROR_VALUE_EXIST;
3629
3630       rv = ikev2_register_udp_port (p, port);
3631     }
3632   else
3633     {
3634       v = hash_get (km->udp_ports, port);
3635       if (!v)
3636         return VNET_API_ERROR_IKE_NO_PORT;
3637
3638       if (p->ipsec_over_udp_port == IPSEC_UDP_PORT_NONE)
3639         return VNET_API_ERROR_INVALID_VALUE;
3640
3641       ikev2_unregister_udp_port (p);
3642     }
3643   return rv;
3644 }
3645
3646 clib_error_t *
3647 ikev2_set_profile_udp_encap (vlib_main_t * vm, u8 * name)
3648 {
3649   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
3650   clib_error_t *r;
3651
3652   if (!p)
3653     {
3654       r = clib_error_return (0, "unknown profile %v", name);
3655       return r;
3656     }
3657
3658   p->udp_encap = 1;
3659   return 0;
3660 }
3661
3662 clib_error_t *
3663 ikev2_set_profile_sa_lifetime (vlib_main_t * vm, u8 * name,
3664                                u64 lifetime, u32 jitter, u32 handover,
3665                                u64 maxdata)
3666 {
3667   ikev2_profile_t *p;
3668   clib_error_t *r;
3669
3670   p = ikev2_profile_index_by_name (name);
3671
3672   if (!p)
3673     {
3674       r = clib_error_return (0, "unknown profile %v", name);
3675       return r;
3676     }
3677
3678   p->lifetime = lifetime;
3679   p->lifetime_jitter = jitter;
3680   p->handover = handover;
3681   p->lifetime_maxdata = maxdata;
3682   return 0;
3683 }
3684
3685 clib_error_t *
3686 ikev2_initiate_sa_init (vlib_main_t * vm, u8 * name)
3687 {
3688   ikev2_profile_t *p;
3689   clib_error_t *r;
3690   ip4_main_t *im = &ip4_main;
3691   ikev2_main_t *km = &ikev2_main;
3692
3693   p = ikev2_profile_index_by_name (name);
3694
3695   if (!p)
3696     {
3697       r = clib_error_return (0, "unknown profile %v", name);
3698       return r;
3699     }
3700
3701   if (p->responder.sw_if_index == ~0 || p->responder.ip4.data_u32 == 0)
3702     {
3703       r = clib_error_return (0, "responder not set for profile %v", name);
3704       return r;
3705     }
3706
3707
3708   /* Create the Initiator Request */
3709   {
3710     ike_header_t *ike0;
3711     u32 bi0 = 0;
3712     ip_lookup_main_t *lm = &im->lookup_main;
3713     u32 if_add_index0;
3714     int len = sizeof (ike_header_t);
3715
3716     /* Get own iface IP */
3717     if_add_index0 =
3718       lm->if_address_pool_index_by_sw_if_index[p->responder.sw_if_index];
3719     ip_interface_address_t *if_add =
3720       pool_elt_at_index (lm->if_address_pool, if_add_index0);
3721     ip4_address_t *if_ip = ip_interface_address_get_address (lm, if_add);
3722
3723     bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3724     if (!bi0)
3725       {
3726         char *errmsg = "buffer alloc failure";
3727         ikev2_log_error (errmsg);
3728         return clib_error_return (0, errmsg);
3729       }
3730
3731     /* Prepare the SA and the IKE payload */
3732     ikev2_sa_t sa;
3733     clib_memset (&sa, 0, sizeof (ikev2_sa_t));
3734     ikev2_payload_chain_t *chain = 0;
3735     ikev2_payload_new_chain (chain);
3736
3737     /* Build the IKE proposal payload */
3738     ikev2_sa_proposal_t *proposals = 0;
3739     ikev2_set_initiator_proposals (vm, &sa, &p->ike_ts, &proposals, 1);
3740     proposals[0].proposal_num = 1;
3741     proposals[0].protocol_id = IKEV2_PROTOCOL_IKE;
3742
3743     /* Add and then cleanup proposal data */
3744     ikev2_payload_add_sa (chain, proposals);
3745     ikev2_sa_free_proposal_vector (&proposals);
3746
3747     sa.is_initiator = 1;
3748     sa.profile_index = p - km->profiles;
3749     sa.state = IKEV2_STATE_SA_INIT;
3750     sa.tun_itf = p->tun_itf;
3751     sa.udp_encap = p->udp_encap;
3752     sa.ipsec_over_udp_port = p->ipsec_over_udp_port;
3753     sa.is_tun_itf_set = 1;
3754     sa.initial_contact = 1;
3755     sa.dst_port = IKEV2_PORT;
3756     ikev2_generate_sa_init_data (&sa);
3757     ikev2_payload_add_ke (chain, sa.dh_group, sa.i_dh_data);
3758     ikev2_payload_add_nonce (chain, sa.i_nonce);
3759
3760     /* Build the child SA proposal */
3761     vec_resize (sa.childs, 1);
3762     ikev2_set_initiator_proposals (vm, &sa, &p->esp_ts,
3763                                    &sa.childs[0].i_proposals, 0);
3764     sa.childs[0].i_proposals[0].proposal_num = 1;
3765     sa.childs[0].i_proposals[0].protocol_id = IKEV2_PROTOCOL_ESP;
3766     RAND_bytes ((u8 *) & sa.childs[0].i_proposals[0].spi,
3767                 sizeof (sa.childs[0].i_proposals[0].spi));
3768
3769     /* Add NAT detection notification messages (mandatory) */
3770     u8 *nat_detection_sha1 =
3771       ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
3772                               clib_host_to_net_u64 (sa.rspi),
3773                               clib_host_to_net_u32 (if_ip->as_u32),
3774                               clib_host_to_net_u16 (IKEV2_PORT));
3775
3776     ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
3777                               nat_detection_sha1);
3778     vec_free (nat_detection_sha1);
3779     nat_detection_sha1 =
3780       ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
3781                               clib_host_to_net_u64 (sa.rspi),
3782                               clib_host_to_net_u32 (p->responder.ip4.as_u32),
3783                               clib_host_to_net_u16 (sa.dst_port));
3784     ikev2_payload_add_notify (chain,
3785                               IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
3786                               nat_detection_sha1);
3787     vec_free (nat_detection_sha1);
3788
3789     u8 *sig_hash_algo = vec_new (u8, 8);
3790     u64 tmpsig = clib_host_to_net_u64 (0x0001000200030004);
3791     clib_memcpy_fast (sig_hash_algo, &tmpsig, sizeof (tmpsig));
3792     ikev2_payload_add_notify (chain,
3793                               IKEV2_NOTIFY_MSG_SIGNATURE_HASH_ALGORITHMS,
3794                               sig_hash_algo);
3795     vec_free (sig_hash_algo);
3796
3797
3798     /* Buffer update and boilerplate */
3799     len += vec_len (chain->data);
3800     ike0->nextpayload = chain->first_payload_type;
3801     ike0->length = clib_host_to_net_u32 (len);
3802     clib_memcpy_fast (ike0->payload, chain->data, vec_len (chain->data));
3803     ikev2_payload_destroy_chain (chain);
3804
3805     ike0->version = IKE_VERSION_2;
3806     ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
3807     ike0->exchange = IKEV2_EXCHANGE_SA_INIT;
3808     ike0->ispi = sa.ispi;
3809     ike0->rspi = 0;
3810     ike0->msgid = 0;
3811
3812     /* store whole IKE payload - needed for PSK auth */
3813     vec_reset_length (sa.last_sa_init_req_packet_data);
3814     vec_add (sa.last_sa_init_req_packet_data, ike0, len);
3815
3816     /* add data to the SA then add it to the pool */
3817     sa.iaddr.as_u32 = if_ip->as_u32;
3818     sa.raddr.as_u32 = p->responder.ip4.as_u32;
3819     sa.i_id.type = p->loc_id.type;
3820     sa.i_id.data = vec_dup (p->loc_id.data);
3821     sa.r_id.type = p->rem_id.type;
3822     sa.r_id.data = vec_dup (p->rem_id.data);
3823     sa.i_auth.method = p->auth.method;
3824     sa.i_auth.hex = p->auth.hex;
3825     sa.i_auth.data = vec_dup (p->auth.data);
3826     sa.sw_if_index = p->responder.sw_if_index;
3827     vec_add (sa.childs[0].tsi, &p->loc_ts, 1);
3828     vec_add (sa.childs[0].tsr, &p->rem_ts, 1);
3829
3830     ikev2_initial_contact_cleanup (&sa);
3831
3832     /* add SA to the pool */
3833     ikev2_sa_t *sa0 = 0;
3834     pool_get (km->sais, sa0);
3835     clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
3836     hash_set (km->sa_by_ispi, sa0->ispi, sa0 - km->sais);
3837
3838     ikev2_send_ike (vm, if_ip, &p->responder.ip4, bi0, len,
3839                     IKEV2_PORT, sa.dst_port, sa.sw_if_index);
3840
3841     ikev2_elog_exchange ("ispi %lx rspi %lx IKEV2_EXCHANGE_SA_INIT sent to "
3842                          "%d.%d.%d.%d", clib_host_to_net_u64 (sa0->ispi), 0,
3843                          p->responder.ip4.as_u32);
3844   }
3845
3846   return 0;
3847 }
3848
3849 static void
3850 ikev2_delete_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
3851                                 ikev2_child_sa_t * csa)
3852 {
3853   /* Create the Initiator notification for child SA removal */
3854   ikev2_main_t *km = &ikev2_main;
3855   ike_header_t *ike0;
3856   u32 bi0 = 0;
3857   int len;
3858
3859   bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3860   if (!bi0)
3861     {
3862       ikev2_log_error ("buffer alloc failure");
3863       return;
3864     }
3865
3866   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
3867   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3868   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3869   vec_resize (sa->del, 1);
3870   sa->del->protocol_id = IKEV2_PROTOCOL_ESP;
3871   sa->del->spi = csa->i_proposals->spi;
3872   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
3873   sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
3874   len = ikev2_generate_message (sa, ike0, 0, 0);
3875   if (sa->natt)
3876     len = ikev2_insert_non_esp_marker (ike0, len);
3877   ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
3878                   ikev2_get_port (sa), sa->dst_port, sa->sw_if_index);
3879
3880   /* delete local child SA */
3881   ikev2_delete_tunnel_interface (km->vnet_main, sa, csa);
3882   ikev2_sa_del_child_sa (sa, csa);
3883 }
3884
3885 clib_error_t *
3886 ikev2_initiate_delete_child_sa (vlib_main_t * vm, u32 ispi)
3887 {
3888   clib_error_t *r;
3889   ikev2_main_t *km = &ikev2_main;
3890   ikev2_main_per_thread_data_t *tkm;
3891   ikev2_sa_t *fsa = 0;
3892   ikev2_child_sa_t *fchild = 0;
3893
3894   /* Search for the child SA */
3895   vec_foreach (tkm, km->per_thread_data)
3896   {
3897     ikev2_sa_t *sa;
3898     if (fchild)
3899       break;
3900     /* *INDENT-OFF* */
3901     pool_foreach (sa, tkm->sas, ({
3902       fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
3903       if (fchild)
3904         {
3905           fsa = sa;
3906           break;
3907         }
3908     }));
3909     /* *INDENT-ON* */
3910   }
3911
3912   if (!fchild || !fsa)
3913     {
3914       r = clib_error_return (0, "Child SA not found");
3915       return r;
3916     }
3917   else
3918     {
3919       ikev2_delete_child_sa_internal (vm, fsa, fchild);
3920     }
3921
3922   return 0;
3923 }
3924
3925 clib_error_t *
3926 ikev2_initiate_delete_ike_sa (vlib_main_t * vm, u64 ispi)
3927 {
3928   clib_error_t *r;
3929   ikev2_main_t *km = &ikev2_main;
3930   ikev2_main_per_thread_data_t *tkm;
3931   ikev2_sa_t *fsa = 0;
3932   ikev2_main_per_thread_data_t *ftkm = 0;
3933
3934   /* Search for the IKE SA */
3935   vec_foreach (tkm, km->per_thread_data)
3936   {
3937     ikev2_sa_t *sa;
3938     if (fsa)
3939       break;
3940     /* *INDENT-OFF* */
3941     pool_foreach (sa, tkm->sas, ({
3942       if (sa->ispi == ispi)
3943         {
3944           fsa = sa;
3945           ftkm = tkm;
3946           break;
3947         }
3948     }));
3949     /* *INDENT-ON* */
3950   }
3951
3952   if (!fsa)
3953     {
3954       r = clib_error_return (0, "IKE SA not found");
3955       return r;
3956     }
3957
3958   ikev2_initiate_delete_ike_sa_internal (vm, ftkm, fsa);
3959   return 0;
3960 }
3961
3962 static void
3963 ikev2_rekey_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
3964                                ikev2_child_sa_t * csa)
3965 {
3966   /* Create the Initiator request for create child SA */
3967   ike_header_t *ike0;
3968   u32 bi0 = 0;
3969   int len;
3970
3971   bi0 = ikev2_get_new_ike_header_buff (vm, &ike0);
3972   if (!bi0)
3973     {
3974       ikev2_log_error ("buffer alloc failure");
3975       return;
3976     }
3977
3978   ike0->version = IKE_VERSION_2;
3979   ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
3980   ike0->exchange = IKEV2_EXCHANGE_CREATE_CHILD_SA;
3981   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3982   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3983   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
3984   sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
3985
3986   ikev2_rekey_t *rekey;
3987   vec_add2 (sa->rekey, rekey, 1);
3988   ikev2_sa_proposal_t *proposals = vec_dup (csa->i_proposals);
3989
3990   /*need new ispi */
3991   RAND_bytes ((u8 *) & proposals[0].spi, sizeof (proposals[0].spi));
3992   rekey->spi = proposals[0].spi;
3993   rekey->ispi = csa->i_proposals->spi;
3994   len = ikev2_generate_message (sa, ike0, proposals, 0);
3995   if (sa->natt)
3996     len = ikev2_insert_non_esp_marker (ike0, len);
3997   ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
3998                   ikev2_get_port (sa), ikev2_get_port (sa), sa->sw_if_index);
3999   vec_free (proposals);
4000 }
4001
4002 clib_error_t *
4003 ikev2_initiate_rekey_child_sa (vlib_main_t * vm, u32 ispi)
4004 {
4005   clib_error_t *r;
4006   ikev2_main_t *km = &ikev2_main;
4007   ikev2_main_per_thread_data_t *tkm;
4008   ikev2_sa_t *fsa = 0;
4009   ikev2_child_sa_t *fchild = 0;
4010
4011   /* Search for the child SA */
4012   vec_foreach (tkm, km->per_thread_data)
4013   {
4014     ikev2_sa_t *sa;
4015     if (fchild)
4016       break;
4017     /* *INDENT-OFF* */
4018     pool_foreach (sa, tkm->sas, ({
4019       fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
4020       if (fchild)
4021         {
4022           fsa = sa;
4023           break;
4024         }
4025     }));
4026     /* *INDENT-ON* */
4027   }
4028
4029   if (!fchild || !fsa)
4030     {
4031       r = clib_error_return (0, "Child SA not found");
4032       return r;
4033     }
4034   else
4035     {
4036       ikev2_rekey_child_sa_internal (vm, fsa, fchild);
4037     }
4038
4039   return 0;
4040 }
4041
4042 clib_error_t *
4043 ikev2_init (vlib_main_t * vm)
4044 {
4045   ikev2_main_t *km = &ikev2_main;
4046   vlib_thread_main_t *tm = vlib_get_thread_main ();
4047   int thread_id;
4048
4049   clib_memset (km, 0, sizeof (ikev2_main_t));
4050   km->vnet_main = vnet_get_main ();
4051   km->vlib_main = vm;
4052
4053   km->liveness_period = IKEV2_LIVENESS_PERIOD_CHECK;
4054   km->liveness_max_retries = IKEV2_LIVENESS_RETRIES;
4055   ikev2_crypto_init (km);
4056
4057   mhash_init_vec_string (&km->profile_index_by_name, sizeof (uword));
4058
4059   vec_validate_aligned (km->per_thread_data, tm->n_vlib_mains - 1,
4060                         CLIB_CACHE_LINE_BYTES);
4061   for (thread_id = 0; thread_id < tm->n_vlib_mains; thread_id++)
4062     {
4063       ikev2_main_per_thread_data_t *ptd =
4064         vec_elt_at_index (km->per_thread_data, thread_id);
4065
4066       ptd->sa_by_rspi = hash_create (0, sizeof (uword));
4067
4068 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
4069       ptd->evp_ctx = EVP_CIPHER_CTX_new ();
4070       ptd->hmac_ctx = HMAC_CTX_new ();
4071 #else
4072       EVP_CIPHER_CTX_init (&ptd->_evp_ctx);
4073       ptd->evp_ctx = &ptd->_evp_ctx;
4074       HMAC_CTX_init (&(ptd->_hmac_ctx));
4075       ptd->hmac_ctx = &ptd->_hmac_ctx;
4076 #endif
4077     }
4078
4079   km->sa_by_ispi = hash_create (0, sizeof (uword));
4080   km->sw_if_indices = hash_create (0, 0);
4081   km->udp_ports = hash_create (0, sizeof (uword));
4082
4083   udp_register_dst_port (vm, IKEV2_PORT, ikev2_node.index, 1);
4084   udp_register_dst_port (vm, IKEV2_PORT_NATT, ikev2_node.index, 1);
4085
4086   vlib_punt_hdl_t punt_hdl = vlib_punt_client_register ("ikev2");
4087   vlib_punt_register (punt_hdl, ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0],
4088                       "ikev2");
4089   ikev2_cli_reference ();
4090
4091   km->log_level = IKEV2_LOG_ERROR;
4092   km->log_class = vlib_log_register_class ("ikev2", 0);
4093   return 0;
4094 }
4095
4096 /* *INDENT-OFF* */
4097 VLIB_INIT_FUNCTION (ikev2_init) =
4098 {
4099   .runs_after = VLIB_INITS("ipsec_init", "ipsec_punt_init"),
4100 };
4101 /* *INDENT-ON* */
4102
4103 static u8
4104 ikev2_mngr_process_child_sa (ikev2_sa_t * sa, ikev2_child_sa_t * csa,
4105                              u8 del_old_ids)
4106 {
4107   ikev2_main_t *km = &ikev2_main;
4108   ikev2_profile_t *p = 0;
4109   vlib_main_t *vm = km->vlib_main;
4110   f64 now = vlib_time_now (vm);
4111   u8 res = 0;
4112
4113   if (sa->profile_index != ~0)
4114     p = pool_elt_at_index (km->profiles, sa->profile_index);
4115
4116   if (sa->is_initiator && p && csa->time_to_expiration
4117       && now > csa->time_to_expiration)
4118     {
4119       if (!csa->is_expired || csa->rekey_retries > 0)
4120         {
4121           ikev2_rekey_child_sa_internal (vm, sa, csa);
4122           csa->time_to_expiration = now + p->handover;
4123           csa->is_expired = 1;
4124           if (csa->rekey_retries == 0)
4125             {
4126               csa->rekey_retries = 5;
4127             }
4128           else if (csa->rekey_retries > 0)
4129             {
4130               csa->rekey_retries--;
4131               ikev2_log_debug ("Rekeying Child SA 0x%x, retries left %d",
4132                                csa->i_proposals->spi, csa->rekey_retries);
4133               if (csa->rekey_retries == 0)
4134                 {
4135                   csa->rekey_retries = -1;
4136                 }
4137             }
4138           res |= 1;
4139         }
4140       else
4141         {
4142           csa->time_to_expiration = 0;
4143           ikev2_delete_child_sa_internal (vm, sa, csa);
4144           res |= 1;
4145           return res;
4146         }
4147     }
4148
4149   if (del_old_ids)
4150     {
4151       ipip_tunnel_t *ipip = NULL;
4152       u32 sw_if_index = sa->is_tun_itf_set ? sa->tun_itf : ~0;
4153       if (~0 == sw_if_index)
4154         {
4155           ip46_address_t local_ip;
4156           ip46_address_t remote_ip;
4157           if (sa->is_initiator)
4158             {
4159               ip46_address_set_ip4 (&local_ip, &sa->iaddr);
4160               ip46_address_set_ip4 (&remote_ip, &sa->raddr);
4161             }
4162           else
4163             {
4164               ip46_address_set_ip4 (&local_ip, &sa->raddr);
4165               ip46_address_set_ip4 (&remote_ip, &sa->iaddr);
4166             }
4167
4168        /* *INDENT-OFF* */
4169        ipip_tunnel_key_t key = {
4170          .src = local_ip,
4171          .dst = remote_ip,
4172          .transport = IPIP_TRANSPORT_IP4,
4173          .fib_index = 0,
4174        };
4175        /* *INDENT-ON* */
4176
4177           ipip = ipip_tunnel_db_find (&key);
4178
4179           if (ipip)
4180             sw_if_index = ipip->sw_if_index;
4181           else
4182             return res;
4183         }
4184
4185       u32 *sas_in = NULL;
4186       vec_add1 (sas_in, csa->remote_sa_id);
4187       vlib_worker_thread_barrier_sync (vm);
4188       ipsec_tun_protect_update (sw_if_index, NULL, csa->local_sa_id, sas_in);
4189       ipsec_sa_unlock_id (ikev2_flip_alternate_sa_bit (csa->remote_sa_id));
4190       vlib_worker_thread_barrier_release (vm);
4191     }
4192
4193   return res;
4194 }
4195
4196 int
4197 ikev2_set_log_level (ikev2_log_level_t log_level)
4198 {
4199   ikev2_main_t *km = &ikev2_main;
4200
4201   if (log_level >= IKEV2_LOG_MAX)
4202     {
4203       ikev2_log_error ("unknown logging level %d", log_level);
4204       return -1;
4205     }
4206
4207   km->log_level = log_level;
4208   return 0;
4209 }
4210
4211 clib_error_t *
4212 ikev2_set_liveness_params (u32 period, u32 max_retries)
4213 {
4214   ikev2_main_t *km = &ikev2_main;
4215
4216   if (period == 0 || max_retries == 0)
4217     return clib_error_return (0, "invalid args");
4218
4219   km->liveness_period = period;
4220   km->liveness_max_retries = max_retries;
4221   return 0;
4222 }
4223
4224 static void
4225 ikev2_mngr_process_ipsec_sa (ipsec_sa_t * ipsec_sa)
4226 {
4227   ikev2_main_t *km = &ikev2_main;
4228   vlib_main_t *vm = km->vlib_main;
4229   ikev2_main_per_thread_data_t *tkm;
4230   ikev2_sa_t *fsa = 0;
4231   ikev2_profile_t *p = 0;
4232   ikev2_child_sa_t *fchild = 0;
4233   f64 now = vlib_time_now (vm);
4234   vlib_counter_t counts;
4235
4236   /* Search for the SA and child SA */
4237   vec_foreach (tkm, km->per_thread_data)
4238   {
4239     ikev2_sa_t *sa;
4240     if (fchild)
4241       break;
4242     /* *INDENT-OFF* */
4243     pool_foreach (sa, tkm->sas, ({
4244       fchild = ikev2_sa_get_child(sa, ipsec_sa->spi, IKEV2_PROTOCOL_ESP, 1);
4245       if (fchild)
4246         {
4247           fsa = sa;
4248           break;
4249         }
4250     }));
4251     /* *INDENT-ON* */
4252   }
4253   vlib_get_combined_counter (&ipsec_sa_counters,
4254                              ipsec_sa->stat_index, &counts);
4255
4256   if (fsa && fsa->profile_index != ~0 && fsa->is_initiator)
4257     p = pool_elt_at_index (km->profiles, fsa->profile_index);
4258
4259   if (fchild && p && p->lifetime_maxdata)
4260     {
4261       if (!fchild->is_expired && counts.bytes > p->lifetime_maxdata)
4262         {
4263           fchild->time_to_expiration = now;
4264         }
4265     }
4266 }
4267
4268 static void
4269 ikev2_process_pending_sa_init (ikev2_main_t * km)
4270 {
4271   u32 sai;
4272   u64 ispi;
4273   ikev2_sa_t *sa;
4274
4275   /* *INDENT-OFF* */
4276   hash_foreach (ispi, sai, km->sa_by_ispi,
4277   ({
4278     sa = pool_elt_at_index (km->sais, sai);
4279     if (sa->init_response_received)
4280       continue;
4281
4282     u32 bi0;
4283     if (vlib_buffer_alloc (km->vlib_main, &bi0, 1) != 1)
4284       return;
4285
4286     vlib_buffer_t * b = vlib_get_buffer (km->vlib_main, bi0);
4287     clib_memcpy_fast (vlib_buffer_get_current (b),
4288         sa->last_sa_init_req_packet_data,
4289         vec_len (sa->last_sa_init_req_packet_data));
4290     ikev2_send_ike (km->vlib_main, &sa->iaddr, &sa->raddr, bi0,
4291         vec_len (sa->last_sa_init_req_packet_data),
4292         ikev2_get_port (sa), IKEV2_PORT, sa->sw_if_index);
4293   }));
4294   /* *INDENT-ON* */
4295 }
4296
4297 static vlib_node_registration_t ikev2_mngr_process_node;
4298
4299 static void
4300 ikev2_send_informational_request (ikev2_sa_t * sa)
4301 {
4302   ikev2_main_t *km = &ikev2_main;
4303   ip4_address_t *src, *dst;
4304   ike_header_t *ike0;
4305   u32 bi0 = 0;
4306   u16 dp;
4307   int len;
4308
4309   bi0 = ikev2_get_new_ike_header_buff (km->vlib_main, &ike0);
4310   if (!bi0)
4311     {
4312       ikev2_log_error ("buffer alloc failure");
4313       return;
4314     }
4315
4316   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
4317   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4318   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4319   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id + 1);
4320   sa->last_init_msg_id = clib_net_to_host_u32 (ike0->msgid);
4321   len = ikev2_generate_message (sa, ike0, 0, 0);
4322   if (sa->natt)
4323     len = ikev2_insert_non_esp_marker (ike0, len);
4324
4325   if (sa->is_initiator)
4326     {
4327       src = &sa->iaddr;
4328       dst = &sa->raddr;
4329     }
4330   else
4331     {
4332       dst = &sa->iaddr;
4333       src = &sa->raddr;
4334     }
4335
4336   dp = sa->dst_port ? sa->dst_port : ikev2_get_port (sa);
4337   ikev2_send_ike (km->vlib_main, src, dst, bi0, len, ikev2_get_port (sa), dp,
4338                   sa->sw_if_index);
4339 }
4340
4341 static_always_inline int
4342 ikev2_mngr_process_responder_sas (ikev2_sa_t * sa)
4343 {
4344   ikev2_main_t *km = &ikev2_main;
4345   vlib_main_t *vm = km->vlib_main;
4346
4347   if (!sa->keys_generated)
4348     return 0;
4349
4350   if (sa->liveness_retries >= km->liveness_max_retries)
4351     return 1;
4352
4353   f64 now = vlib_time_now (vm);
4354
4355   if (sa->liveness_period_check < now)
4356     {
4357       sa->liveness_retries++;
4358       sa->liveness_period_check = now + km->liveness_period;
4359       ikev2_send_informational_request (sa);
4360     }
4361   return 0;
4362 }
4363
4364 static uword
4365 ikev2_mngr_process_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
4366                        vlib_frame_t * f)
4367 {
4368   ikev2_main_t *km = &ikev2_main;
4369   ipsec_main_t *im = &ipsec_main;
4370   ikev2_profile_t *p;
4371   ikev2_child_sa_t *c;
4372   u32 *sai;
4373
4374   while (1)
4375     {
4376       u8 req_sent = 0;
4377       vlib_process_wait_for_event_or_clock (vm, 1);
4378       vlib_process_get_events (vm, NULL);
4379
4380       /* process ike child sas */
4381       ikev2_main_per_thread_data_t *tkm;
4382       vec_foreach (tkm, km->per_thread_data)
4383       {
4384         ikev2_sa_t *sa;
4385         u32 *to_be_deleted = 0;
4386
4387         /* *INDENT-OFF* */
4388         pool_foreach (sa, tkm->sas, ({
4389           ikev2_child_sa_t *c;
4390           u8 del_old_ids = 0;
4391           if (sa->old_remote_id_present && 0 > sa->old_id_expiration)
4392             {
4393               sa->old_remote_id_present = 0;
4394               del_old_ids = 1;
4395             }
4396           else
4397             sa->old_id_expiration -= 1;
4398
4399           vec_foreach (c, sa->childs)
4400             {
4401             req_sent |= ikev2_mngr_process_child_sa(sa, c, del_old_ids);
4402             }
4403
4404           if (ikev2_mngr_process_responder_sas (sa))
4405             vec_add1 (to_be_deleted, sa - tkm->sas);
4406         }));
4407         /* *INDENT-ON* */
4408
4409         vec_foreach (sai, to_be_deleted)
4410         {
4411           sa = pool_elt_at_index (tkm->sas, sai[0]);
4412           u8 reinitiate = (sa->is_initiator && sa->profile_index != ~0);
4413           vec_foreach (c, sa->childs)
4414           {
4415             ikev2_delete_tunnel_interface (km->vnet_main, sa, c);
4416             ikev2_sa_del_child_sa (sa, c);
4417           }
4418           ikev2_sa_free_all_vec (sa);
4419           hash_unset (tkm->sa_by_rspi, sa->rspi);
4420           pool_put (tkm->sas, sa);
4421
4422           if (reinitiate)
4423             {
4424               p = pool_elt_at_index (km->profiles, sa->profile_index);
4425               if (p)
4426                 {
4427                   ikev2_initiate_sa_init (vm, p->name);
4428                 }
4429             }
4430         }
4431         vec_free (to_be_deleted);
4432       }
4433
4434       /* process ipsec sas */
4435       ipsec_sa_t *sa;
4436       /* *INDENT-OFF* */
4437       pool_foreach (sa, im->sad, ({
4438         ikev2_mngr_process_ipsec_sa(sa);
4439       }));
4440       /* *INDENT-ON* */
4441
4442       ikev2_process_pending_sa_init (km);
4443
4444       if (req_sent)
4445         {
4446           vlib_process_wait_for_event_or_clock (vm, 5);
4447           vlib_process_get_events (vm, NULL);
4448           req_sent = 0;
4449         }
4450
4451     }
4452   return 0;
4453 }
4454
4455 /* *INDENT-OFF* */
4456 VLIB_REGISTER_NODE (ikev2_mngr_process_node, static) = {
4457     .function = ikev2_mngr_process_fn,
4458     .type = VLIB_NODE_TYPE_PROCESS,
4459     .name =
4460     "ikev2-manager-process",
4461 };
4462
4463 VLIB_PLUGIN_REGISTER () = {
4464     .version = VPP_BUILD_VER,
4465     .description = "Internet Key Exchange (IKEv2) Protocol",
4466 };
4467 /* *INDENT-ON* */
4468
4469 /*
4470  * fd.io coding-style-patch-verification: ON
4471  *
4472  * Local Variables:
4473  * eval: (c-set-style "gnu")
4474  * End:
4475  */