激活 VC
创建虚拟连接 (VC) 后, (请参阅 创建 VC) ,必须先激活它,然后才能传输或接收数据。 调用管理器通过调用 NdisCmActivateVc 来启动 VC 激活 (请参阅下图) 。
MCM 驱动程序通过调用 NdisMCmActivateVc 来启动 VC 的激活 (请参阅下图) 。
如果本地客户端或远程方成功协商该 VC 上的调用参数更改,则调用管理器或 MCM 驱动程序可以启动活动 VC 的重新激活 (请参阅 客户端发起的关闭呼叫的请求 和 传入请求以更改呼叫参数) 。 对于单个 VC,调用管理器或 MCM 驱动程序可以多次调用 Ndis (M) CmActivateVc ,以更改已处于活动状态的呼叫的调用参数。
对于客户端发起的传出呼叫,调用管理器或 MCM 驱动程序通常会在数据包交换后立即调用 Ndis (M) CmActivateVc ,确认与呼叫的远程目标达成协商协议或在交换机上成功调用设置。 调用管理器或 MCM 驱动程序在通知 NDIS (之前调用 Ndis (M) CmActivateVc ,客户端) 使用 Ndis (M) CmMakeCallComplete ( 请参阅 发出呼叫) 。 对于传入呼叫,调用管理器或 MCM 驱动程序通常在成功调用 NdisCo (MCm) CreateVc 之后调用 Ndis (M) CmActivateVc,并在调用 Ndis (M) CmDispatchIncomingCall (请参阅指示传入呼叫) 。
调用管理器对 NdisCmActivateVc 的调用会导致 NDIS 调用基础微型端口驱动程序的 MiniportCoActivateVc 函数。 MiniportCoActivateVc 必须验证此 VC 的调用参数,以验证适配器是否可以支持请求的调用。 如果调用参数是可接受的, MiniportCoActivateVc 会根据需要与其适配器通信,以准备适配器以通过虚拟连接 (接收或传输数据,例如,编程接收缓冲区) 。 如果请求的调用参数不受支持,微型端口驱动程序将失败请求。
MiniportCoActivateVc 可以同步或异步完成。 调用 NdisMCoActivateVcComplete 会导致 NDIS 调用调用管理器的 ProtocolCmActivateVcComplete 函数。 ProtocolCmActivateVcComplete 必须检查 NdisMCoActivateVcComplete 返回的状态,以确保虚拟连接已成功激活。 如果微型端口驱动程序未成功激活 VC,则调用管理器不得尝试通过 VC 进行通信。 ProtocolCmActivateVcComplete 还必须完成网络媒体所需的任何处理,以确保虚拟连接已准备好进行数据传输,然后再将控制权返回到 NDIS。
MCM 驱动程序对 NdisMCmActivateVc 的调用会通知 NDIS 它已在新创建的 VC 上设置了调用和媒体参数,或更改了已建立的 VC 上的调用参数。 此操作通知 NDIS MCM 驱动程序已准备好 NIC 以在 VC 上传输。 NDIS 通过调用 MCM 驱动程序的 ProtocolCmActivateVcComplete 函数完成激活序列。
MCM 驱动程序调用 NdisMCmActivateVc ,以仅激活用于传输和/或接收客户端数据的 VC,但不激活用于在 MCM 驱动程序和网络组件(如交换机)之间交换信号消息的 VC。 MCM 驱动程序在内部激活信号 VC,而无需调用任何 NdisXxx 函数。 因此,MCM 驱动程序为其自己的信号目的设置的任何 VC 对 NDIS 是不透明的。