4. Elementi di procedura del dispatcher
4.1. Invio di un messaggio SNMP sulla rete
Questa sezione descrive la procedura che il dispatcher segue quando un'applicazione desidera inviare una PDU SNMP a un'altra entità SNMP.
4.1.1. Invio di una richiesta o notifica
Quando un'applicazione desidera inviare una richiesta o notifica SNMP sulla rete, viene applicata la seguente procedura.
Procedura:
- L'applicazione chiama il dispatcher utilizzando la primitiva di interfaccia di servizio astratta sendPdu, richiedendo al dispatcher di inviare una PDU SNMP:
statusInformation = sendPdu(
IN transportDomain, -- dominio di trasporto da utilizzare
IN transportAddress, -- indirizzo di rete di destinazione
IN messageProcessingModel, -- tipicamente versione SNMP
IN securityModel, -- modello di sicurezza da utilizzare
IN securityName, -- per conto di questo principale
IN securityLevel, -- livello di sicurezza richiesto
IN contextEngineID, -- dati da questa entità SNMP
IN contextName, -- dati da questo contesto
IN pduVersion, -- versione della PDU
IN PDU, -- unità dati di protocollo SNMP
IN expectResponse, -- TRUE o FALSE
IN sendPduHandle -- handle per corrispondere risposta ricevuta
)
-
Se il valore di messageProcessingModel non rappresenta un modello di elaborazione messaggi noto al dispatcher, viene restituita una errorIndication (unsupportedMsgProcessingModel) all'applicazione chiamante. L'elaborazione di questo messaggio viene interrotta.
-
Il dispatcher richiede al modello di elaborazione messaggi appropriato di preparare un messaggio secondo la sua specifica di formato messaggio:
statusInformation = prepareOutgoingMessage(
IN transportDomain, -- come specificato dall'applicazione
IN transportAddress, -- come specificato dall'applicazione
IN messageProcessingModel, -- come specificato dall'applicazione
IN securityModel, -- come specificato dall'applicazione
IN securityName, -- come specificato dall'applicazione
IN securityLevel, -- come specificato dall'applicazione
IN contextEngineID, -- come specificato dall'applicazione
IN contextName, -- come specificato dall'applicazione
IN pduVersion, -- come specificato dall'applicazione
IN PDU, -- come specificato dall'applicazione
IN expectResponse, -- come specificato dall'applicazione
IN sendPduHandle, -- come determinato dall'applicazione
OUT destTransportDomain, -- dominio di trasporto destinazione
OUT destTransportAddress, -- indirizzo di trasporto destinazione
OUT outgoingMessage, -- messaggio da inviare
OUT outgoingMessageLength -- sua lunghezza
)
-
Se il parametro statusInformation in statusInformation non ha successo, il dispatcher restituisce statusInformation all'applicazione chiamante. L'elaborazione del messaggio viene interrotta.
-
Se statusInformation ha successo, il dispatcher invia il messaggio preparato sulla rete tramite il trasporto specificato da transportDomain e transportAddress.
-
Il dispatcher restituisce successo all'applicazione chiamante.
4.1.2. Invio di una risposta sulla rete
Quando un'applicazione desidera inviare una risposta sulla rete, viene applicata la seguente procedura.
Procedura:
- L'applicazione chiama il dispatcher utilizzando l'interfaccia di servizio astratta returnResponsePdu, richiedendo al dispatcher di inviare una PDU SNMP:
result = returnResponsePdu(
IN messageProcessingModel, -- tipicamente versione SNMP
IN securityModel, -- modello di sicurezza in uso
IN securityName, -- per conto di questo principale
IN securityLevel, -- come per richiesta ricevuta
IN contextEngineID, -- dati da questa entità SNMP
IN contextName, -- dati da questo contesto
IN pduVersion, -- versione della PDU
IN PDU, -- unità dati di protocollo SNMP
IN maxSizeResponseScopedPDU, -- dimensione massima PDU risposta
IN stateReference, -- riferimento a informazioni di stato
IN statusInformation -- successo o errorIndication
)
Nota: Gli elementi dati astratti securityModel, securityName, securityLevel, contextEngineID, contextName e stateReference devono avere gli stessi valori determinati originariamente quando la richiesta è stata ricevuta e passata all'applicazione. Questi valori possono essere recuperati dalla cache utilizzando stateReference come chiave.
-
Se il valore di messageProcessingModel non rappresenta un modello di elaborazione messaggi noto al dispatcher, viene restituita una errorIndication (unsupportedMsgProcessingModel) all'applicazione chiamante. L'elaborazione di questo messaggio viene interrotta.
-
Il dispatcher richiede al modello di elaborazione messaggi appropriato di preparare un messaggio di risposta secondo la sua specifica di formato messaggio:
result = prepareResponseMessage(
IN messageProcessingModel, -- come fornito dall'applicazione
IN securityModel, -- come fornito dall'applicazione
IN securityName, -- come fornito dall'applicazione
IN securityLevel, -- come fornito dall'applicazione
IN contextEngineID, -- come fornito dall'applicazione
IN contextName, -- come fornito dall'applicazione
IN pduVersion, -- come fornito dall'applicazione
IN PDU, -- come fornito dall'applicazione
IN maxSizeResponseScopedPDU, -- come fornito dall'applicazione
IN stateReference, -- come fornito dall'applicazione
IN statusInformation, -- come fornito dall'applicazione
OUT destTransportDomain, -- dominio di trasporto destinazione
OUT destTransportAddress, -- indirizzo di trasporto destinazione
OUT outgoingMessage, -- messaggio da inviare
OUT outgoingMessageLength -- sua lunghezza
)
-
Se il parametro result in result non ha successo, il dispatcher restituisce una errorIndication all'applicazione chiamante. L'elaborazione del messaggio viene interrotta.
-
Se result ha successo, il dispatcher invia il messaggio preparato sulla rete tramite il trasporto specificato da destTransportDomain e destTransportAddress.
-
Il dispatcher restituisce successo all'applicazione chiamante.
4.2. Ricezione di un messaggio SNMP dalla rete
Questa sezione descrive la procedura che il dispatcher segue quando riceve un messaggio SNMP dalla rete.
4.2.1. Dispatch messaggio di un messaggio SNMP ricevuto
Quando il dispatcher riceve un messaggio SNMP dalla rete, viene applicata la seguente procedura:
-
Il dispatcher riceve un messaggio dalla rete.
-
Il dispatcher determina la versione del messaggio SNMP. Se il pacchetto non può essere analizzato sufficientemente per determinare la versione, il contatore snmpInASNParseErrs [RFC3418] viene incrementato e il messaggio viene scartato senza ulteriore elaborazione. L'elaborazione di questo messaggio viene interrotta.
-
Il dispatcher determina il modello di elaborazione messaggi appropriato in base alla versione del messaggio SNMP.
-
Se la versione del messaggio SNMP non è nota al dispatcher, il contatore snmpInBadVersions [RFC3418] viene incrementato e il messaggio viene scartato senza ulteriore elaborazione. L'elaborazione di questo messaggio viene interrotta.
4.2.2. Dispatch PDU di un messaggio ricevuto
Dopo che il dispatch messaggio ha determinato un modello di elaborazione messaggi, utilizza la seguente interfaccia di servizio astratta per richiedere al modello di elaborazione messaggi di estrarre PDU e dati dal messaggio:
result = prepareDataElements(
IN transportDomain, -- dominio di trasporto sorgente
IN transportAddress, -- indirizzo di trasporto sorgente
IN wholeMsg, -- come ricevuto dalla rete
IN wholeMsgLength, -- come ricevuto dalla rete
OUT messageProcessingModel, -- tipicamente versione SNMP
OUT securityModel, -- modello di sicurezza in uso
OUT securityName, -- per conto di questo principale
OUT securityLevel, -- livello di sicurezza richiesto
OUT contextEngineID, -- dati da questa entità SNMP
OUT contextName, -- dati da questo contesto
OUT pduVersion, -- versione della PDU
OUT PDU, -- unità dati di protocollo SNMP
OUT pduType, -- tipo PDU SNMP
OUT sendPduHandle, -- handle della richiesta corrispondente
OUT maxSizeResponseScopedPDU, -- dimensione massima PDU risposta
OUT statusInformation, -- successo o errorIndication
OUT stateReference -- riferimento a informazioni di stato
)
Se result errorIndication è impostato su un valore diverso da noError, il messaggio viene scartato senza ulteriore elaborazione. L'elaborazione di questo messaggio viene interrotta.
4.2.2.1. Richieste e notifiche ricevute
Se il valore di pduType indica che il messaggio contiene una richiesta o notifica, viene seguita la seguente procedura per il dispatch PDU:
-
In base a pduType, contextEngineID e contextName, viene selezionata un'applicazione appropriata.
a) Se non è registrata alcuna applicazione per la combinazione di pduType, contextEngineID e contextName, e nessuna applicazione è registrata per pduType e contextEngineID con contextName vuoto:
- Se pduType è confermato, viene inviata una PDU di report al mittente del messaggio. Il dispatcher chiama il modello di elaborazione messaggi appropriato per generare un report di errore utilizzando la primitiva di interfaccia di servizio astratta reportPDU:
result = reportPDU(
IN messageProcessingModel, -- tipicamente versione SNMP
IN securityModel, -- modello di sicurezza in uso
IN securityName, -- per conto di questo principale
IN securityLevel, -- come per richiesta ricevuta
IN contextEngineID, -- dati da questa entità SNMP
IN contextName, -- dati da questo contesto
IN pduVersion, -- versione della PDU
IN PDU, -- unità dati di protocollo SNMP
IN maxSizeResponseScopedPDU, -- dimensione massima PDU risposta
IN stateReference, -- riferimento a informazioni di stato
IN statusInformation -- indicazione errore
)
- Il messaggio viene scartato. L'elaborazione di questo messaggio viene interrotta.
b) Se pduType non è confermato, il messaggio viene scartato. L'elaborazione di questo messaggio viene interrotta.
- La PDU viene inviata all'applicazione utilizzando l'interfaccia di servizio astratta processPdu:
processPdu(
IN messageProcessingModel, -- tipicamente versione SNMP
IN securityModel, -- modello di sicurezza in uso
IN securityName, -- per conto di questo principale
IN securityLevel, -- livello di sicurezza
IN contextEngineID, -- dati da questa entità SNMP
IN contextName, -- dati da questo contesto
IN pduVersion, -- versione della PDU
IN PDU, -- unità dati di protocollo SNMP
IN maxSizeResponseScopedPDU, -- dimensione massima PDU risposta
IN stateReference -- riferimento a informazioni di stato
)
4.2.2.2. Risposte ricevute
Se pduType indica una risposta, un report o un altro tipo di PDU di classe 2, viene seguita la seguente procedura per il dispatch PDU:
-
Il valore in sendPduHandle viene utilizzato per determinare a quale applicazione deve essere inviata la PDU.
-
Se non viene trovata alcuna registrazione applicazione, il contatore snmpUnknownPDUHandlers [RFC3418] viene incrementato e il messaggio viene scartato. L'elaborazione di questo messaggio viene interrotta.
-
Altrimenti, il messaggio viene inviato all'applicazione utilizzando l'interfaccia di servizio astratta processResponsePdu:
processResponsePdu(
IN messageProcessingModel, -- tipicamente versione SNMP
IN securityModel, -- modello di sicurezza in uso
IN securityName, -- per conto di questo principale
IN securityLevel, -- livello di sicurezza
IN contextEngineID, -- dati da questa entità SNMP
IN contextName, -- dati da questo contesto
IN pduVersion, -- versione della PDU
IN PDU, -- unità dati di protocollo SNMP
IN statusInformation, -- successo o errorIndication
IN sendPduHandle -- handle della richiesta corrispondente
)
4.3. Registrazione applicazione per elaborazione tipi PDU
Un'applicazione che desidera elaborare PDU particolari deve registrarsi presso il dispatcher PDU. L'applicazione specifica la combinazione di pduType, contextEngineID e contextName di cui desidera essere responsabile.
Viene seguita la seguente procedura per la registrazione applicazione:
- L'applicazione chiama il dispatcher PDU utilizzando la primitiva di interfaccia di servizio astratta registerContextEngineID:
statusInformation = registerContextEngineID(
IN contextEngineID, -- assumere responsabilità per questo
IN pduType -- pduType da registrare
)
-
Se un'altra applicazione è già registrata per la combinazione specificata di contextEngineID e pduType, viene restituita una errorIndication (duplicateRegistration) all'applicazione chiamante. L'elaborazione della registrazione viene interrotta.
-
Altrimenti, la registrazione viene memorizzata dal dispatcher PDU e viene restituito successo.
4.4. Deregistrazione applicazione per elaborazione tipi PDU
Un'applicazione che non desidera più elaborare determinati tipi di PDU deve deregistrarsi dal dispatcher PDU. L'applicazione deve specificare la combinazione di contextEngineID e pduType di cui non desidera più essere responsabile.
Viene seguita la seguente procedura per la deregistrazione applicazione:
- L'applicazione chiama il dispatcher PDU utilizzando la primitiva di interfaccia di servizio astratta unregisterContextEngineID:
unregisterContextEngineID(
IN contextEngineID, -- rinunciare alla responsabilità di questo
IN pduType -- pduType da deregistrare
)
-
Se viene trovata una registrazione applicazione, viene rimossa.
-
Se non viene trovata tale registrazione, la richiesta viene ignorata.