Client-Initiated запрос на изменение параметров вызова
Клиент запрашивает изменение качества обслуживания (QoS) на активном виртуальном подключении (VC) посредством NdisClModifyCallQoS.
На следующем рисунке показан клиент диспетчера вызовов, запрашивающий изменение качества обслуживания.
На следующем рисунке показан клиент драйвера MCM, запрашивающего изменение качества обслуживания.
В вызове функции NdisClModifyCallQoSклиент предоставляет:
Параметр NdisVcHandle, определяющий VC.
Указатель на структуру CO_CALL_PARAMETERS, содержащую параметры вызова, запрашиваемые клиентом.
Обстоятельства, при которых клиент может запросить изменение в QoS, определяются протоколом сигнализации.
Вызов NdisClModifyCallQoS заставляет NDIS вызвать функцию ProtocolCmModifyCallQoS диспетчера вызовов или MCM-драйвера, которая принимает в качестве входных данных NdisVcHandle и структуру CO_CALL_PARAMETERS, переданную клиентом в NdisClModifyCallQoS. ProtocolCmModifyQoS взаимодействует с устройствами управления сетями или другими агентами, специфичными для носителя, чтобы изменить специфичные для носителя параметры вызова для установленного виртуального подключения.
После взаимодействия с сетью и определения успешности изменений диспетчер вызовов должен вызвать NdisCmActivateVc(а драйвер MCM должен вызвать NdisMCmActivateVc), чтобы активировать указанный VC с новыми параметрами вызова.
Если сеть не принимает новые параметры вызова или если базовый драйвер минипорта не может принять параметры, диспетчер вызовов или драйвер MCM должны восстановить VC в состояние, которое существовало до попытки любых изменений, и вернуть NDIS_STATUS_FAILURE.
Чтобы указать состояние запроса клиента на изменение качества обслуживания, диспетчер вызовов вызывает NdisCmModifyCallQoSComplete, а драйвер MCM вызывает NdisMCmModifyCallQoSComplete. В этом вызове диспетчер вызовов или драйвер MCM передает следующее:
NDIS_STATUS, указывающий состояние запроса.
NdisVcHandle, определяющий VC.
Указатель на структуру CO_CALL_PARAMETERS, содержащую параметры вызова для VC.
Если он разрешен протоколом передачи сигналов, диспетчер вызовов или драйвер MCM могут передавать измененные параметры вызова клиенту. Эти изменения могут быть продуктом переговоров с сетью или могут быть предоставлены диспетчером вызовов или самим драйвером MCM. Диспетчер вызовов или драйвер MCM должен указывать, что параметры вызова были изменены, задав флаг CALL_PARAMETERS_CHANGED в структуре CO_CALL_PARAMETERS.
Вызов Ndis(M)CmModifyCallQoSComplete приводит к тому, что NDIS вызывает функцию клиента ProtocolClModifyCallQoSComplete. NDIS передает следующее в ProtocolClModifyCallQoSComplete:
NDIS_STATUS, указывающий состояние запроса клиента на изменение качества обслуживания.
Дескриптор протокола ProtocolVcContext, определяющий VC.
Указатель на структуру CO_CALL_PARAMETERS, содержащую параметры вызова, которые передаются диспетчером вызовов или драйвером MCM в Ndis(M)CmModifyCallQoSComplete.
Если флаг CALL_PARAMETERS_CHANGED задан в структуре CO_CALL_PARAMETERS, клиент должен проверить возвращаемые параметры вызова и определить, допустимы ли изменения. Если вызов клиента к NdisClModifyCallQoS выполнен успешно, ProtocolClModifyCallQoSComplete может принять изменение качества обслуживания, просто передавая управление обратно. В противном случае ProtocolClModifyCallQoSComplete может участвовать в дальнейших переговорах с диспетчером вызовов, если это разрешено протоколом сигнализации, и если разработчик клиента устанавливает некоторое разумное ограничение на количество возможных повторных переговоров. Кроме того, ProtocolClModifyCallQoSComplete может просто отменить вызов с помощью NdisCloseCall(см. Client-Initiated запрос на закрытие вызова) всякий раз, когда диспетчер вызовов отклоняет запрос на изменение качества обслуживания и ранее установленный QoS стал неприемлемым для клиента.