ikev1: Negotiate SPI with the first/negotiated proposal protocol

This commit is contained in:
Martin Willi
2013-10-11 10:15:21 +02:00
parent cdab8630d9
commit 908fe1632d
+18 -3
View File
@@ -165,6 +165,11 @@ struct private_quick_mode_t {
*/ */
ipsec_mode_t mode; ipsec_mode_t mode;
/*
* SA protocol (ESP|AH) negotiated
*/
protocol_id_t proto;
/** /**
* Use UDP encapsulation * Use UDP encapsulation
*/ */
@@ -722,7 +727,7 @@ static status_t send_notify(private_quick_mode_t *this, notify_type_t type)
notify_payload_t *notify; notify_payload_t *notify;
notify = notify_payload_create_from_protocol_and_type(NOTIFY_V1, notify = notify_payload_create_from_protocol_and_type(NOTIFY_V1,
PROTO_ESP, type); this->proto, type);
notify->set_spi(notify, this->spi_i); notify->set_spi(notify, this->spi_i);
this->ike_sa->queue_task(this->ike_sa, this->ike_sa->queue_task(this->ike_sa,
@@ -774,6 +779,7 @@ METHOD(task_t, build_i, status_t,
{ {
sa_payload_t *sa_payload; sa_payload_t *sa_payload;
linked_list_t *list, *tsi, *tsr; linked_list_t *list, *tsi, *tsr;
proposal_t *proposal;
diffie_hellman_group_t group; diffie_hellman_group_t group;
encap_t encap; encap_t encap;
@@ -800,12 +806,19 @@ METHOD(task_t, build_i, status_t,
} }
} }
this->spi_i = this->child_sa->alloc_spi(this->child_sa, PROTO_ESP); list = this->config->get_proposals(this->config, MODP_NONE);
if (list->get_first(list, (void**)&proposal) == SUCCESS)
{
this->proto = proposal->get_protocol(proposal);
}
list->destroy_offset(list, offsetof(proposal_t, destroy));
this->spi_i = this->child_sa->alloc_spi(this->child_sa, this->proto);
if (!this->spi_i) if (!this->spi_i)
{ {
DBG1(DBG_IKE, "allocating SPI from kernel failed"); DBG1(DBG_IKE, "allocating SPI from kernel failed");
return FAILED; return FAILED;
} }
group = this->config->get_dh_group(this->config); group = this->config->get_dh_group(this->config);
if (group != MODP_NONE) if (group != MODP_NONE)
{ {
@@ -1139,7 +1152,8 @@ METHOD(task_t, build_r, status_t,
sa_payload_t *sa_payload; sa_payload_t *sa_payload;
encap_t encap; encap_t encap;
this->spi_r = this->child_sa->alloc_spi(this->child_sa, PROTO_ESP); this->proto = this->proposal->get_protocol(this->proposal);
this->spi_r = this->child_sa->alloc_spi(this->child_sa, this->proto);
if (!this->spi_r) if (!this->spi_r)
{ {
DBG1(DBG_IKE, "allocating SPI from kernel failed"); DBG1(DBG_IKE, "allocating SPI from kernel failed");
@@ -1347,6 +1361,7 @@ quick_mode_t *quick_mode_create(ike_sa_t *ike_sa, child_cfg_t *config,
.state = QM_INIT, .state = QM_INIT,
.tsi = tsi ? tsi->clone(tsi) : NULL, .tsi = tsi ? tsi->clone(tsi) : NULL,
.tsr = tsr ? tsr->clone(tsr) : NULL, .tsr = tsr ? tsr->clone(tsr) : NULL,
.proto = PROTO_ESP,
); );
if (config) if (config)