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

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

Перед тем как транспорт TCP/IP передает NET_PACKET структуру драйверу клиента, он указывает сведения о контрольной сумме, связанные с NET_PACKET в расширении пакета NET_PACKET_CHECKSUM .

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

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

Ключевые слова INF для управления разгрузкой контрольной суммы

NetAdapterCx проверяет ключевые слова реестра и учитывает их при включении возможностей активной разгрузки. Драйверу не нужно предпринимать никаких дальнейших действий.

Ключевые слова контрольной суммы, указанные в разделе Использование значений реестра для включения и отключения разгрузки задач , можно использовать для включения или отключения разгрузки контрольной суммы с помощью параметра раздела реестра. Сгруппированные ключевые слова не поддерживаются.

Значения ключевое слово должны быть типа REG_SZ.

Настройка разгрузки контрольной суммы

Клиентские драйверы сначала объявляют возможности разгрузки контрольной суммы оборудования во время инициализации сетевого адаптера. Это может произойти при обратном вызове EvtDevicePrepareHardware перед запуском сетевого адаптера.

Чтобы настроить разгрузку контрольной суммы передачи (Tx), драйвер клиента:

  1. Выделяет структуру NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES .

  2. Вызывает NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT для инициализации структуры.

  3. Вызывает NetAdapterOffloadSetTxChecksumCapabilities для регистрации структуры в NetAdapterCx.

Во время вызова NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT драйвер клиента предоставляет указатель на обратный вызов EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM . Система вызывает этот обратный вызов позже при изменении активных возможностей разгрузки.

Чтобы настроить разгрузку контрольной суммы получения (Rx), драйвер клиента:

  1. Выделяет структуру NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES .

  2. Вызывает NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT для инициализации структуры.

  3. Вызывает NetAdapterOffloadSetRxChecksumCapabilities для регистрации структуры в NetAdapterCx.

Во время вызова NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT драйвер клиента предоставляет указатель на обратный вызов EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM . Система вызывает этот обратный вызов позже при изменении активных возможностей разгрузки.

Правила для указания возможностей контрольной суммы передачи оборудования

  1. Необходимо задать значение Layer3Flags в структуре NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES . Параметр Layer4Flags является необязательным. Установка параметров Layer3Flags и Layer4Flags указывает пакеты, для которых сетевой адаптер может выполнять разгрузку контрольной суммы.

  2. Layer3HeaderOffsetLimit и Layer4HeaderOffsetLimit в NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES являются необязательными. Если ОС отправляет пакет со смещением заголовка, превышающим указанное ограничение, она не будет запрашивать у сетевого адаптера расчет контрольной суммы для этого слоя.

  3. Пакеты IP/TCP без параметров и расширений должны поддерживаться, если поддерживаются параметры и расширения.

Правила для указания возможностей контрольной суммы получения оборудования

NetAdapterCx не требует, чтобы драйвер объявлял аппаратные возможности получения контрольной суммы. Если включена разгрузка контрольной суммы, сетевой адаптер должен выполнить разгрузку контрольной суммы для всех пакетов, которые она может обрабатывать. Если сетевой адаптер не может выполнить разгрузку контрольной суммы для пакета, NetAdapterCx разгрузит его в программном обеспечении.

В этом примере показано, как драйвер клиента может настроить возможности аппаратной разгрузки контрольной суммы:

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's Tx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES txChecksumOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions |
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_TX_CHECKSUM_CAPABILITIES_INIT(
        &txChecksumOffloadCapabilities,
        layer3Flags,
        EvtAdapterOffloadSetTxChecksum);

    txChecksumOffloadCapabilities.Layer4Flags = layer4Flags;

    txChecksumOffloadCapabilities.Layer4HeaderOffsetLimit = 127;

    // Set the current Tx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetTxChecksumCapabilities(NetAdapter,
        &txChecksumOffloadCapabilities);

    // Configure the hardware's Rx checksum offload capabilities
    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES rxChecksumOffloadCapabilities;

    NET_ADAPTER_OFFLOAD_RX_CHECKSUM_CAPABILITIES_INIT(
        &rxChecksumOffloadCapabilities,
        EvtAdapterOffloadSetRxChecksum);

    // Set the current Rx checksum offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRxChecksumCapabilities(NetAdapter,
        &rxChecksumOffloadCapabilities);
}

Обновление разгрузки оборудования

Если стек TCP/IP или драйвер избыточного протокола запрашивает изменение активных возможностей сетевого адаптера, NetAdapterCx вызывает EVT_NET_ADAPTER_OFFLOAD_SET_TX_CHECKSUM драйвера клиента или EVT_NET_ADAPTER_OFFLOAD_SET_RX_CHECKSUM обратный вызов, зарегистрированный во время инициализации адаптера. В этих функциях система предоставляет обновленные возможности в объекте NETOFFLOAD, которые клиентский драйвер запрашивает для обновления своих возможностей разгрузки.

Клиентские драйверы могут вызывать следующие функции, чтобы определить, какие разгрузки контрольной суммы включены:

В следующем примере показано, как драйвер клиента может обновить возможности разгрузки контрольной суммы Tx/Rx:

VOID
MyEvtAdapterOffloadSetTxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->TxHardwareIpChecksum = NetOffloadIsTxChecksumIPv4Enabled(Offload);
    adapterContext->TxHardwareTcpChecksum = NetOffloadIsTxChecksumTcpEnabled(Offload);
    adapterContext->TxHardwareUdpChecksum = NetOffloadIsTxChecksumUdpEnabled(Offload);

    // Update the new hardware Tx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

VOID
MyEvtAdapterOffloadSetRxChecksum(
    NETADAPTER  NetAdapter,
    NETOFFLOAD  Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->RxHardwareIpChecksum = NetOffloadIsRxChecksumIPv4Enabled(Offload);
    adapterContext->RxHardwareTcpChecksum = NetOffloadIsRxChecksumTcpEnabled(Offload);
    adapterContext->RxHardwareUdpChecksum = NetOffloadIsRxChecksumUdpEnabled(Offload);

    // Update the new hardware Rx checksum offload capabilities
    MyUpdateHardwareChecksum(adapterContext);
}

Передача обработки контрольной суммы

Клиентский драйвер обычно выполняет следующую обработку контрольной суммы по пути передачи:

  1. Драйвер клиента вызывает функцию NetExtensionGetPacketChecksum с индексом пакета, чтобы получить NET_PACKET_CHECKSUM структуру.

  2. Драйвер клиента проверяет флаги уровня в структуре NET_PACKET_CHECKSUM.

    • Если флаг имеет значение NetPacketTxChecksumActionPassthrough, сетевой адаптер не должен выполнять операции с контрольной суммой на этом уровне.

    • Если флаг имеет значение NetPacketTxChecksumActionRequired, драйвер клиента должен определить протокол, используемый на этом уровне в этом конкретном пакете, используя структуру NET_PACKET_LAYOUT , и указать сетевому адаптеру, какую контрольную сумму он должен вычислить для пакета.

  3. Драйвер клиента передает пакет сетевому адаптеру, который вычисляет соответствующие контрольные суммы для пакета.

Обработка контрольной суммы получения

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

Флаги могут быть одним из следующих:

Flag Описание
NetPacketRxChecksumEvaluationNotChecked Сетевой адаптер не удалось проверить контрольную сумму пакета
NetPacketRxChecksumEvaluationValid Допустимая контрольная сумма пакета
NetPacketRxChecksumEvaluationInvalid Недопустимая контрольная сумма пакета