* Increase MY_ROUTE_TIMEOUT but real value should be even larger.
* Honor ip::ttl when processing and forwarding RREQs. * Fix obob for when to jump my_hseqno after a reboot. * No longer send fake RREPs in response to HELLO messages. * If we received a RERR message with flag UAODV_RERR_UNKNOWN set then clear flag and set bad routes seqno from our route.
This commit is contained in:
parent
0fa4dd2d37
commit
f528ff9fe2
1 changed files with 15 additions and 29 deletions
|
@ -28,7 +28,7 @@
|
||||||
*
|
*
|
||||||
* This file is part of the Contiki operating system.
|
* This file is part of the Contiki operating system.
|
||||||
*
|
*
|
||||||
* $Id: uaodv.c,v 1.24 2007/05/28 16:41:06 bg- Exp $
|
* $Id: uaodv.c,v 1.25 2007/05/31 10:10:26 bg- Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -55,7 +55,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* This implementation never expires routes!!! */
|
/* This implementation never expires routes!!! */
|
||||||
#define MY_ROUTE_TIMEOUT ((u32_t)~0ul)
|
#define MY_ROUTE_TIMEOUT 0x7fffffff /* Should be 0xffffffff! */
|
||||||
|
#define MY_NET_DIAMETER 20
|
||||||
|
|
||||||
PROCESS(uaodv_process, "uAODV");
|
PROCESS(uaodv_process, "uAODV");
|
||||||
|
|
||||||
|
@ -168,6 +169,7 @@ send_rreq(uip_ipaddr_t *addr)
|
||||||
uip_gethostaddr(&rm->orig_addr);
|
uip_gethostaddr(&rm->orig_addr);
|
||||||
my_hseqno++; /* Always */
|
my_hseqno++; /* Always */
|
||||||
rm->orig_seqno = htonl(my_hseqno);
|
rm->orig_seqno = htonl(my_hseqno);
|
||||||
|
bcastconn->ttl = MY_NET_DIAMETER;
|
||||||
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rreq));
|
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rreq));
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -288,16 +290,15 @@ handle_incoming_rreq(void)
|
||||||
uip_ipaddr_copy(&dest_addr, &rm->dest_addr);
|
uip_ipaddr_copy(&dest_addr, &rm->dest_addr);
|
||||||
uip_ipaddr_copy(&orig_addr, &rm->orig_addr);
|
uip_ipaddr_copy(&orig_addr, &rm->orig_addr);
|
||||||
|
|
||||||
|
my_hseqno++;
|
||||||
if(!(rm->flags & UAODV_RREQ_UNKSEQNO)
|
if(!(rm->flags & UAODV_RREQ_UNKSEQNO)
|
||||||
&& SCMP32(my_hseqno, ntohl(rm->dest_seqno)) < 0) {
|
&& SCMP32(my_hseqno, ntohl(rm->dest_seqno)) < 0) {
|
||||||
print_debug("New my_hseqno %lu\n", my_hseqno); /* We have rebooted. */
|
print_debug("New my_hseqno %lu\n", my_hseqno); /* We have rebooted. */
|
||||||
my_hseqno = ntohl(rm->dest_seqno) + 1;
|
my_hseqno = ntohl(rm->dest_seqno) + 1;
|
||||||
} else {
|
|
||||||
my_hseqno++;
|
|
||||||
}
|
}
|
||||||
net_seqno = htonl(my_hseqno);
|
net_seqno = htonl(my_hseqno);
|
||||||
send_rrep(&dest_addr, &rt->nexthop, &orig_addr, &net_seqno, 0);
|
send_rrep(&dest_addr, &rt->nexthop, &orig_addr, &net_seqno, 0);
|
||||||
} else {
|
} else if(BUF->ttl > 1) {
|
||||||
/* Have we seen this RREQ before? */
|
/* Have we seen this RREQ before? */
|
||||||
if(fwc_lookup(&rm->orig_addr, &rm->rreq_id)) {
|
if(fwc_lookup(&rm->orig_addr, &rm->rreq_id)) {
|
||||||
print_debug("RREQ cached, not fwd\n");
|
print_debug("RREQ cached, not fwd\n");
|
||||||
|
@ -307,6 +308,7 @@ handle_incoming_rreq(void)
|
||||||
|
|
||||||
print_debug("RREQ fwd\n");
|
print_debug("RREQ fwd\n");
|
||||||
rm->hop_count++;
|
rm->hop_count++;
|
||||||
|
bcastconn->ttl = BUF->ttl - 1;
|
||||||
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rreq));
|
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rreq));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -317,26 +319,12 @@ handle_incoming_rrep(void)
|
||||||
struct uaodv_msg_rrep *rm = (struct uaodv_msg_rrep *)uip_appdata;
|
struct uaodv_msg_rrep *rm = (struct uaodv_msg_rrep *)uip_appdata;
|
||||||
struct uaodv_rt_entry *rt;
|
struct uaodv_rt_entry *rt;
|
||||||
|
|
||||||
/*
|
/* Useless HELLO message? */
|
||||||
* Send a fake RREP in response to HELLOs.
|
|
||||||
*/
|
|
||||||
if(uip_ipaddr_cmp(&BUF->destipaddr, &uip_broadcast_addr)) {
|
if(uip_ipaddr_cmp(&BUF->destipaddr, &uip_broadcast_addr)) {
|
||||||
u32_t net_seqno;
|
#if 0
|
||||||
#ifdef CC2420_RADIO
|
/* An option is to send a fake RREP in response. */
|
||||||
int ret = cc2420_check_remote(uip_udp_sender()->u16[1]);
|
|
||||||
|
|
||||||
if(ret == REMOTE_YES) {
|
|
||||||
print_debug("HELLO drop is remote\n");
|
|
||||||
return;
|
|
||||||
} else if (ret == REMOTE_NO) {
|
|
||||||
/* Is neigbour, accept it. */
|
|
||||||
} else if(cc2420_last_rssi < RSSI_THRESHOLD) {
|
|
||||||
print_debug("HELLO drop %d %d\n", cc2420_last_rssi, cc2420_last_correlation);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
net_seqno = htonl(my_hseqno);
|
|
||||||
send_rrep(&uip_hostaddr, &BUF->srcipaddr, &BUF->srcipaddr, &net_seqno, 0);
|
send_rrep(&uip_hostaddr, &BUF->srcipaddr, &BUF->srcipaddr, &net_seqno, 0);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -435,6 +423,10 @@ handle_incoming_rerr(void)
|
||||||
if(rm->flags & UAODV_RERR_UNKNOWN || rm->unreach[0].seqno == 0
|
if(rm->flags & UAODV_RERR_UNKNOWN || rm->unreach[0].seqno == 0
|
||||||
|| SCMP32(rt->hseqno, ntohl(rm->unreach[0].seqno)) <= 0) {
|
|| SCMP32(rt->hseqno, ntohl(rm->unreach[0].seqno)) <= 0) {
|
||||||
rt->is_bad = 1;
|
rt->is_bad = 1;
|
||||||
|
if(rm->flags & UAODV_RERR_UNKNOWN) {
|
||||||
|
rm->flags &= ~UAODV_RERR_UNKNOWN;
|
||||||
|
rm->unreach[0].seqno = htonl(rt->hseqno);
|
||||||
|
}
|
||||||
print_debug("RERR rebroadcast\n");
|
print_debug("RERR rebroadcast\n");
|
||||||
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rerr));
|
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rerr));
|
||||||
}
|
}
|
||||||
|
@ -529,13 +521,7 @@ PROCESS_THREAD(uaodv_process, ev, data)
|
||||||
printf("uaodv_process starting %lu\n", my_hseqno);
|
printf("uaodv_process starting %lu\n", my_hseqno);
|
||||||
|
|
||||||
bcastconn = udp_broadcast_new(HTONS(UAODV_UDPPORT), NULL);
|
bcastconn = udp_broadcast_new(HTONS(UAODV_UDPPORT), NULL);
|
||||||
#ifdef AODV_COMPLIANCE
|
|
||||||
bcastconn->ttl = 6;
|
|
||||||
#else
|
|
||||||
bcastconn->ttl = 1;
|
|
||||||
#endif
|
|
||||||
unicastconn = udp_broadcast_new(HTONS(UAODV_UDPPORT), NULL);
|
unicastconn = udp_broadcast_new(HTONS(UAODV_UDPPORT), NULL);
|
||||||
unicastconn->ttl = 1;
|
|
||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
PROCESS_WAIT_EVENT();
|
PROCESS_WAIT_EVENT();
|
||||||
|
|
Loading…
Reference in a new issue