Поделиться через


Разгрузка задач контрольной суммы

NDIS поддерживает разгрузку задач контрольной суммы TCP/IP во время выполнения.

Примечание

 Данные разгрузки контрольной суммы внеполосные (OOB) хранятся в массиве сведений NET_BUFFER_LIST . Дополнительные сведения об OOB-данных см. в разделе Доступ к сведениям о разгрузке TCP/IP NET_BUFFER_LIST.

Перед передачей драйверу мини-порта структуры NET_BUFFER_LIST для пакета, в котором драйвер минипорта будет выполнять задачи контрольной суммы, транспорт TCP/IP указывает сведения о контрольной сумме, связанные со структурой NET_BUFFER_LIST. Эти сведения задаются структурой NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO , которая является частью NET_BUFFER_LIST информации (внеполосные данные), связанной со структурой NET_BUFFER_LIST.

Перед разгрузкой вычисления контрольной суммы для TCP-пакета транспорт TCP/IP вычисляет сумму дополнения для псевдозаписи TCP. Транспорт TCP/IP вычисляет сумму дополнения по всем полям псевдозаголовок, включая исходный IP-адрес, ip-адрес назначения, протокол и длину TCP-пакетов. Транспорт TCP/IP вводит сумму дополнения для псевдозаголовок в поле Контрольная сумма заголовка TCP.

Сумма дополнения для псевдозаголовок, предоставляемого транспортом TCP/IP, позволяет сетевому адаптеру начать вычисление реальной контрольной суммы TCP для отправленного пакета. Чтобы вычислить фактическую контрольную сумму TCP, сетевой адаптер вычисляет переменную часть контрольной суммы TCP (для заголовка TCP и полезных данных), добавляет эту контрольную сумму к сумме дополнения для псевдозаголовок, вычисляемой транспортом TCP/IP, и вычисляет 16-битовое дополнение для контрольной суммы. Дополнительные сведения о вычислении таких контрольных сумм см. в статье RFC 793 и RFC 1122.

Примечание

Транспорт TCP/IP вычисляет сумму дополнения для псевдозаголовок UDP-пакета, выполнив те же действия, что и для TCP-пакета, и сохраняет значение в поле Checksum заголовка UDP.

Обратите внимание, что транспорт TCP/IP всегда гарантирует, что поле контрольной суммы в ip-заголовке пакета устанавливается в нулевое значение перед передачей пакета базовому драйверу мини-порта. Драйвер мини-порта должен игнорировать поле контрольной суммы в ip-заголовке. Драйверу мини-порта не нужно проверять, задано ли для поля контрольной суммы значение 0, и не нужно задавать для этого поля нулевое значение.

После получения структуры NET_BUFFER_LIST в функции MiniportSendNetBufferLists или MiniportCoSendNetBufferLists драйвер мини-порта обычно выполняет следующую обработку контрольной суммы:

  1. Драйвер мини-порта вызывает макрос NET_BUFFER_LIST_INFO с _IdTcpIpChecksumNetBufferListInfo , чтобы получить NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO структуру.

  2. Драйвер мини-порта проверяет флаги IsIPv4 и IsIPv6 в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO. Если флаги IsIPv4 и IsIPv6 не заданы, сетевой адаптер не должен выполнять операции контрольной суммы с пакетом.

  3. Если установлен флаг IsIPv4 или IsIPv6 , драйвер мини-порта проверяет флаги TcpChecksum, UdpChecksum и IpHeaderChecksum , чтобы определить, какие контрольные суммы сетевой адаптер должен вычислить для пакета.

  4. Драйвер мини-порта передает пакет сетевому адаптеру, который вычисляет соответствующие контрольные суммы для пакета. Если пакет имеет как заголовок IP-адреса туннеля, так и заголовок IP-адреса транспорта, сетевой адаптер, поддерживающий разгрузку контрольной суммы ПО, выполняет задачи контрольной суммы IP-адресов только в заголовке туннеля. Транспорт TCP/IP выполняет задачи контрольной суммы IP-адресов в заголовке IP-адреса транспорта.

Перед указанием структуры NET_BUFFER_LIST для пакета получения, в котором он выполняет задачи контрольной суммы, драйвер мини-порта проверяет соответствующие контрольные суммы и устанавливает соответствующие флаги XxxChecksumFailed или XxxChecksumSucceeded в структуре NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO.

Отключение разгрузки контрольной суммы при включенной разгрузке большой отправки (LSO) не запрещает драйверу мини-порта вычислять и вставлять контрольные суммы в пакеты, созданные функцией LSO. Чтобы отключить разгрузку контрольной суммы адресов в этом случае, пользователь также должен отключить LSO.