IP校验和始终由内核在软件中计算和验证。
net_device->features字段会表明设备的能力。除了各种可以设定的标志外,有些标志可用于定义硬件校验和计算能力:
NETIF_F_NO_CSUM:此设备很可靠,不需要使用任何L4校验和。
NETIF_F_IP_CSUM:此设备可以在硬件中计算L4校验和,但是只针对使用IPv4的TCP和UDP。
NETIF_F_HW_CSUM:此设备可以为任何协议在硬件中计算L4校验和。
当一个封包被接收时,skb->csum可能包含其L4校验和。skb->ip_summed字段则会记录L4校验和的状态。
CHECKSUM_NONE:
csum中的校验和无效,究其原因有:1.设备不提供硬件校验和计算。2.设备计算了硬件校验和,并发现数据帧已损坏。3.校验和必须重新计算并验证。
CHECKSUM_HW:
NIC以L4报头和有效载荷计算了校验和,然后把校验和拷贝到skb->csum字段。软件不仅必须把伪报头的检验和加至skb->csum,还必须验证最后所得的校验和。
CHECKSUM_UNNECESSARY:
NIC已经计算并验证了L4报头以及伪报头的校验和。所以软件无需对L4校验和与验证工作再做任何事。
当封包传输后,csum代表指向缓冲区内的地点的指针,不再是校验和本身。而此地点也就是硬件适配卡要把它即将计算的校验和存放的地方。因此,在封包传输期间,只有当校验和是在硬件中计算时,才会用到此字段。
CHECKSUM_NONE:
协议已经处理了校验和,设备不需要做任何事。当你转发一个出口数据帧时,L4校验和已经准备好,因为已经由传送端主机计算好了。
CHECKSUM_HW:
协议只把伪报头的校验和存储至其报头内,假定设备应该通过添加L4报头和有效载荷的校验和来以完成此工作。
在传输封包时,ip_summed没有使用CHECKSUM_UNNECESSARY(相当于CHECKSUM_NONE)。
《深入理解Linux网络技术内幕》阅读笔记(十七)
