00001 /* Copyright 2008 Michael Marsh, University of Maryland. 00002 * 00003 * This file is part of pydtn. 00004 * 00005 * pydtn is free software: you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation, either version 3 of the License, or 00008 * (at your option) any later version. 00009 * 00010 * pydtn is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with pydtn. If not, see <http://www.gnu.org/licenses/>. 00017 * 00018 * The views and conclusions contained in the software and documentation 00019 * are those of the authors and should not be interpreted as representing 00020 * official policies, either expressed or implied, of the University 00021 * of Maryland. 00022 * 00023 * pydtn extends and embeds the Python interpreter, which is 00024 * Copyright 2001-2006 Python Software Foundation, All Rights Reserved, 00025 * and is released under the PSF License Agreement. 00026 * 00027 * RANLUX random number generation uses the Boost library, 00028 * Copyright 1994-2006 by various authors (details in individual files), 00029 * which is released under the Boost Software License, Version 1.0. 00030 */ 00031 00032 #include "aodv.h" 00033 00034 uint32_t 00035 aodv_incr_seq_base( uint32_t* seq ) 00036 { 00037 uint32_t temp; 00038 if ( NULL == seq ) 00039 { 00040 return 0; 00041 } 00042 temp = ~(*seq); 00043 if ( 0 == temp ) 00044 { 00045 *seq = 1; 00046 } 00047 else 00048 { 00049 ++(*seq); 00050 } 00051 return *seq; 00052 } 00053 00054 uint32_t 00055 aodv_incr_seq( aodv_state_t* state ) 00056 { 00057 return aodv_incr_seq_base( &(state->sequence_number) ); 00058 } 00059 00060 uint32_t 00061 aodv_incr_rreq_id( aodv_state_t* state ) 00062 { 00063 uint32_t temp; 00064 temp = ~(state->rreq_id); 00065 if ( 0 == temp ) 00066 { 00067 state->rreq_id = 0; 00068 } 00069 else 00070 { 00071 ++(state->rreq_id); 00072 } 00073 return state->rreq_id; 00074 } 00075 00076 /* 00077 * This does what the draft _says_ should be done, but without assuming 00078 * a particular underflow/overflow behavior. 00079 * 00080 */ 00081 char 00082 aodv_cmp_seq( uint32_t a, uint32_t b ) 00083 { 00084 static const uint32_t sign_bit = 1 << 31; 00085 uint32_t diff; 00086 00087 if ( a == b ) return 0; 00088 if ( 0 == a ) return -1; 00089 if ( 0 == b ) return 1; 00090 if ( a > b ) 00091 { 00092 diff = a - b; 00093 return ( diff & sign_bit ) ? -1 : 1; 00094 } 00095 else 00096 { 00097 diff = b - a; 00098 return ( diff & sign_bit ) ? 1 : -1; 00099 } 00100 }
1.5.4