Eliminate side effects in icmpv6_csum and make it public
This commit is contained in:
parent
2c76f99f04
commit
bdced318bc
@ -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 */
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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*/
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user