ICMPv6 checksum怎么计算
时间: 2024-06-04 09:09:49 浏览: 414
在IPv6协议中,ICMPv6消息的校验和计算方法与IPv4中ICMP消息的校验和计算方法略有不同。
IPv6头部中没有校验和字段,因此,IPv6中的ICMPv6校验和由ICMPv6数据报文的数据部分和IPv6伪头部(包括源地址、目的地址、协议类型和ICMPv6数据报文长度)共同计算得到。
具体计算过程如下:
1. 将IPv6伪头部、ICMPv6数据报文的数据部分以及ICMPv6头部中除校验和字段之外的所有字段按位相加,得到一个32位的值。
2. 将步骤1中得到的32位值按16位为单位进行分割,相加得到一个16位的值。
3. 将步骤2中得到的16位值取反得到最终的校验和。
需要注意的是,如果ICMPv6数据报文的长度不是偶数,那么需要在最后一个字节后面填充一个字节的零来使其成为偶数长度。
相关问题
if (PREDICT_TRUE (inner_ip4->protocol == IP_PROTOCOL_TCP)) { inner_L4_checksum = &((tcp_header_t *) (inner_ip4 + 1))->checksum; *inner_L4_checksum = ip_csum_fold (ip_csum_sub_even (*inner_L4_checksum, *((u64 *) (&inner_ip4->src_address)))); } else if (PREDICT_TRUE (inner_ip4->protocol == IP_PROTOCOL_UDP)) { inner_L4_checksum = &((udp_header_t *) (inner_ip4 + 1))->checksum; if (*inner_L4_checksum) *inner_L4_checksum = ip_csum_fold (ip_csum_sub_even (*inner_L4_checksum, *((u64 *) (&inner_ip4->src_address)))); } else if (inner_ip4->protocol == IP_PROTOCOL_ICMP) { //We have an ICMP inside an ICMP //It needs to be translated, but not for error ICMP messages icmp46_header_t *inner_icmp = (icmp46_header_t *) (inner_ip4 + 1); //Only types ICMP4_echo_request and ICMP4_echo_reply are handled by icmp_to_icmp6_header inner_icmp->type = (inner_icmp->type == ICMP4_echo_request) ? ICMP6_echo_request : ICMP6_echo_reply; inner_L4_checksum = &inner_icmp->checksum; inner_ip4->protocol = IP_PROTOCOL_ICMP6; } else { /* To shut up Coverity */ os_panic (); }
根据提供的代码片段,在给定的条件下,`inner_ip4` 结构中的协议字段被检查,并根据不同的协议类型执行不同的操作。
1. 如果 `inner_ip4->protocol` 等于 `IP_PROTOCOL_TCP`,则进入第一个条件语句块。在这里,通过指针操作找到内部 TCP 头部,并计算校验和。校验和的计算使用了 `ip_csum_sub_even()` 函数,并通过 `ip_csum_fold()` 函数进行折叠。同时,源地址字段也与校验和进行了异或运算。
2. 如果 `inner_ip4->protocol` 等于 `IP_PROTOCOL_UDP`,则进入第二个条件语句块。在这里,通过指针操作找到内部 UDP 头部,并进行与 TCP 类似的校验和计算。与 TCP 不同的是,只有当校验和非零时才进行计算。
3. 如果 `inner_ip4->protocol` 等于 `IP_PROTOCOL_ICMP`,则进入第三个条件语句块。在这里,将 ICMP 类型转换为对应的 ICMPv6 类型,并将协议字段 `inner_ip4->protocol` 设置为 `IP_PROTOCOL_ICMP6`。同时,获取内部 ICMP 头部,并将内部 ICMP 校验和指针指向相应字段。
4. 如果以上条件均不满足,则执行 `os_panic()` 函数,这可能是一个紧急错误处理机制,用于处理未预期的协议类型。
请注意,根据上下文,该代码片段可能是某个网络协议栈或网络处理程序的一部分,并且可能需要更多的代码和上下文来完整地理解其功能和用途。
阅读全文