]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
message: Add getter/setter for metadata handling
authorTobias Brunner <tobias@strongswan.org>
Thu, 2 Dec 2021 15:12:31 +0000 (16:12 +0100)
committerTobias Brunner <tobias@strongswan.org>
Fri, 14 Jan 2022 09:13:21 +0000 (10:13 +0100)
src/libcharon/encoding/message.c
src/libcharon/encoding/message.h

index 0fc14a9e2aef71c85ac1b65828994180b14af3d5..7477dc4d55c126ff82dfae3ef7e9c000cfb881d0 100644 (file)
@@ -1889,17 +1889,13 @@ METHOD(message_t, generate, status_t,
 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));
@@ -2946,6 +2942,18 @@ METHOD(message_t, add_fragment_v2, status_t,
        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)
 {
@@ -3013,6 +3021,8 @@ message_t *message_create_from_packet(packet_t *packet)
                        .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,
index 10ffbed56d5e265e7d82d032349eddfbcd5152a0..435632a414a7b6ae9bf58a25ab5cb0976d10fdea 100644 (file)
@@ -404,6 +404,23 @@ struct message_t {
         */
        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.
         */