Snmp Method


SNMP使用方法


【SNMPプロセス】

 動作パラメータの設定で「SNMP」を有効にすることで、カーネルのSNMPエージェントが動作します。
 実際には、実装MIBを初期化して、UDP161番ポート(コマンド受信用)およびUDP1440番ポート(トラップ送信用)をオープンして、SNMPマネージャからの要求に応答するできる状態にします。
 サポートするSNMPバージョンはV2ですが、アプリケーションからの指定でV1のトラップの送信も可能です。

 受信するパケット(SNMPコマンド)は以下です。
       GET-REQUEST
       GET-NEXTREQUEST
       SET-REQUEST
       GET-BULKREQUEST

 受信の制約は以下です。
       受信可能なUDPデータサイズは1472バイトまでです。
       受信可能なvariable-binding-list数は最大65までです。
       受信可能なOBJECT-IDENTFIER長は36バイトまでです。
       受信可能なVALUE長は68バイトまでです。

 送信するパケット(SNMPレスポンス、トラップ)は以下です。
       GET-RESPONSE
       TRAP-SNMPV2
       TRAP-V1

 ユーザアプリケーションプログラムから「SNMPアプリ登録」ファンクションの登録が無い場合、SNMPコマンド受信にてカーネルが管理していないオブジェクト識別子の指定があった場合 エラーを編集してSNMP応答します。

 ユーザアプリケーションプログラムから「SNMPアプリ登録」ファンクションの登録があった場合、SNMPコマンド受信にてカーネルが管理していないオブジェクト識別子の指定があると ユーザアプリケーションにメッセージを発行して、応答(ユーザアプリケーションからのメッセージ)を指定されたタイムアウト時間待ちます。応答があればその内容に従いSNMP応答パケット組み立てて送信します。応答がタイムアウトした場合は、エラーを編集してSNMP応答します。


【ユーザアプリケーション】

 アプリケーションプログラムはユーザが本装置のSNMPエージェントの管理するMIBに、ユーザ固有の企業MIBを実装(追加)することを可能にします。メッセージのやり取り以外のUDP処理、SNMPパケットの分析・組み立て処理をすべてカーネルのSNMPプロセスに委ねることができます。

 アプリケーションプログラムはカーネルのSNMPプロセスを使用するために、まず「SNMPアプリ登録」ファンクションを呼び出す必要があります。
 これによりユーザアプリケーションにカーネルのSNMPプロセスのプロセスIDが通知されて、お互いに相手のプロセスにメッセージを発行することが可能になります。

 メッセージの送受信は「メッセージ追加」ファンクション,「メッセージ取得」ファンクションを使用して行ないます。
 メッセージに付加するパラメータ格納領域につきましてはメモリ管理を参照して下さい。

 アプリケーションプログラムは「SNMPアプリ登録」ファンクションを呼び出さない場合でも、「SNMPMIB情報取得」ファンクション、「SNMPMIB情報設定」ファンクションは使用できます。

【SNMPメッセージ】

 SNMPプロセスとやり取りするメッセージは以下の構造になります。

  (共通メッセージ構成)
+0
+1
+2
+3
msg+00
宛先プロセスID
自プロセスID
msg+04
メッセージ種別
コマンドコード
パラメータ長
msg+08
ダブルポインタ

typedef struct {
  short dest; 宛先プロセスID
  short src; 自プロセスID
  Byte rqrs; メッセージ種別
  Byte cmd; コマンドコード
  Word prmlen; パラメータ長
  char **prm; ダブルポインタ
} TMsg;
sizeof(TMsg) = 12

  宛先プロセスID:
    アプリケーションから見れば、カーネルのSNMPプロセスのプロセスID(RegSnmpAplにて取得)

  自プロセスID:
    アプリケーションから見れば、アプリケーションプログラムのプロセスID(main(aPid)で引渡)

  メッセージ種別:
    0:MSG_REQUEST   要求
    1:MSG_RESPONSE   応答
    2:MSG_ERROR     エラー応答

  コマンドコード:
    30:MSG_GETREQ
    31:MSG_GETNEXTREQ
    32:MSG_SETREQ
    33:MSG_GETBULKREQ
    34:MSG_TRAPSEND

  パラメータ長:
    パラメータの全長(ダブルポインタの示すエリアのサイズ)

  ダブルポインタ:
    パラメータを示すダブルポインタ


【パラメータエリア】

 パラメータエリア(ダブルポインタが示す)の構造はになります。

+0
+1
+2
--
param+00
SNMPメッセージ識別子
param+04
処理結果
エラー位置
返還リスト数
バージョン
param+08
一般トラップ
特殊トラップ
x
param+0A
企業ID/トラップOID
param+2A
トラップ宛先IPアドレス
param+2E
リスト数
x
param+30
リスト(65)

typedef struct {
  Word id; タグ
  Word len; 長さ
  Byte ct[68]; 値の実体
} _ANLVAL;
sizeof(_ANLVAL) = 72

typedef struct {
  Word len; 長さ
  Byte ct[36]; オブジェクト識別子の実体
} _ANLOID;
sizeof(_ANLOID) = 38

typedef struct {
  Word param1; パラメータ1
  Word param2; パラメータ2
  _ANLOID oid; オブジェクト識別子
  _ANLVAL val;
} _LIST;
sizeof(_LIST) = 114

typedef struct {
  Word listcnt; リスト数
  _LIST list[65];
} _LISTC;
sizeof(_LISTC) = 7412

typedef struct {
  Dword msgid; SNMPメッセージ識別子
  Byte err; 処理結果
  Byte err_idx; エラー位置
  Byte trn_listcnt; 返還リスト数
  Byte ver; バージョン
  Byte generic; 一般トラップ
  Byte specific; 特殊トラップ
  _ANLOID oid; 企業ID/トラップOID
  Dword ip; トラップ宛先IPアドレス
  _LISTC var; リスト群
} _EVLIST;
sizeof(_EVLIST) = 7464

  SNMPメッセージ識別子:
    メッセージ発行元のプロセスが、応答との対応を取るために使用します。
    (応答するプロセスはこの値を変更してはいけません。)

  処理結果:
    処理結果を参照して下さい。

  エラー位置:
    処理結果がnoErrorでない場合の、エラーインデックス。(リスト内の位置インデックス 1以上)

  返還リスト数:
    カーネルのSNMPプロセスがメッセージを発行する場合、パラメータ内の応答リスト数を設定します。
    (アプリケーションプロセスは参照のみ可)。

  バージョン:
    アプリケーションプロセスがトラップ送信時にトラップフォーマットを指定します。
      0=SNMPV1
      1=SNMPV2

  一般トラップ・特殊トラップ:
    アプリケーションプロセスがトラップ送信時に、バージョンにV1を指定した場合に指定します。

  企業ID・トラップOID
    アプリケーションプロセスがトラップ送信時に、バージョンの指定がV1の場合「企業ID(エンタープライズOID)、
    V2の場合「SNMPトラップOID」を指定します。

  トラップ宛先IPアドレス
    アプリケーションプロセスがトラップ送信時に、宛先のIPアドレスを指定します。

  リスト数
    有効なリストの要素数を設定します。最大65までです。
    プロトコル要素のvariable-binding-list数に相当します

  リスト(variable-binding-list)
    リスト要素
      パラメータ1:0〜N
      パラメータ2:リザーブ(変更不可)
      oid:オブジェクト識別子
      val:オブジェクト識別子に対応する値

【GET-REQUEST】

 カーネルのSNMPプロセスがGET-REQUESTパケットを受信し、variable-bindingsリスト内にカーネル管理MIBの範囲外のオブジェクト識別子を検出した場合、アプリケーションにメッセージを発行します。
 GET-REQUESTの場合、variable-bindingsリスト内に設定されているオブジェクト識別子に対応する「値」を設定して応答します。

 <カーネルが発行するメッセージ>

 メッセージ種別 (MSG_REQUEST)
 コマンドコード (MSG_GETREQ)
 SNMPメッセージ識別子 (識別番号)
 返還リスト数 (=リスト数)
 リスト数 (数値)
 リスト パラメータ1 (0)
オブジェクト識別子 (OBJECT-ID)

 <アプリケーションが応答するメッセージ>

 メッセージ種別 (MSG_RESPONSE)
 コマンドコード (MSG_GETREQ)
 SNMPメッセージ識別子 (識別番号) そのまま返します
 処理結果 (結果) を設定します
 エラー位置 (エラー位置) を設定します
 返還リスト数 (=リスト数) そのまま返します
 リスト数 (数値) そのまま返します
 リスト パラメータ1 (0)そのまま返します
オブジェクト識別子 (OBJECT-ID)そのまま返します
識別子に対応した値 (VAL)新たに設定します

 オブジェクトをサポートしていない場合は、オブジェクト識別子対応する「値」にnoSuchObject(0x80)を設定して下さい。
 オブジェクトの実体が存在しない場合は、オブジェクト識別子対応する「値」にnoSuchInstance(0x81)を設定して下さい。

【GET-NEXTREQUEST】

 カーネルのSNMPプロセスがGET-NEXTREQUESTパケットを受信し、variable-bindingsリスト内にカーネル管理MIBの範囲外または、カーネル管理MIBの最終のオブジェクト識別子を検出した場合、アプリケーションにメッセージを発行します。
 GET-NEXTREQUESTの場合、variable-bindingsリスト内に設定されているオブジェクト識別子の「次のオブジェクト識別子」とそれに対応する「値」を設定して応答します。

 <カーネルが発行するメッセージ>

 メッセージ種別 (MSG_REQUEST)
 コマンドコード (MSG_GETNEXTREQ)
 SNMPメッセージ識別子 (識別番号)
 返還リスト数 (=リスト数)
 リスト数 (数値)
 リスト パラメータ1 (1)
オブジェクト識別子 (OBJECT-ID)

 <アプリケーションが応答するメッセージ>

 メッセージ種別 (MSG_RESPONSE)
 コマンドコード (MSG_GETNEXTREQ)
 SNMPメッセージ識別子 (識別番号) そのまま返します
 処理結果 (結果) を設定します
 エラー位置 (エラー位置) を設定します
 返還リスト数 (=リスト数) そのまま返します
 リスト数 (数値) そのまま返します
 リスト パラメータ1 (1)そのまま返します
オブジェクト識別子 (次の識別子)新たに設定します
次の識別子に対応した値 (VAL)新たに設定します

 MIBデータベースの終了に遭遇した場合、「オブジェクト識別子」にはリストに設定されていた値を、「値」にはいendOfMibView(0x82)を設定して下さい。

【SET-REQUEST】

 カーネルのSNMPプロセスがSET-REQUESTパケットを受信し、variable-bindingsリスト内にカーネル管理MIBの範囲外のオブジェクト識別子を検出した場合、アプリケーションにメッセージを発行します。
 SET-REQUESTの場合、variable-bindingsリスト内に設定されているオブジェクト識別子に対応する値の「設定結果」を設定して応答します。

 <カーネルが発行するメッセージ>

 メッセージ種別 (MSG_REQUEST)
 コマンドコード (MSG_SETREQ)
 SNMPメッセージ識別子 (識別番号)
 返還リスト数 (=リスト数)
 リスト数 (数値)
 リスト パラメータ1 (0)
オブジェクト識別子 (OBJECT-ID)
識別子に対応した値 (VAL)

 <アプリケーションが応答するメッセージ>

 メッセージ種別 (MSG_RESPONSE)
 コマンドコード (MSG_SETREQUEST)
 SNMPメッセージ識別子 (識別番号) そのまま返します
 処理結果 (結果) を設定します
 エラー位置 (エラー位置) を設定します
 返還リスト数 (=リスト数) そのまま返します
 リスト数 (数値) そのまま返します
 リスト パラメータ1 (1)そのまま返します
オブジェクト識別子 (OBJECT-ID)そのまま返します
識別子に対応した値 (VAL)そのまま返します

【GET-BULKREQUEST】

 カーネルのSNMPプロセスがGET-BULKREQUESTパケットを受信し、variable-bindingsリスト内にカーネル管理MIBの範囲外または、指定された繰り返し数による参照MIBがカーネル管理MIBの範囲外のオブジェクト識別子の場合、アプリケーションにメッセージを発行します。
 GET-BULKREQUESTの場合、variable-bindingsリスト内に設定されているオブジェクト識別子の「次のオブジェクト識別子から指定数分のオブジェクト識別子」とそれに対応する「値」を設定して応答します。

 <カーネルが発行するメッセージ>

 メッセージ種別 (MSG_REQUEST)
 コマンドコード (MSG_GETBULKREQ)
 SNMPメッセージ識別子 (識別番号)
 返還リスト数 (リスト数*N)
 リスト数 (数値)
 リスト パラメータ1 (N)
オブジェクト識別子 (OBJECT-ID)

 <アプリケーションが応答するメッセージ>

 メッセージ種別 (MSG_RESPONSE)
 コマンドコード (MSG_GETBULKREQ)
 SNMPメッセージ識別子 (識別番号) そのまま返します
 処理結果 (結果) を設定します
 エラー位置 (エラー位置) を設定します
 返還リスト数 (リスト内のパラメータ1の合計) そのまま返します
 リスト数 (再計算値) リスト要素数を設定します
 リスト パラメータ1 (N)そのまま返します
オブジェクト識別子 (次の識別子からN個)新たに設定します
(次の識別子からN個に対応した値)新たに設定します

 GET-BULKREQUESTの場合、リスト内のパラメータ1の値(N)が重要な意味を持ちます。
 GET-BULKREQUESTの場合、この値(N)は1以上になります。値(N)の意味は、リストに設定されているオブジェクト識別子の次からN個連続したオブジェクト識別子と、それに対応する値のリストを要求します。
 従いまして、他のコマンドはリストの要素数が要求と応答で変化することはありませんが、GET-BULKREQUESTの場合増加する可能性があります。

  例としまして
    リスト数=3  リスト(1)のパラメータ1=1  リスト(2)のパラメータ1=2  リスト(3)のパラメータ1=3
    の場合、応答のリスト数は1+2+3=6になります。
  ユーザアプリケーションが作成するリスト数は「返還リスト数」に一致するはずです。

 MIBデータベースの終了に遭遇した場合、「オブジェクト識別子」にはリストに設定されている値を、「値」にはendOfMibView(0x82)を設定して下さい。

【TRAPSEND】

 アプリケーションが発行するメッセージ

 メッセージ種別 (MSG_REQUEST)
 コマンドコード (MSG_TRAPSEND)
 SNMPメッセージ識別子 (識別番号)
 トラップ宛先IPアドレス (IPアドレス)
 バージョン (V1/V2)
 企業ID/トラップOID (オブジェクト識別子)
 一般トラップ(V1) (番号)
 特殊トラップ(V1) (番号)
 リスト数 (トラップ付加リスト数)
 リスト オブジェクト識別子 (OID)
識別子に対応する値 (VAL)

 カーネルが応答するメッセージ

 メッセージ種別 (MSG_RESPONSE)
 コマンドコード (MSG_TRAPSEND)
 SNMPメッセージ識別子 (識別番号) そのまま返します
 処理結果 (結果) を設定します

 バージョンにV1を指定した場合は企業ID、一般トラップ、特殊トラップを設定して下さい。
 カーネルのSNMPプロセスで、エージェントIPアドレスとタイムスタンプを付加します。

 バージョンにV2を指定した場合はトラップOIDを設定して下さい。
 カーネルのSNMPプロセスでタイムスタンプを付加します。

 TRAPを複数のIPアドレスに送信した場合、処理結果はすべての送信が失敗した場合のみエラーになります。

【処理結果】

 処理結果の一覧を示します。

番号
エラー
対応コマンド
意味
0
noError
get,next,set,bulk,trap
正常
1
tooBig
get,next,set,bulk
メッセージ・サイズ超過
2
noSuchName

未使用(インスタンスが存在しない)
3
badValue

未使用(設定値が正しくない)
4
readOnlye

未使用(書き込み禁止)
5
genErr
get,next,set,bulk
その他エラー
6
noAccess
set
アクセス不可
7
wrongType
set
設定値の形式(タグ)違反
8
wrongLength
set
設定値の長さ違反
9
wrongEncode
set
設定値の符号化違反
10
wrongValue
set
設定値の値違反
11
noCreation
set
作成不可
12
inconsistentValue
set
値が不正
13
resourceUnavailable
set
処理リソースがない
14
commitFailed
set
エラー発生、戻し成功
15
undoFailed
set
エラー発生、戻し失敗
16
authorizationError

未使用(セキュリティエラー)
17
notWritable
set
書き込み禁止
18
inconsistentName
set
オブジェクト名不正
50
ParamError
trap
パラメータエラー
51
VerError
trap
指定バージョンエラー
52
SendError
trap
送信エラー

【トラップ送信】

 カーネルのSNMPプロセスは以下の場合、TRAPを送信します。

 1)パワーオン
    ColdStart (SNMPV2)
    送信条件 設定パラメータのSNMP設定の「Trap先IP」が0.0.0.0以外。
    TRAP宛先 「Trap先IP」および設定パラメータの「汎用設定項目1〜8」にIPアドレス(ddd.ddd.ddd.ddd)が
           設定されていれば、そのIPアドレス。

 2)コミュニティ違反
    Auhentification failure (SNMPV2)
    送信条件 設定パラメータのSNMP設定の「Trap先IP」が0.0.0.0以外。
           且つ、設定パラメータのSNMP設定の「Trap設定」(SNMPマネージャからも変更可能)が1(ENABLE)。
    TRAP宛先 1)と同様。

 3)アプリケーションプロセスからの要求
    アプリケーション依存 (SNMPV1/SNMPV2)
    送信条件 _EVLISTの「TRAP宛先IP」がユニキャストの場合。
           _EVLISTの「TRAP宛先IP」がブロードキャストで、SNMP設定の「Trap先IP」が0.0.0.0以外。
    TRAP宛先 ユニキャストの場合、指定されたIPアドレスのみ。
           ブロードキャストの場合1)と同様。


【メモリ管理】

 カーネルのSNMPプロセスとの間のメッセージの受け渡しでパラメータ格納領域を使用しないケースはありません。
 メッセージに付加するパラメータ格納領域は「メモリ取得」ファンクションで取得,「メモリ解放」ファンクションで解放します。

 ここでメッセージの送受信とメモリの確保、解放について以下の取り決めを守って下さい。

   カーネルのSNMPプロセスからメッセージ(MSG_REQUEST)が発行される場合、
      MSG_GETREQ
      MSG_GETNEXTREQ
      MSG_SETREQ
      MSG_GETBULKREQ  ->  カーネルプロセスがメモリ確保
                     (編集してアプリケーションプロセスへ)
                     (応答を編集してカーネルプロセスへ)
                     ->  カーネルプロセスがメモリ解放/再利用

   アプリケーションプロセスからメッセージ(MSG_REQUEST)が発行される場合、
      MSG_TRAPSEND   ->  アプリケーションプロセスがメモリ確保
                     (編集してカーネルプロセスへ)
                     (応答を編集してアプリケーションプロセスへ)
                     ->  アプリケーションがメモリ解放/再利用

 メッセージの応答が無い(タイムアウト)した場合、メッセージを送信したプロセスにメモリを解放する権利がないため、放置します。