メインコンテンツまでスキップ

4. ディスパッチャの手順要素

4.1. ネットワークへのSNMPメッセージの送信

このセクションでは、アプリケーションが別のSNMPエンティティにSNMP PDUを送信したい場合にディスパッチャが従う手順について説明します。

4.1.1. リクエストまたは通知の送信

アプリケーションがネットワークにSNMPリクエストまたは通知を送信したい場合、以下の手順に従います。

手順:

  1. アプリケーションは、抽象sendPduサービスインターフェースプリミティブを使用してディスパッチャを呼び出し、ディスパッチャにSNMP PDUの送信を要求します:
statusInformation = sendPdu(
IN transportDomain, -- 使用するトランスポートドメイン
IN transportAddress, -- 宛先ネットワークアドレス
IN messageProcessingModel, -- 通常、SNMPバージョン
IN securityModel, -- 使用するセキュリティモデル
IN securityName, -- このプリンシパルの代理
IN securityLevel, -- 要求されるセキュリティレベル
IN contextEngineID, -- このSNMPエンティティからのデータ
IN contextName, -- このコンテキスト内のデータ
IN pduVersion, -- PDUのバージョン
IN PDU, -- SNMPプロトコルデータユニット
IN expectResponse, -- TRUEまたはFALSE
IN sendPduHandle -- 受信応答と照合するためのハンドル
)
  1. messageProcessingModel値がディスパッチャに既知のメッセージ処理モデルを表していない場合、errorIndication (unsupportedMsgProcessingModel) が呼び出し元アプリケーションに返されます。このメッセージの処理は停止されます。

  2. ディスパッチャは、そのメッセージ形式仕様に従ってメッセージを準備するよう、適切なメッセージ処理モデルに要求します:

statusInformation = prepareOutgoingMessage(
IN transportDomain, -- アプリケーションが指定したとおり
IN transportAddress, -- アプリケーションが指定したとおり
IN messageProcessingModel, -- アプリケーションが指定したとおり
IN securityModel, -- アプリケーションが指定したとおり
IN securityName, -- アプリケーションが指定したとおり
IN securityLevel, -- アプリケーションが指定したとおり
IN contextEngineID, -- アプリケーションが指定したとおり
IN contextName, -- アプリケーションが指定したとおり
IN pduVersion, -- アプリケーションが指定したとおり
IN PDU, -- アプリケーションが指定したとおり
IN expectResponse, -- アプリケーションが指定したとおり
IN sendPduHandle, -- アプリケーションが決定したとおり
OUT destTransportDomain, -- 宛先トランスポートドメイン
OUT destTransportAddress, -- 宛先トランスポートアドレス
OUT outgoingMessage, -- 送信するメッセージ
OUT outgoingMessageLength -- その長さ
)
  1. statusInformationパラメータのstatusInformationがsuccessでない場合、ディスパッチャはstatusInformationを呼び出し元アプリケーションに返します。メッセージの処理は停止されます。

  2. statusInformationがsuccessの場合、ディスパッチャはtransportDomainとtransportAddressで指定されたトランスポートを介して、準備されたメッセージをネットワークに送信します。

  3. ディスパッチャは呼び出し元アプリケーションにsuccessを返します。

4.1.2. ネットワークへのレスポンスの送信

アプリケーションがネットワークにレスポンスを送信したい場合、以下の手順に従います。

手順:

  1. アプリケーションは、returnResponsePdu抽象サービスインターフェースを使用してディスパッチャを呼び出し、ディスパッチャにSNMP PDUの送信を要求します:
result = returnResponsePdu(
IN messageProcessingModel, -- 通常、SNMPバージョン
IN securityModel, -- 使用中のセキュリティモデル
IN securityName, -- このプリンシパルの代理
IN securityLevel, -- 受信リクエストと同じ
IN contextEngineID, -- このSNMPエンティティからのデータ
IN contextName, -- このコンテキスト内のデータ
IN pduVersion, -- PDUのバージョン
IN PDU, -- SNMPプロトコルデータユニット
IN maxSizeResponseScopedPDU, -- レスポンスPDUの最大サイズ
IN stateReference, -- 状態情報への参照
IN statusInformation -- successまたはerrorIndication
)

注:抽象データ要素securityModel、securityName、securityLevel、contextEngineID、contextName、およびstateReferenceは、リクエストが受信されてアプリケーションに渡されたときに最初に決定された値と同じである必要があります。これらの値は、stateReferenceをキーとして使用してキャッシュから取得できます。

  1. messageProcessingModel値がディスパッチャに既知のメッセージ処理モデルを表していない場合、errorIndication (unsupportedMsgProcessingModel) が呼び出し元アプリケーションに返されます。このメッセージの処理は停止されます。

  2. ディスパッチャは、そのメッセージ形式仕様に従ってレスポンスメッセージを準備するよう、適切なメッセージ処理モデルに要求します:

result = prepareResponseMessage(
IN messageProcessingModel, -- アプリケーションが提供したとおり
IN securityModel, -- アプリケーションが提供したとおり
IN securityName, -- アプリケーションが提供したとおり
IN securityLevel, -- アプリケーションが提供したとおり
IN contextEngineID, -- アプリケーションが提供したとおり
IN contextName, -- アプリケーションが提供したとおり
IN pduVersion, -- アプリケーションが提供したとおり
IN PDU, -- アプリケーションが提供したとおり
IN maxSizeResponseScopedPDU, -- アプリケーションが提供したとおり
IN stateReference, -- アプリケーションが提供したとおり
IN statusInformation, -- アプリケーションが提供したとおり
OUT destTransportDomain, -- 宛先トランスポートドメイン
OUT destTransportAddress, -- 宛先トランスポートアドレス
OUT outgoingMessage, -- 送信するメッセージ
OUT outgoingMessageLength -- その長さ
)
  1. resultパラメータのresultがsuccessでない場合、ディスパッチャはerrorIndicationを呼び出し元アプリケーションに返します。メッセージの処理は停止されます。

  2. resultがsuccessの場合、ディスパッチャはdestTransportDomainとdestTransportAddressで指定されたトランスポートを介して、準備されたメッセージをネットワークに送信します。

  3. ディスパッチャは呼び出し元アプリケーションにsuccessを返します。

4.2. ネットワークからのSNMPメッセージの受信

このセクションでは、ディスパッチャがネットワークからSNMPメッセージを受信したときに従う手順について説明します。

4.2.1. 受信したSNMPメッセージのメッセージディスパッチ

ディスパッチャがネットワークからSNMPメッセージを受信すると、以下の手順に従います:

  1. ディスパッチャはネットワークからメッセージを受信します。

  2. ディスパッチャはSNMPメッセージのバージョンを判断します。バージョンを判断するためにパケットを十分に解析できない場合、snmpInASNParseErrsカウンター [RFC3418] がインクリメントされ、メッセージはそれ以上処理されずに破棄されます。このメッセージの処理は停止されます。

  3. ディスパッチャは、SNMPメッセージバージョンに基づいて適切なメッセージ処理モデルを決定します。

  4. SNMPメッセージバージョンがディスパッチャに既知でない場合、snmpInBadVersionsカウンター [RFC3418] がインクリメントされ、メッセージはそれ以上処理されずに破棄されます。このメッセージの処理は停止されます。

4.2.2. 受信メッセージのPDUディスパッチ

メッセージディスパッチがメッセージ処理モデルを決定した後、以下の抽象サービスインターフェースを使用して、メッセージ処理モデルがメッセージからPDUとデータを抽出するよう要求します:

result = prepareDataElements(
IN transportDomain, -- 発信元トランスポートドメイン
IN transportAddress, -- 発信元トランスポートアドレス
IN wholeMsg, -- ネットワークから受信したとおり
IN wholeMsgLength, -- ネットワークから受信したとおり
OUT messageProcessingModel, -- 通常、SNMPバージョン
OUT securityModel, -- 使用中のセキュリティモデル
OUT securityName, -- このプリンシパルの代理
OUT securityLevel, -- 要求されるセキュリティレベル
OUT contextEngineID, -- このSNMPエンティティからのデータ
OUT contextName, -- このコンテキスト内のデータ
OUT pduVersion, -- PDUのバージョン
OUT PDU, -- SNMPプロトコルデータユニット
OUT pduType, -- SNMP PDUタイプ
OUT sendPduHandle, -- 一致したリクエストのハンドル
OUT maxSizeResponseScopedPDU, -- レスポンスPDUの最大サイズ
OUT statusInformation, -- successまたはerrorIndication
OUT stateReference -- 状態情報への参照
)

result errorIndicationがnoError以外の値に設定されている場合、メッセージはそれ以上処理されずに破棄されます。このメッセージの処理は停止されます。

4.2.2.1. 受信リクエストと通知

pduTypeの値がメッセージにリクエストまたは通知が含まれていることを示す場合、PDUのディスパッチには以下の手順が従われます:

  1. pduType、contextEngineID、およびcontextNameに基づいて、適切なアプリケーションが選択されます。

    a) pduType、contextEngineID、およびcontextNameの組み合わせに対してアプリケーションが登録されておらず、pduTypeと空のcontextNameを持つcontextEngineIDに対してアプリケーションが登録されていない場合:

    • pduTypeが確認済みの場合、レポートPDUがメッセージの発信者に送信されます。ディスパッチャは、reportPDU抽象サービスインターフェースプリミティブを使用してエラーレポートを生成するために適切なメッセージ処理モデルを呼び出します:
result = reportPDU(
IN messageProcessingModel, -- 通常、SNMPバージョン
IN securityModel, -- 使用中のセキュリティモデル
IN securityName, -- このプリンシパルの代理
IN securityLevel, -- 受信リクエストと同じ
IN contextEngineID, -- このSNMPエンティティからのデータ
IN contextName, -- このコンテキスト内のデータ
IN pduVersion, -- PDUのバージョン
IN PDU, -- SNMPプロトコルデータユニット
IN maxSizeResponseScopedPDU, -- レスポンスPDUの最大サイズ
IN stateReference, -- 状態情報への参照
IN statusInformation -- エラー表示
)
  - メッセージは破棄されます。このメッセージの処理は停止されます。

b) pduTypeが未確認の場合、メッセージは破棄されます。このメッセージの処理は停止されます。

  1. PDUは、processPdu抽象サービスインターフェースを使用してアプリケーションにディスパッチされます:
processPdu(
IN messageProcessingModel, -- 通常、SNMPバージョン
IN securityModel, -- 使用中のセキュリティモデル
IN securityName, -- このプリンシパルの代理
IN securityLevel, -- セキュリティレベル
IN contextEngineID, -- このSNMPエンティティからのデータ
IN contextName, -- このコンテキスト内のデータ
IN pduVersion, -- PDUのバージョン
IN PDU, -- SNMPプロトコルデータユニット
IN maxSizeResponseScopedPDU, -- レスポンスPDUの最大サイズ
IN stateReference -- 状態情報への参照
)

4.2.2.2. 受信レスポンス

pduTypeがレスポンス、レポート、またはその他のクラス2タイプPDUを示す場合、PDUのディスパッチには以下の手順が従われます:

  1. sendPduHandle内の値は、PDUをどのアプリケーションにディスパッチすべきかを決定するために使用されます。

  2. アプリケーション登録が見つからない場合、snmpUnknownPDUHandlersカウンター [RFC3418] がインクリメントされ、メッセージは破棄されます。このメッセージの処理は停止されます。

  3. それ以外の場合、メッセージはprocessResponsePdu抽象サービスインターフェースを使用してアプリケーションにディスパッチされます:

processResponsePdu(
IN messageProcessingModel, -- 通常、SNMPバージョン
IN securityModel, -- 使用中のセキュリティモデル
IN securityName, -- このプリンシパルの代理
IN securityLevel, -- セキュリティレベル
IN contextEngineID, -- このSNMPエンティティからのデータ
IN contextName, -- このコンテキスト内のデータ
IN pduVersion, -- PDUのバージョン
IN PDU, -- SNMPプロトコルデータユニット
IN statusInformation, -- successまたはerrorIndication
IN sendPduHandle -- 一致したリクエストのハンドル
)

4.3. PDUタイプを処理するためのアプリケーション登録

特定のPDUを処理したいアプリケーションは、PDUディスパッチャに登録する必要があります。アプリケーションは、責任を負いたいpduType、contextEngineID、およびcontextNameの組み合わせを指定します。

アプリケーション登録には以下の手順が従われます:

  1. アプリケーションは、registerContextEngineID抽象サービスインターフェースプリミティブを使用してPDUディスパッチャを呼び出します:
statusInformation = registerContextEngineID(
IN contextEngineID, -- これに対して責任を負う
IN pduType -- 登録するpduType
)
  1. 指定されたcontextEngineIDとpduTypeに対して別のアプリケーションがすでに登録されている場合、errorIndication (duplicateRegistration) が呼び出し元アプリケーションに返されます。登録の処理は停止されます。

  2. それ以外の場合、登録はPDUディスパッチャによって保存され、successが返されます。

4.4. PDUタイプを処理するためのアプリケーション登録解除

特定のタイプのPDUを処理したくなくなったアプリケーションは、PDUディスパッチャから登録解除する必要があります。アプリケーションは、責任を負いたくないcontextEngineIDとpduTypeの組み合わせを指定する必要があります。

アプリケーション登録解除には以下の手順が従われます:

  1. アプリケーションは、unregisterContextEngineID抽象サービスインターフェースプリミティブを使用してPDUディスパッチャを呼び出します:
unregisterContextEngineID(
IN contextEngineID, -- これに対する責任を放棄する
IN pduType -- 登録解除するpduType
)
  1. アプリケーション登録が見つかった場合、それは削除されます。

  2. そのような登録が見つからない場合、リクエストは無視されます。