Localizando o cabeçalho de transporte para pacotes encapsulados no caminho de recebimento
Ao receber um pacote, uma NIC que dá suporte à Virtualização de Rede usando nvgre (encapsulamento de roteamento genérico) deve primeiro determinar se o pacote é encapsulado e, em caso afirmativo, o tipo de encapsulamento.
Nota No caminho de envio, um pacote será encapsulado se NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. IsEncapsulatedPacket é TRUE.
No caminho de recebimento, a NIC deve determinar se o pacote é encapsulado verificando o número do protocolo no campo Protocolo do cabeçalho do túnel IPv4 (externo) ou o campo NextHeader do cabeçalho do túnel IPv6 (externo). A lista de números de protocolo atribuídos pode ser encontrada em https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml.
Depois que um pacote é determinado como um pacote encapsulado, a NIC deve determinar o deslocamento para o cabeçalho IP de transporte (interno) analisando o protocolo do pacote encapsulado.
Para o NDIS 6.30 (Windows Server 2012) e posterior, há suporte apenas para encapsulamento de IP GRE. Portanto, a NIC deve ser capaz de analisar o seguinte, dependendo dos recursos anunciados:
- Cabeçalhos GRE (RFC 2784: ENCAPSULAmento de Roteamento Genérico (GRE))
- RFC 2890: extensões de chave e número de sequência para GRE
- Cabeçalhos IPv4 (RFC 791: Protocolo de Internet)
- Cabeçalhos IPv6 (RFC 2460: Protocolo internet, versão 6 (IPv6))
Se a NIC encontrar um protocolo de encapsulamento desconhecido ou sem suporte, ele deverá passar o pacote inalterado para a pilha de host.
Assim, no caminho de recebimento, o miniporto deve analisar o cabeçalho IP de transporte (interno) para determinar a versão do IP, bem como para acessar o cabeçalho TCP ou UDP. Esse é um novo requisito para o NDIS 6.30 (Windows Server 2012) e posterior.