Indication d’un appel entrant
Un gestionnaire d’appels ou un pilote MCM est averti d’un appel entrant en signalant les messages du réseau. À partir de ces messages de signalisation, le gestionnaire d’appels ou le pilote MCM extrait les paramètres d’appel de l’appel, y compris le SAP auquel l’appel entrant est adressé.
La figure suivante montre un pilote MCM indiquant un appel entrant.
L’illustration suivante montre un gestionnaire d’appels indiquant un appel entrant.
Si les paramètres d’appel entrant sont inacceptables pour le gestionnaire d’appels ou le pilote MCM, il peut tenter de négocier une modification de ces paramètres avec la partie distante si cette négociation est autorisée par le protocole de signalisation. Le client vers lequel l’appel entrant est dirigé peut également tenter de négocier les paramètres d’appel après avoir reçu l’indication d’appel du gestionnaire d’appels ou du pilote MCM (voir Demande lancée par le client pour modifier les paramètres d’appel). Si le gestionnaire d’appels ou le pilote MCM ne peut pas négocier des paramètres d’appel acceptables pour l’appel avec la partie distante, il peut refuser l’appel. Le protocole de signalisation détermine ce qui est possible dans de tels cas.
Avant d’indiquer un appel entrant à un client, le gestionnaire d’appels ou le pilote MCM doit identifier le SAP vers lequel l’appel est dirigé. Le SAP doit avoir été précédemment inscrit par un client. Le gestionnaire d’appels ou le pilote MCM doit également lancer la création d’un vc et lancer l’activation de ce vc.
Le gestionnaire d’appels ou le pilote MCM indique ensuite l’appel entrant au client qui a inscrit le SAP vers lequel l’appel entrant est dirigé. Un gestionnaire d’appels indique un appel entrant avec NdisCmDispatchIncomingCall. Un pilote MCM indique un appel entrant avec NdisMCmDispatchIncomingCall.
Dans l’appel à Ndis(M)CmDispatchIncomingCall, le gestionnaire d’appels ou le pilote MCM passe ce qui suit :
NdisSapHandle qui identifie le SAP auquel l’appel entrant est adressé.
NdisVcHandle qui identifie le circuit virtuel pour l’appel entrant.
Pointeur vers une structure de type CO_CALL_PARAMETERS, qui contient les paramètres d’appel de l’appel.
L’appel à Ndis(M)CmDispatchIncomingCall amène NDIS à appeler la fonction ProtocolClIncomingCall du client, au sein de laquelle le client accepte ou rejette la connexion demandée. ProtocolClIncomingCall doit valider les paramètres SAP, VC et d’appel.
ProtocolClIncomingCall peut se terminer de manière synchrone ou retourner NDIS_STATUS_PENDING et se terminer de manière asynchrone avec NdisClIncomingCallComplete. Un appel à NdisClIncomingCallComplete amène NDIS à appeler la fonction ProtocolCmIncomingCallComplete du gestionnaire d’appels ou du pilote MCM.
Le code NDIS_STATUS qui est retourné par un achèvement synchrone de ProtocolClIncomingCall ou fourni à NdisClIncomingCallComplete indique l’acceptation ou le rejet de l’appel entrant par le client. Le client retourne également les paramètres d’appel de l’appel dans une structure CO_CALL_PARAMETERS mise en mémoire tampon. Si le client trouve les paramètres d’appel inacceptables, il peut, s’il est autorisé par le protocole de signalisation, demander une modification des paramètres d’appel en définissant le membre Indicateurs dans la structure CO_CALL_PARAMETERS avec CALL_PARAMETERS_CHANGED et en fournissant les paramètres d’appel révisés dans une structure CO_CALL_PARAMETERS mise en mémoire tampon.
Si le client accepte l’appel entrant, le gestionnaire d’appels ou le pilote MCM doit envoyer des messages de signalisation pour indiquer à l’entité appelante que l’appel a été accepté. Sinon, le gestionnaire d’appels ou le pilote MCM doit envoyer des messages de signalisation pour indiquer que l’appel a été rejeté. Si le client demande une modification des paramètres d’appel, le gestionnaire d’appels ou le pilote MCM envoie des messages de signalisation pour demander une modification des paramètres d’appel.
Si le client a accepté l’appel, ou si la modification demandée des paramètres d’appel du client a été acceptée par la partie distante, un gestionnaire d’appels appelle NdisCmDispatchCallConnected, et un pilote MCM appelle NdisMCmDispatchCallConnected. L’appel à Ndis(M)CmDispatchCallConnected amène NDIS à appeler la fonction ProtocolClCallConnected du client.
Si le client a rejeté l’appel et que le gestionnaire d’appels ou le pilote MCM a déjà activé un vc pour l’appel entrant, le gestionnaire d’appels ou le pilote MCM appelle Ndis(M)CmDeactivateVc pour désactiver le vc si le vc est activé. Le gestionnaire d’appels ou le pilote MCM peut ensuite lancer la suppression du vc en appelant NdisCoDeleteVc dans le cas du gestionnaire d’appels ou NdisMCmDeleteVc dans le cas du pilote MCM.
Si le client a accepté l’appel mais que la connexion de bout en bout n’a pas été établie correctement (parce que, par exemple, la partie distante a détruit l’appel), le gestionnaire d’appels ou le pilote MCM n’appelle pas Ndis(M)CmDispatchCallConnected. Au lieu de cela, il appelle Ndis(M)CmDispatchIncomingCloseCall, ce qui amène NDIS à appeler la fonction ProtocolClIncomingCloseCall du client. Le client doit ensuite appeler NdisClCloseCall pour terminer la destruction de l’appel. Le gestionnaire d’appels ou le pilote MCM appelle ensuite Ndis(M)CmDeactivateVC pour désactiver le vc qu’il a créé pour l’appel entrant. Le gestionnaire d’appels ou le pilote MCM peut ensuite lancer la suppression du vc en appelant NdisCoDeleteVc dans le cas du gestionnaire d’appels ou NdisMCmDeleteVc dans le cas du pilote MCM.