NDIS 选择性挂起概述

从 NDIS 6.30 开始,NDIS 选择性挂起接口使 NDIS 能够通过将适配器转换为低功耗状态来挂起空闲网络适配器。 这使系统能够减少适配器的 CPU 和电源开销。

对于基于 USB v1.1 和 v2.0 接口的网络适配器,NDIS 选择性挂起特别有用。 无论这些适配器是活动还是空闲,都会持续轮询收到的数据包。 通过暂停空闲的 USB 适配器,CPU 开销可减少多达 10%。

NDIS 选择性挂起基于 USB 选择性挂起 技术。 但是,NDIS 选择性挂起设计为与总线无关。 这样,NDIS 会发出与总线无关的 I/O 请求数据包 (IRP,) 选择性挂起。 这使得微型端口驱动程序负责发出在特定总线上选择性挂起所需的任何 IRP。 例如,USB 网络适配器的微型端口驱动程序在选择性挂起操作期间向 USB 总线驱动程序发出特定于总线的 USB 空闲请求 IRP (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) 。

NDIS 和微型端口驱动程序按以下方式参与 NDIS 选择性挂起:

  1. 如果微型端口驱动程序已注册其对 NDIS 选择性挂起的支持,则 NDIS 将监视网络适配器的 I/O 活动。 I/O 活动包括接收数据包指示、发送数据包完成和由微型端口驱动程序处理的 OID 请求。

  2. 如果网络适配器处于非活动状态的时间超过指定的空闲超时时间,则 NDIS 会将它视为空闲。 发生这种情况时,NDIS 通过向微型端口驱动程序发出空闲通知来启动选择性挂起操作,以便将网络适配器转换为低功耗状态。

    注意

    空闲超时期限的长度由 *SSIdleTimeout 标准化 INF 关键字 (keyword) 的值指定。 有关此关键字 (keyword) 的详细信息,请参阅 NDIS 选择性挂起的标准化 INF 关键字。  

    有关 NDIS 如何确定网络适配器处于空闲状态的详细信息,请参阅 NDIS 如何检测空闲的网络适配器

  3. NDIS 通过调用驱动程序的 MiniportIdleNotification 处理程序函数向微型端口驱动程序发出空闲通知。 调用此函数时,微型端口驱动程序将确定网络适配器是否可以转换为低功耗状态。 微型端口驱动程序以特定于总线的方式执行此确定。

    例如,USB 微型端口驱动程序通过向基础 USB 总线驱动程序发出 USB 空闲请求 IRP (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) 来确定网络适配器是否可以转换为低功耗状态。 这会通知总线驱动程序网络适配器处于空闲状态,并确认适配器是否可以转换为低功耗状态。

    注意

    微型端口驱动程序必须为 USB 空闲请求 IRP 指定回调和完成例程。

    有关微型端口驱动程序如何处理空闲通知的详细信息,请参阅 处理 NDIS 选择性挂起空闲通知

  4. 微型端口驱动程序确认网络适配器可以转换为低功耗状态后,它会调用 NdisMIdleNotificationConfirm。 在此调用中,微型端口驱动程序指定网络适配器可以转换到的最低功率状态。

  5. 调用 NdisMIdleNotificationConfirm 时,NDIS 向微型端口驱动程序发出 OID 请求,以准备适配器以转换为低功耗状态。 NDIS 还会向基础总线驱动程序发出 IRP,以将适配器设置为低功耗状态。

  6. 网络适配器暂停后,它将保持低功耗状态,直到取消未完成的空闲通知。

    NDIS 通过调用微型端口驱动程序的 MiniportCancelIdleNotification 处理程序函数来取消未完成的空闲通知。 如果满足以下一个或多个条件,NDIS 将调用此处理程序函数:

    • NDIS 检测到发送数据包请求或 OID 请求,这些请求是从过度分配的协议或筛选器驱动程序发送到微型端口驱动程序的。

    • 网络适配器发出唤醒事件信号。 当适配器收到数据包或检测到其媒体连接状态发生更改时,可能会发生这种情况。

    网络适配器挂起后,微型端口驱动程序还可以完成空闲通知,以便将适配器恢复为全功率状态。 执行此操作的原因特定于驱动程序和适配器的设计和要求。

    有关 NDIS 如何取消空闲通知的详细信息,请参阅 取消 NDIS 选择性挂起空闲通知

    有关微型端口驱动程序如何完成空闲通知的详细信息,请参阅 完成 NDIS 选择性挂起空闲通知

  7. 调用 MiniportCancelIdleNotification 处理程序函数时,微型端口驱动程序将确定网络适配器是否可以恢复为全功率状态。 驱动程序还会取消之前针对空闲通知发出的任何特定于总线的 IRP。

    确定网络适配器可以转换为全功率状态是特定于总线的。 例如,调用 MiniportCancelIdleNotification 时,USB 微型端口必须取消以前发出的 USB 空闲请求 IRP。 USB 驱动程序取消 IRP 后,它会立即调用 IRP 的完成例程,以确认 IRP 已取消,并且网络适配器可以恢复为全功率状态。 在完成例程的上下文中,微型端口驱动程序调用 NdisMIdleNotificationComplete

    当微型端口确定网络适配器可以恢复到全功率状态时,它会调用 NdisMIdleNotificationComplete。 此调用通知 NDIS 空闲通知已完成。 然后,NDIS 通过将网络适配器转换为全功率状态,继续完成选择性挂起操作。

  8. 调用 NdisMIdleNotificationComplete 时,NDIS 向微型端口驱动程序发出 OID 请求,以准备适配器以转换为全功率状态。 NDIS 还会向基础总线驱动程序发出 IRP,以将适配器设置为全功率状态。

  9. 当网络适配器恢复为满电状态时,将完成选择性挂起操作。 NDIS 继续监视网络适配器的 I/O 活动。 如果适配器在另一个空闲超时期限后变为非活动状态,NDIS 会向微型端口驱动程序发出空闲通知,以便挂起网络适配器。