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