Zum Hauptinhalt springen

4. Dispatcher-Verfahrenselemente

4.1. Senden einer SNMP-Nachricht ins Netzwerk

Dieser Abschnitt beschreibt das Verfahren, das der Dispatcher befolgt, wenn eine Anwendung eine SNMP-PDU an eine andere SNMP-Entität senden möchte.

4.1.1. Senden einer Anfrage oder Benachrichtigung

Wenn eine Anwendung eine SNMP-Anfrage oder Benachrichtigung ins Netzwerk senden möchte, wird das folgende Verfahren angewendet.

Verfahren:

  1. Die Anwendung ruft den Dispatcher mit dem abstrakten sendPdu-Service-Interface-Primitiv auf und fordert den Dispatcher auf, eine SNMP-PDU zu senden:
statusInformation = sendPdu(
IN transportDomain, -- zu verwendendes Transportdomäne
IN transportAddress, -- Zielnetzwerkadresse
IN messageProcessingModel, -- typischerweise SNMP-Version
IN securityModel, -- zu verwendendes Sicherheitsmodell
IN securityName, -- im Namen dieses Prinzipals
IN securityLevel, -- gefordertes Sicherheitsniveau
IN contextEngineID, -- Daten von dieser SNMP-Entität
IN contextName, -- Daten aus diesem Kontext
IN pduVersion, -- Version der PDU
IN PDU, -- SNMP-Protokolldateneinheit
IN expectResponse, -- TRUE oder FALSE
IN sendPduHandle -- Handle zur Zuordnung der empfangenen Antwort
)
  1. Wenn der messageProcessingModel-Wert kein dem Dispatcher bekanntes Nachrichtenverarbeitungsmodell darstellt, wird eine errorIndication (unsupportedMsgProcessingModel) an die aufrufende Anwendung zurückgegeben. Die Verarbeitung dieser Nachricht wird gestoppt.

  2. Der Dispatcher fordert das entsprechende Nachrichtenverarbeitungsmodell auf, eine Nachricht gemäß seiner Nachrichtenformatspezifikation vorzubereiten:

statusInformation = prepareOutgoingMessage(
IN transportDomain, -- wie von der Anwendung angegeben
IN transportAddress, -- wie von der Anwendung angegeben
IN messageProcessingModel, -- wie von der Anwendung angegeben
IN securityModel, -- wie von der Anwendung angegeben
IN securityName, -- wie von der Anwendung angegeben
IN securityLevel, -- wie von der Anwendung angegeben
IN contextEngineID, -- wie von der Anwendung angegeben
IN contextName, -- wie von der Anwendung angegeben
IN pduVersion, -- wie von der Anwendung angegeben
IN PDU, -- wie von der Anwendung angegeben
IN expectResponse, -- wie von der Anwendung angegeben
IN sendPduHandle, -- wie von der Anwendung festgelegt
OUT destTransportDomain, -- Ziel-Transportdomäne
OUT destTransportAddress, -- Ziel-Transportadresse
OUT outgoingMessage, -- zu sendende Nachricht
OUT outgoingMessageLength -- deren Länge
)
  1. Wenn der statusInformation-Parameter im statusInformation nicht erfolgreich ist, gibt der Dispatcher statusInformation an die aufrufende Anwendung zurück. Die Nachrichtenverarbeitung wird gestoppt.

  2. Wenn statusInformation erfolgreich ist, sendet der Dispatcher die vorbereitete Nachricht über den durch transportDomain und transportAddress angegebenen Transport ins Netzwerk.

  3. Der Dispatcher gibt Erfolg an die aufrufende Anwendung zurück.

4.1.2. Senden einer Antwort ins Netzwerk

Wenn eine Anwendung eine Antwort ins Netzwerk senden möchte, wird das folgende Verfahren angewendet.

Verfahren:

  1. Die Anwendung ruft den Dispatcher mit dem abstrakten returnResponsePdu-Service-Interface auf und fordert den Dispatcher auf, eine SNMP-PDU zu senden:
result = returnResponsePdu(
IN messageProcessingModel, -- typischerweise SNMP-Version
IN securityModel, -- verwendetes Sicherheitsmodell
IN securityName, -- im Namen dieses Prinzipals
IN securityLevel, -- wie bei empfangener Anfrage
IN contextEngineID, -- Daten von dieser SNMP-Entität
IN contextName, -- Daten aus diesem Kontext
IN pduVersion, -- Version der PDU
IN PDU, -- SNMP-Protokolldateneinheit
IN maxSizeResponseScopedPDU, -- maximale Größe der Antwort-PDU
IN stateReference, -- Referenz auf Zustandsinformationen
IN statusInformation -- Erfolg oder errorIndication
)

Hinweis: Die abstrakten Datenelemente securityModel, securityName, securityLevel, contextEngineID, contextName und stateReference müssen dieselben Werte haben wie ursprünglich festgelegt, als die Anfrage empfangen und an die Anwendung übergeben wurde. Diese Werte können aus dem Cache mit dem stateReference als Schlüssel abgerufen werden.

  1. Wenn der messageProcessingModel-Wert kein dem Dispatcher bekanntes Nachrichtenverarbeitungsmodell darstellt, wird eine errorIndication (unsupportedMsgProcessingModel) an die aufrufende Anwendung zurückgegeben. Die Verarbeitung dieser Nachricht wird gestoppt.

  2. Der Dispatcher fordert das entsprechende Nachrichtenverarbeitungsmodell auf, eine Antwortnachricht gemäß seiner Nachrichtenformatspezifikation vorzubereiten:

result = prepareResponseMessage(
IN messageProcessingModel, -- wie von der Anwendung bereitgestellt
IN securityModel, -- wie von der Anwendung bereitgestellt
IN securityName, -- wie von der Anwendung bereitgestellt
IN securityLevel, -- wie von der Anwendung bereitgestellt
IN contextEngineID, -- wie von der Anwendung bereitgestellt
IN contextName, -- wie von der Anwendung bereitgestellt
IN pduVersion, -- wie von der Anwendung bereitgestellt
IN PDU, -- wie von der Anwendung bereitgestellt
IN maxSizeResponseScopedPDU, -- wie von der Anwendung bereitgestellt
IN stateReference, -- wie von der Anwendung bereitgestellt
IN statusInformation, -- wie von der Anwendung bereitgestellt
OUT destTransportDomain, -- Ziel-Transportdomäne
OUT destTransportAddress, -- Ziel-Transportadresse
OUT outgoingMessage, -- zu sendende Nachricht
OUT outgoingMessageLength -- deren Länge
)
  1. Wenn der result-Parameter im result nicht erfolgreich ist, gibt der Dispatcher eine errorIndication an die aufrufende Anwendung zurück. Die Nachrichtenverarbeitung wird gestoppt.

  2. Wenn result erfolgreich ist, sendet der Dispatcher die vorbereitete Nachricht über den durch destTransportDomain und destTransportAddress angegebenen Transport ins Netzwerk.

  3. Der Dispatcher gibt Erfolg an die aufrufende Anwendung zurück.

4.2. Empfangen einer SNMP-Nachricht aus dem Netzwerk

Dieser Abschnitt beschreibt das Verfahren, das der Dispatcher befolgt, wenn er eine SNMP-Nachricht aus dem Netzwerk empfängt.

4.2.1. Nachrichtendispatch einer empfangenen SNMP-Nachricht

Wenn der Dispatcher eine SNMP-Nachricht aus dem Netzwerk empfängt, wird das folgende Verfahren angewendet:

  1. Der Dispatcher empfängt eine Nachricht aus dem Netzwerk.

  2. Der Dispatcher bestimmt die Version der SNMP-Nachricht. Wenn das Paket nicht ausreichend geparst werden kann, um die Version zu bestimmen, wird der snmpInASNParseErrs-Zähler [RFC3418] erhöht und die Nachricht wird verworfen, ohne weiter verarbeitet zu werden. Die Verarbeitung dieser Nachricht wird gestoppt.

  3. Der Dispatcher bestimmt anhand der SNMP-Nachrichtenversion das entsprechende Nachrichtenverarbeitungsmodell.

  4. Wenn die SNMP-Nachrichtenversion dem Dispatcher nicht bekannt ist, wird der snmpInBadVersions-Zähler [RFC3418] erhöht und die Nachricht wird verworfen, ohne weiter verarbeitet zu werden. Die Verarbeitung dieser Nachricht wird gestoppt.

4.2.2. PDU-Dispatch einer empfangenen Nachricht

Nachdem der Nachrichtendispatch ein Nachrichtenverarbeitungsmodell bestimmt hat, verwendet er das folgende abstrakte Service-Interface, um das Nachrichtenverarbeitungsmodell zu fordern, PDU und Daten aus der Nachricht zu extrahieren:

result = prepareDataElements(
IN transportDomain, -- Quell-Transportdomäne
IN transportAddress, -- Quell-Transportadresse
IN wholeMsg, -- wie aus dem Netzwerk empfangen
IN wholeMsgLength, -- wie aus dem Netzwerk empfangen
OUT messageProcessingModel, -- typischerweise SNMP-Version
OUT securityModel, -- verwendetes Sicherheitsmodell
OUT securityName, -- im Namen dieses Prinzipals
OUT securityLevel, -- gefordertes Sicherheitsniveau
OUT contextEngineID, -- Daten von dieser SNMP-Entität
OUT contextName, -- Daten aus diesem Kontext
OUT pduVersion, -- Version der PDU
OUT PDU, -- SNMP-Protokolldateneinheit
OUT pduType, -- SNMP-PDU-Typ
OUT sendPduHandle, -- Handle der übereinstimmenden Anfrage
OUT maxSizeResponseScopedPDU, -- maximale Größe der Antwort-PDU
OUT statusInformation, -- Erfolg oder errorIndication
OUT stateReference -- Referenz auf Zustandsinformationen
)

Wenn result errorIndication auf einen anderen Wert als noError gesetzt ist, wird die Nachricht verworfen, ohne weiter verarbeitet zu werden. Die Verarbeitung dieser Nachricht wird gestoppt.

4.2.2.1. Empfangene Anfragen und Benachrichtigungen

Wenn der Wert von pduType anzeigt, dass die Nachricht eine Anfrage oder Benachrichtigung enthält, wird das folgende Verfahren für den PDU-Dispatch befolgt:

  1. Basierend auf dem pduType, contextEngineID und contextName wird eine geeignete Anwendung ausgewählt.

    a) Wenn keine Anwendung für die Kombination von pduType, contextEngineID und contextName registriert ist und keine Anwendung für pduType und contextEngineID mit leerem contextName registriert ist:

    • Wenn pduType bestätigt ist, wird eine Report-PDU an den Absender der Nachricht gesendet. Der Dispatcher ruft das entsprechende Nachrichtenverarbeitungsmodell auf, um einen Fehlerbericht unter Verwendung des reportPDU-abstrakten Service-Interface-Primitivs zu generieren:
result = reportPDU(
IN messageProcessingModel, -- typischerweise SNMP-Version
IN securityModel, -- verwendetes Sicherheitsmodell
IN securityName, -- im Namen dieses Prinzipals
IN securityLevel, -- wie bei empfangener Anfrage
IN contextEngineID, -- Daten von dieser SNMP-Entität
IN contextName, -- Daten aus diesem Kontext
IN pduVersion, -- Version der PDU
IN PDU, -- SNMP-Protokolldateneinheit
IN maxSizeResponseScopedPDU, -- maximale Größe der Antwort-PDU
IN stateReference, -- Referenz auf Zustandsinformationen
IN statusInformation -- Fehleranzeige
)
  - Die Nachricht wird verworfen. Die Verarbeitung dieser Nachricht wird gestoppt.

b) Wenn pduType unbestätigt ist, wird die Nachricht verworfen. Die Verarbeitung dieser Nachricht wird gestoppt.

  1. Die PDU wird unter Verwendung des abstrakten processPdu-Service-Interface an die Anwendung dispatched:
processPdu(
IN messageProcessingModel, -- typischerweise SNMP-Version
IN securityModel, -- verwendetes Sicherheitsmodell
IN securityName, -- im Namen dieses Prinzipals
IN securityLevel, -- Sicherheitsniveau
IN contextEngineID, -- Daten von dieser SNMP-Entität
IN contextName, -- Daten aus diesem Kontext
IN pduVersion, -- Version der PDU
IN PDU, -- SNMP-Protokolldateneinheit
IN maxSizeResponseScopedPDU, -- maximale Größe der Antwort-PDU
IN stateReference -- Referenz auf Zustandsinformationen
)

4.2.2.2. Empfangene Antworten

Wenn pduType eine Antwort, einen Report oder einen anderen Klasse-2-Typ-PDU anzeigt, wird das folgende Verfahren für den PDU-Dispatch befolgt:

  1. Der Wert in sendPduHandle wird verwendet, um zu bestimmen, an welche Anwendung die PDU dispatched werden soll.

  2. Wenn keine Anwendungsregistrierung gefunden wird, wird der snmpUnknownPDUHandlers-Zähler [RFC3418] erhöht und die Nachricht wird verworfen. Die Verarbeitung dieser Nachricht wird gestoppt.

  3. Andernfalls wird die Nachricht unter Verwendung des abstrakten processResponsePdu-Service-Interface an die Anwendung dispatched:

processResponsePdu(
IN messageProcessingModel, -- typischerweise SNMP-Version
IN securityModel, -- verwendetes Sicherheitsmodell
IN securityName, -- im Namen dieses Prinzipals
IN securityLevel, -- Sicherheitsniveau
IN contextEngineID, -- Daten von dieser SNMP-Entität
IN contextName, -- Daten aus diesem Kontext
IN pduVersion, -- Version der PDU
IN PDU, -- SNMP-Protokolldateneinheit
IN statusInformation, -- Erfolg oder errorIndication
IN sendPduHandle -- Handle der übereinstimmenden Anfrage
)

4.3. Anwendungsregistrierung zur Verarbeitung von PDU-Typen

Eine Anwendung, die bestimmte PDUs verarbeiten möchte, muss sich beim PDU-Dispatcher registrieren. Die Anwendung gibt die Kombination von pduType, contextEngineID und contextName an, für die sie verantwortlich sein möchte.

Das folgende Verfahren wird für die Anwendungsregistrierung befolgt:

  1. Die Anwendung ruft den PDU-Dispatcher mit dem abstrakten registerContextEngineID-Service-Interface-Primitiv auf:
statusInformation = registerContextEngineID(
IN contextEngineID, -- Verantwortung dafür übernehmen
IN pduType -- zu registrierender pduType
)
  1. Wenn bereits eine andere Anwendung für die angegebene Kombination von contextEngineID und pduType registriert ist, wird eine errorIndication (duplicateRegistration) an die aufrufende Anwendung zurückgegeben. Die Verarbeitung der Registrierung wird gestoppt.

  2. Andernfalls wird die Registrierung vom PDU-Dispatcher gespeichert und Erfolg wird zurückgegeben.

4.4. Aufhebung der Anwendungsregistrierung zur Verarbeitung von PDU-Typen

Eine Anwendung, die bestimmte Typen von PDUs nicht mehr verarbeiten möchte, muss ihre Registrierung beim PDU-Dispatcher aufheben. Die Anwendung muss die Kombination von contextEngineID und pduType angeben, für die sie nicht mehr verantwortlich sein möchte.

Das folgende Verfahren wird für die Aufhebung der Anwendungsregistrierung befolgt:

  1. Die Anwendung ruft den PDU-Dispatcher mit dem abstrakten unregisterContextEngineID-Service-Interface-Primitiv auf:
unregisterContextEngineID(
IN contextEngineID, -- Verantwortung dafür abgeben
IN pduType -- zu deregistrierender pduType
)
  1. Wenn eine Anwendungsregistrierung gefunden wird, wird sie entfernt.

  2. Wenn keine solche Registrierung gefunden wird, wird die Anfrage ignoriert.