Client-Initiated запрос на закрытие звонка
Если клиент закрывает многоточечный вызов, к которому по-прежнему подключено несколько сторон, он должен сначала вызвать NdisClDropParty столько раз, сколько необходимо, чтобы удалить все, кроме последней стороны из вызова (см. удаление участника из многоточечных вызовов).
Клиент инициирует завершение вызова с NdisClCloseCall. На следующем рисунке показан клиент, инициирующий закрытие вызова с помощью диспетчера вызовов.
На следующем рисунке показан клиент, инициирующий закрытие вызова через драйвер MCM.
Клиент, ориентированный на подключение, обычно вызывает NdisClCloseCall в одном из следующих обстоятельств:
Закрытие установленного исходящего или входящего вызова.
Из функции протокола ProtocolClIncomingCloseCall для завершения установленного вызова (См. входящий запрос на закрытие вызова).
Из функции ProtocolClIncomingCallQoSChange, чтобы прервать установленный вызов, если изменение качества обслуживания, предлагаемое удаленной стороной, неприемлемо (см. Входящий запрос на изменение параметров вызова).
Из функции ProtocolClModifyCallQoSComplete , чтобы завершить установленный вызов, если изменение качества обслуживания, предложенное клиентом, неприемлемо для удаленной стороны (см. запрос на изменение параметров вызова Client-Initiated).
Вызов клиента к NdisClCloseCall заставляет NDIS вызвать функцию ProtocolCmCloseCall диспетчера вызовов или драйвера MCM. ПротоколCmCloseCall должен взаимодействовать с устройствами управления сетью, чтобы завершить подключение между локальным узлом и удаленным узлом.
Если ProtocolCmCloseCall передается явный CallMgrPartyContext, вызов, который завершается, является многоточечным вызовом. Диспетчер вызовов или драйвер MCM должен выполнять необходимое сетевое взаимодействие с сетевым оборудованием, соответствующим типу носителя, чтобы завершить вызов как многоточечный вызов.
NDIS может передавать ProtocolCmCloseCall указатель на буфер, содержащий данные, предоставленные клиентом в вызове NdisClClose. Эти данные могут быть диагностическими данными, которые указывают, почему вызов был закрыт или любые другие данные, необходимые протоколу сигнала. ProtocolCmCloseCall должны отправлять все такие данные по сети перед завершением вызова. Если отправка данных, одновременных с завершением подключения, не поддерживается, диспетчер вызовов или драйвер MCM должны возвращать NDIS_STATUS_INVALID_DATA.
ProtocolCmCloseCall может выполняться синхронно или, более вероятно, асинхронно с NdisCmCloseCallComplete(в случае диспетчера вызовов) или NdisMCmCloseCallComplete(в случае драйвера MCM). Вызов Ndis(M)CmCloseCallComplete приводит к тому, что NDIS вызывает функцию клиента ProtocolClCloseCallComplete.
Затем диспетчер вызовов или драйвер MCM должен инициировать деактивацию VC, используемого для вызова, соответственно вызывая NdisCmDeactivateVc или NdisMCmDeactivateVc(см. Деактивация VC). Создатель VC (клиент, диспетчер вызовов или драйвер MCM) может при необходимости инициировать удаление VC (см. Удаление VC).