次の方法で共有


Receive Segment Coalescing (RSC) オフロード

データを受信するとき、TCP/IP スタック内のほとんどの層は、各セグメントのヘッダー情報を個別に調べる必要があります。 これにより、大量のデータを受信するときに大量のオーバーヘッドが発生します。

受信セグメント合体 (RSC) は、受信セグメントのシーケンスを結合し、それらを TCP/IP スタックの上位の 1 つの結合セグメントに指定することで、このオーバーヘッドを削減します。 TCP/IP スタックの上位層は、シーケンス全体に対して 1 つのヘッダーを調べるだけで済みます。

ハードウェアで RSC をサポートするネットワーク インターフェイス カード (NIC) を使用すると、受信パスのパフォーマンスを大幅に向上させることができます。 また、プロトコル層がソフトウェアで RSC を実行することから解放されるため、ホストの CPU 使用率を削減できます。

RSC の詳細については、「受信セグメント合体 (RSC)」を参照してください。

NetAdapterCX では、バージョン 2.5 以降の UDP RSC (URO) もサポートされています。 詳しくは、「UDP RSC オフロード (URO)」をご覧ください。

RSC オフロードを制御するための INF キーワード

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. クライアント ドライバーは、NIC でハードウェア サポートがないすべての種類のトラフィックに対して ソフトウェア RSC を実行しないようにする必要があります。

NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 構造体には、次の規則が適用されます。

  1. NetAdapterOffloadLayer3FlagIPv4NoOptionsNetAdapterOffloadLayer3FlagIPv6NoExtensions は、Layer3Flags フィールドの唯一の有効な値です。 これらのフラグは、それぞれ IPv4 と IPv6 のサポートを示します。

  2. NetAdapterOffloadLayer4FlagTcpNoOptionsNetAdapterOffloadLayer4FlagUdp は、Layer4Flags フィールドの唯一の有効な値です。 これらのフラグは、それぞれ TCP と UDP のサポートを示します。

  3. NetAdapterOffloadLayer4FlagTcpNoOptions フラグが設定されている場合は、レイヤ 3 フラグを設定する必要があります。

  4. TcpTimestampOption フィールドはオプションです。 クライアント ドライバーは、NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT を呼び出した後、 NetAdapterOffloadSetRscCapabilities を呼び出す前にこのフィールドを設定して、NIC が 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 は、NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES に登録されたクライアント ドライバーの EVT_NET_ADAPTER_OFFLOAD_SET_RSC コールバックを呼び出します。 このコールバックでは、システムは、クライアント ドライバーがオフロード機能を更新するために照会できる、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 オフロード (URO)

URO を使用すると、受信した UDP セグメントの合体が可能になります。 NIC は、一連のルールに一致する同じフローの UDP データグラムを論理的に連続したバッファに結合することができます。 これらの結合されたデータグラムは、1 つの大きなパケットとして Windows ネットワーク スタックに示されます。 URO ルールについて詳しくは、「UDP パケットを合体するためのルール」をご覧ください。

URO を制御するための INF キーワード」で指定された URO キーワードを使用し、レジストリ キー設定によって URO を有効化/無効化することができます。

NetAdapterCx クライアント ドライバーでは、既存の RSC 構造と URO 用 RSC API を使用できます。 URO を構成するには、クライアント ドライバーは、NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 構造の Layer4Flags フィールドを NetAdapterOffloadLayer4FlagUdp に設定する必要があります。

URO 動作は RSC をミラーリングしますが、1 つの例外があります。 EVT_NET_ADAPTER_OFFLOAD_SET_RSC コールバックによって URO が無効になると、ドライバーは既存の合体セグメントを示し、未処理のすべての URO 表示が完了するまで待機する必要があります。 このアプローチにより、コールバックが返された後に URO の表示がアクティブでなくなります。