我正在处理/修改UDP数据报,以便在NF_INET_PRE_ROUTING链的Linux内核版本> 4.x中的netfilter挂钩中进行本地传递。但是,在开始修改此类数据报之前,我想通过检查其校验和来验证其一致性。这样做最有效的方法是什么?
由于我假设IP层已经通过,因此IP报头已经给出一致性,如果我通过以下方式进行验证就足够了:
if(udp4_csum_init(skb,udp_hdr(skb),IPPROTO_UDP)) {
return NF_DROP;
}
else {
//start modifying skb
}
udp4_csum_init
是否涵盖UDP标头和有效载荷?
我是对的,因为在ip_rcv
中调用了netfilter钩子,所以IP包头已经通过验证了吗?
udp4_csum_init
,udp_lib_checksum_comblete(skb)
和udp_v4_check(len,saddr,daddr,base)
有什么区别?
在数据报离开netfilter钩子并被本地UDP堆栈接收后,如何避免在UDP堆栈本身中进行额外的校验和验证。通过设置skb->csum_valid = 1
可以做到吗?
BR