请教个网卡驱动代码问题

2022-11-29 19:14:20 +08:00
 huangya
V 站高人比较多,请教个问题。我在学习网卡驱动,看的是<<深入理解 linux 网络技术内幕>>这本书.里面用的是 3c59x 网卡的例子( 3c59x.c ).其中在申请 buffer 的时候,先是从寄存器里面读取信息赋值给 rx_status.然后通过 rx_status & 0x1ffff 得到 packet 的大小。但使用 dev_alloc_skb (最新的内核使用 netdev_alloc_skb 函数)分配 buffer 的时候为什么还要加 5 呢?
网上找了找,有个网友说这是一种保护机制。没有细讲,不是很明白。找了 linux 的远古 commit 历史,也没有说明。有懂的 V 友能详细说说吗?

/* The packet length: up to 4.5K!. */
short pkt_len = rx_status & 0x1fff;
struct sk_buff *skb;

skb = dev_alloc_skb(pkt_len + 5);
1363 次点击
所在节点    Linux
5 条回复
wangkai0351
2022-11-30 09:43:59 +08:00
要不是为了 buffer alignment ,要不是加上了某个 header 的最小长度是个魔法数,换句话说 dev_alloc_skb(0)也没有实际意义吧。
huangya
2022-11-30 10:00:29 +08:00
@wangkai0351 dev_alloc_skb ( 0 )不可以吧,至少要大于或者等于收到的包的长度,不然接下来从网卡里面取包怎么装得下?
wangkai0351
2022-11-30 10:30:23 +08:00
@huangya 你再琢磨一下我 1 楼的发言,你好像理解错了
tomychen
2022-12-05 13:57:56 +08:00
你再接着往下看 skb_reserve
huangya
2022-12-05 18:22:56 +08:00
@tomychen 嗯,有关系吗? 接下来的 skb_reserve 我的理解是 source mac + dst mac + ethernet type 等于 14 个字节,reserve 两个字节就是 16 个字节。但与 dev_alloc_skb(pkt_len + 5) 中加 5 个 byte 我没看到有什么关系

skb_reserve(skb, 2); /* Align IP on 16 byte boundaries

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/898870

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX