Совершение звонка
На следующем рисунке показан клиент, выполняющий исходящий звонок через диспетчера вызовов.
На следующем рисунке показан клиент, выполняющий исходящий вызов через драйвер MCM.
Перед выполнением исходящего вызова клиент, ориентированный на подключение, должен:
Инициализация параметров вызова в структуре типа CO_CALL_PARAMETERS. Диспетчер вызовов или драйвер MCM обычно используют параметры вызова, заданные клиентом, для настройки вызова и получения параметров мультимедиа для использования драйвером мини-порта.
Инициируйте создание VC с помощью NdisCoCreateVc.
При успешном возвращении NdisCoCreateVc клиент вызывает NdisClMakeCall для инициации вызова (см. два рисунка в этом разделе).
В вызове NdisClMakeCall клиент передает указатель на инициализированную ранее структуру CO_CALL_PARAMETERS. Клиент также передает NdisVcHandle (возвращенный NdisCoCreateVc), который идентифицирует VC, по которому клиент будет передавать (и, возможно, получать) данные для вызова. Если клиент выполняет многоточечный вызов (вызов нескольких удаленных сторон), он также передает ProtocolPartyContext , указывающий дескриптор, в выделенную клиентом область контекста резидента, в которой клиент будет поддерживать состояние каждой стороны для исходной стороны в многоточеном VC.
Вызов NdisClMakeCall приводит к тому, что NDIS перенаправит этот запрос в функцию ProtocolCmMakeCall диспетчера вызовов или драйвера MCM, с которым клиент использует указанный NdisVcHandle . ProtocolCmMakeCall должен проверить входные параметры вызова, настроенные клиентом.
ProtocolCmMakeCall взаимодействует (обменивается сигнальными сообщениями) с устройствами управления сетью для подключения. Диспетчер вызовов вызывает NdisCoSendNetBufferLists , чтобы инициировать такой обмен (см. раздел Отправка структур NET_BUFFER из драйверов CoNDIS). Драйвер MCM никогда не вызывает NdisCoSendNetBufferLists. Вместо этого он передает данные непосредственно по сети.
Диспетчер вызовов или драйвер MCM может изменять предоставленные клиентом параметры вызова во время согласования с соответствующими сетевыми компонентами и может возвращать параметры трафика, отличные от параметров, изначально предоставленных клиентом NdisClMakeCall (см. раздел Входящие запросы на изменение параметров вызова).
Явный NdisPartyHandle , переданный в ProtocolCmMakeCall , указывает, что VC, созданный клиентом, будет использоваться для многоточечных вызовов. Диспетчер вызовов или драйвер MCM должен выделить и инициализировать все необходимые ресурсы, необходимые для поддержки сведений о состоянии отдельных сторон и управления многоточечным вызовом.
После того как диспетчер вызовов выполнит все необходимые связи с сетевым оборудованием в соответствии с требованиями среды, он должен вызвать NdisCmActivateVc , чтобы инициировать активацию VC , в которой будут отправлены и, возможно, получены данные звонка. Драйвер MCM должен вызывать NdisMCmActivateVc.
Когда базовый драйвер минипорта будет готов к передаче данных в VC (то есть после активации VC), диспетчер вызовов вызывает NdisCmMakeCallComplete, а драйвер MCM — NdisMCmMakeCallComplete. На этом этапе диспетчер вызовов или драйвер MCM должны были договориться с сетью о том, чтобы установить параметры вызова для VC, а базовый драйвер минипорта должен завершить активацию VC.
При вызове Ndis(M)CmMakeCallComplete диспетчер вызовов или драйвер MCM передает параметры вызова для VC в качестве указателя на структуру типа CO_CALL_PARAMETERS. Если диспетчер вызовов изменил параметры вызова, указанные клиентом, он может уведомить клиента, установив флаг CALL_PARAMETERS_CHANGED в структуре CO_CALL_PARAMETERS.
Вызов Ndis(M)CmMakeCallComplete приводит к тому, что NDIS вызывает функцию ProtocolClMakeCallComplete клиента, который вызвал исходящий вызов. Вызов ProtocolClMakeCallComplete указывает, что диспетчер вызовов завершил обработку запроса клиента на установление виртуального подключения к NdisClMakeCall.
Если попытка клиента установить исходящий вызов была успешной, ProtocolClMakeCallComplete должен проверка флаг CALL_PARAMETERS_CHANGED, чтобы определить, были ли изменены параметры вызова, первоначально заданные клиентом. Если установлен флаг, указывающий, что параметры вызова были изменены, ProtocolClMakeCallComplete должен проверить возвращенные параметры вызова, чтобы определить, допустимы ли они для этого подключения.
Если параметры вызова являются допустимыми, ProtocolClMakeCallComplete просто возвращает управление. Если параметры вызова недопустимы и протокол сигнализации допускает повторное согласование на этом этапе, клиент может вызвать NdisClModifyCallQoS , чтобы запросить изменение параметров вызова (см. раздел Инициированный клиентом запрос на закрытие вызова). Если протокол сигнализации не допускает повторного согласования недопустимых параметров вызова, ProtocolClMakeCallComplete должен отменить вызов с помощью NdisClCloseCall(см. Client-Initiated Запрос на закрытие вызова).