2 * Copyright (C) 2006-2011 Tobias Brunner
3 * Copyright (C) 2006 Daniel Roethlisberger
4 * Copyright (C) 2005-2009 Martin Willi
5 * Copyright (C) 2005 Jan Hutter
6 * Hochschule fuer Technik Rapperswil
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
29 #include <utils/linked_list.h>
30 #include <utils/lexparser.h>
31 #include <processing/jobs/retransmit_job.h>
32 #include <processing/jobs/delete_ike_sa_job.h>
33 #include <processing/jobs/send_dpd_job.h>
34 #include <processing/jobs/send_keepalive_job.h>
35 #include <processing/jobs/rekey_ike_sa_job.h>
38 #include <sa/ikev2/tasks/ike_me.h>
39 #include <processing/jobs/initiate_mediation_job.h>
42 ENUM(ike_sa_state_names
, IKE_CREATED
, IKE_DESTROYING
,
52 typedef struct private_ike_sa_t private_ike_sa_t
;
53 typedef struct attribute_entry_t attribute_entry_t
;
56 * Private data of an ike_sa_t object.
58 struct private_ike_sa_t
{
66 * Identifier for the current IKE_SA.
68 ike_sa_id_t
*ike_sa_id
;
71 * IKE version of this SA.
73 ike_version_t version
;
76 * unique numerical ID for this IKE_SA.
81 * Current state of the IKE_SA
86 * IKE configuration used to set up this IKE_SA
91 * Peer and authentication information to establish IKE_SA.
96 * currently used authentication ruleset, local (as auth_cfg_t)
101 * list of completed local authentication rounds
103 linked_list_t
*my_auths
;
106 * list of completed remote authentication rounds
108 linked_list_t
*other_auths
;
111 * currently used authentication constraints, remote (as auth_cfg_t)
113 auth_cfg_t
*other_auth
;
116 * Selected IKE proposal
118 proposal_t
*proposal
;
121 * Juggles tasks to process messages
123 task_manager_t
*task_manager
;
126 * Address of local host
131 * Address of remote host
137 * Are we mediation server
139 bool is_mediation_server
;
142 * Server reflexive host
144 host_t
*server_reflexive_host
;
153 * Identification used for us
155 identification_t
*my_id
;
158 * Identification used for other
160 identification_t
*other_id
;
163 * set of extensions the peer supports
165 ike_extension_t extensions
;
168 * set of condition flags currently enabled for this IKE_SA
170 ike_condition_t conditions
;
173 * Linked List containing the child sa's of the current IKE_SA.
175 linked_list_t
*child_sas
;
178 * keymat of this IKE_SA
183 * Virtual IP on local host, if any
185 host_t
*my_virtual_ip
;
188 * Virtual IP on remote host, if any
190 host_t
*other_virtual_ip
;
193 * List of configuration attributes (attribute_entry_t)
195 linked_list_t
*attributes
;
198 * list of peers additional addresses, transmitted via MOBIKE
200 linked_list_t
*additional_addresses
;
203 * previously value of received DESTINATION_IP hash
205 chunk_t nat_detection_dest
;
208 * number pending UPDATE_SA_ADDRESS (MOBIKE)
210 u_int32_t pending_updates
;
213 * NAT keep alive interval
215 u_int32_t keepalive_interval
;
218 * Timestamps for this IKE_SA
220 u_int32_t stats
[STAT_MAX
];
223 * how many times we have retried so far (keyingtries)
228 * local host address to be used for IKE, set via MIGRATE kernel message
233 * remote host address to be used for IKE, set via MIGRATE kernel message
238 * Flush auth configs once established?
244 * Entry to maintain install configuration attributes during IKE_SA lifetime
246 struct attribute_entry_t
{
247 /** handler used to install this attribute */
248 attribute_handler_t
*handler
;
249 /** attribute type */
250 configuration_attribute_type_t type
;
251 /** attribute data */
256 * get the time of the latest traffic processed by the kernel
258 static time_t get_use_time(private_ike_sa_t
* this, bool inbound
)
260 enumerator_t
*enumerator
;
261 child_sa_t
*child_sa
;
262 time_t use_time
, current
;
266 use_time
= this->stats
[STAT_INBOUND
];
270 use_time
= this->stats
[STAT_OUTBOUND
];
272 enumerator
= this->child_sas
->create_enumerator(this->child_sas
);
273 while (enumerator
->enumerate(enumerator
, &child_sa
))
275 child_sa
->get_usestats(child_sa
, inbound
, ¤t
, NULL
);
276 use_time
= max(use_time
, current
);
278 enumerator
->destroy(enumerator
);
283 METHOD(ike_sa_t
, get_unique_id
, u_int32_t
,
284 private_ike_sa_t
*this)
286 return this->unique_id
;
289 METHOD(ike_sa_t
, get_name
, char*,
290 private_ike_sa_t
*this)
294 return this->peer_cfg
->get_name(this->peer_cfg
);
299 METHOD(ike_sa_t
, get_statistic
, u_int32_t
,
300 private_ike_sa_t
*this, statistic_t kind
)
304 return this->stats
[kind
];
309 METHOD(ike_sa_t
, set_statistic
, void,
310 private_ike_sa_t
*this, statistic_t kind
, u_int32_t value
)
314 this->stats
[kind
] = value
;
318 METHOD(ike_sa_t
, get_my_host
, host_t
*,
319 private_ike_sa_t
*this)
321 return this->my_host
;
324 METHOD(ike_sa_t
, set_my_host
, void,
325 private_ike_sa_t
*this, host_t
*me
)
327 DESTROY_IF(this->my_host
);
331 METHOD(ike_sa_t
, get_other_host
, host_t
*,
332 private_ike_sa_t
*this)
334 return this->other_host
;
337 METHOD(ike_sa_t
, set_other_host
, void,
338 private_ike_sa_t
*this, host_t
*other
)
340 DESTROY_IF(this->other_host
);
341 this->other_host
= other
;
344 METHOD(ike_sa_t
, get_peer_cfg
, peer_cfg_t
*,
345 private_ike_sa_t
*this)
347 return this->peer_cfg
;
350 METHOD(ike_sa_t
, set_peer_cfg
, void,
351 private_ike_sa_t
*this, peer_cfg_t
*peer_cfg
)
353 peer_cfg
->get_ref(peer_cfg
);
354 DESTROY_IF(this->peer_cfg
);
355 this->peer_cfg
= peer_cfg
;
357 if (this->ike_cfg
== NULL
)
359 this->ike_cfg
= peer_cfg
->get_ike_cfg(peer_cfg
);
360 this->ike_cfg
->get_ref(this->ike_cfg
);
364 METHOD(ike_sa_t
, get_auth_cfg
, auth_cfg_t
*,
365 private_ike_sa_t
*this, bool local
)
369 return this->my_auth
;
371 return this->other_auth
;
374 METHOD(ike_sa_t
, add_auth_cfg
, void,
375 private_ike_sa_t
*this, bool local
, auth_cfg_t
*cfg
)
379 this->my_auths
->insert_last(this->my_auths
, cfg
);
383 this->other_auths
->insert_last(this->other_auths
, cfg
);
387 METHOD(ike_sa_t
, create_auth_cfg_enumerator
, enumerator_t
*,
388 private_ike_sa_t
*this, bool local
)
392 return this->my_auths
->create_enumerator(this->my_auths
);
394 return this->other_auths
->create_enumerator(this->other_auths
);
398 * Flush the stored authentication round information
400 static void flush_auth_cfgs(private_ike_sa_t
*this)
404 this->my_auth
->purge(this->my_auth
, FALSE
);
405 this->other_auth
->purge(this->other_auth
, FALSE
);
407 while (this->my_auths
->remove_last(this->my_auths
,
408 (void**)&cfg
) == SUCCESS
)
412 while (this->other_auths
->remove_last(this->other_auths
,
413 (void**)&cfg
) == SUCCESS
)
419 METHOD(ike_sa_t
, get_proposal
, proposal_t
*,
420 private_ike_sa_t
*this)
422 return this->proposal
;
425 METHOD(ike_sa_t
, set_proposal
, void,
426 private_ike_sa_t
*this, proposal_t
*proposal
)
428 DESTROY_IF(this->proposal
);
429 this->proposal
= proposal
->clone(proposal
);
432 METHOD(ike_sa_t
, set_message_id
, void,
433 private_ike_sa_t
*this, bool initiate
, u_int32_t mid
)
437 this->task_manager
->reset(this->task_manager
, mid
, UINT_MAX
);
441 this->task_manager
->reset(this->task_manager
, UINT_MAX
, mid
);
445 METHOD(ike_sa_t
, send_keepalive
, void,
446 private_ike_sa_t
*this)
448 send_keepalive_job_t
*job
;
449 time_t last_out
, now
, diff
;
451 if (!(this->conditions
& COND_NAT_HERE
) || this->keepalive_interval
== 0)
452 { /* disable keep alives if we are not NATed anymore */
456 last_out
= get_use_time(this, FALSE
);
457 now
= time_monotonic(NULL
);
459 diff
= now
- last_out
;
461 if (diff
>= this->keepalive_interval
)
466 packet
= packet_create();
467 packet
->set_source(packet
, this->my_host
->clone(this->my_host
));
468 packet
->set_destination(packet
, this->other_host
->clone(this->other_host
));
469 data
.ptr
= malloc(1);
472 packet
->set_data(packet
, data
);
473 DBG1(DBG_IKE
, "sending keep alive");
474 charon
->sender
->send(charon
->sender
, packet
);
477 job
= send_keepalive_job_create(this->ike_sa_id
);
478 lib
->scheduler
->schedule_job(lib
->scheduler
, (job_t
*)job
,
479 this->keepalive_interval
- diff
);
482 METHOD(ike_sa_t
, get_ike_cfg
, ike_cfg_t
*,
483 private_ike_sa_t
*this)
485 return this->ike_cfg
;
488 METHOD(ike_sa_t
, set_ike_cfg
, void,
489 private_ike_sa_t
*this, ike_cfg_t
*ike_cfg
)
491 ike_cfg
->get_ref(ike_cfg
);
492 this->ike_cfg
= ike_cfg
;
495 METHOD(ike_sa_t
, enable_extension
, void,
496 private_ike_sa_t
*this, ike_extension_t extension
)
498 this->extensions
|= extension
;
501 METHOD(ike_sa_t
, supports_extension
, bool,
502 private_ike_sa_t
*this, ike_extension_t extension
)
504 return (this->extensions
& extension
) != FALSE
;
507 METHOD(ike_sa_t
, has_condition
, bool,
508 private_ike_sa_t
*this, ike_condition_t condition
)
510 return (this->conditions
& condition
) != FALSE
;
513 METHOD(ike_sa_t
, set_condition
, void,
514 private_ike_sa_t
*this, ike_condition_t condition
, bool enable
)
516 if (has_condition(this, condition
) != enable
)
520 this->conditions
|= condition
;
524 DBG1(DBG_IKE
, "local host is behind NAT, sending keep alives");
525 this->conditions
|= COND_NAT_ANY
;
526 send_keepalive(this);
529 DBG1(DBG_IKE
, "remote host is behind NAT");
530 this->conditions
|= COND_NAT_ANY
;
533 DBG1(DBG_IKE
, "faking NAT situation to enforce UDP encapsulation");
534 this->conditions
|= COND_NAT_ANY
;
542 this->conditions
&= ~condition
;
548 set_condition(this, COND_NAT_ANY
,
549 has_condition(this, COND_NAT_HERE
) ||
550 has_condition(this, COND_NAT_THERE
) ||
551 has_condition(this, COND_NAT_FAKE
));
560 METHOD(ike_sa_t
, send_dpd
, status_t
,
561 private_ike_sa_t
*this)
566 delay
= this->peer_cfg
->get_dpd(this->peer_cfg
);
567 if (this->task_manager
->busy(this->task_manager
))
569 /* an exchange is in the air, no need to start a DPD check */
574 /* check if there was any inbound traffic */
576 last_in
= get_use_time(this, TRUE
);
577 now
= time_monotonic(NULL
);
578 diff
= now
- last_in
;
579 if (!delay
|| diff
>= delay
)
581 /* to long ago, initiate dead peer detection */
582 DBG1(DBG_IKE
, "sending DPD request");
583 this->task_manager
->queue_dpd(this->task_manager
);
587 /* recheck in "interval" seconds */
590 job
= (job_t
*)send_dpd_job_create(this->ike_sa_id
);
591 lib
->scheduler
->schedule_job(lib
->scheduler
, job
, delay
- diff
);
593 return this->task_manager
->initiate(this->task_manager
);
596 METHOD(ike_sa_t
, get_state
, ike_sa_state_t
,
597 private_ike_sa_t
*this)
602 METHOD(ike_sa_t
, set_state
, void,
603 private_ike_sa_t
*this, ike_sa_state_t state
)
605 DBG2(DBG_IKE
, "IKE_SA %s[%d] state change: %N => %N",
606 get_name(this), this->unique_id
,
607 ike_sa_state_names
, this->state
,
608 ike_sa_state_names
, state
);
612 case IKE_ESTABLISHED
:
614 if (this->state
== IKE_CONNECTING
||
615 this->state
== IKE_PASSIVE
)
620 /* calculate rekey, reauth and lifetime */
621 this->stats
[STAT_ESTABLISHED
] = time_monotonic(NULL
);
623 /* schedule rekeying if we have a time which is smaller than
624 * an already scheduled rekeying */
625 t
= this->peer_cfg
->get_rekey_time(this->peer_cfg
, TRUE
);
626 if (t
&& (this->stats
[STAT_REKEY
] == 0 ||
627 (this->stats
[STAT_REKEY
] > t
+ this->stats
[STAT_ESTABLISHED
])))
629 this->stats
[STAT_REKEY
] = t
+ this->stats
[STAT_ESTABLISHED
];
630 job
= (job_t
*)rekey_ike_sa_job_create(this->ike_sa_id
, FALSE
);
631 lib
->scheduler
->schedule_job(lib
->scheduler
, job
, t
);
632 DBG1(DBG_IKE
, "scheduling rekeying in %ds", t
);
634 t
= this->peer_cfg
->get_reauth_time(this->peer_cfg
, TRUE
);
635 if (t
&& (this->stats
[STAT_REAUTH
] == 0 ||
636 (this->stats
[STAT_REAUTH
] > t
+ this->stats
[STAT_ESTABLISHED
])))
638 this->stats
[STAT_REAUTH
] = t
+ this->stats
[STAT_ESTABLISHED
];
639 job
= (job_t
*)rekey_ike_sa_job_create(this->ike_sa_id
, TRUE
);
640 lib
->scheduler
->schedule_job(lib
->scheduler
, job
, t
);
641 DBG1(DBG_IKE
, "scheduling reauthentication in %ds", t
);
643 t
= this->peer_cfg
->get_over_time(this->peer_cfg
);
644 if (this->stats
[STAT_REKEY
] || this->stats
[STAT_REAUTH
])
646 if (this->stats
[STAT_REAUTH
] == 0)
648 this->stats
[STAT_DELETE
] = this->stats
[STAT_REKEY
];
650 else if (this->stats
[STAT_REKEY
] == 0)
652 this->stats
[STAT_DELETE
] = this->stats
[STAT_REAUTH
];
656 this->stats
[STAT_DELETE
] = min(this->stats
[STAT_REKEY
],
657 this->stats
[STAT_REAUTH
]);
659 this->stats
[STAT_DELETE
] += t
;
660 t
= this->stats
[STAT_DELETE
] - this->stats
[STAT_ESTABLISHED
];
661 job
= (job_t
*)delete_ike_sa_job_create(this->ike_sa_id
, TRUE
);
662 lib
->scheduler
->schedule_job(lib
->scheduler
, job
, t
);
663 DBG1(DBG_IKE
, "maximum IKE_SA lifetime %ds", t
);
666 /* start DPD checks */
667 if (this->peer_cfg
->get_dpd(this->peer_cfg
))
676 /* delete may fail if a packet gets lost, so set a timeout */
677 job_t
*job
= (job_t
*)delete_ike_sa_job_create(this->ike_sa_id
, TRUE
);
678 lib
->scheduler
->schedule_job(lib
->scheduler
, job
,
679 HALF_OPEN_IKE_SA_TIMEOUT
);
685 charon
->bus
->ike_state_change(charon
->bus
, &this->public, state
);
689 METHOD(ike_sa_t
, reset
, void,
690 private_ike_sa_t
*this)
692 /* the responder ID is reset, as peer may choose another one */
693 if (this->ike_sa_id
->is_initiator(this->ike_sa_id
))
695 this->ike_sa_id
->set_responder_spi(this->ike_sa_id
, 0);
698 set_state(this, IKE_CREATED
);
700 flush_auth_cfgs(this);
702 this->keymat
->destroy(this->keymat
);
703 this->keymat
= keymat_create(this->version
,
704 this->ike_sa_id
->is_initiator(this->ike_sa_id
));
706 this->task_manager
->reset(this->task_manager
, 0, 0);
709 METHOD(ike_sa_t
, get_keymat
, keymat_t
*,
710 private_ike_sa_t
*this)
715 METHOD(ike_sa_t
, set_virtual_ip
, void,
716 private_ike_sa_t
*this, bool local
, host_t
*ip
)
720 DBG1(DBG_IKE
, "installing new virtual IP %H", ip
);
721 if (hydra
->kernel_interface
->add_ip(hydra
->kernel_interface
, ip
,
722 this->my_host
) == SUCCESS
)
724 if (this->my_virtual_ip
)
726 DBG1(DBG_IKE
, "removing old virtual IP %H", this->my_virtual_ip
);
727 hydra
->kernel_interface
->del_ip(hydra
->kernel_interface
,
728 this->my_virtual_ip
);
730 DESTROY_IF(this->my_virtual_ip
);
731 this->my_virtual_ip
= ip
->clone(ip
);
735 DBG1(DBG_IKE
, "installing virtual IP %H failed", ip
);
736 this->my_virtual_ip
= NULL
;
741 DESTROY_IF(this->other_virtual_ip
);
742 this->other_virtual_ip
= ip
->clone(ip
);
746 METHOD(ike_sa_t
, get_virtual_ip
, host_t
*,
747 private_ike_sa_t
*this, bool local
)
751 return this->my_virtual_ip
;
755 return this->other_virtual_ip
;
759 METHOD(ike_sa_t
, add_additional_address
, void,
760 private_ike_sa_t
*this, host_t
*host
)
762 this->additional_addresses
->insert_last(this->additional_addresses
, host
);
765 METHOD(ike_sa_t
, create_additional_address_enumerator
, enumerator_t
*,
766 private_ike_sa_t
*this)
768 return this->additional_addresses
->create_enumerator(
769 this->additional_addresses
);
772 METHOD(ike_sa_t
, remove_additional_addresses
, void,
773 private_ike_sa_t
*this)
775 enumerator_t
*enumerator
= create_additional_address_enumerator(this);
777 while (enumerator
->enumerate(enumerator
, (void**)&host
))
779 this->additional_addresses
->remove_at(this->additional_addresses
,
783 enumerator
->destroy(enumerator
);
786 METHOD(ike_sa_t
, has_mapping_changed
, bool,
787 private_ike_sa_t
*this, chunk_t hash
)
789 if (this->nat_detection_dest
.ptr
== NULL
)
791 this->nat_detection_dest
= chunk_clone(hash
);
794 if (chunk_equals(hash
, this->nat_detection_dest
))
798 free(this->nat_detection_dest
.ptr
);
799 this->nat_detection_dest
= chunk_clone(hash
);
803 METHOD(ike_sa_t
, set_pending_updates
, void,
804 private_ike_sa_t
*this, u_int32_t updates
)
806 this->pending_updates
= updates
;
809 METHOD(ike_sa_t
, get_pending_updates
, u_int32_t
,
810 private_ike_sa_t
*this)
812 return this->pending_updates
;
815 METHOD(ike_sa_t
, float_ports
, void,
816 private_ike_sa_t
*this)
818 /* do not switch if we have a custom port from MOBIKE/NAT */
819 if (this->my_host
->get_port(this->my_host
) == IKEV2_UDP_PORT
)
821 this->my_host
->set_port(this->my_host
, IKEV2_NATT_PORT
);
823 if (this->other_host
->get_port(this->other_host
) == IKEV2_UDP_PORT
)
825 this->other_host
->set_port(this->other_host
, IKEV2_NATT_PORT
);
829 METHOD(ike_sa_t
, update_hosts
, void,
830 private_ike_sa_t
*this, host_t
*me
, host_t
*other
, bool force
)
840 other
= this->other_host
;
843 /* apply hosts on first received message */
844 if (this->my_host
->is_anyaddr(this->my_host
) ||
845 this->other_host
->is_anyaddr(this->other_host
))
847 set_my_host(this, me
->clone(me
));
848 set_other_host(this, other
->clone(other
));
853 /* update our address in any case */
854 if (!me
->equals(me
, this->my_host
))
856 set_my_host(this, me
->clone(me
));
860 if (!other
->equals(other
, this->other_host
))
862 /* update others address if we are NOT NATed */
863 if (force
|| !has_condition(this, COND_NAT_HERE
))
865 set_other_host(this, other
->clone(other
));
871 /* update all associated CHILD_SAs, if required */
874 enumerator_t
*enumerator
;
875 child_sa_t
*child_sa
;
877 enumerator
= this->child_sas
->create_enumerator(this->child_sas
);
878 while (enumerator
->enumerate(enumerator
, (void**)&child_sa
))
880 if (child_sa
->update(child_sa
, this->my_host
,
881 this->other_host
, this->my_virtual_ip
,
882 has_condition(this, COND_NAT_ANY
)) == NOT_SUPPORTED
)
884 this->public.rekey_child_sa(&this->public,
885 child_sa
->get_protocol(child_sa
),
886 child_sa
->get_spi(child_sa
, TRUE
));
889 enumerator
->destroy(enumerator
);
893 METHOD(ike_sa_t
, generate_message
, status_t
,
894 private_ike_sa_t
*this, message_t
*message
, packet_t
**packet
)
896 if (message
->is_encoded(message
))
898 *packet
= message
->get_packet(message
);
901 this->stats
[STAT_OUTBOUND
] = time_monotonic(NULL
);
902 message
->set_ike_sa_id(message
, this->ike_sa_id
);
903 charon
->bus
->message(charon
->bus
, message
, FALSE
);
904 return message
->generate(message
, this->keymat
, packet
);
907 METHOD(ike_sa_t
, set_kmaddress
, void,
908 private_ike_sa_t
*this, host_t
*local
, host_t
*remote
)
910 DESTROY_IF(this->local_host
);
911 DESTROY_IF(this->remote_host
);
912 this->local_host
= local
->clone(local
);
913 this->remote_host
= remote
->clone(remote
);
917 METHOD(ike_sa_t
, act_as_mediation_server
, void,
918 private_ike_sa_t
*this)
920 charon
->mediation_manager
->update_sa_id(charon
->mediation_manager
,
921 this->other_id
, this->ike_sa_id
);
922 this->is_mediation_server
= TRUE
;
925 METHOD(ike_sa_t
, get_server_reflexive_host
, host_t
*,
926 private_ike_sa_t
*this)
928 return this->server_reflexive_host
;
931 METHOD(ike_sa_t
, set_server_reflexive_host
, void,
932 private_ike_sa_t
*this, host_t
*host
)
934 DESTROY_IF(this->server_reflexive_host
);
935 this->server_reflexive_host
= host
;
938 METHOD(ike_sa_t
, get_connect_id
, chunk_t
,
939 private_ike_sa_t
*this)
941 return this->connect_id
;
944 METHOD(ike_sa_t
, respond
, status_t
,
945 private_ike_sa_t
*this, identification_t
*peer_id
, chunk_t connect_id
)
947 ike_me_t
*task
= ike_me_create(&this->public, TRUE
);
948 task
->respond(task
, peer_id
, connect_id
);
949 this->task_manager
->queue_task(this->task_manager
, (task_t
*)task
);
950 return this->task_manager
->initiate(this->task_manager
);
953 METHOD(ike_sa_t
, callback
, status_t
,
954 private_ike_sa_t
*this, identification_t
*peer_id
)
956 ike_me_t
*task
= ike_me_create(&this->public, TRUE
);
957 task
->callback(task
, peer_id
);
958 this->task_manager
->queue_task(this->task_manager
, (task_t
*)task
);
959 return this->task_manager
->initiate(this->task_manager
);
962 METHOD(ike_sa_t
, relay
, status_t
,
963 private_ike_sa_t
*this, identification_t
*requester
, chunk_t connect_id
,
964 chunk_t connect_key
, linked_list_t
*endpoints
, bool response
)
966 ike_me_t
*task
= ike_me_create(&this->public, TRUE
);
967 task
->relay(task
, requester
, connect_id
, connect_key
, endpoints
, response
);
968 this->task_manager
->queue_task(this->task_manager
, (task_t
*)task
);
969 return this->task_manager
->initiate(this->task_manager
);
972 METHOD(ike_sa_t
, initiate_mediation
, status_t
,
973 private_ike_sa_t
*this, peer_cfg_t
*mediated_cfg
)
975 ike_me_t
*task
= ike_me_create(&this->public, TRUE
);
976 task
->connect(task
, mediated_cfg
->get_peer_id(mediated_cfg
));
977 this->task_manager
->queue_task(this->task_manager
, (task_t
*)task
);
978 return this->task_manager
->initiate(this->task_manager
);
981 METHOD(ike_sa_t
, initiate_mediated
, status_t
,
982 private_ike_sa_t
*this, host_t
*me
, host_t
*other
, chunk_t connect_id
)
984 set_my_host(this, me
->clone(me
));
985 set_other_host(this, other
->clone(other
));
986 chunk_free(&this->connect_id
);
987 this->connect_id
= chunk_clone(connect_id
);
988 return this->task_manager
->initiate(this->task_manager
);
993 * Resolve DNS host in configuration
995 static void resolve_hosts(private_ike_sa_t
*this)
999 if (this->remote_host
)
1001 host
= this->remote_host
->clone(this->remote_host
);
1002 host
->set_port(host
, IKEV2_UDP_PORT
);
1006 host
= host_create_from_dns(this->ike_cfg
->get_other_addr(this->ike_cfg
),
1007 0, this->ike_cfg
->get_other_port(this->ike_cfg
));
1011 set_other_host(this, host
);
1014 if (this->local_host
)
1016 host
= this->local_host
->clone(this->local_host
);
1017 host
->set_port(host
, IKEV2_UDP_PORT
);
1023 /* use same address family as for other */
1024 if (!this->other_host
->is_anyaddr(this->other_host
))
1026 family
= this->other_host
->get_family(this->other_host
);
1028 host
= host_create_from_dns(this->ike_cfg
->get_my_addr(this->ike_cfg
),
1029 family
, this->ike_cfg
->get_my_port(this->ike_cfg
));
1031 if (host
&& host
->is_anyaddr(host
) &&
1032 !this->other_host
->is_anyaddr(this->other_host
))
1034 host
->destroy(host
);
1035 host
= hydra
->kernel_interface
->get_source_addr(
1036 hydra
->kernel_interface
, this->other_host
, NULL
);
1039 host
->set_port(host
, this->ike_cfg
->get_my_port(this->ike_cfg
));
1042 { /* fallback to address family specific %any(6), if configured */
1043 host
= host_create_from_dns(
1044 this->ike_cfg
->get_my_addr(this->ike_cfg
),
1045 0, this->ike_cfg
->get_my_port(this->ike_cfg
));
1051 set_my_host(this, host
);
1055 METHOD(ike_sa_t
, initiate
, status_t
,
1056 private_ike_sa_t
*this, child_cfg_t
*child_cfg
, u_int32_t reqid
,
1057 traffic_selector_t
*tsi
, traffic_selector_t
*tsr
)
1059 if (this->state
== IKE_CREATED
)
1061 resolve_hosts(this);
1063 if (this->other_host
->is_anyaddr(this->other_host
)
1065 && !this->peer_cfg
->get_mediated_by(this->peer_cfg
)
1069 child_cfg
->destroy(child_cfg
);
1070 DBG1(DBG_IKE
, "unable to initiate to %%any");
1071 charon
->bus
->alert(charon
->bus
, ALERT_PEER_ADDR_FAILED
);
1075 set_condition(this, COND_ORIGINAL_INITIATOR
, TRUE
);
1076 this->task_manager
->queue_ike(this->task_manager
);
1080 if (this->peer_cfg
->is_mediation(this->peer_cfg
))
1082 if (this->state
== IKE_ESTABLISHED
)
1084 /* mediation connection is already established, retrigger state
1085 * change to notify bus listeners */
1086 DBG1(DBG_IKE
, "mediation connection is already up");
1087 set_state(this, IKE_ESTABLISHED
);
1089 DESTROY_IF(child_cfg
);
1094 /* normal IKE_SA with CHILD_SA */
1095 this->task_manager
->queue_child(this->task_manager
, child_cfg
, reqid
,
1098 if (this->peer_cfg
->get_mediated_by(this->peer_cfg
))
1100 /* mediated connection, initiate mediation process */
1101 job_t
*job
= (job_t
*)initiate_mediation_job_create(this->ike_sa_id
);
1102 lib
->processor
->queue_job(lib
->processor
, job
);
1108 return this->task_manager
->initiate(this->task_manager
);
1111 METHOD(ike_sa_t
, process_message
, status_t
,
1112 private_ike_sa_t
*this, message_t
*message
)
1116 if (this->state
== IKE_PASSIVE
)
1117 { /* do not handle messages in passive state */
1120 if (message
->get_major_version(message
) != this->version
)
1122 DBG1(DBG_IKE
, "ignoring %N IKEv%u exchange on %N SA",
1123 exchange_type_names
, message
->get_exchange_type(message
),
1124 message
->get_major_version(message
),
1125 ike_version_names
, this->version
);
1126 /* TODO-IKEv1: fall back to IKEv1 if we receive an IKEv1
1127 * INVALID_MAJOR_VERSION on an IKEv2 SA. */
1130 status
= this->task_manager
->process_message(this->task_manager
, message
);
1131 if (this->flush_auth_cfg
&& this->state
== IKE_ESTABLISHED
)
1133 /* authentication completed */
1134 this->flush_auth_cfg
= FALSE
;
1135 flush_auth_cfgs(this);
1140 METHOD(ike_sa_t
, get_id
, ike_sa_id_t
*,
1141 private_ike_sa_t
*this)
1143 return this->ike_sa_id
;
1146 METHOD(ike_sa_t
, get_version
, ike_version_t
,
1147 private_ike_sa_t
*this)
1149 return this->version
;
1152 METHOD(ike_sa_t
, get_my_id
, identification_t
*,
1153 private_ike_sa_t
*this)
1158 METHOD(ike_sa_t
, set_my_id
, void,
1159 private_ike_sa_t
*this, identification_t
*me
)
1161 DESTROY_IF(this->my_id
);
1165 METHOD(ike_sa_t
, get_other_id
, identification_t
*,
1166 private_ike_sa_t
*this)
1168 return this->other_id
;
1171 METHOD(ike_sa_t
, get_other_eap_id
, identification_t
*,
1172 private_ike_sa_t
*this)
1174 identification_t
*id
= NULL
, *current
;
1175 enumerator_t
*enumerator
;
1178 enumerator
= this->other_auths
->create_enumerator(this->other_auths
);
1179 while (enumerator
->enumerate(enumerator
, &cfg
))
1181 /* prefer EAP-Identity of last round */
1182 current
= cfg
->get(cfg
, AUTH_RULE_EAP_IDENTITY
);
1183 if (!current
|| current
->get_type(current
) == ID_ANY
)
1185 current
= cfg
->get(cfg
, AUTH_RULE_IDENTITY
);
1187 if (current
&& current
->get_type(current
) != ID_ANY
)
1193 enumerator
->destroy(enumerator
);
1198 return this->other_id
;
1201 METHOD(ike_sa_t
, set_other_id
, void,
1202 private_ike_sa_t
*this, identification_t
*other
)
1204 DESTROY_IF(this->other_id
);
1205 this->other_id
= other
;
1208 METHOD(ike_sa_t
, add_child_sa
, void,
1209 private_ike_sa_t
*this, child_sa_t
*child_sa
)
1211 this->child_sas
->insert_last(this->child_sas
, child_sa
);
1214 METHOD(ike_sa_t
, get_child_sa
, child_sa_t
*,
1215 private_ike_sa_t
*this, protocol_id_t protocol
, u_int32_t spi
, bool inbound
)
1217 enumerator_t
*enumerator
;
1218 child_sa_t
*current
, *found
= NULL
;
1220 enumerator
= this->child_sas
->create_enumerator(this->child_sas
);
1221 while (enumerator
->enumerate(enumerator
, (void**)¤t
))
1223 if (current
->get_spi(current
, inbound
) == spi
&&
1224 current
->get_protocol(current
) == protocol
)
1229 enumerator
->destroy(enumerator
);
1233 METHOD(ike_sa_t
, get_child_count
, int,
1234 private_ike_sa_t
*this)
1236 return this->child_sas
->get_count(this->child_sas
);
1239 METHOD(ike_sa_t
, create_child_sa_enumerator
, enumerator_t
*,
1240 private_ike_sa_t
*this)
1242 return this->child_sas
->create_enumerator(this->child_sas
);
1245 METHOD(ike_sa_t
, remove_child_sa
, void,
1246 private_ike_sa_t
*this, enumerator_t
*enumerator
)
1248 this->child_sas
->remove_at(this->child_sas
, enumerator
);
1251 METHOD(ike_sa_t
, rekey_child_sa
, status_t
,
1252 private_ike_sa_t
*this, protocol_id_t protocol
, u_int32_t spi
)
1254 this->task_manager
->queue_child_rekey(this->task_manager
, protocol
, spi
);
1255 return this->task_manager
->initiate(this->task_manager
);
1258 METHOD(ike_sa_t
, delete_child_sa
, status_t
,
1259 private_ike_sa_t
*this, protocol_id_t protocol
, u_int32_t spi
)
1261 this->task_manager
->queue_child_delete(this->task_manager
, protocol
, spi
);
1262 return this->task_manager
->initiate(this->task_manager
);
1265 METHOD(ike_sa_t
, destroy_child_sa
, status_t
,
1266 private_ike_sa_t
*this, protocol_id_t protocol
, u_int32_t spi
)
1268 enumerator_t
*enumerator
;
1269 child_sa_t
*child_sa
;
1270 status_t status
= NOT_FOUND
;
1272 enumerator
= this->child_sas
->create_enumerator(this->child_sas
);
1273 while (enumerator
->enumerate(enumerator
, (void**)&child_sa
))
1275 if (child_sa
->get_protocol(child_sa
) == protocol
&&
1276 child_sa
->get_spi(child_sa
, TRUE
) == spi
)
1278 this->child_sas
->remove_at(this->child_sas
, enumerator
);
1279 child_sa
->destroy(child_sa
);
1284 enumerator
->destroy(enumerator
);
1288 METHOD(ike_sa_t
, delete_
, status_t
,
1289 private_ike_sa_t
*this)
1291 switch (this->state
)
1293 case IKE_ESTABLISHED
:
1295 this->task_manager
->queue_ike_delete(this->task_manager
);
1296 return this->task_manager
->initiate(this->task_manager
);
1298 DBG1(DBG_IKE
, "deleting unestablished IKE_SA");
1303 DBG1(DBG_IKE
, "destroying IKE_SA in state %N "
1304 "without notification", ike_sa_state_names
, this->state
);
1305 charon
->bus
->ike_updown(charon
->bus
, &this->public, FALSE
);
1311 METHOD(ike_sa_t
, rekey
, status_t
,
1312 private_ike_sa_t
*this)
1314 this->task_manager
->queue_ike_rekey(this->task_manager
);
1315 return this->task_manager
->initiate(this->task_manager
);
1318 METHOD(ike_sa_t
, reauth
, status_t
,
1319 private_ike_sa_t
*this)
1321 /* we can't reauthenticate as responder when we use EAP or virtual IPs.
1322 * If the peer does not support RFC4478, there is no way to keep the
1324 if (!has_condition(this, COND_ORIGINAL_INITIATOR
))
1326 DBG1(DBG_IKE
, "initiator did not reauthenticate as requested");
1327 if (this->other_virtual_ip
!= NULL
||
1328 has_condition(this, COND_EAP_AUTHENTICATED
)
1330 /* as mediation server we too cannot reauth the IKE_SA */
1331 || this->is_mediation_server
1335 time_t now
= time_monotonic(NULL
);
1337 DBG1(DBG_IKE
, "IKE_SA will timeout in %V",
1338 &now
, &this->stats
[STAT_DELETE
]);
1343 DBG1(DBG_IKE
, "reauthenticating actively");
1346 this->task_manager
->queue_ike_reauth(this->task_manager
);
1347 return this->task_manager
->initiate(this->task_manager
);
1350 METHOD(ike_sa_t
, reestablish
, status_t
,
1351 private_ike_sa_t
*this)
1356 enumerator_t
*enumerator
;
1357 child_sa_t
*child_sa
;
1358 child_cfg_t
*child_cfg
;
1359 bool restart
= FALSE
;
1360 status_t status
= FAILED
;
1362 /* check if we have children to keep up at all */
1363 enumerator
= this->child_sas
->create_enumerator(this->child_sas
);
1364 while (enumerator
->enumerate(enumerator
, (void**)&child_sa
))
1366 if (this->state
== IKE_DELETING
)
1368 action
= child_sa
->get_close_action(child_sa
);
1372 action
= child_sa
->get_dpd_action(child_sa
);
1376 case ACTION_RESTART
:
1380 charon
->traps
->install(charon
->traps
, this->peer_cfg
,
1381 child_sa
->get_config(child_sa
));
1387 enumerator
->destroy(enumerator
);
1389 /* mediation connections have no children, keep them up anyway */
1390 if (this->peer_cfg
->is_mediation(this->peer_cfg
))
1400 /* check if we are able to reestablish this IKE_SA */
1401 if (!has_condition(this, COND_ORIGINAL_INITIATOR
) &&
1402 (this->other_virtual_ip
!= NULL
||
1403 has_condition(this, COND_EAP_AUTHENTICATED
)
1405 || this->is_mediation_server
1409 DBG1(DBG_IKE
, "unable to reestablish IKE_SA due to asymmetric setup");
1413 new = charon
->ike_sa_manager
->checkout_new(charon
->ike_sa_manager
,
1414 this->version
, TRUE
);
1419 new->set_peer_cfg(new, this->peer_cfg
);
1420 host
= this->other_host
;
1421 new->set_other_host(new, host
->clone(host
));
1422 host
= this->my_host
;
1423 new->set_my_host(new, host
->clone(host
));
1424 /* if we already have a virtual IP, we reuse it */
1425 host
= this->my_virtual_ip
;
1428 new->set_virtual_ip(new, TRUE
, host
);
1432 if (this->peer_cfg
->is_mediation(this->peer_cfg
))
1434 status
= new->initiate(new, NULL
, 0, NULL
, NULL
);
1439 enumerator
= this->child_sas
->create_enumerator(this->child_sas
);
1440 while (enumerator
->enumerate(enumerator
, (void**)&child_sa
))
1442 if (this->state
== IKE_DELETING
)
1444 action
= child_sa
->get_close_action(child_sa
);
1448 action
= child_sa
->get_dpd_action(child_sa
);
1452 case ACTION_RESTART
:
1453 child_cfg
= child_sa
->get_config(child_sa
);
1454 DBG1(DBG_IKE
, "restarting CHILD_SA %s",
1455 child_cfg
->get_name(child_cfg
));
1456 child_cfg
->get_ref(child_cfg
);
1457 status
= new->initiate(new, child_cfg
, 0, NULL
, NULL
);
1462 if (status
== DESTROY_ME
)
1467 enumerator
->destroy(enumerator
);
1470 if (status
== DESTROY_ME
)
1472 charon
->ike_sa_manager
->checkin_and_destroy(charon
->ike_sa_manager
, new);
1477 charon
->ike_sa_manager
->checkin(charon
->ike_sa_manager
, new);
1480 charon
->bus
->set_sa(charon
->bus
, &this->public);
1484 METHOD(ike_sa_t
, retransmit
, status_t
,
1485 private_ike_sa_t
*this, u_int32_t message_id
)
1487 this->stats
[STAT_OUTBOUND
] = time_monotonic(NULL
);
1488 if (this->task_manager
->retransmit(this->task_manager
, message_id
) != SUCCESS
)
1490 /* send a proper signal to brief interested bus listeners */
1491 switch (this->state
)
1493 case IKE_CONNECTING
:
1495 /* retry IKE_SA_INIT/Main Mode if we have multiple keyingtries */
1496 u_int32_t tries
= this->peer_cfg
->get_keyingtries(this->peer_cfg
);
1498 if (tries
== 0 || tries
> this->keyingtry
)
1500 DBG1(DBG_IKE
, "peer not responding, trying again (%d/%d)",
1501 this->keyingtry
+ 1, tries
);
1503 this->task_manager
->queue_ike(this->task_manager
);
1504 return this->task_manager
->initiate(this->task_manager
);
1506 DBG1(DBG_IKE
, "establishing IKE_SA failed, peer not responding");
1510 DBG1(DBG_IKE
, "proper IKE_SA delete failed, peer not responding");
1513 DBG1(DBG_IKE
, "rekeying IKE_SA failed, peer not responding");
1524 METHOD(ike_sa_t
, set_auth_lifetime
, void,
1525 private_ike_sa_t
*this, u_int32_t lifetime
)
1527 u_int32_t reduction
= this->peer_cfg
->get_over_time(this->peer_cfg
);
1528 u_int32_t reauth_time
= time_monotonic(NULL
) + lifetime
- reduction
;
1530 if (lifetime
< reduction
)
1532 DBG1(DBG_IKE
, "received AUTH_LIFETIME of %ds, starting reauthentication",
1534 lib
->processor
->queue_job(lib
->processor
,
1535 (job_t
*)rekey_ike_sa_job_create(this->ike_sa_id
, TRUE
));
1537 else if (this->stats
[STAT_REAUTH
] == 0 ||
1538 this->stats
[STAT_REAUTH
] > reauth_time
)
1540 this->stats
[STAT_REAUTH
] = reauth_time
;
1541 DBG1(DBG_IKE
, "received AUTH_LIFETIME of %ds, scheduling reauthentication"
1542 " in %ds", lifetime
, lifetime
- reduction
);
1543 lib
->scheduler
->schedule_job(lib
->scheduler
,
1544 (job_t
*)rekey_ike_sa_job_create(this->ike_sa_id
, TRUE
),
1545 lifetime
- reduction
);
1549 DBG1(DBG_IKE
, "received AUTH_LIFETIME of %ds, "
1550 "reauthentication already scheduled in %ds", lifetime
,
1551 this->stats
[STAT_REAUTH
] - time_monotonic(NULL
));
1556 * Check if the current combination of source and destination address is still
1559 static bool is_current_path_valid(private_ike_sa_t
*this)
1563 src
= hydra
->kernel_interface
->get_source_addr(hydra
->kernel_interface
,
1564 this->other_host
, this->my_host
);
1567 if (src
->ip_equals(src
, this->my_host
))
1577 * Check if we have any path avialable for this IKE SA.
1579 static bool is_any_path_valid(private_ike_sa_t
*this)
1582 enumerator_t
*enumerator
;
1584 DBG1(DBG_IKE
, "old path is not available anymore, try to find another");
1585 src
= hydra
->kernel_interface
->get_source_addr(hydra
->kernel_interface
,
1586 this->other_host
, NULL
);
1589 enumerator
= this->additional_addresses
->create_enumerator(
1590 this->additional_addresses
);
1591 while (enumerator
->enumerate(enumerator
, &addr
))
1593 DBG1(DBG_IKE
, "looking for a route to %H ...", addr
);
1594 src
= hydra
->kernel_interface
->get_source_addr(
1595 hydra
->kernel_interface
, addr
, NULL
);
1601 enumerator
->destroy(enumerator
);
1611 METHOD(ike_sa_t
, roam
, status_t
,
1612 private_ike_sa_t
*this, bool address
)
1614 switch (this->state
)
1618 case IKE_DESTROYING
:
1625 /* keep existing path if possible */
1626 if (is_current_path_valid(this))
1628 DBG2(DBG_IKE
, "keeping connection path %H - %H",
1629 this->my_host
, this->other_host
);
1630 set_condition(this, COND_STALE
, FALSE
);
1632 if (supports_extension(this, EXT_MOBIKE
) && address
)
1633 { /* if any addresses changed, send an updated list */
1634 DBG1(DBG_IKE
, "sending address list update using MOBIKE");
1635 this->task_manager
->queue_mobike(this->task_manager
, FALSE
, TRUE
);
1636 return this->task_manager
->initiate(this->task_manager
);
1641 if (!is_any_path_valid(this))
1643 DBG1(DBG_IKE
, "no route found to reach %H, MOBIKE update deferred",
1645 set_condition(this, COND_STALE
, TRUE
);
1648 set_condition(this, COND_STALE
, FALSE
);
1650 /* update addresses with mobike, if supported ... */
1651 if (supports_extension(this, EXT_MOBIKE
))
1653 if (!has_condition(this, COND_ORIGINAL_INITIATOR
))
1654 { /* responder updates the peer about changed address config */
1655 DBG1(DBG_IKE
, "sending address list update using MOBIKE, "
1656 "implicitly requesting an address change");
1661 DBG1(DBG_IKE
, "requesting address change using MOBIKE");
1663 this->task_manager
->queue_mobike(this->task_manager
, TRUE
, address
);
1664 return this->task_manager
->initiate(this->task_manager
);
1667 /* ... reauth if not */
1668 if (!has_condition(this, COND_ORIGINAL_INITIATOR
))
1669 { /* responder does not reauthenticate */
1670 set_condition(this, COND_STALE
, TRUE
);
1673 DBG1(DBG_IKE
, "reauthenticating IKE_SA due to address change");
1674 return reauth(this);
1677 METHOD(ike_sa_t
, add_configuration_attribute
, void,
1678 private_ike_sa_t
*this, attribute_handler_t
*handler
,
1679 configuration_attribute_type_t type
, chunk_t data
)
1681 attribute_entry_t
*entry
= malloc_thing(attribute_entry_t
);
1683 entry
->handler
= handler
;
1685 entry
->data
= chunk_clone(data
);
1687 this->attributes
->insert_last(this->attributes
, entry
);
1690 METHOD(ike_sa_t
, create_task_enumerator
, enumerator_t
*,
1691 private_ike_sa_t
*this, task_queue_t queue
)
1693 return this->task_manager
->create_task_enumerator(this->task_manager
, queue
);
1696 METHOD(ike_sa_t
, queue_task
, void,
1697 private_ike_sa_t
*this, task_t
*task
)
1699 this->task_manager
->queue_task(this->task_manager
, task
);
1702 METHOD(ike_sa_t
, inherit
, void,
1703 private_ike_sa_t
*this, ike_sa_t
*other_public
)
1705 private_ike_sa_t
*other
= (private_ike_sa_t
*)other_public
;
1706 child_sa_t
*child_sa
;
1707 attribute_entry_t
*entry
;
1708 enumerator_t
*enumerator
;
1711 /* apply hosts and ids */
1712 this->my_host
->destroy(this->my_host
);
1713 this->other_host
->destroy(this->other_host
);
1714 this->my_id
->destroy(this->my_id
);
1715 this->other_id
->destroy(this->other_id
);
1716 this->my_host
= other
->my_host
->clone(other
->my_host
);
1717 this->other_host
= other
->other_host
->clone(other
->other_host
);
1718 this->my_id
= other
->my_id
->clone(other
->my_id
);
1719 this->other_id
= other
->other_id
->clone(other
->other_id
);
1721 /* apply virtual assigned IPs... */
1722 if (other
->my_virtual_ip
)
1724 this->my_virtual_ip
= other
->my_virtual_ip
;
1725 other
->my_virtual_ip
= NULL
;
1727 if (other
->other_virtual_ip
)
1729 this->other_virtual_ip
= other
->other_virtual_ip
;
1730 other
->other_virtual_ip
= NULL
;
1733 /* authentication information */
1734 enumerator
= other
->my_auths
->create_enumerator(other
->my_auths
);
1735 while (enumerator
->enumerate(enumerator
, &cfg
))
1737 this->my_auths
->insert_last(this->my_auths
, cfg
->clone(cfg
));
1739 enumerator
->destroy(enumerator
);
1740 enumerator
= other
->other_auths
->create_enumerator(other
->other_auths
);
1741 while (enumerator
->enumerate(enumerator
, &cfg
))
1743 this->other_auths
->insert_last(this->other_auths
, cfg
->clone(cfg
));
1745 enumerator
->destroy(enumerator
);
1747 /* ... and configuration attributes */
1748 while (other
->attributes
->remove_last(other
->attributes
,
1749 (void**)&entry
) == SUCCESS
)
1751 this->attributes
->insert_first(this->attributes
, entry
);
1754 /* inherit all conditions */
1755 this->conditions
= other
->conditions
;
1756 if (this->conditions
& COND_NAT_HERE
)
1758 send_keepalive(this);
1762 if (other
->is_mediation_server
)
1764 act_as_mediation_server(this);
1766 else if (other
->server_reflexive_host
)
1768 this->server_reflexive_host
= other
->server_reflexive_host
->clone(
1769 other
->server_reflexive_host
);
1773 /* adopt all children */
1774 while (other
->child_sas
->remove_last(other
->child_sas
,
1775 (void**)&child_sa
) == SUCCESS
)
1777 this->child_sas
->insert_first(this->child_sas
, (void*)child_sa
);
1780 /* move pending tasks to the new IKE_SA */
1781 this->task_manager
->adopt_tasks(this->task_manager
, other
->task_manager
);
1783 /* reauthentication timeout survives a rekeying */
1784 if (other
->stats
[STAT_REAUTH
])
1786 time_t reauth
, delete, now
= time_monotonic(NULL
);
1788 this->stats
[STAT_REAUTH
] = other
->stats
[STAT_REAUTH
];
1789 reauth
= this->stats
[STAT_REAUTH
] - now
;
1790 delete = reauth
+ this->peer_cfg
->get_over_time(this->peer_cfg
);
1791 this->stats
[STAT_DELETE
] = this->stats
[STAT_REAUTH
] + delete;
1792 DBG1(DBG_IKE
, "rescheduling reauthentication in %ds after rekeying, "
1793 "lifetime reduced to %ds", reauth
, delete);
1794 lib
->scheduler
->schedule_job(lib
->scheduler
,
1795 (job_t
*)rekey_ike_sa_job_create(this->ike_sa_id
, TRUE
), reauth
);
1796 lib
->scheduler
->schedule_job(lib
->scheduler
,
1797 (job_t
*)delete_ike_sa_job_create(this->ike_sa_id
, TRUE
), delete);
1801 METHOD(ike_sa_t
, destroy
, void,
1802 private_ike_sa_t
*this)
1804 attribute_entry_t
*entry
;
1806 charon
->bus
->set_sa(charon
->bus
, &this->public);
1808 set_state(this, IKE_DESTROYING
);
1809 DESTROY_IF(this->task_manager
);
1811 /* remove attributes first, as we pass the IKE_SA to the handler */
1812 while (this->attributes
->remove_last(this->attributes
,
1813 (void**)&entry
) == SUCCESS
)
1815 hydra
->attributes
->release(hydra
->attributes
, entry
->handler
,
1816 this->other_id
, entry
->type
, entry
->data
);
1817 free(entry
->data
.ptr
);
1820 this->attributes
->destroy(this->attributes
);
1822 this->child_sas
->destroy_offset(this->child_sas
, offsetof(child_sa_t
, destroy
));
1824 /* unset SA after here to avoid usage by the listeners */
1825 charon
->bus
->set_sa(charon
->bus
, NULL
);
1827 DESTROY_IF(this->keymat
);
1829 if (this->my_virtual_ip
)
1831 hydra
->kernel_interface
->del_ip(hydra
->kernel_interface
,
1832 this->my_virtual_ip
);
1833 this->my_virtual_ip
->destroy(this->my_virtual_ip
);
1835 if (this->other_virtual_ip
)
1837 if (this->peer_cfg
&& this->peer_cfg
->get_pool(this->peer_cfg
))
1839 hydra
->attributes
->release_address(hydra
->attributes
,
1840 this->peer_cfg
->get_pool(this->peer_cfg
),
1841 this->other_virtual_ip
, get_other_eap_id(this));
1843 this->other_virtual_ip
->destroy(this->other_virtual_ip
);
1845 this->additional_addresses
->destroy_offset(this->additional_addresses
,
1846 offsetof(host_t
, destroy
));
1848 if (this->is_mediation_server
)
1850 charon
->mediation_manager
->remove(charon
->mediation_manager
,
1853 DESTROY_IF(this->server_reflexive_host
);
1854 chunk_free(&this->connect_id
);
1856 free(this->nat_detection_dest
.ptr
);
1858 DESTROY_IF(this->my_host
);
1859 DESTROY_IF(this->other_host
);
1860 DESTROY_IF(this->my_id
);
1861 DESTROY_IF(this->other_id
);
1862 DESTROY_IF(this->local_host
);
1863 DESTROY_IF(this->remote_host
);
1865 DESTROY_IF(this->ike_cfg
);
1866 DESTROY_IF(this->peer_cfg
);
1867 DESTROY_IF(this->proposal
);
1868 this->my_auth
->destroy(this->my_auth
);
1869 this->other_auth
->destroy(this->other_auth
);
1870 this->my_auths
->destroy_offset(this->my_auths
,
1871 offsetof(auth_cfg_t
, destroy
));
1872 this->other_auths
->destroy_offset(this->other_auths
,
1873 offsetof(auth_cfg_t
, destroy
));
1875 this->ike_sa_id
->destroy(this->ike_sa_id
);
1880 * Described in header.
1882 ike_sa_t
* ike_sa_create(ike_sa_id_t
*ike_sa_id
, bool initiator
,
1883 ike_version_t version
)
1885 private_ike_sa_t
*this;
1886 static u_int32_t unique_id
= 0;
1888 if (version
== IKE_ANY
)
1889 { /* prefer IKEv2 if protocol not specified */
1899 .get_version
= _get_version
,
1900 .get_state
= _get_state
,
1901 .set_state
= _set_state
,
1902 .get_name
= _get_name
,
1903 .get_statistic
= _get_statistic
,
1904 .set_statistic
= _set_statistic
,
1905 .process_message
= _process_message
,
1906 .initiate
= _initiate
,
1907 .get_ike_cfg
= _get_ike_cfg
,
1908 .set_ike_cfg
= _set_ike_cfg
,
1909 .get_peer_cfg
= _get_peer_cfg
,
1910 .set_peer_cfg
= _set_peer_cfg
,
1911 .get_auth_cfg
= _get_auth_cfg
,
1912 .create_auth_cfg_enumerator
= _create_auth_cfg_enumerator
,
1913 .add_auth_cfg
= _add_auth_cfg
,
1914 .get_proposal
= _get_proposal
,
1915 .set_proposal
= _set_proposal
,
1917 .get_my_host
= _get_my_host
,
1918 .set_my_host
= _set_my_host
,
1919 .get_other_host
= _get_other_host
,
1920 .set_other_host
= _set_other_host
,
1921 .set_message_id
= _set_message_id
,
1922 .float_ports
= _float_ports
,
1923 .update_hosts
= _update_hosts
,
1924 .get_my_id
= _get_my_id
,
1925 .set_my_id
= _set_my_id
,
1926 .get_other_id
= _get_other_id
,
1927 .set_other_id
= _set_other_id
,
1928 .get_other_eap_id
= _get_other_eap_id
,
1929 .enable_extension
= _enable_extension
,
1930 .supports_extension
= _supports_extension
,
1931 .set_condition
= _set_condition
,
1932 .has_condition
= _has_condition
,
1933 .set_pending_updates
= _set_pending_updates
,
1934 .get_pending_updates
= _get_pending_updates
,
1935 .create_additional_address_enumerator
= _create_additional_address_enumerator
,
1936 .add_additional_address
= _add_additional_address
,
1937 .remove_additional_addresses
= _remove_additional_addresses
,
1938 .has_mapping_changed
= _has_mapping_changed
,
1939 .retransmit
= _retransmit
,
1941 .destroy
= _destroy
,
1942 .send_dpd
= _send_dpd
,
1943 .send_keepalive
= _send_keepalive
,
1944 .get_keymat
= _get_keymat
,
1945 .add_child_sa
= _add_child_sa
,
1946 .get_child_sa
= _get_child_sa
,
1947 .get_child_count
= _get_child_count
,
1948 .create_child_sa_enumerator
= _create_child_sa_enumerator
,
1949 .remove_child_sa
= _remove_child_sa
,
1950 .rekey_child_sa
= _rekey_child_sa
,
1951 .delete_child_sa
= _delete_child_sa
,
1952 .destroy_child_sa
= _destroy_child_sa
,
1955 .reestablish
= _reestablish
,
1956 .set_auth_lifetime
= _set_auth_lifetime
,
1958 .inherit
= _inherit
,
1959 .generate_message
= _generate_message
,
1961 .get_unique_id
= _get_unique_id
,
1962 .set_virtual_ip
= _set_virtual_ip
,
1963 .get_virtual_ip
= _get_virtual_ip
,
1964 .add_configuration_attribute
= _add_configuration_attribute
,
1965 .set_kmaddress
= _set_kmaddress
,
1966 .create_task_enumerator
= _create_task_enumerator
,
1967 .queue_task
= _queue_task
,
1969 .act_as_mediation_server
= _act_as_mediation_server
,
1970 .get_server_reflexive_host
= _get_server_reflexive_host
,
1971 .set_server_reflexive_host
= _set_server_reflexive_host
,
1972 .get_connect_id
= _get_connect_id
,
1973 .initiate_mediation
= _initiate_mediation
,
1974 .initiate_mediated
= _initiate_mediated
,
1976 .callback
= _callback
,
1977 .respond
= _respond
,
1980 .ike_sa_id
= ike_sa_id
->clone(ike_sa_id
),
1982 .child_sas
= linked_list_create(),
1983 .my_host
= host_create_any(AF_INET
),
1984 .other_host
= host_create_any(AF_INET
),
1985 .my_id
= identification_create_from_encoding(ID_ANY
, chunk_empty
),
1986 .other_id
= identification_create_from_encoding(ID_ANY
, chunk_empty
),
1987 .keymat
= keymat_create(version
, initiator
),
1988 .state
= IKE_CREATED
,
1989 .stats
[STAT_INBOUND
] = time_monotonic(NULL
),
1990 .stats
[STAT_OUTBOUND
] = time_monotonic(NULL
),
1991 .my_auth
= auth_cfg_create(),
1992 .other_auth
= auth_cfg_create(),
1993 .my_auths
= linked_list_create(),
1994 .other_auths
= linked_list_create(),
1995 .unique_id
= ++unique_id
,
1996 .additional_addresses
= linked_list_create(),
1997 .attributes
= linked_list_create(),
1998 .keepalive_interval
= lib
->settings
->get_time(lib
->settings
,
1999 "charon.keep_alive", KEEPALIVE_INTERVAL
),
2000 .flush_auth_cfg
= lib
->settings
->get_bool(lib
->settings
,
2001 "charon.flush_auth_cfg", FALSE
),
2004 this->task_manager
= task_manager_create(&this->public);
2005 this->my_host
->set_port(this->my_host
, IKEV2_UDP_PORT
);
2007 if (!this->task_manager
|| !this->keymat
)
2009 DBG1(DBG_IKE
, "IKE version %d not supported", this->version
);
2013 return &this->public;