A figura a seguir mostra um cliente fazendo uma chamada de saída por meio de um gerenciador de chamadas.
A figura a seguir mostra um cliente fazendo uma chamada de saída por meio de um driver MCM.
Antes de fazer uma chamada de saída, um cliente orientado à conexão deve:
Inicialize parâmetros de chamada em uma estrutura do tipo CO_CALL_PARAMETERS. O gerenciador de chamadas ou driver MCM normalmente usa os parâmetros de chamada que o cliente especifica para configurar a chamada e derivar parâmetros de mídia para uso pelo driver de miniporta.
Inicie a criação de um VC com NdisCoCreateVc.
No retorno bem-sucedido de NdisCoCreateVc, o cliente chama NdisClMakeCall para iniciar a chamada (veja as duas figuras nesta seção).
Na sua chamada para NdisClMakeCall, o cliente passa um ponteiro para a estrutura CO_CALL_PARAMETERS previamente inicializada. O cliente também passa um NdisVcHandle (retornado por NdisCoCreateVc), que identifica o VC no qual o cliente transmitirá (e possivelmente receberá) dados para a chamada. Se o cliente estiver a fazer uma chamada multiponto (uma chamada para mais de uma parte remota), também passará um ProtocolPartyContext que especifica um identificador para uma área de contexto residente alocada pelo cliente, na qual o cliente manterá o estado de cada parte para a parte inicial no VC multiponto.
A chamada para NdisClMakeCall faz com que o NDIS encaminhe esse pedido para a função ProtocolCmMakeCall do gestor de chamadas ou driver MCM com o qual o cliente partilha o NdisVcHandle fornecido.
ProtocolCmMakeCall deve validar os parâmetros de chamada de entrada que foram configurados pelo cliente.
ProtocolCmMakeCall comunica (troca mensagens de sinalização) com dispositivos de controlo de rede para estabelecer uma ligação. Um gestor de chamadas chama NdisCoSendNetBufferLists para iniciar esta troca (consulte Envio de estruturas NET_BUFFER de drivers CoNDIS). Um controlador MCM nunca chama NdisCoSendNetBufferLists. Em vez disso, ele transmite os dados diretamente pela rede.
O gerenciador de chamadas ou driver MCM pode modificar os parâmetros de chamada fornecidos pelo cliente durante a negociação com componentes de rede relevantes e pode retornar parâmetros de tráfego diferentes do que o cliente originalmente deu ao NdisClMakeCall (consulte Solicitação de entrada para alterar parâmetros de chamada).
Um explícito NdisPartyHandle passado para ProtocolCmMakeCall indica que o VC criado pelo cliente será usado para uma chamada multiponto. O gestor de chamadas ou o driver MCM deve alocar e inicializar todos os recursos necessários para manter as informações de estado de cada parte e controlar a chamada multiponto.
Depois de um gestor de chamadas ter feito toda a comunicação necessária com o seu hardware de rede, conforme exigido pelo seu meio, deve chamar NdisCmActivateVc para iniciar a ativação do VC no qual os dados da chamada serão enviados e talvez recebidos. Um driver MCM deve chamar NdisMCmActivateVc.
Quando o driver de miniporta subjacente está pronto para fazer transferências de dados no VC (ou seja, depois que o VC foi ativado), um gerenciador de chamadas chama NdisCmMakeCallCompletee um driver MCM chama NdisMCmMakeCallComplete. Neste ponto, o gerenciador de chamadas ou driver MCM deve ter negociado com a rede para estabelecer parâmetros de chamada para o VC, e o driver de miniporta subjacente deve ter concluído a ativação do VC.
Na chamada para Ndis(M)CmMakeCallComplete, o gestor de chamadas ou controlador MCM passa os parâmetros da chamada para o VC como um ponteiro para uma estrutura do tipo CO_CALL_PARAMETERS. Se o gerenciador de chamadas tiver modificado os parâmetros de chamada conforme especificado originalmente pelo cliente, ele poderá notificá-lo definindo o sinalizador de CALL_PARAMETERS_CHANGED na estrutura CO_CALL_PARAMETERS.
Uma chamada para Ndis(M)CmMakeCallComplete faz com que o NDIS chame a função ProtocolClMakeCallComplete do cliente que originou a chamada de saída. Uma chamada para ProtocolClMakeCallComplete indica que o gerente de chamadas concluiu o processamento do pedido do cliente de estabelecer uma ligação virtual através de NdisClMakeCall.
Se a tentativa do cliente de estabelecer uma chamada de saída foi bem-sucedida, ProtocolClMakeCallComplete deve verificar o sinalizador CALL_PARAMETERS_CHANGED para determinar se os parâmetros de chamada originalmente especificados pelo cliente foram modificados. Se o sinalizador estiver definido, indicando que os parâmetros de chamada foram alterados, ProtocolClMakeCallComplete deve examinar os parâmetros de chamada retornados para determinar se eles são aceitáveis para essa conexão.
Se os parâmetros de chamada forem aceitáveis, ProtocolClMakeCallComplete simplesmente retorna o controle. Se os parâmetros de chamada não forem aceitáveis e se o protocolo de sinalização permitir a renegociação neste momento, o cliente pode chamar NdisClModifyCallQoS para solicitar uma alteração nos parâmetros de chamada (consulte Client-Initiated Request to Close a Call). Se o protocolo de sinalização não permitir a renegociação de parâmetros de chamada inaceitáveis, ProtocolClMakeCallComplete deve encerrar a chamada com NdisClCloseCall (consulte Client-Initiated Solicitação para fechar uma chamada).