Поддержка NVGRE в разгрузке контрольной суммы
В NDIS 6.30 (Windows Server 2012) представлена виртуализация сети с использованием универсальной инкапсуляции маршрутизации (NVGRE). Драйверы мини-портов, протоколов и фильтров NDIS, а также сетевые адаптеры, которые разгружают задачи контрольной суммы, должны делать это таким образом, чтобы поддерживать NVGRE.
Примечание На этой странице предполагается, что вы знакомы с информацией в разделе Разгрузка задач контрольной суммы.
Если NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. IsEncapsulatedPacket имеет значение TRUE , а данные TcpIpChecksumNetBufferListInfo (OOB) являются допустимыми. Это означает, что требуется поддержка NVGRE и сетевой адаптер должен вычислить контрольную сумму для заголовка туннеля (внешнего) IP-адреса, транспортного (внутреннего) IP-заголовка и заголовка TCP или UDP.
Флаги IsIPv4 и IsIPv6 в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO указывают версию ip-заголовка туннеля (внешнего) IP-заголовка. Чтобы определить версию IP-адреса этого заголовка, сетевой адаптер должен проанализировать транспортный (внутренний) IP-заголовок. Так как пакеты смешанного режима разрешены (см. NDIS_ENCAPSULATED_PACKET_TASK_OFFLOAD), сетевой адаптер не должен предполагать, что внутренний и внешний IP-заголовки будут иметь одинаковую версию заголовка IP.
Сетевые адаптеры и драйверы мини-портов могут использовать значения InnerFrameOffset, TransportIpHeaderRelativeOffset и TcpHeaderRelativeOffset , указанные в структуре NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO . Драйвер сетевого адаптера или мини-порта может выполнять любые необходимые проверки заголовков для заголовка туннеля (внешнего) IP-адреса или последующих заголовков, чтобы проверить эти смещения.
Обратите внимание, что при NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. IsEncapsulatedPacket имеет значение TRUE, существующие поля смещения заголовков, NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO. LsoV2Transmit. TcpHeaderOffset и NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO. Передача. TcpHeaderOffset не будет иметь правильных значений и не должен использоваться сетевым адаптером или драйвером.
Драйверы минипорта должны обрабатывать ситуации , когда NDIS_TCP_SEND_OFFLOADS_SUPPLEMENTAL_NET_BUFFER_LIST_INFO. InnerFrameOffset может находиться в списке с точечным сбором, отличном от начала пакета. Драйвер протокола гарантирует, что все добавленные заголовки инкапсуляции (ETH, IP, GRE) будут физически непрерывными и будут находиться в первом MDL пакета.
Проверка контрольной суммы
Проверка контрольной суммы для NVGRE в значительной степени такая же, как и в противном случае.
Если мини-порт получает запрос OID_TCP_OFFLOAD_PARAMETERS OID и успешно выполняет его для NDIS_ENCAPSULATION_TYPE_GRE_MAC (см. NDIS_OFFLOAD_PARAMETERS), сетевой адаптер должен выполнить проверку контрольной суммы для заголовка ТУннеля (внешнего) IP-адреса, транспортного (внутреннего) IP-заголовка и заголовка TCP или UDP.
Для инкапсулированных пакетов, имеющих заголовок туннеля IPv4 (внешний) и заголовок транспорта IPv4 (внутренний), драйвер мини-порта должен установить флаг IpChecksumSucceeded в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO только в том случае, если проверка контрольной суммы обоих IP-заголовков выполнена успешно. Для инкапсулированных пакетов, имеющих как туннельный (внешний) заголовок IPv4, так и транспортный (внутренний) заголовок IPv4, драйвер мини-порта должен установить флаг IpChecksumFailed , если проверка контрольной суммы ip-заголовка завершилась сбоем.