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