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


Разгрузка сегментов объединения сегментов (RSC)

При получении данных большинство слоев в стеке TCP/IP должны искать сведения о заголовках каждого сегмента отдельно. Это создает большую нагрузку при получении больших объемов данных.

Объединение сегментов (RSC) уменьшает эту нагрузку, объединяя последовательность полученных сегментов и указывая на них стек TCP/IP в одном объединяемом сегменте. Верхние слои в стеке TCP/IP должны рассматривать только один заголовок для всей последовательности.

Сетевой интерфейс карта (сетевой адаптер), поддерживающий RSC в оборудовании, может значительно повысить производительность пути получения. Кроме того, он может снизить загрузку ЦП узла, так как он освобождает уровень протокола от выполнения RSC в программном обеспечении.

Дополнительные сведения о RSC см. в разделе "Обзор объединения сегментов получения".

NetAdapterCX также поддерживает UDP RSC (URO) начиная с версии 2.5. Дополнительные сведения см. в разделе UDP RSC Offload (URO).

INF-ключевое слово для управления разгрузкой RSC

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

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

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

Настройка разгрузки RSC

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

Чтобы настроить возможности RSC, драйвер клиента:

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

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

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

Во время вызова NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT драйвер клиента предоставляет указатель на обратный вызов EVT_NET_ADAPTER_OFFLOAD_SET_RSC. Система вызывает этот обратный вызов позже, если активные возможности разгрузки изменяются.

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

  1. Клиентские драйверы не должны выполнять программное обеспечение RSC для любого типа трафика, который не поддерживает оборудование в сетевом адаптере.

Следующие правила применяются к структуре NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions и NetAdapterOffloadLayer3FlagIPv6NoExtensions являются единственными допустимыми значениями поля Layer3Flags . Эти флаги указывают на поддержку IPv4 и IPv6 соответственно.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions и NetAdapterOffloadLayer4FlagUdp являются единственными допустимыми значениями поля Layer4Flags . Эти флаги указывают на поддержку TCP и UDP соответственно.

  3. Флаги уровня 3 должны быть заданы, если NetAdapterOffloadLayer4FlagTcpNoOptions флаг задан.

  4. Поле TcpTimestampOption является необязательным. Клиентские драйверы задают это поле после вызова NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT и перед вызовом NetAdapterOffloadSetRscCapabilities , чтобы указать, поддерживает ли сетевой адаптер параметр метки времени TCP.

В следующем примере показано, как драйвер клиента может настроить возможности разгрузки оборудования RSC.

VOID
MyAdapterSetRscOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's RSC offload capabilities
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
        &rscOffloadCapabilities,
        NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
        NetAdapterOffloadLayer4FlagTcpNoOptions,
        MyEvtAdapterOffloadSetRsc);
    rscOffloadCapabilities.TcpTimestampOption = FALSE;

    // Set the current RSC offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}

Обновление отключений оборудования RSC

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

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

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

VOID
MyEvtAdapterOffloadSetRsc(
    NETADAPTER NetAdapter,
    NETOFFLOAD Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
    adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
    adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}

UDP RSC Offload (URO)

URI обеспечивает объединение полученных сегментов UDP. Сетевые адаптеры могут объединять диаграммы данных UDP из одного потока, который соответствует набору правил в логически смежный буфер. Затем эти объединенные диаграммы данных указываются в сетевом стеке Windows в виде одного большого пакета. Сведения о правилах URI см. в разделе "Правила объединения пакетов UDP".

URO ключевое слово, указанный в INF ключевое слово для управления URI, можно использовать для включения и отключения URI с параметром раздела реестра.

Клиентские драйверы NetAdapterCx могут использовать существующие структуры RSC и API RSC для URI. Чтобы настроить URI, клиентские драйверы должны задать для поля Layer4Flags в структуре NetAdapterOffloadLayer4FlagUdpNET_ADAPTER_OFFLOAD_RSC_CAPABILITIES значение.

Поведение URI зеркало RSC с одним исключением. Когда обратный вызов EVT_NET_ADAPTER_OFFLOAD_SET_RSC отключает URI, драйвер должен указать существующие объединенные сегменты и дождаться завершения всех невыполненных признаков URI. Этот подход гарантирует, что после возврата обратного вызова нет признаков URI.