u_int32_t last_payload_length_position_offset;
/**
+ * Offset of the header length field in the buffer
+ */
+ u_int32_t header_length_position_offset;
+
+ /**
* Last SPI size
*/
u_int8_t last_spi_size;
static status_t write_to_chunk (private_generator_t *this,chunk_t *data)
{
size_t data_length = this->out_position - this->buffer;
+ u_int32_t header_length_field = data_length;
+
+ /* write length into header length field */
+ if (this->header_length_position_offset > 0)
+ {
+ u_int32_t int32_val = htonl(header_length_field);
+ this->write_bytes_to_buffer_at_offset(this,&int32_val,sizeof(u_int32_t),this->header_length_position_offset);
+ }
if (this->current_bit > 0)
data_length++;
case HEADER_LENGTH:
/* header length is generated like an U_INT_32 */
+ this->header_length_position_offset = (this->out_position - this->buffer);
status = this->generate_u_int_type(this,U_INT_32,rules[i].offset);
break;
case SPI_SIZE:
this->data_struct = NULL;
this->current_bit = 0;
this->last_payload_length_position_offset = 0;
+ this->header_length_position_offset = 0;
this->logger = global_logger_manager->create_logger(global_logger_manager,GENERATOR,NULL);
return &(this->public);
}
};
/**
+ * Implements ike_header_t's get_next_payload fuction.
+ * See #ike_header_t.get_next_payload for description.
+ */
+static u_int8_t get_next_payload(private_ike_header_t *this)
+{
+ return this->next_payload;
+}
+
+/**
+ * Implements ike_header_t's set_next_payload fuction.
+ * See #ike_header_t.set_next_payload for description.
+ */
+static void set_next_payload(private_ike_header_t *this, u_int8_t next_payload)
+{
+ this->next_payload = next_payload;
+}
+
+/**
* Implements ike_header_t's get_initiator_spi fuction.
* See #ike_header_t.get_initiator_spi for description.
*/
}
/**
+ * Implements ike_header_t's set_response_flag fuction.
+ * See #ike_header_t.set_response_flag for description.
+ */
+static void set_response_flag(private_ike_header_t *this, bool response)
+{
+ this->flags.response = response;
+}
+
+/**
* Implements ike_header_t's get_version_flag fuction.
* See #ike_header_t.get_version_flag for description.
*/
}
/**
+ * Implements ike_header_t's set_initiator_flag fuction.
+ * See #ike_header_t.set_initiator_flag for description.
+ */
+static void set_initiator_flag(private_ike_header_t *this, bool initiator)
+{
+ this->flags.initiator = initiator;
+}
+
+/**
* Implements ike_header_t's get_exchange_type function
* See #ike_header_t.get_exchange_type for description.
*/
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy;
this->public.destroy = destroy;
+
+ this->public.get_next_payload = (u_int8_t (*) (ike_header_t*))get_next_payload;
+ this->public.set_next_payload = (void (*) (ike_header_t*,u_int8_t))set_next_payload;
this->public.get_initiator_spi = (u_int64_t (*) (ike_header_t*))get_initiator_spi;
this->public.set_initiator_spi = (void (*) (ike_header_t*,u_int64_t))set_initiator_spi;
this->public.get_responder_spi = (u_int64_t (*) (ike_header_t*))get_responder_spi;
this->public.get_maj_version = (u_int8_t (*) (ike_header_t*))get_maj_version;
this->public.get_min_version = (u_int8_t (*) (ike_header_t*))get_min_version;
this->public.get_response_flag = (bool (*) (ike_header_t*))get_response_flag;
+ this->public.set_response_flag = (void (*) (ike_header_t*,bool))set_response_flag;
this->public.get_version_flag = (bool (*) (ike_header_t*))get_version_flag;
this->public.get_initiator_flag = (bool (*) (ike_header_t*))get_initiator_flag;
+ this->public.set_initiator_flag = (void (*) (ike_header_t*,bool))set_initiator_flag;
this->public.get_exchange_type = (u_int8_t (*) (ike_header_t*))get_exchange_type;
this->public.set_exchange_type = (void (*) (ike_header_t*,u_int8_t))set_exchange_type;
this->public.get_message_id = (u_int32_t (*) (ike_header_t*))get_message_id;
payload_t payload_interface;
/**
+ * @brief get the next payload type
+ *
+ * @param this ike_header_t object
+ * @return next payload type
+ */
+ u_int8_t (*get_next_payload) (ike_header_t *this);
+
+ /**
+ * @brief set the next payload
+ *
+ * @param this ike_header_t object
+ * @param next_payload next payload type
+ */
+ void (*set_next_payload) (ike_header_t *this, u_int8_t next_payload);
+
+ /**
* @brief get the initiator spi
*
* @param this ike_header_t object
bool (*get_response_flag) (ike_header_t *this);
/**
+ * @brief Set the response flag
+ *
+ * @param this ike_header_t object
+ * @param response response flag
+ *
+ */
+ void (*set_response_flag) (ike_header_t *this, bool response);
+ /**
* @brief get "higher version supported"-flag
*
* @param this ike_header_t object
bool (*get_initiator_flag) (ike_header_t *this);
/**
+ * @brief Set the initiator flag
+ *
+ * @param this ike_header_t object
+ * @param initiator initiator flag
+ *
+ */
+ void (*set_initiator_flag) (ike_header_t *this, bool initiator);
+
+ /**
* @brief get the exchange type
*
* @param this ike_header_t object
logger = global_logger_manager->create_logger(global_logger_manager,TESTER,"header payload");
header_data = ike_header_create();
- /*
- header_data->initiator_spi = 1;
- header_data->responder_spi = 2;
- header_data->next_payload = 3;
- header_data->maj_version = 4;
- header_data->min_version = 5;
- header_data->exchange_type = 6;
- header_data->flags.initiator = TRUE;
- header_data->flags.version = FALSE;
- header_data->flags.response = TRUE;
- header_data->message_id = 7;
- header_data->length = 8;
- */
+ header_data->set_initiator_spi(header_data,1);
+ header_data->set_responder_spi(header_data,2);
+ header_data->set_next_payload(header_data, 3);
+ header_data->set_exchange_type(header_data, 6);
+ header_data->set_initiator_flag(header_data, TRUE);
+ header_data->set_response_flag(header_data, TRUE);
+ header_data->set_message_id(header_data,7);
+
generator = generator_create();
tester->assert_true(tester,(generator != NULL), "generator create check");
0x00,0x00,0x00,0x01,
0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,
- 0x03,0x45,0x06,0x28,
+ 0x03,0x20,0x06,0x28,
0x00,0x00,0x00,0x07,
- 0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x1C,
};
-
+ logger->log_bytes(logger,RAW,"expected header",expected_generation,sizeof(expected_generation));
tester->assert_true(tester,(generated_data.len == sizeof(expected_generation)), "compare generated data length");
logger->log_chunk(logger,RAW,"generated header",&generated_data);
tester->assert_true(tester,(memcmp(expected_generation,generated_data.ptr,sizeof(expected_generation)) == 0), "compare generated data 1");
allocator_free_chunk(generated_data);
tester->assert_true(tester,(generator->destroy(generator) == SUCCESS), "generator destroy call check");
- /*
- header_data->initiator_spi = 0x22000054231234LL;
- header_data->responder_spi = 0x122398;
- header_data->next_payload = 0xF3;
- header_data->maj_version = 0x2;
- header_data->min_version = 0x0;
- header_data->exchange_type = 0x12;
- header_data->flags.initiator = TRUE;
- header_data->flags.version = TRUE;
- header_data->flags.response = TRUE;
- header_data->message_id = 0x33AFF3;
- header_data->length = 0xAA11F;
- */
+
+ header_data->set_initiator_spi(header_data,0x22000054231234LL);
+ header_data->set_responder_spi(header_data,0x122398);
+ header_data->set_next_payload(header_data, 0xF3);
+ header_data->set_exchange_type(header_data, 0x12);
+ header_data->set_initiator_flag(header_data, TRUE);
+ header_data->set_response_flag(header_data, TRUE);
+ header_data->set_message_id(header_data,0x33AFF3);
+
generator = generator_create();
tester->assert_true(tester,(generator != NULL), "generator create check");
0x54,0x23,0x12,0x34,
0x00,0x00,0x00,0x00,
0x00,0x12,0x23,0x98,
- 0xF3,0x20,0x12,0x38,
+ 0xF3,0x20,0x12,0x28,
0x00,0x33,0xAF,0xF3,
- 0x00,0x0A,0xA1,0x1F,
+ 0x00,0x00,0x00,0x1C,
};
+ logger->log_bytes(logger,RAW,"expected header",expected_generation2,sizeof(expected_generation2));
+
logger->log_chunk(logger,RAW,"generated header",&generated_data);
tester->assert_true(tester,(memcmp(expected_generation2,generated_data.ptr,sizeof(expected_generation2)) == 0), "compare generated data 2");
*/
test_t generator_test3 = {test_generator_with_transform_substructure,"Generator: transform substructure"};
+/**
+ * Test 4for generator_t
+ */
+test_t generator_test4 = {test_generator_with_proposal_substructure,"Generator: proposal substructure"};
+
/**
* Test 2 for generator_t
*/
-test_t parser_test_header = {test_parser_with_header_payload, "Parser: header payload"};
+//test_t parser_test_header = {test_parser_with_header_payload, "Parser: header payload"};
/**
* Parser test for ike security association
*/
-test_t parser_test_sa_payload = {test_parser_with_sa_payload, "Parser: sa payload"};
+//test_t parser_test_sa_payload = {test_parser_with_sa_payload, "Parser: sa payload"};
/**
&ike_sa_test,
&generator_test1,
&generator_test2,
- &parser_test_header,
- &parser_test_sa_payload,
+// &parser_test_header,
+ //&parser_test_sa_payload,
&generator_test3,
+ &generator_test4,
&ike_sa_manager_test,
&packet_test,
NULL
tester_t *tester = tester_create(test_output, FALSE);
- tester->perform_tests(tester,all_tests);
-// tester->perform_test(tester,&parser_test_sa_payload);
+// tester->perform_tests(tester,all_tests);
+ tester->perform_test(tester,&generator_test1);
+
tester->destroy(tester);