aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libcharon/encoding/message.c21
-rw-r--r--src/libcharon/encoding/message.h7
-rw-r--r--src/libcharon/sa/ike_sa.c5
3 files changed, 16 insertions, 17 deletions
diff --git a/src/libcharon/encoding/message.c b/src/libcharon/encoding/message.c
index c9959ab92..860ef627a 100644
--- a/src/libcharon/encoding/message.c
+++ b/src/libcharon/encoding/message.c
@@ -688,18 +688,10 @@ METHOD(message_t, set_reserved_header_bit, void,
}
}
-/**
- * Is this message in an encoded form?
- */
-static bool is_encoded(private_message_t *this)
+METHOD(message_t, is_encoded, bool,
+ private_message_t *this)
{
- chunk_t data = this->packet->get_data(this->packet);
-
- if (data.ptr == NULL)
- {
- return FALSE;
- }
- return TRUE;
+ return this->packet->get_data(this->packet).ptr != NULL;
}
METHOD(message_t, add_payload, void,
@@ -1068,12 +1060,6 @@ METHOD(message_t, generate, status_t,
bool *reserved;
int i;
- if (is_encoded(this))
- { /* already generated, return a new packet clone */
- *packet = this->packet->clone(this->packet);
- return SUCCESS;
- }
-
if (this->exchange_type == EXCHANGE_TYPE_UNDEFINED)
{
DBG1(DBG_ENC, "exchange type is not defined");
@@ -1516,6 +1502,7 @@ message_t *message_create_from_packet(packet_t *packet)
.add_notify = _add_notify,
.disable_sort = _disable_sort,
.generate = _generate,
+ .is_encoded = _is_encoded,
.set_source = _set_source,
.get_source = _get_source,
.set_destination = _set_destination,
diff --git a/src/libcharon/encoding/message.h b/src/libcharon/encoding/message.h
index a04048ed0..51197308c 100644
--- a/src/libcharon/encoding/message.h
+++ b/src/libcharon/encoding/message.h
@@ -258,6 +258,13 @@ struct message_t {
status_t (*generate) (message_t *this, aead_t *aead, packet_t **packet);
/**
+ * Check if the message has already been encoded using generate().
+ *
+ * @return TRUE if message has been encoded
+ */
+ bool (*is_encoded)(message_t *this);
+
+ /**
* Gets the source host informations.
*
* @warning Returned host_t object is not getting cloned,
diff --git a/src/libcharon/sa/ike_sa.c b/src/libcharon/sa/ike_sa.c
index b012c3d39..d6d880d26 100644
--- a/src/libcharon/sa/ike_sa.c
+++ b/src/libcharon/sa/ike_sa.c
@@ -891,6 +891,11 @@ METHOD(ike_sa_t, update_hosts, void,
METHOD(ike_sa_t, generate_message, status_t,
private_ike_sa_t *this, message_t *message, packet_t **packet)
{
+ if (message->is_encoded(message))
+ { /* already done */
+ *packet = message->get_packet(message);
+ return SUCCESS;
+ }
this->stats[STAT_OUTBOUND] = time_monotonic(NULL);
message->set_ike_sa_id(message, this->ike_sa_id);
charon->bus->message(charon->bus, message, FALSE);