网环元素管理

按照本主题中的指南在网络数据传输期间管理 NET_RING 结构及其元素。 本主题中的规则描述了在不同的数据路径方案下,客户端驱动程序可以修改哪些 net ring 元素的成员以及何时可以修改,并提供了客户端驱动程序在使用这些结构时应牢记的一般信息。

重要

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

NET_RING

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

下表描述了客户端驱动程序可以修改的 net ring 成员。

领域 允许修改客户端驱动程序
OSReserved1
ElementStride
NumberOfElements
ElementIndexMask
结束索引
OSReserved0
OSReserved2
BeginIndex 是(必需)
NextIndex 是(可选) 注意:框架永远不会读取 NextIndex
Scratch编程 是(可选) 注意:框架永远不会读取 Scratch
缓冲区

客户端驱动程序不得修改此结构中的任何只读成员,在调用 EvtPacketQueueAdvance 时,也绝不应将 BeginIndex 增加到超过 EndIndex

有关 net 通道中的索引所有权的详细信息,请参阅 net 通道简介

NET_PACKET

NET_PACKET中的字段对数据路径运行的不同上下文敏感。 是否设置数据包的“忽略”字段以及驱动程序是在接收(Rx)还是传输(Tx)数据包,会影响应用于该数据包的规则集。

下表为每种情景中的驾驶员提供指引。

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

网络数据包布局

在 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 字段。
  • 如果驱动程序未附加,则 Capacity 不得修改,而 ValidLengthOffset 必须修改。
  • 如果驱动程序正在附加,则必须修改 CapacityValidLengthOffset
  • 抵消 + ValidLength 必须小于 容量
Tx
  • 客户端驱动程序不能修改 除 Scratch 以外的任何字段。