00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "aodv.h"
00033 #include <string.h>
00034
00035 aodv_chunk_t*
00036 new_aodv_chunk( unsigned int length )
00037 {
00038 aodv_chunk_t* chunk;
00039
00040 chunk = (aodv_chunk_t*) malloc( sizeof(aodv_chunk_t) );
00041 if ( NULL == chunk )
00042 {
00043 return NULL;
00044 }
00045
00046 chunk->length = length;
00047 chunk->next = NULL;
00048 chunk->data = NULL;
00049 if ( length > 0 )
00050 {
00051 chunk->data = (unsigned char*) calloc( length, sizeof(unsigned char) );
00052 if ( NULL == chunk->data )
00053 {
00054 free( chunk );
00055 return NULL;
00056 }
00057 }
00058
00059 return chunk;
00060 }
00061
00062 void
00063 free_aodv_chunk( aodv_chunk_t* chunk )
00064 {
00065 aodv_chunk_t* curr = chunk;
00066 aodv_chunk_t* next;
00067 while ( NULL != curr )
00068 {
00069 next = curr->next;
00070 free( curr->data );
00071 free( curr );
00072 curr = next;
00073 }
00074 }
00075
00076 aodv_chunk_t*
00077 collapse_chunk( const aodv_chunk_t* bigchunk )
00078 {
00079 unsigned char* p_data;
00080 aodv_chunk_t* collapsed;
00081 unsigned int length;
00082 const aodv_chunk_t* curr;
00083
00084 length = 0;
00085 curr = bigchunk;
00086 while ( NULL != curr )
00087 {
00088 length += curr->length;
00089 curr = curr->next;
00090 }
00091
00092 collapsed = new_aodv_chunk( length );
00093 if ( NULL == collapsed )
00094 {
00095 return NULL;
00096 }
00097
00098 curr = bigchunk;
00099 p_data = collapsed->data;
00100 while ( NULL != curr )
00101 {
00102 memcpy(p_data,curr->data,curr->length);
00103 p_data += curr->length;
00104 curr = curr->next;
00105 }
00106
00107 return collapsed;
00108 }