Indicando uma chamada de entrada
Um gerenciador de chamadas ou driver MCM é alertado para uma chamada de entrada sinalizando mensagens da rede. Dessas mensagens de sinalização, o gerenciador de chamadas ou o driver MCM extrai os parâmetros de chamada para a chamada, incluindo o SAP para o qual a chamada de entrada é endereçada.
A figura a seguir mostra um driver MCM indicando uma chamada de entrada.
A figura a seguir mostra um gerenciador de chamadas indicando uma chamada de entrada.
Se os parâmetros de chamada de entrada forem inaceitáveis para o gerenciador de chamadas ou o driver MCM, ele poderá tentar negociar uma alteração nesses parâmetros com a parte remota se essa negociação for permitida pelo protocolo de sinalização. Como alternativa, o cliente para o qual a chamada de entrada é direcionada pode tentar negociar os parâmetros de chamada depois de receber a indicação de chamada do gerenciador de chamadas ou do driver MCM (consulte Solicitação iniciada pelo cliente para alterar parâmetros de chamada). Se o gerenciador de chamadas ou o driver MCM não puder negociar parâmetros de chamada aceitáveis para a chamada com a parte remota, ele poderá recusar a chamada. O protocolo de sinalização determina o que é possível nesses casos.
Antes de indicar uma chamada de entrada para um cliente, o gerenciador de chamadas ou o driver MCM devem identificar o SAP para o qual a chamada é direcionada. O SAP deve ter sido registrado anteriormente por um cliente. O gerenciador de chamadas ou o driver MCM também deve iniciar a criação de uma VC e iniciar a ativação dessa VC.
O gerenciador de chamadas ou driver MCM indica a chamada de entrada para o cliente que registrou o SAP para o qual a chamada de entrada é direcionada. Um gerenciador de chamadas indica uma chamada de entrada com NdisCmDispatchIncomingCall. Um driver MCM indica uma chamada de entrada com NdisMCmDispatchIncomingCall.
Na chamada para Ndis(M)CmDispatchIncomingCall, o gerenciador de chamadas ou o driver MCM passa o seguinte:
Um NdisSapHandle que identifica o SAP ao qual a chamada de entrada é endereçada.
Um NdisVcHandle que identifica o circuito virtual para a chamada de entrada.
Um ponteiro para uma estrutura do tipo CO_CALL_PARAMETERS, que contém os parâmetros de chamada para a chamada.
A chamada para Ndis(M)CmDispatchIncomingCall faz com que o NDIS chame a função ProtocolClIncomingCall do cliente, na qual o cliente aceita ou rejeita a conexão solicitada. ProtocolClIncomingCall deve validar os parâmetros SAP, VC e call.
ProtocolClIncomingCall pode ser concluído de forma síncrona ou pode retornar NDIS_STATUS_PENDING e ser concluído de forma assíncrona com NdisClIncomingCallComplete. Uma chamada para NdisClIncomingCallComplete faz com que o NDIS chame a função ProtocolCmIncomingCallComplete do gerenciador de chamadas ou do driver MCM.
O código NDIS_STATUS que é retornado por uma conclusão síncrona de ProtocolClIncomingCall ou fornecido a NdisClIncomingCallComplete indica a aceitação ou rejeição do cliente da chamada de entrada. O cliente também retorna os parâmetros de chamada para a chamada em uma estrutura de CO_CALL_PARAMETERS em buffer. Se o cliente achar os parâmetros de chamada inaceitáveis, ele poderá, se permitido pelo protocolo de sinalização, solicitar uma alteração nos parâmetros de chamada definindo o membro Flags na estrutura CO_CALL_PARAMETERS com CALL_PARAMETERS_CHANGED e fornecendo os parâmetros de chamada revisados em uma estrutura de CO_CALL_PARAMETERS em buffer.
Se o cliente aceitar a chamada de entrada, o gerenciador de chamadas ou o driver MCM deverá enviar mensagens de sinalização para indicar à entidade de chamada que a chamada foi aceita. Caso contrário, o gerenciador de chamadas ou o driver MCM devem enviar mensagens de sinalização para indicar que a chamada foi rejeitada. Se o cliente estiver solicitando uma alteração nos parâmetros de chamada, o gerenciador de chamadas ou o driver MCM enviará mensagens de sinalização para solicitar uma alteração nos parâmetros de chamada.
Se o cliente aceitou a chamada ou se a alteração solicitada no cliente nos parâmetros de chamada foi aceita pela parte remota, um gerenciador de chamadas chama NdisCmDispatchCallConnected e um driver MCM chama NdisMCmDispatchCallConnected. A chamada para Ndis(M)CmDispatchCallConnected faz com que o NDIS chame a função ProtocolClCallConnected do cliente.
Se o cliente rejeitou a chamada e o gerenciador de chamadas ou o driver MCM já ativou uma VC para a chamada de entrada, o gerenciador de chamadas ou o driver MCM chama Ndis(M)CmDeactivateVc para desativar a VC se a VC estiver ativada. O gerenciador de chamadas ou o driver MCM podem iniciar a exclusão da VC chamando NdisCoDeleteVc no caso do gerenciador de chamadas ou NdisMCmDeleteVc no caso do driver MCM.
Se o cliente aceitou a chamada, mas a conexão de ponta a ponta não foi estabelecida com êxito (porque, por exemplo, a parte remota derrubou a chamada), o gerenciador de chamadas ou o driver MCM não chamará Ndis(M)CmDispatchCallConnected. Em vez disso, ele chamará Ndis(M)CmDispatchIncomingCloseCall, o que faz com que o NDIS chame a função ProtocolClIncomingCloseCall do cliente. Em seguida, o cliente deve chamar NdisClCloseCall para concluir a remoção da chamada. O gerenciador de chamadas ou o driver MCM chama Ndis(M)CmDeactivateVC para desativar a VC que ele criou para a chamada de entrada. O gerenciador de chamadas ou o driver MCM podem iniciar a exclusão da VC chamando NdisCoDeleteVc no caso do gerenciador de chamadas ou NdisMCmDeleteVc no caso do driver MCM.