incr_seq.c

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 }

Generated on Mon Mar 24 11:15:45 2008 for Pydtn Simulator by  doxygen 1.5.4