【问题标题】:manually allocate data buffer for skb struct为 skb struct 手动分配数据缓冲区
【发布时间】:2018-01-09 04:22:35
【问题描述】:

我有两个通过 PCIE 总线连接的板。他们可以通过预先分配的消息缓冲区交换数据。现在我尝试基于这个连接实现一个虚拟网络接口。 参考一些网络驱动源表明他们实现接收路径有两种方法:

  • 使用dev_alloc_skb()在接收函数内部分配skb,并将数据复制到为这个skb分配的缓冲区中。
  • 使用dev_alloc_skb() 分配skb 并将它们的缓冲区放入RX 环中。

在这两种情况下,缓冲区是由dev_alloc_skb() 分配的。我只想分配skb 控制头并将data 指针指向我的消息缓冲区。我们还必须修改skb_free() 以将消息缓冲区放回消息池。

请任何人告诉我是否有任何参考代码也使用类似的方法,或者请提出一种更好的方法来最大限度地减少代码更改。任何建议表示赞赏。提前致谢!

【问题讨论】:

标签: linux-kernel linux-device-driver


【解决方案1】:

你可以使用build_skb:

因此,交易将只分配 NIC 的数据缓冲区以 填充其 RX 环形缓冲区。并在 RX 完成时使用build_skb() 将数据缓冲区(现在填充有以太网帧)附加到新的 skb, 初始化skb_shared_info部分,并将热skb提供给网络 堆栈。

build_skb() 是分配 skb 的函数,调用者提供 应该附加到它的数据缓冲区。预计司机会打电话 skb_reserve()build_skb() 之后让skb->data 指向 以太网帧(通常跳过NET_SKB_PADNET_IP_ALIGN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2013-09-26
    • 2010-09-22
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多