在接收路徑中尋找封裝封包的傳輸標頭
在接收封包時, 使用一般路由封裝支援網路虛擬化的 NIC (NVGRE) 必須先判斷封包是否已封裝,如果是,則封裝的類型。
注意 在傳送路徑中,如果 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:網際網路通訊協定) 標頭
- IPv6 (RFC 2460:網際網路通訊協定版本 6 (IPv6) ) 標頭
如果 NIC 找到未知或不支援的封裝通訊協定,則必須將封包未變更傳遞至主機堆疊。
因此,在接收路徑上,迷你埠必須剖析傳輸 (內部) IP 標頭,以判斷 IP 版本,以及取得 TCP 或 UDP 標頭。 這是 NDIS 6.30 (Windows Server 2012) 和更新版本的新需求。