Aller au contenu principal

4. Éléments de procédure du répartiteur

4.1. Envoi d'un message SNMP sur le réseau

Cette section décrit la procédure que suit le répartiteur lorsqu'une application souhaite envoyer une PDU SNMP à une autre entité SNMP.

4.1.1. Envoi d'une requête ou d'une notification

Lorsqu'une application souhaite envoyer une requête ou une notification SNMP sur le réseau, la procédure suivante est appliquée.

Procédure :

  1. L'application appelle le répartiteur en utilisant la primitive d'interface de service abstraite sendPdu, demandant au répartiteur d'envoyer une PDU SNMP :
statusInformation = sendPdu(
IN transportDomain, -- domaine de transport à utiliser
IN transportAddress, -- adresse réseau de destination
IN messageProcessingModel, -- typiquement la version SNMP
IN securityModel, -- modèle de sécurité à utiliser
IN securityName, -- au nom de ce principal
IN securityLevel, -- niveau de sécurité demandé
IN contextEngineID, -- données de cette entité SNMP
IN contextName, -- données de ce contexte
IN pduVersion, -- version de la PDU
IN PDU, -- unité de données de protocole SNMP
IN expectResponse, -- TRUE ou FALSE
IN sendPduHandle -- descripteur pour faire correspondre la réponse reçue
)
  1. Si la valeur de messageProcessingModel ne représente pas un modèle de traitement de message connu du répartiteur, une errorIndication (unsupportedMsgProcessingModel) est renvoyée à l'application appelante. Le traitement de ce message est arrêté.

  2. Le répartiteur demande au modèle de traitement de message approprié de préparer un message selon sa spécification de format de message :

statusInformation = prepareOutgoingMessage(
IN transportDomain, -- comme spécifié par l'application
IN transportAddress, -- comme spécifié par l'application
IN messageProcessingModel, -- comme spécifié par l'application
IN securityModel, -- comme spécifié par l'application
IN securityName, -- comme spécifié par l'application
IN securityLevel, -- comme spécifié par l'application
IN contextEngineID, -- comme spécifié par l'application
IN contextName, -- comme spécifié par l'application
IN pduVersion, -- comme spécifié par l'application
IN PDU, -- comme spécifié par l'application
IN expectResponse, -- comme spécifié par l'application
IN sendPduHandle, -- comme déterminé par l'application
OUT destTransportDomain, -- domaine de transport de destination
OUT destTransportAddress, -- adresse de transport de destination
OUT outgoingMessage, -- message à envoyer
OUT outgoingMessageLength -- sa longueur
)
  1. Si le paramètre statusInformation dans statusInformation n'est pas réussi, le répartiteur renvoie statusInformation à l'application appelante. Le traitement du message est arrêté.

  2. Si statusInformation est réussi, le répartiteur envoie le message préparé sur le réseau via le transport spécifié par transportDomain et transportAddress.

  3. Le répartiteur renvoie succès à l'application appelante.

4.1.2. Envoi d'une réponse sur le réseau

Lorsqu'une application souhaite envoyer une réponse sur le réseau, la procédure suivante est appliquée.

Procédure :

  1. L'application appelle le répartiteur en utilisant l'interface de service abstraite returnResponsePdu, demandant au répartiteur d'envoyer une PDU SNMP :
result = returnResponsePdu(
IN messageProcessingModel, -- typiquement la version SNMP
IN securityModel, -- modèle de sécurité utilisé
IN securityName, -- au nom de ce principal
IN securityLevel, -- comme pour la requête reçue
IN contextEngineID, -- données de cette entité SNMP
IN contextName, -- données de ce contexte
IN pduVersion, -- version de la PDU
IN PDU, -- unité de données de protocole SNMP
IN maxSizeResponseScopedPDU, -- taille maximale de la PDU de réponse
IN stateReference, -- référence aux informations d'état
IN statusInformation -- succès ou errorIndication
)

Remarque : Les éléments de données abstraits securityModel, securityName, securityLevel, contextEngineID, contextName et stateReference doivent avoir les mêmes valeurs que celles déterminées à l'origine lorsque la requête a été reçue et transmise à l'application. Ces valeurs peuvent être récupérées du cache en utilisant stateReference comme clé.

  1. Si la valeur de messageProcessingModel ne représente pas un modèle de traitement de message connu du répartiteur, une errorIndication (unsupportedMsgProcessingModel) est renvoyée à l'application appelante. Le traitement de ce message est arrêté.

  2. Le répartiteur demande au modèle de traitement de message approprié de préparer un message de réponse selon sa spécification de format de message :

result = prepareResponseMessage(
IN messageProcessingModel, -- comme fourni par l'application
IN securityModel, -- comme fourni par l'application
IN securityName, -- comme fourni par l'application
IN securityLevel, -- comme fourni par l'application
IN contextEngineID, -- comme fourni par l'application
IN contextName, -- comme fourni par l'application
IN pduVersion, -- comme fourni par l'application
IN PDU, -- comme fourni par l'application
IN maxSizeResponseScopedPDU, -- comme fourni par l'application
IN stateReference, -- comme fourni par l'application
IN statusInformation, -- comme fourni par l'application
OUT destTransportDomain, -- domaine de transport de destination
OUT destTransportAddress, -- adresse de transport de destination
OUT outgoingMessage, -- message à envoyer
OUT outgoingMessageLength -- sa longueur
)
  1. Si le paramètre result dans result n'est pas réussi, le répartiteur renvoie une errorIndication à l'application appelante. Le traitement du message est arrêté.

  2. Si result est réussi, le répartiteur envoie le message préparé sur le réseau via le transport spécifié par destTransportDomain et destTransportAddress.

  3. Le répartiteur renvoie succès à l'application appelante.

4.2. Réception d'un message SNMP du réseau

Cette section décrit la procédure que suit le répartiteur lorsqu'il reçoit un message SNMP du réseau.

4.2.1. Répartition de message d'un message SNMP reçu

Lorsque le répartiteur reçoit un message SNMP du réseau, la procédure suivante est appliquée :

  1. Le répartiteur reçoit un message du réseau.

  2. Le répartiteur détermine la version du message SNMP. Si le paquet ne peut pas être suffisamment analysé pour déterminer la version, le compteur snmpInASNParseErrs [RFC3418] est incrémenté et le message est rejeté sans être traité davantage. Le traitement de ce message est arrêté.

  3. Le répartiteur détermine le modèle de traitement de message approprié en fonction de la version du message SNMP.

  4. Si la version du message SNMP n'est pas connue du répartiteur, le compteur snmpInBadVersions [RFC3418] est incrémenté et le message est rejeté sans être traité davantage. Le traitement de ce message est arrêté.

4.2.2. Répartition de PDU d'un message reçu

Après que la répartition de message a déterminé un modèle de traitement de message, elle utilise l'interface de service abstraite suivante pour demander au modèle de traitement de message d'extraire la PDU et les données du message :

result = prepareDataElements(
IN transportDomain, -- domaine de transport source
IN transportAddress, -- adresse de transport source
IN wholeMsg, -- tel que reçu du réseau
IN wholeMsgLength, -- tel que reçu du réseau
OUT messageProcessingModel, -- typiquement la version SNMP
OUT securityModel, -- modèle de sécurité utilisé
OUT securityName, -- au nom de ce principal
OUT securityLevel, -- niveau de sécurité demandé
OUT contextEngineID, -- données de cette entité SNMP
OUT contextName, -- données de ce contexte
OUT pduVersion, -- version de la PDU
OUT PDU, -- unité de données de protocole SNMP
OUT pduType, -- type de PDU SNMP
OUT sendPduHandle, -- descripteur de la requête correspondante
OUT maxSizeResponseScopedPDU, -- taille maximale de la PDU de réponse
OUT statusInformation, -- succès ou errorIndication
OUT stateReference -- référence aux informations d'état
)

Si result errorIndication est défini sur une valeur autre que noError, le message est rejeté sans être traité davantage. Le traitement de ce message est arrêté.

4.2.2.1. Requêtes et notifications reçues

Si la valeur de pduType indique que le message contient une requête ou une notification, la procédure suivante est suivie pour la répartition de PDU :

  1. En fonction du pduType, contextEngineID et contextName, une application appropriée est sélectionnée.

    a) Si aucune application n'est enregistrée pour la combinaison de pduType, contextEngineID et contextName, et qu'aucune application n'est enregistrée pour pduType et contextEngineID avec un contextName vide :

    • Si pduType est confirmé, une PDU de rapport est envoyée à l'expéditeur du message. Le répartiteur appelle le modèle de traitement de message approprié pour générer un rapport d'erreur en utilisant la primitive d'interface de service abstraite reportPDU :
result = reportPDU(
IN messageProcessingModel, -- typiquement la version SNMP
IN securityModel, -- modèle de sécurité utilisé
IN securityName, -- au nom de ce principal
IN securityLevel, -- comme pour la requête reçue
IN contextEngineID, -- données de cette entité SNMP
IN contextName, -- données de ce contexte
IN pduVersion, -- version de la PDU
IN PDU, -- unité de données de protocole SNMP
IN maxSizeResponseScopedPDU, -- taille maximale de la PDU de réponse
IN stateReference, -- référence aux informations d'état
IN statusInformation -- indication d'erreur
)
  - Le message est rejeté. Le traitement de ce message est arrêté.

b) Si pduType n'est pas confirmé, le message est rejeté. Le traitement de ce message est arrêté.

  1. La PDU est répartie vers l'application en utilisant l'interface de service abstraite processPdu :
processPdu(
IN messageProcessingModel, -- typiquement la version SNMP
IN securityModel, -- modèle de sécurité utilisé
IN securityName, -- au nom de ce principal
IN securityLevel, -- niveau de sécurité
IN contextEngineID, -- données de cette entité SNMP
IN contextName, -- données de ce contexte
IN pduVersion, -- version de la PDU
IN PDU, -- unité de données de protocole SNMP
IN maxSizeResponseScopedPDU, -- taille maximale de la PDU de réponse
IN stateReference -- référence aux informations d'état
)

4.2.2.2. Réponses reçues

Si pduType indique une réponse, un rapport ou un autre type de PDU de classe 2, la procédure suivante est suivie pour la répartition de PDU :

  1. La valeur dans sendPduHandle est utilisée pour déterminer vers quelle application la PDU doit être répartie.

  2. Si aucun enregistrement d'application n'est trouvé, le compteur snmpUnknownPDUHandlers [RFC3418] est incrémenté et le message est rejeté. Le traitement de ce message est arrêté.

  3. Sinon, le message est réparti vers l'application en utilisant l'interface de service abstraite processResponsePdu :

processResponsePdu(
IN messageProcessingModel, -- typiquement la version SNMP
IN securityModel, -- modèle de sécurité utilisé
IN securityName, -- au nom de ce principal
IN securityLevel, -- niveau de sécurité
IN contextEngineID, -- données de cette entité SNMP
IN contextName, -- données de ce contexte
IN pduVersion, -- version de la PDU
IN PDU, -- unité de données de protocole SNMP
IN statusInformation, -- succès ou errorIndication
IN sendPduHandle -- descripteur de la requête correspondante
)

4.3. Enregistrement d'application pour le traitement des types de PDU

Une application qui souhaite traiter des PDU particulières doit s'enregistrer auprès du répartiteur de PDU. L'application spécifie la combinaison de pduType, contextEngineID et contextName dont elle souhaite être responsable.

La procédure suivante est suivie pour l'enregistrement d'application :

  1. L'application appelle le répartiteur de PDU en utilisant la primitive d'interface de service abstraite registerContextEngineID :
statusInformation = registerContextEngineID(
IN contextEngineID, -- en prendre la responsabilité
IN pduType -- pduType à enregistrer
)
  1. Si une autre application est déjà enregistrée pour la combinaison spécifiée de contextEngineID et pduType, une errorIndication (duplicateRegistration) est renvoyée à l'application appelante. Le traitement de l'enregistrement est arrêté.

  2. Sinon, l'enregistrement est enregistré par le répartiteur de PDU et succès est renvoyé.

4.4. Désenregistrement d'application pour le traitement des types de PDU

Une application qui ne souhaite plus traiter certains types de PDU doit se désenregistrer auprès du répartiteur de PDU. L'application doit spécifier la combinaison de contextEngineID et pduType dont elle ne souhaite plus être responsable.

La procédure suivante est suivie pour le désenregistrement d'application :

  1. L'application appelle le répartiteur de PDU en utilisant la primitive d'interface de service abstraite unregisterContextEngineID :
unregisterContextEngineID(
IN contextEngineID, -- renoncer à la responsabilité de cela
IN pduType -- pduType à désenregistrer
)
  1. Si un enregistrement d'application est trouvé, il est supprimé.

  2. Si aucun enregistrement de ce type n'est trouvé, la requête est ignorée.