NDIS ウェイク理由状態表示の発行

ミニポート ドライバーは、NDIS ウェイク理由の状態表示 (NDIS_STATUS_PM_WAKE_REASON) をサポートしている場合、ネットワーク アダプターがウェイクアップ イベントを生成し、アダプターが出力全開状態に復帰した直後に、この状態表示を生成する必要があります。

注: NDIS ウェイク理由の状態表示のサポートは、モバイル ブロードバンド (MB) ミニポート ドライバーではオプションとなります。

ミニポート ドライバーは、オブジェクト識別子 (OID) 設定要求 OID_PM_PARAMETERS を通じてパワーマネージメント (PM) パラメーターで構成されます。 この OID 要求は、NDIS_PM_PARAMETERS 構造体を介して PM パラメーターを指定します。

NDIS_PM_PARAMETERS 構造体は、次のタイプのウェイクアップ イベントのパラメーターを指定します。

受信したパケット ウェイクアップ イベント
ネットワーク アダプターは、Wake-on-LAN (WOL) パターンに一致するパケットを受信すると、ウェイクアップ イベントを生成します。 WOL パターンは次のとおりです。

  • パケット ペイロード内のマジック パケットや TCP/IP データ パターンなど、メディア独立型 WOL パターン。 たとえば、 NDIS_PM_PARAMETERS 構造体では、TCP SYN フレームの WOL パターンを指定する場合があります。

  • EAPOL 要求識別子パケットやモバイル ブロードバンド (MB) ショート メッセージ サービス (SMS) メッセージなどのメディア固有の WOL パターン。

  • OID 設定要求 OID_GEN_CURRENT_PACKET_FILTER によって指定された受信フィルターに一致するワイルドカード パターン。

注: このタイプのウェイク理由状態表示では、受信したパケットをネットワーク アダプターが保存できる必要があります。 ドライバーは、状態表示内で受信したパケットを返す必要があります。

WOL パターンは、EnabledWoLPacketPatternsメンバー (NDIS_PM_PARAMETERS 構造体内) によって指定されます。

メディア固有のウェイクアップ イベント
ネットワーク アダプターは、802.11 アクセス ポイント (AP) からの関連付け解除やモバイル ブロードバンド (MB) ショート メッセージ サービス (SMS) メッセージの受信など、メディア固有の理由によりウェイクアップ イベントを生成します。

このタイプのウェイクアップ イベントは、MediaSpecificWakeUpEvents メンバー (NDIS_PM_PARAMETERS 構造体内) を通じて指定されます。

メディア独立型ウェイクアップ イベント
ネットワーク アダプターは、メディアの接続や切断といった、メディア独立型の理由により、ウェイクアップ イベントを生成します。

このタイプのウェイクアップ イベントは、WakeUpFlags メンバー (NDIS_PM_PARAMETERS 構造体内) を通じて指定されます。

ネットワーク アダプターがウェイクアップ信号を生成した場合、ミニポート ドライバーは、NDIS_STATUS_PM_WAKE_REASON 状態表示を発行する必要があります。 ドライバーは、フルパワー状態へのアダプターの切り替えのための OID 設定要求 OID_PNP_SET_POWER を処理しているときにこれを行います。

注: ミニポート ドライバーは、ウェイクアップ イベントに関連する状態表示を発行する前に NDIS_STATUS_PM_WAKE_REASON 状態表示を発行する必要があります。 たとえば、ウェイクアップ イベントがメディア接続状態の変更が原因であった場合、ミニポート ドライバーは NDIS_STATUS_LINK_STATE 状態表示を、NDIS_STATUS_PM_WAKE_REASON 状態表示の発行後に発行する必要があります。

ミニポート ドライバーは、NDIS_STATUS_PM_WAKE_REASON 状態表示を発行する場合、次の手順に従う必要があります。

  1. ミニポート ドライバーは、次を含めるのに十分な大きさのバッファーを割り当てる必要があります。

    • NDIS_PM_WAKE_REASON 構造体。

    • NDIS_PM_WAKE_PACKET 構造体と、ネットワークアダプターがウェイクアップ イベントを生成する原因となった受信パケット (ウェイク パケット)。

      注: ミニポート ドライバーは、メディア固有またはメディア独立型ウェイクアップ イベントを示す場合、このバッファー領域を割り当てる必要はありません。

  2. ミニポート ドライバーは、バッファーの開始で NDIS_PM_WAKE_REASON 構造体を初期化します。 ドライバーは WakeReason メンバーを、ウェイクアップ イベントのタイプを定義する NDIS_PM_WAKE_REASON_TYPE リスト値に設定します。

    たとえば、受信したパケット ウェイクアップ イベントをミニポート ドライバーが示している場合は、WakeReason メンバーを NdisWakeReasonPacket に設定する必要があります。 それ以外の場合、ドライバーは、WakeReason メンバーをメディア固有またはメディア独立型ウェイクアップ イベントを最もよく記述するリスト値に設定します。

  3. 受信したパケット ウェイクアップ イベントの NDIS_STATUS_PM_WAKE_REASON 状態表示をミニポートドライバーが発行する場合は、次の手順に従う必要があります。

    1. ミニポート ドライバーは、InfoBufferOffset メンバーを NDIS_PM_WAKE_PACKET 構造体としてバッファー内の NDIS_PM_WAKE_REASON 構造体に続くもののオフセットに設定します。

      注: ミニポート ドライバーは、64 ビット境界上の NDIS_PM_WAKE_PACKET 構造体の開始を調整する必要があります。

    2. ミニポート ドライバーは、InfoBufferSize メンバーを NDIS_PM_WAKE_PACKET 構造体のサイズにウェイクアップ イベントの原因となったパケットのサイズを加えたものに設定します。

    3. ミニポート ドライバーは、バッファー内の NDIS_PM_WAKE_PACKET 構造体として NDIS_PM_WAKE_REASON 構造体に続くものを初期化します。

      ミニポート ドライバーは、次のように NDIS_PM_WAKE_PACKET 構造体のメンバーを設定します。

      • PatternId メンバーは、ウェイク パケットに一致する WOL パターンの識別子に設定されます。 この識別子は、PatternId メンバー (NDIS_PM_WOL_PATTERN 構造体として OID 設定要求 OID_PM_ADD_WOL_PATTERN 中にドライバーに渡されたものに所属) によって指定されます。

      • PatternFriendlyName メンバーは、PatternId メンバーによって指定されたウェイク パターンのユーザー読み取り可能な説明に設定されます。 この値は、FriendlyName メンバー (NDIS_PM_WOL_PATTERN 構造体内) によって指定されます。

        注: ミニポート ドライバーは、このメンバーを初期化する必要はありません。 NDIS は、PatternFriendlyName メンバーを正しい値に設定し、その後 NDIS_PM_WAKE_PACKET 構造体を上部のドライバーに渡します。

      • OriginalPacketSize メンバーは、ネットワーク アダプターによって受信されたパケットの長さに設定されます。

      • SavedPacketSize メンバーは NDIS_STATUS_PM_WAKE_REASON 状態表示によって報告されるパケットの長さに設定する必要があります。

        注: このメンバーの値は、ミニポート ドライバー設定が MaxWoLPacketSaveBuffer メンバー (NDIS_PM_CAPABILITIES 構造体内) で設定する値より大きくすることはできません。 ドライバーは、そのウェイク パケット表示機能を報告するときに、この構造体を返します。 詳細については、「ウェイク理由状態表示機能の報告」を参照してください

      • SavedPacketOffsetメンバーは、NDIS_PM_WAKE_PACKET 構造体に続くウェイク パケットへのオフセット (バイト単位) に設定する必要があります。

        注: ミニポート ドライバーは、バッファー内の 64 ビット境界でウェイク パケットの開始を調整する必要があります。

    4. ミニポートは、SavedPacketOffset メンバーによって指定されたオフセットでバッファーにウェイク パケットをコピーします。

  4. ミニポート ドライバーは、メディア固有またはメディア独立型ウェイクアップ イベントの NDIS_STATUS_PM_WAKE_REASON 状態表示を発行する場合、InfoBufferOffsetInfoBufferSize メンバー (NDIS_PM_WAKE_REASON 構造体内) を 0 に設定します。

  5. ミニポート ドライバーは、NDIS_STATUS_INDICATION 構造体を初期化します。 ドライバーは、StatusCode メンバーを NDIS_STATUS_PM_WAKE_REASON に設定します。 また、ドライバーは、バッファーを指すように StatusBuffer メンバーを設定し、StatusBufferLength をバッファーの長さ (バイト単位) に設定します。

  6. ミニポート ドライバーは NdisMIndicateStatusEx を呼び出し、NDIS_STATUS_INDICATION 構造体 (StatusIndication パラメーター) へポインターを渡します。

注: ミニポート ドライバーは、受信したパケットウェイクアップ イベントの NDIS_STATUS_PM_WAKE_REASON 状態表示を発行した後、NdisMIndicateReceiveNetBufferLists を呼び出すことでこの受信パケットを示す必要があります。