status_t (*build_nonce_payload) (private_ike_sa_t *this, nonce_payload_t **payload);
status_t (*build_ke_payload) (private_ike_sa_t *this, ke_payload_t **payload);
+ status_t (*build_message) (private_ike_sa_t *this, exchange_type_t type, bool request);
+
status_t (*transto_ike_sa_init_responded) (private_ike_sa_t *this, message_t *message);
status_t (*transto_ike_auth_requested) (private_ike_sa_t *this, message_t *message);
diffie_hellman_t *diffie_hellman;
+ u_int32_t message_id_in;
+ u_int32_t message_id_out;
+
/**
* a logger for this IKE_SA
*/
}
+static status_t build_message(private_ike_sa_t *this, exchange_type_t type, bool request)
+{
+ status_t status;
+ message_t *message;
+ host_t *source, *destination;
+
+ message = message_create();
+ if (message == NULL)
+ {
+ return OUT_OF_RES;
+ }
+
+ status = this->me.host->clone(this->me.host, &source);
+ status |= this->other.host->clone(this->other.host, &destination);
+ if (status != SUCCESS)
+ {
+ message->destroy(message);
+ return status;
+ }
+ message->set_source(message, source);
+ message->set_destination(message, destination);
+
+ message->set_exchange_type(message, type);
+ message->set_request(message, request);
+
+ message->set_ike_sa_id(message, this->ike_sa_id);
+
+ return SUCCESS;
+}
+
static status_t transto_ike_sa_init_responded(private_ike_sa_t *this, message_t *message)
{
status_t status;
linked_list_iterator_t *payloads;
+ message_t *respond;
status = message->parse_body(message);
if (status != SUCCESS)
return status;
}
+
+
+
+
status = message->get_payload_iterator(message, &payloads);
if (status != SUCCESS)
{
+ respond->destroy(respond);
return status;
}
while (payloads->has_next(payloads))
payloads->destroy(payloads);
return status;
}
- //global_configuration_manager->select_prop
+ //global_configuration_manager->select_proposals_for_host
break;
}
message->set_exchange_type(message, IKE_SA_INIT);
message->set_original_initiator(message, this->original_initiator);
- message->set_message_id(message, 0);
+ message->set_message_id(message, this->message_id_out++);
message->set_ike_sa_id(message, this->ike_sa_id);
message->set_request(message, TRUE);
this->build_ke_payload = build_ke_payload;
this->build_nonce_payload = build_nonce_payload;
-
+ this->build_message = build_message;
this->transto_ike_sa_init_responded = transto_ike_sa_init_responded;
this->transto_ike_auth_requested = transto_ike_auth_requested;
-
+
/* initialize private fields */
if (ike_sa_id->clone(ike_sa_id,&(this->ike_sa_id)) != SUCCESS)
this->me.host = NULL;
this->other.host = NULL;
this->diffie_hellman = NULL;
+ this->message_id_out = 0;
+ this->message_id_in = 0;
/* at creation time, IKE_SA isn't in a specific state */
* Assigned exchange type
*/
exchange_type_t exchange_type;
-
- /**
- * TRUE if message is from original initiator, FALSE otherwise.
- */
- bool original_initiator;
+
/**
* TRUE if message is request.
return this->exchange_type;
}
-/**
- * Implements message_t's set_original_initiator function.
- * See #message_s.set_original_initiator.
- */
-static status_t set_original_initiator (private_message_t *this,bool original_initiator)
-{
- this->original_initiator = original_initiator;
- return SUCCESS;
-}
-
-/**
- * Implements message_t's get_original_initiator function.
- * See #message_s.get_original_initiator.
- */
-static exchange_type_t get_original_initiator (private_message_t *this)
-{
- return this->original_initiator;
-}
/**
* Implements message_t's set_request function.
this->ike_sa_id->get_values(this->ike_sa_id, &initiator_spi, &responder_spi, &is_initiator);
ike_header->set_exchange_type(ike_header, this->exchange_type);
- ike_header->set_initiator_flag(ike_header, this->original_initiator);
+ ike_header->set_initiator_flag(ike_header, is_initiator);
ike_header->set_message_id(ike_header, this->message_id);
ike_header->set_response_flag(ike_header, !this->is_request);
ike_header->set_initiator_flag(ike_header, is_initiator);
{
this->ike_sa_id->destroy(this->ike_sa_id);
}
- this->original_initiator = (!ike_header->get_initiator_flag(ike_header));
- this->ike_sa_id = ike_sa_id_create(ike_header->get_initiator_spi(ike_header),ike_header->get_responder_spi(ike_header),this->original_initiator);
+ this->ike_sa_id = ike_sa_id_create(ike_header->get_initiator_spi(ike_header),
+ ike_header->get_responder_spi(ike_header),
+ !ike_header->get_initiator_flag(ike_header));
if (this->ike_sa_id == NULL)
{
this->logger->log(this->logger, ERROR, "Could not creaee ike_sa_id object");
this->public.get_ike_sa_id = (status_t(*)(message_t*, ike_sa_id_t **))get_ike_sa_id;
this->public.set_exchange_type = (status_t(*)(message_t*, exchange_type_t))set_exchange_type;
this->public.get_exchange_type = (exchange_type_t(*)(message_t*))get_exchange_type;
- this->public.set_original_initiator = (status_t(*)(message_t*, bool))set_original_initiator;
- this->public.get_original_initiator = (bool(*)(message_t*))get_original_initiator;
this->public.set_request = (status_t(*)(message_t*, bool))set_request;
this->public.get_request = (bool(*)(message_t*))get_request;
this->public.add_payload = (status_t(*)(message_t*,payload_t*))add_payload;
/* public values */
this->exchange_type = EXCHANGE_TYPE_UNDEFINED;
- this->original_initiator = TRUE;
this->is_request = TRUE;
this->ike_sa_id = NULL;
this->first_payload = NO_PAYLOAD;