From 7da522ba73ed0a42445c1fb48efa18a85338b600 Mon Sep 17 00:00:00 2001 From: Jan Hutter Date: Tue, 29 Nov 2005 15:23:04 +0000 Subject: - implemented and tested ts_payload_t --- Source/charon/encoding/generator.c | 49 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'Source/charon/encoding/generator.c') diff --git a/Source/charon/encoding/generator.c b/Source/charon/encoding/generator.c index a8e02316f..83dfa062e 100644 --- a/Source/charon/encoding/generator.c +++ b/Source/charon/encoding/generator.c @@ -42,6 +42,7 @@ #include #include #include +#include typedef struct private_generator_t private_generator_t; @@ -285,6 +286,7 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t case U_INT_4: number_of_bits = 4; break; + case TS_TYPE: case U_INT_8: number_of_bits = 8; break; @@ -358,6 +360,7 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t }; break; } + case TS_TYPE: case U_INT_8: { /* 8 bit values are written as they are */ @@ -666,13 +669,14 @@ static void generate_payload (private_generator_t *this,payload_t *payload) i, mapping_find(encoding_type_m,rules[i].type)); switch (rules[i].type) { - /* all u int values, IKE_SPI and ATTRIBUTE_TYPE are generated in generate_u_int_type */ + /* all u int values, IKE_SPI,TS_TYPE and ATTRIBUTE_TYPE are generated in generate_u_int_type */ case U_INT_4: case U_INT_8: case U_INT_16: case U_INT_32: case U_INT_64: case IKE_SPI: + case TS_TYPE: case ATTRIBUTE_TYPE: { this->generate_u_int_type(this,rules[i].type,rules[i].offset); @@ -715,6 +719,12 @@ static void generate_payload (private_generator_t *this,payload_t *payload) /* last spi size is temporary stored */ this->last_spi_size = *((u_int8_t *)(this->data_struct + rules[i].offset)); break; + case ADDRESS: + { + /* the Address value is generated from chunk */ + this->generate_from_chunk(this,rules[i].offset); + break; + } case SPI: { /* the SPI value is generated from chunk */ @@ -822,7 +832,6 @@ static void generate_payload (private_generator_t *this,payload_t *payload) this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset); break; } - case TRANSFORMS: { /* before iterative generate the transforms, store the current length position */ @@ -925,6 +934,42 @@ static void generate_payload (private_generator_t *this,payload_t *payload) } break; } + case TRAFFIC_SELECTORS: + { + /* before iterative generate the traffic_selectors, store the current payload length position */ + u_int32_t payload_length_position_offset = this->last_payload_length_position_offset; + /* Length of SA_PAYLOAD is calculated */ + u_int16_t length_of_ts_payload = TS_PAYLOAD_HEADER_LENGTH; + u_int16_t int16_val; + /* traffic selectors are stored in a linked list and so accessed */ + linked_list_t *traffic_selectors = *((linked_list_t **)(this->data_struct + rules[i].offset)); + + iterator_t *iterator; + /* create forward iterator */ + iterator = traffic_selectors->create_iterator(traffic_selectors,TRUE); + /* every proposal is processed (iterative call )*/ + while (iterator->has_next(iterator)) + { + payload_t *current_traffic_selector_substructure; + u_int32_t before_generate_position_offset; + u_int32_t after_generate_position_offset; + + iterator->current(iterator,(void **)¤t_traffic_selector_substructure); + + before_generate_position_offset = this->get_current_buffer_offset(this); + this->public.generate_payload(&(this->public),current_traffic_selector_substructure); + after_generate_position_offset = this->get_current_buffer_offset(this); + + /* increase size of transform */ + length_of_ts_payload += (after_generate_position_offset - before_generate_position_offset); + } + iterator->destroy(iterator); + + int16_val = htons(length_of_ts_payload); + this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset); + break; + } + case ENCRYPTED_DATA: { this->generate_from_chunk(this, rules[i].offset); -- cgit v1.2.3