网环元素管理
按照本主题中的指南在网络数据传输期间管理 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 | 客户端驱动程序 |
|
Tx | NetAdapterCx |
|
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 |
|
Tx |
|