V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
huangya
V2EX  ›  Linux

请教个网卡驱动代码问题

  •  
  •   huangya · 2022-11-29 19:14:20 +08:00 · 1475 次点击
    这是一个创建于 744 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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);
    5 条回复    2022-12-05 18:22:56 +08:00
    wangkai0351
        1
    wangkai0351  
       2022-11-30 09:43:59 +08:00
    要不是为了 buffer alignment ,要不是加上了某个 header 的最小长度是个魔法数,换句话说 dev_alloc_skb(0)也没有实际意义吧。
    huangya
        2
    huangya  
    OP
       2022-11-30 10:00:29 +08:00
    @wangkai0351 dev_alloc_skb ( 0 )不可以吧,至少要大于或者等于收到的包的长度,不然接下来从网卡里面取包怎么装得下?
    wangkai0351
        3
    wangkai0351  
       2022-11-30 10:30:23 +08:00
    @huangya 你再琢磨一下我 1 楼的发言,你好像理解错了
    tomychen
        4
    tomychen  
       2022-12-05 13:57:56 +08:00
    你再接着往下看 skb_reserve
    huangya
        5
    huangya  
    OP
       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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2319 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.