ikev1: Negotiate SPI with the first/negotiated proposal protocol
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user