Supporting NVGRE in RSS and VMQ Receive Task Offloads

NDIS 6.30 (Windows Server 2012) introduces Network Virtualization using Generic Routing Encapsulation (NVGRE). NDIS miniport drivers and NICs that perform Receive Side Scaling (RSS) and Virtual Machine Queue (VMQ) receive task offloads should do so in a way that supports NVGRE.

Note  This page assumes that you are familiar with the information in Offloading the Segmentation of Large TCP Packets.

If the miniport driver supports RSS and VMQ for encapsulated packets, it must advertise those capabilities in the RssSupported and VmqSupported members of the NDIS_ENCAPSULATED_PACKET_TASK_OFFLOAD structure. If the miniport advertised these capabilities, received an OID_TCP_OFFLOAD_PARAMETERS OID request, and succeeded the OID, the NIC must perform RSS and VMQ on the advertised encapsulated packet types.

For supported encapsulated packets that it is able to parse, the NIC must perform RSS on the TCP or UDP header in the payload of the transport (inner) IP header and VMQ on the inner MAC header.

For performing RSS and VMQ, the NIC must get to the transport (inner) IP header of the encapsulated packet as described in Locating the Transport Header for Encapsulated Packets in the Receive Path and check the protocol number. If the NIC receives a packet that uses a protocol that the NIC can parse, the NIC should:

  • Perform RSS by doing a 4-tuple hash on the transport (inner) IP header and the TCP or UDP header.
    • For encapsulated packets whose protocol the miniport cannot parse, the NIC should perform a 2-tuple hash on the source and destination address fields in the tunnel (outer) IP header.
    • For encapsulated packets that do not contain a TCP or UDP header immediately following the transport (inner) IP header, the NIC should perform a 2-tuple hash on the source and destination address fields in the tunnel (outer) IP header.
  • Perform VMQ by using the Ethernet header in the encapsulated packet. For encapsulated packets that do not contain an Ethernet header (within the encapsulated packet), VMQ should be performed using the outermost Ethernet header.