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


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

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

Примечание.

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

Перед передачей в драйвер мини-порта структуру 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. Транспорт TCP/IP вводит сумму единичного дополнения для псевдозаголовка в поле "Контрольная сумма" заголовка TCP.

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

Примечание.

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

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

Получив структуру 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, чтобы определить, какие контрольные суммы должна вычислить NIC для пакета.

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

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

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