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