Udostępnij przez


Odciążanie segmentacji ogólnej

Ogólne odciążanie segmentacji (GSO) łącznie reprezentuje duże odciążanie wysyłania (LSO) i odciążanie wysyłania UDP (USO).

Sterowniki klienta mogą odciążać segmentację pakietów TCP/UDP, które są większe niż maksymalna jednostka transmisji (MTU) nośnika sieciowego. Sterowniki muszą wskazywać tę możliwość w NetAdapterCx przy użyciu interfejsów API GSO.

Słowa kluczowe INF do kontrolowania GSO

NetAdapterCx sprawdza słowa kluczowe rejestru i honoruje je podczas włączania aktywnych funkcji odciążania. Kierowca nie musi podejmować żadnych dalszych działań.

Słowa kluczowe LSO określone w Używanie wartości rejestru do włączania i wyłączania odciążania zadań można użyć do włączenia/wyłączenia odciążania LSO za pomocą ustawień klucza rejestru.

Słowa kluczowe USO określone w Odciążanie segmentacji UDP (USO) mogą służyć do włączania/wyłączania odciążania USO przy użyciu ustawienia klucza rejestru.

Wartości słowa kluczowego muszą być typu REG_SZ.

Konfigurowanie GSO

Sterowniki urządzeń klienckich najpierw informują o możliwościach GSO sprzętu podczas inicjowania karty sieciowej. Może to wystąpić w ramach EvtDevicePrepareHardware callbacku przed uruchomieniem adaptera sieciowego.

Aby skonfigurować GSO, sterownik klienta:

  1. Przydziela strukturę NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES.

  2. Wywołuje NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT, aby zainicjować strukturę.

  3. Wywołuje NetAdapterOffloadSetGsoCapabilities, aby zarejestrować strukturę w NetAdapterCx.

Podczas wywołania NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT, sterownik klienta udostępnia wskaźnik do wywołania zwrotnego EVT_NET_ADAPTER_OFFLOAD_SET_GSO. System wywołuje ten callback później, gdy zmienią się aktywne możliwości odciążania.

Zasady wskazujące możliwości sprzętowe GSO

Do struktury NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES mają zastosowanie następujące reguły:

  1. Sterownik musi ustawić Layer3Flags i Layer4Flags.

  2. Jeśli karta sieciowa obsługuje LSO, sterownik musi wypełnić pole Layer4Flags flagą NetAdapterOffloadLayer4FlagTcpWithoutOptions TCP.

  3. Jeśli karta sieciowa obsługuje USO, sterownik musi wypełnić pole Layer4Flags flagą NetAdapterOffloadLayer4FlagUdp UDP.

  4. MaximumOffloadSize i MinimumSegmentCount są polami obowiązkowymi.

  5. Pole Layer4OffsetLimit jest opcjonalne. Jeśli system operacyjny wysyła pakiet z przesunięciem nagłówka większym niż określony limit, nie poprosi o wykonanie operacji GSO.

  6. Pakiety IP/TCP bez opcji/rozszerzeń muszą być obsługiwane, jeśli obsługiwane są opcje/rozszerzenia.

W tym przykładzie pokazano, jak sterownik klienta może skonfigurować swoje możliwości odciążania sprzętowego.

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);
}

Aktualizowanie odciążeń sprzętu

Jeśli stos TCP/IP lub sterownik wierzchniego protokołu żąda zmiany w aktywnych funkcjach karty sieciowej, NetAdapterCx wywołuje funkcję zwrotną sterownika klienta EVT_NET_ADAPTER_OFFLOAD_SET_GSO, która została zarejestrowana podczas inicjowania karty. W tej funkcji system dostarcza zaktualizowane możliwości w obiekcie NETOFFLOAD, które sterownik klienta pobiera, aby zaktualizować jego możliwości odciążania.

Sterowniki klienta mogą wywoływać następujące funkcje, aby określić, które odciążania są włączone:

W poniższym przykładzie pokazano, jak sterownik klienta może zaktualizować jego możliwości odciążania 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);
}