网环元素管理

按照本主题中的指南在网络数据传输期间管理 NET_RING 结构及其元素。 本主题中的规则介绍了客户端驱动程序可以修改哪些 net ring 元素的成员以及何时可以修改,具体取决于数据路径方案,以及客户端驱动程序应对这些结构记住的一般信息。

重要

客户端驱动程序应在开发的所有阶段遵循这些方向。 如果客户端驱动程序在使用驱动程序验证程序进行测试时未遵循这些说明,驱动程序验证程序会报告冲突,并在受测设备上触发 bug 检查。

NET_RING

启动 NET_RING的父数据包队列时,环中的所有索引都初始化为 0

下表描述了客户端驱动程序可以修改的 Net Ring 的哪些成员。

字段 允许修改客户端驱动程序
OSReserved1
ElementStride
NumberOfElements
ElementIndexMask
EndIndex
OSReserved0
OSReserved2
BeginIndex 是 (必需)
NextIndex 是 (可选) 注意:框架从不读取 NextIndex
Scratch 是 (可选) 注意:框架从不读取 Scratch
Buffer

客户端驱动程序不得修改此结构的任何只读成员,也不能在调用 EvtPacketQueueAdvance 期间将 BeginIndex 递增到 EndIndex

有关净环中的索引所有权的详细信息,请参阅 净环简介

NET_PACKET

NET_PACKET中的字段对运行数据路径的不同上下文敏感。 是否设置了数据包的 Ignore 字段,以及驱动程序是接收 (Rx) 还是传输 (Tx) 数据包更改应用于数据包的规则集。

下表提供了每个方案中驱动程序的说明。

Rx 或 Tx 忽略字段由... 备注
Rx 客户端驱动程序
  • 在 Rx 期间,客户端驱动程序设置 Ignore (如有必要),框架会读取它。 在 Rx 期间,客户端驱动程序无需读取 “忽略 ”。
  • 如果客户端驱动程序在 Rx 期间设置了 Ignore 字段,则:
    • 针对尚未成功编程到硬件的任何数据包取消 Rx 操作时,客户端驱动程序必须写入 Ignore 字段。 有关详细信息,请参阅 使用网络环取消网络数据
    • 客户端驱动程序不得将资源与数据包关联,因为它们不会被释放。
  • 如果客户端驱动程序在 Rx 期间未设置 Ignore 字段,则:
    • 客户端驱动程序必须填充 Layout 中的 FragmentIndexFragmentCount 和所有字段。
    • FragmentIndex 必须在片段环中的 BeginIndex (非独占)和 EndIndex (独占)之间。
    • FragmentCount 不能超过片段环中 BeginIndex 非独占和 EndIndex 独占之间的片段计数。
    • 如果客户端驱动程序移动相应的片段环 BeginIndex ,则必须移动数据包环 BeginIndex
    • 调用 EvtPacketQueueAdvance 后,如果客户端驱动程序递增数据包环 BeginIndex ,则驱动程序还必须将片段环 BeginIndex 递增超过该数据包的片段。 换句话说,片段环 BeginIndex 应移动到上一个数据包片段的 EndIndex
Tx NetAdapterCx
  • 客户端驱动程序不得修改除 Scratch 以外的任何数据包中的任何字段。
  • 客户端驱动程序可以读取 Ignore 值,但绝不能写入它。
  • 如果忽略 Tx 数据包,驱动程序不得读取除可能为 Scratch 的任何字段(如有必要)。

NET_PACKET_LAYOUT

在 Rx 操作期间,NET_PACKET布局字段受以下规则约束:

  • Reserved0 之外的所有字段都必须由客户端驱动程序初始化。
  • 如果 Layer2Type 设置为 NetPacketLayer2TypeEthernet,则 Layer2HeaderLength 必须为 14 或更大。
  • 如果 Layer2Type 设置为 NetPacketLayer2TypeNull,则 Layer2HeaderLength 必须设置为 0
  • 如果 Layer3Type 是 IPv4 类型,则 Layer3HeaderLength 必须为 20 或更大。
  • 如果 Layer3Type 是 IPv6 类型,则 Layer3HeaderLength 必须为 40 或更大。
  • 如果 Layer4Type 设置为 Tcp,则 Layer4HeaderLength 必须为 40 或更大。
  • 如果 Layer4Type 设置为 Udp,则 Layer4HeaderLength 必须为 8 或更大。
  • 层类型字段必须在相应的枚举范围内。

在 Tx 期间不使用布局

NET_FRAGMENT

NET_FRAGMENT 字段规则取决于驱动程序是接收还是正在传输,以及片段缓冲区是由驱动程序还是框架附加到数据包。

Rx 或 Tx 备注
Rx
  • 客户端驱动程序无法写入 OsReserved_Bounced 字段。
  • 如果驱动程序未附加,则不能修改 容量 ,但必须修改 ValidLengthOffset
  • 如果驱动程序正在附加,则必须修改 CapacityValidLengthOffset
  • 抵消 + ValidLength 必须小于 Capacity
Tx
  • 客户端驱动程序不能修改除 Scratch 以外的任何字段。