Merge pull request #650 from cetic/pr-rpl-hbh-fixes
Fix for RPL Hop-by-Hop options
This commit is contained in:
commit
782de873e4
2 changed files with 36 additions and 18 deletions
|
@ -1547,10 +1547,6 @@ uip_process(uint8_t flag)
|
||||||
|
|
||||||
uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN];
|
uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN];
|
||||||
|
|
||||||
#if UIP_CONF_IPV6_RPL
|
|
||||||
rpl_insert_header();
|
|
||||||
#endif /* UIP_CONF_IPV6_RPL */
|
|
||||||
|
|
||||||
#if UIP_UDP_CHECKSUMS
|
#if UIP_UDP_CHECKSUMS
|
||||||
/* Calculate UDP checksum. */
|
/* Calculate UDP checksum. */
|
||||||
UIP_UDP_BUF->udpchksum = ~(uip_udpchksum());
|
UIP_UDP_BUF->udpchksum = ~(uip_udpchksum());
|
||||||
|
@ -1558,6 +1554,11 @@ uip_process(uint8_t flag)
|
||||||
UIP_UDP_BUF->udpchksum = 0xffff;
|
UIP_UDP_BUF->udpchksum = 0xffff;
|
||||||
}
|
}
|
||||||
#endif /* UIP_UDP_CHECKSUMS */
|
#endif /* UIP_UDP_CHECKSUMS */
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6_RPL
|
||||||
|
rpl_insert_header();
|
||||||
|
#endif /* UIP_CONF_IPV6_RPL */
|
||||||
|
|
||||||
UIP_STAT(++uip_stat.udp.sent);
|
UIP_STAT(++uip_stat.udp.sent);
|
||||||
goto ip_send_nolen;
|
goto ip_send_nolen;
|
||||||
#endif /* UIP_UDP */
|
#endif /* UIP_UDP */
|
||||||
|
|
|
@ -68,9 +68,20 @@ rpl_verify_header(int uip_ext_opt_offset)
|
||||||
{
|
{
|
||||||
rpl_instance_t *instance;
|
rpl_instance_t *instance;
|
||||||
int down;
|
int down;
|
||||||
|
uint16_t sender_rank;
|
||||||
uint8_t sender_closer;
|
uint8_t sender_closer;
|
||||||
uip_ds6_route_t *route;
|
uip_ds6_route_t *route;
|
||||||
|
|
||||||
|
if(UIP_HBHO_BUF->len != RPL_HOP_BY_HOP_LEN - 8) {
|
||||||
|
PRINTF("RPL: Hop-by-hop extension header has wrong size\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL) {
|
||||||
|
PRINTF("RPL: Non RPL Hop-by-hop option\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) {
|
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) {
|
||||||
PRINTF("RPL: Bad header option! (wrong length)\n");
|
PRINTF("RPL: Bad header option! (wrong length)\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -117,17 +128,18 @@ rpl_verify_header(int uip_ext_opt_offset)
|
||||||
down = 1;
|
down = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sender_closer = UIP_EXT_HDR_OPT_RPL_BUF->senderrank < instance->current_dag->rank;
|
sender_rank = UIP_HTONS(UIP_EXT_HDR_OPT_RPL_BUF->senderrank);
|
||||||
|
sender_closer = sender_rank < instance->current_dag->rank;
|
||||||
|
|
||||||
PRINTF("RPL: Packet going %s, sender closer %d (%d < %d)\n", down == 1 ? "down" : "up",
|
PRINTF("RPL: Packet going %s, sender closer %d (%d < %d)\n", down == 1 ? "down" : "up",
|
||||||
sender_closer,
|
sender_closer,
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank,
|
sender_rank,
|
||||||
instance->current_dag->rank
|
instance->current_dag->rank
|
||||||
);
|
);
|
||||||
|
|
||||||
if((down && !sender_closer) || (!down && sender_closer)) {
|
if((down && !sender_closer) || (!down && sender_closer)) {
|
||||||
PRINTF("RPL: Loop detected - senderrank: %d my-rank: %d sender_closer: %d\n",
|
PRINTF("RPL: Loop detected - senderrank: %d my-rank: %d sender_closer: %d\n",
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank, instance->current_dag->rank,
|
sender_rank, instance->current_dag->rank,
|
||||||
sender_closer);
|
sender_closer);
|
||||||
if(UIP_EXT_HDR_OPT_RPL_BUF->flags & RPL_HDR_OPT_RANK_ERR) {
|
if(UIP_EXT_HDR_OPT_RPL_BUF->flags & RPL_HDR_OPT_RANK_ERR) {
|
||||||
PRINTF("RPL: Rank error signalled in RPL option!\n");
|
PRINTF("RPL: Rank error signalled in RPL option!\n");
|
||||||
|
@ -185,7 +197,17 @@ rpl_update_header_empty(void)
|
||||||
switch(UIP_IP_BUF->proto) {
|
switch(UIP_IP_BUF->proto) {
|
||||||
case UIP_PROTO_HBHO:
|
case UIP_PROTO_HBHO:
|
||||||
if(UIP_HBHO_BUF->len != RPL_HOP_BY_HOP_LEN - 8) {
|
if(UIP_HBHO_BUF->len != RPL_HOP_BY_HOP_LEN - 8) {
|
||||||
PRINTF("RPL: Non RPL Hop-by-hop options support not implemented\n");
|
PRINTF("RPL: Hop-by-hop extension header has wrong size\n");
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL) {
|
||||||
|
PRINTF("RPL: Non RPL Hop-by-hop option support not implemented\n");
|
||||||
|
uip_ext_len = last_uip_ext_len;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) {
|
||||||
|
PRINTF("RPL: RPL Hop-by-hop option has wrong length\n");
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -210,7 +232,7 @@ rpl_update_header_empty(void)
|
||||||
switch(UIP_EXT_HDR_OPT_BUF->type) {
|
switch(UIP_EXT_HDR_OPT_BUF->type) {
|
||||||
case UIP_EXT_HDR_OPT_RPL:
|
case UIP_EXT_HDR_OPT_RPL:
|
||||||
PRINTF("RPL: Updating RPL option\n");
|
PRINTF("RPL: Updating RPL option\n");
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = instance->current_dag->rank;
|
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(instance->current_dag->rank);
|
||||||
|
|
||||||
/* Check the direction of the down flag, as per Section 11.2.2.3,
|
/* Check the direction of the down flag, as per Section 11.2.2.3,
|
||||||
which states that if a packet is going down it should in
|
which states that if a packet is going down it should in
|
||||||
|
@ -276,8 +298,7 @@ rpl_update_header_final(uip_ipaddr_t *addr)
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->flags = RPL_HDR_OPT_DOWN;
|
UIP_EXT_HDR_OPT_RPL_BUF->flags = RPL_HDR_OPT_DOWN;
|
||||||
}
|
}
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->instance = default_instance->instance_id;
|
UIP_EXT_HDR_OPT_RPL_BUF->instance = default_instance->instance_id;
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = default_instance->current_dag->rank;
|
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(default_instance->current_dag->rank);
|
||||||
uip_ext_len = last_uip_ext_len;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -334,7 +355,7 @@ rpl_invert_header(void)
|
||||||
PRINTF("RPL: Updating RPL option (switching direction)\n");
|
PRINTF("RPL: Updating RPL option (switching direction)\n");
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->flags &= RPL_HDR_OPT_DOWN;
|
UIP_EXT_HDR_OPT_RPL_BUF->flags &= RPL_HDR_OPT_DOWN;
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->flags ^= RPL_HDR_OPT_DOWN;
|
UIP_EXT_HDR_OPT_RPL_BUF->flags ^= RPL_HDR_OPT_DOWN;
|
||||||
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance)->current_dag->rank;
|
UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance)->current_dag->rank);
|
||||||
uip_ext_len = last_uip_ext_len;
|
uip_ext_len = last_uip_ext_len;
|
||||||
return RPL_HOP_BY_HOP_LEN;
|
return RPL_HOP_BY_HOP_LEN;
|
||||||
default:
|
default:
|
||||||
|
@ -347,14 +368,10 @@ rpl_invert_header(void)
|
||||||
void
|
void
|
||||||
rpl_insert_header(void)
|
rpl_insert_header(void)
|
||||||
{
|
{
|
||||||
uint8_t uip_ext_opt_offset;
|
if(default_instance != NULL && !uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
||||||
if(default_instance != NULL) {
|
|
||||||
uip_ext_opt_offset = 2;
|
|
||||||
if(UIP_EXT_HDR_OPT_BUF->type == UIP_EXT_HDR_OPT_RPL) {
|
|
||||||
rpl_update_header_empty();
|
rpl_update_header_empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
#endif /* UIP_CONF_IPV6 */
|
#endif /* UIP_CONF_IPV6 */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue