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
1.5.4