나는 패킷에 대한 사용자 정의 변환을 수행하기 위해 xfrm 테이블(IPv6)을 사용하고 있습니다. 변환의 일부로 UDP 헤더를 추가했습니다(기본적으로 내 데이터를 UDP 캡슐화라고도 불리는 UDP에 넣음). 변화는 옳은 일입니다.
이 변환은 네트워크 계층에서 발생하므로 추가된 UDP 헤더의 체크섬을 계산합니다. Wireshark는 이 체크섬을 잘못된 것으로 보고합니다. 내 커널 버전은 3.10입니다. udp6_hwcsum_outgoing()
"struct sock"이 없기 때문에 사용할 수 없습니다 .
내 커널이나 다른 커널 버전에서 체크섬을 계산하는 올바른 방법을 안내해 줄 수 있는 사람이 있나요?
나는 다음을 시도했습니다 (모두 잘못된 값을 생성합니다) -
1.
skb->csum = csum_partial((char*)uh, sizeof(struct udphdr), skb->csum);
uh->check = csum_ipv6_magic(&(ip6h->saddr), &(ip6h->daddr),htons(uh->len), IPPROTO_UDP, skb->csum);
2.
~csum_ipv6_magic(&(ip6h->saddr), &(ip6h->daddr),uh->len, IPPROTO_UDP,0);
삼.
csum = skb_checksum(skb, 0, skb->len, 0);
uh->check = udp_v6_check(sub->len, saddr, daddr, csum);