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
00034 int
00035 aodv_add_to_node_list( aodv_node_list_t** path,
00036 const aodv_addr_t* addr,
00037 uint32_t seq )
00038 {
00039 aodv_node_list_t* head = NULL;
00040 aodv_node_list_t* tail = NULL;
00041 aodv_node_list_t* curr = NULL;
00042
00043 curr = (aodv_node_list_t*) malloc( sizeof(aodv_node_list_t) );
00044 if ( NULL == curr )
00045 {
00046 return 0;
00047 }
00048 curr->node.data = NULL;
00049 curr->node.length = 0U;
00050 set_aodv_addr( &(curr->node), addr );
00051 curr->seq = seq;
00052
00053 if ( NULL == *path )
00054 {
00055 curr->next = curr;
00056 curr->prev = curr;
00057 *path = curr;
00058 }
00059 else
00060 {
00061 head = *path;
00062 tail = head->prev;
00063 curr->prev = tail;
00064 curr->next = head;
00065 tail->next = curr;
00066 head->prev = curr;
00067 }
00068
00069 return 1;
00070 }
00071
00072 void
00073 free_aodv_node_list( aodv_node_list_t* head )
00074 {
00075 aodv_node_list_t* curr;
00076 aodv_node_list_t* next;
00077
00078 if ( NULL == head ) return;
00079
00080 curr = head;
00081 do
00082 {
00083 next = curr->next;
00084 if ( NULL != curr->node.data ) free( curr->node.data );
00085 free( curr );
00086 curr = next;
00087 } while ( curr != head );
00088 }
00089
00090 const aodv_node_list_t*
00091 aodv_find_in_node_list( const aodv_node_list_t* nodes,
00092 const aodv_addr_t* addr )
00093 {
00094 const aodv_node_list_t* curr;
00095 if ( NULL == nodes ) return NULL;
00096 curr = nodes;
00097 do
00098 {
00099 if ( 0 == aodv_cmp_addr( &(curr->node), addr ) ) return curr;
00100 curr = curr->next;
00101 } while ( curr != nodes );
00102 return NULL;
00103 }