`ether_header` 和 `ethhdr` 有什么区别?

What is the difference between `ether_header` and `ethhdr`?

我目前正在尝试解析来自原始缓冲区的数据包。我发现以太网 header 似乎有两种结构:ether_headerethhdr。我有点困惑他们有什么区别和关系?我可以将它们互换使用吗?

我快速搜索了一下:

建议 IP header 存在两个相同的实现。以太网(可能还有 TCP、UDP 等)是否属于这种情况?

This patch 显示了从一种实现更改为另一种实现的努力。我不确定这背后的动机:也许一种实现方式是 "better"?

谢谢!

在Linux中,ethhdr结构定义在uapi/linux/if_ether.h中,它在内核uapi(user-spaceAPI)头文件中的位置固化它作为默认的稳定定义。

多年来,ether_header 结构已在许多地方定义。随着代码迁移到使用 ethhdr(正如您在链接到的补丁中观察到的那样),定义和对这些定义的引用的数量一直在下降。

查看此进展的一种简单方法是查看内核源代码交叉引用随时间的输出。以下列表描述了几个内核版本随时间变化的 ether_header definitions/references 的数量:

为了比较,这里是查找 ethhdr 时的结果: