diff options
author | Jan Hutter <jhutter@hsr.ch> | 2005-11-14 08:12:59 +0000 |
---|---|---|
committer | Jan Hutter <jhutter@hsr.ch> | 2005-11-14 08:12:59 +0000 |
commit | 1e8bb886d161d0508b089892c318bc7bca63ff8c (patch) | |
tree | c4cffdb22c09df220bc17147a7f6542cd20e4a99 | |
parent | cc0fbc3c243808d89ded59c7feabae67af837541 (diff) | |
download | strongswan-1e8bb886d161d0508b089892c318bc7bca63ff8c.tar.bz2 strongswan-1e8bb886d161d0508b089892c318bc7bca63ff8c.tar.xz |
- removed generator context object and implemented payload-interface in generator
-rw-r--r-- | Source/charon/generator.c | 538 | ||||
-rw-r--r-- | Source/charon/generator.h | 49 | ||||
-rw-r--r-- | Source/charon/payloads/ike_header.c | 13 | ||||
-rw-r--r-- | Source/charon/payloads/ike_header.h | 9 | ||||
-rw-r--r-- | Source/charon/testcases/generator_test.c | 93 | ||||
-rw-r--r-- | Source/charon/testcases/generator_test.h | 8 | ||||
-rw-r--r-- | Source/charon/testcases/testcases.c | 12 |
7 files changed, 290 insertions, 432 deletions
diff --git a/Source/charon/generator.c b/Source/charon/generator.c index 1b1b31efa..997c556b9 100644 --- a/Source/charon/generator.c +++ b/Source/charon/generator.c @@ -30,54 +30,73 @@ #include "types.h" #include "utils/allocator.h" +#include "utils/logger_manager.h" #include "payloads/payload.h" -typedef struct private_generator_context_s private_generator_context_t; +extern logger_manager_t *global_logger_manager; -struct private_generator_context_s{ - /** - * Public part of the context - */ - generator_context_t public; +/** + * Private part of a generator_t object + */ +typedef struct private_generator_s private_generator_t; +struct private_generator_s { /** - * Buffer used to generate the data into. + * Public part of a generator_t object */ - u_int8_t *buffer; + generator_t public; + + /* private functions and fields */ - /** - * Current write position in buffer (one byte aligned). - */ - u_int8_t *out_position; /** - * Position of last byte in buffer. + * Generates a U_INT-Field type + * + * @param this private_generator_t object + * @param int_type type of U_INT field (U_INT_4, U_INT_8, etc.) + * @param offset offset of value in data struct + * @param generator_contexts generator_contexts_t object where the context is written or read from + * @return - SUCCESS if succeeded + * - OUT_OF_RES if out of ressources */ - u_int8_t *roof_position; + status_t (*generate_u_int_type) (private_generator_t *this,encoding_type_t int_type,u_int32_t offset); /** - * Current bit writing to in current byte (between 0 and 7). + * Generates a RESERVED BIT field or a RESERVED BYTE field + * + * @param this private_generator_t object + * @param generator_contexts generator_contexts_t object where the context is written or read from + * @param bits number of bits to generate + * @return - SUCCESS if succeeded + * - OUT_OF_RES if out of ressources + * - FAILED if bit count not supported */ - size_t current_bit; - + status_t (*generate_reserved_field) (private_generator_t *this,int bits); + /** - * Associated data struct to read informations from. + * Generates a FLAG field + * + * @param this private_generator_t object + * @param generator_contexts generator_contexts_t object where the context is written or read from + * @param offset offset of flag value in data struct + * @return - SUCCESS if succeeded + * - OUT_OF_RES if out of ressources */ - void * data_struct; - + status_t (*generate_flag) (private_generator_t *this,u_int32_t offset); + /** * Writes the current buffer content into a chunk_t * * Memory of specific chunk_t gets allocated. * - * @param generator_infos_t calling generator_infos_t object + * @param this calling private_generator_t object * @param data pointer of chunk_t to write to * @return * - SUCCESSFUL if succeeded * - OUT_OF_RES otherwise */ - status_t (*write_chunk) (private_generator_context_t *this,chunk_t *data); + status_t (*write_chunk) (private_generator_t *this,chunk_t *data); /** @@ -86,13 +105,13 @@ struct private_generator_context_s{ * If buffer is to small to hold the specific amount of bits it * is increased using reallocation function of allocator. * - * @param generator_infos_t calling generator_infos_t object + * @param this calling private_generator_t object * @param bits number of bits to make available in buffer * @return * - SUCCESSFUL if succeeded * - OUT_OF_RES otherwise */ - status_t (*make_space_available) (private_generator_context_t *this,size_t bits); + status_t (*make_space_available) (private_generator_t *this,size_t bits); /** * Writes a specific amount of byte into the buffer. @@ -100,219 +119,52 @@ struct private_generator_context_s{ * If buffer is to small to hold the specific amount of bytes it * is increased. * - * @param generator_infos_t calling generator_infos_t object + * @param this calling private_generator_t object * @param bytes pointer to bytes to write * @param number_of_bytes number of bytes to write into buffer * @return * - SUCCESSFUL if succeeded * - OUT_OF_RES otherwise */ - status_t (*write_bytes_to_buffer) (private_generator_context_t *this,void * bytes,size_t number_of_bytes); - + status_t (*write_bytes_to_buffer) (private_generator_t *this,void * bytes,size_t number_of_bytes); + -}; - -/** - * Implements generator_infos_t's increase_buffer function. - * See #generator_infos_s.increase_buffer. - */ -static status_t generator_context_make_space_available (private_generator_context_t *this, size_t bits) -{ - while ((((this->roof_position - this->out_position) * 8) - this->current_bit) < bits) - { - size_t old_buffer_size = ((this->roof_position) - ( this->buffer)); - size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE; - size_t out_position_offset = ((this->out_position) - (this->buffer)); - u_int8_t *new_buffer; - - new_buffer = allocator_realloc(this->buffer,new_buffer_size); - if (new_buffer == NULL) - { - return OUT_OF_RES; - } - - this->buffer = new_buffer; - - this->out_position = (this->buffer + out_position_offset); - this->roof_position = (this->buffer + new_buffer_size); - - } - - return SUCCESS; -} - -/** - * Implements generator_infos_t's write_bytes_to_buffer function. - * See #generator_infos_s.write_bytes_to_buffer. - */ -static status_t generator_context_write_bytes_to_buffer (private_generator_context_t *this,void * bytes,size_t number_of_bytes) -{ - u_int8_t *read_position = (u_int8_t *) bytes; - int i; - status_t status; - - status = this->make_space_available(this,number_of_bytes * 8); - - if (status != SUCCESS) - { - return status; - } - - for (i = 0; i < number_of_bytes; i++) - { - *(this->out_position) = *(read_position); - read_position++; - this->out_position++; - } - return status; -} - -/** - * Implements generator_infos_t's write_chunk function. - * See #generator_infos_s.write_chunk. - */ -static status_t generator_context_write_chunk (private_generator_context_t *this,chunk_t *data) -{ - size_t data_length = this->out_position - this->buffer; - - if (this->current_bit > 0) - data_length++; - data->ptr = allocator_alloc(data_length); - if (data->ptr == NULL) - { - data->len = 0; - return OUT_OF_RES; - } - memcpy(data->ptr,this->buffer,data_length); - data->len = data_length; - return SUCCESS; -} - - -/** - * Implements generator_infos_t's destroy function. - * See #generator_infos_s.destroy. - */ -static status_t generator_context_destroy (private_generator_context_t *this) -{ - allocator_free(this->buffer); - allocator_free(this); - return SUCCESS; -} - -/* - * Described in header - */ -static generator_context_t * generator_context_create(generator_t *generator) -{ - private_generator_context_t *this = allocator_alloc_thing(private_generator_context_t); - - if (this == NULL) - { - return NULL; - } - - /* object methods */ - this->public.destroy = (status_t (*) (generator_context_t *this))generator_context_destroy; - this->make_space_available = generator_context_make_space_available; - this->write_chunk = generator_context_write_chunk; - this->write_bytes_to_buffer = generator_context_write_bytes_to_buffer; - - /* allocate memory for buffer */ - this->buffer = allocator_alloc(GENERATOR_DATA_BUFFER_SIZE); - if (this->buffer == NULL) - { - allocator_free(this); - return NULL; - } - - /* set private data */ - this->out_position = this->buffer; - this->roof_position = this->buffer + GENERATOR_DATA_BUFFER_SIZE; - this->data_struct = NULL; - this->current_bit = 0; - return &(this->public); -} - - -/** - * Private part of a generator_t object - */ -typedef struct private_generator_s private_generator_t; - -struct private_generator_s { /** - * Public part of a generator_t object + * Buffer used to generate the data into. */ - generator_t public; - - /* private functions and fields */ + u_int8_t *buffer; /** - * Generates a chunk_t with specific encoding rules. - * - * Iems are bytewhise written. - * - * @param this private_generator_t object - * @param data_struct data_struct to read data from - * @param encoding_rules pointer to first encoding_rule - * of encoding rules array - * @param encoding_rules_count number of encoding rules - * in encoding rules array - * @param data pointer to chunk_t where to write the data in - * - * @return - SUCCESS if succeeded - * - OUT_OF_RES if out of ressources + * Current write position in buffer (one byte aligned). */ - status_t (*generate) (private_generator_t *this,void * data_struct,encoding_rule_t *encoding_rules, size_t encoding_rules_count, private_generator_context_t *generator_context); + u_int8_t *out_position; /** - * Generates a U_INT-Field type - * - * @param this private_generator_t object - * @param int_type type of U_INT field (U_INT_4, U_INT_8, etc.) - * @param offset offset of value in data struct - * @param generator_contexts generator_contexts_t object where the context is written or read from - * @return - SUCCESS if succeeded - * - OUT_OF_RES if out of ressources + * Position of last byte in buffer. */ - status_t (*generate_u_int_type) (private_generator_t *this,encoding_type_t int_type,u_int32_t offset, private_generator_context_t *generator_context); + u_int8_t *roof_position; /** - * Generates a RESERVED BIT field or a RESERVED BYTE field - * - * @param this private_generator_t object - * @param generator_contexts generator_contexts_t object where the context is written or read from - * @param bits number of bits to generate - * @return - SUCCESS if succeeded - * - OUT_OF_RES if out of ressources - * - FAILED if bit count not supported + * Current bit writing to in current byte (between 0 and 7). */ - status_t (*generate_reserved_field) (private_generator_t *this,private_generator_context_t *generator_context,int bits); - + size_t current_bit; + /** - * Generates a FLAG field - * - * @param this private_generator_t object - * @param generator_contexts generator_contexts_t object where the context is written or read from - * @param offset offset of flag value in data struct - * @return - SUCCESS if succeeded - * - OUT_OF_RES if out of ressources + * Associated data struct to read informations from. */ - status_t (*generate_flag) (private_generator_t *this,private_generator_context_t *generator_context,u_int32_t offset); - + void * data_struct; + /** - * Pointer to the payload informations needed to automatic - * generate a specific payload type + * Associated Logger */ - payload_info_t **payload_infos; + logger_t *logger; }; /** * Implements private_generator_t's generate_u_int_type function. * See #private_generator_s.generate_u_int_type. */ -static status_t generate_u_int_type (private_generator_t *this,encoding_type_t int_type,u_int32_t offset,private_generator_context_t *generator_context) +static status_t generate_u_int_type (private_generator_t *this,encoding_type_t int_type,u_int32_t offset) { size_t number_of_bits = 0; status_t status; @@ -338,13 +190,13 @@ static status_t generate_u_int_type (private_generator_t *this,encoding_type_t i default: return FAILED; } - if (((number_of_bits % 8) == 0) && (generator_context->current_bit != 0)) + if (((number_of_bits % 8) == 0) && (this->current_bit != 0)) { /* current bit has to be zero for values greater then 4 bits */ return FAILED; } - status = generator_context->make_space_available(generator_context,number_of_bits); + status = this->make_space_available(this,number_of_bits); if (status != SUCCESS) { @@ -355,22 +207,22 @@ static status_t generate_u_int_type (private_generator_t *this,encoding_type_t i { case U_INT_4: { - if (generator_context->current_bit == 0) + if (this->current_bit == 0) { - u_int8_t high_val = *((u_int8_t *)(generator_context->data_struct + offset)) << 4; - u_int8_t low_val = *(generator_context->out_position) & 0x0F; + u_int8_t high_val = *((u_int8_t *)(this->data_struct + offset)) << 4; + u_int8_t low_val = *(this->out_position) & 0x0F; - *(generator_context->out_position) = high_val | low_val; + *(this->out_position) = high_val | low_val; /* write position is not changed, just bit position is moved */ - generator_context->current_bit = 4; + this->current_bit = 4; } - else if (generator_context->current_bit == 4) + else if (this->current_bit == 4) { - u_int high_val = *(generator_context->out_position) & 0xF0; - u_int low_val = *((u_int8_t *)(generator_context->data_struct + offset)) & 0x0F; - *(generator_context->out_position) = high_val | low_val; - generator_context->out_position++; - generator_context->current_bit = 0; + u_int high_val = *(this->out_position) & 0xF0; + u_int low_val = *((u_int8_t *)(this->data_struct + offset)) & 0x0F; + *(this->out_position) = high_val | low_val; + this->out_position++; + this->current_bit = 0; } else @@ -383,30 +235,30 @@ static status_t generate_u_int_type (private_generator_t *this,encoding_type_t i case U_INT_8: { - *generator_context->out_position = *((u_int8_t *)(generator_context->data_struct + offset)); - generator_context->out_position++; + *this->out_position = *((u_int8_t *)(this->data_struct + offset)); + this->out_position++; break; } case U_INT_16: { - u_int16_t int16_val = htons(*((u_int16_t*)(generator_context->data_struct + offset))); - generator_context->write_bytes_to_buffer(generator_context,&int16_val,sizeof(u_int16_t)); + u_int16_t int16_val = htons(*((u_int16_t*)(this->data_struct + offset))); + this->write_bytes_to_buffer(this,&int16_val,sizeof(u_int16_t)); break; } case U_INT_32: { - u_int32_t int32_val = htonl(*((u_int32_t*)(generator_context->data_struct + offset))); - generator_context->write_bytes_to_buffer(generator_context,&int32_val,sizeof(u_int32_t)); + u_int32_t int32_val = htonl(*((u_int32_t*)(this->data_struct + offset))); + this->write_bytes_to_buffer(this,&int32_val,sizeof(u_int32_t)); break; } case U_INT_64: { - u_int32_t int32_val_low = htonl(*((u_int32_t*)(generator_context->data_struct + offset))); - u_int32_t int32_val_high = htonl(*((u_int32_t*)(generator_context->data_struct + offset) + 1)); - generator_context->write_bytes_to_buffer(generator_context,&int32_val_high,sizeof(u_int32_t)); - generator_context->write_bytes_to_buffer(generator_context,&int32_val_low,sizeof(u_int32_t)); + u_int32_t int32_val_low = htonl(*((u_int32_t*)(this->data_struct + offset))); + u_int32_t int32_val_high = htonl(*((u_int32_t*)(this->data_struct + offset) + 1)); + this->write_bytes_to_buffer(this,&int32_val_high,sizeof(u_int32_t)); + this->write_bytes_to_buffer(this,&int32_val_low,sizeof(u_int32_t)); break; } @@ -418,7 +270,11 @@ static status_t generate_u_int_type (private_generator_t *this,encoding_type_t i return SUCCESS; } -static status_t generate_reserved_field (private_generator_t *this,private_generator_context_t *generator_context,int bits) +/** + * Implements private_generator_t's generate_reserved_field function. + * See #private_generator_s.generate_reserved_field. + */ +static status_t generate_reserved_field (private_generator_t *this,int bits) { status_t status; @@ -426,7 +282,7 @@ static status_t generate_reserved_field (private_generator_t *this,private_gener { return FAILED; } - status = generator_context->make_space_available(generator_context,bits); + status = this->make_space_available(this,bits); if (status != SUCCESS) { return status; @@ -434,25 +290,25 @@ static status_t generate_reserved_field (private_generator_t *this,private_gener if (bits == 1) { - u_int8_t reserved_bit = ~(1 << (7 - generator_context->current_bit)); + u_int8_t reserved_bit = ~(1 << (7 - this->current_bit)); - *(generator_context->out_position) = *(generator_context->out_position) & reserved_bit; - generator_context->current_bit++; - if (generator_context->current_bit >= 8) + *(this->out_position) = *(this->out_position) & reserved_bit; + this->current_bit++; + if (this->current_bit >= 8) { - generator_context->current_bit = generator_context->current_bit % 8; - generator_context->out_position++; + this->current_bit = this->current_bit % 8; + this->out_position++; } } else { /* one byte */ - if (generator_context->current_bit > 0) + if (this->current_bit > 0) { return FAILED; } - *(generator_context->out_position) = 0x00; - generator_context->out_position++; + *(this->out_position) = 0x00; + this->out_position++; } return SUCCESS; @@ -460,47 +316,134 @@ static status_t generate_reserved_field (private_generator_t *this,private_gener } -static status_t generate_flag (private_generator_t *this,private_generator_context_t *generator_context,u_int32_t offset) +/** + * Implements private_generator_t's generate_flag function. + * See #private_generator_s.generate_flag. + */ +static status_t generate_flag (private_generator_t *this,u_int32_t offset) { status_t status; - u_int8_t flag_value = (*((bool *) (generator_context->data_struct + offset))) ? 1 : 0; - u_int8_t flag = (flag_value << (7 - generator_context->current_bit)); + u_int8_t flag_value = (*((bool *) (this->data_struct + offset))) ? 1 : 0; + u_int8_t flag = (flag_value << (7 - this->current_bit)); - status = generator_context->make_space_available(generator_context,1); + status = this->make_space_available(this,1); if (status != SUCCESS) { return status; } - *(generator_context->out_position) = *(generator_context->out_position) | flag; + *(this->out_position) = *(this->out_position) | flag; - generator_context->current_bit++; - if (generator_context->current_bit >= 8) + this->current_bit++; + if (this->current_bit >= 8) + { + this->current_bit = this->current_bit % 8; + this->out_position++; + } + return SUCCESS; +} + +/** + * Implements private_generator_t's generator_context_make_space_available function. + * See #private_generator_s.generator_context_make_space_available. + */ +static status_t make_space_available (private_generator_t *this, size_t bits) +{ + while ((((this->roof_position - this->out_position) * 8) - this->current_bit) < bits) { - generator_context->current_bit = generator_context->current_bit % 8; - generator_context->out_position++; + size_t old_buffer_size = ((this->roof_position) - ( this->buffer)); + size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE; + size_t out_position_offset = ((this->out_position) - (this->buffer)); + u_int8_t *new_buffer; + + new_buffer = allocator_realloc(this->buffer,new_buffer_size); + if (new_buffer == NULL) + { + return OUT_OF_RES; + } + + this->buffer = new_buffer; + + this->out_position = (this->buffer + out_position_offset); + this->roof_position = (this->buffer + new_buffer_size); + } + return SUCCESS; } /** - * Implements private_generator_t's generate function. - * See #private_generator_s.generate. + * Implements private_generator_t's write_bytes_to_buffer function. + * See #private_generator_s.write_bytes_to_buffer. */ -static status_t generate (private_generator_t *this,void * data_struct,encoding_rule_t *encoding_rules, size_t encoding_rules_count, private_generator_context_t *generator_context) +static status_t write_bytes_to_buffer (private_generator_t *this,void * bytes,size_t number_of_bytes) { + u_int8_t *read_position = (u_int8_t *) bytes; int i; status_t status; - if (generator_context == NULL) + status = this->make_space_available(this,number_of_bytes * 8); + + if (status != SUCCESS) + { + return status; + } + + for (i = 0; i < number_of_bytes; i++) { + *(this->out_position) = *(read_position); + read_position++; + this->out_position++; + } + return status; +} + +/** + * Implements generator_t's write_chunk function. + * See #generator_s.write_chunk. + */ +static status_t write_to_chunk (private_generator_t *this,chunk_t *data) +{ + size_t data_length = this->out_position - this->buffer; + + if (this->current_bit > 0) + data_length++; + data->ptr = allocator_alloc(data_length); + if (data->ptr == NULL) + { + data->len = 0; return OUT_OF_RES; } + memcpy(data->ptr,this->buffer,data_length); + data->len = data_length; + return SUCCESS; +} + - for (i = 0; i < encoding_rules_count;i++) + +/** + * Implements generator_t's generate_payload function. + * See #generator_s.generate_payload. + */ +static status_t generate_payload (private_generator_t *this,payload_t *payload) +{ + int i; + status_t status; + this->data_struct = payload; + size_t rule_count; + encoding_rule_t *rules; + + + payload_type_t payload_type = payload->get_type(payload); + + this->logger->log(this->logger,CONTROL,"Start generating payload of type %s",mapping_find(payload_type_t_mappings,payload_type)); + + payload->get_encoding_rules(payload,&rules,&rule_count); + + for (i = 0; i < rule_count;i++) { status = SUCCESS; - switch (encoding_rules[i].type) + switch (rules[i].type) { /* all u int values are generated in generate_u_int_type */ case U_INT_4: @@ -508,79 +451,48 @@ static status_t generate (private_generator_t *this,void * data_struct,encoding_ case U_INT_16: case U_INT_32: case U_INT_64: - status = this->generate_u_int_type(this,encoding_rules[i].type,encoding_rules[i].offset,generator_context); + status = this->generate_u_int_type(this,rules[i].type,rules[i].offset); break; case RESERVED_BIT: { - status = this->generate_reserved_field(this,generator_context,1); + status = this->generate_reserved_field(this,1); break; } case RESERVED_BYTE: { - status = this->generate_reserved_field(this,generator_context,8); + status = this->generate_reserved_field(this,8); break; } case FLAG: { - status = this->generate_flag(this,generator_context,encoding_rules[i].offset); + status = this->generate_flag(this,rules[i].offset); break; } case LENGTH: /* length is generated like an U_INT_32 */ - status = this->generate_u_int_type(this,U_INT_32,encoding_rules[i].offset,generator_context); + status = this->generate_u_int_type(this,U_INT_32,rules[i].offset); break; case SPI_SIZE: /* currently not implemented */ default: break; } - if (status != SUCCESS) - { - generator_context->public.destroy(&(generator_context->public)); - return status; - } } -// infos->destroy(infos); return status; -} - -/** - * Implements generator_t's generate_payload function. - * See #generator_s.generate_payload. - */ -static status_t generate_payload (private_generator_t *this,payload_type_t payload_type,void * data_struct, generator_context_t *generator_context) -{ - int i; - private_generator_context_t *private_generator_context = (private_generator_context_t *) generator_context; - - private_generator_context->data_struct = data_struct; - - /* check every payload info for specific type */ - for (i = 0; this->payload_infos[i] != NULL; i++) - { - if (this->payload_infos[i]->payload_type == payload_type) - { - /* found payload informations, generating is done in private function generate() */ - return (this->generate(this, data_struct,this->payload_infos[i]->ecoding_rules,this->payload_infos[i]->encoding_rules_count,private_generator_context)); - } - } return NOT_SUPPORTED; } -status_t write_to_chunk (private_generator_t *this,private_generator_context_t *generator_context, chunk_t *data) -{ - return generator_context->write_chunk(generator_context,data); -} - /** * Implements generator_t's destroy function. * See #generator_s.destroy. */ static status_t destroy(private_generator_t *this) { + allocator_free(this->buffer); + global_logger_manager->destroy_logger(global_logger_manager,this->logger); allocator_free(this); return SUCCESS; } @@ -588,15 +500,10 @@ static status_t destroy(private_generator_t *this) /* * Described in header */ -generator_t * generator_create(payload_info_t ** payload_infos) +generator_t * generator_create() { private_generator_t *this; - if (payload_infos == NULL) - { - return NULL; - } - this = allocator_alloc_thing(private_generator_t); if (this == NULL) { @@ -604,18 +511,33 @@ generator_t * generator_create(payload_info_t ** payload_infos) } /* initiate public functions */ - this->public.create_context = (generator_context_t * (*) (generator_t *)) generator_context_create; - this->public.generate_payload = (status_t(*)(generator_t*, payload_type_t, void *, generator_context_t *)) generate_payload; + this->public.generate_payload = (status_t(*)(generator_t*, payload_t *)) generate_payload; this->public.destroy = (status_t(*)(generator_t*)) destroy; - this->public.write_to_chunk = (status_t (*) (generator_t *,generator_context_t *, chunk_t *)) write_to_chunk; + this->public.write_to_chunk = (status_t (*) (generator_t *,chunk_t *)) write_to_chunk; + + /* initiate private functions */ - this->generate = generate; +// this->generate = generate; this->generate_u_int_type = generate_u_int_type; this->generate_reserved_field = generate_reserved_field; this->generate_flag = generate_flag; + this->make_space_available = make_space_available; + this->write_bytes_to_buffer = write_bytes_to_buffer; - /* initiate private variables */ - this->payload_infos = payload_infos; + /* allocate memory for buffer */ + this->buffer = allocator_alloc(GENERATOR_DATA_BUFFER_SIZE); + if (this->buffer == NULL) + { + allocator_free(this); + return NULL; + } + + /* initiate private variables */ + this->out_position = this->buffer; + this->roof_position = this->buffer + GENERATOR_DATA_BUFFER_SIZE; + this->data_struct = NULL; + this->current_bit = 0; + this->logger = global_logger_manager->create_logger(global_logger_manager,GENERATOR,NULL); return &(this->public); } diff --git a/Source/charon/generator.h b/Source/charon/generator.h index 517a56c11..a23a9573a 100644 --- a/Source/charon/generator.h +++ b/Source/charon/generator.h @@ -39,23 +39,6 @@ #define GENERATOR_DATA_BUFFER_INCREASE_VALUE 1000 /** - * Used for generator operations internaly to store a generator context. - */ -typedef struct generator_context_s generator_context_t; - -struct generator_context_s { - /** - * @brief Destroys a generator_infos_t object and its containing buffer - * - * @param generator_infos_t generator_infos_t object - * @return always SUCCESSFUL - */ - status_t (*destroy) (generator_context_t *this); -}; - - - -/** *A generator_t object which generates payloads of specific type. */ typedef struct generator_s generator_t; @@ -63,46 +46,29 @@ typedef struct generator_s generator_t; struct generator_s { /** - * Creates a generator_context_t object holding necessary informations - * for generating (buffer, data_struct, etc). - * - * After using, this context has to get destroyed! - * - * @param data_struct data struct where the specific payload informations are stored - * @return - * - pointer to created generator_infos_t object - * - NULL if memory allocation failed - */ - generator_context_t * (*create_context) (generator_t *this); - - /** - * @brief Generates a specific payload from given data struct. + * @brief Generates a specific payload from given payload object. * * Remember: Header and substructures are also handled as payloads. * - * @param this generator_t object - * @param payload_type payload type to generate using the given data struct - * @param[in] data_struct data struct where the needed data for generating are stored - * @param generator_context generator context to use when generating + * @param this generator_t object + * @param[in] payload interface payload_t implementing object * @return * - SUCCESSFUL if succeeded - * - NOT_SUPPORTED if payload_type is not supported * - OUT_OF_RES if out of ressources */ - status_t (*generate_payload) (generator_t *this,payload_type_t payload_type,void * data_struct,generator_context_t *generator_context); + status_t (*generate_payload) (generator_t *this,payload_t *payload); /** - * Writes all generated data of current context to a chunk + * Writes all generated data of current generator context to a chunk * * @param this generator_t object - * @param generator_context generator context to use when generating * * @param[out] data chunk to write the data to * @return * @return * - SUCCESSFUL if succeeded * - OUT_OF_RES otherwise */ - status_t (*write_to_chunk) (generator_t *this,generator_context_t *generator_context, chunk_t *data); + status_t (*write_to_chunk) (generator_t *this,chunk_t *data); /** * @brief Destroys a generator_t object. @@ -117,9 +83,6 @@ struct generator_s { /** * Constructor to create a generator * - * @param payload_infos pointer to the payload_info_t-array containing - * all the payload informations needed to - * automatic generate a specific payload */ generator_t * generator_create(); diff --git a/Source/charon/payloads/ike_header.c b/Source/charon/payloads/ike_header.c index 2591a25ca..f02caf9bf 100644 --- a/Source/charon/payloads/ike_header.c +++ b/Source/charon/payloads/ike_header.c @@ -68,14 +68,14 @@ encoding_rule_t ike_header_encodings[] = { -status_t destroy(payload_t *this) +static status_t destroy(ike_header_t *this) { allocator_free(this); return SUCCESS; } -status_t get_encoding_rules(payload_t *this, encoding_rule_t **rules, size_t *rule_count) +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); @@ -83,17 +83,17 @@ status_t get_encoding_rules(payload_t *this, encoding_rule_t **rules, size_t *ru return SUCCESS; } -payload_type_t get_type(payload_t *this) +static payload_type_t get_type(payload_t *this) { return HEADER; } -payload_type_t get_next_type(payload_t *this) +static payload_type_t get_next_type(payload_t *this) { return (((ike_header_t*)this)->next_payload); } -size_t get_length(payload_t *this) +static size_t get_length(payload_t *this) { return sizeof(ike_header_t); } @@ -111,7 +111,8 @@ ike_header_t *ike_header_create() 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 = destroy; + this->payload_interface.destroy = (status_t (*) (payload_t *))destroy; + this->destroy = destroy; return this; } diff --git a/Source/charon/payloads/ike_header.h b/Source/charon/payloads/ike_header.h index 9aef9529a..57a0d637d 100644 --- a/Source/charon/payloads/ike_header.h +++ b/Source/charon/payloads/ike_header.h @@ -96,6 +96,15 @@ struct ike_header_s { * Length of the whole IKEv2-Message (header and all payloads) */ u_int32_t length; + + /** + * @brief Destroys a ike_haeder payload and all included substructures. + * + * @param this payload to destroy + * @return + * SUCCESS in any case + */ + status_t (*destroy) (ike_header_t *this); }; /** diff --git a/Source/charon/testcases/generator_test.c b/Source/charon/testcases/generator_test.c index 764ef4c7d..49c90182d 100644 --- a/Source/charon/testcases/generator_test.c +++ b/Source/charon/testcases/generator_test.c @@ -32,65 +32,40 @@ #include "../payloads/encodings.h" #include "../payloads/ike_header.h" -extern payload_info_t *payload_infos[]; - -/* - * Described in Header - */ -void test_generator_with_unsupported_payload(tester_t *tester) -{ - generator_t *generator; - generator_context_t *generator_context; - void * data_struct; - - generator = generator_create(payload_infos); - tester->assert_true(tester,(generator != NULL), "generator create check"); - - generator_context = generator->create_context(generator); - - tester->assert_true(tester,(generator->generate_payload(generator,(payload_type_t) -1,data_struct,generator_context) == NOT_SUPPORTED),"generate_payload call check"); - - generator_context->destroy(generator_context); - - tester->assert_true(tester,(generator->destroy(generator) == SUCCESS), "generator destroy call check"); -} - /* * Described in Header */ void test_generator_with_header_payload(tester_t *tester) { generator_t *generator; - generator_context_t *generator_context; - ike_header_t header_data; + ike_header_t *header_data; chunk_t generated_data; status_t status; logger_t *logger; logger = global_logger_manager->create_logger(global_logger_manager,TESTER,"header payload"); - 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 = 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; - generator = generator_create(payload_infos); + generator = generator_create(); tester->assert_true(tester,(generator != NULL), "generator create check"); - generator_context = generator->create_context(generator); - tester->assert_true(tester,(generator_context != NULL), "generator_context create check"); - - status = generator->generate_payload(generator,HEADER,&header_data,generator_context); + status = generator->generate_payload(generator,(payload_t *) header_data); tester->assert_true(tester,(status == SUCCESS),"generate_payload call check"); - tester->assert_true(tester,(generator->write_to_chunk(generator,generator_context,&generated_data) == SUCCESS),"write_to_chunk call check"); + tester->assert_true(tester,(generator->write_to_chunk(generator,&generated_data) == SUCCESS),"write_to_chunk call check"); u_int8_t expected_generation[] = { 0x00,0x00,0x00,0x00, @@ -107,27 +82,28 @@ void test_generator_with_header_payload(tester_t *tester) 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); - generator_context->destroy(generator_context); + tester->assert_true(tester,(generator->destroy(generator) == SUCCESS), "generator destroy call check"); - header_data.initiator_spi = 0x22000054231234; - 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->initiator_spi = 0x22000054231234; + 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; - generator_context = generator->create_context(generator); + generator = generator_create(); + tester->assert_true(tester,(generator != NULL), "generator create check"); - status = generator->generate_payload(generator,HEADER,&header_data,generator_context); + status = generator->generate_payload(generator,(payload_t *)header_data); tester->assert_true(tester,(status == SUCCESS),"generate_payload call check"); - tester->assert_true(tester,(generator->write_to_chunk(generator,generator_context,&generated_data) == SUCCESS),"write_to_chunk call check"); + tester->assert_true(tester,(generator->write_to_chunk(generator,&generated_data) == SUCCESS),"write_to_chunk call check"); u_int8_t expected_generation2[] = { 0x00,0x22,0x00,0x00, @@ -143,8 +119,9 @@ void test_generator_with_header_payload(tester_t *tester) tester->assert_true(tester,(memcmp(expected_generation2,generated_data.ptr,sizeof(expected_generation2)) == 0), "compare generated data 2"); allocator_free_chunk(generated_data); + + header_data->destroy(header_data); - generator_context->destroy(generator_context); global_logger_manager->destroy_logger(global_logger_manager,logger); tester->assert_true(tester,(generator->destroy(generator) == SUCCESS), "generator destroy call check"); } diff --git a/Source/charon/testcases/generator_test.h b/Source/charon/testcases/generator_test.h index 43d3575d3..6727cf9b9 100644 --- a/Source/charon/testcases/generator_test.h +++ b/Source/charon/testcases/generator_test.h @@ -26,14 +26,6 @@ #include "../utils/tester.h" /** - * @brief Test function used to test the generator with unsupported payload - * - * - * @param tester associated tester object - */ -void test_generator_with_unsupported_payload(tester_t *tester); - -/** * @brief Test function used to test the generator with header payload * * diff --git a/Source/charon/testcases/testcases.c b/Source/charon/testcases/testcases.c index a2e12da36..1d935ef3d 100644 --- a/Source/charon/testcases/testcases.c +++ b/Source/charon/testcases/testcases.c @@ -43,7 +43,7 @@ #include "ike_sa_test.h" #include "ike_sa_manager_test.h" #include "generator_test.h" -#include "parser_test.h" +//#include "parser_test.h" #include "packet_test.h" @@ -122,11 +122,6 @@ test_t ike_sa_test = {test_ike_sa,"IKE_SA"}; test_t ike_sa_manager_test = {test_ike_sa_manager, "IKE_SA-Manager"}; /** - * Test for generator_t - */ -test_t generator_test1 = {test_generator_with_unsupported_payload,"Generator: unsupported payload"}; - -/** * Test 2 for generator_t */ test_t generator_test2 = {test_generator_with_header_payload,"Generator: header payload"}; @@ -134,7 +129,7 @@ test_t generator_test2 = {test_generator_with_header_payload,"Generator: header /** * Test 2 for generator_t */ -test_t parser_test = {test_parser_with_header_payload, "Parser: header payload"}; +//test_t parser_test = {test_parser_with_header_payload, "Parser: header payload"}; /** @@ -187,9 +182,8 @@ logger_manager_t *global_logger_manager; &receiver_test, &ike_sa_id_test, &ike_sa_test, - &generator_test1, &generator_test2, - &parser_test, +// &parser_test, &ike_sa_manager_test, &packet_test, NULL |