tcpdump -i $link src 192.168.1.14 and port 4000 and greater 100 -v -nn
当rx-checksumming打开的时候,skb->csum里面是硬件计算的tcp checksum,但是不包括伪头。
dev_gro_receive()
{
...
/* Setup for GRO checksum validation */
switch (skb->ip_summed) {
case CHECKSUM_COMPLETE:
NAPI_GRO_CB(skb)->csum = skb->csum;
NAPI_GRO_CB(skb)->csum_valid = 1;
NAPI_GRO_CB(skb)->csum_cnt = 0;
break;
...
}
tcp4_gro_receive()被调到的时候skb_gro_checksum_validate会根据NAPI_GRO_CB(skb)->csum和伪头
(inet_gro_compute_pseudo是用来计算伪头的)算出tcp checksum。如果是0xffff,就是正确的。这时line 2733会返回0
2728 static inline __sum16 __skb_gro_checksum_validate_complete(struct sk_buff *skb,
2729 __wsum psum)
2730 {
2731 if (NAPI_GRO_CB(skb)->csum_valid &&
2732 !csum_fold(csum_add(psum, NAPI_GRO_CB(skb)->csum)))
2733 return 0;
2734