Fazendo uma chamada
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 o driver MCM normalmente usa os parâmetros de chamada especificados pelo cliente para configurar a chamada e derivar parâmetros de mídia para uso pelo driver de miniport.
Inicie a criação de uma VC com NdisCoCreateVc.
No retorno bem-sucedido de NdisCoCreateVc, o cliente chama NdisClMakeCall para iniciar a chamada (consulte as duas figuras nesta seção).
Em sua chamada para NdisClMakeCall, o cliente passa um ponteiro para a estrutura de CO_CALL_PARAMETERS inicializada anteriormente. O cliente também passa um NdisVcHandle (retornado por NdisCoCreateVc) que identifica a VC na qual o cliente transmitirá (e talvez receberá) dados para a chamada. Se o cliente estiver fazendo uma chamada de vários pontos (uma chamada para mais de uma parte remota), ele 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 por parte da parte inicial no VC de vários pontos.
A chamada para NdisClMakeCall faz com que o NDIS encaminhe essa solicitação para a função ProtocolCmMakeCall do gerenciador de chamadas ou do driver MCM com o qual o cliente compartilha o NdisVcHandle fornecido. ProtocolCmMakeCall deve validar os parâmetros de chamada de entrada que foram configurados pelo cliente.
ProtocolCmMakeCall se comunica (troca mensagens de sinalização) com dispositivos de controle de rede para fazer uma conexão. Um gerenciador de chamadas chama NdisCoSendNetBufferLists para iniciar essa troca (consulte Enviando estruturas de NET_BUFFER de drivers condis). Um driver MCM nunca chama NdisCoSendNetBufferLists. Em vez disso, ele transmite os dados diretamente pela rede.
O gerenciador de chamadas ou o driver MCM podem modificar os parâmetros de chamada fornecidos pelo cliente durante a negociação com componentes de rede relevantes e podem retornar parâmetros de tráfego diferentes do cliente originalmente fornecido a NdisClMakeCall (consulte Solicitação de entrada para alterar parâmetros de chamada).
Um NdisPartyHandle explícito passado para ProtocolCmMakeCall indica que a VC criada pelo cliente será usada para uma chamada de vários pontos. O gerenciador de chamadas ou o driver MCM devem alocar e inicializar todos os recursos necessários para manter as informações de estado por parte e controlar a chamada de vários pontos.
Depois que um gerenciador de chamadas tiver feito toda a comunicação necessária com seu hardware de rede conforme exigido por seu meio, ele deverá chamar NdisCmActivateVc para iniciar a ativação da VC na qual os dados de chamada serão enviados e talvez recebidos. Um driver MCM deve chamar NdisMCmActivateVc.
Quando o driver de miniporto subjacente estiver pronto para fazer transferências de dados na VC (ou seja, depois que a VC tiver sido ativada), um gerenciador de chamadas chamará NdisCmMakeCallComplete e um driver MCM chamará NdisMCmMakeCallComplete. Neste ponto, o gerenciador de chamadas ou o driver MCM devem ter negociado com a rede para estabelecer parâmetros de chamada para a VC, e o driver de miniporto subjacente deve ter concluído a ativação da VC.
Na chamada para Ndis(M)CmMakeCallComplete, o gerenciador de chamadas ou o driver MCM passa os parâmetros de chamada para a 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á notificar o cliente definindo o sinalizador 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 gerenciador de chamadas concluiu o processamento da solicitação do cliente para estabelecer uma conexão virtual com NdisClMakeCall.
Se a tentativa do cliente de estabelecer uma chamada de saída tiver sido bem-sucedida, ProtocolClMakeCallComplete deverá marcar o sinalizador CALL_PARAMETERS_CHANGED para determinar se os parâmetros de chamada originalmente especificados pelo cliente foram modificados. Se o sinalizador for definido, indicando que os parâmetros de chamada foram alterados, ProtocolClMakeCallComplete deverá 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 retornará 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 poderá chamar NdisClModifyCallQoS para solicitar uma alteração nos parâmetros de chamada (consulte Solicitação iniciada pelo cliente para fechar uma chamada). Se o protocolo de sinalização não permitir a renegociação de parâmetros de chamada inaceitáveis, ProtocolClMakeCallComplete deverá derrubar a chamada com NdisClCloseCall (consulte Client-Initiated Request to Close a Call).