Udostępnij przez


Odciążanie segmentu odbierania (RSC)

Podczas odbierania danych większość warstw w stosie TCP/IP musi oddzielnie przyjrzeć się informacjom nagłówka każdego segmentu. Powoduje to duże obciążenie, gdy odbierane są duże ilości danych.

Scalanie segmentów odbioru (RSC) zmniejsza to obciążenie poprzez łączenie sekwencji odebranych segmentów i przekazywanie ich do stosu TCP/IP w jednym połączonym segmencie. Górne warstwy w stosie TCP/IP muszą tylko przyjrzeć się jednemu nagłówkowi dla całej sekwencji.

Karta interfejsu sieciowego obsługująca funkcję RSC na sprzęcie może znacznie poprawić wydajność ścieżki odbierania. Może również zmniejszyć wykorzystanie procesora CPU hosta, ponieważ zwalnia warstwę protokołu z wykonywania funkcji RSC w oprogramowaniu.

Aby uzyskać więcej informacji na temat RSC, zobacz Omówienie scalania segmentów odbierania.

Platforma NetAdapterCX obsługuje również protokół UDP RSC (URO) począwszy od wersji 2.5. Aby uzyskać więcej informacji, sprawdź odciążanie protokołu UDP RSC (URO).

Słowa kluczowe INF do kontrolowania odciążania RSC

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

Określone w ustandaryzowane słowa kluczowe INF dla RSC mogą być używane do włączenia/wyłączenia odciążania RSC z pomocą ustawień klucza rejestru.

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

Konfigurowanie odciążania usługi RSC

Sterowniki klienta najpierw ogłaszają możliwości RSC sprzętu podczas inicjowania adaptera sieciowego. Może to wystąpić w ramach EvtDevicePrepareHardware wywołania zwrotnego przed uruchomieniem adaptera sieciowego.

Aby skonfigurować funkcje usługi RSC, sterownik klienta:

  1. Przydziela strukturę NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES.

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

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

Podczas wywołania NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT sterownik klienta dostarcza wskaźnik do wywołania zwrotnego EVT_NET_ADAPTER_OFFLOAD_SET_RSC. System wywoła tę procedurę zwrotną później, jeśli zmienią się aktywne możliwości odciążania.

Reguły wskazujące możliwości sprzętu RSC

  1. Sterowniki klienta nie mogą wykonywać oprogramowania RSC dla ruchu, który nie ma obsługi sprzętowej w karcie sieciowej (NIC).

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

  1. NetAdapterOffloadLayer3FlagIPv4NoOptions i NetAdapterOffloadLayer3FlagIPv6NoExtensions są jedynymi prawidłowymi wartościami pola Layer3Flags w warstwie. Te flagi wskazują odpowiednio obsługę protokołów IPv4 i IPv6.

  2. NetAdapterOffloadLayer4FlagTcpNoOptions i NetAdapterOffloadLayer4FlagUdp są jedynymi prawidłowymi wartościami pola warstwy Layer4Flags. Te flagi wskazują odpowiednio obsługę protokołu TCP i UDP.

  3. Flagi warstwy 3 muszą być ustawione, jeśli flaga NetAdapterOffloadLayer4FlagTcpNoOptions jest ustawiona.

  4. Pole TcpTimestampOption jest opcjonalne. Sterowniki klienta ustawiają to pole po wywołaniu NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT i przed wywołaniem NetAdapterOffloadSetRscCapabilities, aby wskazać, czy karta sieciowa obsługuje opcję znacznika czasu TCP.

W poniższym przykładzie pokazano, jak sterownik klienta może konfigurować możliwości przenoszenia obciążeń sprzętu 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);
}

Aktualizacja odciążeń sprzętowych RSC

Jeśli stos TCP/IP lub nadrzędny sterownik protokołu żąda zmiany aktywnych funkcji RSC karty sieciowej, NetAdapterCx wywołuje EVT_NET_ADAPTER_OFFLOAD_SET_RSC wywołanie zwrotne, które zostało zarejestrowane w NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES. W tym wywołaniu zwrotnym system dostarcza zaktualizowane możliwości w obiekcie NETOFFLOAD, które sterownik klienta może przeszukiwać w celu zaktualizowania swoich możliwości odciążania.

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

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

Odciążanie protokołu RSC UDP (URO)

URO umożliwia łączenie odebranych segmentów UDP. Karty sieciowe mogą łączyć datagramy UDP z tego samego przepływu, które pasują do zestawu reguł, w jeden logicznie ciągły bufor. Te połączone datagramy są następnie przekazywane do stosu sieciowego systemu Windows jako jeden duży pakiet. Aby uzyskać informacje na temat reguł URO, zobacz Reguły łączenia pakietów UDP .

Słowo kluczowe URO, określone w słowie kluczowym INF do kontrolowania URO, może być użyte do włączania/wyłączania URO za pomocą ustawienia klucza rejestru.

Sterowniki klienta NetAdapterCx mogą używać istniejących struktur RSC i interfejsu API RSC dla URO. Aby skonfigurować URO, sterowniki klienta muszą ustawić pole Layer4Flags w strukturze NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES na NetAdapterOffloadLayer4FlagUdp.

Zachowanie URO odzwierciedla RSC z jednym wyjątkiem. Gdy wywołanie zwrotne EVT_NET_ADAPTER_OFFLOAD_SET_RSC wyłącza URO, sterownik musi wskazać scalone segmenty i poczekać, aż wszystkie zaległe zgłoszenia URO zostaną ukończone. Takie podejście gwarantuje, że po powrocie wywołania zwrotnego nie są aktywne żadne wskazania URO.