* Add bad hop extension to RREQ messages (#ifdef:ed AODV_BAD_HOP_EXTENSION)
This commit is contained in:
parent
268766e890
commit
cd5b4d0e64
1 changed files with 71 additions and 28 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.28 2007/06/05 10:04:20 bg- Exp $
|
* $Id: uaodv.c,v 1.29 2007/06/28 15:06:56 bg- Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -152,10 +152,47 @@ sendto(const uip_ipaddr_t *dest, const void *buf, int len)
|
||||||
uip_udp_packet_send(unicastconn, buf, len);
|
uip_udp_packet_send(unicastconn, buf, len);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#ifdef AODV_BAD_HOP_EXTENSION
|
||||||
|
static unsigned
|
||||||
|
add_rreq_extensions(void *_p)
|
||||||
|
{
|
||||||
|
struct uaodv_bad_hop_ext *p = _p;
|
||||||
|
uip_ipaddr_t *a = p->addrs;
|
||||||
|
unsigned i, n;
|
||||||
|
|
||||||
|
#define SCALE_RETRANS_THRESHOLD (3*4)
|
||||||
|
|
||||||
|
cc2420_check_remote(0xffff); /* Age table. */
|
||||||
|
n = 0;
|
||||||
|
for (i = 0; i < NNEIGBOURS; i++) {
|
||||||
|
if (neigbours[i].nretrans >= SCALE_RETRANS_THRESHOLD
|
||||||
|
&& neigbours[i].mac != 0xffff) {
|
||||||
|
a->u16[0] = uip_hostaddr.u16[0];
|
||||||
|
a->u16[1] = neigbours[i].mac;
|
||||||
|
n++;
|
||||||
|
if(n == 15)
|
||||||
|
break; /* Avoid buffer overrun */
|
||||||
|
print_debug("BAD HOP %d.%d.%d.%d\t%d\n",
|
||||||
|
uip_ipaddr_to_quad(a), neigbours[i].nretrans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
p->type = RREQ_BAD_HOP_EXT;
|
||||||
|
p->length = 2 + 4*n; /* Two unused bytes + addresses */
|
||||||
|
return 2 + p->length; /* Type + len + extension data */
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define add_rreq_extensions(p) 0 /* Don't add anything */
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_rreq(uip_ipaddr_t *addr)
|
send_rreq(uip_ipaddr_t *addr)
|
||||||
{
|
{
|
||||||
struct uaodv_msg_rreq *rm = (struct uaodv_msg_rreq *)uip_appdata;
|
struct uaodv_msg_rreq *rm = (struct uaodv_msg_rreq *)uip_appdata;
|
||||||
|
int len;
|
||||||
|
|
||||||
print_debug("send RREQ for %d.%d.%d.%d\n", uip_ipaddr_to_quad(addr));
|
print_debug("send RREQ for %d.%d.%d.%d\n", uip_ipaddr_to_quad(addr));
|
||||||
|
|
||||||
|
@ -173,7 +210,9 @@ send_rreq(uip_ipaddr_t *addr)
|
||||||
my_hseqno++; /* Always */
|
my_hseqno++; /* Always */
|
||||||
rm->orig_seqno = htonl(my_hseqno);
|
rm->orig_seqno = htonl(my_hseqno);
|
||||||
bcastconn->ttl = MY_NET_DIAMETER;
|
bcastconn->ttl = MY_NET_DIAMETER;
|
||||||
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rreq));
|
len = sizeof(struct uaodv_msg_rreq);
|
||||||
|
len += add_rreq_extensions(rm + 1);
|
||||||
|
uip_udp_packet_send(bcastconn, rm, len);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
|
@ -253,6 +292,30 @@ handle_incoming_rreq(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef AODV_BAD_HOP_EXTENSION
|
||||||
|
if(uip_len > (sizeof(*rm) + 2)) {
|
||||||
|
struct uaodv_bad_hop_ext *ext = (void *)(uip_appdata + sizeof(*rm));
|
||||||
|
u8_t *end = uip_appdata + uip_len;
|
||||||
|
for(;
|
||||||
|
(u8_t *)ext < end;
|
||||||
|
ext = (void *)((u8_t *)ext + ext->length + 2)) {
|
||||||
|
u8_t *eend = (u8_t *)ext + ext->length;
|
||||||
|
if(eend > end)
|
||||||
|
eend = end;
|
||||||
|
|
||||||
|
if(ext->type == RREQ_BAD_HOP_EXT) {
|
||||||
|
uip_ipaddr_t *a;
|
||||||
|
for(a = ext->addrs; (u8_t *)a < eend; a++) {
|
||||||
|
if(uip_ipaddr_cmp(a, &uip_hostaddr)) {
|
||||||
|
print_debug("BAD_HOP drop\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* AODV_BAD_HOP_EXTENSION */
|
||||||
|
|
||||||
/* New reverse route? */
|
/* New reverse route? */
|
||||||
rt = uaodv_rt_lookup(&rm->orig_addr);
|
rt = uaodv_rt_lookup(&rm->orig_addr);
|
||||||
if(rt == NULL
|
if(rt == NULL
|
||||||
|
@ -302,6 +365,8 @@ handle_incoming_rreq(void)
|
||||||
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 if(BUF->ttl > 1) {
|
} else if(BUF->ttl > 1) {
|
||||||
|
int len;
|
||||||
|
|
||||||
/* 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");
|
||||||
|
@ -312,7 +377,9 @@ 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;
|
bcastconn->ttl = BUF->ttl - 1;
|
||||||
uip_udp_packet_send(bcastconn, rm, sizeof(struct uaodv_msg_rreq));
|
len = sizeof(struct uaodv_msg_rreq);
|
||||||
|
len += add_rreq_extensions(rm + 1);
|
||||||
|
uip_udp_packet_send(bcastconn, rm, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -354,30 +421,6 @@ handle_incoming_rrep(void)
|
||||||
rm->hop_count,
|
rm->hop_count,
|
||||||
uip_ipaddr_to_quad(&rm->orig_addr));
|
uip_ipaddr_to_quad(&rm->orig_addr));
|
||||||
|
|
||||||
#ifdef AODV_BAD_HOP_EXTENSION
|
|
||||||
if(uip_len > (sizeof(*rm) + 2)) {
|
|
||||||
struct uaodv_bad_hop_ext *ext = (void *)(uip_appdata + sizeof(*rm));
|
|
||||||
u8_t *end = uip_appdata + uip_len;
|
|
||||||
for(;
|
|
||||||
(u8_t *)ext < end;
|
|
||||||
ext = (void *)((u8_t *)ext + ext->length + 2)) {
|
|
||||||
u8_t *eend = (u8_t *)ext + ext->length;
|
|
||||||
if(eend > end)
|
|
||||||
eend = end;
|
|
||||||
|
|
||||||
if(ext->type == RREQ_BAD_HOP_EXT) {
|
|
||||||
uip_ipaddr_t *a;
|
|
||||||
for(a = ext->addrs; (u8_t *)a < eend; a++) {
|
|
||||||
if(uip_ipaddr_cmp(a, &uip_hostaddr)) {
|
|
||||||
print_debug("BAD_HOP drop\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* AODV_BAD_HOP_EXTENSION */
|
|
||||||
|
|
||||||
rt = uaodv_rt_lookup(&rm->dest_addr);
|
rt = uaodv_rt_lookup(&rm->dest_addr);
|
||||||
|
|
||||||
/* New forward route? */
|
/* New forward route? */
|
||||||
|
|
Loading…
Reference in a new issue