Eliminate side effects in icmpv6_csum and make it public

This commit is contained in:
Martin Lenders 2014-02-27 00:10:16 +01:00
parent 2c76f99f04
commit bdced318bc
5 changed files with 31 additions and 29 deletions

View File

@ -232,5 +232,16 @@ void icmpv6_send_neighbor_adv(ipv6_addr_t *src, ipv6_addr_t *dst,
ipv6_addr_t *tgt, uint8_t rso, ipv6_addr_t *tgt, uint8_t rso,
uint8_t sllao, uint8_t aro); 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 */ #endif /* SIXLOWPAN_ICMP_H */

View File

@ -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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; 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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; 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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; 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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
/* calculate checksum */ /* calculate checksum */
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; 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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; 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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; 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 sum;
uint16_t len = NTOHS(ipv6_buf->length); 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 *)&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); ipv6_buf->length = HTONS(packet_length - IPV6_HDR_LEN);
icmp_buf->checksum = 0; icmp_buf->checksum = icmpv6_csum(ipv6_buf, icmp_buf);
icmp_buf->checksum = ~icmpv6_csum(IPV6_PROTO_NUM_ICMPV6);
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
char addr_str[IPV6_MAX_ADDR_STR_LEN]; char addr_str[IPV6_MAX_ADDR_STR_LEN];

View File

@ -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, ndp_a6br_cache_t *abr_add_context(uint16_t version, ipv6_addr_t *abr_addr,
uint8_t cid); uint8_t cid);
void abr_remove_context(uint8_t cid); void abr_remove_context(uint8_t cid);
uint16_t icmpv6_csum(uint8_t proto);
#endif /* _SIXLOWPAN_ICMP_H*/ #endif /* _SIXLOWPAN_ICMP_H*/

View File

@ -384,22 +384,22 @@ void lowpan_transfer(void)
packet_length = current_buf->packet_size - 1; packet_length = current_buf->packet_size - 1;
msg_send_receive(&m_send, &m_recv, ip_process_pid); msg_send_receive(&m_send, &m_recv, ip_process_pid);
} }
else if ((current_buf->packet[0] & 0xf0) == IPV6_VER && else if (((current_buf->packet[0] & 0xf0) == IPV6_VER) &&
iphc_status == LOWPAN_IPHC_DISABLE) { (iphc_status == LOWPAN_IPHC_DISABLE)) {
ipv6_buf = ipv6_get_buf(); ipv6_buf = ipv6_get_buf();
memcpy(ipv6_buf, (current_buf->packet), current_buf->packet_size); memcpy(ipv6_buf, (current_buf->packet), current_buf->packet_size);
m_send.content.ptr = (char *)ipv6_buf; m_send.content.ptr = (char *)ipv6_buf;
packet_length = current_buf->packet_size; packet_length = current_buf->packet_size;
msg_send_receive(&m_send, &m_recv, ip_process_pid); msg_send_receive(&m_send, &m_recv, ip_process_pid);
} }
else if ((current_buf->packet[0] & 0xe0) == SIXLOWPAN_IPHC1_DISPATCH && else if (((current_buf->packet[0] & 0xe0) == SIXLOWPAN_IPHC1_DISPATCH) &&
iphc_status == LOWPAN_IPHC_ENABLE) { (iphc_status == LOWPAN_IPHC_ENABLE)) {
DEBUG("INFO: IPHC1 dispatch 0x%02x received, decompress\n", DEBUG("INFO: IPHC1 dispatch 0x%02x received, decompress\n",
current_buf->packet[0]); current_buf->packet[0]);
lowpan_iphc_decoding(current_buf->packet, lowpan_iphc_decoding(current_buf->packet,
current_buf->packet_size, current_buf->packet_size,
&current_buf->s_addr, &(current_buf->s_addr),
&current_buf->d_addr); &(current_buf->d_addr));
ipv6_buf = ipv6_get_buf(); ipv6_buf = ipv6_get_buf();
m_send.content.ptr = (char *) ipv6_buf; m_send.content.ptr = (char *) ipv6_buf;

View File

@ -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)); 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 = get_rpl_send_icmpv6_buf(ipv6_ext_hdr_len);
icmp_send_buf->checksum = 0; icmp_send_buf->checksum = icmpv6_csum(ipv6_send_buf, icmp_send_buf);
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