mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
calculate RPL checksum right before sending the ICMP packet
This commit is contained in:
parent
cce3432220
commit
aaccd37a2f
@ -29,6 +29,7 @@
|
|||||||
#include "trickle.h"
|
#include "trickle.h"
|
||||||
|
|
||||||
#include "sixlowpan.h"
|
#include "sixlowpan.h"
|
||||||
|
#include "net_help.h"
|
||||||
|
|
||||||
#define ENABLE_DEBUG (0)
|
#define ENABLE_DEBUG (0)
|
||||||
#if ENABLE_DEBUG
|
#if ENABLE_DEBUG
|
||||||
@ -268,6 +269,7 @@ void rpl_init_root(void)
|
|||||||
|
|
||||||
void send_DIO(ipv6_addr_t *destination)
|
void send_DIO(ipv6_addr_t *destination)
|
||||||
{
|
{
|
||||||
|
DEBUG("Send DIO\n");
|
||||||
mutex_lock(&rpl_send_mutex);
|
mutex_lock(&rpl_send_mutex);
|
||||||
rpl_dodag_t *mydodag;
|
rpl_dodag_t *mydodag;
|
||||||
icmp_send_buf = get_rpl_send_icmpv6_buf(ipv6_ext_hdr_len);
|
icmp_send_buf = get_rpl_send_icmpv6_buf(ipv6_ext_hdr_len);
|
||||||
@ -282,7 +284,6 @@ void send_DIO(ipv6_addr_t *destination)
|
|||||||
|
|
||||||
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
||||||
icmp_send_buf->code = ICMP_CODE_DIO;
|
icmp_send_buf->code = ICMP_CODE_DIO;
|
||||||
icmp_send_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
|
|
||||||
|
|
||||||
rpl_send_dio_buf = get_rpl_send_dio_buf();
|
rpl_send_dio_buf = get_rpl_send_dio_buf();
|
||||||
memset(rpl_send_dio_buf, 0, sizeof(*rpl_send_dio_buf));
|
memset(rpl_send_dio_buf, 0, sizeof(*rpl_send_dio_buf));
|
||||||
@ -311,34 +312,33 @@ void send_DIO(ipv6_addr_t *destination)
|
|||||||
rpl_send_opt_dodag_conf_buf->default_lifetime = mydodag->default_lifetime;
|
rpl_send_opt_dodag_conf_buf->default_lifetime = mydodag->default_lifetime;
|
||||||
rpl_send_opt_dodag_conf_buf->lifetime_unit = mydodag->lifetime_unit;
|
rpl_send_opt_dodag_conf_buf->lifetime_unit = mydodag->lifetime_unit;
|
||||||
|
|
||||||
|
|
||||||
opt_hdr_len += RPL_OPT_LEN + RPL_OPT_DODAG_CONF_LEN;
|
opt_hdr_len += RPL_OPT_LEN + RPL_OPT_DODAG_CONF_LEN;
|
||||||
|
|
||||||
|
|
||||||
uint16_t plen = ICMPV6_HDR_LEN + DIO_BASE_LEN + opt_hdr_len;
|
uint16_t plen = ICMPV6_HDR_LEN + DIO_BASE_LEN + opt_hdr_len;
|
||||||
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6, NULL);
|
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6);
|
||||||
mutex_unlock(&rpl_send_mutex);
|
mutex_unlock(&rpl_send_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_DIS(ipv6_addr_t *destination)
|
void send_DIS(ipv6_addr_t *destination)
|
||||||
{
|
{
|
||||||
|
DEBUG("Send DIS\n");
|
||||||
mutex_lock(&rpl_send_mutex);
|
mutex_lock(&rpl_send_mutex);
|
||||||
icmp_send_buf = get_rpl_send_icmpv6_buf(ipv6_ext_hdr_len);
|
icmp_send_buf = get_rpl_send_icmpv6_buf(ipv6_ext_hdr_len);
|
||||||
|
|
||||||
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
||||||
icmp_send_buf->code = ICMP_CODE_DIS;
|
icmp_send_buf->code = ICMP_CODE_DIS;
|
||||||
icmp_send_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
|
|
||||||
|
|
||||||
rpl_send_dis_buf = get_rpl_send_dis_buf();
|
rpl_send_dis_buf = get_rpl_send_dis_buf();
|
||||||
|
|
||||||
uint16_t plen = ICMPV6_HDR_LEN + DIS_BASE_LEN;
|
uint16_t plen = ICMPV6_HDR_LEN + DIS_BASE_LEN;
|
||||||
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6, NULL);
|
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6);
|
||||||
mutex_unlock(&rpl_send_mutex);
|
mutex_unlock(&rpl_send_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void send_DAO(ipv6_addr_t *destination, uint8_t lifetime, bool default_lifetime, uint8_t start_index)
|
void send_DAO(ipv6_addr_t *destination, uint8_t lifetime, bool default_lifetime, uint8_t start_index)
|
||||||
{
|
{
|
||||||
|
DEBUG("Send DAO\n");
|
||||||
if (i_am_root) {
|
if (i_am_root) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -359,7 +359,6 @@ void send_DAO(ipv6_addr_t *destination, uint8_t lifetime, bool default_lifetime,
|
|||||||
|
|
||||||
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
||||||
icmp_send_buf->code = ICMP_CODE_DAO;
|
icmp_send_buf->code = ICMP_CODE_DAO;
|
||||||
icmp_send_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
|
|
||||||
|
|
||||||
if (my_dodag == NULL) {
|
if (my_dodag == NULL) {
|
||||||
mutex_unlock(&rpl_send_mutex);
|
mutex_unlock(&rpl_send_mutex);
|
||||||
@ -423,7 +422,7 @@ void send_DAO(ipv6_addr_t *destination, uint8_t lifetime, bool default_lifetime,
|
|||||||
opt_len += RPL_OPT_TRANSIT_LEN + 2;
|
opt_len += RPL_OPT_TRANSIT_LEN + 2;
|
||||||
|
|
||||||
uint16_t plen = ICMPV6_HDR_LEN + DAO_BASE_LEN + opt_len;
|
uint16_t plen = ICMPV6_HDR_LEN + DAO_BASE_LEN + opt_len;
|
||||||
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6, NULL);
|
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6);
|
||||||
mutex_unlock(&rpl_send_mutex);
|
mutex_unlock(&rpl_send_mutex);
|
||||||
|
|
||||||
if (continue_index > 1) {
|
if (continue_index > 1) {
|
||||||
@ -433,6 +432,7 @@ void send_DAO(ipv6_addr_t *destination, uint8_t lifetime, bool default_lifetime,
|
|||||||
|
|
||||||
void send_DAO_ACK(ipv6_addr_t *destination)
|
void send_DAO_ACK(ipv6_addr_t *destination)
|
||||||
{
|
{
|
||||||
|
DEBUG("Send DAO ACK\n");
|
||||||
rpl_dodag_t *my_dodag;
|
rpl_dodag_t *my_dodag;
|
||||||
my_dodag = rpl_get_my_dodag();
|
my_dodag = rpl_get_my_dodag();
|
||||||
|
|
||||||
@ -445,7 +445,6 @@ void send_DAO_ACK(ipv6_addr_t *destination)
|
|||||||
|
|
||||||
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
icmp_send_buf->type = ICMPV6_TYPE_RPL_CONTROL;
|
||||||
icmp_send_buf->code = ICMP_CODE_DAO_ACK;
|
icmp_send_buf->code = ICMP_CODE_DAO_ACK;
|
||||||
icmp_send_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
|
|
||||||
|
|
||||||
rpl_send_dao_ack_buf = get_rpl_send_dao_ack_buf();
|
rpl_send_dao_ack_buf = get_rpl_send_dao_ack_buf();
|
||||||
rpl_send_dao_ack_buf->rpl_instanceid = my_dodag->instance->id;
|
rpl_send_dao_ack_buf->rpl_instanceid = my_dodag->instance->id;
|
||||||
@ -454,7 +453,7 @@ void send_DAO_ACK(ipv6_addr_t *destination)
|
|||||||
rpl_send_dao_ack_buf->status = 0;
|
rpl_send_dao_ack_buf->status = 0;
|
||||||
|
|
||||||
uint16_t plen = ICMPV6_HDR_LEN + DAO_ACK_LEN;
|
uint16_t plen = ICMPV6_HDR_LEN + DAO_ACK_LEN;
|
||||||
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6, NULL);
|
rpl_send(destination, (uint8_t *)icmp_send_buf, plen, IPV6_PROTO_NUM_ICMPV6);
|
||||||
mutex_unlock(&rpl_send_mutex);
|
mutex_unlock(&rpl_send_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -886,8 +885,7 @@ void recv_rpl_dao_ack(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: tcp_socket unused? */
|
void rpl_send(ipv6_addr_t *destination, uint8_t *payload, uint16_t p_len, uint8_t next_header)
|
||||||
void rpl_send(ipv6_addr_t *destination, uint8_t *payload, uint16_t p_len, uint8_t next_header, void *tcp_socket)
|
|
||||||
{
|
{
|
||||||
uint8_t *p_ptr;
|
uint8_t *p_ptr;
|
||||||
ipv6_send_buf = get_rpl_send_ipv6_buf();
|
ipv6_send_buf = get_rpl_send_ipv6_buf();
|
||||||
@ -904,6 +902,10 @@ void rpl_send(ipv6_addr_t *destination, uint8_t *payload, uint16_t p_len, uint8_
|
|||||||
memcpy(&(ipv6_send_buf->destaddr), destination, 16);
|
memcpy(&(ipv6_send_buf->destaddr), destination, 16);
|
||||||
ipv6_iface_get_best_src_addr(&(ipv6_send_buf->srcaddr), &(ipv6_send_buf->destaddr));
|
ipv6_iface_get_best_src_addr(&(ipv6_send_buf->srcaddr), &(ipv6_send_buf->destaddr));
|
||||||
|
|
||||||
|
icmp_send_buf = get_rpl_send_icmpv6_buf(ipv6_ext_hdr_len);
|
||||||
|
icmp_send_buf->checksum = 0;
|
||||||
|
icmp_send_buf->checksum = ~ipv6_csum(ipv6_send_buf, (uint8_t*) icmp_send_buf, ipv6_send_buf->length, IPV6_PROTO_NUM_ICMPV6);
|
||||||
|
|
||||||
/* The packet was "assembled" in rpl.c. Therefore rpl_send_buf was used.
|
/* The packet was "assembled" in rpl.c. Therefore rpl_send_buf was used.
|
||||||
* Therefore memcpy is not needed because the payload is at the
|
* Therefore memcpy is not needed because the payload is at the
|
||||||
* right memory location already. */
|
* right memory location already. */
|
||||||
|
Loading…
Reference in New Issue
Block a user