すべての NetAdapterCx クライアント ドライバーは、すべての WDF ドライバーと同様の電源管理機能を備えた Windows Driver Framework (WDF) ドライバーです。 NetAdapterCx ドライバーには、この記事で詳しく説明するように、ネットワーク固有の追加の電源構成が必要です。
一般的なネットワーク デバイスでは、次の 3 つの一般的な電源管理機能がサポートされています。
ネットワーク デバイスは、OS から指示されると、より低い電力 (Dx) 状態に入ることができます。
クライアント ドライバーは、「ファンクション ドライバーでの PnP と電源管理のサポート」で説明されているように、オプションの WDF イベント コールバックを登録して、電源遷移の通知を受信します。
システムが動作 (S0) 状態のままである間にネットワーク デバイスが Dx 状態に入る場合、クライアント ドライバーはアイドル状態の電源ダウンをサポートする必要があります。 アイドル状態の電源ダウンのサポートを参照してください。 NetAdapterCx は、すべての WDF デバイスで使用できるデバイスアイドルとウェイク動作の標準的なユーザー制御に加えて、「Power Management の標準化された INF キーワード」で定義されている *IdleRestriction を介して追加のネットワーク固有のアイドル制御を可能にします。
ネットワーク デバイスが Dx 状態の場合は、事前に構成されたウェイク状態が発生した場合にウェイクアップ信号をトリガーできます。
WDF デバイスがシステム全体の低電力状態からシステムをウェイクアップする方法の詳細については、「 システムウェイクアップのサポート」を参照してください。
NetAdapterCx は、クライアント ドライバーが、そのハードウェアがウェイク サポートを持つネットワーク イベントを宣言するための API を提供します。 ネットワーク・アダプターの電源機能の設定を参照してください。
ネットワーク デバイスが Dx 状態の場合でも、一般的に使用されるネットワーク要求に応答して、ホスト システムをウェイクアップすることなく、ネットワーク上のホスト システムのプレゼンスを維持できます。 ネットワーク・アダプターの電源機能の設定を参照してください。
ネットワーク アダプターの電源機能の設定
WDF 電源管理機能を構成した後、次の手順では、ネットワーク アダプターの電源機能を設定します。 電源機能は、 低電力プロトコル オフロード機能 と ウェイクアップ機能の 2 つのカテゴリに分かれています。
低電力プロトコル オフロード機能
Windows ネットワーク スタックでこの機能を使用する方法の背景情報については、「 NDIS 電源管理のプロトコル オフロード」を参照してください。
クライアント ドライバーは、ハードウェアに適した次のメソッドを呼び出すことによって、低電力プロトコル オフロード機能を設定します。
ウェイクアップ機能
クライアント ドライバーは、次のいずれかのメソッドを呼び出して、デバイスが低電力状態 (Dx) のときにハードウェアでサポートされるウェイク機能を設定します。
- NetAdapterWakeSetBitmapCapabilities
- NetAdapterWakeSetMagicPacketCapabilities
- NetAdapterWakeSetMediaChangeCapabilities
- NetAdapterWakeSetPacketFilterCapabilities
電力消費量と再開待機時間
ネットワーク デバイスが Dx にある場合でも、電源を消費してオフロードを実行し、スリープ解除を行います。 デバイスが Dx からウェイクアップを開始した後、デバイスがパケットを再び転送できるようになるまでに遅延が発生します。 内部の電源状態が深いほど、デバイスは Dx の間に消費される電力が少なくなりますが、再開の待機時間は長くなります。
次の表では、各ウェイク機能の電力消費量と再開待機時間のトレードオフに関する一般的なガイドラインについて説明します。
Important
一部の情報は、市販される前に大幅に変更される可能性があるリリース前の製品に関連しています。 Microsoft は、提供された情報に関して明示的または黙示的な保証を行いません。 特定のデバイスの種類の詳細については、メディア固有のドキュメントと Windows ハードウェア互換性プログラム (WHCP) を参照してください。
| ウェイク機能 | Wake イベント | 電力消費量 | 再開の待機時間 |
|---|---|---|---|
| PacketFilter | 構成された ReceivePacketFilter に一致するすべてのパケット | D0 の場合よりも低くする必要があり、再開の待機時間が非常に短いように、デバイスを適切な状態に保つ必要があります | <= 10 ミリ秒 |
| ビットマップ | 構成されたビットマップ パターンに一致するパケット | 再開待ち時間の緯度が高いため、PacketFilter を使用する場合よりも低くする必要があります | <= 300 ミリ秒 |
| MagicPacket | マジック パケット | ビットマップに似ている | <= 300 ミリ秒 |
| MediaChange | メディアの接続または切断 | ビットマップに似ている | <= 300 ミリ秒 |
次の例は、クライアント ドライバーが電源機能を初期化する方法を示しています。 これは、Net アダプターを起動するときに、 NetAdapterStart を呼び出す前に行います。 この例では、クライアント ドライバーはビットマップ、メディアの変更、パケット フィルターのウェイク機能を設定します。
//
// Set bitmap wake capabilities
//
NET_ADAPTER_WAKE_BITMAP_CAPABILITIES bitmapCapabilities;
NET_ADAPTER_WAKE_BITMAP_CAPABILITIES_INIT(&bitmapCapabilities);
bitmapCapabilities.BitmapPattern = TRUE;
bitmapCapabilities.MaximumPatternCount = deviceContext->PowerFiltersSupported;
bitmapCapabilities.MaximumPatternSize = 256;
NetAdapterWakeSetBitmapCapabilities(Adapter, &bitmapCapabilities);
//
// Set media change wake capabilities
//
NET_ADAPTER_WAKE_MEDIA_CHANGE_CAPABILITIES mediaChangeCapabilities;
NET_ADAPTER_WAKE_MEDIA_CHANGE_CAPABILITIES_INIT(&mediaChangeCapabilities);
mediaChangeCapabilities.MediaConnect = TRUE;
mediaChangeCapabilities.MediaDisconnect = TRUE;
NetAdapterWakeSetMediaChangeCapabilities(Adapter, &mediaChangeCapabilities);
//
// Set packet filter wake capabilities
//
if(deviceContext->SelectiveSuspendSupported)
{
NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES packetFilterCapabilities;
NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES_INIT(&packetFilterCapabilities);
packetFilterCapabilities.PacketFilterMatch = TRUE;
NetAdapterWakeSetPacketFilterCapabilities(Adapter, &packetFilterCapabilities);
}
クライアントは必要に応じて 、EVT_NET_DEVICE_PREVIEW_POWER_OFFLOAD および EVT_NET_DEVICE_PREVIEW_WAKE_SOURCE コールバック関数を登録して、着信プロトコル オフロードとウェイク パターンを受け入れるか拒否できます。
プログラミング プロトコルのパワー オフロードとウェイク パターン
デバイスの 電源ダウン シーケンス中に、ドライバーは有効なウェイク パターンとプロトコルの電源オフロードを反復処理し、ハードウェアにプログラムします。 ドライバーは、 EvtDeviceArmWakeFromS0 および EvtDeviceArmWakeFromSx コールバック関数でこれを行います。
次の例は、クライアント ドライバーがスリープ解除パターンの一覧を反復処理してマジック パケット エントリのスリープ解除を確認し、電源オフロード リストを反復処理して IPv4 ARP プロトコル オフロードを処理する方法を示しています。
NTSTATUS
EvtDeviceArmWakeFromSx(
WDFDEVICE Device
)
{
NETADAPTER adapter = GetDeviceContext(Device)->Adapter;
//
// Process wake source list
//
NET_WAKE_SOURCE_LIST wakeSourceList;
NET_WAKE_SOURCE_LIST_INIT(&wakeSourceList);
NetDeviceGetWakeSourceList(Device, &wakeSourceList);
for(UINT32 i = 0; i < NetWakeSourceListGetCount(&wakeSourceList); i++)
{
NETWAKESOURCE wakeSource = NetWakeSourceListGetElement(&wakeSourceList, i);
NET_WAKE_SOURCE_TYPE const wakeSourceType = NetWakeSourceGetType(wakeSource);
if(wakeSourceType == NetWakeSourceTypeMagicPacket)
{
// Enable magic packet wake for the adapter
..
//
}
}
//
// Process power offload list
//
NET_POWER_OFFLOAD_LIST powerOffloadList;
NET_POWER_OFFLOAD_LIST_INIT(&powerOffloadList);
NetDeviceGetPowerOffloadList(Device, &powerOffloadList);
for(UINT32 i = 0; i < NetPowerOffloadListGetCount(&powerOffloadList); i++)
{
NETPOWEROFFLOAD powerOffload = NetPowerOffloadListGetElement(&powerOffloadList, i);
NET_POWER_OFFLOAD_TYPE const powerOffloadType = NetPowerOffloadGetType(powerOffload);
if(powerOffloadType == NetPowerOffloadTypeArp)
{
// Enable ARP protocol offload for the adapter
..
//
}
}
return STATUS_SUCCESS;
}
高出力に戻る途中で、ドライバーは通常、対応する EvtDeviceDisarmWakeFromSx コールバックと EvtDeviceDisarmWakeFromS0 コールバックで、以前にプログラムされたプロトコル電源オフロードとウェイク パターンを無効にします。 NetDeviceGetPowerOffloadList と NetDeviceGetWakeSourceList を使用して、コールバックのプロトコル電源オフロードとウェイク パターンを取得できます。
ウェイク理由の報告
Important
クライアント ドライバーがスリープ解除理由を NetAdapterCx に報告することは必須です。
NIC ハードウェアがシステムを起動すると、クライアント ドライバーは、ウェイク ソースがウェイクをトリガーした NetAdapterCx に報告する必要があります。 ほとんどのウェイク ソースでは、ドライバーは NET_ADAPTER_WAKE_REASON_PACKET 構造体を使用して、ウェイクをトリガーしたネットワーク パケットを記述します。
NET_WAKE_SOURCE_TYPEが次の場合:
NetWakeSourceTypeBitmapPattern、 NET_ADAPTER_WAKE_REASON_PACKET_INIT を呼び出して 、NET_ADAPTER_WAKE_REASON_PACKET 構造体を初期化します。 このウェイク理由を報告するには、 NetAdapterReportWakeReasonPacket を呼び出します。
NetWakeSourceTypeMagicPacket、 NET_ADAPTER_WAKE_REASON_PACKET構造体を 初期化する NET_ADAPTER_WAKE_REASON_MAGIC_PACKET_INIT を呼び出します。 このウェイク理由を報告するには、 NetAdapterReportWakeReasonPacket を呼び出します。
NetWakeSourceTypePacketFilterMatch、 NET_ADAPTER_WAKE_REASON_PACKET構造体を 初期化する NET_ADAPTER_WAKE_REASON_FILTER_PACKET_INIT を呼び出します。 このウェイク理由を報告するには、 NetAdapterReportWakeReasonPacket を呼び出します。
NetWakeSourceTypeMediaChange、 NetAdapterReportWakeReasonMediaChange を呼び出して、このウェイク理由を報告します。
モダン スタンバイ システムの電源管理シナリオ
Important
モダン スタンバイ プラットフォームの場合、ネットワーク デバイス ドライバーは次の手順を実行する必要があります。
- WdfDeviceInitSetPnpPowerEventCallbacks を呼び出して、電源コールバックを登録します。
- WdfDeviceAssignS0IdleSettings を呼び出して、システムが動作 (S0) 状態のときにデバイスのアイドル状態をサポートします。
- WdfDeviceInitSetPowerPolicyEventCallbacks を呼び出して、ウェイクアップ コールバックを登録します。
- デバイスの種類に適した 低電力プロトコル オフロード機能 をサポートします。
- デバイスの種類に適した ウェイクアップ機能 をサポートします。
デバイスの種類のモダン スタンバイの完全な要件については、メディア固有のドキュメントと WHCP を参照してください。
OS は、ネットワーク デバイスの電源ポリシーの決定を担当します。 たとえば、OS は、デバイスが Dx に移動する必要があるタイミングと、デバイスがスリープ解除する必要があるネットワーク イベントの種類を制御します。 デバイス ドライバーの責任は、OS から要求されたときに電源切り替えシーケンスを確実に実行し、OS によって設定されたスリープ解除条件のハードウェアを正しくプログラムすることです。
OS は、システム全体の電源ポリシーやユーザーの選択など、さまざまな要因に基づいて電源ポリシーの決定を行います。 モダン スタンバイ システム上のネットワーク デバイスに使用される一般的な電源ポリシーを次に示します。
Important
これらの電源ポリシーは OS の更新プログラムによって変更される可能性があり、例として次の情報が提供されます。 OS の特定のエンド ツー エンド動作への依存関係は避ける必要があります。
PC 画面がオンで、ネットワーク デバイスがアイドル状態になっている場合、OS はデバイスに Dx に移動し、PacketFilter と MediaChange ウェイク用にアームするように要求します。
PC がモダン スタンバイに入り、ネットワーク デバイスがアイドル状態になると、OS は NIC に Dx に移動し、Bitmap、MediaChange、Magic Packet Wake を使用するように要求します。
PC が休止状態になると、OS は NIC に Dx に移動し、マジック パケット ウェイク用に腕を組むよう要求します。
注: NetAdapterCx クライアント ドライバーは、電源管理タブの可視性を制御します。詳細については、「 デバイスのアイドル状態とスリープ解除動作のユーザー制御」を参照してください。