一、引言

1、linux kernel中要保证IP/TCP/UDP数据的正确性,就要对数据进行校验。校验方法,简单来说,就是对要计算的数据,以16bit为单元进行累加,取反。
2、由于目前很多网卡设备是支持对L4层(传输层 tcp/udp层)数据包进行checksum的计算和验证的,所以在L4协议软件的实现中,会根据网卡的支持情况作不同的处理,为此内核在struct sk_buff结构和struct net_device中增加了校验和相关的参数,如下:

二、struct sk_buff 结构

struct sk_buff 中与checksum有关的字段如下:

struct sk_buff
{...__u8 ip_summed:2;...union {__wsum        csum;struct {__u16    csum_start;__u16    csum_offset;};};...
}
#define CHECKSUM_NONE 0
#define CHECKSUM_UNNECESSARY 1
#define CHECKSUM_COMPLETE 2
#define CHECKSUM_PARTIAL 3

上述联合体中哪个成员有效取决于ip_summed的值,ip_summed共两个bit,可取四个标志,而且在发送和接收时的含义还有所不同。

1、接收过程

skb->csum可能包含L4一部分校验和;
skb->ip_summed字段代表:设备驱动告诉L4, 软件当前校验和的状态,各取值含义如下:
(1) CHECKSUM_NONE:
skb->csum中的校验和无效,可能是硬件没有提供校验和,可能是硬件不支持,也可能是硬件校验出错但是并未丢弃数据包,此时将ip_summed设为CHECKSUM_NONE,让L4软件重新校验;
(2) CHECKSUM_UNNECESSARY:
硬件已经进行了完整的校验,无需软件再进行检查,L4收到数据包后如果检查ip_summed是这种情况,就可以跳过校验过程;
(3) CHECKSUM_COMPLETE:
硬件已经校验了L4报头和其payload部分,并且校验和保存在了skb->csum中,L4软件只需要再计算伪报头然后检查校验结果即可。

2、发送过程

skb->ip_summed字段包含了L4软件告诉设备驱动程序当前校验和的状态,各取值含义如下:
(1) CHECKSUM_NONE:L4软件已经进行了校验,硬件无需做任何事情;
(2) CHECKSUM_PARTIAL:L4软件计算了伪报头,并且将值保存在了tcp/udp首部的check字段中,硬件需要计算其余部分的校验和。

三、struct net_device 结构

net_device结构中的feature字段中定义了如下和校验和相关的字段,这些字段表明了硬件计算校验和的能力。

NETIF_F_NO_CSUM:该设备非常可靠,无需L4执行任何校验,环回设备一般设置该标记
NETIF_F_IP_CSUM:设备可以对基于IPv4的TCP和UDP数据包进行校验
NETIF_F_IPV6_CSUM:设备可以对基于IPv6的TCP和UDP数据包进行校验
NETIF_F_HW_CSUM: 设备可以对任何L4协议的数据包进行校验

四、参考

(1)UDP之数据报校验和:https://blog.csdn.net/xiaoyu_750516366/article/details/83422212
(2)Checksum in Linux Kernel:http://hustcat.github.io/checksum-in-kernel/

linux kernel --- checksum相关ip_summed和feature字段解释相关推荐

  1. linux kernel 内存相关记录

    本篇文章是学习了<linux内核设计与实现>和<linux设备驱动开发详解>关于linux 内存部分的记录. MMU 内存管理单元,提供虚拟地址和物理地址映射.内存访问权限.c ...

  2. Linux kernel内存管理之OOM相关参数

    一.OOM概念 OOM是Out Of Memory(内存溢出)的缩写,虽然linux kernel的内存管理有很多机制(从cache中回收.swap out等)可以满足用户空间的各种虚拟内存需求,但是 ...

  3. Linux kernel内核编译配置选项详解

    转载于:http://lamp.linux.gov.cn/Linux/kernel_options.html 作者:金步国 Code maturity level options 代码成熟度选项 Pr ...

  4. Linux Kernel TCP/IP Stack — 协议栈收包处理流程

    目录 文章目录 目录 L2 NIC Controller 收包处理流程 L3-4 收包处理流程 Socket Layer 收包处理流程 参考文档 L2 NIC Controller 收包处理流程 硬件 ...

  5. Linux Kernel TCP/IP Stack — L3 Layer — 路由器子系统

    目录 文章目录 目录 Linux 作为一个路由器 路由表项的类型 route 指令 ip route 指令 添加默认路由 添加静态路由 删除静态路由 操作示例 Linux Kernel 路由子系统 路 ...

  6. Exploiting “BadIRET” vulnerability (CVE-2014-9322, Linux kernel privilege escalation)

    insight-labs · 2015/02/06 14:24 from:http://labs.bromium.com/2015/02/02/exploiting-badiret-vulnerabi ...

  7. Linux kernel 同步机制(下篇)

    之前的文章 Linux kernel同步机制 在上一部分,我们讨论了最基本常见的几类同步机制,这一部分我们将讨论相对复杂的几种同步机制,尤其是读写信号量和RCU,在操作系统内核中有相当广泛的应用. 读 ...

  8. (转)Linux Kernel核心中文手册

    转自糖蒜的小屋http://blog.csdn.net/seastar_pickle/category/101975.aspx?PageNumber=2 Hardware Basic( 硬件基础知识  ...

  9. linux kernel 网络协议栈之GRO(Generic receive offload)

    linux kernel 网络协议栈之GRO(Generic receive offload) 2010年11月26日 Simon Liu 发表评论 阅读评论 原创文章,转载请注明: 转载自pagef ...

最新文章

  1. Ramsey定理数学
  2. 二叉树的中序遍历(递归)
  3. python软件有多大-Python程序有多大?
  4. 【嵌入式工程师面试高频问题】你知道IIC吗(附程序说明)
  5. java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)...
  6. 谁说 C++ 的强制类型转换很难懂?
  7. 太原理工大学ACM队简介(2018版)
  8. 岁月是把杀猪刀时光不止催人老
  9. comsol与matlab联合,联合应用COMSOL和matlab.pdf
  10. modelica学习笔记4
  11. Axure RP小部件使用教程
  12. VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行
  13. 信号的平均功率与均方值
  14. centos7(命令行版)安装teamviewer记录
  15. 面向小白visual studio 2019 添加第三方库教程
  16. 企业成功的秘密:成为独角兽
  17. 王勇杰《音乐漫步》1-10单元测试答案
  18. 怎么对比2个数据库的差异
  19. Linux命令:dmesg
  20. HTML入门习题及答案

热门文章

  1. fooview辅助功能 shell_FV浮动阅览器fooView——一款功能十分强大的浮动按钮
  2. 独享版虚拟主机、共享版虚拟主机和云服务器ECS的区别?
  3. mysql in 命中索引_MySql优化-你的SQL命中索引了吗
  4. SAP 中利润中心 详细解析
  5. 【C语言】利用条件运算符的嵌套完成学习成绩的例题
  6. Python backtrader回测之布林带策略
  7. 21岁被人“封神”,曾一分钟黑了阿里巴巴后台系统!
  8. SQL Server报错:选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
  9. MTK屏蔽谷歌服务报错对话框KK
  10. 2022年,谁在推动产业数字化进入“奇点”时刻?