rpl: dao-ack validity check
This commit is contained in:
parent
8bbcb3ba51
commit
b96e6b508a
@ -419,8 +419,9 @@ void gnrc_rpl_recv_DAO(gnrc_rpl_dao_t *dao, ipv6_addr_t *src, uint16_t len);
|
|||||||
* @brief Parse a DAO-ACK.
|
* @brief Parse a DAO-ACK.
|
||||||
*
|
*
|
||||||
* @param[in] dao_ack Pointer to the DAO-ACK message.
|
* @param[in] dao_ack Pointer to the DAO-ACK message.
|
||||||
|
* @param[in] len Length of the IPv6 packet.
|
||||||
*/
|
*/
|
||||||
void gnrc_rpl_recv_DAO_ACK(gnrc_rpl_dao_ack_t *dao_ack);
|
void gnrc_rpl_recv_DAO_ACK(gnrc_rpl_dao_ack_t *dao_ack, uint16_t len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Delay the DAO sending interval
|
* @brief Delay the DAO sending interval
|
||||||
|
|||||||
@ -133,7 +133,8 @@ static void _receive(gnrc_pktsnip_t *icmpv6)
|
|||||||
break;
|
break;
|
||||||
case GNRC_RPL_ICMPV6_CODE_DAO_ACK:
|
case GNRC_RPL_ICMPV6_CODE_DAO_ACK:
|
||||||
DEBUG("RPL: DAO-ACK received\n");
|
DEBUG("RPL: DAO-ACK received\n");
|
||||||
gnrc_rpl_recv_DAO_ACK((gnrc_rpl_dao_ack_t *)(icmpv6_hdr + 1));
|
gnrc_rpl_recv_DAO_ACK((gnrc_rpl_dao_ack_t *)(icmpv6_hdr + 1),
|
||||||
|
byteorder_ntohs(ipv6_hdr->len));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DEBUG("RPL: Unknown ICMPV6 code received\n");
|
DEBUG("RPL: Unknown ICMPV6 code received\n");
|
||||||
|
|||||||
@ -707,10 +707,32 @@ void gnrc_rpl_recv_DAO(gnrc_rpl_dao_t *dao, ipv6_addr_t *src, uint16_t len)
|
|||||||
gnrc_rpl_delay_dao(dodag);
|
gnrc_rpl_delay_dao(dodag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gnrc_rpl_recv_DAO_ACK(gnrc_rpl_dao_ack_t *dao_ack)
|
static bool _gnrc_rpl_check_DAO_ACK_validity(gnrc_rpl_dao_ack_t *dao_ack, uint16_t len)
|
||||||
|
{
|
||||||
|
uint16_t expected_len = sizeof(*dao_ack) + sizeof(icmpv6_hdr_t);
|
||||||
|
|
||||||
|
if ((dao_ack->d_reserved & GNRC_RPL_DAO_ACK_D_BIT)) {
|
||||||
|
expected_len += sizeof(ipv6_addr_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expected_len == len) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG("RPL: wrong DAO-ACK len: %d, expected: %d\n", len, expected_len);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void gnrc_rpl_recv_DAO_ACK(gnrc_rpl_dao_ack_t *dao_ack, uint16_t len)
|
||||||
{
|
{
|
||||||
gnrc_rpl_instance_t *inst = NULL;
|
gnrc_rpl_instance_t *inst = NULL;
|
||||||
gnrc_rpl_dodag_t *dodag = NULL;
|
gnrc_rpl_dodag_t *dodag = NULL;
|
||||||
|
|
||||||
|
if (!_gnrc_rpl_check_DAO_ACK_validity(dao_ack, len)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((inst = gnrc_rpl_instance_get(dao_ack->instance_id)) == NULL) {
|
if ((inst = gnrc_rpl_instance_get(dao_ack->instance_id)) == NULL) {
|
||||||
DEBUG("RPL: DAO-ACK with unknown instance id (%d) received\n", dao_ack->instance_id);
|
DEBUG("RPL: DAO-ACK with unknown instance id (%d) received\n", dao_ack->instance_id);
|
||||||
return;
|
return;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user