数据包大小以太网 hdr+IP hdr+TCP hdr+payload和 Rx Descriptor 缓冲区元素之间的关系是什么

问题描述

我正在阅读驱动程序代码,看起来每个 Rx 描述符缓冲区都是这样定义的

       struct page *Rx_databuff [256] //256 Rx Descriptors in Overall Buffer for DMA

上述代码如何与数据包大小相关联。上面的数组是否一次只能处理 256 个数据包,这个值不应该是动态的,这意味着使用 Ethtool 或一些工具增加这个大小,以便 DMA 缓冲区中可以一次累积超过 256 个数据包,也可以在内核中增加到接受那个数量的数据包。或者数组中的单个 Rx_databuf 指针元素可以接受多个数据包。真的会发生什么?感谢帮助

Driver 也定义了 Rx Descrptor 的结构,就像这样用于驱动程序

     struct RxDesc {
        __le32 opts1;
        __le32 opts2;
        __le64 addr;
   };

addr 是从 page 指针类型的 Rx_databuff 到单个页面的 DMA 映射地址

其中使用了整体 Coherent DMA 映射,并且在驱动程序中也使用了单页流映射以用于相同的 RxDesc。 RxDesc 的 addr 映射到内核页面(单个页面明智的流映射 api)和之前的 Coherent 映射像这样

    mystruct_obj->RxDesc_pointer = dma_alloc_coherent(&pdev->dev,RX_RING_BYTES,&tp->RxPhyAddr,GFP_KERNEL);

Rx_RING_BYTES = NUM​​_RX_DESC * sizeof(struct RxDesc))

NUM_RX_DESC = 256U

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...