- parser succesfully parses sa payload
[strongswan.git] / Source / charon / payloads / ike_header.c
index ab4b984..84b0595 100644 (file)
@@ -1,9 +1,11 @@
 /**
  * @file ike_header.c
  * 
- * @brief Definition of the encoding rules used when parsing or generating
- * an IKEv2-Header
- *  
+ * @brief Declaration of the class ike_header_t. 
+ * 
+ * An object of this type represents an ike header and is used to 
+ * generate and parse ike headers.
+ * 
  */
 
 /*
 /* offsetof macro */
 #include <stddef.h>
 
- #include "encodings.h"
- #include "ike_header.h"
+#include "ike_header.h"
+
+#include "encodings.h"
+#include "../utils/allocator.h"
 
 /**
  * Encoding rules to parse or generate a IKEv2-Header
  * 
- * The defined offsets are the positions in a struct of type 
+ * The defined offsets are the positions in a object of type 
  * ike_header_t.
  * 
  */
@@ -61,7 +65,93 @@ encoding_rule_t ike_header_encodings[] = {
        /* 4 Byte message id, stored in the field message_id */
        { U_INT_32,             offsetof(ike_header_t, message_id)              },
        /* 4 Byte length fied, stored in the field length */
-       { LENGTH,               offsetof(ike_header_t, length)                  }
+       { HEADER_LENGTH,        offsetof(ike_header_t, length)                  }
 };
 
 
+/**
+ * Implements payload_t's and ike_header_t's destroy function.
+ * See #payload_s.destroy or ike_header_s.destroy for description.
+ */
+static status_t destroy(ike_header_t *this)
+{
+       allocator_free(this);
+       
+       return SUCCESS;
+}
+
+/**
+ * Implements payload_t's get_encoding_rules function.
+ * See #payload_s.get_encoding_rules for description.
+ */
+static status_t get_encoding_rules(payload_t *this, encoding_rule_t **rules, size_t *rule_count)
+{
+       *rules = ike_header_encodings;
+       *rule_count = sizeof(ike_header_encodings) / sizeof(encoding_rule_t);
+       
+       return SUCCESS;
+}
+
+/**
+ * Implements payload_t's get_type function.
+ * See #payload_s.get_type for description.
+ */
+static payload_type_t get_type(payload_t *this)
+{
+       return HEADER;
+}
+
+/**
+ * Implements payload_t's get_next_type function.
+ * See #payload_s.get_next_type for description.
+ */
+static payload_type_t get_next_type(payload_t *this)
+{
+       return (((ike_header_t*)this)->next_payload);
+}
+
+/**
+ * Implements payload_t's get_length function.
+ * See #payload_s.get_length for description.
+ */
+static size_t get_length(payload_t *this)
+{
+       return IKE_HEADER_LENGTH;
+}
+
+/*
+ * Described in header
+ */
+ike_header_t *ike_header_create()
+{
+       ike_header_t *this = allocator_alloc_thing(ike_header_t);
+       if (this == NULL)
+       {
+               return NULL;    
+       }       
+       
+       this->payload_interface.get_encoding_rules = get_encoding_rules;
+       this->payload_interface.get_length = get_length;
+       this->payload_interface.get_next_type = get_next_type;
+       this->payload_interface.get_type = get_type;
+       this->payload_interface.destroy = (status_t (*) (payload_t *))destroy;
+       this->destroy = destroy;
+       
+       /* set default values of the fields */
+       this->initiator_spi = 0;
+       this->responder_spi = 0;
+       this->next_payload = 0;
+       this->maj_version = IKE_MAJOR_VERSION;
+       this->min_version = IKE_MINOR_VERSION;
+       this->exchange_type = NOT_SET;
+       this->flags.initiator = TRUE;
+       this->flags.version = HIGHER_VERSION_SUPPORTED_FLAG;
+       this->flags.response = FALSE;
+       this->message_id = 0;
+       this->length = IKE_HEADER_LENGTH;
+       
+       
+       return this;
+}
+
+