Behandeln der NDIS-Benachrichtigung zum selektiven Anhalten des Leerlaufs
NDIS startet einen selektiven Angehalten-Vorgang, wenn eines der folgenden Ereignisse auftritt:
Der Netzwerkadapter war länger als ein Leerlauftimeout inaktiv. Die Dauer dieses Timeoutzeitraums wird durch den Wert des standardisierten INF-Schlüsselwort (keyword) *SSIdleTimeout angegeben. Weitere Informationen zu diesem Schlüsselwort (keyword) finden Sie unter Standardisierte INF-Schlüsselwörter für selektives Anhalten von NDIS.
Weitere Informationen dazu, wie NDIS ermittelt, dass sich ein Netzwerkadapter im Leerlauf befindet, finden Sie unter How NDIS Detects idle network adapters.
Das System, das mit der Always On Always Connected-Technologie (AOAC) kompatibel ist, wird in den Zustand Verbundener Standbymodus übergestellt.
Durch den selektiven Angehalten-Vorgang wird der Netzwerkadapter in einen Energiesparzustand überstellt. NDIS beginnt diesen Vorgang, indem die MiniportIdleNotification-Handlerfunktion aufgerufen wird, um eine Benachrichtigung im Leerlauf an den Miniporttreiber auszusetzen.
Der Miniporttreiber muss möglicherweise busabhängige Aktionen ausführen, wenn er die Leerlaufbenachrichtigung verarbeitet. Die folgende Abbildung zeigt die Schritte, die mit der Behandlung einer Leerlaufbenachrichtigung durch einen Miniporttreiber für einen USB-Netzwerkadapter verbunden sind.
Dieses Thema enthält die folgenden Informationen zum Behandeln einer NDIS-Benachrichtigung zum selektiven Anhalten von Leerlauf:
Richtlinien für die Behandlung des Anrufs bei MiniportIdleNotification
Richtlinien für den Aufruf von NdisMIdleNotificationConfirm
Abbrechen und Abschließen einer NDIS-Benachrichtigung zum selektiven Anhalten des Leerlaufs
Richtlinien für die Behandlung des Anrufs bei MiniportIdleNotification
NDIS und der Miniporttreiber führen die folgenden Schritte aus, wenn NDIS MiniportIdleNotification aufruft:
NDIS ruft die MiniportIdleNotification-Handlerfunktion auf, um den Treiber zu benachrichtigen, dass sich der zugrunde liegende Netzwerkadapter im Leerlauf zu befinden scheint. NDIS legt den ForceIdle-Parameter der MiniportIdleNotification-Handlerfunktion auf einen der folgenden Werte fest:
NDIS legt den ForceIdle-Parameter auf FALSE fest, wenn der Netzwerkadapter länger als das Leerlauftimeout inaktiv war.
NDIS legt den ForceIdle-Parameter auf TRUE fest, wenn ein System, das mit der Always On Always Connected-Technologie (AOAC) kompatibel ist, in den Zustand Connected Standby übergeht.
Wenn MiniportIdleNotification aufgerufen wird, kann der Miniporttreiber ein Veto gegen die Leerlaufbenachrichtigung und den Vorgang zum selektiven Anhalten ein veto durchführen, indem er NDIS_STATUS_BUSY zurückgibt. Der Treiber könnte beispielsweise ein Veto gegen die Leerlaufbenachrichtigung einschlagen, wenn der Treiber Aktivitäten auf dem Netzwerkadapter erkennt.
Wenn der Miniporttreiber ein Veto gegen die Benachrichtigung im Leerlauf eingreift, startet NDIS den Monitor der Aktivität auf dem Netzwerkadapter neu. Wenn der Adapter innerhalb des Leerlauftimeouts wieder inaktiv wird, ruft NDIS MiniportIdleNotification auf.
Hinweis Der Miniporttreiber darf kein Veto gegen die Leerlaufbenachrichtigung einzulegen, wenn der ForceIdle-Parameter auf TRUE festgelegt ist. In diesem Fall muss der Treiber mit dem selektiven Anhalten fortfahren.
Wenn der Miniporttreiber kein Veto gegen die Leerlaufbenachrichtigung einsetzt, muss er alle busspezifischen Vorgänge ausführen, um den Netzwerkadapter für einen selektiven Angehalten-Vorgang vorzubereiten. Der Miniporttreiber für einen USB-Netzwerkadapter führt beispielsweise die folgenden Schritte aus, um zu bestimmen, ob der Netzwerkadapter in einen Energiesparzustand übergehen kann:
Der Miniporttreiber ruft IoCallDriver auf, um ein E/A-Anforderungspaket (IRP) für eine USB-Leerlaufanforderung (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) an den zugrunde liegenden USB-Bustreiber auszusetzen. In diesem IRP muss der Miniporttreiber eine Rückruf- und Vervollständigungsroutine angeben.
Der USB-Bustreiber schließt die IRP nicht sofort ab. Das IRP wird durch den Übergang mit niedriger Leistung in einem ausstehenden Zustand belassen. Der Bustreiber schließt die IRP später ab, wenn eines der folgenden Ereignisse auftritt:
Der Miniporttreiber bricht die IRP ab.
Eine Änderung des Systemstromzustands ist erforderlich.
Das Gerät wird aus dem USB-Hub entfernt.
Nachdem der USB-Bustreiber festgestellt hat, dass er den Netzwerkadapter in einen Energiesparzustand versetzen kann, ruft er die IRP-Rückrufroutine des Miniporttreibers auf. Dieser Aufruf bestätigt, dass der Netzwerkadapter in einen Energiesparzustand übergehen kann.
Richtlinien zum Schreiben einer Rückrufroutine für die USB-Idle-Anforderungs-IRP finden Sie unter Implementieren einer IRP-Rückrufroutine für usb-Leerlaufanforderungen.
Nachdem der Miniporttreiber die Vorbereitung des Netzwerkadapters für einen selektiven Anbruchvorgang abgeschlossen hat, ruft er NdisMIdleNotificationConfirm auf. In diesem Aufruf gibt der Miniporttreiber den niedrigsten Energiezustand an, zu dem der Netzwerkadapter wechseln kann.
Abhängig von den Busanforderungen für selektive Aussetzungsvorgänge ruft der Miniporttreiber NdisMIdleNotificationConfirm entweder synchron im Kontext des Aufrufs von MiniportIdleNotification oder asynchron nach der Rückgabe von MiniportIdleNotification auf. Der Miniporttreiber für einen USB-Netzwerkadapter ruft beispielsweise NdisMIdleNotificationConfirm im Kontext der Rückrufroutine für die USB-Leerlaufanforderung auf. Der USB-Bustreiber ruft die Rückrufroutine entweder synchron im Kontext des Aufrufs von IoCallDriver oder asynchron auf, nachdem MiniportIdleNotification zurückgegeben wird.
Wenn der Netzwerkadapter in einen Zustand mit geringer Leistung übergestellt werden kann, gibt der Miniporttreiber NDIS_STATUS_PENDING aus dem Aufruf von MiniportIdleNotification zurück.
Hinweis Der Miniporttreiber gibt NDIS_STATUS_PENDING zurück, da die Leerlaufbenachrichtigung erst abgeschlossen ist, wenn der Treiber NdisMIdleNotificationComplete aufruft. Der Miniporttreiber darf NDIS_STATUS_SUCCESS von MiniportIdleNotification nicht zurückgeben.
Der Miniporttreiber sollte die folgenden Vorgänge ausführen, bis der Netzwerkadapter angehalten und in einen Energiesparzustand übergehen wird:
Der Miniporttreiber sollte empfangene Pakete verarbeiten und sie an NDIS angeben, indem er NdisMIndicateReceiveNetBufferLists aufruft.
Der Miniporttreiber sollte abgeschlossene Sendepakete verarbeiten und sie an NDIS angeben, indem er NdisMSendNetBufferListsComplete aufruft.
Hinweis NDIS ruft die MiniportSendNetBufferLists-Funktion des Treibers nicht auf, um Pakete zu senden, wenn MiniportIdleNotification NDIS_STATUS_PENDING zurückgibt.
Richtlinien für den Aufruf von NdisMIdleNotificationConfirm
NDIS und der Miniporttreiber führen die folgenden Schritte aus, wenn der Miniporttreiber NdisMIdleNotificationConfirm aufruft:
NDIS-Probleme IRP_MN_WAIT_WAKE an den zugrunde liegenden Bustreiber. Mit diesem IRP kann der Bustreiber den Netzwerkadapter als Reaktion auf ein externes Aktivierungssignal reaktivieren.
NDIS stellt eine OID-Set-Anforderung (Object Identifier) von OID_PM_PARAMETERS an den Miniporttreiber aus. Diese OID-Anforderung ist einer NDIS_PM_PARAMETERS Struktur zugeordnet, die die Einstellungen angibt, unter denen der Netzwerkadapter ein Aktivierungsereignis generiert.
Der Miniporttreiber muss die folgenden Richtlinien befolgen, wenn er die Member der NDIS_PM_PARAMETERS-Struktur verarbeitet:
Wenn der ForceIdle-Parameter der MiniportIdleNotification-Handlerfunktion auf FALSE festgelegt wurde, legt NDIS nur das NDIS_PM_SELECTIVE_SUSPEND_ENABLED-Flag im WakeUpFlags-Element der NDIS_PM_PARAMETERS-Struktur fest. In diesem Fall kann der Netzwerkadapter ein Aktivierungsereignis signalisieren, wenn eines der folgenden Ereignisse auftritt:
Der Netzwerkadapter empfängt ein Paket, das einem Empfangspaketfilter entspricht. Der Adapter ist für die Verwendung dieser Filter über OID-Setanforderungen von OID_GEN_CURRENT_PACKET_FILTER konfiguriert.
Der Netzwerkadapter erkennt andere externe Ereignisse, die eine Verarbeitung durch den Netzwerktreiberstapel erfordern, z. B. wenn sich der Verbindungszustand in Medienverbindung oder verbundener Medien ändert.
Wenn der ForceIdle-Parameter der MiniportIdleNotification-Handlerfunktion auf TRUE festgelegt wurde, legt NDIS das NDIS_PM_SELECTIVE_SUSPEND_ENABLED-Flag im WakeUpFlags-Element der NDIS_PM_PARAMETERS-Struktur nicht fest. In diesem Fall legt NDIS andere Member in der NDIS_PM_PARAMETERS-Struktur für Aktivierungsereignisse fest, die nicht mit dem selektiven Anhalten von NDIS zusammenhängen.
Hinweis NDIS legt den ForceIdle-Parameter nur dann auf TRUE fest, wenn ein System, das mit der AOAC-Technologie (Always On Always Connected) kompatibel ist, in den Zustand verbundener Standbymodus übergeht.
Der Treiber schließt die OID-Anforderung mit NDIS_STATUS_SUCCESS ab.
Hinweis Wenn NDIS das NDIS_PM_SELECTIVE_SUSPEND_ENABLED-Flag im WakeUpFlags-MemberNDIS_PM_PARAMETERS-Struktur festlegt, stellt es die OID-Setanforderung von OID_PM_PARAMETERS direkt an den Miniporttreiber aus. Dadurch kann NDIS die Verarbeitung durch Filtertreiber im Netzwerktreiberstapel umgehen.
Nachdem die OID-Setanforderung von OID_PM_PARAMETERS erfolgreich abgeschlossen wurde, stellt NDIS eine OID-Setanforderung OID_PNP_SET_POWER an den Miniporttreiber aus.
Wenn er diese Anforderung für den OID-Satz verarbeitet, bereitet der Treiber den Netzwerkadapter so vor, dass er in den In der OID-Anforderung angegebenen Zustand mit niedriger Energieleistung übergeht. Der Treiber muss alle ausstehenden Vorgänge wie folgt ausführen:
Der Miniporttreiber wartet darauf, dass alle zuvor angegebenen Empfangspakete über Aufrufe von MiniportReturnNetBufferLists zurückgegeben werden.
Der Miniporttreiber wartet darauf, dass die von der Hardware verarbeiteten Sendeanforderungen abgeschlossen werden. Nach Abschluss der Anforderungen muss der Miniporttreiber NdisMSendNetBufferListsComplete aufrufen.
Der Miniporttreiber schließt alle ausstehenden Sendeanforderungen ab, indem er NdisMSendNetBufferListsComplete aufruft.
Der Miniporttreiber muss alle ausstehenden NDIS-Timer und Arbeitselemente abbrechen. Nachdem diese abgebrochen wurden, muss der Treiber auf die Fertigstellung dieser Timer und Arbeitselemente warten.
Der Miniporttreiber muss den Netzwerkadapter in einen Ruhezustand versetzen. Der Treiber muss beispielsweise alle Hardwaretimer abbrechen.
Der Miniporttreiber konfiguriert den zugrunde liegenden Netzwerkadapter, um die angegebenen Reaktivierungsereignisse zu aktivieren, die zuvor in der OID-Setanforderung von OID_PM_PARAMETERS angegeben wurden. Nachdem der Netzwerkadapter für den Übergang mit geringer Leistung vorbereitet wurde, schließt der Miniporttreiber die OID-Set-Anforderung von OID_PNP_SET_POWER mit NDIS_STATUS_SUCCESS ab.
NDIS gibt einen IRP_MN_SET_POWER an den zugrunde liegenden Bustreiber aus. Dieser IRP fordert den Übergang des Netzwerkadapters in einen Energiesparzustand an.
Hinweis Während eines selektiven Anhaltens wird der Netzwerkadapter in den Gerätestromzustand übergestellt, der im Aufruf von NdisMIdleNotificationConfirm angegeben wurde. Der Miniporttreiber gibt diesen Gerätestromzustand im Parameter IdlePowerState dieser Funktion an.
Nachdem die IRP abgeschlossen ist, wird NDIS vom Aufruf von NdisMIdleNotificationConfirm zurückgegeben.
Abbrechen und Abschließen einer NDIS-Benachrichtigung zum selektiven Anhalten des Leerlaufs
Nachdem die Benachrichtigung im Leerlauf ausgegeben wurde, kann sie wie folgt abgebrochen und abgeschlossen werden:
NDIS kann die ausstehende Leerlaufbenachrichtigung abbrechen, wenn die folgenden Bedingungen zutreffen:
Ein überlastendes Protokoll oder Filtertreiber stellt entweder eine Sendepaketanforderung oder eine OID-Anforderung an den Miniporttreiber aus.
Der zugrunde liegende Adapter signalisiert ein Aktivierungsereignis, z. B. das Empfangen eines Pakets, das einem WOL-Muster (Wake-on-LAN) entspricht, oder erkennt eine Änderung der Medienverbindung status.
NDIS bricht die Leerlaufbenachrichtigung ab, indem MiniportCancelIdleNotification aufgerufen wird. Wenn diese Handlerfunktion aufgerufen wird, bricht der Miniporttreiber alle busspezifischen IRPs ab, die er möglicherweise zuvor für die Leerlaufbenachrichtigung ausgegeben hat. Schließlich ruft der Miniporttreiber NdisMIdleNotificationComplete auf, um die Leerlaufbenachrichtigung abzuschließen.
Weitere Informationen dazu, wie NDIS die Leerlaufbenachrichtigung abbricht, finden Sie unter Abbrechen der NDIS-Benachrichtigung zum selektiven Anhalten des Leerlaufs.
Nachdem sich der Netzwerkadapter in einem Energiesparzustand befindet, kann der Miniporttreiber die Leerlaufbenachrichtigung selbst abschließen, um den Adapter in einen Vollstromzustand zu versetzen. Die Gründe hierfür sind spezifisch für das Design und die Anforderungen des Treibers und Adapters. Der Miniporttreiber schließt die Benachrichtigung im Leerlauf ab, indem er NdisMIdleNotificationComplete aufruft.
Weitere Informationen dazu, wie der Miniporttreiber die Benachrichtigung im Leerlauf abschließt, finden Sie unter Abschließen der NDIS-Benachrichtigung zum selektiven Anhalten des Leerlaufs.