NDIS セレクティブ サスペンド アイドル通知の処理
NDIS は、次のいずれかのイベントが発生した場合に選択的な中断操作を開始します:
ネットワーク アダプターは、アイドル タイムアウト期間よりも長く非アクティブです。 このタイムアウト期間の長さは、標準化された INF キーワード *SSIdleTimeout の値によって指定されます。 この INF キーワードの詳細については、「NDIS 選択的中断の標準化された INF キーワード」を参照してください。
ネットワーク アダプターがアイドル状態であることを NDIS が判断する方法の詳細については、「NDIS がアイドル状態のネットワーク アダプターを検出する方法」を参照してください。
Always On Always Connected (AOAC) テクノロジに準拠しているシステムは、コネクト スタンバイ状態に移行しています。
選択的な一時停止操作により、ネットワーク アダプターは低電力状態に遷移します。 NDIS は、ミニポート ドライバーにアイドル状態の通知を発行する MiniportIdleNotification ハンドラー関数を呼び出すことによって、この操作を開始します。
ミニポート ドライバーは、アイドル状態の通知を処理するときに、バスに依存するアクションを実行する必要がある場合があります。 次の図は、USB ネットワーク アダプターのミニポート ドライバーによるアイドル状態の通知の処理に関連する手順を示しています。
このトピックには、NDIS 選択的中断アイドル通知の処理方法に関する次の情報が含まれています:
MiniportIdleNotification の呼び出しを処理するためのガイドライン
NdisMIdleNotificationConfirm の 呼び出しのガイドライン
MiniportIdleNotificationの呼び出しを処理するためのガイドライン
NDIS とミニポート ドライバーは、NDIS が MiniportIdleNotification を呼び出すときに、次の手順に従います:
NDIS は、基になるネットワーク アダプターがアイドル状態であると思われるドライバーに通知する MiniportIdleNotification ハンドラー関数を呼び出します。 NDIS は、MiniportIdleNotification ハンドラー関数の ForceIdle パラメーターを次のいずれかの値に設定します:
NDIS は、ネットワーク アダプターがアイドル タイムアウト期間よりも長い間非アクティブな場合ForceIdle パラメーターを FALSE に設定します。
NDIS は、Always On Always Connected (AOAC) テクノロジに準拠しているシステムがコネクト スタンバイ状態に移行している場合に、ForceIdle パラメーターを TRUE に設定します。
MiniportIdleNotification が呼び出されると、ミニポート ドライバーは、アイドル状態の通知を拒否し、NDIS_STATUS_BUSY を返すことによって、選択的な一時停止操作を実行できます。 たとえば、ドライバーがネットワーク アダプターのアクティビティを検出した場合、ドライバーはアイドル状態の通知を拒否できます。
ミニポート ドライバーがアイドル状態の通知を拒否する場合、NDIS は、ネットワーク アダプターでのアクティビティ監視を再起動します。 アダプターがアイドルタイムアウト期間内に再び非アクティブになった場合、NDIS は MiniportIdleNotification を呼び出します。
注ForceIdle パラメーターが TRUE に設定されている場合、ミニポート ドライバーはアイドル状態の通知を拒否できません。 この場合、ドライバーは選択的中断操作を続行する必要があります。
ミニポート ドライバーがアイドル状態の通知を拒否しない場合は、選択的中断操作のネットワーク アダプターを準備するバス固有の操作を実行する必要があります。 たとえば、USB ネットワーク アダプターのミニポート ドライバーは、ネットワーク アダプターが低電力状態に移行できるかどうかを判断する次の手順を実行します:
ミニポート ドライバーは、基になる USB バス ドライバーに USB アイドル要求 (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) の I/O 要求パケット を発行する IoCallDriver を呼び出します。 この IRP では、ミニポート ドライバーは、コールバックと完了ルーチンを指定する必要があります。
USB バス ドライバーは、IRP をすぐに完了しません。 IRP は、低電力遷移によって保留中の状態のままです。 バス ドライバーは、次のいずれかのイベントが発生したときに後で IRP を完了します:
ミニポート ドライバーは、IRP を取り消します。
システムの電源状態の変更が必要です。
デバイスは USB ハブから削除されます。
USB バス ドライバーは、ネットワーク アダプターを低電力状態にすることができると判断した後、ミニポート ドライバーの IRP コールバック ルーチンを呼び出します。 この呼び出しは、ネットワーク アダプターが低電力状態に移行できることを確認します。
USB アイドル要求 IRP のコールバック ルーチンを記述する方法のガイドラインについては、「USB アイドル要求 IRP コールバック ルーチンの実装」を参照してください。
ミニポート ドライバーは、選択的中断操作のネットワーク アダプターの準備を完了した後、NdisMIdleNotificationConfirm を呼び出します。 この呼び出しでは、ミニポート ドライバーは、ネットワーク アダプターが移行できる最小の電源状態を指定します。
選択的中断操作のバス要件に応じて、ミニポート ドライバーは、MiniportIdleNotification の呼び出しのコンテキストで同期的に、または MiniportIdleNotification が返された後に非同期的に NdisMIdleNotificationConfirm を呼び出します。 たとえば、USB ネットワーク アダプターのミニポート ドライバーは、USB アイドル要求のコールバック ルーチンのコンテキスト内で NdisMIdleNotificationConfirm を呼び出します。 USB バス ドライバーは、IoCallDriver の呼び出しのコンテキストで同期的に、または MiniportIdleNotification が返された後に非同期的にコールバック ルーチンを呼び出します。
ネットワーク アダプターを低電力状態に移行できる場合、ミニポート ドライバーは、MiniportIdleNotification の呼び出しから NDIS_STATUS_PENDING を返します。
注 ドライバーが NdisMIdleNotificationComplete を呼び出すまでアイドル状態の通知が完了しないため、ミニポート ドライバーは NDIS_STATUS_PENDING を返します。 ミニポート ドライバーは、MiniportIdleNotification から NDIS_STATUS_SUCCESS を返してはいけません。
ミニポート ドライバーは、ネットワーク アダプターが中断され、低電力状態に遷移するまで、次の操作を実行する必要があります:
ミニポート ドライバーは、受信したパケットを処理し、NdisMIndicateReceiveNetBufferLists を呼び出すことによって NDIS に示す必要があります。
ミニポート ドライバーは、完了した送信パケットを処理し、NdisMSendNetBufferListsComplete を呼び出すことによって NDIS に示す必要があります。
注 NDIS は、MiniportIdleNotification が NDIS_STATUS_PENDING を返す場合、パケットを送信するためにドライバーの MiniportSendNetBufferLists 関数を呼び出しません。
NdisMIdleNotificationConfirm の呼び出しのガイドライン
ミニポート ドライバーが NdisMIdleNotificationConfirm を呼び出すとき、NDIS とミニポート ドライバーは、次の手順に従います:
基になるバス ドライバーへの IRP_MN_WAIT_WAKE の NDIS 問題。 この IRP により、バス ドライバーは、外部ウェイクアップ信号に応答してネットワーク アダプターをスリープ解除します。
NDIS は、ミニポート ドライバーにOID_PM_PARAMETERSのオブジェクト識別子 (OID) セット要求を発行します。 この OID 要求は、ネットワーク アダプターがウェイクアップ イベントを生成する設定を指定する NDIS_PM_PARAMETERS 構造体に関連付けられています。
ミニポート ドライバーは、NDIS_PM_PARAMETERS 構造体のメンバーを処理するときに、次のガイドラインに従う必要があります:
MiniportIdleNotification ハンドラー関数の ForceIdle パラメーターが FALSE に設定されている場合、NDIS は、NDIS_PM_PARAMETERS 構造体の WakeUpFlags メンバーの NDIS_PM_SLECTIVE_SUSPEND_ENABLED フラグのみを設定します。 この場合、ネットワーク アダプターは、次のいずれかのイベントが発生したときにウェイクアップ イベントを通知できます:
ネットワーク アダプターは、受信パケット フィルターに一致するパケットを受信します。 アダプターは、OID_GEN_CURRENT_PACKET_FILTER の OID セット要求を通じてこれらのフィルターを使用するように構成されています。
ネットワーク アダプターは、リンクの状態がメディアの切断またはメディア接続のいずれかに変わる場合など、ネットワーク ドライバー スタックによる処理を必要とする他の外部イベントを検出します。
MiniportIdleNotification ハンドラー関数の ForceIdle パラメーターが TRUE に設定されている場合、NDIS は、NDIS_PM_PARAMETERS 構造体の WakeUpFlags メンバーの NDIS_PM_SLECTIVE_SUSPEND_ENABLED フラグを設定しません。 この場合、NDIS は、NDIS 選択的中断に 関連しないウェイクアップ イベントの NDIS_PM_PARAMETERS 構造体の他のメンバーを設定します。
注 NDIS は、Always On Always Connected (AOAC) テクノロジに準拠しているシステムがコネクト スタンバイ状態に移行している場合に、ForceIdle パラメーターを TRUE に設定します。
ドライバーは、NDIS_STATUS_SUCCESS を使用して OID 要求を完了します。
注 NDIS は、NDIS_PM_PARAMETERS 構造体の WakeUpFlags メンバーで NDIS_PM_SELECTIVE_SUSPEND_ENABLED フラグを設定する場合、ミニポート ドライバーに直接 OID_PM_PARAMETERS の OID セット要求を発行します。 これにより、NDIS は、ネットワーク ドライバー スタックのフィルター ドライバーによる処理をバイパスできます。
OID_PM_PARAMETERS の OID セット要求が正常に完了すると、NDIS はミニポート ドライバーに OID_PNP_SET_POWER セット要求を発行します。
この OID セット要求を処理すると、ドライバーは、OID 要求で指定されている低電力状態に移行するネットワーク アダプターを準備します。 ドライバーは、次の方法ですべての保留中の操作を完了する必要があります:
ミニポート ドライバーは、MiniportReturnNetBufferLists への呼び出しを通じて返される、以前に示されたすべての受信パケットを待機します。
ミニポート ドライバーは、完了するハードウェアによって処理された送信要求を待機します。 要求が完了した後、ミニポート ドライバーは NdisMSendNetBufferListsComplete を呼び出す必要があります。
ミニポート ドライバーは、NdisMSendNetBufferListsComplete を呼び出すことによって、保留中のすべての送信要求を完了します。
ミニポート ドライバーは、保留中のすべての NDIS タイマーと作業項目を取り消す必要があります。 これらを取り消した後、ドライバーは、これらのタイマーと作業項目の完了を待機する必要があります。
ミニポート ドライバーは、ネットワーク アダプターを休止状態にする必要があります。 たとえば、ドライバーは、すべてのハードウェア タイマーを取り消す必要があります。
ミニポート ドライバーは、OID_PM_PARAMETERS の OID セット要求で指定された指定されたウェイクアップ イベントを有効にする基になるネットワーク アダプターを構成します。 ネットワーク アダプターの低電力遷移の準備が整った後、ミニポート ドライバーは、NDIS_STATUS_SUCCESS で OID_PNP_SET_POWER の OID セット要求を完了します。
NDIS は、基になるバス ドライバーに IRP_MN_SET_POWER を発行します。 この IRP は、ネットワーク アダプターを低電力状態に移行することを要求します。
注 選択的一時停止操作中に、ネットワーク アダプターは NdisMIdleNotificationConfirm の呼び出しで指定されたデバイスの電源状態に遷移します。 ミニポート ドライバーは、この関数の IdlePowerState パラメーターで、このデバイスの電源状態を指定します。
IRP が完了すると、NDIS は NdisMIdleNotificationConfirm の 呼び出しから返ります。
NDIS 選択的中断アイドル通知の取り消しと完了
アイドル状態の通知が発行された後は、次の方法で取り消して完了できます。
NDIS は、次の条件が真の場合、未処理のアイドル通知を取り消すことができます:
上位のプロトコルまたはフィルター ドライバーは、パケットの送信要求またはミニポート ドライバーへの OID 要求を発行します。
基になるアダプターは、ウェイクオン LAN (WOL) パターンに一致するパケットを受信したり、メディア接続状態の変化を検出したりするなどのウェイクアップ イベントを通知します。
NDIS は、MiniportCancelIdleNotification を呼び出すことによってアイドル状態の通知を取り消します。 このハンドラー関数が呼び出されると、ミニポート ドライバーは、アイドル状態の通知に対して以前に発行した可能性があるバス固有の IRP を取り消します。 最後に、ミニポート ドライバーは、アイドル状態の通知を完了する NdisMIdleNotificationComplete を呼び出します。
NDIS がアイドル状態の通知を取り消す方法の詳細については、「NDIS 選択的中断アイドル通知の取り消し」を参照してください。
ネットワーク アダプターが低電力状態になった後、ミニポート ドライバーは、アダプターを完全な電源状態に再開するためにアイドル状態の通知自体を完了できます。 これを行う理由は、ドライバーとアダプターの設計と要件に固有です。 ミニポート ドライバーは、NdisMIdleNotificationComplete を呼び出すことによってアイドル状態の通知を完了します。
ミニポート ドライバーがアイドル状態の通知を完了する方法の詳細については、「NDIS 選択的中断アイドル通知を完了する」を参照してください。