Store IKEv2 IKE_SAs by local SPI in the IKE_SA manager hash table.
For IKEv1 the previous behavior of always using the initiator's SPI as key is maintained.
This commit is contained in:
@@ -188,8 +188,19 @@ static bool entry_match_by_sa(entry_t *entry, ike_sa_t *ike_sa)
|
|||||||
*/
|
*/
|
||||||
static u_int ike_sa_id_hash(ike_sa_id_t *ike_sa_id)
|
static u_int ike_sa_id_hash(ike_sa_id_t *ike_sa_id)
|
||||||
{
|
{
|
||||||
/* we always use initiator spi as key */
|
/* IKEv2 does not mandate random SPIs (RFC 5996, 2.6), they just have to be
|
||||||
return ike_sa_id->get_initiator_spi(ike_sa_id);
|
* locally unique, so we use our randomly allocated SPI whether we are
|
||||||
|
* initiator or responder to ensure a good distribution. The latter is not
|
||||||
|
* possible for IKEv1 as we don't know whether we are original initiator or
|
||||||
|
* not (based on the IKE header). But as RFC 2408, section 2.5.3 proposes
|
||||||
|
* SPIs (Cookies) to be allocated near random (we allocate them randomly
|
||||||
|
* anyway) it seems safe to always use the initiator SPI. */
|
||||||
|
if (ike_sa_id->get_ike_version(ike_sa_id) == IKEV1_MAJOR_VERSION ||
|
||||||
|
ike_sa_id->is_initiator(ike_sa_id))
|
||||||
|
{
|
||||||
|
return ike_sa_id->get_initiator_spi(ike_sa_id);
|
||||||
|
}
|
||||||
|
return ike_sa_id->get_responder_spi(ike_sa_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct half_open_t half_open_t;
|
typedef struct half_open_t half_open_t;
|
||||||
|
|||||||
Reference in New Issue
Block a user