Accettazione di chiamate in ingresso
Prima che un'applicazione possa accettare una chiamata in ingresso, deve prima avere una riga aperta. Una riga viene aperta come risultato di un'applicazione che chiama la funzione lineOpen TAPI. Questa chiamata alla funzione TAPI causa l'incapsulamento dei parametri TAPI nelle strutture NDIS per preparare la ricezione di una chiamata in ingresso. Dopo la ricezione di una chiamata in ingresso del driver WAN CoNDIS, il driver miniport deve prima creare una connessione virtuale con il driver NDPROXY e quindi inviare una notifica a NDPROXY della chiamata in ingresso. NDPROXY a sua volta notifica all'applicazione tramite TAPI. L'elenco seguente descrive come viene configurata, connessa e eseguita la chiamata in ingresso:
NDPROXY specifica i parametri TAPI per una connessione in ingresso in una struttura CO_AF_TAPI_SAP . NDPROXY riempie i membri di questa struttura con le informazioni seguenti passate nella funzione lineOpen TAPI:
- Identificatore della riga aperta nel membro ulLineID
- Indirizzo della connessione in ingresso nel membro ulAddressID
- Modalità multimediale del flusso informativo della connessione in ingresso nel membro ulMediaModes
NDPROXY sovrappone la struttura CO_AF_TAPI_SAP nel membro Sap di una struttura CO_SAP e imposta il membro SapLength di CO_SAP alle dimensioni di CO_AF_TAPI_SAP. NDPROXY deve anche impostare il membro SapType di CO_SAP su AF_TAPI_SAP_TYPE.
Una volta che NDPROXY incapsula i parametri TAPI, NDPROXY chiama la funzione NdisClRegisterSap per prepararsi a ricevere chiamate in ingresso. In questa chiamata di funzione NDPROXY passa un puntatore alla struttura di CO_SAP compilata che specifica il punto di accesso al servizio (SAP) in cui NDPROXY può ricevere chiamate in ingresso. NDIS inoltra la struttura CO_SAP alla funzione ProtocolCmRegisterSap del driver miniport della rete WAN CoNDIS (MCM). ProtocolCmRegisterSap comunica con dispositivi di controllo di rete o altri agenti specifici del supporto, in base alle esigenze, per registrare SAP nella rete per NDPROXY. Dopo aver registrato il driver miniport, sap può accettare un'offerta di chiamata in ingresso indirizzata a tale SAP.
Un driver miniport wan CoNDIS viene avvisato di una chiamata in ingresso segnalando messaggi dalla rete. Da questi messaggi di segnalazione, il driver miniport estrae i parametri di chiamata per la chiamata, incluso sap a cui viene indirizzato la chiamata in ingresso.
Prima di indicare una chiamata in ingresso a NDPROXY, il driver miniport chiama la funzione NdisMCmCreateVc per avviare la creazione di un vc con NDPROXY. NDPROXY alloca e inizializza le risorse necessarie per vc e archivia l'handle nel VC.
Il driver miniport WAN CoNDIS imposta i parametri TAPI per una chiamata in ingresso in una struttura CO_AF_TAPI_INCOMING_CALL_PARAMETERS . Il driver miniport riempie i membri di questa struttura con le informazioni seguenti estratte dai messaggi di segnalazione:
- Identificatore della riga nel membro ulLineID
- Indirizzo della chiamata in ingresso nel membro ulAddressID
- CO_TAPI_FLAG_INCOMING_CALL bit nel membro ulFlags . Tutti gli altri bit di ulFlag sono riservati e devono essere impostati su 0.
- Struttura LINECALLPARAMS nel membro LineCallInfo . I membri di LINECALLPARAMS specificano i parametri di chiamata TAPI per una chiamata in ingresso.
Il driver miniport sovrappone CO_AF_TAPI_INCOMING_CALL_PARAMETERS nel membro Parameters di una struttura CO_SPECIFIC_PARAMETERS e imposta il membro Length di CO_SPECIFIC_PARAMETERS alle dimensioni di CO_AF_TAPI_INCOMING_CALL_PARAMETERS.
Il driver miniport imposta la struttura CO_SPECIFIC_PARAMETERS sul membro MediaSpecific di una struttura CO_MEDIA_PARAMETERS .
Il driver miniport imposta un puntatore alla struttura CO_MEDIA_PARAMETERS al membro MediaParameters di una struttura CO_CALL_PARAMETERS .
Il driver miniport deve anche impostare il membro CallMgrParameters della struttura CO_CALL_PARAMETERS per specificare la qualità del servizio (QoS) di trasferimento di pacchetti, ad esempio la larghezza di banda. Per impostare questo membro CallMgrParameters , il driver miniport riempie i membri di una struttura CO_CALL_MANAGER_PARAMETERS e punta questa struttura a CallMgrParameters. Ad esempio, per identificare la trasmissione e ricevere velocità in byte al secondo per VC, il driver miniport deve impostare i membri PeakBandwidth dei membri di trasmissione e ricezione di CO_CALL_MANAGER_PARAMETERS. I membri Di trasmissione e ricezione sono strutture FLOWPEC. Per altre informazioni sulla struttura FLOWPEC, vedere la Microsoft Windows SDK.
Dopo che il driver miniport incapsula i parametri TAPI e riempie il membro CallMgrParameters di CO_CALL_MANAGER_PARAMETERS, chiama la funzione NdisMCmDispatchIncomingCall per indicare la chiamata in ingresso a NDPROXY. In questa chiamata, il driver miniport passa quanto segue:
- Handle che identifica sap a cui viene indirizzata la chiamata in ingresso
- Handle che identifica il VC per la chiamata in ingresso
- Puntatore alla struttura di CO_CALL_PARAMETERS riempita
NDPROXY restituisce NDIS_STATUS_PENDING al driver miniport in modo che NDPROXY possa completare NdisMCmDispatchIncomingCall in modo asincrono.
Dopo che l'applicazione TAPI risponde alla chiamata in ingresso con la funzione lineAnswer , NDPROXY chiama la funzione NdisClIncomingCallComplete . NDIS a sua volta chiama la funzione ProtocolCmIncomingCallComplete del driver miniport. Se NDPROXY restituisce un codice NDIS_STATUS_SUCCESS, indica l'accettazione dei parametri di chiamata. Se NDPROXY rileva i parametri di chiamata non accettabili, può richiedere una modifica nei parametri di chiamata impostando il membro Flags nella struttura CO_CALL_PARAMETERS su CALL_PARAMETERS_CHANGED e fornendo parametri di chiamata modificati. Se NDPROXY accetta la chiamata in ingresso, il driver miniport deve inviare messaggi di segnalazione per indicare all'entità chiamante che la chiamata è stata accettata. In caso contrario, il driver miniport deve inviare messaggi di segnalazione per indicare che la chiamata è stata rifiutata. Se NDPROXY richiede una modifica nei parametri di chiamata, il driver miniport invia messaggi di segnalazione per richiedere una modifica nei parametri di chiamata.
Il driver miniport attiva il vc che il driver miniport creato con NDPROXY e deve chiamare anche la funzione NdisMCmActivateVc per notificare a NDPROXY che il driver miniport è pronto per trasferire pacchetti nel VC.
Se NDPROXY rifiuta la chiamata, il driver miniport chiama la funzione NdisMCmDeactivateVc per disattivare il VC creato dal driver miniport per la chiamata in ingresso. Dopo aver disattivato il vco, il driver miniport chiama la funzione NdisMCmDeleteVc per eliminare il VC.
A seconda che NDPROXY abbia accettato la chiamata in ingresso e se la connessione end-to-end sia stata stabilita correttamente, il driver miniport chiama NdisMCmDispatchCallConnected o NdisMCmDispatchIncomingCloseCall funzioni. Si noti che se l'entità chiamante remota verso il basso la chiamata invia messaggi di segnalazione per indicare che la connessione end-to-end non è stata stabilita correttamente. NdisMCmDispatchCallConnected notifica a NDPROXY che i trasferimenti di dati possono iniziare nel vc che il driver miniport creato e attivato per la chiamata in ingresso. NdisMCmDispatchIncomingCloseCall informa NDPROXY per rimuovere la chiamata in ingresso.
Se NDPROXY viene indirizzato a eliminare la chiamata in ingresso, chiama la funzione NdisClCloseCall per riconoscere che non tenterà di inviare né aspettarsi di ricevere dati nel VC. NDIS a sua volta chiama la funzione ProtocolCmCloseCall del driver miniport. Il driver miniport chiama quindi la funzione NdisMCmDeactivateVc per disattivare il VC. Dopo aver disattivato il vco, il driver miniport chiama la funzione NdisMCmDeleteVc per eliminare il VC.
Dopo che l'applicazione TAPI accetta la chiamata in ingresso e NDPROXY notifica all'applicazione che la chiamata è connessa, l'applicazione chiama la funzione TAPI lineGetID per informare NDPROXY per individuare il client CoNDIS appropriato. In questa chiamata lineGetID l'applicazione TAPI fornisce una stringa per una determinata classe di dispositivo TAPI a cui l'applicazione richiede un handle. NDPROXY usa questa stringa per individuare il client CoNDIS che in precedenza ha registrato un SAP per la determinata classe di dispositivo TAPI. Se il client CoNDIS è NDISWAN, la stringa è NDIS. Se NDPROXY individua un sap con una stringa che corrisponde alla stringa passata dall'applicazione TAPI, NDPROXY chiama NdisMCmCreateVc per configurare un endpoint di connessione con NDISWAN in cui può inviare la notifica della chiamata in ingresso. NDIS a sua volta chiama la funzione ProtocolCoCreateVc di NDISWAN e passa un handle che rappresenta il VC.
Dopo che NDPROXY configura l'endpoint di connessione con NDISWAN, chiama la funzione NdisCmDispatchIncomingCall per notificare a NDISWAN la chiamata in ingresso. In questa chiamata, NDPROXY passa la struttura CO_AF_TAPI_INCOMING_CALL_PARAMETERS incapsulata che contiene i parametri di chiamata in ingresso. NDIS a sua volta chiama la funzione ProtocolClIncomingCall di NDISWAN, all'interno della quale NDISWAN accetta o rifiuta la connessione richiesta.
Dopo aver deciso se accettare la connessione e dopo aver modificato i parametri della chiamata, NDISWAN chiama la funzione NdisClIncomingCallComplete . NDIS a sua volta chiama la funzione ProtocolCmIncomingCallComplete del driver miniport. A seconda che NDISWAN abbia accettato la chiamata in ingresso e se il driver miniport accetta o rifiuta le modifiche proposte di NDISWAN ai parametri di chiamata, il driver miniport chiama NdisCmDispatchCallConnected o NdisCmDispatchIncomingCloseCall funzioni. NdisCmDispatchCallConnected notifica a NDISWAN che i trasferimenti di dati possono iniziare nel VC creato dal driver miniport per la chiamata in ingresso. NdisCmDispatchIncomingCloseCall informa NDISWAN e NDPROXY per ridurre la chiamata in ingresso.
Dopo che NDISWAN accetta la chiamata in ingresso, NDPROXY chiama la funzione NdisCoGetTapiCallId per recuperare una stringa che identifica il contesto di NDISWAN per il VC. NDPROXY passa questa stringa all'applicazione TAPI. L'applicazione TAPI usa questa stringa di contesto VC per completare la chiamata a lineGetID.