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,
|
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 */
|
||||||
|
|||||||
@ -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];
|
||||||
|
|||||||
@ -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*/
|
||||||
|
|||||||
@ -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,
|
||||||
¤t_buf->s_addr,
|
&(current_buf->s_addr),
|
||||||
¤t_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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user