Aceitando chamadas de entrada
Antes que um aplicativo possa aceitar uma chamada de entrada, primeiro ele deve ter uma linha aberta. Uma linha é aberta como resultado de um aplicativo que chama a função TAPI lineOpen . Essa chamada de função TAPI faz com que os drivers subjacentes encapsulam parâmetros TAPI em estruturas NDIS para se prepararem para receber uma chamada de entrada. Depois que o driver de miniporto wan condis recebe uma chamada de entrada, o driver de miniporto deve primeiro criar uma VC (conexão virtual) com o driver NDPROXY e, em seguida, notificar NDPROXY da chamada de entrada. O NDPROXY, por sua vez, notifica o aplicativo por meio do TAPI. A lista a seguir descreve como a chamada de entrada é configurada, conectada e feita:
NDPROXY especifica os parâmetros TAPI para uma conexão de entrada em uma estrutura de CO_AF_TAPI_SAP . NDPROXY preenche os membros dessa estrutura com as seguintes informações que foram passadas na função lineOpen TAPI:
- Identificador de linha aberta no membro ulLineID
- Endereço da conexão de entrada no membro ulAddressID
- Modo de mídia do fluxo de informações da conexão de entrada no membro ulMediaModes
NDPROXY sobrepõe a estrutura CO_AF_TAPI_SAP no membro Sap de uma estrutura CO_SAP e define o membro SapLength de CO_SAP para o tamanho de CO_AF_TAPI_SAP. NDPROXY também deve definir o membro SapType de CO_SAP como AF_TAPI_SAP_TYPE.
Depois que NDPROXY encapsula parâmetros TAPI, NDPROXY chama a função NdisClRegisterSap para se preparar para receber chamadas de entrada. Nessa chamada de função, NDPROXY passa um ponteiro para a estrutura de CO_SAP preenchida que especifica o PONTO de Acesso do Serviço (SAP) no qual o NDPROXY pode receber chamadas de entrada. O NDIS encaminha a estrutura de CO_SAP para a função ProtocolCmRegisterSap do driver MCM (gerenciador de chamadas de miniporto) da WAN coNDIS. ProtocolCmRegisterSap comunica-se com dispositivos de controle de rede ou outros agentes específicos da mídia, conforme necessário, para registrar o SAP na rede para NDPROXY. Depois que o driver de miniporto tiver registrado o SAP, ele poderá aceitar uma oferta de chamada de entrada direcionada para esse SAP.
Um driver de miniporto da WAN do CoNDIS é alertado para uma chamada de entrada sinalizando mensagens da rede. Nessas mensagens de sinalização, o driver de miniporto extrai os parâmetros de chamada para a chamada, incluindo o SAP ao qual a chamada de entrada é endereçada.
Antes de indicar uma chamada de entrada para NDPROXY, o driver de miniporto chama a função NdisMCmCreateVc para iniciar a criação de uma VC com NDPROXY. NDPROXY aloca e inicializa os recursos necessários para a VC e armazena o identificador na VC.
O driver de miniporto WAN do CoNDIS define os parâmetros TAPI para uma chamada de entrada em uma estrutura de CO_AF_TAPI_INCOMING_CALL_PARAMETERS . O driver de miniporto preenche os membros dessa estrutura com as seguintes informações que foram extraídas das mensagens de sinalização:
- Identificador de linha no membro ulLineID
- Endereço da chamada de entrada no membro ulAddressID
- CO_TAPI_FLAG_INCOMING_CALL bit no membro ulFlags . Todos os outros bits de ulFlags são reservados e devem ser definidos como 0.
- Estrutura LINECALLPARAMS no membro LineCallInfo . Os membros de LINECALLPARAMS especificam parâmetros de chamada TAPI para uma chamada de entrada.
O driver de miniporta sobrepõe CO_AF_TAPI_INCOMING_CALL_PARAMETERS no membro Parameters de uma estrutura CO_SPECIFIC_PARAMETERS e define o membro Length de CO_SPECIFIC_PARAMETERS com o tamanho de CO_AF_TAPI_INCOMING_CALL_PARAMETERS.
O driver de miniporte define a estrutura CO_SPECIFIC_PARAMETERS como o membro MediaSpecific de uma estrutura CO_MEDIA_PARAMETERS .
O driver de miniporto define um ponteiro para a estrutura CO_MEDIA_PARAMETERS para o membro MediaParameters de uma estrutura CO_CALL_PARAMETERS .
O driver de miniporto também deve definir o membro CallMgrParameters da estrutura CO_CALL_PARAMETERS para especificar a qualidade do serviço (QoS) da transferência de pacotes, como a largura de banda. Para definir esse membro CallMgrParameters , o driver de miniporto preenche membros de uma estrutura CO_CALL_MANAGER_PARAMETERS e aponta essa estrutura para CallMgrParameters. Por exemplo, para identificar as velocidades de transmissão e recebimento em bytes por segundo para a VC, o driver de miniporto deve definir os membros PeakBandwidth dos membros De transmissão e recebimento de CO_CALL_MANAGER_PARAMETERS. Os membros Transmit e Receive são estruturas FLOWSPEC. Para obter mais informações sobre a estrutura FLOWSPEC, consulte o SDK do Microsoft Windows.
Depois que o driver de miniporto encapsula os parâmetros TAPI e preenche o membro CallMgrParameters do CO_CALL_MANAGER_PARAMETERS, ele chama a função NdisMCmDispatchIncomingCall para indicar a chamada de entrada para NDPROXY. Nesta chamada, o driver de miniporto passa o seguinte:
- Um identificador que identifica o SAP ao qual a chamada de entrada é endereçada
- Um identificador que identifica a VC para a chamada de entrada
- Um ponteiro para a estrutura de CO_CALL_PARAMETERS preenchida
NDPROXY retorna NDIS_STATUS_PENDING para o driver de miniporto para que NDPROXY possa concluir NdisMCmDispatchIncomingCall de forma assíncrona.
Depois que o aplicativo TAPI atende à chamada de entrada com a função lineAnswer , NDPROXY chama a função NdisClIncomingCallComplete . O NDIS, por sua vez, chama a função ProtocolCmIncomingCallComplete do driver de miniport. Se NDPROXY retornar um código NDIS_STATUS_SUCCESS, ele indicará a aceitação dos parâmetros de chamada. Se NDPROXY achar os parâmetros de chamada inaceitáveis, ele poderá solicitar uma alteração nos parâmetros de chamada definindo o membro Flags na estrutura CO_CALL_PARAMETERS como CALL_PARAMETERS_CHANGED e fornecendo parâmetros de chamada revisados. Se NDPROXY aceitar a chamada de entrada, o driver de miniporte deverá enviar mensagens de sinalização para indicar à entidade de chamada que a chamada foi aceita. Caso contrário, o driver de miniporte deverá enviar mensagens de sinalização para indicar que a chamada foi rejeitada. Se NDPROXY estiver solicitando uma alteração nos parâmetros de chamada, o driver de miniporto enviará mensagens de sinalização para solicitar uma alteração nos parâmetros de chamada.
O driver de miniporto ativa a VC que o driver de miniporto criou com NDPROXY e também deve chamar a função NdisMCmActivateVc para notificar NDPROXY de que o driver de miniporto está pronto para transferir pacotes na VC.
Se NDPROXY rejeitar a chamada, o driver de miniporto chamará a função NdisMCmDeactivateVc para desativar a VC que o driver de miniporto criou para a chamada de entrada. Depois que a VC for desativada, o driver de miniporto chamará a função NdisMCmDeleteVc para excluir a VC.
Dependendo se NDPROXY aceitou a chamada de entrada e se a conexão de ponta a ponta foi estabelecida com êxito, o driver de miniporto chama as funções NdisMCmDispatchCallConnected ou NdisMCmDispatchIncomingCloseCall . Observe que, se a entidade de chamada remota cancelar a chamada, ela enviará mensagens de sinalização para indicar que a conexão de ponta a ponta não foi estabelecida com êxito. NdisMCmDispatchCallConnected notifica NDPROXY de que as transferências de dados podem começar na VC que o driver de miniporto criou e ativou para a chamada de entrada. NdisMCmDispatchIncomingCloseCall informa o NDPROXY para derrubar a chamada de entrada.
Se NDPROXY for direcionado para derrubar a chamada de entrada, ele chamará a função NdisClCloseCall para reconhecer que não tentará enviar nem espera receber dados na VC. O NDIS, por sua vez, chama a função ProtocolCmCloseCall do driver de miniport. Em seguida, o driver de miniporto chama a função NdisMCmDeactivateVc para desativar a VC. Depois que a VC for desativada, o driver de miniporto chamará a função NdisMCmDeleteVc para excluir a VC.
Depois que o aplicativo TAPI aceita a chamada de entrada e NDPROXY notifica o aplicativo de que a chamada está conectada, o aplicativo chama a função lineGetID TAPI para informar o NDPROXY para localizar o cliente CoNDIS apropriado. Nesta chamada lineGetID , o aplicativo TAPI fornece uma cadeia de caracteres para uma classe de dispositivo TAPI específica para a qual o aplicativo requer um identificador. NDPROXY usa essa cadeia de caracteres para localizar o cliente CoNDIS que anteriormente registrou um SAP para a classe de dispositivo TAPI específica. Se o cliente CoNDIS for NDISWAN, a cadeia de caracteres será NDIS. Se NDPROXY localizar um SAP com uma cadeia de caracteres que corresponda à cadeia de caracteres passada pelo aplicativo TAPI, NDPROXY chamará NdisMCmCreateVc para configurar um ponto de extremidade de conexão com o NDISWAN no qual ele pode expedir a notificação da chamada de entrada. O NDIS, por sua vez, chama a função ProtocolCoCreateVc do NDISWAN e passa um identificador que representa a VC.
Depois que NDPROXY configura o ponto de extremidade de conexão com o NDISWAN, ele chama a função NdisCmDispatchIncomingCall para notificar o NDISWAN sobre a chamada de entrada. Nessa chamada, NDPROXY passa a estrutura de CO_AF_TAPI_INCOMING_CALL_PARAMETERS encapsulada que contém os parâmetros de chamada de entrada. O NDIS, por sua vez, chama a função ProtocolClIncomingCall do NDISWAN, na qual o NDISWAN aceita ou rejeita a conexão solicitada.
Depois de decidir se deseja aceitar a conexão e depois de possivelmente alterar os parâmetros de chamada, o NDISWAN chama a função NdisClIncomingCallComplete . O NDIS, por sua vez, chama a função ProtocolCmIncomingCallComplete do driver de miniport. Dependendo se o NDISWAN aceitou a chamada de entrada e se o driver de miniporto aceita ou rejeita as alterações propostas pelo NDISWAN nos parâmetros de chamada, o driver de miniporto chama as funções NdisCmDispatchCallConnected ou NdisCmDispatchIncomingCloseCall . NdisCmDispatchCallConnected notifica o NDISWAN de que as transferências de dados podem começar na VC que o driver de miniporto criou para a chamada de entrada. NdisCmDispatchIncomingCloseCall informa NDISWAN e NDPROXY para derrubar a chamada de entrada.
Depois que NDISWAN aceita a chamada de entrada, NDPROXY chama a função NdisCoGetTapiCallId para recuperar uma cadeia de caracteres que identifica o contexto do NDISWAN para a VC. NDPROXY passa essa cadeia de caracteres de volta para o aplicativo TAPI. O aplicativo TAPI usa essa cadeia de caracteres de contexto VC para concluir sua chamada para lineGetID.