加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 确定添加到以太网帧的填充量

发布时间:2020-12-16 07:34:40 所属栏目:百科 来源:网络整理
导读:我正在研究 Linux内核的驱动程序.为了我项目的成功,我需要确定添加到以太网帧的填充量小于最小60字节(不包括FCS).我没有生成这些框架;我在NIC上接收它们进行处理. 有一个struct sk_buff,是否可以直接确定添加到数据包的尾随零的数量? 我当然可以通过遍历整
我正在研究 Linux内核的驱动程序.为了我项目的成功,我需要确定添加到以太网帧的填充量小于最小60字节(不包括FCS).我没有生成这些框架;我在NIC上接收它们进行处理.

有一个struct sk_buff,是否可以直接确定添加到数据包的尾随零的数量?

我当然可以通过遍历整个数据包确定该值,找出最高层内容的结束位置,然后简单地从帧大小中减去该位置(在本例中为60字节).但有没有一种更有效的方法直接从存储在struct sk_buff上的信息中做到这一点?

解决方法

编辑:据我所知,没有办法直接使用sk_buff结构检查零填充,而没有实际查看以太网头,这很简单.

也就是说,通过一些简单的指针算法和字节减法,您可以使用IP数据中的长度字段来计算填充.

这是sk_buff的一个很好的参考:
http://vger.kernel.org/~davem/skb_data.html

这里有一个很好的数据包结构参考,在’data’的底部图片中显示’length’字段.

http://nerdcrunch.com/wp-content/uploads/2011/05/Ethernet-Frame-Explained.png

我认为这是它必须完成的方式,但它不需要像以前那样进行解析.设置头/数据结构字段,使得它们可以通过指针/数组直接引用/剥离而无需解析,然后通过从原始数据包长度中减去头数据长度,您可以获得填充,所有这些都不需要检查数据.

希望有所帮助.

此外,为了获得最佳实践,您可能应该使用两个版本的802.3的驱动程序帐户.您可以通过检查Ethertype / length字段来完成此操作.如果该值大于1536(0x0600),则表示它是以太网II类型数据包,并且该字段包含ethertype,它告诉您以太网数据包封装的内容.如果维基百科为“Ethertype”,有一些很受欢迎的.

例如,IP = 0x0800.如果字段指定Ethertype,则必须求助于在里面找到数据长度字段以找到填充.如果没有,那么很多基于以太网的局域网仍然没有,那么你可以直接使用指定为长度的字段来完成你的工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读