在接收路径中查找已封装数据包的传输标头
接收数据包时, 支持使用泛型路由封装 (NVGRE) 的网络虚拟化的 NIC 必须首先确定是否封装了数据包,如果是,则确定封装的类型。
注意 在发送路径中,如果 NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO,则会封装数据包。IsEncapsulatedPacket 为 TRUE。
在接收路径中,NIC 必须通过检查 IPv4 隧道的 “协议 ”字段中的协议号 (外部) 标头或 IPv6 隧道的 NextHeader 字段 (外部) 标头来确定是否封装数据包。 可在 中找到 https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml分配的协议编号列表。
将数据包确定为封装数据包后,NIC 必须通过分析封装数据包的协议来确定内部) IP 标头的传输 (偏移量。
对于 NDIS 6.30 (Windows Server 2012) 及更高版本,仅支持 GRE IP 封装。 因此,NIC 应该能够分析以下内容,具体取决于播发的功能:
- GRE (RFC 2784:泛型路由封装 (GRE) ) 标头
- RFC 2890:密钥和序列号扩展为 GRE
- IPv4 (RFC 791:Internet 协议) 标头
- IPv6 (RFC 2460:Internet 协议版本 6 (IPv6) ) 标头
如果 NIC 发现未知或不受支持的封装协议,则必须将未更改的数据包传递到主机堆栈。
因此,在接收路径上,微型端口必须分析内部) IP 标头 (传输,以确定 IP 版本以及访问 TCP 或 UDP 标头。 这是 NDIS 6.30 (Windows Server 2012) 及更高版本的新要求。