generate_rreq.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 <sys/time.h>
00033 
00034 #include "aodv.h"
00035 
00036 /*
00037  * Entry points.
00038  */
00039 
00040 int
00041 aodv_generate_rreq( aodv_state_t* state, const aodv_addr_t* destination )
00042 {
00043    aodv_rreq_t* request;
00044    aodv_table_entry_t* p_dest_route;
00045 
00046    request = (aodv_rreq_t*) malloc(sizeof(aodv_rreq_t));
00047    if ( NULL == request )
00048    {
00049       return 0;
00050    }
00051 
00052    request->next = NULL;
00053    request->prev = NULL;
00054 
00055    request->destination.length = 0;
00056    request->destination.data = NULL;
00057    set_aodv_addr( &(request->destination), destination );
00058    p_dest_route = aodv_lookup( &(state->routing_table), destination );
00059    if ( NULL == p_dest_route )
00060    {
00061       request->dest_seq = 0;
00062    }
00063    else
00064    {
00065       request->dest_seq = p_dest_route->dest_seq;
00066    }
00067 
00068    request->dest_only_flag = 0;
00069    request->grat_rrep_flag = 1;
00070 
00071    request->hop_count = 0;
00072    request->path = NULL;
00073 
00074    request->originator.data = NULL;
00075    request->originator.length = 0U;
00076    set_aodv_addr( &(request->originator), &(state->self) );
00077    request->orig_seq = aodv_incr_seq(state);
00078    request->rreq_id = aodv_incr_rreq_id(state);
00079    request->ttl = state->params.net_diameter;
00080 
00081    /* buffer now owns memory */
00082    buffer_aodv_rreq( state, request );
00083 
00084    /* If we have not reached the rate cap, broadcast the request. */
00085    if ( aodv_insert_time( state->rreq_time_ring ) )
00086    {
00087       aodv_bcast_rreq( state, request );
00088    }
00089 
00090    return 1;
00091 }
00092 

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