非 RSS 接收处理

不支持 RSS 的微型端口驱动程序句柄接收处理,如本主题中所述。

下图演示了非 RSS 接收处理。

说明不使用 RSS 的发送和接收处理的关系图。

在图中,虚线路径表示发送和接收处理的备用路径。 由于系统控制缩放,因此处理并不总是在提供最佳性能的 CPU 上进行。 连接只会偶然通过连续中断在同一 CPU 上进行处理。

以下过程针对每个非 RSS 中断周期重复:

  1. NIC 使用 DMA 用接收的数据填充缓冲区,并中断系统。

    微型端口驱动程序在初始化期间在共享内存中分配接收缓冲区。

  2. 在此中断周期中,NIC 可以随时继续填充其他接收缓冲区。 但是,在微型端口驱动程序启用中断之前,NIC 不会再次中断。

    系统在一个中断周期中处理的接收缓冲区可以与许多不同的网络连接相关联。

  3. NDIS 在系统确定的 CPU 上 (ISR) 调用微型端口驱动程序的 MiniportInterrupt 函数。

    理想情况下,ISR 应转到最不繁忙的 CPU。 但是,在某些系统中,系统会将 ISR 分配给可用的 CPU 或与 NIC 关联的 CPU。

  4. ISR 禁用中断,并请求 NDIS 将延迟过程调用排队 (DPC) 处理接收的数据。

  5. NDIS (当前 CPU 上的 DPC) 调用 MiniportInterruptDPC 函数。

  6. DPC 生成接收所有接收缓冲区的描述符,并指示驱动程序堆栈上的数据。 有关详细信息,请参阅 接收网络数据

    对于许多不同的连接,可以有多个缓冲区,并且可能需要完成大量处理。 接收的与后续中断周期关联的数据可以在其他 CPU 上进行处理。 给定网络连接的发送处理也可以在不同的 CPU 上运行。

  7. DPC 启用中断。 此中断周期已完成,进程将再次启动。