繁体   English   中英

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

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

我需要知道如何在e1000 linux驱动程序中对接收/传输的网络数据包进行归零。 我需要知道这一点才能通过一项合规性要求,但是我无法在e1000的代码中找到对网络数据包缓冲区进行归零的位置(或者如果它已经在某处进行了归零,那将很棒)

我在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);

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

那么,有人知道代码中应将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函数似乎在进行归零化工作,但由于仅在硬件关闭时才进行归零工作,因此对我们的合规性要求无效。

因此,似乎对每个数据包起作用的函数是e1000_clean_rx_irq和e1000_clean_tx_irq,但是这些函数不会将数据归零,它们仅释放内存,但不会使memset()变为0来覆盖内存(这就是需要什么)。 因此,我认为可以做的是,在e1000_clean_tx_irq()调用e1000_unmap_and_free_tx_resource()时,在rx或tx时足以将数据清零,但实际上它只是将其释放,而不是将其清零:

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

因此,我认为我们可以在内存集dev_kfree_skb_any()中编写代码。 该函数调用两个函数:dev_kfree_skb_any(struct sk_buff * skb){if(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__irqe1000_clean_rx_irq ,并且用于发送和接收。 可以使用以下任何一种中断信令方法来触发中断:传统, MSIMSI-X 似乎环形缓冲区清洗在任何中断模式下都会发生,但是它们在不同的位置调用清洗功能。

由于您有两种类型的传输(发送和接收)和三种不同类型的中断调用(传统,MSI和MSI-X),因此共有六种方案需要确保清理。 幸运的是,六种情况中的五种通过为NAPI安排作业来处理数据包。 这些情况是为旧版和MSI中断发送和接收的,对于MSI-X是接收和发送的。 NAPI处理这些数据包的一部分是调用e1000_clean函数作为回调。 如果看一下代码,您会发现它调用了TX和RX的缓冲区清除功能。

异常值是MSI-X TX处理程序 但是,它似乎直接调用TX缓冲区清除功能,而不是由NAPI处理。

以下是上面未专门列出的相关中断处理程序:
旧版(RX和TX)
MSI(RX和TX)
微星-X RX

笔记

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

  2. 这篇文章讨论了e1000e驱动程序,但是其中一些函数名称是“ e1000 ...”。 我认为许多e1000代码已在较新的e1000e驱动程序中重用,因此有些名称沿用了。 只是知道这不是错字。

  3. 您引用的e1000_clean_tx_ringe1000_clean_rx_ring函数似乎也仅在驱动程序尝试释放资源或硬件关闭时才在任何实际的数据包处理期间调用。 我上面提到的两个似乎。 我不确定它们之间到底有什么区别,但是它们似乎可以完成工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM