重新处理操作
撤退操作可以增加NET_BUFFER结构或 NET_BUFFER_LIST 结构中所有 NET_BUFFER结构中使用的 数据空间的大小。
NDIS 提供以下撤退函数:
NdisRetreatNetBufferListDataStart
撤退操作有时可以分配与NET_BUFFER结构关联的 MDL。 若要提供分配 MDL 的机制,驱动程序可以为 NetAllocateMdl 函数提供可选的入口点。 如果入口点为 NULL,则 NDIS 使用默认方法来分配 MDL。 必须在 NetFreeMdl 函数中释放 MDL,该函数提供用于分配 MDL 的机制的倒数。
为了获取新的 DataLength,NDIS 将驱动程序指定的 DataOffsetDelta 添加到当前 DataLength 。 如果 未使用的数据空间 的大小大于 DataOffsetDelta,则撤退操作会减小 DataOffset 。 在这种情况下,新的 DataOffset 为当前 DataOffset 减去 DataOffsetDelta 。
如果 DataOffsetDelta 大于 DataOffset,则撤退操作会分配新的数据空间。 在这种情况下,NDIS 会相应地调整 DataOffset 。
对于发送操作,如果没有足够的 未使用数据空间 来满足撤退请求,NDIS 将分配内存。 如果不需要内存分配,则 NDIS 只需调整 DataOffset 和 DataLength 。 为了提高性能,驱动程序应在发送之前分配足够的总数据大小,以适应所有基础驱动程序的撤退操作。
对于接收返回情况,NDIS 只需相应地调整 DataOffset 和 DataLength 。 撤退操作将撤消在接收处理期间发生的高级操作。 在撤退操作之后, 使用的数据空间 包含基础驱动程序在接收处理期间使用的标头数据。