static message_t *clone_message(private_message_t *this)
{
message_t *message;
- host_t *src, *dst;
- src = this->packet->get_source(this->packet);
- dst = this->packet->get_destination(this->packet);
-
- message = message_create(this->major_version, this->minor_version);
+ message = message_create_from_packet(packet_clone_no_data(this->packet));
+ message->set_major_version(message, this->major_version);
+ message->set_minor_version(message, this->minor_version);
message->set_ike_sa_id(message, this->ike_sa_id);
message->set_message_id(message, this->message_id);
message->set_request(message, this->is_request);
- message->set_source(message, src->clone(src));
- message->set_destination(message, dst->clone(dst));
message->set_exchange_type(message, this->exchange_type);
memcpy(((private_message_t*)message)->reserved, this->reserved,
sizeof(this->reserved));
return SUCCESS;
}
+METHOD(message_t, get_metadata, metadata_t*,
+ private_message_t *this, const char *key)
+{
+ return this->packet->get_metadata(this->packet, key);
+}
+
+METHOD(message_t, set_metadata, void,
+ private_message_t *this, const char *key, metadata_t *data)
+{
+ this->packet->set_metadata(this->packet, key, data);
+}
+
METHOD(message_t, destroy, void,
private_message_t *this)
{
.get_packet = _get_packet,
.get_packet_data = _get_packet_data,
.get_fragments = _get_fragments,
+ .get_metadata = _get_metadata,
+ .set_metadata = _set_metadata,
.destroy = _destroy,
},
.exchange_type = EXCHANGE_TYPE_UNDEFINED,
*/
enumerator_t *(*get_fragments)(message_t *this);
+ /**
+ * Get metadata of this message.
+ *
+ * @param key key of the metadata to retrieve
+ * @return metadata object (internal data), NULL if not found
+ */
+ metadata_t *(*get_metadata)(message_t *message, const char *key);
+
+ /**
+ * Set/remove metadata of this message.
+ *
+ * @param key key of the metadata (cloned)
+ * @param data metadata object (adopted), NULL to remove and destroy
+ * existing object with the given key
+ */
+ void (*set_metadata)(message_t *message, const char *key, metadata_t *data);
+
/**
* Destroys a message and all including objects.
*/