-
Notifications
You must be signed in to change notification settings - Fork 46
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Moritz Warning <[email protected]>
- Loading branch information
Showing
47 changed files
with
4,436 additions
and
4,513 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,25 +16,25 @@ | |
* 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öm, <[email protected]> | ||
* | ||
* Authors: Erik Nordstr�m, <[email protected]> | ||
* | ||
* | ||
*****************************************************************************/ | ||
|
||
#ifdef NS_PORT | ||
#include "ns-2/aodv-uu.h" | ||
#else | ||
#include <netinet/in.h> | ||
#include "aodv_hello.h" | ||
#include "aodv_timeout.h" | ||
#include "aodv_rrep.h" | ||
#include "aodv_rreq.h" | ||
#include "routing_table.h" | ||
#include "timer_queue.h" | ||
#include "params.h" | ||
#include "aodv_socket.h" | ||
#include "defs.h" | ||
#include "aodv_timeout.h" | ||
#include "debug.h" | ||
#include "defs.h" | ||
#include "params.h" | ||
#include "routing_table.h" | ||
#include "timer_queue.h" | ||
#include <netinet/in.h> | ||
|
||
extern int unidir_hack, receive_n_hellos, hello_jittering, optimized_hellos; | ||
static struct timer hello_timer; | ||
|
@@ -43,24 +43,23 @@ static struct timer hello_timer; | |
|
||
/* #define DEBUG_HELLO */ | ||
|
||
|
||
long NS_CLASS hello_jitter() | ||
{ | ||
if (hello_jittering) { | ||
#ifdef NS_PORT | ||
return (long) (((float) Random::integer(RAND_MAX + 1) / RAND_MAX - 0.5) | ||
* JITTER_INTERVAL); | ||
return (long)(((float)Random::integer(RAND_MAX + 1) / RAND_MAX - 0.5) * | ||
JITTER_INTERVAL); | ||
#else | ||
return (long) (((float) random() / RAND_MAX - 0.5) * JITTER_INTERVAL); | ||
return (long)(((float)random() / RAND_MAX - 0.5) * JITTER_INTERVAL); | ||
#endif | ||
} else | ||
return 0; | ||
return 0; | ||
} | ||
|
||
void NS_CLASS hello_start() | ||
{ | ||
if (hello_timer.used) | ||
return; | ||
return; | ||
|
||
gettimeofday(&this_host.fwd_time, NULL); | ||
|
||
|
@@ -73,7 +72,7 @@ void NS_CLASS hello_start() | |
void NS_CLASS hello_stop() | ||
{ | ||
DEBUG(LOG_DEBUG, 0, | ||
"No active forwarding routes - stopped sending HELLOs!"); | ||
"No active forwarding routes - stopped sending HELLOs!"); | ||
timer_remove(&hello_timer); | ||
} | ||
|
||
|
@@ -91,9 +90,9 @@ void NS_CLASS hello_send(void *arg) | |
gettimeofday(&now, NULL); | ||
|
||
if (optimized_hellos && | ||
timeval_diff(&now, &this_host.fwd_time) > ACTIVE_ROUTE_TIMEOUT) { | ||
hello_stop(); | ||
return; | ||
timeval_diff(&now, &this_host.fwd_time) > ACTIVE_ROUTE_TIMEOUT) { | ||
hello_stop(); | ||
return; | ||
} | ||
|
||
time_diff = timeval_diff(&now, &this_host.bcast_time); | ||
|
@@ -103,69 +102,68 @@ void NS_CLASS hello_send(void *arg) | |
we have sent other bcast msgs within HELLO_INTERVAL */ | ||
if (time_diff >= HELLO_INTERVAL) { | ||
|
||
for (i = 0; i < MAX_NR_INTERFACES; i++) { | ||
if (!DEV_NR(i).enabled) | ||
continue; | ||
for (i = 0; i < MAX_NR_INTERFACES; i++) { | ||
if (!DEV_NR(i).enabled) | ||
continue; | ||
#ifdef DEBUG_HELLO | ||
DEBUG(LOG_DEBUG, 0, "sending Hello to 255.255.255.255"); | ||
DEBUG(LOG_DEBUG, 0, "sending Hello to 255.255.255.255"); | ||
#endif | ||
rrep = rrep_create(flags, 0, 0, DEV_NR(i).ipaddr, | ||
this_host.seqno, | ||
DEV_NR(i).ipaddr, | ||
ALLOWED_HELLO_LOSS * HELLO_INTERVAL); | ||
|
||
/* Assemble a RREP extension which contain our neighbor set... */ | ||
if (unidir_hack) { | ||
int i; | ||
|
||
if (ext) | ||
ext = AODV_EXT_NEXT(ext); | ||
else | ||
ext = (AODV_ext *) ((char *) rrep + RREP_SIZE); | ||
|
||
ext->type = RREP_HELLO_NEIGHBOR_SET_EXT; | ||
ext->length = 0; | ||
|
||
for (i = 0; i < RT_TABLESIZE; i++) { | ||
list_t *pos; | ||
list_foreach(pos, &rt_tbl.tbl[i]) { | ||
rt_table_t *rt = (rt_table_t *) pos; | ||
/* If an entry has an active hello timer, we assume | ||
that we are receiving hello messages from that | ||
node... */ | ||
if (rt->hello_timer.used) { | ||
rrep = rrep_create(flags, 0, 0, DEV_NR(i).ipaddr, this_host.seqno, | ||
DEV_NR(i).ipaddr, | ||
ALLOWED_HELLO_LOSS * HELLO_INTERVAL); | ||
|
||
/* Assemble a RREP extension which contain our neighbor set... */ | ||
if (unidir_hack) { | ||
int i; | ||
|
||
if (ext) | ||
ext = AODV_EXT_NEXT(ext); | ||
else | ||
ext = (AODV_ext *)((char *)rrep + RREP_SIZE); | ||
|
||
ext->type = RREP_HELLO_NEIGHBOR_SET_EXT; | ||
ext->length = 0; | ||
|
||
for (i = 0; i < RT_TABLESIZE; i++) { | ||
list_t *pos; | ||
list_foreach(pos, &rt_tbl.tbl[i]) | ||
{ | ||
rt_table_t *rt = (rt_table_t *)pos; | ||
/* If an entry has an active hello timer, we assume | ||
that we are receiving hello messages from that | ||
node... */ | ||
if (rt->hello_timer.used) { | ||
#ifdef DEBUG_HELLO | ||
DEBUG(LOG_INFO, 0, | ||
"Adding %s to hello neighbor set ext", | ||
ip_to_str(rt->dest_addr)); | ||
DEBUG(LOG_INFO, 0, | ||
"Adding %s to hello neighbor set ext", | ||
ip_to_str(rt->dest_addr)); | ||
#endif | ||
memcpy(AODV_EXT_DATA(ext), &rt->dest_addr, | ||
sizeof(struct in_addr)); | ||
ext->length += sizeof(struct in_addr); | ||
} | ||
} | ||
} | ||
if (ext->length) | ||
msg_size = RREP_SIZE + AODV_EXT_SIZE(ext); | ||
} | ||
dest.s_addr = AODV_BROADCAST; | ||
aodv_socket_send((AODV_msg *) rrep, dest, msg_size, 1, &DEV_NR(i)); | ||
} | ||
|
||
timer_set_timeout(&hello_timer, HELLO_INTERVAL + jitter); | ||
memcpy(AODV_EXT_DATA(ext), &rt->dest_addr, | ||
sizeof(struct in_addr)); | ||
ext->length += sizeof(struct in_addr); | ||
} | ||
} | ||
} | ||
if (ext->length) | ||
msg_size = RREP_SIZE + AODV_EXT_SIZE(ext); | ||
} | ||
dest.s_addr = AODV_BROADCAST; | ||
aodv_socket_send((AODV_msg *)rrep, dest, msg_size, 1, &DEV_NR(i)); | ||
} | ||
|
||
timer_set_timeout(&hello_timer, HELLO_INTERVAL + jitter); | ||
} else { | ||
if (HELLO_INTERVAL - time_diff + jitter < 0) | ||
timer_set_timeout(&hello_timer, | ||
HELLO_INTERVAL - time_diff - jitter); | ||
else | ||
timer_set_timeout(&hello_timer, | ||
HELLO_INTERVAL - time_diff + jitter); | ||
if (HELLO_INTERVAL - time_diff + jitter < 0) | ||
timer_set_timeout(&hello_timer, | ||
HELLO_INTERVAL - time_diff - jitter); | ||
else | ||
timer_set_timeout(&hello_timer, | ||
HELLO_INTERVAL - time_diff + jitter); | ||
} | ||
} | ||
|
||
|
||
/* Process a hello message */ | ||
void NS_CLASS hello_process(RREP * hello, int rreplen, unsigned int ifindex) | ||
void NS_CLASS hello_process(RREP *hello, int rreplen, unsigned int ifindex) | ||
{ | ||
u_int32_t hello_seqno, timeout, hello_interval = HELLO_INTERVAL; | ||
u_int8_t state, flags = 0; | ||
|
@@ -183,115 +181,115 @@ void NS_CLASS hello_process(RREP * hello, int rreplen, unsigned int ifindex) | |
rt = rt_table_find(hello_dest); | ||
|
||
if (rt) | ||
flags = rt->flags; | ||
flags = rt->flags; | ||
|
||
if (unidir_hack) | ||
flags |= RT_UNIDIR; | ||
flags |= RT_UNIDIR; | ||
|
||
/* Check for hello interval extension: */ | ||
ext = (AODV_ext *) ((char *) hello + RREP_SIZE); | ||
|
||
while (rreplen > (int) RREP_SIZE) { | ||
switch (ext->type) { | ||
case RREP_HELLO_INTERVAL_EXT: | ||
if (ext->length == 4) { | ||
memcpy(&hello_interval, AODV_EXT_DATA(ext), 4); | ||
hello_interval = ntohl(hello_interval); | ||
ext = (AODV_ext *)((char *)hello + RREP_SIZE); | ||
|
||
while (rreplen > (int)RREP_SIZE) { | ||
switch (ext->type) { | ||
case RREP_HELLO_INTERVAL_EXT: | ||
if (ext->length == 4) { | ||
memcpy(&hello_interval, AODV_EXT_DATA(ext), 4); | ||
hello_interval = ntohl(hello_interval); | ||
#ifdef DEBUG_HELLO | ||
DEBUG(LOG_INFO, 0, "Hello extension interval=%lu!", | ||
hello_interval); | ||
DEBUG(LOG_INFO, 0, "Hello extension interval=%lu!", | ||
hello_interval); | ||
#endif | ||
|
||
} else | ||
alog(LOG_WARNING, 0, | ||
__FUNCTION__, "Bad hello interval extension!"); | ||
break; | ||
case RREP_HELLO_NEIGHBOR_SET_EXT: | ||
} else | ||
alog(LOG_WARNING, 0, __FUNCTION__, | ||
"Bad hello interval extension!"); | ||
break; | ||
case RREP_HELLO_NEIGHBOR_SET_EXT: | ||
|
||
#ifdef DEBUG_HELLO | ||
DEBUG(LOG_INFO, 0, "RREP_HELLO_NEIGHBOR_SET_EXT"); | ||
DEBUG(LOG_INFO, 0, "RREP_HELLO_NEIGHBOR_SET_EXT"); | ||
#endif | ||
for (i = 0; i < ext->length; i = i + 4) { | ||
ext_neighbor.s_addr = | ||
*(in_addr_t *) ((char *) AODV_EXT_DATA(ext) + i); | ||
|
||
if (ext_neighbor.s_addr == DEV_IFINDEX(ifindex).ipaddr.s_addr) | ||
flags &= ~RT_UNIDIR; | ||
} | ||
break; | ||
default: | ||
alog(LOG_WARNING, 0, __FUNCTION__, | ||
"Bad extension!! type=%d, length=%d", ext->type, ext->length); | ||
ext = NULL; | ||
break; | ||
} | ||
if (ext == NULL) | ||
break; | ||
|
||
rreplen -= AODV_EXT_SIZE(ext); | ||
ext = AODV_EXT_NEXT(ext); | ||
for (i = 0; i < ext->length; i = i + 4) { | ||
ext_neighbor.s_addr = | ||
*(in_addr_t *)((char *)AODV_EXT_DATA(ext) + i); | ||
|
||
if (ext_neighbor.s_addr == DEV_IFINDEX(ifindex).ipaddr.s_addr) | ||
flags &= ~RT_UNIDIR; | ||
} | ||
break; | ||
default: | ||
alog(LOG_WARNING, 0, __FUNCTION__, | ||
"Bad extension!! type=%d, length=%d", ext->type, ext->length); | ||
ext = NULL; | ||
break; | ||
} | ||
if (ext == NULL) | ||
break; | ||
|
||
rreplen -= AODV_EXT_SIZE(ext); | ||
ext = AODV_EXT_NEXT(ext); | ||
} | ||
|
||
#ifdef DEBUG_HELLO | ||
DEBUG(LOG_DEBUG, 0, "rcvd HELLO from %s, seqno %lu", | ||
ip_to_str(hello_dest), hello_seqno); | ||
DEBUG(LOG_DEBUG, 0, "rcvd HELLO from %s, seqno %lu", ip_to_str(hello_dest), | ||
hello_seqno); | ||
#endif | ||
/* This neighbor should only be valid after receiving 3 | ||
consecutive hello messages... */ | ||
if (receive_n_hellos) | ||
state = INVALID; | ||
state = INVALID; | ||
else | ||
state = VALID; | ||
state = VALID; | ||
|
||
timeout = ALLOWED_HELLO_LOSS * hello_interval + ROUTE_TIMEOUT_SLACK; | ||
|
||
if (!rt) { | ||
/* No active or expired route in the routing table. So we add a | ||
new entry... */ | ||
/* No active or expired route in the routing table. So we add a | ||
new entry... */ | ||
|
||
rt = rt_table_insert(hello_dest, hello_dest, 1, | ||
hello_seqno, timeout, state, flags, ifindex); | ||
rt = rt_table_insert(hello_dest, hello_dest, 1, hello_seqno, timeout, | ||
state, flags, ifindex); | ||
|
||
if (flags & RT_UNIDIR) { | ||
DEBUG(LOG_INFO, 0, "%s new NEIGHBOR, link UNI-DIR", | ||
ip_to_str(rt->dest_addr)); | ||
} else { | ||
DEBUG(LOG_INFO, 0, "%s new NEIGHBOR!", ip_to_str(rt->dest_addr)); | ||
} | ||
rt->hello_cnt = 1; | ||
if (flags & RT_UNIDIR) { | ||
DEBUG(LOG_INFO, 0, "%s new NEIGHBOR, link UNI-DIR", | ||
ip_to_str(rt->dest_addr)); | ||
} else { | ||
DEBUG(LOG_INFO, 0, "%s new NEIGHBOR!", ip_to_str(rt->dest_addr)); | ||
} | ||
rt->hello_cnt = 1; | ||
|
||
} else { | ||
|
||
if ((flags & RT_UNIDIR) && rt->state == VALID && rt->hcnt > 1) { | ||
goto hello_update; | ||
} | ||
|
||
if (receive_n_hellos && rt->hello_cnt < (receive_n_hellos - 1)) { | ||
if (timeval_diff(&now, &rt->last_hello_time) < | ||
(long) (hello_interval + hello_interval / 2)) | ||
rt->hello_cnt++; | ||
else | ||
rt->hello_cnt = 1; | ||
|
||
memcpy(&rt->last_hello_time, &now, sizeof(struct timeval)); | ||
return; | ||
} | ||
rt_table_update(rt, hello_dest, 1, hello_seqno, timeout, VALID, flags); | ||
if ((flags & RT_UNIDIR) && rt->state == VALID && rt->hcnt > 1) { | ||
goto hello_update; | ||
} | ||
|
||
if (receive_n_hellos && rt->hello_cnt < (receive_n_hellos - 1)) { | ||
if (timeval_diff(&now, &rt->last_hello_time) < | ||
(long)(hello_interval + hello_interval / 2)) | ||
rt->hello_cnt++; | ||
else | ||
rt->hello_cnt = 1; | ||
|
||
memcpy(&rt->last_hello_time, &now, sizeof(struct timeval)); | ||
return; | ||
} | ||
rt_table_update(rt, hello_dest, 1, hello_seqno, timeout, VALID, flags); | ||
} | ||
|
||
hello_update: | ||
hello_update: | ||
|
||
hello_update_timeout(rt, &now, ALLOWED_HELLO_LOSS * hello_interval); | ||
return; | ||
} | ||
|
||
#define HELLO_DELAY \ | ||
50 /* The extra time we should allow an hello \ | ||
message to take (due to processing) before \ | ||
assuming lost . */ | ||
|
||
#define HELLO_DELAY 50 /* The extra time we should allow an hello | ||
message to take (due to processing) before | ||
assuming lost . */ | ||
|
||
NS_INLINE void NS_CLASS hello_update_timeout(rt_table_t * rt, | ||
struct timeval *now, long time) | ||
NS_INLINE void NS_CLASS hello_update_timeout(rt_table_t *rt, | ||
struct timeval *now, long time) | ||
{ | ||
timer_set_timeout(&rt->hello_timer, time + HELLO_DELAY); | ||
memcpy(&rt->last_hello_time, now, sizeof(struct timeval)); | ||
|
Oops, something went wrong.