201
219
enumerator_t *enumerator;
202
220
ike_sa_t *ike_sa = NULL;
203
221
peer_cfg_t *peer_cfg = NULL;
223
bool received_vip = FALSE;
205
225
enumerator = message->create_attribute_enumerator(message);
206
226
while (enumerator->enumerate(enumerator, &attribute, &value))
222
242
case HA_REMOTE_ID:
223
243
ike_sa->set_other_id(ike_sa, value.id->clone(value.id));
245
case HA_REMOTE_EAP_ID:
246
auth = auth_cfg_create();
247
auth->add(auth, AUTH_RULE_EAP_IDENTITY, value.id->clone(value.id));
248
ike_sa->add_auth_cfg(ike_sa, FALSE, auth);
225
250
case HA_LOCAL_ADDR:
226
251
ike_sa->set_my_host(ike_sa, value.host->clone(value.host));
265
291
set_condition(ike_sa, value.u32, COND_CERTREQ_SEEN);
266
292
set_condition(ike_sa, value.u32, COND_ORIGINAL_INITIATOR);
268
case HA_INITIATE_MID:
269
ike_sa->set_message_id(ike_sa, TRUE, value.u32);
272
ike_sa->set_message_id(ike_sa, FALSE, value.u32);
282
302
if (ike_sa->get_state(ike_sa) == IKE_CONNECTING &&
283
303
ike_sa->get_peer_cfg(ike_sa))
305
DBG1(DBG_CFG, "installed HA passive IKE_SA '%s' %H[%Y]...%H[%Y]",
306
ike_sa->get_name(ike_sa),
307
ike_sa->get_my_host(ike_sa), ike_sa->get_my_id(ike_sa),
308
ike_sa->get_other_host(ike_sa), ike_sa->get_other_id(ike_sa));
285
309
ike_sa->set_state(ike_sa, IKE_PASSIVE);
287
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
316
peer_cfg = ike_sa->get_peer_cfg(ike_sa);
317
vip = ike_sa->get_virtual_ip(ike_sa, FALSE);
320
pool = peer_cfg->get_pool(peer_cfg);
323
this->attr->reserve(this->attr, pool, vip);
327
this->cache->cache(this->cache, ike_sa, message);
328
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
332
DBG1(DBG_CFG, "passive HA IKE_SA to update not found");
333
message->destroy(message);
338
* Process messages of type IKE_MID_INITIATOR/RESPONDER
340
static void process_ike_mid(private_ha_dispatcher_t *this,
341
ha_message_t *message, bool initiator)
343
ha_message_attribute_t attribute;
344
ha_message_value_t value;
345
enumerator_t *enumerator;
346
ike_sa_t *ike_sa = NULL;
349
enumerator = message->create_attribute_enumerator(message);
350
while (enumerator->enumerate(enumerator, &attribute, &value))
355
ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager,
365
enumerator->destroy(enumerator);
371
ike_sa->set_message_id(ike_sa, initiator, mid);
373
this->cache->cache(this->cache, ike_sa, message);
374
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
378
message->destroy(message);
297
388
ha_message_attribute_t attribute;
298
389
ha_message_value_t value;
299
390
enumerator_t *enumerator;
391
ike_sa_t *ike_sa = NULL;
302
393
enumerator = message->create_attribute_enumerator(message);
303
394
while (enumerator->enumerate(enumerator, &attribute, &value))
308
399
ike_sa = charon->ike_sa_manager->checkout(
309
400
charon->ike_sa_manager, value.ike_sa_id);
312
charon->ike_sa_manager->checkin_and_destroy(
313
charon->ike_sa_manager, ike_sa);
320
406
enumerator->destroy(enumerator);
409
this->cache->cache(this->cache, ike_sa, message);
410
charon->ike_sa_manager->checkin_and_destroy(
411
charon->ike_sa_manager, ike_sa);
415
message->destroy(message);
366
462
u_int16_t inbound_cpi = 0, outbound_cpi = 0;
367
463
u_int8_t mode = MODE_TUNNEL, ipcomp = 0;
368
464
u_int16_t encr = ENCR_UNDEFINED, integ = AUTH_UNDEFINED, len = 0;
369
466
chunk_t nonce_i = chunk_empty, nonce_r = chunk_empty, secret = chunk_empty;
370
467
chunk_t encr_i, integ_i, encr_r, integ_r;
371
468
linked_list_t *local_ts, *remote_ts;
524
625
local_ts->destroy_offset(local_ts, offsetof(traffic_selector_t, destroy));
525
626
remote_ts->destroy_offset(remote_ts, offsetof(traffic_selector_t, destroy));
526
627
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
628
message->destroy(message);
632
seg_i = this->kernel->get_segment_spi(this->kernel,
633
ike_sa->get_my_host(ike_sa), inbound_spi);
634
seg_o = this->kernel->get_segment_spi(this->kernel,
635
ike_sa->get_other_host(ike_sa), outbound_spi);
637
DBG1(DBG_CFG, "installed HA CHILD_SA %s{%d} %#R=== %#R "
638
"(segment in: %d%s, out: %d%s)", child_sa->get_name(child_sa),
639
child_sa->get_reqid(child_sa), local_ts, remote_ts,
640
seg_i, this->segments->is_active(this->segments, seg_i) ? "*" : "",
641
seg_o, this->segments->is_active(this->segments, seg_o) ? "*" : "");
530
642
child_sa->add_policies(child_sa, local_ts, remote_ts);
531
643
local_ts->destroy_offset(local_ts, offsetof(traffic_selector_t, destroy));
532
644
remote_ts->destroy_offset(remote_ts, offsetof(traffic_selector_t, destroy));
534
646
child_sa->set_state(child_sa, CHILD_INSTALLED);
535
647
ike_sa->add_child_sa(ike_sa, child_sa);
648
message->destroy(message);
536
649
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
557
672
value.ike_sa_id);
559
674
case HA_INBOUND_SPI:
562
ike_sa->destroy_child_sa(ike_sa, PROTO_ESP, value.u32);
681
enumerator->destroy(enumerator);
685
child_sa = ike_sa->get_child_sa(ike_sa, PROTO_ESP, spi, TRUE);
688
ike_sa->destroy_child_sa(ike_sa, PROTO_ESP, spi);
571
690
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
573
enumerator->destroy(enumerator);
692
message->destroy(message);
666
788
static job_requeue_t dispatch(private_ha_dispatcher_t *this)
668
790
ha_message_t *message;
791
ha_message_type_t type;
670
793
message = this->socket->pull(this->socket);
671
switch (message->get_type(message))
794
type = message->get_type(message);
795
if (type != HA_STATUS)
797
DBG2(DBG_CFG, "received HA %N message", ha_message_type_names,
798
message->get_type(message));
674
803
process_ike_add(this, message);
676
805
case HA_IKE_UPDATE:
677
806
process_ike_update(this, message);
808
case HA_IKE_MID_INITIATOR:
809
process_ike_mid(this, message, TRUE);
811
case HA_IKE_MID_RESPONDER:
812
process_ike_mid(this, message, FALSE);
679
814
case HA_IKE_DELETE:
680
815
process_ike_delete(this, message);
698
833
process_resync(this, message);
701
DBG1(DBG_CFG, "received unknown HA message type %d",
702
message->get_type(message));
836
DBG1(DBG_CFG, "received unknown HA message type %d", type);
837
message->destroy(message);
705
message->destroy(message);
707
840
return JOB_REQUEUE_DIRECT;
711
* Implementation of ha_dispatcher_t.destroy.
713
static void destroy(private_ha_dispatcher_t *this)
843
METHOD(ha_dispatcher_t, destroy, void,
844
private_ha_dispatcher_t *this)
715
846
this->job->cancel(this->job);
722
853
ha_dispatcher_t *ha_dispatcher_create(ha_socket_t *socket,
723
ha_segments_t *segments)
854
ha_segments_t *segments, ha_cache_t *cache,
855
ha_kernel_t *kernel, ha_attribute_t *attr)
725
private_ha_dispatcher_t *this = malloc_thing(private_ha_dispatcher_t);
727
this->public.destroy = (void(*)(ha_dispatcher_t*))destroy;
729
this->socket = socket;
730
this->segments = segments;
857
private_ha_dispatcher_t *this;
865
.segments = segments,
731
870
this->job = callback_job_create((callback_job_cb_t)dispatch,
732
871
this, NULL, NULL);
733
872
charon->processor->queue_job(charon->processor, (job_t*)this->job);