发出 NDIS 唤醒原因状态指示

如果微型端口驱动程序支持 NDIS 唤醒原因状态指示 (NDIS_STATUS_PM_WAKE_REASON) ,则必须在网络适配器生成唤醒事件且适配器恢复为全功率状态后立即生成此状态指示。

注意 对于移动宽带 (MB) 微型端口驱动程序,可选支持 NDIS 唤醒原因状态指示。

微型端口驱动程序通过对象标识符 (OID) OID_PM_PARAMETERS集请求配置电源管理 (PM ) 参数。 此 OID 请求通过 NDIS_PM_PARAMETERS 结构指定 PM 参数。

NDIS_PM_PARAMETERS 结构为以下类型的唤醒事件指定参数。

接收的数据包唤醒事件
如果网络适配器收到与 LAN 唤醒 (WOL) 模式匹配的数据包,则会生成唤醒事件。 WOL 模式包括:

  • 独立于媒体的 WOL 模式,例如数据包有效负载中的幻数据包或 TCP/IP 数据模式。 例如, NDIS_PM_PARAMETERS 结构可以为 TCP SYN 帧指定 WOL 模式。

  • 特定于媒体的 WOL 模式,例如 EAPOL 请求标识符数据包或移动宽带 (MB) 短信服务 (短信) 消息。

  • 与通过 OID_GEN_CURRENT_PACKET_FILTER 的 OID 集请求指定的接收筛选器匹配的通配符模式。

注意 对于这种类型的唤醒原因状态指示,网络适配器必须能够保存收到的数据包。 驱动程序必须在状态指示中返回收到的数据包。

WOL 模式是通过 NDIS_PM_PARAMETERS 结构的 EnabledWoLPacketPatterns 成员指定的。

特定于媒体的唤醒事件
由于特定于媒体的原因,例如从 802.11 接入点 (AP) 取消关联,或者收到移动宽带 (MB) 短信服务 (短信) 消息,网络适配器会生成唤醒事件。

此类型的唤醒事件是通过 NDIS_PM_PARAMETERS 结构的 MediaSpecificWakeUpEvents 成员指定的。

独立于媒体的唤醒事件
由于媒体连接或断开连接等独立于媒体的原因,网络适配器会生成唤醒事件。

此类型的唤醒事件是通过 NDIS_PM_PARAMETERS 结构的 WakeUpFlags 成员指定的。

如果网络适配器生成了唤醒信号,微型端口驱动程序必须发出 NDIS_STATUS_PM_WAKE_REASON 状态指示。 驱动程序在处理 OID_PNP_SET_POWER 的 OID 集请求时执行此操作,以便将适配器转换为全功率状态。

注意 微型端口驱动程序必须先发出 NDIS_STATUS_PM_WAKE_REASON 状态指示,然后才能发出与唤醒事件相关的状态指示。 例如,如果唤醒事件是由于媒体连接状态更改导致的,则微型端口驱动程序必须在发出 NDIS_STATUS_PM_WAKE_REASON 状态指示后发出 NDIS_STATUS_LINK_STATE 状态指示。

当微型端口驱动程序发出 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_REASON 结构后面的 NDIS_PM_WAKE_PACKET 结构的偏移量。

      注意 微型端口驱动程序必须在 64 位边界上对齐 NDIS_PM_WAKE_PACKET 结构的开头。

    2. 微型端口驱动程序将 InfoBufferSize 成员设置为 NDIS_PM_WAKE_PACKET 结构的大小加上导致唤醒事件的数据包的大小。

    3. 微型端口驱动程序在缓冲区 NDIS_PM_WAKE_REASON结构后初始化 NDIS_PM_WAKE_PACKET 结构。

      微型端口驱动程序设置 NDIS_PM_WAKE_PACKET 结构的成员,如下所示:

      • PatternId 成员设置为与唤醒数据包匹配的 WOL 模式的标识符。 此标识符由 NDIS_PM_WOL_PATTERN 结构的 PatternId 成员指定,该成员在OID_PM_ADD_WOL_PATTERN的 OID 集请求期间传递给驱动程序。

      • PatternFriendlyName 成员设置为由 PatternId 成员指定的唤醒模式的用户可读说明。 此值由 NDIS_PM_WOL_PATTERN 结构的 FriendlyName 成员指定。

        注意 微型端口驱动程序不需要初始化此成员。 NDIS 将 PatternFriendlyName 成员设置为正确的值,然后再将 NDIS_PM_WAKE_PACKET 结构传递给过度的驱动程序。

      • OriginalPacketSize 成员设置为网络适配器接收的数据包长度。

      • SavedPacketSize 成员必须设置为通过NDIS_STATUS_PM_WAKE_REASON状态指示报告的数据包的长度。

        注意此成员的值不得大于微型端口驱动程序在 NDIS_PM_CAPABILITIES 结构的 MaxWoLPacketSaveBuffer 成员中设置的值。 驱动程序在报告其唤醒数据包指示功能时返回此结构。 有关详细信息,请参阅 报告唤醒原因状态指示功能

      • SavedPacketOffset 成员必须设置为遵循 NDIS_PM_WAKE_PACKET 结构的唤醒数据包的偏移量(以字节为单位)。

        注意 微型端口驱动程序必须在缓冲区中的 64 位边界上对齐唤醒数据包的开始。

    4. 微型端口将唤醒数据包复制到 由 SavedPacketOffset 成员指定的偏移量处的缓冲区。

  4. 如果微型端口驱动程序针对特定于媒体或独立于媒体的唤醒事件发出NDIS_STATUS_PM_WAKE_REASON状态指示,则会将 NDIS_PM_WAKE_REASON 结构的 InfoBufferOffsetInfoBufferSize 成员设置为零。

  5. 微型端口驱动程序初始化 NDIS_STATUS_INDICATION 结构。 驱动程序将 StatusCode 成员设置为 NDIS_STATUS_PM_WAKE_REASON。 驱动程序还将 StatusBuffer 成员设置为指向缓冲区,并将 StatusBufferLength 设置为缓冲区的长度(以字节为单位)。

  6. 微型端口驱动程序调用 NdisMIndicateStatusEx,并在 StatusIndication 参数中传递指向 NDIS_STATUS_INDICATION 结构的指针。

注意 在微型端口驱动程序为接收的数据包唤醒事件发出 NDIS_STATUS_PM_WAKE_REASON 状态指示后,它必须通过调用 NdisMIndicateReceiveNetBufferLists 来指示此接收的数据包。