数据包指示格式

WFP 中将网络数据指示为 NDIS net buffer 列表 (NET_BUFFER_LIST ) 结构的下一NET_BUFFER_LIST可用于描述网络缓冲区列表链。 WFP 仅指示标注的单个 (列表,即 netBufferList-Next> == NULL) ,以下情况除外:

  • WFP 可以指示流层中标注的缓冲区列表链。

  • 当 WFP 将标注的转发路径中的 IP 数据包片段组分类时,WFP 指示将净缓冲区列表链分类为标注。 链内的每个净缓冲区列表描述单个片段。

尽管净缓冲区列表可以描述整个数据包,但对于不同类型的层,WFP 指示从 IP 标头开头的不同偏移量标注净缓冲区列表。 例如,在传入网络层,网络缓冲区列表在 IP 标头之后启动,而在传入传输层,网络缓冲区列表在传输标头之后启动。 IP 和传输标头始终由 net 缓冲区列表中的第 个NET_BUFFER结构描述。

通过使用架构的 ipHeaderSizetransportHeaderSize 成员,将 net 缓冲区列表的偏移 FWPS_INCOMING_METADATA_VALUES0 标注。 标注可以使用 NDIS 函数 NdisRetreatNetBufferDataStartNdisAdvanceNetBufferDataStart 来调整所指示净缓冲区列表的偏移量。 但是,在这种情况下,标注必须从 classifyFn 函数返回之前撤消偏移调整。

在调用用于传出数据的 classifyFn 函数时,NET_BUFFER_LIST可包含多个NET_BUFFER结构,其中每个结构描述一个 IP 数据包。 如果某些数据包 (例如,网络缓冲区) 网络缓冲区是可接受的,而其他数据包则不可接受,则标注驱动程序必须执行以下操作:

  1. 克隆并阻止整个 net 缓冲区列表。

  2. 生成一个新的网络缓冲区列表,用于描述网络缓冲区的可接受子集。

  3. 将新的网络缓冲区列表注入回发送路径。

或者,标注可以将不需要的 net 缓冲区从网络缓冲区列表中取消链接,并将更改后 net 缓冲区列表注入回发送路径。 但是,在这种情况下,标注驱动程序必须先撤消对克隆净缓冲区列表的此修改,然后才能调用 FwpsFreeCloneNetBufferList0 函数。 标注驱动程序还必须将原始网络缓冲区链接信息保存为其状态数据的一部分。

有关 WFP 使用的数据偏移量详细信息,请参阅数据 偏移位置

注意使用解密的 IPSec ESP 数据包的标注必须使用数据结构NET_BUFFER而不是 MDL 数据来确定数据包长度。 若要获取数据长度, 请使用 NET_BUFFER_DATA_LENGTH 宏 。 有关详细信息,请参阅 开发IPsec-Compatible标注驱动程序