Fixes imposibility of receiving data when a node not using RPL joins a network

which does.

The RPL header is processed, declared invalid and the packet discarded. This
is fixed by this commit.
This commit is contained in:
lebrush 2013-05-15 12:00:18 +02:00
parent a445c4020d
commit 5bae5e6ffd

View file

@ -52,7 +52,7 @@
* statement. While it would be possible to break the uip_process() * statement. While it would be possible to break the uip_process()
* function into many smaller functions, this would increase the code * function into many smaller functions, this would increase the code
* size because of the overhead of parameter passing and the fact that * size because of the overhead of parameter passing and the fact that
* the optimier would not be as efficient. * the optimizer would not be as efficient.
* *
* The principle is that we have a small buffer, called the uip_buf, * The principle is that we have a small buffer, called the uip_buf,
* in which the device driver puts an incoming packet. The TCP/IP * in which the device driver puts an incoming packet. The TCP/IP
@ -63,7 +63,7 @@
* a byte stream if needed. The application will not be fed with data * a byte stream if needed. The application will not be fed with data
* that is out of sequence. * that is out of sequence.
* *
* If the application whishes to send data to the peer, it should put * If the application wishes to send data to the peer, it should put
* its data into the uip_buf. The uip_appdata pointer points to the * its data into the uip_buf. The uip_appdata pointer points to the
* first available byte. The TCP/IP stack will calculate the * first available byte. The TCP/IP stack will calculate the
* checksums, and fill in the necessary header fields and finally send * checksums, and fill in the necessary header fields and finally send
@ -852,16 +852,24 @@ ext_hdr_options_process(void)
PRINTF("Processing PADN option\n"); PRINTF("Processing PADN option\n");
uip_ext_opt_offset += UIP_EXT_HDR_OPT_PADN_BUF->opt_len + 2; uip_ext_opt_offset += UIP_EXT_HDR_OPT_PADN_BUF->opt_len + 2;
break; break;
#if UIP_CONF_IPV6_RPL
case UIP_EXT_HDR_OPT_RPL: case UIP_EXT_HDR_OPT_RPL:
/* Fixes situation when a node that is not using RPL
* joins a network which does. The received packages will include the
* RPL header and processed by the "default" case of the switch
* (0x63 & 0xC0 = 0x40). Hence, the packet is discarded as the header
* is considered invalid.
* Using this fix, the header is ignored, and the next header (if
* present) is processed.
*/
#if UIP_CONF_IPV6_RPL
PRINTF("Processing RPL option\n"); PRINTF("Processing RPL option\n");
if(rpl_verify_header(uip_ext_opt_offset)) { if(rpl_verify_header(uip_ext_opt_offset)) {
PRINTF("RPL Option Error: Dropping Packet\n"); PRINTF("RPL Option Error: Dropping Packet\n");
return 1; return 1;
} }
uip_ext_opt_offset += (UIP_EXT_HDR_OPT_RPL_BUF->opt_len) + 2;
return 0;
#endif /* UIP_CONF_IPV6_RPL */ #endif /* UIP_CONF_IPV6_RPL */
uip_ext_opt_offset += (UIP_EXT_HDR_OPT_BUF->len) + 2;
return 0;
default: default:
/* /*
* check the two highest order bits of the option * check the two highest order bits of the option