Активация VC
После создания виртуального подключения (VC) его необходимо активировать перед передачей или получением данных. Диспетчер вызовов инициирует активацию VC, вызывая NdisCmActivateVc (см. следующий рисунок).
Драйвер MCM инициирует активацию VC, вызывая NdisMCmActivateVc (см. следующий рисунок).
Диспетчер вызовов или драйвер MCM может инициировать повторную активацию активного VC, если локальный клиент или удаленная сторона успешно согласовывает изменение параметров вызова в этом VC (см. статьи Инициированный клиентом запрос на закрытие звонка и Входящий запрос на изменение параметров вызова). Диспетчер вызовов или драйвер MCM может много раз вызывать Ndis(M)CmActivateVc для одного VC, чтобы изменить параметры вызова для уже активного вызова.
Для исходящего вызова, инициированного клиентом, диспетчер вызовов или драйвер MCM обычно вызывает Ndis(M)CmActivateVc сразу после обмена пакетами, подтверждающие согласование с удаленным целевым объектом вызова или успешную настройку вызова на коммутаторе. Диспетчер вызовов или драйвер MCM вызывает Ndis(M)CmActivateVc перед уведомлением NDIS (и клиента) о завершении исходящего вызова с помощью Ndis(M)CmMakeCallComplete (см. раздел Совершение звонка). Для входящего вызова диспетчер вызовов или драйвер MCM обычно вызывает Ndis(M)CmActivateVc после успешного вызова NdisCo(MCm)CreateVc и перед вызовом Ndis(M)CmDispatchIncomingCall (см. раздел Указание входящего вызова).
Вызов диспетчера вызовов к NdisCmActivateVc приводит к тому, что NDIS вызывает функцию MiniportCoActivateVc базового драйвера miniport. MiniportCoActivateVc должен проверить параметры вызова для этого VC, чтобы убедиться, что адаптер может поддерживать запрошенный вызов. Если параметры вызова допустимы, MiniportCoActivateVc взаимодействует со своим адаптером при необходимости, чтобы подготовить адаптер к приему или передаче данных через виртуальное соединение (например, программирование буферов приема). Если запрошенные параметры вызова не поддерживаются, драйвер мини-порта не выполняет запрос.
MiniportCoActivateVc может выполняться синхронно или асинхронно. Вызов NdisMCoActivateVcComplete вызывает функцию ProtocolCmActivateVcComplete диспетчера вызовов. ProtocolCmActivateVcComplete должен проверка состояние, возвращаемое NdisMCoActivateVcComplete, чтобы убедиться, что виртуальное подключение было успешно активировано. Если драйвер мини-порта не активировал VC, диспетчер вызовов не должен пытаться взаимодействовать через VC. ProtocolCmActivateVcComplete также должен завершить обработку, необходимую сетевому носителю, чтобы убедиться, что виртуальное подключение готово к передаче данных перед возвратом управления в NDIS.
Вызов драйвера MCM к NdisMCmActivateVc информирует NDIS о том, что он настроил параметры вызова и мультимедиа в только что созданном VC или изменил параметры вызова в установленном VC. Это действие уведомляет NDIS о том, что драйвер MCM сделал сетевой адаптер готовым к передаче на VC. NDIS завершает последовательность активации, вызывая функцию ProtocolCmActivateVcComplete драйвера MCM.
Драйвер MCM вызывает NdisMCmActivateVc для активации только виртуальных машин, используемых для передачи и (или) получения данных клиента, но не для активации виртуальных машин, используемых для обмена сигнальными сообщениями между драйвером MCM и сетевыми компонентами, такими как коммутатор. Драйвер MCM активирует сигнальную VC внутри системы, не вызывая функцию NdisXxx . Поэтому любой VC, который драйвер MCM настраивает для собственных целей сигнализации, является непрозрачным для NDIS.