创建虚拟连接(VC)后(请参阅 创建 VC),必须先激活它,然后才能传输或接收数据。 调用管理器通过调用 NdisCmActivateVc来启动 VC 的激活(请参阅下图)。
MCM 驱动程序通过调用 NdisMCmActivateVc来启动 VC 的激活(请参阅下图)。
如果本地客户端或远程方成功协商该 VC 上的调用参数更改(请参阅 Client-Initiated 请求关闭呼叫 并 传入请求更改呼叫参数),则呼叫管理器或 MCM 驱动程序可以启动活动 VC 的重新激活。 调用管理器或 MCM 驱动程序可以多次调用 Ndis(M)CmActivateVc,以便单个 VC 更改已激活调用的调用参数。
对于客户端发起的外拨呼叫,呼叫管理器或 MCM 驱动程序通常会在确认与远程目标成功协商一致或在交换机上成功建立呼叫后的数据包交换后立即调用 Ndis(M)CmActivateVc。 调用管理器或 MCM 驱动程序调用 Ndis(M)CmActivateVc,然后用 Ndis(M)CmMakeCallComplete(请参阅进行调用)通知 NDIS(和客户端)传出调用完成。 对于传入调用,调用管理器或 MCM 驱动程序通常在成功调用 NdisCo(MCm)CreateVc 之后,并在调用 Ndis(M)CmDispatchIncomingCall 之前,调用 Ndis(M)CmActivateVc(请参阅指示传入调用)。
呼叫管理器调用 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 不透明。