SNMP_MIBII(3) | FreeBSD Library Functions Manual | SNMP_MIBII(3) |
名称
mibII, mibif_notify_f, mib_netsock, mib_if_set_dyn, mib_refresh_iflist, mib_find_if, mib_find_if_sys, mib_find_if_name, mib_first_if, mib_next_if, mib_register_newif, mib_unregister_newif, mib_fetch_ifmib, mib_if_admin, mib_find_ifa, mib_first_ififa, mib_next_ififa, mib_ifstack_create, mib_ifstack_delete, mib_find_rcvaddr, mib_rcvaddr_create, mib_rcvaddr_delete, mibif_notify, mibif_unnotify — bsnmpd のための mib-2 モジュールライブラリ
(begemotSnmpdModulePath."mibII" = /usr/lib/snmp_mibII.so)書式
#include < bsnmp/snmpmod.h>#include < bsnmp/snmp_mibII.h>
typedef void
(*mibif_notify_f)( struct mibif *ifp, enum mibif_notify event, void *uarg);
extern int mib_netsock;
void
mib_if_set_dyn( const char *ifname);
void
mib_refresh_iflist( void);
struct mibif *
mib_find_if( u_int ifindex);
struct mibif *
mib_find_if_sys( u_int sysindex);
struct mibif *
mib_find_if_name( const char *ifname);
struct mibif *
mib_first_if( void);
struct mibif *
mib_next_if( const struct mibif *ifp);
int
mib_register_newif( int (*func)(struct mibif *), const struct lmodule *mod);
void
mib_unregister_newif( const struct lmodule *mod);
int
mib_fetch_ifmib( struct mibif *ifp);
int
mib_if_admin( struct mibif *ifp, int up);
struct mibifa *
mib_find_ifa( struct in_addr ipa);
struct mibifa *
mib_first_ififa( const struct mibif *ifp);
struct mibifa *
mib_next_ififa( struct mibifa *ifa);
int
mib_ifstack_create( const struct mibif *lower, const struct mibif *upper);
void
mib_ifstack_delete( const struct mibif *lower, const struct mibif *upper);
struct mibrcvaddr *
mib_find_rcvaddr( u_int ifindex, const u_char *addr, size_t addrlen);
struct mibrcvaddr *
mib_rcvaddr_create( struct mibif *ifp, const u_char *addr, size_t addrlen);
void
mib_rcvaddr_delete( struct mibrcvaddr *addr);
void *
mibif_notify( struct mibif *ifp, const struct lmodule *mod, mibif_notify_f func, void *uarg);
void
mibif_unnotify( void *reg);
解説
snmp_mibII モジュールはインターネット規格の MIB-2 の部分を実装します。関連 MIB の大部分は実装されています。いくつかのテーブルは、読み込み書き込みの代わりに読み込み専用となるように制限されています。正確な現在の実装は /usr/share/snmp/defs/mibII_tree.def で見つけることができます。また、モジュールは他のモジュールで使用されるために、ネットワークインタフェースを操作するために必要な、多くの関数とグローバル変数をエクスポートします。このマニュアルページはこれらの関数について説明しています。ダイレクトネットワークアクセス
mibII モジュールは、すべてのネットワークに関連する ioctl(2) 関数を実行するために使用される、ソケットをオープンします。このソケットは mib_netsock という名前でグローバルに利用可能です。ネットワークインタフェース
mibII モジュールはすべての現在既存のネットワークインタフェースのリストを取り扱います。インタフェースリストを変更するイベントに登録するためのメカニズムを提供することによって、他のモジュールが、特別な情報でそれら自体のインタフェースリストを取り扱いできるようにします (下記参照)。基本データ構造体は次のインタフェース構造体です:
struct mibif { TAILQ_ENTRY(mibif) link; u_int flags; u_int index; /* 論理的な ifindex */ u_int sysindex; char name[IFNAMSIZ]; char descr[256]; struct ifmibdata mib; uint64_t mibtick; void *specmib; size_t specmiblen; u_char *physaddr; u_int physaddrlen; int has_connector; int trap_enable; uint64_t counter_disc; mibif_notify_f xnotify; void *xnotify_data; const struct lmodule *xnotify_mod; struct asn_oid spec_oid; };
mibII モジュールは、 ifIndex があるなら RFC-2863 で説明されるようなセマンティックを実装しようと試みます。この RFC は、インタフェースのインデックスが再利用されないかもしれないと述べています。例えば tun が統合的なインタフェースタイプであり、システムがインタフェース tun0 を作成し、このインタフェースを破壊し、再び tun 0 を作成するなら、事実上、それらが異なったインタフェースであるので、これらのインタフェースは、異なったインタフェースインデックスがなければならないことを意味します。他方では、ハードウェアインタフェース xl0 があり、このインタフェースが見えなくなるなら、ドライバがアンロードされて再び現れ、そしてドライバが再びロードされるので、インタフェースインデックスは同じ状態でとどまなければなりません。 mibII は、実際と総合的な (ダイナミックな) インタフェースを区別することによって、これを実装します。インタフェースタイプは、インタフェースタイプがあるなら (例えば、“tun”) 名前で関数 mib_if_set_dyn() を呼び出すことによってダイナミックに宣言することができます。実際のインタフェースに関して、モジュールはインタフェースがアンロードされるなら、特別なリスト中のインタフェース名とその ifIndex の間のマッピングを保持します。ダイナミックなインタフェースに関して、新しい ifIndex はインタフェースが発生するたびに生成されます。 SNMP によって見られるようなインタフェースインデックスは、システムによって使用される同じインデックスではないことを意味します。 SNMP ifIndex はフィールド index で保持されて、システムのインタフェースインデックスは sysindex です。
mib_refresh_iflist への呼び出しで、全体のインタフェースリストを再作成します。
インタフェースリストは、関数 mib_first_if() と mib_next_if() で横断することができます。これらの 2 つの呼び出しでリストを横断している間は、インタフェースリストを決して変更しないでください。
名前またはインデックスによってインタフェースを見つけるための 3 つの関数があります。 mib_find_if() は、SNMP ifIndex を検索することによってインタフェースを見つけ、 mib_find_if_sys() はシステムインタフェースインデックスを検索することによってインタフェースを見つけ、そして、 mib_find_if_name() はインタフェース名を検索することによってインタフェースを見つけます。それぞれの関数はインタフェースを見つけることができないなら、 NULL
を返します。
関数 mib_fetch_ifmib() はカーネルからインタフェース MIB をリフレッシュさせます。
関数 mib_if_admin() はインタフェースの管理状態を上げる (引数は、1 です) か下げる (引数は、0 です) ために使用することができます。
インタフェースイベント
モジュールは、新しいエントリがインタフェースリストに作成されるとき、通知を受信するためにそれ自体を登録することができます。 mib_register_newif() を呼び出すことによって、これは行われます。モジュールは、1 つの関数しか登録することができないで、 mib_register_newif() への 2 番目の呼び出しは登録を上書きします。登録は mib_unregister_newif() への呼び出しで取り除くことができます。登録モジュールがアンロードされるとき、自動的に登録を取り消されます。また、モジュールは特定のインタフェースでイベントを登録することができます。 mibif_notify() を呼び出すことによって、これは行われます。これで、次のイベントのいずれかが起こるとき、インタフェースポインタ、通知コード、とユーザ引数 uarg で与えられたコールバック func を呼び出します:
-
MIBIF_NOTIFY_DESTROY
- インタフェースは破壊されます。
このメカニズムは他のモジュールでインタフェースタイプ特有の MIB の部品を実装するために使用することができます。登録は mib_notify から返された値である mib_unnotify() で取り除くことができます。どんな通知登録もインタフェースが破壊されるか、または登録モジュールがアンロードされるとき、自動的に取り除かれます。 1 つのモジュールしか与えられたどんなインタフェースにも登録できないことに注意してください。
インタフェースアドレス
mibII モジュールはインタフェース IP アドレスのテーブルを取り扱います。これらのアドレスは次の構造体に保持されます。
struct mibifa { TAILQ_ENTRY(mibifa) link; struct in_addr inaddr; struct in_addr inmask; struct in_addr inbcast; struct asn_oid index; u_int ifindex; u_int flags; };
与えられたインタフェースでの IP アドレスの (順序付けられた) リストは mib_first_ififa() と mib_next_ififa() を呼び出すことによって、横断することができます。リストは読み込み専用と見なすべきではありません。
インタフェース受信アドレス
インターネット MIB-2 はインタフェース受信アドレスのテーブルを含んでいます。これらのアドレスは次の構造体で取り扱われます:
struct mibrcvaddr { TAILQ_ENTRY(mibrcvaddr) link; struct asn_oid index; u_int ifindex; u_char addr[ASN_MAXOIDLEN]; size_t addrlen; u_int flags; }; enum { MIBRCVADDR_VOLATILE = 0x00000001, MIBRCVADDR_BCAST = 0x00000002, MIBRCVADDR_HW = 0x00000004, };
MIBRCVADDR_BCAST
の代入は知られているインタフェースタイプのリストに基づいていることに注意してください。フラグはインタフェースタイプの等有の MIB を実装するモジュールで取り扱われるべきです。
受信アドレスは mib_rcvaddr_create() で作成することができ、 mib_rcvaddr_delete() で削除することができます。これは、システムによって自動的に取り扱われないアドレスのためだけに行う必要があります。
受信アドレスは mib_find_rcvaddr() で見つけることができます。
インタフェーススタックテーブル
また、 mibII モジュールはインタフェーススタックテーブルを保守します。複雑なスタックのために、この情報を得るシステムでサポートされた一般的な方法がないので、インタフェース特有のモジュールはスタックエントリを設定するのを手助けする必要があります。 mibII モジュールは上部と下部のエントリだけを取り扱います。テーブルエントリは、 mib_ifstack_create() で作成されて、 mib_ifstack_delete() で削除されます。両方の関数はインタフェースへのポインタを必要とします。エントリのインタフェースのいずれかが破壊されるなら、エントリは自動的に削除されます。関数はスタックテーブルと逆のスタックテーブルの両方を取り扱います。
関連ファイル
- /usr/share/snmp/defs/mibII_tree.def
- mibII によって実装された MIB ツリーの記述。
- /usr/local/share/snmp/mibs
- /usr/share/snmp/mibs/
- さまざまなインターネット MIB。
規格
この実装は適切な IETF RFC に適合しています。作者
<harti@FreeBSD.org>October 4, 2005 | FreeBSD |