⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aodv_timeout.c

📁 aodv协议的实现 使用linux环境下的c++编写
💻 C
字号:
/***************************************************************************** * * Copyright (C) 2001 Uppsala University and Ericsson AB. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * Authors: Erik Nordstr鰉, <erik.nordstrom@it.uu.se> *           * *****************************************************************************/#include <time.h>#ifdef NS_PORT#include "aodv-uu.h"#else#include "defs.h"#include "aodv_timeout.h"#include "aodv_socket.h"#include "aodv_neighbor.h"#include "aodv_rreq.h"#include "aodv_hello.h"#include "aodv_rerr.h"#include "timer_queue.h"#include "debug.h"#include "params.h"#include "routing_table.h"#include "packet_queue.h"#include "k_route.h"#include "seek_list.h"#include "icmp.h"extern int expanding_ring_search, local_repair;void route_delete_timeout(void *arg);#endif/* These are timeout functions which are called when timers expire... */void NS_CLASS route_discovery_timeout(void *arg){    struct timeval now;    seek_list_t *seek_entry;    rt_table_t *rt, *repair_rt;    seek_entry = (seek_list_t *) arg;#define TTL_VALUE seek_entry->ttl    /* Sanity check... */    if (!seek_entry)	return;    gettimeofday(&now, NULL);    DEBUG(LOG_DEBUG, 0, "%s", ip_to_str(seek_entry->dest_addr));    if (seek_entry->reqs < RREQ_RETRIES) {	if (expanding_ring_search) {	    if (TTL_VALUE < TTL_THRESHOLD)		TTL_VALUE += TTL_INCREMENT;	    else {		TTL_VALUE = NET_DIAMETER;		seek_entry->reqs++;	    }	    /* Set a new timer for seeking this destination */	    timer_set_timeout(&seek_entry->seek_timer, RING_TRAVERSAL_TIME);	} else {	    seek_entry->reqs++;	    timer_set_timeout(&seek_entry->seek_timer, 			      seek_entry->reqs * 2 * NET_TRAVERSAL_TIME);	}	/* AODV should use a binary exponential backoff RREP waiting           time. */	DEBUG(LOG_DEBUG, 0, "Seeking %s ttl=%d wait=%d",	      ip_to_str(seek_entry->dest_addr),	      TTL_VALUE, 2 * TTL_VALUE * NODE_TRAVERSAL_TIME);	/* A routing table entry waiting for a RREP should not be expunged	   before 2 * NET_TRAVERSAL_TIME... */	rt = rt_table_find(seek_entry->dest_addr);	if (rt && timeval_diff(&rt->rt_timer.timeout, &now) <	    (2 * NET_TRAVERSAL_TIME))	    rt_table_update_timeout(rt, 2 * NET_TRAVERSAL_TIME);	rreq_send(seek_entry->dest_addr, seek_entry->dest_seqno,		  TTL_VALUE, seek_entry->flags);    } else {	DEBUG(LOG_DEBUG, 0, "NO ROUTE FOUND!");	packet_queue_set_verdict(seek_entry->dest_addr, PQ_DROP);#ifndef NS_PORT	/* Send an ICMP Destination Host Unreachable to the application: */	if (seek_entry->ipd)	    icmp_send_host_unreachable(seek_entry->ipd->data,				       seek_entry->ipd->len);#endif	repair_rt = rt_table_find(seek_entry->dest_addr);	seek_list_remove(seek_entry);	/* If this route has been in repair, then we should timeout	   the route at this point. */	if (repair_rt && (repair_rt->flags & RT_REPAIR)) {	    DEBUG(LOG_DEBUG, 0, "REPAIR for %s failed!",		  ip_to_str(repair_rt->dest_addr));	    local_repair_timeout(repair_rt);	}    }}void NS_CLASS local_repair_timeout(void *arg){    rt_table_t *rt;    struct in_addr rerr_dest;     RERR *rerr = NULL;        rt = (rt_table_t *) arg;    if (!rt)	return;    rerr_dest.s_addr = AODV_BROADCAST; /* Default destination */        /* Unset the REPAIR flag */    rt->flags &= ~RT_REPAIR;    /* Route should already be invalidated. */    if (rt->nprec) {	rerr = rerr_create(0, rt->dest_addr, rt->dest_seqno);	if (rt->nprec == 1) {	    rerr_dest = FIRST_PREC(rt->precursors)->neighbor;	    aodv_socket_send((AODV_msg *) rerr, rerr_dest, 			     RERR_CALC_SIZE(rerr), 1,			     &DEV_IFINDEX(rt->ifindex));	} else {	    int i;	    for (i = 0; i < MAX_NR_INTERFACES; i++) {		if (!DEV_NR(i).enabled)		    continue;		aodv_socket_send((AODV_msg *) rerr, rerr_dest,				 RERR_CALC_SIZE(rerr), 1, &DEV_NR(i));	    }	}	DEBUG(LOG_DEBUG, 0, "Sending RERR about %s to %s",	      ip_to_str(rt->dest_addr), ip_to_str(rerr_dest));    }    precursor_list_destroy(rt);    /* Purge any packets that may be queued */    packet_queue_set_verdict(rt->dest_addr, PQ_DROP);    rt->rt_timer.handler = &NS_CLASS route_delete_timeout;    timer_set_timeout(&rt->rt_timer, DELETE_PERIOD);    DEBUG(LOG_DEBUG, 0, "%s removed in %u msecs",	  ip_to_str(rt->dest_addr), DELETE_PERIOD);}void NS_CLASS route_expire_timeout(void *arg){    rt_table_t *rt;    rt = (rt_table_t *) arg;    if (!rt) {	alog(LOG_WARNING, 0, __FUNCTION__, "arg was NULL, ignoring timeout!");	return;    }    DEBUG(LOG_DEBUG, 0, "Route %s DOWN, seqno=%d",	  ip_to_str(rt->dest_addr), rt->dest_seqno);    if (rt->hcnt == 1)	neighbor_link_break(rt);    else {	rt_table_invalidate(rt);	precursor_list_destroy(rt);    }    return;}void NS_CLASS route_delete_timeout(void *arg){    rt_table_t *rt;    rt = (rt_table_t *) arg;    /* Sanity check: */    if (!rt)	return;    DEBUG(LOG_DEBUG, 0, "%s", ip_to_str(rt->dest_addr));    rt_table_delete(rt);}/* This is called when we stop receiveing hello messages from a   node. For now this is basically the same as a route timeout. */void NS_CLASS hello_timeout(void *arg){    rt_table_t *rt;    struct timeval now;    rt = (rt_table_t *) arg;        if (!rt)	return;    gettimeofday(&now, NULL);    DEBUG(LOG_DEBUG, 0, "LINK/HELLO FAILURE %s last HELLO: %d",	  ip_to_str(rt->dest_addr), timeval_diff(&now, &rt->last_hello_time));    if (rt && rt->state == VALID && !(rt->flags & RT_UNIDIR)) {	/* If the we can repair the route, then mark it to be	   repaired.. */	if (local_repair && rt->hcnt <= MAX_REPAIR_TTL) {	    rt->flags |= RT_REPAIR;	    DEBUG(LOG_DEBUG, 0, "Marking %s for REPAIR",		  ip_to_str(rt->dest_addr));#ifdef NS_PORT	    /* Buffer pending packets from interface queue */	    interfaceQueue((nsaddr_t) rt->dest_addr.s_addr, IFQ_BUFFER);#endif	}	neighbor_link_break(rt);    }}void NS_CLASS rrep_ack_timeout(void *arg){    rt_table_t *rt;    /* We must be really sure here, that this entry really exists at       this point... (Though it should). */    rt = (rt_table_t *) arg;        if (!rt)	return;        /* When a RREP transmission fails (i.e. lack of RREP-ACK), add to       blacklist set... */    rreq_blacklist_insert(rt->dest_addr);    DEBUG(LOG_DEBUG, 0, "%s", ip_to_str(rt->dest_addr));}void NS_CLASS wait_on_reboot_timeout(void *arg){    *((int *) arg) = 0;    DEBUG(LOG_DEBUG, 0, "Wait on reboot over!!");}void NS_CLASS packet_queue_timeout(void *arg){    packet_queue_garbage_collect();    timer_set_timeout(&PQ.garbage_collect_timer, GARBAGE_COLLECT_TIME);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -