diff --git a/sys/net/include/sixlowpan/icmp.h b/sys/net/include/sixlowpan/icmp.h index 97b08791aa..4f21e90e79 100644 --- a/sys/net/include/sixlowpan/icmp.h +++ b/sys/net/include/sixlowpan/icmp.h @@ -232,5 +232,16 @@ void icmpv6_send_neighbor_adv(ipv6_addr_t *src, ipv6_addr_t *dst, ipv6_addr_t *tgt, uint8_t rso, uint8_t sllao, uint8_t aro); +/** + * @brief Calculates the checksum for ICMPv6 packets. + * + * @param[in] ipv6_buf The initialized IPv6 header of the packet. + * @param[in] icmpv6_buf The initialized ICMPv6_header of the packet + * (except checksum, payload is expected directly + * after the packet header in memory). + * + * @return The internet checksum of the given ICMPv6 packet. + */ +uint16_t icmpv6_csum(ipv6_hdr_t *ipv6_buf, icmpv6_hdr_t *icmpv6_buf); /** @} */ #endif /* SIXLOWPAN_ICMP_H */ diff --git a/sys/net/network_layer/sixlowpan/icmp.c b/sys/net/network_layer/sixlowpan/icmp.c index 31952db2c8..f02b96ef48 100644 --- a/sys/net/network_layer/sixlowpan/icmp.c +++ b/sys/net/network_layer/sixlowpan/icmp.c @@ -267,8 +267,7 @@ void icmpv6_send_echo_request(ipv6_addr_t *destaddr, uint16_t id, uint16_t seq, ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; @@ -307,8 +306,7 @@ void icmpv6_send_echo_reply(ipv6_addr_t *destaddr, uint16_t id, uint16_t seq, ui ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; @@ -365,8 +363,7 @@ void icmpv6_send_router_sol(uint8_t sllao) ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; @@ -698,8 +695,7 @@ void icmpv6_send_router_adv(ipv6_addr_t *addr, uint8_t sllao, uint8_t mtu, uint8 ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); /* calculate checksum */ - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; @@ -988,8 +984,7 @@ void icmpv6_send_neighbor_sol(ipv6_addr_t *src, ipv6_addr_t *dest, ipv6_addr_t * ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; @@ -1261,8 +1256,7 @@ void icmpv6_send_neighbor_adv(ipv6_addr_t *src, ipv6_addr_t *dst, ipv6_addr_t *t ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; @@ -1435,17 +1429,18 @@ void icmpv6_ndp_set_sllao(icmpv6_ndp_opt_stllao_t *sllao, int if_id, } } -uint16_t icmpv6_csum(uint8_t proto) +uint16_t icmpv6_csum(ipv6_hdr_t *ipv6_buf, icmpv6_hdr_t *icmpv6_buf) { - ipv6_buf = ipv6_get_buf(); uint16_t sum; uint16_t len = NTOHS(ipv6_buf->length); - sum = len + proto; + + icmpv6_buf->checksum = 0; + sum = len + IPV6_PROTO_NUM_ICMPV6; sum = csum(sum, (uint8_t *)&ipv6_buf->srcaddr, 2 * sizeof(ipv6_addr_t)); - sum = csum(sum, (uint8_t *)get_icmpv6_buf(0), len); + sum = csum(sum, (uint8_t *)icmpv6_buf, len); - return (sum == 0) ? 0xffff : HTONS(sum); + return (sum == 0) ? 0 : ~HTONS(sum); } @@ -1481,8 +1476,7 @@ void icmpv6_send_parameter_prob(ipv6_addr_t *src, ipv6_addr_t *dest, ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN); - icmp_buf->checksum = 0; - icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6); + icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf); #ifdef DEBUG_ENABLED char addr_str[IPV6_MAX_ADDR_STR_LEN]; diff --git a/sys/net/network_layer/sixlowpan/icmp.h b/sys/net/network_layer/sixlowpan/icmp.h index a8fcf12f15..a1fcf2f12b 100644 --- a/sys/net/network_layer/sixlowpan/icmp.h +++ b/sys/net/network_layer/sixlowpan/icmp.h @@ -56,6 +56,4 @@ void nbr_cache_auto_rem(void); ndp_a6br_cache_t *abr_add_context(uint16_t version, ipv6_addr_t *abr_addr, uint8_t cid); void abr_remove_context(uint8_t cid); - -uint16_t icmpv6_csum(uint8_t proto); #endif /* _SIXLOWPAN_ICMP_H*/ diff --git a/sys/net/network_layer/sixlowpan/lowpan.c b/sys/net/network_layer/sixlowpan/lowpan.c index d81a81ea54..7946c2e930 100644 --- a/sys/net/network_layer/sixlowpan/lowpan.c +++ b/sys/net/network_layer/sixlowpan/lowpan.c @@ -384,22 +384,22 @@ void lowpan_transfer(void) packet_length = current_buf->packet_size - 1; msg_send_receive(&m_send, &m_recv, ip_process_pid); } - else if ((current_buf->packet[0] & 0xf0) == IPV6_VER && - iphc_status == LOWPAN_IPHC_DISABLE) { + else if (((current_buf->packet[0] & 0xf0) == IPV6_VER) && + (iphc_status == LOWPAN_IPHC_DISABLE)) { ipv6_buf = ipv6_get_buf(); memcpy(ipv6_buf, (current_buf->packet), current_buf->packet_size); m_send.content.ptr = (char *)ipv6_buf; packet_length = current_buf->packet_size; msg_send_receive(&m_send, &m_recv, ip_process_pid); } - else if ((current_buf->packet[0] & 0xe0) == SIXLOWPAN_IPHC1_DISPATCH && - iphc_status == LOWPAN_IPHC_ENABLE) { + else if (((current_buf->packet[0] & 0xe0) == SIXLOWPAN_IPHC1_DISPATCH) && + (iphc_status == LOWPAN_IPHC_ENABLE)) { DEBUG("INFO: IPHC1 dispatch 0x%02x received, decompress\n", current_buf->packet[0]); lowpan_iphc_decoding(current_buf->packet, current_buf->packet_size, - ¤t_buf->s_addr, - ¤t_buf->d_addr); + &(current_buf->s_addr), + &(current_buf->d_addr)); ipv6_buf = ipv6_get_buf(); m_send.content.ptr = (char *) ipv6_buf; diff --git a/sys/net/routing/rpl/rpl.c b/sys/net/routing/rpl/rpl.c index 2d9b2701d0..4b76c671a2 100644 --- a/sys/net/routing/rpl/rpl.c +++ b/sys/net/routing/rpl/rpl.c @@ -931,8 +931,7 @@ void rpl_send(ipv6_addr_t *destination, uint8_t *payload, uint16_t p_len, uint8_ ipv6_net_if_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); + icmp_send_buf->checksum = icmpv6_csum(ipv6_send_buf, icmp_send_buf); /* The packet was "assembled" in rpl.c. Therefore rpl_send_buf was used. * Therefore memcpy is not needed because the payload is at the