mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
added IPv6 upper-layer checksum calculation
This commit is contained in:
parent
6329076aeb
commit
cce3432220
@ -363,6 +363,20 @@ void ipv6_iface_print_addrs(void);
|
||||
*/
|
||||
void ipv6_iface_set_routing_provider(ipv6_addr_t *(*next_hop)(ipv6_addr_t* dest));
|
||||
|
||||
/**
|
||||
* @brief Calculates the IPv6 upper-layer checksum.
|
||||
*
|
||||
* @see <a href="http://tools.ietf.org/html/rfc2460#section-8.1">
|
||||
* RFC 2460, section 8.1
|
||||
* </a>
|
||||
* @param[in] ipv6_header Pointer to the IPv6 header of the packet.
|
||||
* @param[in] buf Pointer to the upper-layer payload of the IP datagram.
|
||||
* @param[in] len The length of the upper-layer header and data.
|
||||
* @param[in] proto Upper-layer protocol number according to RFC1700.
|
||||
*
|
||||
* @return The IPv6 upper-layer checksum.
|
||||
*/
|
||||
uint16_t ipv6_csum(ipv6_hdr_t *ipv6_header, uint8_t *buf, uint16_t len, uint8_t proto);
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
@ -35,6 +35,9 @@
|
||||
#include "net_help.h"
|
||||
|
||||
#define ENABLE_DEBUG (0)
|
||||
#if ENABLE_DEBUG
|
||||
char addr_str[IPV6_MAX_ADDR_STR_LEN];
|
||||
#endif
|
||||
#include "debug.h"
|
||||
|
||||
#define IP_PKT_RECV_BUF_SIZE (64)
|
||||
@ -311,12 +314,11 @@ void ipv6_process(void)
|
||||
|
||||
switch (*nextheader) {
|
||||
case (IPV6_PROTO_NUM_ICMPV6): {
|
||||
icmp_buf = get_icmpv6_buf(ipv6_ext_hdr_len);
|
||||
/* checksum test*/
|
||||
if (icmpv6_csum(IPV6_PROTO_NUM_ICMPV6) != 0xffff) {
|
||||
if (ipv6_csum(ipv6_buf, (uint8_t*) icmp_buf, ipv6_buf->length, IPV6_PROTO_NUM_ICMPV6) != 0xffff) {
|
||||
printf("ERROR: wrong checksum\n");
|
||||
}
|
||||
|
||||
icmp_buf = get_icmpv6_buf(ipv6_ext_hdr_len);
|
||||
icmpv6_demultiplex(icmp_buf);
|
||||
break;
|
||||
}
|
||||
@ -706,3 +708,16 @@ void ipv6_register_rpl_handler(int pid)
|
||||
{
|
||||
rpl_process_pid = pid;
|
||||
}
|
||||
|
||||
uint16_t ipv6_csum(ipv6_hdr_t *ipv6_header, uint8_t *buf, uint16_t len, uint8_t proto)
|
||||
{
|
||||
uint16_t sum = 0;
|
||||
DEBUG("Calculate checksum over src: %s, dst: %s, len: %04X, buf: %p, proto: %u\n",
|
||||
ipv6_addr_to_str(addr_str, &ipv6_header->srcaddr),
|
||||
ipv6_addr_to_str(addr_str, &ipv6_header->destaddr),
|
||||
len, buf, proto);
|
||||
sum = len + proto;
|
||||
sum = csum(sum, (uint8_t *)&ipv6_header->srcaddr, 2 * sizeof(ipv6_addr_t));
|
||||
sum = csum(sum, buf, len);
|
||||
return (sum == 0) ? 0xffff : HTONS(sum);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user