added extensions management to IKE_SA
fixed NATD payload (port) when using route lookup
This commit is contained in:
@@ -144,6 +144,11 @@ struct private_ike_sa_t {
|
|||||||
*/
|
*/
|
||||||
ca_info_t *other_ca;
|
ca_info_t *other_ca;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set of extensions the peer supports
|
||||||
|
*/
|
||||||
|
ike_extension_t extensions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Linked List containing the child sa's of the current IKE_SA.
|
* Linked List containing the child sa's of the current IKE_SA.
|
||||||
*/
|
*/
|
||||||
@@ -1237,6 +1242,22 @@ static host_t* get_virtual_ip(private_ike_sa_t *this, bool local)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of ike_sa_t.enable_extension.
|
||||||
|
*/
|
||||||
|
static void enable_extension(private_ike_sa_t *this, ike_extension_t extension)
|
||||||
|
{
|
||||||
|
this->extensions |= extension;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of ike_sa_t.has_extension.
|
||||||
|
*/
|
||||||
|
static bool supports_extension(private_ike_sa_t *this, ike_extension_t extension)
|
||||||
|
{
|
||||||
|
return this->extensions & extension;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of ike_sa_t.derive_keys.
|
* Implementation of ike_sa_t.derive_keys.
|
||||||
*/
|
*/
|
||||||
@@ -1851,6 +1872,8 @@ ike_sa_t * ike_sa_create(ike_sa_id_t *ike_sa_id)
|
|||||||
this->public.set_other_id = (void (*)(ike_sa_t*,identification_t*)) set_other_id;
|
this->public.set_other_id = (void (*)(ike_sa_t*,identification_t*)) set_other_id;
|
||||||
this->public.get_other_ca = (ca_info_t* (*)(ike_sa_t*)) get_other_ca;
|
this->public.get_other_ca = (ca_info_t* (*)(ike_sa_t*)) get_other_ca;
|
||||||
this->public.set_other_ca = (void (*)(ike_sa_t*,ca_info_t*)) set_other_ca;
|
this->public.set_other_ca = (void (*)(ike_sa_t*,ca_info_t*)) set_other_ca;
|
||||||
|
this->public.enable_extension = (void(*)(ike_sa_t*, ike_extension_t extension))enable_extension;
|
||||||
|
this->public.supports_extension = (bool(*)(ike_sa_t*, ike_extension_t extension))supports_extension;
|
||||||
this->public.retransmit = (status_t (*)(ike_sa_t *, u_int32_t)) retransmit;
|
this->public.retransmit = (status_t (*)(ike_sa_t *, u_int32_t)) retransmit;
|
||||||
this->public.delete = (status_t (*)(ike_sa_t*))delete_;
|
this->public.delete = (status_t (*)(ike_sa_t*))delete_;
|
||||||
this->public.destroy = (void (*)(ike_sa_t*))destroy;
|
this->public.destroy = (void (*)(ike_sa_t*))destroy;
|
||||||
@@ -1887,6 +1910,7 @@ ike_sa_t * ike_sa_create(ike_sa_id_t *ike_sa_id)
|
|||||||
this->my_id = identification_create_from_encoding(ID_ANY, chunk_empty);
|
this->my_id = identification_create_from_encoding(ID_ANY, chunk_empty);
|
||||||
this->other_id = identification_create_from_encoding(ID_ANY, chunk_empty);
|
this->other_id = identification_create_from_encoding(ID_ANY, chunk_empty);
|
||||||
this->other_ca = NULL;
|
this->other_ca = NULL;
|
||||||
|
this->extensions = 0;
|
||||||
this->crypter_in = NULL;
|
this->crypter_in = NULL;
|
||||||
this->crypter_out = NULL;
|
this->crypter_out = NULL;
|
||||||
this->signer_in = NULL;
|
this->signer_in = NULL;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#ifndef IKE_SA_H_
|
#ifndef IKE_SA_H_
|
||||||
#define IKE_SA_H_
|
#define IKE_SA_H_
|
||||||
|
|
||||||
|
typedef enum ike_extension_t ike_extension_t;
|
||||||
typedef enum ike_sa_state_t ike_sa_state_t;
|
typedef enum ike_sa_state_t ike_sa_state_t;
|
||||||
typedef struct ike_sa_t ike_sa_t;
|
typedef struct ike_sa_t ike_sa_t;
|
||||||
|
|
||||||
@@ -70,6 +71,21 @@ typedef struct ike_sa_t ike_sa_t;
|
|||||||
*/
|
*/
|
||||||
#define RETRY_JITTER 20
|
#define RETRY_JITTER 20
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extensions (or optional features) the peer supports
|
||||||
|
*/
|
||||||
|
enum ike_extension_t {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* peer supports NAT traversal as specified in RFC4306
|
||||||
|
*/
|
||||||
|
EXT_NATT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* peer supports MOBIKE (RFC4555)
|
||||||
|
*/
|
||||||
|
EXT_MOBIKE,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief State of an IKE_SA.
|
* @brief State of an IKE_SA.
|
||||||
@@ -319,6 +335,26 @@ struct ike_sa_t {
|
|||||||
*/
|
*/
|
||||||
void (*set_peer_cfg) (ike_sa_t *this, peer_cfg_t *config);
|
void (*set_peer_cfg) (ike_sa_t *this, peer_cfg_t *config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the peer supports an extension.
|
||||||
|
*
|
||||||
|
* @param this calling object
|
||||||
|
* @param extension extension to check for support
|
||||||
|
* @return TRUE if peer supports it, FALSE otherwise
|
||||||
|
*/
|
||||||
|
bool (*supports_extension)(ike_sa_t *this, ike_extension_t extension);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable an extension the peer supports.
|
||||||
|
*
|
||||||
|
* If support for an IKE extension is detected, this method is called
|
||||||
|
* to enable that extension and behave accordingly.
|
||||||
|
*
|
||||||
|
* @param this calling object
|
||||||
|
* @param extension extension to enable
|
||||||
|
*/
|
||||||
|
void (*enable_extension)(ike_sa_t *this, ike_extension_t extension);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initiate a new connection.
|
* @brief Initiate a new connection.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -203,6 +203,8 @@ static void process_payloads(private_ike_natd_t *this, message_t *message)
|
|||||||
|
|
||||||
if (this->src_seen && this->dst_seen)
|
if (this->src_seen && this->dst_seen)
|
||||||
{
|
{
|
||||||
|
this->ike_sa->enable_extension(this->ike_sa, EXT_NATT);
|
||||||
|
|
||||||
if (!this->dst_matched)
|
if (!this->dst_matched)
|
||||||
{
|
{
|
||||||
this->ike_sa->enable_natt(this->ike_sa, TRUE);
|
this->ike_sa->enable_natt(this->ike_sa, TRUE);
|
||||||
@@ -266,6 +268,7 @@ static status_t build_i(private_ike_natd_t *this, message_t *message)
|
|||||||
this->ike_sa->get_other_host(this->ike_sa));
|
this->ike_sa->get_other_host(this->ike_sa));
|
||||||
if (host)
|
if (host)
|
||||||
{ /* 2. */
|
{ /* 2. */
|
||||||
|
host->set_port(host, IKEV2_UDP_PORT);
|
||||||
notify = build_natd_payload(this, NAT_DETECTION_SOURCE_IP, host);
|
notify = build_natd_payload(this, NAT_DETECTION_SOURCE_IP, host);
|
||||||
message->add_payload(message, (payload_t*)notify);
|
message->add_payload(message, (payload_t*)notify);
|
||||||
host->destroy(host);
|
host->destroy(host);
|
||||||
|
|||||||
Reference in New Issue
Block a user