NetAdapterCx PLDR を使用した応答しない NIC の復旧
NetAdapterCxは、プラットフォーム レベルのデバイス リセット (PLDR) を通じて、誤動作しているネットワーク デバイスをリセットおよび回復する効果的な方法を提供します。 Windows システム全体を再起動せずに、PLDR 操作によって、影響を受けるネットワーク デバイスのスタックを切断し、ハードウェアとドライバーは、空白の状態から再起動されます。 NetAdapterCx を使用すると、クライアント ドライバーは、プラットフォーム レベルのリセットが行われる前に、障害が発生したデバイスから診断を収集することもできます。
PLDR は、デバイスの異常な動作が検出されたときにトリガーされます。 これは、次のいずれかによってトリガーできます。
オペレーティング システム (OS)。 たとえば、OS 側では、転送中のパケットがドライバーに長時間滞留している場合に PLDR がトリガーされる場合があります。
独立系ハードウェア ベンダー (IHV) クライアント ドライバー。 たとえば、クライアント ドライバーは、デバイスが制御コマンドに応答しないことをドライバーが検出したときに PLDR をトリガーするように NetAdapterCx を要求できます。
ユーザー フレンドリーなデバイスの障害と回復を提供するために、当社として、IHV と相手先ブランド供給 (OEM) には、ネットワーク デバイスの PLDR のサポートをお勧めします。 PLDR の詳細については、デバイスのリセットと回復を参照してください。 NetAdapterCx は、機能レベルのデバイス リセットによるネットワーク デバイスの回復を行いません。
オプションの診断収集コールバックを登録する
NetAdapterCx のリセットと回復プロセスの一環として、クライアント ドライバーは、デバイスがプラットフォーム レベルのリセットされる前に、障害が発生したデバイスからデバイス固有の診断を収集できます。 IHV と Microsoft は、このデータを障害後の分析で使用し、製品の品質を向上させることができます。
Register NET_DEVICE_RESET_CAPABILITIES
クライアント ドライバーは、デバイス固有の診断を収集するために、EVT_WDF_DRIVER_DEVICE_ADDコールバック関数で NET_DEVICE_RESET_CAPABILITIES 構造体を初期化して登録する必要があります。
NET_DEVICE_RESET_CAPABILITIES には次のものが含まれます。
一意の GUID。 IHV は、この GUID を指定し、後でそれを使用して、メモリ ダンプからリセット診断を識別して取得します。 たとえば、.enumtag コマンドを使用して診断を取得できます。
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS イベント コールバック関数。 NetAdapterCx は、このコールバックを呼び出して、診断を収集します。 クライアント ドライバーが EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS コールバックを提供する場合は、NetAdapterCx は dedicated スレッドを使用してクライアント ドライバーでコールバックを呼び出します。
次の例は、NET_DEVICE_RESET_CAPABILITIES を NetAdapterCx に登録する方法を示しています。
EVT_WDF_DRIVER_DEVICE_ADD EvtWdfDriverDeviceAdd;
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS EvtDeviceCollectResetDiagnostics;
NTSTATUS EvtWdfDriverDeviceAdd(
WDFDRIVER Driver,
PWDFDEVICE_INIT DeviceInit
)
{
...
NET_DEVICE_RESET_CAPABILITIES resetCapabilities;
NET_DEVICE_RESET_CAPABILITIES_INIT(
&resetCapabilities,
DUMMY_GUID,
EvtDeviceCollectResetDiagnostics);
NetDeviceInitSetResetCapabilities(DeviceInit, &resetCapabilities);
...
}
NET_DEVICE_RESET_CAPABILITIES 構造体を初期化する方法については、「NET_DEVICE_RESET_CAPABILITIES_INIT」を参照してください。
NET_DEVICE_RESET_CAPABILITIES 構造体を NetAdapterCx にアドバタイズする方法については、「NetDeviceInitSetResetCapabilities」を参照してください。
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS を実装します
リセットと回復のシーケンスは、いつでも発生する可能性があります。 したがって、クライアント ドライバーの EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS コールバックの実装では、次の点を考慮する必要があります。
NetAdapterCx は、EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS コールバックを、パワーダウン シーケンス 中に発生する可能性のある他のコールバックと同期します。 クライアント ドライバーは、EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS が戻るまで、NetAdapterCx がパケット キューのキャンセル/停止、ハードウェアの解放、デバイス オブジェクトの削除などのコールバックを呼び出さないことを想定できます。
クライアント ドライバーは、デッドロックを回避できるよう、診断収集を処理するときに特別な注意を払う必要があります。 ハードウェアがすでに障害状態になっている可能性があることを考慮する必要があります。
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS は、残りの PLDR プロセスを続行できるように、できるだけ早く完了することが重要です。 EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS は信頼性が高く、3 秒以内に戻る必要があります。
NetAdapterCx は、PASSIVE_LEVELで、常に EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS を呼び出します。
NetAdapterCx に診断情報を送信するには、クライアント ドライバーは次の手順を実行します。
ページ プールまたは非ページ プールからフラット バッファーを事前に割り当てて、リセット診断を収集します。 ドライバーは、デバイスのリセット中にメモリ不足エラーを回避するために、このバッファーを事前に割り当てる必要があります。
EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS コールバック内で、NetDeviceStoreResetDiagnostics API を呼び出して、診断をフラット データ バッファーとして送信します。 クライアント ドライバーは、PASSIVE_LEVEL時に NetDeviceStoreResetDiagnostics API を呼び出す必要があります。
NetDeviceStoreResetDiagnostics が戻ったら、データ バッファーを解放します。
重要
NetDeviceStoreResetDiagnostics API は、EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS コールバックでのみ呼び出す必要があります。 また、以前の NetDeviceStoreResetDiagnostics が返された後に診断データを再送信するために使用することもできません。 これらのケースのいずれかに違反すると、バグチェックが行われます。
重要
リセット診断のサイズ制限は 1 MB です。
クライアント ドライバーが PLDR を要求する方法
クライアント ドライバーは、デバイスの障害を検出すると、NetAdapterCx NetDeviceRequestReset API を使用して PLDR をトリガーします。 NetDeviceRequestReset は、クライアント ドライバーに直ちに戻ります。 NetAdapterCx reset and recover sequence で説明されているリセットと回復のシーケンスがトリガーされ、NetDeviceRequestReset 呼び出しに対して非同期です。
PLDR 操作は、一度に 1 つしか実行できません。 したがって、PLDR 操作が既に開始されている場合、NetDeviceRequestReset の後続の呼び出しは無効です。
NetDeviceRequestReset を呼び出しても、パワーダウン シーケンスがすでに開始されている場合は効果がありません。
NetAdapterCx のリセットと回復のシーケンス
OS またはクライアント ドライバーが PLDR をトリガーすると、次のシーケンスが発生します。
リセット診断の収集: NetAdapterCx は、クライアント ドライバーの EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS コールバックを呼び出して、障害が発生したデバイスから診断を収集します。 たとえば、ドライバーは、デバイス ファームウェアのスナップショットを収集できます。 この手順は省略可能であり、クライアント ドライバーが NET_DEVICE_RESET_CAPABILITIES 構造体を登録している場合にのみ発生します。 それ以外の場合、NetAdapterCx は、この手順をスキップします。
PLDR の実行: NetAdapterCx は、プラットフォーム レベルのデバイス リセット操作を実行します。 NetAdapterCx は、ハードウェアを電源でリサイクルし、ソフトウェア デバイス スタックを切断します。
次の図は、NetAdapterCx のリセットと回復のシーケンスを示しています。