首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在e1000 linux代码中,哪里可以将rx/tx网络数据包归零?

在e1000 linux代码中,哪里可以将rx/tx网络数据包归零?
EN

Stack Overflow用户
提问于 2015-05-13 15:35:48
回答 1查看 445关注 0票数 1

我需要知道在什么地方可以对e1000 linux驱动程序中接收/传输的网络数据包进行归零。我需要知道这一点才能通过一个遵从性要求,但我无法在e1000的代码中找到对网络数据包缓冲区进行零化的地方(或者如果它已经在某个地方进行了零化,那就太好了)

当接口在文件Intel_LAN_15.0.0_Linux_Source_A00/Source/base_driver/e1000e-2.4.14/src/netdev.c中的内核中、e1000_clean_rx_ring()函数和e1000_clean_tx_ring()函数中上升或下降时,我看到它确实会引起零化:

代码语言:javascript
复制
    /* Zero out the descriptor ring */
    memset(rx_ring->desc, 0, rx_ring->size);

但我无法找到系统接收/发送的每个数据包应该在哪里完成。

那么,有谁知道在代码中tx/rx数据包的缓冲区零化应该发生在哪里呢?我打赌它会带来一些开销,但无论如何我还是得做。

我们使用的是英特尔EF多端口网卡:https://www-ssl.intel.com/content/www/us/en/network-adapters/gigabit-network-adapters/gigabit-et-et2-ef-multi-port-server-adapters-brief.html?和内核3.4.107

我们使用的是linux-image-3.4.107-0304107-generic_3.4.107-0304107.201504210712_amd64.deb内核

编辑:@skgrrwasme正确地指出,e1000_clean_tx_ring和e1000_clean_rx_ring函数似乎完成了零化工作,但由于它只在hw关闭时才完成,因此对我们的遵从性需求是无效的。

因此,为每个包执行工作的函数似乎是e1000_clean_rx_irq和e1000_clean_tx_irq,但是这些函数不会对数据进行零化,它们只释放内存,但不会使memset()以0覆盖内存(这是必需的)。因此,我认为可以做的是,当rx或tx在e1000_clean_tx_irq()调用e1000_unmap_and_free_tx_resource()时对数据进行零化就足够了,但实际上它只是释放数据,而不是将其归零:

代码语言:javascript
复制
    if (buffer_info->skb) {
            dev_kfree_skb_any(buffer_info->skb);
            buffer_info->skb = NULL;
    }

因此,我认为我们可以在memset的dev_kfree_skb_any()中编写。该函数调用两个函数: dev_kfree_skb_any(struct sk_buff *skb) { if (in_irq() AC.26 irqs_disabled() dev_kfree_skb_irq(skb);to dev_kfree_skb(skb);}

因此,简单的方法是调用skb_recycle_check(skb);这将执行以下操作:

代码语言:javascript
复制
    memset(skb, 0, offsetof(struct sk_buff, tail));

这有道理吗?我想这样,记忆就会被零覆盖,工作也会完成,但我不确定.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-13 22:00:57

TL;DR

据我所知,发送和接收缓冲器已经由驱动程序为发送和接收清理。我不认为你需要做任何事。

较长答案

我觉得你没必要担心。发送和接收缓冲区清除功能( 伊尔克伊尔克 )似乎在任何中断配置中都被调用,并且用于发送和接收。可以使用下列任何中断信令方法触发中断:旧式中断、MSIMSI。似乎在任何中断模式下都会发生环形缓冲区清理,但它们在不同的位置调用清理功能。

由于您有两种类型的传输(传输和接收)和三种不同类型的中断调用(Legacy、MSI和MSI),所以总共有六种scenarious,您需要确保清理这些内容。幸运的是,六种情况中的五种通过为纳比调度作业来处理数据包。这些场景用于遗产和MSI中断的发送和接收,以及MSI的接收。处理这些数据包的一部分是将打扫函数作为回调调用。如果您查看代码,您将看到它调用了TX和RX的缓冲区清理函数。

离群点是MSI处理程序。但是,它似乎直接调用TX缓冲区清理功能,而不是让NAPI处理它。

下面是上面没有具体列出的相关中断处理程序:

遗产( RX和TX)

MSI ( RX和TX)

MSI

备注

  1. 我所有的函数引用都将在名为netdev.c的e1000e驱动程序中打开一个文件。他们将在Linux交叉参考数据库中打开一个窗口。
  2. 这篇文章讨论了e1000e驱动程序,但是一些函数名是“e1000.”。我认为许多e1000代码是在新的e1000e驱动程序中重用的,因此有些名称被继续使用。只是要知道这不是一个错误。
  3. 在任何实际的数据包处理过程中,您所引用的函数似乎只在驱动程序试图释放资源或硬件中断时才被调用。不过,我上面提到的两个似乎。我不知道他们之间到底有什么区别,但他们似乎完成了任务。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30219416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档