Aceptar llamadas entrantes
Para que una aplicación pueda aceptar una llamada entrante, primero debe tener una línea abierta. Se abre una línea como resultado de una aplicación que llama a la función lineOpen de TAPI. Esta llamada de función TAPI hace que los controladores subyacentes encapsulan los parámetros TAPI en estructuras NDIS para prepararse para recibir una llamada entrante. Una vez que el controlador de miniporte CoNDIS WAN recibe una llamada entrante, el controlador de miniporte primero debe crear una conexión virtual (VC) con el controlador NDPROXY y, a continuación, notificar a NDPROXY la llamada entrante. NDPROXY, a su vez, notifica a la aplicación a través de TAPI. En la lista siguiente se describe cómo se configura, conecta y realiza la llamada entrante:
NDPROXY especifica los parámetros TAPI para una conexión entrante en una estructura de CO_AF_TAPI_SAP . NDPROXY rellena los miembros de esta estructura con la siguiente información que se pasó en la función lineOpen de TAPI:
- Identificador de línea abierta en el miembro ulLineID
- Dirección de la conexión entrante en el miembro ulAddressID
- Modo multimedia del flujo de información de la conexión entrante en el miembro ulMediaModes
NDPROXY superpone la estructura de CO_AF_TAPI_SAP en el miembro Sap de una estructura de CO_SAP y establece el miembro SapLength de CO_SAP en el tamaño de CO_AF_TAPI_SAP. NDPROXY también debe establecer el miembro SapType de CO_SAP en AF_TAPI_SAP_TYPE.
Una vez que NDPROXY encapsula los parámetros TAPI, NDPROXY llama a la función NdisClRegisterSap para que esté listo para recibir llamadas entrantes. En esta llamada de función, NDPROXY pasa un puntero a la estructura de CO_SAP rellenada que especifica el punto de acceso de servicio (SAP) en el que NDPROXY puede recibir llamadas entrantes. NDIS reenvía la estructura de CO_SAP a la función ProtocolCmRegisterSap del controlador de miniporte (MCM) coNDIS WAN. ProtocolCmRegisterSap se comunica con dispositivos de control de red u otros agentes específicos de medios, según sea necesario, para registrar SAP en la red para NDPROXY. Después de que el controlador de miniporte haya registrado SAP, puede aceptar una oferta de llamada entrante dirigida a ese SAP.
Un controlador de miniporte de CoNDIS WAN se alerta a una llamada entrante mediante la señalización de mensajes de la red. A partir de estos mensajes de señalización, el controlador de minipuerto extrae los parámetros de llamada de la llamada, incluido el SAP al que se dirige la llamada entrante.
Antes de indicar una llamada entrante a NDPROXY, el controlador de miniporta llama a la función NdisMCmCreateVc para iniciar la creación de un VC con NDPROXY. NDPROXY asigna e inicializa los recursos necesarios para el VC y almacena el identificador en el VC.
El controlador de miniporte CoNDIS WAN establece los parámetros TAPI para una llamada entrante en una estructura CO_AF_TAPI_INCOMING_CALL_PARAMETERS . El controlador de minipuerto rellena los miembros de esta estructura con la siguiente información que se extrajo de los mensajes de señalización:
- Identificador de línea en el miembro ulLineID
- Dirección de la llamada entrante en el miembro ulAddressID
- CO_TAPI_FLAG_INCOMING_CALL bit en el miembro ulFlags . Todos los demás bits de ulFlags están reservados y deben establecerse en 0.
- Estructura LINECALLPARAMS en el miembro LineCallInfo . Los miembros de LINECALLPARAMS especifican parámetros de llamada TAPI para una llamada entrante.
El controlador de minipuerto superpone CO_AF_TAPI_INCOMING_CALL_PARAMETERS en el miembro Parameters de una estructura de CO_SPECIFIC_PARAMETERS y establece el miembro Length de CO_SPECIFIC_PARAMETERS en el tamaño de CO_AF_TAPI_INCOMING_CALL_PARAMETERS.
El controlador de minipuerto establece la estructura CO_SPECIFIC_PARAMETERS en el miembro MediaSpecific de una estructura de CO_MEDIA_PARAMETERS .
El controlador de minipuerto establece un puntero a la estructura CO_MEDIA_PARAMETERS en el miembro MediaParameters de una estructura CO_CALL_PARAMETERS .
El controlador de minipuerto también debe establecer el miembro CallMgrParameters de la estructura CO_CALL_PARAMETERS para especificar la calidad de servicio (QoS) de transferir paquetes, como el ancho de banda. Para establecer este miembro CallMgrParameters , el controlador de minipuerto rellena los miembros de una estructura de CO_CALL_MANAGER_PARAMETERS y apunta esta estructura a CallMgrParameters. Por ejemplo, para identificar las velocidades de transmisión y recepción en bytes por segundo para la vc, el controlador de minipuerto debe establecer los miembros PeakBandwidth de los miembros Transmit y Receive de CO_CALL_MANAGER_PARAMETERS. Los miembros Transmit y Receive son estructuras FLOWSPEC. Para obtener más información sobre la estructura FLOWSPEC, consulte la Microsoft Windows SDK.
Después de que el controlador de miniporte encapsula los parámetros TAPI y rellene el miembro CallMgrParameters de CO_CALL_MANAGER_PARAMETERS, llama a la función NdisMCmDispatchIncomingCall para indicar la llamada entrante a NDPROXY. En esta llamada, el controlador de minipuerto pasa lo siguiente:
- Identificador que identifica el SAP al que se dirige la llamada entrante.
- Identificador que identifica la credencial verificable de la llamada entrante.
- Puntero a la estructura de CO_CALL_PARAMETERS rellenada
NDPROXY devuelve NDIS_STATUS_PENDING al controlador de minipuerto para que NDPROXY pueda completar NdisMCmDispatchIncomingCall de forma asincrónica.
Después de que la aplicación TAPI responda a la llamada entrante con la función lineAnswer , NDPROXY llama a la función NdisClIncomingCallComplete . A su vez, NDIS llama a la función ProtocolCmIncomingCallComplete del controlador de miniporte. Si NDPROXY devuelve un código de NDIS_STATUS_SUCCESS, indica la aceptación de los parámetros de llamada. Si NDPROXY encuentra los parámetros de llamada inaceptables, puede solicitar un cambio en los parámetros de llamada estableciendo el miembro Flags en la estructura de CO_CALL_PARAMETERS en CALL_PARAMETERS_CHANGED y proporcionando parámetros de llamada revisados. Si NDPROXY acepta la llamada entrante, el controlador de minipuerto debe enviar mensajes de señalización para indicar a la entidad de llamada que se ha aceptado la llamada. De lo contrario, el controlador de minipuerto debe enviar mensajes de señalización para indicar que se ha rechazado la llamada. Si NDPROXY solicita un cambio en los parámetros de llamada, el controlador de miniporte envía mensajes de señalización para solicitar un cambio en los parámetros de llamada.
El controlador de minipuerto activa el VC que el controlador de miniporte creado con NDPROXY y también debe llamar a la función NdisMCmActivateVc para notificar a NDPROXY que el controlador de miniporte está listo para transferir paquetes en el VC.
Si NDPROXY rechaza la llamada, el controlador de minipuerto llama a la función NdisMCmDeactivateVc para desactivar el VC que creó el controlador de miniporte para la llamada entrante. Una vez desactivada la credencial verificable, el controlador de minipuerto llama a la función NdisMCmDeleteVc para eliminar la credencial verificable.
Dependiendo de si NDPROXY aceptó la llamada entrante y si la conexión de un extremo a otro se estableció correctamente, el controlador de miniporta llama a las funciones NdisMCmDispatchCallConnected o NdisMCmDispatchIncomingCloseCall . Tenga en cuenta que si la entidad de llamada remota reenvía la llamada, envía mensajes de señalización para indicar que la conexión de un extremo a otro no se estableció correctamente. NdisMCmDispatchCallConnected notifica a NDPROXY que las transferencias de datos pueden comenzar en el VC que el controlador de miniporte creó y activó para la llamada entrante. NdisMCmDispatchIncomingCloseCall informa a NDPROXY para anular la llamada entrante.
Si se dirige a NDPROXY para anular la llamada entrante, llama a la función NdisClCloseCall para confirmar que no intentará enviar ni esperar recibir datos en el VC. A su vez, NDIS llama a la función ProtocolCmCloseCall del controlador de miniporte. A continuación, el controlador de minipuerto llama a la función NdisMCmDeactivateVc para desactivar la credencial verificable. Una vez desactivada la credencial verificable, el controlador de minipuerto llama a la función NdisMCmDeleteVc para eliminar la credencial verificable.
Una vez que la aplicación TAPI acepta la llamada entrante y NDPROXY notifica a la aplicación que la llamada está conectada, la aplicación llama a la función lineGetID tapi para informar a NDPROXY para localizar el cliente de CoNDIS adecuado. En esta llamada lineGetID , la aplicación TAPI proporciona una cadena para una clase de dispositivo TAPI determinada a la que la aplicación requiere un identificador. NDPROXY usa esta cadena para localizar el cliente De CoNDIS que registró previamente una SAP para la clase de dispositivo TAPI determinada. Si el cliente de CoNDIS es NDISWAN, la cadena es NDIS. Si NDPROXY busca una SAP con una cadena que coincida con la cadena pasada por la aplicación TAPI, NDPROXY llama a NdisMCmCreateVc para configurar un punto de conexión con NDISWAN en el que puede enviar la notificación de la llamada entrante. A su vez, NDIS llama a la función ProtocolCoCreateVc de NDISWAN y pasa un identificador que representa la credencial verificable.
Una vez que NDPROXY configura el punto de conexión con NDISWAN, llama a la función NdisCmDispatchIncomingCall para notificar a NDISWAN la llamada entrante. En esta llamada, NDPROXY pasa la estructura CO_AF_TAPI_INCOMING_CALL_PARAMETERS encapsulada que contiene los parámetros de llamada entrantes. A su vez, NDIS llama a la función ProtocolClIncomingCall de NDISWAN, dentro de la cual NDISWAN acepta o rechaza la conexión solicitada.
Después de decidir si aceptar la conexión y después de cambiar posiblemente los parámetros de llamada, NDISWAN llama a la función NdisClIncomingCallComplete . A su vez, NDIS llama a la función ProtocolCmIncomingCallComplete del controlador de miniporte. Dependiendo de si NDISWAN aceptó la llamada entrante y si el controlador de miniporte acepta o rechaza los cambios propuestos de NDISWAN en los parámetros de llamada, el controlador de miniporta llama a las funciones NdisCmDispatchCallConnected o NdisCmDispatchIncomingCloseCall . NdisCmDispatchCallConnected notifica a NDISWAN que las transferencias de datos pueden comenzar en el VC que el controlador de miniporte creó para la llamada entrante. NdisCmDispatchIncomingCloseCall informa a NDISWAN y NDPROXY para anular la llamada entrante.
Una vez que NDISWAN acepta la llamada entrante, NDPROXY llama a la función NdisCoGetTapiCallId para recuperar una cadena que identifica el contexto de NDISWAN para el VC. NDPROXY vuelve a pasar esta cadena a la aplicación TAPI. La aplicación TAPI usa esta cadena de contexto VC para completar su llamada a lineGetID.