* 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:
bg- 2007-05-31 10:10:26 +00:00
parent 0fa4dd2d37
commit f528ff9fe2

View file

@ -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();