removed private generator function pointers, allows compiler to inline
This commit is contained in:
+148
-270
@@ -57,125 +57,6 @@ struct private_generator_t {
|
|||||||
*/
|
*/
|
||||||
generator_t public;
|
generator_t public;
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a U_INT-Field type and writes it to buffer.
|
|
||||||
*
|
|
||||||
* @param this private_generator_t object
|
|
||||||
* @param int_type type of U_INT field (U_INT_4, U_INT_8, etc.)
|
|
||||||
* ATTRIBUTE_TYPE is also generated in this function
|
|
||||||
* @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
|
|
||||||
* - FAILED if allignment is wrong
|
|
||||||
*/
|
|
||||||
void (*generate_u_int_type) (private_generator_t *this,encoding_type_t int_type,u_int32_t offset);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get size of current buffer in bytes.
|
|
||||||
*
|
|
||||||
* @param this private_generator_t object
|
|
||||||
* @return Size of buffer in bytes
|
|
||||||
*/
|
|
||||||
size_t (*get_current_buffer_size) (private_generator_t *this);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get free space of current buffer in bytes.
|
|
||||||
*
|
|
||||||
* @param this private_generator_t object
|
|
||||||
* @return space in buffer in bytes
|
|
||||||
*/
|
|
||||||
size_t (*get_current_buffer_space) (private_generator_t *this);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get length of data in buffer (in bytes).
|
|
||||||
*
|
|
||||||
* @param this private_generator_t object
|
|
||||||
* @return length of data in bytes
|
|
||||||
*/
|
|
||||||
size_t (*get_current_data_length) (private_generator_t *this);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get current offset in buffer (in bytes).
|
|
||||||
*
|
|
||||||
* @param this private_generator_t object
|
|
||||||
* @return offset in bytes
|
|
||||||
*/
|
|
||||||
u_int32_t (*get_current_buffer_offset) (private_generator_t *this);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a RESERVED BIT field or a RESERVED BYTE field and writes
|
|
||||||
* it to the buffer.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*/
|
|
||||||
void (*generate_reserved_field) (private_generator_t *this,int bits);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
void (*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 this calling private_generator_t object
|
|
||||||
* @param data pointer of chunk_t to write to
|
|
||||||
*/
|
|
||||||
void (*write_chunk) (private_generator_t *this,chunk_t *data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a bytestream from a chunk_t.
|
|
||||||
*
|
|
||||||
* @param this private_generator_t object
|
|
||||||
* @param offset offset of chunk_t value in data struct
|
|
||||||
*/
|
|
||||||
void (*generate_from_chunk) (private_generator_t *this,u_int32_t offset);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes sure enough space is available in buffer to store amount of bits.
|
|
||||||
*
|
|
||||||
* If buffer is to small to hold the specific amount of bits it
|
|
||||||
* is increased using reallocation function of allocator.
|
|
||||||
*
|
|
||||||
* @param this calling private_generator_t object
|
|
||||||
* @param bits number of bits to make available in buffer
|
|
||||||
*/
|
|
||||||
void (*make_space_available) (private_generator_t *this,size_t bits);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes a specific amount of byte into the buffer.
|
|
||||||
*
|
|
||||||
* If buffer is to small to hold the specific amount of bytes it
|
|
||||||
* is increased.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*/
|
|
||||||
void (*write_bytes_to_buffer) (private_generator_t *this,void * bytes,size_t number_of_bytes);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Writes a specific amount of byte into the buffer at a specific offset.
|
|
||||||
*
|
|
||||||
* @warning buffer size is not check to hold the data if offset is to large.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
* @param offset offset to write the data into
|
|
||||||
*/
|
|
||||||
void (*write_bytes_to_buffer_at_offset) (private_generator_t *this,void * bytes,size_t number_of_bytes,u_int32_t offset);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Buffer used to generate the data into.
|
* Buffer used to generate the data into.
|
||||||
*/
|
*/
|
||||||
@@ -232,43 +113,116 @@ struct private_generator_t {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.get_current_buffer_size.
|
* Get size of current buffer in bytes.
|
||||||
*/
|
*/
|
||||||
static size_t get_current_buffer_size (private_generator_t *this)
|
static size_t get_current_buffer_size(private_generator_t *this)
|
||||||
{
|
{
|
||||||
return ((this->roof_position) - (this->buffer));
|
return this->roof_position - this->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.get_current_buffer_space.
|
* Get free space of current buffer in bytes.
|
||||||
*/
|
*/
|
||||||
static size_t get_current_buffer_space (private_generator_t *this)
|
static size_t get_current_buffer_space(private_generator_t *this)
|
||||||
{
|
{
|
||||||
/* we know, one byte more */
|
return this->roof_position - this->out_position;
|
||||||
size_t space = (this->roof_position) - (this->out_position);
|
|
||||||
return (space);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.get_current_data_length.
|
* Get length of data in buffer (in bytes).
|
||||||
*/
|
*/
|
||||||
static size_t get_current_data_length (private_generator_t *this)
|
static size_t get_current_data_length(private_generator_t *this)
|
||||||
{
|
{
|
||||||
return (this->out_position - this->buffer);
|
return this->out_position - this->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.get_current_buffer_offset.
|
* Get current offset in buffer (in bytes).
|
||||||
*/
|
*/
|
||||||
static u_int32_t get_current_buffer_offset (private_generator_t *this)
|
static u_int32_t get_current_buffer_offset(private_generator_t *this)
|
||||||
{
|
{
|
||||||
return (this->out_position - this->buffer);
|
return this->out_position - this->buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.generate_u_int_type.
|
* Makes sure enough space is available in buffer to store amount of bits.
|
||||||
*/
|
*/
|
||||||
static void generate_u_int_type (private_generator_t *this,encoding_type_t int_type,u_int32_t offset)
|
static void make_space_available (private_generator_t *this, size_t bits)
|
||||||
|
{
|
||||||
|
while ((get_current_buffer_space(this) * 8 - this->current_bit) < bits)
|
||||||
|
{
|
||||||
|
/* must increase buffer */
|
||||||
|
size_t old_buffer_size = get_current_buffer_size(this);
|
||||||
|
size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE;
|
||||||
|
size_t out_position_offset = ((this->out_position) - (this->buffer));
|
||||||
|
|
||||||
|
DBG2(DBG_ENC, "increased gen buffer from %d to %d byte",
|
||||||
|
old_buffer_size, new_buffer_size);
|
||||||
|
|
||||||
|
/* Reallocate space for new buffer */
|
||||||
|
this->buffer = realloc(this->buffer,new_buffer_size);
|
||||||
|
|
||||||
|
this->out_position = (this->buffer + out_position_offset);
|
||||||
|
this->roof_position = (this->buffer + new_buffer_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a specific amount of byte into the buffer.
|
||||||
|
*/
|
||||||
|
static void write_bytes_to_buffer(private_generator_t *this, void * bytes,
|
||||||
|
size_t number_of_bytes)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u_int8_t *read_position = (u_int8_t *) bytes;
|
||||||
|
|
||||||
|
make_space_available(this, number_of_bytes * 8);
|
||||||
|
|
||||||
|
for (i = 0; i < number_of_bytes; i++)
|
||||||
|
{
|
||||||
|
*(this->out_position) = *(read_position);
|
||||||
|
read_position++;
|
||||||
|
this->out_position++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a specific amount of byte into the buffer at a specific offset.
|
||||||
|
*/
|
||||||
|
static void write_bytes_to_buffer_at_offset (private_generator_t *this,
|
||||||
|
void *bytes, size_t number_of_bytes, u_int32_t offset)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
u_int8_t *read_position = (u_int8_t *) bytes;
|
||||||
|
u_int8_t *write_position;
|
||||||
|
u_int32_t free_space_after_offset = get_current_buffer_size(this) - offset;
|
||||||
|
|
||||||
|
/* check first if enough space for new data is available */
|
||||||
|
if (number_of_bytes > free_space_after_offset)
|
||||||
|
{
|
||||||
|
make_space_available(this, (number_of_bytes - free_space_after_offset) * 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
write_position = this->buffer + offset;
|
||||||
|
for (i = 0; i < number_of_bytes; i++)
|
||||||
|
{
|
||||||
|
*write_position = *read_position;
|
||||||
|
read_position++;
|
||||||
|
write_position++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a U_INT-Field type and writes it to buffer.
|
||||||
|
*
|
||||||
|
* @param this private_generator_t object
|
||||||
|
* @param int_type type of U_INT field (U_INT_4, U_INT_8, etc.)
|
||||||
|
* ATTRIBUTE_TYPE is also generated in this function
|
||||||
|
* @param offset offset of value in data struct
|
||||||
|
* @param generator_contexts generator_contexts_t object where the context is written or read from
|
||||||
|
*/
|
||||||
|
static void generate_u_int_type(private_generator_t *this,
|
||||||
|
encoding_type_t int_type,u_int32_t offset)
|
||||||
{
|
{
|
||||||
size_t number_of_bits = 0;
|
size_t number_of_bits = 0;
|
||||||
|
|
||||||
@@ -316,7 +270,7 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* make sure enough space is available in buffer */
|
/* make sure enough space is available in buffer */
|
||||||
this->make_space_available(this,number_of_bits);
|
make_space_available(this, number_of_bits);
|
||||||
/* now handle each u int type differently */
|
/* now handle each u int type differently */
|
||||||
switch (int_type)
|
switch (int_type)
|
||||||
{
|
{
|
||||||
@@ -386,7 +340,7 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t
|
|||||||
int16_val = htons(int16_val);
|
int16_val = htons(int16_val);
|
||||||
DBG3(DBG_ENC, " => %d", int16_val);
|
DBG3(DBG_ENC, " => %d", int16_val);
|
||||||
/* write bytes to buffer (set bit is overwritten)*/
|
/* write bytes to buffer (set bit is overwritten)*/
|
||||||
this->write_bytes_to_buffer(this,&int16_val,sizeof(u_int16_t));
|
write_bytes_to_buffer(this, &int16_val, sizeof(u_int16_t));
|
||||||
this->current_bit = 0;
|
this->current_bit = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -396,14 +350,14 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t
|
|||||||
{
|
{
|
||||||
u_int16_t int16_val = htons(*((u_int16_t*)(this->data_struct + offset)));
|
u_int16_t int16_val = htons(*((u_int16_t*)(this->data_struct + offset)));
|
||||||
DBG3(DBG_ENC, " => %b", (void*)&int16_val, sizeof(int16_val));
|
DBG3(DBG_ENC, " => %b", (void*)&int16_val, sizeof(int16_val));
|
||||||
this->write_bytes_to_buffer(this,&int16_val,sizeof(u_int16_t));
|
write_bytes_to_buffer(this, &int16_val, sizeof(u_int16_t));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case U_INT_32:
|
case U_INT_32:
|
||||||
{
|
{
|
||||||
u_int32_t int32_val = htonl(*((u_int32_t*)(this->data_struct + offset)));
|
u_int32_t int32_val = htonl(*((u_int32_t*)(this->data_struct + offset)));
|
||||||
DBG3(DBG_ENC, " => %b", (void*)&int32_val, sizeof(int32_val));
|
DBG3(DBG_ENC, " => %b", (void*)&int32_val, sizeof(int32_val));
|
||||||
this->write_bytes_to_buffer(this,&int32_val,sizeof(u_int32_t));
|
write_bytes_to_buffer(this, &int32_val, sizeof(u_int32_t));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case U_INT_64:
|
case U_INT_64:
|
||||||
@@ -415,15 +369,15 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t
|
|||||||
(void*)&int32_val_low, sizeof(int32_val_low),
|
(void*)&int32_val_low, sizeof(int32_val_low),
|
||||||
(void*)&int32_val_high, sizeof(int32_val_high));
|
(void*)&int32_val_high, sizeof(int32_val_high));
|
||||||
/* TODO add support for big endian machines */
|
/* TODO add support for big endian machines */
|
||||||
this->write_bytes_to_buffer(this,&int32_val_high,sizeof(u_int32_t));
|
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));
|
write_bytes_to_buffer(this, &int32_val_low, sizeof(u_int32_t));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case IKE_SPI:
|
case IKE_SPI:
|
||||||
{
|
{
|
||||||
/* 64 bit are written as they come :-) */
|
/* 64 bit are written as they come :-) */
|
||||||
this->write_bytes_to_buffer(this,(this->data_struct + offset),sizeof(u_int64_t));
|
write_bytes_to_buffer(this, this->data_struct + offset, sizeof(u_int64_t));
|
||||||
DBG3(DBG_ENC, " => %b", (void*)(this->data_struct + offset), sizeof(u_int64_t));
|
DBG3(DBG_ENC, " => %b", (void*)(this->data_struct + offset), sizeof(u_int64_t));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -437,9 +391,9 @@ static void generate_u_int_type (private_generator_t *this,encoding_type_t int_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.generate_reserved_field.
|
* Generate a reserved bit or byte
|
||||||
*/
|
*/
|
||||||
static void generate_reserved_field(private_generator_t *this,int bits)
|
static void generate_reserved_field(private_generator_t *this, int bits)
|
||||||
{
|
{
|
||||||
/* only one bit or 8 bit fields are supported */
|
/* only one bit or 8 bit fields are supported */
|
||||||
if ((bits != 1) && (bits != 8))
|
if ((bits != 1) && (bits != 8))
|
||||||
@@ -448,7 +402,7 @@ static void generate_reserved_field(private_generator_t *this,int bits)
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
/* make sure enough space is available in buffer */
|
/* make sure enough space is available in buffer */
|
||||||
this->make_space_available(this,bits);
|
make_space_available(this, bits);
|
||||||
|
|
||||||
if (bits == 1)
|
if (bits == 1)
|
||||||
{
|
{
|
||||||
@@ -460,8 +414,6 @@ static void generate_reserved_field(private_generator_t *this,int bits)
|
|||||||
/* memory must be zero */
|
/* memory must be zero */
|
||||||
*(this->out_position) = 0x00;
|
*(this->out_position) = 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
this->current_bit++;
|
this->current_bit++;
|
||||||
if (this->current_bit >= 8)
|
if (this->current_bit >= 8)
|
||||||
{
|
{
|
||||||
@@ -484,9 +436,9 @@ static void generate_reserved_field(private_generator_t *this,int bits)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.generate_flag.
|
* Generate a FLAG filed
|
||||||
*/
|
*/
|
||||||
static void generate_flag (private_generator_t *this,u_int32_t offset)
|
static void generate_flag(private_generator_t *this, u_int32_t offset)
|
||||||
{
|
{
|
||||||
/* value of current flag */
|
/* value of current flag */
|
||||||
u_int8_t flag_value;
|
u_int8_t flag_value;
|
||||||
@@ -499,7 +451,7 @@ static void generate_flag (private_generator_t *this,u_int32_t offset)
|
|||||||
flag = (flag_value << (7 - this->current_bit));
|
flag = (flag_value << (7 - this->current_bit));
|
||||||
|
|
||||||
/* make sure one bit is available in buffer */
|
/* make sure one bit is available in buffer */
|
||||||
this->make_space_available(this,1);
|
make_space_available(this, 1);
|
||||||
if (this->current_bit == 0)
|
if (this->current_bit == 0)
|
||||||
{
|
{
|
||||||
/* memory must be zero */
|
/* memory must be zero */
|
||||||
@@ -520,9 +472,9 @@ static void generate_flag (private_generator_t *this,u_int32_t offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of private_generator_t.generate_from_chunk.
|
* Generates a bytestream from a chunk_t.
|
||||||
*/
|
*/
|
||||||
static void generate_from_chunk (private_generator_t *this,u_int32_t offset)
|
static void generate_from_chunk(private_generator_t *this, u_int32_t offset)
|
||||||
{
|
{
|
||||||
if (this->current_bit != 0)
|
if (this->current_bit != 0)
|
||||||
{
|
{
|
||||||
@@ -536,73 +488,7 @@ static void generate_from_chunk (private_generator_t *this,u_int32_t offset)
|
|||||||
DBG3(DBG_ENC, " => %B", attribute_value);
|
DBG3(DBG_ENC, " => %B", attribute_value);
|
||||||
|
|
||||||
/* use write_bytes_to_buffer function to do the job */
|
/* use write_bytes_to_buffer function to do the job */
|
||||||
this->write_bytes_to_buffer(this,attribute_value->ptr,attribute_value->len);
|
write_bytes_to_buffer(this, attribute_value->ptr, attribute_value->len);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of private_generator_t.make_space_available.
|
|
||||||
*/
|
|
||||||
static void make_space_available (private_generator_t *this, size_t bits)
|
|
||||||
{
|
|
||||||
while (((this->get_current_buffer_space(this) * 8) - this->current_bit) < bits)
|
|
||||||
{
|
|
||||||
/* must increase buffer */
|
|
||||||
size_t old_buffer_size = this->get_current_buffer_size(this);
|
|
||||||
size_t new_buffer_size = old_buffer_size + GENERATOR_DATA_BUFFER_INCREASE_VALUE;
|
|
||||||
size_t out_position_offset = ((this->out_position) - (this->buffer));
|
|
||||||
|
|
||||||
DBG2(DBG_ENC, "increased gen buffer from %d to %d byte",
|
|
||||||
old_buffer_size, new_buffer_size);
|
|
||||||
|
|
||||||
/* Reallocate space for new buffer */
|
|
||||||
this->buffer = realloc(this->buffer,new_buffer_size);
|
|
||||||
|
|
||||||
this->out_position = (this->buffer + out_position_offset);
|
|
||||||
this->roof_position = (this->buffer + new_buffer_size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of private_generator_t.write_bytes_to_buffer.
|
|
||||||
*/
|
|
||||||
static void write_bytes_to_buffer (private_generator_t *this,void * bytes, size_t number_of_bytes)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
u_int8_t *read_position = (u_int8_t *) bytes;
|
|
||||||
|
|
||||||
this->make_space_available(this,number_of_bytes * 8);
|
|
||||||
|
|
||||||
for (i = 0; i < number_of_bytes; i++)
|
|
||||||
{
|
|
||||||
*(this->out_position) = *(read_position);
|
|
||||||
read_position++;
|
|
||||||
this->out_position++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of private_generator_t.write_bytes_to_buffer_at_offset.
|
|
||||||
*/
|
|
||||||
static void write_bytes_to_buffer_at_offset (private_generator_t *this,void * bytes,size_t number_of_bytes,u_int32_t offset)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
u_int8_t *read_position = (u_int8_t *) bytes;
|
|
||||||
u_int8_t *write_position;
|
|
||||||
u_int32_t free_space_after_offset = (this->get_current_buffer_size(this) - offset);
|
|
||||||
|
|
||||||
/* check first if enough space for new data is available */
|
|
||||||
if (number_of_bytes > free_space_after_offset)
|
|
||||||
{
|
|
||||||
this->make_space_available(this,(number_of_bytes - free_space_after_offset) * 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
write_position = this->buffer + offset;
|
|
||||||
for (i = 0; i < number_of_bytes; i++)
|
|
||||||
{
|
|
||||||
*(write_position) = *(read_position);
|
|
||||||
read_position++;
|
|
||||||
write_position++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -610,14 +496,15 @@ static void write_bytes_to_buffer_at_offset (private_generator_t *this,void * by
|
|||||||
*/
|
*/
|
||||||
static void write_to_chunk (private_generator_t *this,chunk_t *data)
|
static void write_to_chunk (private_generator_t *this,chunk_t *data)
|
||||||
{
|
{
|
||||||
size_t data_length = this->get_current_data_length(this);
|
size_t data_length = get_current_data_length(this);
|
||||||
u_int32_t header_length_field = data_length;
|
u_int32_t header_length_field = data_length;
|
||||||
|
|
||||||
/* write length into header length field */
|
/* write length into header length field */
|
||||||
if (this->header_length_position_offset > 0)
|
if (this->header_length_position_offset > 0)
|
||||||
{
|
{
|
||||||
u_int32_t int32_val = htonl(header_length_field);
|
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);
|
write_bytes_to_buffer_at_offset(this, &int32_val, sizeof(u_int32_t),
|
||||||
|
this->header_length_position_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->current_bit > 0)
|
if (this->current_bit > 0)
|
||||||
@@ -660,7 +547,6 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
i, encoding_type_names, rules[i].type);
|
i, encoding_type_names, rules[i].type);
|
||||||
switch (rules[i].type)
|
switch (rules[i].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_4:
|
||||||
case U_INT_8:
|
case U_INT_8:
|
||||||
case U_INT_16:
|
case U_INT_16:
|
||||||
@@ -671,56 +557,56 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
case ATTRIBUTE_TYPE:
|
case ATTRIBUTE_TYPE:
|
||||||
case CONFIGURATION_ATTRIBUTE_LENGTH:
|
case CONFIGURATION_ATTRIBUTE_LENGTH:
|
||||||
{
|
{
|
||||||
this->generate_u_int_type(this,rules[i].type,rules[i].offset);
|
generate_u_int_type(this, rules[i].type,rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RESERVED_BIT:
|
case RESERVED_BIT:
|
||||||
{
|
{
|
||||||
this->generate_reserved_field(this,1);
|
generate_reserved_field(this, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case RESERVED_BYTE:
|
case RESERVED_BYTE:
|
||||||
{
|
{
|
||||||
this->generate_reserved_field(this,8);
|
generate_reserved_field(this, 8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FLAG:
|
case FLAG:
|
||||||
{
|
{
|
||||||
this->generate_flag(this,rules[i].offset);
|
generate_flag(this, rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PAYLOAD_LENGTH:
|
case PAYLOAD_LENGTH:
|
||||||
{
|
{
|
||||||
/* position of payload lenght field is temporary stored */
|
/* position of payload lenght field is temporary stored */
|
||||||
this->last_payload_length_position_offset = this->get_current_buffer_offset(this);
|
this->last_payload_length_position_offset = get_current_buffer_offset(this);
|
||||||
/* payload length is generated like an U_INT_16 */
|
/* payload length is generated like an U_INT_16 */
|
||||||
this->generate_u_int_type(this,U_INT_16,rules[i].offset);
|
generate_u_int_type(this, U_INT_16,rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case HEADER_LENGTH:
|
case HEADER_LENGTH:
|
||||||
{
|
{
|
||||||
/* position of header length field is temporary stored */
|
/* position of header length field is temporary stored */
|
||||||
this->header_length_position_offset = this->get_current_buffer_offset(this);
|
this->header_length_position_offset = get_current_buffer_offset(this);
|
||||||
/* header length is generated like an U_INT_32 */
|
/* header length is generated like an U_INT_32 */
|
||||||
this->generate_u_int_type(this,U_INT_32,rules[i].offset);
|
generate_u_int_type(this ,U_INT_32, rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPI_SIZE:
|
case SPI_SIZE:
|
||||||
/* spi size is handled as 8 bit unsigned integer */
|
/* spi size is handled as 8 bit unsigned integer */
|
||||||
this->generate_u_int_type(this,U_INT_8,rules[i].offset);
|
generate_u_int_type(this, U_INT_8, rules[i].offset);
|
||||||
/* last spi size is temporary stored */
|
/* last spi size is temporary stored */
|
||||||
this->last_spi_size = *((u_int8_t *)(this->data_struct + rules[i].offset));
|
this->last_spi_size = *((u_int8_t *)(this->data_struct + rules[i].offset));
|
||||||
break;
|
break;
|
||||||
case ADDRESS:
|
case ADDRESS:
|
||||||
{
|
{
|
||||||
/* the Address value is generated from chunk */
|
/* the Address value is generated from chunk */
|
||||||
this->generate_from_chunk(this,rules[i].offset);
|
generate_from_chunk(this, rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPI:
|
case SPI:
|
||||||
{
|
{
|
||||||
/* the SPI value is generated from chunk */
|
/* the SPI value is generated from chunk */
|
||||||
this->generate_from_chunk(this,rules[i].offset);
|
generate_from_chunk(this, rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KEY_EXCHANGE_DATA:
|
case KEY_EXCHANGE_DATA:
|
||||||
@@ -780,7 +666,7 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* the data value is generated from chunk */
|
/* the data value is generated from chunk */
|
||||||
this->generate_from_chunk(this,rules[i].offset);
|
generate_from_chunk(this, rules[i].offset);
|
||||||
|
|
||||||
payload_length_position_offset = this->last_payload_length_position_offset;
|
payload_length_position_offset = this->last_payload_length_position_offset;
|
||||||
|
|
||||||
@@ -789,7 +675,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
length_of_payload = header_length + ((chunk_t *)(this->data_struct + rules[i].offset))->len;
|
length_of_payload = header_length + ((chunk_t *)(this->data_struct + rules[i].offset))->len;
|
||||||
|
|
||||||
length_in_network_order = htons(length_of_payload);
|
length_in_network_order = htons(length_of_payload);
|
||||||
this->write_bytes_to_buffer_at_offset(this,&length_in_network_order,sizeof(u_int16_t),payload_length_position_offset);
|
write_bytes_to_buffer_at_offset(this, &length_in_network_order,
|
||||||
|
sizeof(u_int16_t),payload_length_position_offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PROPOSALS:
|
case PROPOSALS:
|
||||||
@@ -812,9 +699,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
u_int32_t before_generate_position_offset;
|
u_int32_t before_generate_position_offset;
|
||||||
u_int32_t after_generate_position_offset;
|
u_int32_t after_generate_position_offset;
|
||||||
|
|
||||||
before_generate_position_offset = this->get_current_buffer_offset(this);
|
before_generate_position_offset = get_current_buffer_offset(this);
|
||||||
this->public.generate_payload(&(this->public),current_proposal);
|
this->public.generate_payload(&(this->public),current_proposal);
|
||||||
after_generate_position_offset = this->get_current_buffer_offset(this);
|
after_generate_position_offset = get_current_buffer_offset(this);
|
||||||
|
|
||||||
/* increase size of transform */
|
/* increase size of transform */
|
||||||
length_of_sa_payload += (after_generate_position_offset - before_generate_position_offset);
|
length_of_sa_payload += (after_generate_position_offset - before_generate_position_offset);
|
||||||
@@ -822,7 +709,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
iterator->destroy(iterator);
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
int16_val = htons(length_of_sa_payload);
|
int16_val = htons(length_of_sa_payload);
|
||||||
this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset);
|
write_bytes_to_buffer_at_offset(this, &int16_val,
|
||||||
|
sizeof(u_int16_t),payload_length_position_offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TRANSFORMS:
|
case TRANSFORMS:
|
||||||
@@ -842,9 +730,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
u_int32_t before_generate_position_offset;
|
u_int32_t before_generate_position_offset;
|
||||||
u_int32_t after_generate_position_offset;
|
u_int32_t after_generate_position_offset;
|
||||||
|
|
||||||
before_generate_position_offset = this->get_current_buffer_offset(this);
|
before_generate_position_offset = get_current_buffer_offset(this);
|
||||||
this->public.generate_payload(&(this->public),current_transform);
|
this->public.generate_payload(&(this->public),current_transform);
|
||||||
after_generate_position_offset = this->get_current_buffer_offset(this);
|
after_generate_position_offset = get_current_buffer_offset(this);
|
||||||
|
|
||||||
/* increase size of transform */
|
/* increase size of transform */
|
||||||
length_of_proposal += (after_generate_position_offset - before_generate_position_offset);
|
length_of_proposal += (after_generate_position_offset - before_generate_position_offset);
|
||||||
@@ -853,7 +741,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
iterator->destroy(iterator);
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
int16_val = htons(length_of_proposal);
|
int16_val = htons(length_of_proposal);
|
||||||
this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),payload_length_position_offset);
|
write_bytes_to_buffer_at_offset(this, &int16_val,
|
||||||
|
sizeof(u_int16_t), payload_length_position_offset);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -874,9 +763,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
u_int32_t before_generate_position_offset;
|
u_int32_t before_generate_position_offset;
|
||||||
u_int32_t after_generate_position_offset;
|
u_int32_t after_generate_position_offset;
|
||||||
|
|
||||||
before_generate_position_offset = this->get_current_buffer_offset(this);
|
before_generate_position_offset = get_current_buffer_offset(this);
|
||||||
this->public.generate_payload(&(this->public),current_attribute);
|
this->public.generate_payload(&(this->public),current_attribute);
|
||||||
after_generate_position_offset = this->get_current_buffer_offset(this);
|
after_generate_position_offset = get_current_buffer_offset(this);
|
||||||
|
|
||||||
/* increase size of transform */
|
/* increase size of transform */
|
||||||
length_of_transform += (after_generate_position_offset - before_generate_position_offset);
|
length_of_transform += (after_generate_position_offset - before_generate_position_offset);
|
||||||
@@ -885,7 +774,8 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
iterator->destroy(iterator);
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
int16_val = htons(length_of_transform);
|
int16_val = htons(length_of_transform);
|
||||||
this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),transform_length_position_offset);
|
write_bytes_to_buffer_at_offset(this, &int16_val,
|
||||||
|
sizeof(u_int16_t),transform_length_position_offset);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -906,9 +796,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
u_int32_t before_generate_position_offset;
|
u_int32_t before_generate_position_offset;
|
||||||
u_int32_t after_generate_position_offset;
|
u_int32_t after_generate_position_offset;
|
||||||
|
|
||||||
before_generate_position_offset = this->get_current_buffer_offset(this);
|
before_generate_position_offset = get_current_buffer_offset(this);
|
||||||
this->public.generate_payload(&(this->public),current_attribute);
|
this->public.generate_payload(&(this->public),current_attribute);
|
||||||
after_generate_position_offset = this->get_current_buffer_offset(this);
|
after_generate_position_offset = get_current_buffer_offset(this);
|
||||||
|
|
||||||
/* increase size of transform */
|
/* increase size of transform */
|
||||||
length_of_configurations += (after_generate_position_offset - before_generate_position_offset);
|
length_of_configurations += (after_generate_position_offset - before_generate_position_offset);
|
||||||
@@ -917,13 +807,14 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
iterator->destroy(iterator);
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
int16_val = htons(length_of_configurations);
|
int16_val = htons(length_of_configurations);
|
||||||
this->write_bytes_to_buffer_at_offset(this,&int16_val,sizeof(u_int16_t),configurations_length_position_offset);
|
write_bytes_to_buffer_at_offset(this, &int16_val,
|
||||||
|
sizeof(u_int16_t),configurations_length_position_offset);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ATTRIBUTE_FORMAT:
|
case ATTRIBUTE_FORMAT:
|
||||||
{
|
{
|
||||||
this->generate_flag(this,rules[i].offset);
|
generate_flag(this, rules[i].offset);
|
||||||
/* Attribute format is a flag which is stored in context*/
|
/* Attribute format is a flag which is stored in context*/
|
||||||
this->attribute_format = *((bool *) (this->data_struct + rules[i].offset));
|
this->attribute_format = *((bool *) (this->data_struct + rules[i].offset));
|
||||||
break;
|
break;
|
||||||
@@ -933,13 +824,13 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
{
|
{
|
||||||
if (this->attribute_format == FALSE)
|
if (this->attribute_format == FALSE)
|
||||||
{
|
{
|
||||||
this->generate_u_int_type(this,U_INT_16,rules[i].offset);
|
generate_u_int_type(this, U_INT_16, rules[i].offset);
|
||||||
/* this field hold the length of the attribute */
|
/* this field hold the length of the attribute */
|
||||||
this->attribute_length = *((u_int16_t *)(this->data_struct + rules[i].offset));
|
this->attribute_length = *((u_int16_t *)(this->data_struct + rules[i].offset));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->generate_u_int_type(this,U_INT_16,rules[i].offset);
|
generate_u_int_type(this, U_INT_16, rules[i].offset);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -949,7 +840,7 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
{
|
{
|
||||||
DBG2(DBG_ENC, "attribute value has not fixed size");
|
DBG2(DBG_ENC, "attribute value has not fixed size");
|
||||||
/* the attribute value is generated */
|
/* the attribute value is generated */
|
||||||
this->generate_from_chunk(this,rules[i].offset);
|
generate_from_chunk(this, rules[i].offset);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -973,9 +864,9 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
u_int32_t before_generate_position_offset;
|
u_int32_t before_generate_position_offset;
|
||||||
u_int32_t after_generate_position_offset;
|
u_int32_t after_generate_position_offset;
|
||||||
|
|
||||||
before_generate_position_offset = this->get_current_buffer_offset(this);
|
before_generate_position_offset = get_current_buffer_offset(this);
|
||||||
this->public.generate_payload(&(this->public),current_traffic_selector_substructure);
|
this->public.generate_payload(&(this->public),current_traffic_selector_substructure);
|
||||||
after_generate_position_offset = this->get_current_buffer_offset(this);
|
after_generate_position_offset = get_current_buffer_offset(this);
|
||||||
|
|
||||||
/* increase size of transform */
|
/* increase size of transform */
|
||||||
length_of_ts_payload += (after_generate_position_offset - before_generate_position_offset);
|
length_of_ts_payload += (after_generate_position_offset - before_generate_position_offset);
|
||||||
@@ -983,13 +874,14 @@ static void generate_payload (private_generator_t *this,payload_t *payload)
|
|||||||
iterator->destroy(iterator);
|
iterator->destroy(iterator);
|
||||||
|
|
||||||
int16_val = htons(length_of_ts_payload);
|
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);
|
write_bytes_to_buffer_at_offset(this, &int16_val,
|
||||||
|
sizeof(u_int16_t),payload_length_position_offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ENCRYPTED_DATA:
|
case ENCRYPTED_DATA:
|
||||||
{
|
{
|
||||||
this->generate_from_chunk(this, rules[i].offset);
|
generate_from_chunk(this, rules[i].offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -1028,21 +920,6 @@ generator_t *generator_create()
|
|||||||
this->public.destroy = (void(*)(generator_t*)) destroy;
|
this->public.destroy = (void(*)(generator_t*)) destroy;
|
||||||
this->public.write_to_chunk = (void (*) (generator_t *,chunk_t *)) write_to_chunk;
|
this->public.write_to_chunk = (void (*) (generator_t *,chunk_t *)) write_to_chunk;
|
||||||
|
|
||||||
|
|
||||||
/* initiate private functions */
|
|
||||||
this->get_current_buffer_size = get_current_buffer_size;
|
|
||||||
this->get_current_buffer_space = get_current_buffer_space;
|
|
||||||
this->get_current_data_length = get_current_data_length;
|
|
||||||
this->get_current_buffer_offset = get_current_buffer_offset;
|
|
||||||
this->generate_u_int_type = generate_u_int_type;
|
|
||||||
this->generate_reserved_field = generate_reserved_field;
|
|
||||||
this->generate_flag = generate_flag;
|
|
||||||
this->generate_from_chunk = generate_from_chunk;
|
|
||||||
this->make_space_available = make_space_available;
|
|
||||||
this->write_bytes_to_buffer = write_bytes_to_buffer;
|
|
||||||
this->write_bytes_to_buffer_at_offset = write_bytes_to_buffer_at_offset;
|
|
||||||
|
|
||||||
|
|
||||||
/* allocate memory for buffer */
|
/* allocate memory for buffer */
|
||||||
this->buffer = malloc(GENERATOR_DATA_BUFFER_SIZE);
|
this->buffer = malloc(GENERATOR_DATA_BUFFER_SIZE);
|
||||||
|
|
||||||
@@ -1056,3 +933,4 @@ generator_t *generator_create()
|
|||||||
|
|
||||||
return &(this->public);
|
return &(this->public);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ typedef struct generator_t generator_t;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generating is done in a data buffer.
|
* Generating is done in a data buffer.
|
||||||
* This is thehe start size of this buffer in bytes.
|
* This is the start size of this buffer in bytes.
|
||||||
*/
|
*/
|
||||||
#define GENERATOR_DATA_BUFFER_SIZE 500
|
#define GENERATOR_DATA_BUFFER_SIZE 500
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of bytes to increase the buffer, if it is to small.
|
* Number of bytes to increase the buffer, if it is too small.
|
||||||
*/
|
*/
|
||||||
#define GENERATOR_DATA_BUFFER_INCREASE_VALUE 500
|
#define GENERATOR_DATA_BUFFER_INCREASE_VALUE 500
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user