aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/charon/message.c44
-rw-r--r--Source/charon/message.h32
2 files changed, 62 insertions, 14 deletions
diff --git a/Source/charon/message.c b/Source/charon/message.c
index 1dc5a15ac..96d553ece 100644
--- a/Source/charon/message.c
+++ b/Source/charon/message.c
@@ -1,7 +1,7 @@
/**
* @file message.c
*
- * @brief Class message_t. Object of this type represents an IKEv2-Message
+ * @brief Class message_t. Object of this type represents an IKEv2-Message.
*
*/
@@ -25,6 +25,7 @@
#include "allocator.h"
#include "types.h"
#include "message.h"
+#include "linked_list.h"
/**
* Private data of an message_t object
@@ -40,18 +41,31 @@ struct private_message_s {
/* Private values */
-
+
+ /**
+ * Assigned UDP packet.
+ *
+ * Stores incoming packet or last generated one.
+ */
+ packet_t *packet;
+
+ /**
+ * Linked List where payload data are stored in
+ */
+ linked_list_t *payloads;
};
/**
- * @brief implements function destroy of message_t
+ * Implements message_t's destroy function.
+ * See #message_s.destroy.
*/
static status_t destroy (private_message_t *this)
{
- if (this == NULL)
+ if (this->packet != NULL)
{
- return FAILED;
+ this->packet->destroy(this->packet);
}
+ this->payloads->destroy(this->payloads);
allocator_free(this);
return SUCCESS;
}
@@ -59,7 +73,7 @@ static status_t destroy (private_message_t *this)
/*
* Described in Header-File
*/
-message_t * message_create()
+message_t *message_create_from_packet(packet_t *packet)
{
private_message_t *this = allocator_alloc_thing(private_message_t);
if (this == NULL)
@@ -67,9 +81,25 @@ message_t * message_create()
return NULL;
}
- /* Public functions */
+ /* public functions */
this->public.destroy = (status_t(*)(message_t*))destroy;
+ /* private values */
+ this->packet = packet;
+ this->payloads = linked_list_create();
+ if (this->payloads == NULL)
+ {
+ allocator_free(this);
+ return NULL;
+ }
return (&this->public);
}
+
+/*
+ * Described in Header-File
+ */
+message_t *message_create()
+{
+ return message_create_from_packet(NULL);
+}
diff --git a/Source/charon/message.h b/Source/charon/message.h
index 1b014f7d9..249137e2b 100644
--- a/Source/charon/message.h
+++ b/Source/charon/message.h
@@ -1,7 +1,7 @@
/**
* @file message.h
*
- * @brief Class message_t. Object of this type represents an IKEv2-Message
+ * @brief Class message_t. Object of this type represents an IKEv2-Message.
*
*/
@@ -24,6 +24,7 @@
#define MESSAGE_H_
#include "types.h"
+#include "packet.h"
/**
* @brief This class is used to represent an IKEv2-Message.
@@ -35,20 +36,37 @@ typedef struct message_s message_t;
struct message_s {
/**
- * @brief Destroys a message object
+ * @brief Destroys a message and all including objects
*
- * @param this message_t object
- * @return SUCCESSFUL if succeeded, FAILED otherwise
+ * @param this message_t object
+ * @return
+ * - SUCCESSFUL if succeeded
*/
status_t (*destroy) (message_t *this);
};
/**
- * Creates an message_t object
+ * Creates an message_t object from a incoming UDP Packet.
*
- * @return created message_t object
+ * @warning the given packet_t object is not copied and gets
+ * destroyed in message_t's destroy call.
+ *
+ * @param packet packet_t object which is assigned to message
+ *
+ * @return
+ * - created message_t object
+ * - NULL if out of ressources
*/
-message_t * message_create();
+message_t * message_create_from_packet(packet_t *packet);
+
+/**
+ * Creates an empty message_t object.
+ *
+ * @return
+ * - created message_t object
+ * - NULL if out of ressources
+ */
+message_t * message_create();
#endif /*MESSAGE_H_*/