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:
parent
a445c4020d
commit
5bae5e6ffd
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue