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

Where, in the e1000 linux code, can I zeroize rx/tx network packets?

我需要知道在哪里可以对 e1000 linux 驱动程序中的 received/transmitted 网络数据包进行零化。我需要知道这一点才能通过一项合规性要求,但我无法在 e1000 的代码中找到在哪里对网络数据包缓冲区进行归零(或者如果它已经在某处进行了归零,那就太好了)

我在 e1000_clean_rx_ring()e1000_clean_tx_ring() 函数 e1000_clean_rx_ring()e1000_clean_tx_ring() 的文件 Intel_LAN_15.0.0_Linux_Source_A00/Source/base_driver/e1000e-2.4.14/src/netdev.c 中看到当内核中接口上升或下降时它会进行环置零:

    /* Zero out the descriptor ring */
    memset(rx_ring->desc, 0, rx_ring->size);

但我无法找到系统 receives/send.

应该为每个数据包完成的位置

那么,有人知道代码中应该对 tx/rx 数据包进行缓冲区清零的地方在哪里吗?我打赌它会引入一些开销,但无论如何我都必须这样做。

我们使用的是 intel 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 函数似乎进行了归零工作,但由于它仅在硬件关闭时才完成,因此对我们的合规性无效需要。

所以,似乎为每个数据包做工作的函数是 e1000_clean_rx_irq 和 e1000_clean_tx_irq,但这些函数不会将数据清零,它们只会释放内存但不会用 0 制作一个 memset() 来覆盖内存(这就是所需要的)。所以,我认为可以做的是,因为在 rx 或 tx 时将数据置零就足够了,在 e1000_clean_tx_irq() 调用 e1000_unmap_and_free_tx_resource() 内部,但实际上它只是释放它,而不是将其置零它:

    if (buffer_info->skb) {
            dev_kfree_skb_any(buffer_info->skb);
            buffer_info->skb = NULL;
    }

所以我认为我们可以在内存集 dev_kfree_skb_any() 中写入。该函数调用两个函数: dev_kfree_skb_any(结构sk_buff *skb) { 如果 (in_irq() || irqs_disabled()) dev_kfree_skb_irq(skb); 别的 dev_kfree_skb(skb); }

所以,简单的事情就是调用 skb_recycle_check(skb);那会做一个:

    memset(skb, 0, offsetof(struct sk_buff, tail));

这有意义吗?我认为有了这个,内存将被零覆盖,工作就会完成,但我不确定...

TL;DR

据我所知,发送和接收缓冲区都已被驱动程序清除以进行发送和接收。我认为你不需要做任何事情。

更长的答案

我认为您不必为此担心。发送和接收缓冲区清除函数,e1000_clean_rx__irq and e1000_clean_rx_irq, seem to be called in any interrupt configuration, and for both transmit and receive. Interrupts can be triggered with any of the following interrupt signaling methods: legacy, MSI, or MSI-X。似乎在任何中断模式下都会发生环形缓冲区清理,但它们会在不同的位置调用清理函数。

由于您有两种类型的传输(传输和接收)和三种不同类型的中断调用(旧版、MSI 和 MSI-X),您总共有六个场景需要确保一切正常清洁。幸运的是,六种情况中的五种通过为 NAPI. These scenarios are transmit and receive for Legacy and MSI interrupts, and receive for MSI-X. Part of NAPI handling those packets is calling the e1000_clean 函数调度作业作为回调来处理数据包。如果您查看代码,您会发现它调用了 TX 和 RX 的缓冲区清理函数。

异常值是 MSI-X TX handler。不过好像是直接调用TX buffer cleaning函数,而不是让NAPI来处理。

以下是上面未具体列出的相关中断处理程序:
Legacy (both RX and TX)
MSI (both RX and TX)
MSI-X RX

备注

  1. 我所有的函数引用都将在 e1000e 驱动程序中打开一个名为 netdev.c 的文件。他们会在Linux Cross Reference database.

  2. 中开一个window
  3. 这篇post讨论的是e1000e驱动,但是有些函数名是"e1000..."。我认为很多 e1000 代码在较新的 e1000e 驱动程序中被重用,所以一些名称被沿用了下来。请注意这不是错别字。

  4. 您提到的 e1000_clean_tx_ring and e1000_clean_rx_ring 函数似乎仅在驱动程序尝试释放资源或硬件出现故障时调用,在任何实际数据包处理过程中。不过,我上面提到的两个似乎。我不确定它们之间到底有什么区别,但它们似乎完成了工作。