Freigeben über


Wiederherstellen einer nicht reagierenden NIC mit NetAdapterCx PLDR

NetAdapterCx bietet eine effektive Möglichkeit zum Zurücksetzen und Wiederherstellen fehlerhafter Netzwerkgeräte durch Gerätezurücksetzung auf Plattformebene (PLDR). Ohne das gesamte Windows-System neu zu starten, reißt der PLDR-Vorgang den Stapel der betroffenen Netzwerkgeräte ab, um sicherzustellen, dass ihre Hardware und ihre Treiber aus einem leeren Zustand neu gestartet werden. NetAdapterCx ermöglicht es Clienttreibern auch, Diagnose von fehlerhaften Geräten zu sammeln, bevor sie zurückgesetzt werden.

PLDR wird ausgelöst, wenn ungewöhnliches Geräteverhalten erkannt wird. Es kann durch folgendes ausgelöst werden:

  • Das Betriebssystem. Beispielsweise kann die Betriebssystemseite PLDR auslösen, wenn ein Paket während der Übertragung zu lange im Treiber hängen bleibt.

  • IHV-Clienttreiber (Independent Hardware Vendor) Clienttreiber können beispielsweise NetAdapterCx anfordern, plDR auszulösen, wenn ein Treiber erkennt, dass ihr Gerät nicht auf den Steuerungsbefehl reagiert.

Um benutzerfreundliche Geräteausfälle und -wiederherstellungen zu ermöglichen, empfehlen wir, dass IHVs und OeMs PLDR für ihre Netzwerkgeräte unterstützen. Weitere Informationen zu PLDR finden Sie unter Zurücksetzen und Wiederherstellen eines Geräts. NetAdapterCx stellt Keine Netzwerkgeräte durch Gerätezurücksetzung auf Funktionsebene wiederherzustellen.

Registrieren des optionalen Diagnose Sammlungsrückrufs

Im Rahmen des NetAdapterCx-Zurücksetzungs- und Wiederherstellungsprozesses kann der Clienttreiber gerätespezifische Diagnose des ausgefallenen Geräts sammeln, bevor das Gerät zurückgesetzt wird. IHVs und Microsoft können diese Daten in der Post-Failure-Analyse verwenden, um die Qualität ihrer Produkte zu verbessern.

Registrieren NET_DEVICE_RESET_CAPABILITIES

Clienttreiber müssen die NET_DEVICE_RESET_CAPABILITIES-Struktur in ihrer EVT_WDF_DRIVER_DEVICE_ADD Rückruffunktion initialisieren und registrieren, um gerätespezifische Diagnose zu sammeln.

NET_DEVICE_RESET_CAPABILITIES enthält Folgendes:

  • Eine eindeutige GUID. Der IHV gibt diese GUID an und verwendet sie später, um die zurückgesetzte Diagnose aus einem Speicherabbild zu identifizieren und abzurufen. Beispielsweise kann der Befehl .enumtag verwendet werden, um die Diagnose abzurufen.

  • Eine EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Ereignisrückruffunktion. NetAdapterCx ruft diesen Rückruf auf, um Diagnose zu sammeln. Wenn der Clienttreiber einen EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Rückruf bereitstellt, ruft NetAdapterCx diesen auf dem Clienttreiber mithilfe eines dedizierten Threads auf.

Das folgende Beispiel zeigt, wie Sie NET_DEVICE_RESET_CAPABILITIES bei NetAdapterCx registrieren:

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

    ...
}

Informationen zum Initialisieren der NET_DEVICE_RESET_CAPABILITIES-Struktur finden Sie unter NET_DEVICE_RESET_CAPABILITIES_INIT.

Informationen zum Ankündigen der NET_DEVICE_RESET_CAPABILITIES-Struktur für NetAdapterCx finden Sie unter NetDeviceInitSetResetCapabilities.

Implementieren von EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS

Die Zurücksetzungs- und Wiederherstellungssequenz kann jederzeit erfolgen. Daher muss die EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Rückrufimplementierung des Clienttreibers Folgendes berücksichtigen:

  • NetAdapterCx synchronisiert den EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Rückruf mit anderen Rückrufen, die während der Powerdownsequenz auftreten können. Der Clienttreiber kann davon ausgehen, dass NetAdapterCx Rückrufe wie Abbrechen/Beenden der Paketwarteschlange, Hardwarefreigabe und Geräteobjektlöschung erst dann aufruft, wenn EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS zurückgegeben wird.

  • Der Clienttreiber muss bei der Verarbeitung Diagnose Sammlung besondere Vorsicht walten lassen, um Deadlocks zu vermeiden. Es muss berücksichtigt werden, dass sich die Hardware möglicherweise bereits in einem fehlerhaften Zustand befindet.

  • Es ist wichtig, dass EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS so schnell wie möglich abgeschlossen werden, damit der rest des PLDR-Prozesses fortgesetzt werden kann. EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS muss zuverlässig sein und innerhalb von 3 Sekunden zurückgegeben werden.

  • NetAdapterCx ruft immer EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS bei PASSIVE_LEVEL auf.

Um Diagnose an NetAdapterCx zu übermitteln, führt der Clienttreiber die folgenden Schritte aus:

  1. Zuordnen Sie einen flachen Puffer aus einem ausgelagerten oder nicht ausgelagerten Pool vor, um die zurückgesetzte Diagnose zu sammeln. Der Treiber sollte diesen Puffer vorab allocatieren, um einen Fehler außerhalb des Arbeitsspeichers während der Gerätezurücksetzung zu vermeiden.

  2. Übermitteln Sie innerhalb des EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Rückrufs die Diagnose als Flat Data Buffer, indem Sie die NetDeviceStoreResetDiagnostics-API aufrufen. Der Clienttreiber muss die NetDeviceStoreResetDiagnostics-API unter PASSIVE_LEVEL aufrufen.

  3. Geben Sie den Datenpuffer frei , sobald NetDeviceStoreResetDiagnostics zurückgegeben wird.

Wichtig

Die NetDeviceStoreResetDiagnostics-API darf nur im EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Rückruf aufgerufen werden. Es kann auch nicht verwendet werden, um Diagnose Daten erneut zu übermitteln, nachdem vorherige NetDeviceStoreResetDiagnostics zurückgegeben wurde. Verstöße gegen einen dieser Fälle führen zu einer Fehlerüberprüfung.

Wichtig

Die Größenbeschränkung für das Zurücksetzen Diagnose beträgt 1 MB.

So fordert ein Clienttreiber PLDR an

Ein Clienttreiber löst PLDR mithilfe der NetDeviceRequestReset-API von NetAdapterCx aus, wenn ein Gerätefehler erkannt wird. NetDeviceRequestReset kehrt sofort an den Clienttreiber zurück. Die in NetAdapterCx-Zurücksetzungs- und Wiederherstellungssequenz beschriebene Zurücksetzungs- und Wiederherstellungssequenz wird ausgelöst und ist asynchron mit dem NetDeviceRequestReset-Aufruf .

Nur ein PLDR-Vorgang kann zu einem bestimmten Zeitpunkt ausgeführt werden. Daher haben nachfolgende Aufrufe von NetDeviceRequestReset keine Auswirkungen, wenn bereits ein PLDR-Vorgang gestartet wurde.

Das Aufrufen von NetDeviceRequestReset hat auch keine Auswirkungen, wenn die Powerdownsequenz bereits initiiert wurde.

NetAdapterCx-Zurücksetzungs- und Wiederherstellungssequenz

Wenn das Betriebssystem oder der Clienttreiber PLDR auslöst, tritt die folgende Sequenz auf:

  1. Sammeln von Diagnose zum Zurücksetzen: NetAdapterCx ruft den EVT_NET_DEVICE_COLLECT_RESET_DIAGNOSTICS Rückruf des Clienttreibers auf, um Diagnose vom ausgefallenen Gerät zu sammeln. Beispielsweise kann der Treiber eine Momentaufnahme der Gerätefirmware sammeln. Dieser Schritt ist optional und tritt nur auf, wenn der Clienttreiber die NET_DEVICE_RESET_CAPABILITIES-Struktur registriert hat. Andernfalls überspringt NetAdapterCx diesen Schritt.

  2. Ausführen von PLDR: NetAdapterCx führt den Vorgang zum Zurücksetzen von Geräten auf Plattformebene aus. NetAdapterCx Power recycelt die Hardware und reißt den Softwaregerätestapel ab.

Das folgende Diagramm veranschaulicht die NetAdapterCx-Zurücksetzungs- und Wiederherstellungssequenz:

Flussdiagramm, das die NetAdapterCx-Zurücksetzungs- und Wiederherstellungssequenz veranschaulicht.