我们来看一个virtio_net设备的校验和配置:

[root@10 ~]# ethtool -K eth0 tx-checksumming on   //caq:大写的K用来调整feature
[root@10 ~]# ethtool -k eth0 //caq:小写的k用来查看feature
Features for eth0:
rx-checksumming: off [fixed]
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]

问题是:

1、tx-checksum-ip-generic对应的feature是什么?

2、为什么 tx-checksum-ip-generic 为on ,而 tx-checksum-ipv4 是off 并且是[fixed]呢?

3、ethtool打印的[fixed]代表啥?

4、tx-checksum-ip-generic 与 tx-checksum-ipv4 以及 tx-checksum-ipv6 的关系是?

先来看第一个问题,查看内核代码:

从如下的代码中,我们知道, NETIF_F_HW_CSUM_BIT 其实就对应着 tx-checksum-ip-generic 。第一个问题解答完毕。

static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
[NETIF_F_SG_BIT] = "tx-scatter-gather",
[NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4",
[NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic",//caq:对user展示为 tx-checksum-ip-generic,其实就是 NETIF_F_HW_CSUM_BIT
[NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6", #define __NETIF_F_BIT(bit) ((netdev_features_t)1 << (bit))
#define __NETIF_F(name) __NETIF_F_BIT(NETIF_F_##name##_BIT)
**#define NETIF_F_HW_CSUM __NETIF_F(HW_CSUM)**
#define NETIF_F_HW_VLAN_CTAG_FILTER __NETIF_F(HW_VLAN_CTAG_FILTER)
#define NETIF_F_HW_VLAN_CTAG_RX __NETIF_F(HW_VLAN_CTAG_RX)
#define NETIF_F_HW_VLAN_CTAG_TX __NETIF_F(HW_VLAN_CTAG_TX)
**#define NETIF_F_IP_CSUM __NETIF_F(IP_CSUM)** //caq: NETIF_F_IP_CSUM 就是 1<< NETIF_F_IP_CSUM_BIT
**#define NETIF_F_IPV6_CSUM __NETIF_F(IPV6_CSUM)**

从上面的宏可以看出,NETIF_F_HW_CSUM 其实就是 1<<NETIF_F_HW_CSUM_BIT

具体的值由下面的枚举决定,也就是:

enum {
NETIF_F_SG_BIT, /* Scatter/gather IO. */
NETIF_F_IP_CSUM_BIT, /* Can checksum TCP/UDP over IPv4. */
__UNUSED_NETIF_F_1,
NETIF_F_HW_CSUM_BIT, /* Can checksum all the packets. */
NETIF_F_IPV6_CSUM_BIT, /* Can checksum TCP/UDP over IPV6 */

再来关注第二个问题,也是查看内核代码,

static int virtnet_probe(struct virtio_device *vdev)
{
.....
/* Do we support "hardware" checksums? */
if (virtio_has_feature(vdev, VIRTIO_NET_F_CSUM)) {//caq:设备进行校验和计算
/* This opens up the world of extra features. */
dev->hw_features |= NETIF_F_HW_CSUM | NETIF_F_SG;
if (csum)
dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG;
.....
}

说明virtio_net设备,如果 VIRTIO_NET_F_CSUM 设置的话,只是具备了 NETIF_F_HW_CSUM 的feature,所以它展示为on,而

NETIF_F_IP_CSUM并没有设置,所以为off,第二个问题解答完毕。

第三个问题,为啥看到的是fixed打印,

参考https://stackoverflow.com/questions/27478810/what-does-the-meaning-of-fixed-string-in-output-of-ethtool-command,

Those are the parameters that cant be changed, they are "fixed",也就是固定的意思,不可更改,而不可更改的原因一般是,硬件或者驱动没有提供这个feature,所以用户

去更改的时候会 报Could not change any device features。

有兴趣的同学或者可以参考ethtool的源码。

查看相关的合入记录,以及参考 kernel的资料,一般认为:

NETIF_F_HW_CSUM is a superset of NETIF_F_IP_CSUM + NETIF_F_IPV6_CSUM. It means that device can fill TCP/UDP-like checksum anywhere in the packets whatever headers there might be.

也就是说,NETIF_F_HW_CSUM 是 NETIF_F_IP_CSUM 和 NETIF_F_IPV6_CSUM 的一个超集。

那是不是说 NETIF_F_HW_CSUM 设置了on,则 NETIF_F_IP_CSUM 一定是on呢?显然不是,这个超级就像 你用推土机挖山,也可以用锄头或者铁锹,推土机从

功能上看覆盖了锄头和铁锹,但是你要用推土机挖一锄头,还得使能它具备锄头的能力才行。也就是特性上,目前还维护了三个。

但是既然是硬件计算校验和,NETIF_F_HW_CSUM从功能上显然是能覆盖,所以

NETIF_F_HW_CSUM 的出现,显得 NETIF_F_IP_CSUM 和 NETIF_F_IPV6_CSUM 就过时了。这个也和

https://lwn.net/Articles/666178/ 这篇文章说的类似。第四个问题解答完毕。

Many drivers advertise NETIF_F_IP_CSUM and NETIF_F_IPV6_CSUM and it
probably isn't feasible to convert them all in a given time frame
(although if we could this would be a great simplification to the
stack). A reasonable direction may be to declare that new drivers must
use NETIF_F_HW_CSUM as NETIF_F_IP_CSUM and NETIF_F_IPV6_CSUM are
considered deprecated.

参考资料:

https://www.kernel.org/doc/html/v5.14/networking/netdev-features.html

virtio_net设备的校验和问题的更多相关文章

  1. virtio_net 设备的队列数问题

    virtio_net设备的其他问题:见 https://www.cnblogs.com/10087622blog/p/15886345.html 一个virtio_net设备在 virtnet_pro ...

  2. 如何使能512个virtio_blk设备

    一例virtio_blk设备中断占用分析 背景:这个是在客户的centos8.4的环境上复现的,dpu是目前很多 云服务器上的网卡标配了,在云豹的dpu产品测试中,dpu实现的virtio_blk 设 ...

  3. 关于virtio_net网卡命名的小问题

    最近看了一个小问题,涉及到一致性网络设备命名(Consistent Network Device Naming),在此记录一下. 系统是 4.18.0-240.el8.x86_64,centos 8. ...

  4. vhost-user 分析1

    2018-01-24 占个坑,准备下写vhost-user的东西 vhost-user是vhost-kernel又回到用户空间的实现,其基本思想和vhost-kernel很类似,不过之前在内核的部分现 ...

  5. 【工业串口和网络软件通讯平台(SuperIO)教程】四.开发设备驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    开发准备 把“开发包”内的所有文件复制到项目的“bin”目录下,或项目下的专用生成目录.开发包 ...

  6. [转载] ACE 组播校验和出错问题解决

    源地址:http://yuanmuqiuyu2000.blog.sohu.com/140904942.html 使用ACE框架写了个组播简单的测试工具,但是测试过程中,总是发现udp校验和出错的信息. ...

  7. kernel 校验和实现

    kernel 校验和实现 Kernel checksum implementation ) TCP包的错误检测使用16位累加和校验. 除了TCP包本身, TCP校验数据块还包括源IP地址,目的IP地址 ...

  8. GRE配置教程——华为设备

    GRE隧道是通过隧道两端的Tunnel接口建立的,所以需要在隧道两端的设备上分别配置Tunnel接口.对于GRE的Tunnel接口,需要指定其协议类型为GRE.源地址或源接口.目的地址和Tunnel接 ...

  9. TCP可靠传输:校验和,重传控制,序号标识,滑动窗口、确认应答

    Tcp通过校验和,重传控制,序号标识,滑动窗口.确认应答实现可靠传输 应答码:ACK TCP的滑动窗口机制       TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一 ...

随机推荐

  1. 浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程

    前言 为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较.通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web ...

  2. Spring cloud gateway 如何在路由时进行负载均衡

    本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...

  3. SAP Picture Control(图片加载)

    Screen display 效果 源代码 program sap_picture_demo. set screen 200. TYPE-POOLS cndp. ******************* ...

  4. 基于thinkphp6 layui的优秀极速后台开发框架推荐

    很多时候我们在做项目开发的时候,苦于没有好一点的轮子,自己动手开发的话,太耗费时间了,如果采用VUE的话,学习成本跟调试也比较麻烦, 而且有时候选用的东西甲方也不太容易接受,现在给大家介绍一款优秀的极 ...

  5. Linux目录结构和文件类型

    文件系统目录结构 根(/)是所有文件的入口,类似于倒状的树 以 . 开头的文件为隐藏文件 文件路径之间用/分隔,包括路径在内文件名称最长4095个字节 文件名除了斜杠和NUL都可以,文件名的最大长度是 ...

  6. 【万字长文】从零配置一个vue组件库

    简介 本文会从零开始配置一个monorepo类型的组件库,包括规范化配置.打包配置.组件库文档配置及开发一些提升效率的脚本等,monorepo 不熟悉的话这里一句话介绍一下,就是在一个git仓库里包含 ...

  7. 毕业论文着急了?Python疫情数据分析,并做数据可视化展示

    采集流程 一..明确需求 采集/确诊人数/新增人数 二.代码流程 四大步骤 发送请求 获取数据 网页源代码 解析数据 筛选一些我想用的数据 保存数据 保存成表格 做数据可视化分析 开始代码 1. 发送 ...

  8. idea 在创建maven时没有src的解决方法

    在创建maven时    加上archetypeCatalog=internal

  9. 复制docker容器中的nginx某个文件到linux中

    前提:docker容器中的nginx要开启

  10. HashSet存储自定义类型元素和LinkedHashSet集合

    HashSet集合存储自定义类型元素 HashSet存储自定义类型元素 set集合报错元素唯一: ~存储的元素(String,Integer,-Student,Person-)必须重写hashCode ...