Разгрузка универсальной сегментации

Универсальная разгрузка сегментации (GSO) в совокупности представляет разгрузку больших отправлений (LSO) и разгрузку отправки UDP (USO).

Клиентские драйверы могут разгрузить сегментацию пакетов TCP/UDP, размер которых превышает максимальную единицу передачи (MTU) сетевого носителя. Драйверы должны указывать эту возможность для NetAdapterCx с помощью API GSO.

Ключевые слова INF для управления GSO

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

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

Ключевые слова USO, указанные в разделе Разгрузка сегментации UDP (USO), можно использовать для включения или отключения разгрузки USO с помощью параметра раздела реестра.

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

Настройка единого входа

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

Чтобы настроить GSO, драйвер клиента:

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

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

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

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

Правила для указания возможностей аппаратного GSO

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

  1. Драйвер должен задать параметры Layer3Flags и Layer4Flags.

  2. Если сетевой адаптер поддерживает LSO, драйвер должен заполнить поле Layer4Flags флагом NetAdapterOffloadLayer4FlagTcpWithoutOptions TCP.

  3. Если сетевой адаптер поддерживает USO, драйвер должен заполнить поле Layer4Flags флагом NetAdapterOffloadLayer4FlagUdp UDP.

  4. Поля MaximumOffloadSize и MinimumSegmentCount являются обязательными.

  5. Поле Layer4OffsetLimit является необязательным. Если ОС отправляет пакет со смещением заголовка, превышающим указанное ограничение, она не будет запрашивать выполнение GSO.

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

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

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's GSO offload capabilities
    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES gsoOffloadCapabilities;

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

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions;
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT(
        &gsoOffloadCapabilities,
        layer3Flags,
        layer4Flags,
        MY_GSO_OFFLOAD_MAX_SIZE,
        MY_GSO_OFFLOAD_MIN_SEGMENT_COUNT,
        EvtAdapterOffloadSetGso);

    gsoOffloadCapabilities.Layer4OffsetLimit = 127;

    // Set the current GSO offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetGsoCapabilities(NetAdapter, &gsoOffloadCapabilities);
}

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

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

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

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

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

	// Store the updated information in the context
	adapterContext->LSOv4 = NetOffloadIsLsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->LSOv6 = NetOffloadIsLsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv4 = NetOffloadIsUsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv6 = NetOffloadIsUsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;

	// Enable hardware checksum if LSO/USO is enabled
	MyUpdateHardwareChecksum(adapterContext);
}