diff options
author | Tobias Brunner <tobias@strongswan.org> | 2014-06-06 16:19:55 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2014-10-10 09:31:16 +0200 |
commit | 34dc37f3cb031d93a3f9e182052eec61a5a48236 (patch) | |
tree | 79c3ec6a458f58147a5e684c0ce750ad1573a3bd /src | |
parent | 7223b642a7f03fa41a10a8334ba7482efe01cdb9 (diff) | |
download | strongswan-34dc37f3cb031d93a3f9e182052eec61a5a48236.tar.bz2 strongswan-34dc37f3cb031d93a3f9e182052eec61a5a48236.tar.xz |
ikev2: Negotiate support for IKEv2 fragmentation
Diffstat (limited to 'src')
-rw-r--r-- | src/libcharon/sa/ike_sa.h | 2 | ||||
-rw-r--r-- | src/libcharon/sa/ikev2/tasks/ike_init.c | 23 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/libcharon/sa/ike_sa.h b/src/libcharon/sa/ike_sa.h index 7926301a7..f04fab009 100644 --- a/src/libcharon/sa/ike_sa.h +++ b/src/libcharon/sa/ike_sa.h @@ -128,7 +128,7 @@ enum ike_extension_t { EXT_NATT_DRAFT_02_03 = (1<<10), /** - * peer support proprietary IKE fragmentation + * peer supports proprietary IKEv1 or standardized IKEv2 fragmentation */ EXT_IKE_FRAGMENTATION = (1<<11), }; diff --git a/src/libcharon/sa/ikev2/tasks/ike_init.c b/src/libcharon/sa/ikev2/tasks/ike_init.c index e3c18ea0f..71c5f22fa 100644 --- a/src/libcharon/sa/ikev2/tasks/ike_init.c +++ b/src/libcharon/sa/ikev2/tasks/ike_init.c @@ -161,6 +161,19 @@ static void build_payloads(private_ike_init_t *this, message_t *message) message->add_payload(message, (payload_t*)ke_payload); message->add_payload(message, (payload_t*)nonce_payload); } + + /* negotiate fragmentation if we are not rekeying */ + if (!this->old_sa && + this->config->fragmentation(this->config) != FRAGMENTATION_NO) + { + if (this->initiator || + this->ike_sa->supports_extension(this->ike_sa, + EXT_IKE_FRAGMENTATION)) + { + message->add_notify(message, FALSE, FRAGMENTATION_SUPPORTED, + chunk_empty); + } + } } /** @@ -220,6 +233,16 @@ static void process_payloads(private_ike_init_t *this, message_t *message) this->other_nonce = nonce_payload->get_nonce(nonce_payload); break; } + case PLV2_NOTIFY: + { + notify_payload_t *notify = (notify_payload_t*)payload; + + if (notify->get_notify_type(notify) == FRAGMENTATION_SUPPORTED) + { + this->ike_sa->enable_extension(this->ike_sa, + EXT_IKE_FRAGMENTATION); + } + } default: break; } |