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