ikev2: fix lookup in wrong ip table
[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,
2838                      vlib_node_runtime_t * node, vlib_frame_t * frame,
2839                      u8 is_ip4)
2840 {
2841   u32 n_left = frame->n_vectors, *from;
2842   ikev2_main_t *km = &ikev2_main;
2843   vlib_buffer_t *bufs[VLIB_FRAME_SIZE], **b;
2844   u16 nexts[VLIB_FRAME_SIZE], *next = nexts;
2845   ikev2_main_per_thread_data_t *ptd = ikev2_get_per_thread_data ();
2846   int res;
2847
2848   from = vlib_frame_vector_args (frame);
2849   vlib_get_buffers (vm, from, bufs, n_left);
2850   b = bufs;
2851
2852   while (n_left > 0)
2853     {
2854       vlib_buffer_t *b0 = b[0];
2855       next[0] = is_ip4 ? IKEV2_NEXT_IP4_ERROR_DROP
2856         : IKEV2_NEXT_IP6_ERROR_DROP;
2857       ip4_header_t *ip40 = 0;
2858       ip6_header_t *ip60 = 0;
2859       udp_header_t *udp0;
2860       ike_header_t *ike0;
2861       ikev2_sa_t *sa0 = 0;
2862       ikev2_sa_t sa;            /* temporary store for SA */
2863       u32 rlen, slen = 0;
2864       int ip_hdr_sz = 0;
2865       int is_req = 0, has_non_esp_marker = 0;
2866
2867       ASSERT (0 == b0->punt_reason
2868               || (is_ip4
2869                   && b0->punt_reason ==
2870                   ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0]));
2871
2872       if (is_ip4
2873           && b0->punt_reason == ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0])
2874         {
2875           u8 *ptr = vlib_buffer_get_current (b0);
2876           ip40 = (ip4_header_t *) ptr;
2877           ptr += sizeof (*ip40);
2878           udp0 = (udp_header_t *) ptr;
2879           ptr += sizeof (*udp0);
2880           ike0 = (ike_header_t *) ptr;
2881           ip_hdr_sz = sizeof (*ip40);
2882         }
2883       else
2884         {
2885           u8 *ipx_hdr = b0->data + vnet_buffer (b0)->l3_hdr_offset;
2886           ike0 = vlib_buffer_get_current (b0);
2887           vlib_buffer_advance (b0, -sizeof (*udp0));
2888           udp0 = vlib_buffer_get_current (b0);
2889
2890           if (is_ip4)
2891             {
2892               ip40 = (ip4_header_t *) ipx_hdr;
2893               ip_hdr_sz = sizeof (*ip40);
2894             }
2895           else
2896             {
2897               ip60 = (ip6_header_t *) ipx_hdr;
2898               ip_hdr_sz = sizeof (*ip60);
2899             }
2900           vlib_buffer_advance (b0, -ip_hdr_sz);
2901         }
2902
2903       rlen = b0->current_length - ip_hdr_sz - sizeof (*udp0);
2904
2905       /* check for non-esp marker */
2906       if (*((u32 *) ike0) == 0)
2907         {
2908           ike0 =
2909             (ike_header_t *) ((u8 *) ike0 + sizeof (ikev2_non_esp_marker));
2910           rlen -= sizeof (ikev2_non_esp_marker);
2911           has_non_esp_marker = 1;
2912         }
2913
2914       if (clib_net_to_host_u32 (ike0->length) != rlen)
2915         {
2916           vlib_node_increment_counter (vm, node->node_index,
2917                                        IKEV2_ERROR_BAD_LENGTH, 1);
2918           goto dispatch0;
2919         }
2920
2921       if (ike0->version != IKE_VERSION_2)
2922         {
2923           vlib_node_increment_counter (vm, node->node_index,
2924                                        IKEV2_ERROR_NOT_IKEV2, 1);
2925           goto dispatch0;
2926         }
2927
2928       if (ike0->exchange == IKEV2_EXCHANGE_SA_INIT)
2929         {
2930           sa0 = &sa;
2931           clib_memset (sa0, 0, sizeof (*sa0));
2932
2933           if (ike_hdr_is_initiator (ike0))
2934             {
2935               if (ike0->rspi == 0)
2936                 {
2937                   if (is_ip4)
2938                     ikev2_set_ip_address (sa0, &ip40->src_address,
2939                                           &ip40->dst_address, AF_IP4);
2940                   else
2941                     ikev2_set_ip_address (sa0, &ip60->src_address,
2942                                           &ip60->dst_address, AF_IP6);
2943
2944                   sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
2945
2946                   slen =
2947                     ikev2_retransmit_sa_init (ike0, sa0->iaddr,
2948                                               sa0->raddr, rlen);
2949                   if (slen)
2950                     {
2951                       vlib_node_increment_counter (vm, node->node_index,
2952                                                    ~0 ==
2953                                                    slen ?
2954                                                    IKEV2_ERROR_IKE_SA_INIT_IGNORE
2955                                                    :
2956                                                    IKEV2_ERROR_IKE_SA_INIT_RETRANSMIT,
2957                                                    1);
2958                       goto dispatch0;
2959                     }
2960
2961                   res = ikev2_process_sa_init_req (
2962                     vm, sa0, ike0, udp0, rlen,
2963                     vnet_buffer (b0)->sw_if_index[VLIB_RX]);
2964                   if (!res)
2965                     vlib_node_increment_counter (vm, node->node_index,
2966                                                  IKEV2_ERROR_MALFORMED_PACKET,
2967                                                  1);
2968
2969                   if (sa0->state == IKEV2_STATE_SA_INIT)
2970                     {
2971                       ikev2_sa_free_proposal_vector (&sa0->r_proposals);
2972                       sa0->r_proposals =
2973                         ikev2_select_proposal (sa0->i_proposals,
2974                                                IKEV2_PROTOCOL_IKE);
2975                       ikev2_generate_sa_init_data_and_log (sa0);
2976                     }
2977
2978                   if (sa0->state == IKEV2_STATE_SA_INIT
2979                       || sa0->state == IKEV2_STATE_NOTIFY_AND_DELETE)
2980                     {
2981                       ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
2982                       slen = ikev2_generate_message (b0, sa0, ike0, 0, udp0);
2983                       if (~0 == slen)
2984                         vlib_node_increment_counter (vm, node->node_index,
2985                                                      IKEV2_ERROR_NO_BUFF_SPACE,
2986                                                      1);
2987                     }
2988
2989                   if (sa0->state == IKEV2_STATE_SA_INIT)
2990                     {
2991                       /* add SA to the pool */
2992                       pool_get (ptd->sas, sa0);
2993                       clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
2994                       ikev2_init_sa (vm, sa0);
2995                       hash_set (ptd->sa_by_rspi, sa0->rspi, sa0 - ptd->sas);
2996                     }
2997                   else
2998                     {
2999                       ikev2_sa_free_all_vec (sa0);
3000                     }
3001                 }
3002             }
3003           else                  //received sa_init without initiator flag
3004             {
3005               if (is_ip4)
3006                 ikev2_set_ip_address (sa0, &ip40->dst_address,
3007                                       &ip40->src_address, AF_IP4);
3008               else
3009                 ikev2_set_ip_address (sa0, &ip60->dst_address,
3010                                       &ip60->src_address, AF_IP6);
3011
3012               ikev2_process_sa_init_resp (vm, sa0, ike0, udp0, rlen);
3013
3014               if (sa0->state == IKEV2_STATE_SA_INIT)
3015                 {
3016                   is_req = 1;
3017                   ike0->exchange = IKEV2_EXCHANGE_IKE_AUTH;
3018                   uword *p = hash_get (km->sa_by_ispi, sa0->ispi);
3019                   if (p)
3020                     {
3021                       ikev2_sa_t *sai = pool_elt_at_index (km->sais, p[0]);
3022
3023                       if (clib_atomic_bool_cmp_and_swap
3024                           (&sai->init_response_received, 0, 1))
3025                         {
3026                           ikev2_complete_sa_data (sa0, sai);
3027                           ikev2_calc_keys (sa0);
3028                           ikev2_sa_auth_init (sa0);
3029                           ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
3030                           ike0->msgid =
3031                             clib_net_to_host_u32 (sai->last_init_msg_id);
3032                           sa0->last_init_msg_id = sai->last_init_msg_id + 1;
3033                           slen =
3034                             ikev2_generate_message (b0, sa0, ike0, 0, udp0);
3035                           if (~0 == slen)
3036                             vlib_node_increment_counter (vm,
3037                                                          node->node_index,
3038                                                          IKEV2_ERROR_NO_BUFF_SPACE,
3039                                                          1);
3040                         }
3041                       else
3042                         {
3043                           /* we've already processed sa-init response */
3044                           sa0->state = IKEV2_STATE_UNKNOWN;
3045                         }
3046                     }
3047                 }
3048
3049               if (sa0->state == IKEV2_STATE_SA_INIT)
3050                 {
3051                   /* add SA to the pool */
3052                   pool_get (ptd->sas, sa0);
3053                   clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
3054                   hash_set (ptd->sa_by_rspi, sa0->rspi, sa0 - ptd->sas);
3055                 }
3056               else
3057                 {
3058                   ikev2_sa_free_all_vec (sa0);
3059                 }
3060             }
3061         }
3062       else if (ike0->exchange == IKEV2_EXCHANGE_IKE_AUTH)
3063         {
3064           uword *p;
3065           p = hash_get (ptd->sa_by_rspi, clib_net_to_host_u64 (ike0->rspi));
3066           if (p)
3067             {
3068               sa0 = pool_elt_at_index (ptd->sas, p[0]);
3069               slen = ikev2_retransmit_resp (sa0, ike0);
3070               if (slen)
3071                 {
3072                   vlib_node_increment_counter (vm, node->node_index,
3073                                                ~0 ==
3074                                                slen ?
3075                                                IKEV2_ERROR_IKE_REQ_IGNORE
3076                                                :
3077                                                IKEV2_ERROR_IKE_REQ_RETRANSMIT,
3078                                                1);
3079                   goto dispatch0;
3080                 }
3081
3082               sa0->dst_port = clib_net_to_host_u16 (udp0->src_port);
3083               res = ikev2_process_auth_req (vm, sa0, ike0, rlen);
3084               if (res)
3085                 ikev2_sa_auth (sa0);
3086               else
3087                 vlib_node_increment_counter (vm, node->node_index,
3088                                              IKEV2_ERROR_MALFORMED_PACKET, 1);
3089               if (sa0->state == IKEV2_STATE_AUTHENTICATED)
3090                 {
3091                   ikev2_initial_contact_cleanup (ptd, sa0);
3092                   ikev2_sa_match_ts (sa0);
3093                   if (sa0->state != IKEV2_STATE_TS_UNACCEPTABLE)
3094                     ikev2_create_tunnel_interface (vm, sa0,
3095                                                    &sa0->childs[0],
3096                                                    p[0], 0, 0);
3097                 }
3098
3099               if (sa0->is_initiator)
3100                 {
3101                   ikev2_del_sa_init (sa0->ispi);
3102                 }
3103               else
3104                 {
3105                   ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3106                   slen = ikev2_generate_message (b0, sa0, ike0, 0, udp0);
3107                   if (~0 == slen)
3108                     vlib_node_increment_counter (vm, node->node_index,
3109                                                  IKEV2_ERROR_NO_BUFF_SPACE,
3110                                                  1);
3111                 }
3112             }
3113         }
3114       else if (ike0->exchange == IKEV2_EXCHANGE_INFORMATIONAL)
3115         {
3116           uword *p;
3117           p = hash_get (ptd->sa_by_rspi, clib_net_to_host_u64 (ike0->rspi));
3118           if (p)
3119             {
3120               sa0 = pool_elt_at_index (ptd->sas, p[0]);
3121               slen = ikev2_retransmit_resp (sa0, ike0);
3122               if (slen)
3123                 {
3124                   vlib_node_increment_counter (vm, node->node_index,
3125                                                ~0 ==
3126                                                slen ?
3127                                                IKEV2_ERROR_IKE_REQ_IGNORE
3128                                                :
3129                                                IKEV2_ERROR_IKE_REQ_RETRANSMIT,
3130                                                1);
3131                   goto dispatch0;
3132                 }
3133
3134               res = ikev2_process_informational_req (vm, sa0, ike0, rlen);
3135               if (!res)
3136                 {
3137                   vlib_node_increment_counter (vm, node->node_index,
3138                                                IKEV2_ERROR_MALFORMED_PACKET,
3139                                                1);
3140                   slen = ~0;
3141                   goto dispatch0;
3142                 }
3143
3144               if (sa0->del)
3145                 {
3146                   if (sa0->del[0].protocol_id != IKEV2_PROTOCOL_IKE)
3147                     {
3148                       ikev2_delete_t *d, *tmp, *resp = 0;
3149                       vec_foreach (d, sa0->del)
3150                       {
3151                         ikev2_child_sa_t *ch_sa;
3152                         ch_sa = ikev2_sa_get_child (sa0, d->spi,
3153                                                     d->protocol_id,
3154                                                     !sa0->is_initiator);
3155                         if (ch_sa)
3156                           {
3157                             ikev2_delete_tunnel_interface (km->vnet_main,
3158                                                            sa0, ch_sa);
3159                             if (!sa0->is_initiator)
3160                               {
3161                                 vec_add2 (resp, tmp, 1);
3162                                 tmp->protocol_id = d->protocol_id;
3163                                 tmp->spi = ch_sa->r_proposals[0].spi;
3164                               }
3165                             ikev2_sa_del_child_sa (sa0, ch_sa);
3166                           }
3167                       }
3168                       if (!sa0->is_initiator)
3169                         {
3170                           vec_free (sa0->del);
3171                           sa0->del = resp;
3172                         }
3173                     }
3174                 }
3175               if (ike_hdr_is_request (ike0))
3176                 {
3177                   ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3178                   slen = ikev2_generate_message (b0, sa0, ike0, 0, udp0);
3179                   if (~0 == slen)
3180                     vlib_node_increment_counter (vm, node->node_index,
3181                                                  IKEV2_ERROR_NO_BUFF_SPACE,
3182                                                  1);
3183                 }
3184             }
3185         }
3186       else if (ike0->exchange == IKEV2_EXCHANGE_CREATE_CHILD_SA)
3187         {
3188           uword *p;
3189           p = hash_get (ptd->sa_by_rspi, clib_net_to_host_u64 (ike0->rspi));
3190           if (p)
3191             {
3192               sa0 = pool_elt_at_index (ptd->sas, p[0]);
3193               slen = ikev2_retransmit_resp (sa0, ike0);
3194               if (slen)
3195                 {
3196                   vlib_node_increment_counter (vm, node->node_index,
3197                                                ~0 ==
3198                                                slen ?
3199                                                IKEV2_ERROR_IKE_REQ_IGNORE
3200                                                :
3201                                                IKEV2_ERROR_IKE_REQ_RETRANSMIT,
3202                                                1);
3203                   goto dispatch0;
3204                 }
3205
3206               res = ikev2_process_create_child_sa_req (vm, sa0, ike0, rlen);
3207               if (!res)
3208                 {
3209                   vlib_node_increment_counter (vm, node->node_index,
3210                                                IKEV2_ERROR_MALFORMED_PACKET,
3211                                                1);
3212                   slen = ~0;
3213                   goto dispatch0;
3214                 }
3215
3216               if (sa0->rekey)
3217                 {
3218                   if (sa0->rekey[0].protocol_id != IKEV2_PROTOCOL_IKE)
3219                     {
3220                       if (sa0->childs)
3221                         ikev2_sa_free_all_child_sa (&sa0->childs);
3222                       ikev2_child_sa_t *child;
3223                       vec_add2 (sa0->childs, child, 1);
3224                       clib_memset (child, 0, sizeof (*child));
3225                       child->r_proposals = sa0->rekey[0].r_proposal;
3226                       child->i_proposals = sa0->rekey[0].i_proposal;
3227                       child->tsi = sa0->rekey[0].tsi;
3228                       child->tsr = sa0->rekey[0].tsr;
3229                       ikev2_create_tunnel_interface (vm, sa0, child, p[0],
3230                                                      child - sa0->childs, 1);
3231                     }
3232                   if (ike_hdr_is_response (ike0))
3233                     {
3234                       vec_free (sa0->rekey);
3235                     }
3236                   else
3237                     {
3238                       ike0->flags = IKEV2_HDR_FLAG_RESPONSE;
3239                       slen = ikev2_generate_message (b0, sa0, ike0, 0, udp0);
3240                       if (~0 == slen)
3241                         vlib_node_increment_counter (vm, node->node_index,
3242                                                      IKEV2_ERROR_NO_BUFF_SPACE,
3243                                                      1);
3244                     }
3245                 }
3246             }
3247         }
3248       else
3249         {
3250           ikev2_elog_uint_peers_addr (ike0->exchange, ip40, ip60, is_ip4);
3251         }
3252
3253     dispatch0:
3254       /* if we are sending packet back, rewrite headers */
3255       if (slen && ~0 != slen)
3256         {
3257           if (is_ip4)
3258             {
3259               next[0] = IKEV2_NEXT_IP4_LOOKUP;
3260               ikev2_rewrite_v4_addrs (sa0, ip40);
3261             }
3262           else
3263             {
3264               next[0] = IKEV2_NEXT_IP6_LOOKUP;
3265               ikev2_rewrite_v6_addrs (sa0, ip60);
3266             }
3267
3268           if (is_req)
3269             {
3270               udp0->dst_port = udp0->src_port =
3271                 clib_net_to_host_u16 (ikev2_get_port (sa0));
3272
3273               if (udp0->dst_port == clib_net_to_host_u16 (IKEV2_PORT_NATT)
3274                   && ikev2_natt_active (sa0))
3275                 {
3276                   if (!has_non_esp_marker)
3277                     slen = ikev2_insert_non_esp_marker (ike0, slen);
3278                 }
3279             }
3280           else
3281             {
3282               if (has_non_esp_marker)
3283                 slen += sizeof (ikev2_non_esp_marker);
3284
3285               u16 tp = udp0->dst_port;
3286               udp0->dst_port = udp0->src_port;
3287               udp0->src_port = tp;
3288             }
3289
3290           udp0->length = clib_host_to_net_u16 (slen + sizeof (udp_header_t));
3291           udp0->checksum = 0;
3292           b0->current_length = slen + ip_hdr_sz + sizeof (udp_header_t);
3293           if (is_ip4)
3294             {
3295               ip40->length = clib_host_to_net_u16 (b0->current_length);
3296               ip40->checksum = ip4_header_checksum (ip40);
3297             }
3298           else
3299             {
3300               ip60->payload_length =
3301                 clib_host_to_net_u16 (b0->current_length - sizeof (*ip60));
3302             }
3303         }
3304       /* delete sa */
3305       if (sa0 && (sa0->state == IKEV2_STATE_DELETED ||
3306                   sa0->state == IKEV2_STATE_NOTIFY_AND_DELETE))
3307         {
3308           ikev2_child_sa_t *c;
3309
3310           vec_foreach (c, sa0->childs)
3311             ikev2_delete_tunnel_interface (km->vnet_main, sa0, c);
3312
3313           ikev2_delete_sa (ptd, sa0);
3314         }
3315       if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE)
3316                          && (b0->flags & VLIB_BUFFER_IS_TRACED)))
3317         {
3318
3319           ikev2_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t));
3320           t->sw_if_index = vnet_buffer (b0)->sw_if_index[VLIB_RX];
3321           t->next_index = next[0];
3322         }
3323       n_left -= 1;
3324       next += 1;
3325       b += 1;
3326     }
3327
3328   vlib_node_increment_counter (vm, node->node_index,
3329                                IKEV2_ERROR_PROCESSED, frame->n_vectors);
3330   vlib_buffer_enqueue_to_next (vm, node, from, nexts, frame->n_vectors);
3331   return frame->n_vectors;
3332 }
3333
3334 static uword
3335 ikev2_ip4 (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
3336 {
3337   return ikev2_node_internal (vm, node, frame, 1 /* is_ip4 */ );
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 */ );
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_ip6,static) = {
3365   .function = ikev2_ip6,
3366   .name = "ikev2-ip6",
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_IP6_N_NEXT,
3375   .next_nodes = {
3376     [IKEV2_NEXT_IP6_LOOKUP] = "ip6-lookup",
3377     [IKEV2_NEXT_IP6_ERROR_DROP] = "error-drop",
3378   },
3379 };
3380 /* *INDENT-ON* */
3381
3382 // set ikev2 proposals when vpp is used as initiator
3383 static clib_error_t *
3384 ikev2_set_initiator_proposals (vlib_main_t * vm, ikev2_sa_t * sa,
3385                                ikev2_transforms_set * ts,
3386                                ikev2_sa_proposal_t ** proposals, int is_ike)
3387 {
3388   clib_error_t *r;
3389   ikev2_main_t *km = &ikev2_main;
3390   ikev2_sa_proposal_t *proposal;
3391   vec_add2 (*proposals, proposal, 1);
3392   ikev2_sa_transform_t *td;
3393   int error;
3394
3395   /* Encryption */
3396   error = 1;
3397   vec_foreach (td, km->supported_transforms)
3398   {
3399     if (td->type == IKEV2_TRANSFORM_TYPE_ENCR
3400         && td->encr_type == ts->crypto_alg
3401         && td->key_len == ts->crypto_key_size / 8)
3402       {
3403         u16 attr[2];
3404         attr[0] = clib_host_to_net_u16 (14 | (1 << 15));
3405         attr[1] = clib_host_to_net_u16 (td->key_len << 3);
3406         vec_add (td->attrs, (u8 *) attr, 4);
3407         vec_add1 (proposal->transforms, *td);
3408         td->attrs = 0;
3409
3410         error = 0;
3411         break;
3412       }
3413   }
3414   if (error)
3415     {
3416       r = clib_error_return (0, "Unsupported algorithm");
3417       return r;
3418     }
3419
3420   if (IKEV2_TRANSFORM_INTEG_TYPE_NONE != ts->integ_alg)
3421     {
3422       /* Integrity */
3423       error = 1;
3424       vec_foreach (td, km->supported_transforms)
3425       {
3426         if (td->type == IKEV2_TRANSFORM_TYPE_INTEG
3427             && td->integ_type == ts->integ_alg)
3428           {
3429             vec_add1 (proposal->transforms, *td);
3430             error = 0;
3431             break;
3432           }
3433       }
3434       if (error)
3435         {
3436           ikev2_elog_error
3437             ("Didn't find any supported algorithm for IKEV2_TRANSFORM_TYPE_INTEG");
3438           r = clib_error_return (0, "Unsupported algorithm");
3439           return r;
3440         }
3441     }
3442
3443   /* PRF */
3444   if (is_ike)
3445     {
3446       error = 1;
3447       vec_foreach (td, km->supported_transforms)
3448       {
3449         if (td->type == IKEV2_TRANSFORM_TYPE_PRF
3450             && td->prf_type == IKEV2_TRANSFORM_PRF_TYPE_PRF_HMAC_SHA2_256)
3451           {
3452             vec_add1 (proposal->transforms, *td);
3453             error = 0;
3454             break;
3455           }
3456       }
3457       if (error)
3458         {
3459           r = clib_error_return (0, "Unsupported algorithm");
3460           return r;
3461         }
3462     }
3463
3464   /* DH */
3465   if (is_ike)
3466     {
3467       error = 1;
3468       vec_foreach (td, km->supported_transforms)
3469       {
3470         if (td->type == IKEV2_TRANSFORM_TYPE_DH && td->dh_type == ts->dh_type)
3471           {
3472             vec_add1 (proposal->transforms, *td);
3473             if (is_ike)
3474               {
3475                 sa->dh_group = td->dh_type;
3476               }
3477             error = 0;
3478             break;
3479           }
3480       }
3481       if (error)
3482         {
3483           r = clib_error_return (0, "Unsupported algorithm");
3484           return r;
3485         }
3486     }
3487
3488   if (!is_ike)
3489     {
3490       error = 1;
3491       vec_foreach (td, km->supported_transforms)
3492       {
3493         if (td->type == IKEV2_TRANSFORM_TYPE_ESN)
3494           {
3495             vec_add1 (proposal->transforms, *td);
3496             error = 0;
3497           }
3498       }
3499       if (error)
3500         {
3501           r = clib_error_return (0, "Unsupported algorithm");
3502           return r;
3503         }
3504     }
3505
3506
3507   return 0;
3508 }
3509
3510 static ikev2_profile_t *
3511 ikev2_profile_index_by_name (u8 * name)
3512 {
3513   ikev2_main_t *km = &ikev2_main;
3514   uword *p;
3515
3516   p = mhash_get (&km->profile_index_by_name, name);
3517   if (!p)
3518     return 0;
3519
3520   return pool_elt_at_index (km->profiles, p[0]);
3521 }
3522
3523
3524 static void
3525 ikev2_send_ike (vlib_main_t * vm, ip_address_t * src, ip_address_t * dst,
3526                 u32 bi0, u32 len, u16 src_port, u16 dst_port, u32 sw_if_index)
3527 {
3528   ip4_header_t *ip40;
3529   ip6_header_t *ip60;
3530   udp_header_t *udp0;
3531   vlib_buffer_t *b0;
3532   vlib_frame_t *f;
3533   u32 *to_next;
3534
3535   b0 = vlib_get_buffer (vm, bi0);
3536   vlib_buffer_advance (b0, -sizeof (udp_header_t));
3537   udp0 = vlib_buffer_get_current (b0);
3538   udp0->dst_port = clib_host_to_net_u16 (dst_port);
3539   udp0->src_port = clib_host_to_net_u16 (src_port);
3540   udp0->length = clib_host_to_net_u16 (len + sizeof (udp_header_t));
3541   udp0->checksum = 0;
3542
3543   if (ip_addr_version (dst) == AF_IP4)
3544     {
3545       vlib_buffer_advance (b0, -sizeof (ip4_header_t));
3546       ip40 = vlib_buffer_get_current (b0);
3547       ip40->ip_version_and_header_length = 0x45;
3548       ip40->tos = 0;
3549       ip40->fragment_id = 0;
3550       ip40->flags_and_fragment_offset = 0;
3551       ip40->ttl = 0xff;
3552       ip40->protocol = IP_PROTOCOL_UDP;
3553       ip40->dst_address.as_u32 = ip_addr_v4 (dst).as_u32;
3554       ip40->src_address.as_u32 = ip_addr_v4 (src).as_u32;
3555       b0->current_length =
3556         len + sizeof (ip4_header_t) + sizeof (udp_header_t);
3557       ip40->length = clib_host_to_net_u16 (b0->current_length);
3558       ip40->checksum = ip4_header_checksum (ip40);
3559     }
3560   else
3561     {
3562       vlib_buffer_advance (b0, -sizeof (ip6_header_t));
3563       ip60 = vlib_buffer_get_current (b0);
3564
3565       b0->current_length = len + sizeof (*ip60) + sizeof (udp_header_t);
3566       ip60->ip_version_traffic_class_and_flow_label =
3567         clib_host_to_net_u32 (0x6 << 28);
3568       ip60->payload_length =
3569         clib_host_to_net_u16 (b0->current_length - sizeof (*ip60));
3570       ip60->protocol = IP_PROTOCOL_UDP;
3571       ip60->hop_limit = 0xff;
3572       clib_memcpy_fast (ip60->src_address.as_u8, ip_addr_v6 (src).as_u8,
3573                         sizeof (ip60->src_address));
3574       clib_memcpy_fast (ip60->dst_address.as_u8, ip_addr_v6 (dst).as_u8,
3575                         sizeof (ip60->src_address));
3576     }
3577
3578   b0->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
3579   vnet_buffer (b0)->sw_if_index[VLIB_RX] = sw_if_index;
3580   vnet_buffer (b0)->sw_if_index[VLIB_TX] = ~0;
3581
3582   u32 next_index = (ip_addr_version (dst) == AF_IP4) ?
3583     ip4_lookup_node.index : ip6_lookup_node.index;
3584
3585   /* send the request */
3586   f = vlib_get_frame_to_node (vm, next_index);
3587   to_next = vlib_frame_vector_args (f);
3588   to_next[0] = bi0;
3589   f->n_vectors = 1;
3590   vlib_put_frame_to_node (vm, next_index, f);
3591
3592 }
3593
3594 static u32
3595 ikev2_get_new_ike_header_buff (vlib_main_t * vm, vlib_buffer_t ** b)
3596 {
3597   u32 bi0;
3598   if (vlib_buffer_alloc (vm, &bi0, 1) != 1)
3599     {
3600       *b = 0;
3601       return 0;
3602     }
3603   *b = vlib_get_buffer (vm, bi0);
3604   return bi0;
3605 }
3606
3607 clib_error_t *
3608 ikev2_set_local_key (vlib_main_t * vm, u8 * file)
3609 {
3610   ikev2_main_t *km = &ikev2_main;
3611
3612   if (km->pkey)
3613     EVP_PKEY_free (km->pkey);
3614   km->pkey = ikev2_load_key_file (file);
3615   if (km->pkey == NULL)
3616     return clib_error_return (0, "load key '%s' failed", file);
3617
3618   return 0;
3619 }
3620
3621 static_always_inline vnet_api_error_t
3622 ikev2_register_udp_port (ikev2_profile_t * p, u16 port)
3623 {
3624   ikev2_main_t *km = &ikev2_main;
3625   udp_dst_port_info_t *pi;
3626
3627   uword *v = hash_get (km->udp_ports, port);
3628   pi = udp_get_dst_port_info (&udp_main, port, UDP_IP4);
3629
3630   if (v)
3631     {
3632       /* IKE already uses this port, only increment reference counter */
3633       ASSERT (pi);
3634       v[0]++;
3635     }
3636   else
3637     {
3638       if (pi)
3639         return VNET_API_ERROR_UDP_PORT_TAKEN;
3640
3641       udp_register_dst_port (km->vlib_main, port,
3642                              ipsec4_tun_input_node.index, 1);
3643       hash_set (km->udp_ports, port, 1);
3644     }
3645   p->ipsec_over_udp_port = port;
3646   return 0;
3647 }
3648
3649 static_always_inline void
3650 ikev2_unregister_udp_port (ikev2_profile_t * p)
3651 {
3652   ikev2_main_t *km = &ikev2_main;
3653   uword *v;
3654
3655   if (p->ipsec_over_udp_port == IPSEC_UDP_PORT_NONE)
3656     return;
3657
3658   v = hash_get (km->udp_ports, p->ipsec_over_udp_port);
3659   if (!v)
3660     return;
3661
3662   v[0]--;
3663
3664   if (v[0] == 0)
3665     {
3666       udp_unregister_dst_port (km->vlib_main, p->ipsec_over_udp_port, 1);
3667       hash_unset (km->udp_ports, p->ipsec_over_udp_port);
3668     }
3669
3670   p->ipsec_over_udp_port = IPSEC_UDP_PORT_NONE;
3671 }
3672
3673 static void
3674 ikev2_initiate_delete_ike_sa_internal (vlib_main_t * vm,
3675                                        ikev2_main_per_thread_data_t * tkm,
3676                                        ikev2_sa_t * sa, u8 send_notification)
3677 {
3678   ikev2_main_t *km = &ikev2_main;
3679   ip_address_t *src, *dst;
3680   vlib_buffer_t *b0;
3681   ikev2_child_sa_t *c;
3682
3683   /* Create the Initiator notification for IKE SA removal */
3684   ike_header_t *ike0;
3685   u32 bi0 = 0;
3686   int len;
3687
3688   vec_resize (sa->del, 1);
3689   sa->del->protocol_id = IKEV2_PROTOCOL_IKE;
3690   sa->del->spi = sa->ispi;
3691
3692   if (send_notification)
3693     {
3694       bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
3695       if (!bi0)
3696         {
3697           ikev2_log_error ("buffer alloc failure");
3698           goto delete_sa;
3699         }
3700
3701       ike0 = vlib_buffer_get_current (b0);
3702       ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
3703       ike0->ispi = clib_host_to_net_u64 (sa->ispi);
3704       ike0->rspi = clib_host_to_net_u64 (sa->rspi);
3705       ike0->flags = 0;
3706       ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
3707       sa->last_init_msg_id += 1;
3708       len = ikev2_generate_message (b0, sa, ike0, 0, 0);
3709       if (~0 == len)
3710         return;
3711
3712       if (ikev2_natt_active (sa))
3713         len = ikev2_insert_non_esp_marker (ike0, len);
3714
3715       if (sa->is_initiator)
3716         {
3717           src = &sa->iaddr;
3718           dst = &sa->raddr;
3719         }
3720       else
3721         {
3722           dst = &sa->iaddr;
3723           src = &sa->raddr;
3724         }
3725
3726       ikev2_send_ike (vm, src, dst, bi0, len,
3727                       ikev2_get_port (sa), sa->dst_port, 0);
3728     }
3729
3730 delete_sa:
3731   /* delete local SA */
3732   vec_foreach (c, sa->childs)
3733     ikev2_delete_tunnel_interface (km->vnet_main, sa, c);
3734
3735   u64 rspi = sa->rspi;
3736   ikev2_sa_free_all_vec (sa);
3737   uword *p = hash_get (tkm->sa_by_rspi, rspi);
3738   if (p)
3739     {
3740       hash_unset (tkm->sa_by_rspi, rspi);
3741       pool_put (tkm->sas, sa);
3742     }
3743 }
3744
3745 static void
3746 ikev2_cleanup_profile_sessions (ikev2_main_t * km, ikev2_profile_t * p)
3747 {
3748   ikev2_main_per_thread_data_t *tkm;
3749   ikev2_sa_t *sa;
3750   u32 pi = p - km->profiles;
3751   u32 *sai;
3752   u32 *del_sai = 0;
3753
3754   /* *INDENT-OFF* */
3755   pool_foreach (sa, km->sais)  {
3756     if (pi == sa->profile_index)
3757       vec_add1 (del_sai, sa - km->sais);
3758   }
3759   /* *INDENT-ON* */
3760
3761   vec_foreach (sai, del_sai)
3762   {
3763     sa = pool_elt_at_index (km->sais, sai[0]);
3764     ikev2_sa_free_all_vec (sa);
3765     hash_unset (km->sa_by_ispi, sa->ispi);
3766     pool_put (km->sais, sa);
3767   }
3768   vec_reset_length (del_sai);
3769
3770   vec_foreach (tkm, km->per_thread_data)
3771   {
3772     /* *INDENT-OFF* */
3773     pool_foreach (sa, tkm->sas)  {
3774       if (sa->profile_index != ~0 && pi == sa->profile_index)
3775         vec_add1 (del_sai, sa - tkm->sas);
3776     }
3777     /* *INDENT-ON* */
3778
3779     vec_foreach (sai, del_sai)
3780     {
3781       sa = pool_elt_at_index (tkm->sas, sai[0]);
3782       ikev2_initiate_delete_ike_sa_internal (km->vlib_main, tkm, sa, 1);
3783     }
3784
3785     vec_reset_length (del_sai);
3786   }
3787
3788   vec_free (del_sai);
3789 }
3790
3791 static void
3792 ikev2_profile_free (ikev2_profile_t * p)
3793 {
3794   vec_free (p->name);
3795
3796   vec_free (p->auth.data);
3797   if (p->auth.key)
3798     EVP_PKEY_free (p->auth.key);
3799
3800   vec_free (p->loc_id.data);
3801   vec_free (p->rem_id.data);
3802 }
3803
3804 clib_error_t *
3805 ikev2_add_del_profile (vlib_main_t * vm, u8 * name, int is_add)
3806 {
3807   ikev2_main_t *km = &ikev2_main;
3808   ikev2_profile_t *p;
3809
3810   if (is_add)
3811     {
3812       if (ikev2_profile_index_by_name (name))
3813         return clib_error_return (0, "policy %v already exists", name);
3814
3815       pool_get (km->profiles, p);
3816       clib_memset (p, 0, sizeof (*p));
3817       p->name = vec_dup (name);
3818       p->ipsec_over_udp_port = IPSEC_UDP_PORT_NONE;
3819       p->responder.sw_if_index = ~0;
3820       p->tun_itf = ~0;
3821       uword index = p - km->profiles;
3822       mhash_set_mem (&km->profile_index_by_name, name, &index, 0);
3823     }
3824   else
3825     {
3826       p = ikev2_profile_index_by_name (name);
3827       if (!p)
3828         return clib_error_return (0, "policy %v does not exists", name);
3829
3830       ikev2_unregister_udp_port (p);
3831       ikev2_cleanup_profile_sessions (km, p);
3832
3833       ikev2_profile_free (p);
3834       pool_put (km->profiles, p);
3835       mhash_unset (&km->profile_index_by_name, name, 0);
3836     }
3837   return 0;
3838 }
3839
3840 clib_error_t *
3841 ikev2_set_profile_auth (vlib_main_t * vm, u8 * name, u8 auth_method,
3842                         u8 * auth_data, u8 data_hex_format)
3843 {
3844   ikev2_profile_t *p;
3845   clib_error_t *r;
3846
3847   p = ikev2_profile_index_by_name (name);
3848
3849   if (!p)
3850     {
3851       r = clib_error_return (0, "unknown profile %v", name);
3852       return r;
3853     }
3854
3855   if (p->auth.key)
3856     EVP_PKEY_free (p->auth.key);
3857   vec_free (p->auth.data);
3858
3859   p->auth.method = auth_method;
3860   p->auth.data = vec_dup (auth_data);
3861   p->auth.hex = data_hex_format;
3862
3863   if (auth_method == IKEV2_AUTH_METHOD_RSA_SIG)
3864     {
3865       vec_add1 (p->auth.data, 0);
3866       p->auth.key = ikev2_load_cert_file (p->auth.data);
3867       if (p->auth.key == NULL)
3868         return clib_error_return (0, "load cert '%s' failed", p->auth.data);
3869     }
3870
3871   return 0;
3872 }
3873
3874 static int
3875 ikev2_is_id_supported (u8 id_type)
3876 {
3877   return (id_type == IKEV2_ID_TYPE_ID_IPV4_ADDR ||
3878           id_type == IKEV2_ID_TYPE_ID_IPV6_ADDR ||
3879           id_type == IKEV2_ID_TYPE_ID_RFC822_ADDR ||
3880           id_type == IKEV2_ID_TYPE_ID_FQDN);
3881 }
3882
3883 clib_error_t *
3884 ikev2_set_profile_id (vlib_main_t * vm, u8 * name, u8 id_type, u8 * data,
3885                       int is_local)
3886 {
3887   ikev2_profile_t *p;
3888   clib_error_t *r;
3889
3890   if (!ikev2_is_id_supported (id_type))
3891     {
3892       r = clib_error_return (0, "unsupported identity type %U",
3893                              format_ikev2_id_type, id_type);
3894       return r;
3895     }
3896
3897   p = ikev2_profile_index_by_name (name);
3898
3899   if (!p)
3900     {
3901       r = clib_error_return (0, "unknown profile %v", name);
3902       return r;
3903     }
3904
3905   if (is_local)
3906     {
3907       vec_free (p->loc_id.data);
3908       p->loc_id.type = id_type;
3909       p->loc_id.data = vec_dup (data);
3910     }
3911   else
3912     {
3913       vec_free (p->rem_id.data);
3914       p->rem_id.type = id_type;
3915       p->rem_id.data = vec_dup (data);
3916     }
3917
3918   return 0;
3919 }
3920
3921 static_always_inline void
3922 ikev2_set_ts_type (ikev2_ts_t * ts, const ip_address_t * addr)
3923 {
3924   if (ip_addr_version (addr) == AF_IP4)
3925     ts->ts_type = TS_IPV4_ADDR_RANGE;
3926   else
3927     ts->ts_type = TS_IPV6_ADDR_RANGE;
3928 }
3929
3930 static_always_inline void
3931 ikev2_set_ts_addrs (ikev2_ts_t * ts, const ip_address_t * start,
3932                     const ip_address_t * end)
3933 {
3934   ip_address_copy (&ts->start_addr, start);
3935   ip_address_copy (&ts->end_addr, end);
3936 }
3937
3938 clib_error_t *
3939 ikev2_set_profile_ts (vlib_main_t * vm, u8 * name, u8 protocol_id,
3940                       u16 start_port, u16 end_port, ip_address_t start_addr,
3941                       ip_address_t end_addr, int is_local)
3942 {
3943   ikev2_profile_t *p;
3944   clib_error_t *r;
3945
3946   p = ikev2_profile_index_by_name (name);
3947
3948   if (!p)
3949     {
3950       r = clib_error_return (0, "unknown profile %v", name);
3951       return r;
3952     }
3953
3954   if (ip_addr_version (&start_addr) != ip_addr_version (&end_addr))
3955     return clib_error_return (0, "IP address version mismatch!");
3956
3957   if (is_local)
3958     {
3959       ikev2_set_ts_addrs (&p->loc_ts, &start_addr, &end_addr);
3960       p->loc_ts.start_port = start_port;
3961       p->loc_ts.end_port = end_port;
3962       p->loc_ts.protocol_id = protocol_id;
3963       ikev2_set_ts_type (&p->loc_ts, &start_addr);
3964     }
3965   else
3966     {
3967       ikev2_set_ts_addrs (&p->rem_ts, &start_addr, &end_addr);
3968       p->rem_ts.start_port = start_port;
3969       p->rem_ts.end_port = end_port;
3970       p->rem_ts.protocol_id = protocol_id;
3971       ikev2_set_ts_type (&p->rem_ts, &start_addr);
3972     }
3973
3974   return 0;
3975 }
3976
3977
3978 clib_error_t *
3979 ikev2_set_profile_responder (vlib_main_t * vm, u8 * name,
3980                              u32 sw_if_index, ip_address_t addr)
3981 {
3982   ikev2_profile_t *p;
3983   clib_error_t *r;
3984
3985   p = ikev2_profile_index_by_name (name);
3986
3987   if (!p)
3988     {
3989       r = clib_error_return (0, "unknown profile %v", name);
3990       return r;
3991     }
3992
3993   p->responder.sw_if_index = sw_if_index;
3994   ip_address_copy (&p->responder.addr, &addr);
3995
3996   return 0;
3997 }
3998
3999 clib_error_t *
4000 ikev2_set_profile_ike_transforms (vlib_main_t * vm, u8 * name,
4001                                   ikev2_transform_encr_type_t crypto_alg,
4002                                   ikev2_transform_integ_type_t integ_alg,
4003                                   ikev2_transform_dh_type_t dh_type,
4004                                   u32 crypto_key_size)
4005 {
4006   ikev2_profile_t *p;
4007   clib_error_t *r;
4008
4009   p = ikev2_profile_index_by_name (name);
4010
4011   if (!p)
4012     {
4013       r = clib_error_return (0, "unknown profile %v", name);
4014       return r;
4015     }
4016
4017   p->ike_ts.crypto_alg = crypto_alg;
4018   p->ike_ts.integ_alg = integ_alg;
4019   p->ike_ts.dh_type = dh_type;
4020   p->ike_ts.crypto_key_size = crypto_key_size;
4021   return 0;
4022 }
4023
4024 clib_error_t *
4025 ikev2_set_profile_esp_transforms (vlib_main_t * vm, u8 * name,
4026                                   ikev2_transform_encr_type_t crypto_alg,
4027                                   ikev2_transform_integ_type_t integ_alg,
4028                                   u32 crypto_key_size)
4029 {
4030   ikev2_profile_t *p;
4031   clib_error_t *r;
4032
4033   p = ikev2_profile_index_by_name (name);
4034
4035   if (!p)
4036     {
4037       r = clib_error_return (0, "unknown profile %v", name);
4038       return r;
4039     }
4040
4041   p->esp_ts.crypto_alg = crypto_alg;
4042   p->esp_ts.integ_alg = integ_alg;
4043   p->esp_ts.crypto_key_size = crypto_key_size;
4044   return 0;
4045 }
4046
4047 clib_error_t *
4048 ikev2_set_profile_tunnel_interface (vlib_main_t * vm,
4049                                     u8 * name, u32 sw_if_index)
4050 {
4051   ikev2_profile_t *p;
4052   clib_error_t *r;
4053
4054   p = ikev2_profile_index_by_name (name);
4055
4056   if (!p)
4057     {
4058       r = clib_error_return (0, "unknown profile %v", name);
4059       return r;
4060     }
4061
4062   p->tun_itf = sw_if_index;
4063
4064   return 0;
4065 }
4066
4067 vnet_api_error_t
4068 ikev2_set_profile_ipsec_udp_port (vlib_main_t * vm, u8 * name, u16 port,
4069                                   u8 is_set)
4070 {
4071   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
4072   ikev2_main_t *km = &ikev2_main;
4073   vnet_api_error_t rv = 0;
4074   uword *v;
4075
4076   if (!p)
4077     return VNET_API_ERROR_INVALID_VALUE;
4078
4079   if (is_set)
4080     {
4081       if (p->ipsec_over_udp_port != IPSEC_UDP_PORT_NONE)
4082         return VNET_API_ERROR_VALUE_EXIST;
4083
4084       rv = ikev2_register_udp_port (p, port);
4085     }
4086   else
4087     {
4088       v = hash_get (km->udp_ports, port);
4089       if (!v)
4090         return VNET_API_ERROR_IKE_NO_PORT;
4091
4092       if (p->ipsec_over_udp_port == IPSEC_UDP_PORT_NONE)
4093         return VNET_API_ERROR_INVALID_VALUE;
4094
4095       ikev2_unregister_udp_port (p);
4096     }
4097   return rv;
4098 }
4099
4100 clib_error_t *
4101 ikev2_set_profile_udp_encap (vlib_main_t * vm, u8 * name)
4102 {
4103   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
4104   clib_error_t *r;
4105
4106   if (!p)
4107     {
4108       r = clib_error_return (0, "unknown profile %v", name);
4109       return r;
4110     }
4111
4112   p->udp_encap = 1;
4113   return 0;
4114 }
4115
4116 clib_error_t *
4117 ikev2_set_profile_sa_lifetime (vlib_main_t * vm, u8 * name,
4118                                u64 lifetime, u32 jitter, u32 handover,
4119                                u64 maxdata)
4120 {
4121   ikev2_profile_t *p;
4122   clib_error_t *r;
4123
4124   p = ikev2_profile_index_by_name (name);
4125
4126   if (!p)
4127     {
4128       r = clib_error_return (0, "unknown profile %v", name);
4129       return r;
4130     }
4131
4132   p->lifetime = lifetime;
4133   p->lifetime_jitter = jitter;
4134   p->handover = handover;
4135   p->lifetime_maxdata = maxdata;
4136   return 0;
4137 }
4138
4139 static int
4140 ikev2_get_if_address (u32 sw_if_index, ip_address_family_t af,
4141                       ip_address_t * out_addr)
4142 {
4143   ip4_address_t *if_ip4;
4144   ip6_address_t *if_ip6;
4145
4146   if (af == AF_IP4)
4147     {
4148       if_ip4 = ip4_interface_first_address (&ip4_main, sw_if_index, 0);
4149       if (if_ip4)
4150         {
4151           ip_address_set (out_addr, if_ip4, AF_IP4);
4152           return 1;
4153         }
4154     }
4155   else
4156     {
4157       if_ip6 = ip6_interface_first_address (&ip6_main, sw_if_index);
4158       if (if_ip6)
4159         {
4160           ip_address_set (out_addr, if_ip6, AF_IP6);
4161           return 1;
4162         }
4163     }
4164   return 0;
4165 }
4166
4167 clib_error_t *
4168 ikev2_initiate_sa_init (vlib_main_t * vm, u8 * name)
4169 {
4170   ikev2_profile_t *p;
4171   clib_error_t *r;
4172   ikev2_main_t *km = &ikev2_main;
4173   vlib_buffer_t *b0;
4174   ike_header_t *ike0;
4175   u32 bi0 = 0;
4176   int len = sizeof (ike_header_t), valid_ip = 0;
4177   ip_address_t if_ip = ip_address_initializer;
4178
4179   p = ikev2_profile_index_by_name (name);
4180
4181   if (!p)
4182     {
4183       r = clib_error_return (0, "unknown profile %v", name);
4184       return r;
4185     }
4186
4187   if (p->responder.sw_if_index == ~0
4188       || ip_address_is_zero (&p->responder.addr))
4189     {
4190       r = clib_error_return (0, "responder not set for profile %v", name);
4191       return r;
4192     }
4193
4194   if (ikev2_get_if_address (p->responder.sw_if_index,
4195                             ip_addr_version (&p->responder.addr), &if_ip))
4196     {
4197       valid_ip = 1;
4198     }
4199
4200   /* Prepare the SA and the IKE payload */
4201   ikev2_sa_t sa;
4202   clib_memset (&sa, 0, sizeof (ikev2_sa_t));
4203   ikev2_payload_chain_t *chain = 0;
4204   ikev2_payload_new_chain (chain);
4205
4206   /* Build the IKE proposal payload */
4207   ikev2_sa_proposal_t *proposals = 0;
4208   ikev2_set_initiator_proposals (vm, &sa, &p->ike_ts, &proposals, 1);
4209   proposals[0].proposal_num = 1;
4210   proposals[0].protocol_id = IKEV2_PROTOCOL_IKE;
4211
4212   /* Add and then cleanup proposal data */
4213   ikev2_payload_add_sa (chain, proposals);
4214   ikev2_sa_free_proposal_vector (&proposals);
4215
4216   sa.is_initiator = 1;
4217   sa.profile_index = p - km->profiles;
4218   sa.state = IKEV2_STATE_SA_INIT;
4219   sa.tun_itf = p->tun_itf;
4220   sa.udp_encap = p->udp_encap;
4221   if (p->natt_disabled)
4222     sa.natt_state = IKEV2_NATT_DISABLED;
4223   sa.ipsec_over_udp_port = p->ipsec_over_udp_port;
4224   sa.is_tun_itf_set = 1;
4225   sa.initial_contact = 1;
4226   sa.dst_port = IKEV2_PORT;
4227
4228   ikev2_generate_sa_error_t rc = ikev2_generate_sa_init_data (&sa);
4229   if (rc != IKEV2_GENERATE_SA_INIT_OK)
4230     {
4231       ikev2_sa_free_all_vec (&sa);
4232       ikev2_payload_destroy_chain (chain);
4233       return clib_error_return (0, "%U", format_ikev2_gen_sa_error, rc);
4234     }
4235
4236   ikev2_payload_add_ke (chain, sa.dh_group, sa.i_dh_data);
4237   ikev2_payload_add_nonce (chain, sa.i_nonce);
4238
4239   /* Build the child SA proposal */
4240   vec_resize (sa.childs, 1);
4241   ikev2_set_initiator_proposals (vm, &sa, &p->esp_ts,
4242                                  &sa.childs[0].i_proposals, 0);
4243   sa.childs[0].i_proposals[0].proposal_num = 1;
4244   sa.childs[0].i_proposals[0].protocol_id = IKEV2_PROTOCOL_ESP;
4245   RAND_bytes ((u8 *) & sa.childs[0].i_proposals[0].spi,
4246               sizeof (sa.childs[0].i_proposals[0].spi));
4247
4248   /* Add NAT detection notification messages (mandatory) */
4249   u8 *nat_detection_sha1 =
4250     ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
4251                             clib_host_to_net_u64 (sa.rspi),
4252                             &if_ip, clib_host_to_net_u16 (IKEV2_PORT));
4253
4254   ikev2_payload_add_notify (chain, IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP,
4255                             nat_detection_sha1);
4256   vec_free (nat_detection_sha1);
4257   nat_detection_sha1 =
4258     ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa.ispi),
4259                             clib_host_to_net_u64 (sa.rspi),
4260                             &p->responder.addr,
4261                             clib_host_to_net_u16 (sa.dst_port));
4262   ikev2_payload_add_notify (chain,
4263                             IKEV2_NOTIFY_MSG_NAT_DETECTION_DESTINATION_IP,
4264                             nat_detection_sha1);
4265   vec_free (nat_detection_sha1);
4266
4267   u8 *sig_hash_algo = vec_new (u8, 8);
4268   u64 tmpsig = clib_host_to_net_u64 (0x0001000200030004);
4269   clib_memcpy_fast (sig_hash_algo, &tmpsig, sizeof (tmpsig));
4270   ikev2_payload_add_notify (chain,
4271                             IKEV2_NOTIFY_MSG_SIGNATURE_HASH_ALGORITHMS,
4272                             sig_hash_algo);
4273   vec_free (sig_hash_algo);
4274
4275   bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
4276   if (!bi0)
4277     {
4278       ikev2_sa_free_all_vec (&sa);
4279       ikev2_payload_destroy_chain (chain);
4280       char *errmsg = "buffer alloc failure";
4281       ikev2_log_error (errmsg);
4282       return clib_error_return (0, errmsg);
4283     }
4284   ike0 = vlib_buffer_get_current (b0);
4285
4286   /* Buffer update and boilerplate */
4287   len += vec_len (chain->data);
4288   ike0->nextpayload = chain->first_payload_type;
4289   ike0->length = clib_host_to_net_u32 (len);
4290   clib_memcpy_fast (ike0->payload, chain->data, vec_len (chain->data));
4291   ikev2_payload_destroy_chain (chain);
4292
4293   ike0->version = IKE_VERSION_2;
4294   ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
4295   ike0->exchange = IKEV2_EXCHANGE_SA_INIT;
4296   ike0->ispi = clib_host_to_net_u64 (sa.ispi);
4297   ike0->rspi = 0;
4298   ike0->msgid = 0;
4299   sa.last_init_msg_id += 1;
4300
4301   /* store whole IKE payload - needed for PSK auth */
4302   vec_reset_length (sa.last_sa_init_req_packet_data);
4303   vec_add (sa.last_sa_init_req_packet_data, ike0, len);
4304
4305   /* add data to the SA then add it to the pool */
4306   ip_address_copy (&sa.iaddr, &if_ip);
4307   ip_address_copy (&sa.raddr, &p->responder.addr);
4308   sa.i_id.type = p->loc_id.type;
4309   sa.i_id.data = vec_dup (p->loc_id.data);
4310   sa.r_id.type = p->rem_id.type;
4311   sa.r_id.data = vec_dup (p->rem_id.data);
4312   sa.i_auth.method = p->auth.method;
4313   sa.i_auth.hex = p->auth.hex;
4314   sa.i_auth.data = vec_dup (p->auth.data);
4315   sa.sw_if_index = p->responder.sw_if_index;
4316   vec_add (sa.childs[0].tsi, &p->loc_ts, 1);
4317   vec_add (sa.childs[0].tsr, &p->rem_ts, 1);
4318
4319   ikev2_initial_contact_cleanup (0, &sa);
4320
4321   /* add SA to the pool */
4322   ikev2_sa_t *sa0 = 0;
4323   pool_get (km->sais, sa0);
4324   clib_memcpy_fast (sa0, &sa, sizeof (*sa0));
4325   hash_set (km->sa_by_ispi, sa0->ispi, sa0 - km->sais);
4326
4327   if (valid_ip)
4328     {
4329       ikev2_send_ike (vm, &if_ip, &p->responder.addr, bi0, len,
4330                       IKEV2_PORT, sa.dst_port, sa.sw_if_index);
4331
4332       ikev2_elog_exchange
4333         ("ispi %lx rspi %lx IKEV2_EXCHANGE_SA_INIT sent to ",
4334          clib_host_to_net_u64 (sa0->ispi), 0,
4335          ip_addr_v4 (&p->responder.addr).as_u32,
4336          ip_addr_version (&p->responder.addr) == AF_IP4);
4337     }
4338   else
4339     {
4340       r =
4341         clib_error_return (0, "interface  %U does not have any IP address!",
4342                            format_vnet_sw_if_index_name, vnet_get_main (),
4343                            p->responder.sw_if_index);
4344       return r;
4345     }
4346
4347   return 0;
4348 }
4349
4350 static void
4351 ikev2_delete_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
4352                                 ikev2_child_sa_t * csa)
4353 {
4354   /* Create the Initiator notification for child SA removal */
4355   ikev2_main_t *km = &ikev2_main;
4356   ike_header_t *ike0;
4357   u32 bi0 = 0;
4358   vlib_buffer_t *b0;
4359   int len;
4360
4361   bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
4362   if (!bi0)
4363     {
4364       ikev2_log_error ("buffer alloc failure");
4365       return;
4366     }
4367
4368   ike0 = vlib_buffer_get_current (b0);
4369   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
4370   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4371   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4372   ike0->flags = 0;
4373   vec_resize (sa->del, 1);
4374   sa->del->protocol_id = IKEV2_PROTOCOL_ESP;
4375   sa->del->spi = csa->i_proposals->spi;
4376   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
4377   sa->last_init_msg_id += 1;
4378   len = ikev2_generate_message (b0, sa, ike0, 0, 0);
4379   if (~0 == len)
4380     return;
4381
4382   if (ikev2_natt_active (sa))
4383     len = ikev2_insert_non_esp_marker (ike0, len);
4384   ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
4385                   ikev2_get_port (sa), sa->dst_port, sa->sw_if_index);
4386
4387   /* delete local child SA */
4388   ikev2_delete_tunnel_interface (km->vnet_main, sa, csa);
4389   ikev2_sa_del_child_sa (sa, csa);
4390 }
4391
4392 clib_error_t *
4393 ikev2_initiate_delete_child_sa (vlib_main_t * vm, u32 ispi)
4394 {
4395   clib_error_t *r;
4396   ikev2_main_t *km = &ikev2_main;
4397   ikev2_main_per_thread_data_t *tkm;
4398   ikev2_sa_t *fsa = 0;
4399   ikev2_child_sa_t *fchild = 0;
4400
4401   /* Search for the child SA */
4402   vec_foreach (tkm, km->per_thread_data)
4403   {
4404     ikev2_sa_t *sa;
4405     if (fchild)
4406       break;
4407     /* *INDENT-OFF* */
4408     pool_foreach (sa, tkm->sas)  {
4409       fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
4410       if (fchild)
4411         {
4412           fsa = sa;
4413           break;
4414         }
4415     }
4416     /* *INDENT-ON* */
4417   }
4418
4419   if (!fchild || !fsa)
4420     {
4421       r = clib_error_return (0, "Child SA not found");
4422       return r;
4423     }
4424   else
4425     {
4426       ikev2_delete_child_sa_internal (vm, fsa, fchild);
4427     }
4428
4429   return 0;
4430 }
4431
4432 clib_error_t *
4433 ikev2_initiate_delete_ike_sa (vlib_main_t * vm, u64 ispi)
4434 {
4435   clib_error_t *r;
4436   ikev2_main_t *km = &ikev2_main;
4437   ikev2_main_per_thread_data_t *tkm;
4438   ikev2_sa_t *fsa = 0;
4439   ikev2_main_per_thread_data_t *ftkm = 0;
4440
4441   /* Search for the IKE SA */
4442   vec_foreach (tkm, km->per_thread_data)
4443   {
4444     ikev2_sa_t *sa;
4445     if (fsa)
4446       break;
4447     /* *INDENT-OFF* */
4448     pool_foreach (sa, tkm->sas)  {
4449       if (sa->ispi == ispi)
4450         {
4451           fsa = sa;
4452           ftkm = tkm;
4453           break;
4454         }
4455     }
4456     /* *INDENT-ON* */
4457   }
4458
4459   if (!fsa)
4460     {
4461       r = clib_error_return (0, "IKE SA not found");
4462       return r;
4463     }
4464
4465   ikev2_initiate_delete_ike_sa_internal (vm, ftkm, fsa, 1);
4466   return 0;
4467 }
4468
4469 static void
4470 ikev2_rekey_child_sa_internal (vlib_main_t * vm, ikev2_sa_t * sa,
4471                                ikev2_child_sa_t * csa)
4472 {
4473   /* Create the Initiator request for create child SA */
4474   ike_header_t *ike0;
4475   vlib_buffer_t *b0;
4476   u32 bi0 = 0;
4477   int len;
4478
4479   bi0 = ikev2_get_new_ike_header_buff (vm, &b0);
4480   if (!bi0)
4481     {
4482       ikev2_log_error ("buffer alloc failure");
4483       return;
4484     }
4485
4486   ike0 = vlib_buffer_get_current (b0);
4487   ike0->version = IKE_VERSION_2;
4488   ike0->flags = IKEV2_HDR_FLAG_INITIATOR;
4489   ike0->exchange = IKEV2_EXCHANGE_CREATE_CHILD_SA;
4490   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4491   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4492   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
4493   sa->last_init_msg_id += 1;
4494
4495   ikev2_rekey_t *rekey;
4496   vec_reset_length (sa->rekey);
4497   vec_add2 (sa->rekey, rekey, 1);
4498   ikev2_sa_proposal_t *proposals = vec_dup (csa->i_proposals);
4499
4500   /*need new ispi */
4501   RAND_bytes ((u8 *) & proposals[0].spi, sizeof (proposals[0].spi));
4502   rekey->spi = proposals[0].spi;
4503   rekey->ispi = csa->i_proposals->spi;
4504   len = ikev2_generate_message (b0, sa, ike0, proposals, 0);
4505   if (~0 == len)
4506     return;
4507
4508   if (ikev2_natt_active (sa))
4509     len = ikev2_insert_non_esp_marker (ike0, len);
4510   ikev2_send_ike (vm, &sa->iaddr, &sa->raddr, bi0, len,
4511                   ikev2_get_port (sa), ikev2_get_port (sa), sa->sw_if_index);
4512   vec_free (proposals);
4513 }
4514
4515 clib_error_t *
4516 ikev2_initiate_rekey_child_sa (vlib_main_t * vm, u32 ispi)
4517 {
4518   clib_error_t *r;
4519   ikev2_main_t *km = &ikev2_main;
4520   ikev2_main_per_thread_data_t *tkm;
4521   ikev2_sa_t *fsa = 0;
4522   ikev2_child_sa_t *fchild = 0;
4523
4524   /* Search for the child SA */
4525   vec_foreach (tkm, km->per_thread_data)
4526   {
4527     ikev2_sa_t *sa;
4528     if (fchild)
4529       break;
4530     /* *INDENT-OFF* */
4531     pool_foreach (sa, tkm->sas)  {
4532       fchild = ikev2_sa_get_child(sa, ispi, IKEV2_PROTOCOL_ESP, 1);
4533       if (fchild)
4534         {
4535           fsa = sa;
4536           break;
4537         }
4538     }
4539     /* *INDENT-ON* */
4540   }
4541
4542   if (!fchild || !fsa)
4543     {
4544       r = clib_error_return (0, "Child SA not found");
4545       return r;
4546     }
4547   else
4548     {
4549       ikev2_rekey_child_sa_internal (vm, fsa, fchild);
4550     }
4551
4552   return 0;
4553 }
4554
4555 static int
4556 ikev2_sa_sw_if_match (ikev2_sa_t * sa, u32 sw_if_index)
4557 {
4558   return (sa->sw_if_index == sw_if_index) && sa->is_initiator;
4559 }
4560
4561 static void
4562 ikev2_sa_del (ikev2_profile_t * p, u32 sw_if_index)
4563 {
4564   u64 *ispi, *ispi_vec = 0;
4565   ikev2_sa_t *sa, **sap, **sa_vec = 0;
4566   ikev2_main_t *km = &ikev2_main;
4567   ikev2_main_per_thread_data_t *tkm;
4568   p->responder.sw_if_index = ~0;
4569
4570   vec_foreach (tkm, km->per_thread_data)
4571   {
4572     /* *INDENT-OFF* */
4573     pool_foreach (sa, tkm->sas)  {
4574       if (ikev2_sa_sw_if_match (sa, sw_if_index))
4575         vec_add1 (sa_vec, sa);
4576     }
4577     /* *INDENT-ON* */
4578
4579     vec_foreach (sap, sa_vec)
4580     {
4581       ikev2_initiate_delete_ike_sa_internal (km->vlib_main, tkm, *sap, 0);
4582     }
4583     vec_reset_length (sa_vec);
4584   }
4585   vec_free (sa_vec);
4586
4587   /* *INDENT-OFF* */
4588   pool_foreach (sa, km->sais)  {
4589     if (ikev2_sa_sw_if_match (sa, sw_if_index))
4590       vec_add1 (ispi_vec, sa->ispi);
4591   }
4592   /* *INDENT-ON* */
4593
4594   vec_foreach (ispi, ispi_vec)
4595   {
4596     ikev2_del_sa_init_from_main (ispi);
4597   }
4598
4599   vec_free (ispi_vec);
4600 }
4601
4602 static clib_error_t *
4603 ikev2_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
4604 {
4605   ikev2_main_t *km = &ikev2_main;
4606   ikev2_profile_t *p;
4607
4608   if (is_add)
4609     return 0;
4610
4611   /* *INDENT-OFF* */
4612   pool_foreach (p, km->profiles)  {
4613     if (p->responder.sw_if_index == sw_if_index)
4614       ikev2_sa_del (p, sw_if_index);
4615   }
4616   /* *INDENT-ON* */
4617
4618   return 0;
4619 }
4620
4621 VNET_SW_INTERFACE_ADD_DEL_FUNCTION (ikev2_sw_interface_add_del);
4622
4623 clib_error_t *
4624 ikev2_init (vlib_main_t * vm)
4625 {
4626   ikev2_main_t *km = &ikev2_main;
4627   vlib_thread_main_t *tm = vlib_get_thread_main ();
4628   int thread_id;
4629
4630   clib_memset (km, 0, sizeof (ikev2_main_t));
4631   km->vnet_main = vnet_get_main ();
4632   km->vlib_main = vm;
4633
4634   km->liveness_period = IKEV2_LIVENESS_PERIOD_CHECK;
4635   km->liveness_max_retries = IKEV2_LIVENESS_RETRIES;
4636   ikev2_crypto_init (km);
4637
4638   mhash_init_vec_string (&km->profile_index_by_name, sizeof (uword));
4639
4640   vec_validate_aligned (km->per_thread_data, tm->n_vlib_mains - 1,
4641                         CLIB_CACHE_LINE_BYTES);
4642   for (thread_id = 0; thread_id < tm->n_vlib_mains; thread_id++)
4643     {
4644       ikev2_main_per_thread_data_t *ptd =
4645         vec_elt_at_index (km->per_thread_data, thread_id);
4646
4647       ptd->sa_by_rspi = hash_create (0, sizeof (uword));
4648
4649 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
4650       ptd->evp_ctx = EVP_CIPHER_CTX_new ();
4651       ptd->hmac_ctx = HMAC_CTX_new ();
4652 #else
4653       EVP_CIPHER_CTX_init (&ptd->_evp_ctx);
4654       ptd->evp_ctx = &ptd->_evp_ctx;
4655       HMAC_CTX_init (&(ptd->_hmac_ctx));
4656       ptd->hmac_ctx = &ptd->_hmac_ctx;
4657 #endif
4658     }
4659
4660   km->sa_by_ispi = hash_create (0, sizeof (uword));
4661   km->sw_if_indices = hash_create (0, 0);
4662   km->udp_ports = hash_create (0, sizeof (uword));
4663
4664   udp_register_dst_port (vm, IKEV2_PORT, ikev2_node_ip4.index, 1);
4665   udp_register_dst_port (vm, IKEV2_PORT, ikev2_node_ip6.index, 0);
4666   udp_register_dst_port (vm, IKEV2_PORT_NATT, ikev2_node_ip4.index, 1);
4667   udp_register_dst_port (vm, IKEV2_PORT_NATT, ikev2_node_ip6.index, 0);
4668
4669   vlib_punt_hdl_t punt_hdl = vlib_punt_client_register ("ikev2-ip4");
4670   vlib_punt_register (punt_hdl, ipsec_punt_reason[IPSEC_PUNT_IP4_SPI_UDP_0],
4671                       "ikev2-ip4");
4672   ikev2_cli_reference ();
4673
4674   km->log_level = IKEV2_LOG_ERROR;
4675   km->log_class = vlib_log_register_class ("ikev2", 0);
4676   return 0;
4677 }
4678
4679 /* *INDENT-OFF* */
4680 VLIB_INIT_FUNCTION (ikev2_init) =
4681 {
4682   .runs_after = VLIB_INITS("ipsec_init", "ipsec_punt_init"),
4683 };
4684 /* *INDENT-ON* */
4685
4686 static u8
4687 ikev2_mngr_process_child_sa (ikev2_sa_t * sa, ikev2_child_sa_t * csa,
4688                              u8 del_old_ids)
4689 {
4690   ikev2_main_t *km = &ikev2_main;
4691   ikev2_profile_t *p = 0;
4692   vlib_main_t *vm = km->vlib_main;
4693   f64 now = vlib_time_now (vm);
4694   u8 res = 0;
4695
4696   if (sa->profile_index != ~0)
4697     p = pool_elt_at_index (km->profiles, sa->profile_index);
4698
4699   if (sa->is_initiator && p && csa->time_to_expiration
4700       && now > csa->time_to_expiration)
4701     {
4702       if (!csa->is_expired || csa->rekey_retries > 0)
4703         {
4704           ikev2_rekey_child_sa_internal (vm, sa, csa);
4705           csa->time_to_expiration = now + p->handover;
4706           csa->is_expired = 1;
4707           if (csa->rekey_retries == 0)
4708             {
4709               csa->rekey_retries = 5;
4710             }
4711           else if (csa->rekey_retries > 0)
4712             {
4713               csa->rekey_retries--;
4714               ikev2_log_debug ("Rekeying Child SA 0x%x, retries left %d",
4715                                csa->i_proposals->spi, csa->rekey_retries);
4716               if (csa->rekey_retries == 0)
4717                 {
4718                   csa->rekey_retries = -1;
4719                 }
4720             }
4721           res |= 1;
4722         }
4723       else
4724         {
4725           csa->time_to_expiration = 0;
4726           ikev2_delete_child_sa_internal (vm, sa, csa);
4727           res |= 1;
4728           return res;
4729         }
4730     }
4731
4732   if (del_old_ids)
4733     {
4734       ipip_tunnel_t *ipip = NULL;
4735       u32 sw_if_index = sa->is_tun_itf_set ? sa->tun_itf : ~0;
4736       if (~0 == sw_if_index)
4737         {
4738           ip46_address_t local_ip;
4739           ip46_address_t remote_ip;
4740           if (sa->is_initiator)
4741             {
4742               local_ip = to_ip46 (ip_addr_version (&sa->iaddr),
4743                                   ip_addr_bytes (&sa->iaddr));
4744               remote_ip = to_ip46 (ip_addr_version (&sa->raddr),
4745                                    ip_addr_bytes (&sa->raddr));
4746             }
4747           else
4748             {
4749               local_ip = to_ip46 (ip_addr_version (&sa->raddr),
4750                                   ip_addr_bytes (&sa->raddr));
4751               remote_ip = to_ip46 (ip_addr_version (&sa->iaddr),
4752                                    ip_addr_bytes (&sa->iaddr));
4753             }
4754
4755        /* *INDENT-OFF* */
4756        ipip_tunnel_key_t key = {
4757          .src = local_ip,
4758          .dst = remote_ip,
4759          .transport = IPIP_TRANSPORT_IP4,
4760          .fib_index = 0,
4761        };
4762        /* *INDENT-ON* */
4763
4764           ipip = ipip_tunnel_db_find (&key);
4765
4766           if (ipip)
4767             sw_if_index = ipip->sw_if_index;
4768           else
4769             return res;
4770         }
4771
4772       u32 *sas_in = NULL;
4773       vec_add1 (sas_in, csa->remote_sa_id);
4774       vlib_worker_thread_barrier_sync (vm);
4775       int rv = ipsec_tun_protect_update (sw_if_index, NULL,
4776                                          csa->local_sa_id, sas_in);
4777       if (rv)
4778         vec_free (sas_in);
4779       ipsec_sa_unlock_id (ikev2_flip_alternate_sa_bit (csa->remote_sa_id));
4780       vlib_worker_thread_barrier_release (vm);
4781     }
4782
4783   return res;
4784 }
4785
4786 int
4787 ikev2_set_log_level (ikev2_log_level_t log_level)
4788 {
4789   ikev2_main_t *km = &ikev2_main;
4790
4791   if (log_level >= IKEV2_LOG_MAX)
4792     {
4793       ikev2_log_error ("unknown logging level %d", log_level);
4794       return -1;
4795     }
4796
4797   km->log_level = log_level;
4798   return 0;
4799 }
4800
4801 clib_error_t *
4802 ikev2_set_liveness_params (u32 period, u32 max_retries)
4803 {
4804   ikev2_main_t *km = &ikev2_main;
4805
4806   if (period == 0 || max_retries == 0)
4807     return clib_error_return (0, "invalid args");
4808
4809   km->liveness_period = period;
4810   km->liveness_max_retries = max_retries;
4811   return 0;
4812 }
4813
4814 clib_error_t *
4815 ikev2_profile_natt_disable (u8 * name)
4816 {
4817   ikev2_profile_t *p = ikev2_profile_index_by_name (name);
4818   if (!p)
4819     return clib_error_return (0, "unknown profile %v", name);
4820
4821   p->natt_disabled = 1;
4822   return 0;
4823 }
4824
4825 static void
4826 ikev2_mngr_process_ipsec_sa (ipsec_sa_t * ipsec_sa)
4827 {
4828   ikev2_main_t *km = &ikev2_main;
4829   vlib_main_t *vm = km->vlib_main;
4830   ikev2_main_per_thread_data_t *tkm;
4831   ikev2_sa_t *fsa = 0;
4832   ikev2_profile_t *p = 0;
4833   ikev2_child_sa_t *fchild = 0;
4834   f64 now = vlib_time_now (vm);
4835   vlib_counter_t counts;
4836
4837   /* Search for the SA and child SA */
4838   vec_foreach (tkm, km->per_thread_data)
4839   {
4840     ikev2_sa_t *sa;
4841     if (fchild)
4842       break;
4843     /* *INDENT-OFF* */
4844     pool_foreach (sa, tkm->sas)  {
4845       fchild = ikev2_sa_get_child(sa, ipsec_sa->spi, IKEV2_PROTOCOL_ESP, 1);
4846       if (fchild)
4847         {
4848           fsa = sa;
4849           break;
4850         }
4851     }
4852     /* *INDENT-ON* */
4853   }
4854   vlib_get_combined_counter (&ipsec_sa_counters,
4855                              ipsec_sa->stat_index, &counts);
4856
4857   if (fsa && fsa->profile_index != ~0 && fsa->is_initiator)
4858     p = pool_elt_at_index (km->profiles, fsa->profile_index);
4859
4860   if (fchild && p && p->lifetime_maxdata)
4861     {
4862       if (!fchild->is_expired && counts.bytes > p->lifetime_maxdata)
4863         {
4864           fchild->time_to_expiration = now;
4865         }
4866     }
4867 }
4868
4869 static void
4870 ikev2_process_pending_sa_init_one (ikev2_main_t * km, ikev2_sa_t * sa)
4871 {
4872   ikev2_profile_t *p;
4873   u32 bi0;
4874   u8 *nat_sha, *np;
4875
4876   if (ip_address_is_zero (&sa->iaddr))
4877     {
4878       p = pool_elt_at_index (km->profiles, sa->profile_index);
4879       if (!ikev2_get_if_address (p->responder.sw_if_index,
4880                                  ip_addr_version (&p->responder.addr),
4881                                  &sa->iaddr))
4882         return;
4883
4884       /* update NAT detection payload */
4885       np =
4886         ikev2_find_ike_notify_payload
4887         ((ike_header_t *) sa->last_sa_init_req_packet_data,
4888          IKEV2_NOTIFY_MSG_NAT_DETECTION_SOURCE_IP);
4889       if (np)
4890         {
4891           nat_sha =
4892             ikev2_compute_nat_sha1 (clib_host_to_net_u64 (sa->ispi),
4893                                     clib_host_to_net_u64 (sa->rspi),
4894                                     &sa->iaddr,
4895                                     clib_host_to_net_u16 (IKEV2_PORT));
4896           clib_memcpy_fast (np, nat_sha, vec_len (nat_sha));
4897           vec_free (nat_sha);
4898         }
4899     }
4900
4901   if (vlib_buffer_alloc (km->vlib_main, &bi0, 1) != 1)
4902     return;
4903
4904   vlib_buffer_t *b = vlib_get_buffer (km->vlib_main, bi0);
4905   clib_memcpy_fast (vlib_buffer_get_current (b),
4906                     sa->last_sa_init_req_packet_data,
4907                     vec_len (sa->last_sa_init_req_packet_data));
4908
4909   ikev2_send_ike (km->vlib_main, &sa->iaddr, &sa->raddr, bi0,
4910                   vec_len (sa->last_sa_init_req_packet_data),
4911                   ikev2_get_port (sa), IKEV2_PORT, sa->sw_if_index);
4912 }
4913
4914 static void
4915 ikev2_process_pending_sa_init (ikev2_main_t * km)
4916 {
4917   u32 sai;
4918   u64 ispi;
4919   ikev2_sa_t *sa;
4920
4921   /* *INDENT-OFF* */
4922   hash_foreach (ispi, sai, km->sa_by_ispi,
4923   ({
4924     sa = pool_elt_at_index (km->sais, sai);
4925     if (sa->init_response_received)
4926       continue;
4927
4928     ikev2_process_pending_sa_init_one (km, sa);
4929   }));
4930   /* *INDENT-ON* */
4931 }
4932
4933 static void
4934 ikev2_send_informational_request (ikev2_sa_t * sa)
4935 {
4936   ikev2_main_t *km = &ikev2_main;
4937   ip_address_t *src, *dst;
4938   ike_header_t *ike0;
4939   vlib_buffer_t *b0;
4940   u32 bi0 = 0;
4941   u16 dp;
4942   int len;
4943
4944   bi0 = ikev2_get_new_ike_header_buff (km->vlib_main, &b0);
4945   if (!bi0)
4946     {
4947       ikev2_log_error ("buffer alloc failure");
4948       return;
4949     }
4950
4951   ike0 = vlib_buffer_get_current (b0);
4952   ike0->exchange = IKEV2_EXCHANGE_INFORMATIONAL;
4953   ike0->ispi = clib_host_to_net_u64 (sa->ispi);
4954   ike0->rspi = clib_host_to_net_u64 (sa->rspi);
4955   ike0->msgid = clib_host_to_net_u32 (sa->last_init_msg_id);
4956   ike0->flags = 0;
4957   sa->last_init_msg_id += 1;
4958   len = ikev2_generate_message (b0, sa, ike0, 0, 0);
4959   if (~0 == len)
4960     return;
4961
4962   if (ikev2_natt_active (sa))
4963     len = ikev2_insert_non_esp_marker (ike0, len);
4964
4965   if (sa->is_initiator)
4966     {
4967       src = &sa->iaddr;
4968       dst = &sa->raddr;
4969     }
4970   else
4971     {
4972       dst = &sa->iaddr;
4973       src = &sa->raddr;
4974     }
4975
4976   dp = sa->dst_port ? sa->dst_port : ikev2_get_port (sa);
4977   ikev2_send_ike (km->vlib_main, src, dst, bi0, len, ikev2_get_port (sa), dp,
4978                   sa->sw_if_index);
4979 }
4980
4981 void
4982 ikev2_disable_dpd (void)
4983 {
4984   ikev2_main_t *km = &ikev2_main;
4985   km->dpd_disabled = 1;
4986 }
4987
4988 static_always_inline int
4989 ikev2_mngr_process_responder_sas (ikev2_sa_t * sa)
4990 {
4991   ikev2_main_t *km = &ikev2_main;
4992   vlib_main_t *vm = km->vlib_main;
4993
4994   if (!sa->keys_generated)
4995     return 0;
4996
4997   if (sa->liveness_retries >= km->liveness_max_retries)
4998     return 1;
4999
5000   f64 now = vlib_time_now (vm);
5001
5002   if (sa->liveness_period_check < now)
5003     {
5004       sa->liveness_retries++;
5005       sa->liveness_period_check = now + km->liveness_period;
5006       ikev2_send_informational_request (sa);
5007     }
5008   return 0;
5009 }
5010
5011 static uword
5012 ikev2_mngr_process_fn (vlib_main_t * vm, vlib_node_runtime_t * rt,
5013                        vlib_frame_t * f)
5014 {
5015   ikev2_main_t *km = &ikev2_main;
5016   ipsec_main_t *im = &ipsec_main;
5017   ikev2_profile_t *p;
5018   ikev2_child_sa_t *c;
5019   u32 *sai;
5020
5021   while (1)
5022     {
5023       vlib_process_wait_for_event_or_clock (vm, 2);
5024       vlib_process_get_events (vm, NULL);
5025
5026       /* process ike child sas */
5027       ikev2_main_per_thread_data_t *tkm;
5028       vec_foreach (tkm, km->per_thread_data)
5029       {
5030         ikev2_sa_t *sa;
5031         u32 *to_be_deleted = 0;
5032
5033         /* *INDENT-OFF* */
5034         pool_foreach (sa, tkm->sas)  {
5035           ikev2_child_sa_t *c;
5036           u8 del_old_ids = 0;
5037
5038           if (sa->state != IKEV2_STATE_AUTHENTICATED)
5039             continue;
5040
5041           if (sa->old_remote_id_present && 0 > sa->old_id_expiration)
5042             {
5043               sa->old_remote_id_present = 0;
5044               del_old_ids = 1;
5045             }
5046           else
5047             sa->old_id_expiration -= 1;
5048
5049           vec_foreach (c, sa->childs)
5050             ikev2_mngr_process_child_sa(sa, c, del_old_ids);
5051
5052           if (!km->dpd_disabled && ikev2_mngr_process_responder_sas (sa))
5053             vec_add1 (to_be_deleted, sa - tkm->sas);
5054         }
5055         /* *INDENT-ON* */
5056
5057         vec_foreach (sai, to_be_deleted)
5058         {
5059           sa = pool_elt_at_index (tkm->sas, sai[0]);
5060           u8 reinitiate = (sa->is_initiator && sa->profile_index != ~0);
5061           vec_foreach (c, sa->childs)
5062           {
5063             ikev2_delete_tunnel_interface (km->vnet_main, sa, c);
5064             ikev2_sa_del_child_sa (sa, c);
5065           }
5066           ikev2_sa_free_all_vec (sa);
5067           hash_unset (tkm->sa_by_rspi, sa->rspi);
5068           pool_put (tkm->sas, sa);
5069
5070           if (reinitiate)
5071             {
5072               p = pool_elt_at_index (km->profiles, sa->profile_index);
5073               if (p)
5074                 {
5075                   clib_error_t *e = ikev2_initiate_sa_init (vm, p->name);
5076                   if (e)
5077                     {
5078                       ikev2_log_error ("%U", format_clib_error, e);
5079                       clib_error_free (e);
5080                     }
5081                 }
5082             }
5083         }
5084         vec_free (to_be_deleted);
5085       }
5086
5087       /* process ipsec sas */
5088       ipsec_sa_t *sa;
5089       /* *INDENT-OFF* */
5090       pool_foreach (sa, im->sad)  {
5091         ikev2_mngr_process_ipsec_sa(sa);
5092       }
5093       /* *INDENT-ON* */
5094
5095       ikev2_process_pending_sa_init (km);
5096     }
5097   return 0;
5098 }
5099
5100 /* *INDENT-OFF* */
5101 VLIB_REGISTER_NODE (ikev2_mngr_process_node, static) = {
5102     .function = ikev2_mngr_process_fn,
5103     .type = VLIB_NODE_TYPE_PROCESS,
5104     .name =
5105     "ikev2-manager-process",
5106 };
5107
5108 VLIB_PLUGIN_REGISTER () = {
5109     .version = VPP_BUILD_VER,
5110     .description = "Internet Key Exchange (IKEv2) Protocol",
5111 };
5112 /* *INDENT-ON* */
5113
5114 /*
5115  * fd.io coding-style-patch-verification: ON
5116  *
5117  * Local Variables:
5118  * eval: (c-set-style "gnu")
5119  * End:
5120  */