EN JA
SNMP_NETGRAPH(3)
SNMP_NETGRAPH(3) FreeBSD Library Functions Manual SNMP_NETGRAPH(3)

名称

snmp_netgraph, snmp_node, snmp_nodename, ng_cookie_f, ng_hook_f, ng_register_cookie, ng_unregister_cookie, ng_register_hook, ng_unregister_hook, ng_unregister_module, ng_output, ng_output_node, ng_output_id, ng_dialog, ng_dialog_node, ng_dialog_id, ng_send_data, ng_mkpeer_id, ng_connect_node, ng_connect_id, ng_connect2_id, ng_connect2_tee_id, ng_rmhook, ng_rmhook_id, ng_rmhook_tee_id, ng_shutdown_id, ng_next_node_id, ng_node_id, ng_node_id_node, ng_node_name, ng_node_type, ng_peer_hook_idsnmpd のための netgraph モジュール

ライブラリ

(begemotSnmpdModulePath."netgraph" = /usr/lib/snmp_netgraph.so)

書式

#include < bsnmp/snmpmod.h>
#include < bsnmp/snmp_netgraph.h>

extern ng_ID_t snmp_node;
extern u_char *snmp_nodename;

typedef void
ng_cookie_f( const struct ng_mesg *mesg, const char *path, ng_ID_t id, void *uarg);

typedef void
ng_hook_f( const char *hook, const u_char *mesg, size_t len, void *uarg);

void *
ng_register_cookie( const struct lmodule *mod, uint32_t cookie, ng_ID_t id, ng_cookie_f *func, void *uarg);

void
ng_unregister_cookie( void *reg);

void *
ng_register_hook( const struct lmodule *mod, const char *hook, ng_hook_f *func, void *uarg);

void
ng_unregister_hook( void *reg);

void
ng_unregister_module( const struct lmodule *mod);

int
ng_output( const char *path, u_int cookie, u_int opcode, const void *arg, size_t arglen);

int
ng_output_node( const char *node, u_int cookie, u_int opcode, const void *arg, size_t arglen);

int
ng_output_id( ng_ID_t node, u_int cookie, u_int opcode, const void *arg, size_t arglen);

struct ng_mesg *
ng_dialog( const char *path, u_int cookie, u_int opcode, const void *arg, size_t arglen);

struct ng_mesg *
ng_dialog_node( const char *node, u_int cookie, u_int opcode, const void *arg, size_t arglen);

struct ng_mesg *
ng_dialog_id( ng_ID_t id, u_int cookie, u_int opcode, const void *arg, size_t arglen);

int
ng_send_data( const char *hook, const void *sndbuf, size_t sndlen);

ng_ID_t
ng_mkpeer_id( ng_ID_t id, const char *name, const char *type, const char *hook, const char *peerhook);

int
ng_connect_node( const char *node, const char *ourhook, const char *peerhook);

int
ng_connect_id( ng_ID_t id, const char *ourhook, const char *peerhook);

int
ng_connect2_id( ng_ID_t id, ng_ID_t peer, const char *ourhook, const char *peerhook);

int
ng_connect2_tee_id( ng_ID_t id, ng_ID_t peer, const char *ourhook, const char *peerhook);

int
ng_rmhook( const char *ourhook);

int
ng_rmhook_id( ng_ID_t id, const char *hook);

int
ng_rmhook_tee_id( ng_ID_t id, const char *hook);

int
ng_shutdown_id( ng_ID_t id);

ng_ID_t
ng_next_node_id( ng_ID_t node, const char *type, const char *hook);

ng_ID_t
ng_node_id( const char *path);

ng_ID_t
ng_node_id_node( const char *node);

ng_ID_t
ng_node_name( ng_ID_t id, char *name);

ng_ID_t
ng_node_type( ng_ID_t id, char *type);

int
ng_peer_hook_id( ng_ID_t id, const char *hook, char *peerhook);

解説

snmp_netgraph モジュールは、netgraph サブシステムへのリモートアクセスを可能にする多くのテーブルとスカラを実装します。また、それは、他のモジュールが容易に netgraph システムを使用するのを可能とする多くのグローバル変数と関数をエクスポートします。

モジュールの開始時に変数 begemotNgControlNodeName が空でないなら、モジュールは、netgraph ソケットをオープンし、ソケットノードに名前を付けます。変数が空であるなら、変数が空でない名前で書き込まれるとすぐに、ソケットは作成されます。ソケットは変数に空の文字列を書き込むことによって、クローズすることができます。ソケット自体とその名前は、 snmp_nodesnmp_nodename で利用可能です。

メッセージとデータの送受信

送信コントロール (制御) メッセージのための 3 つの関数があります:
ng_output()
与えられた path に従ってコントロールメッセージを送信します。
ng_output_node()
コントロールメッセージを node という名前のノードに送信します。
ng_output_id()
コントロールメッセージをノード ID id のノードに送信します。

これらの関数のそれぞれは次の引数を取ります:

cookie
はノード特有のコマンドクッキーです。
opcode
は実行する操作のためのノード特有のコードです。
arg
はメッセージ自体へのポインタです。このメッセージは、 struct ng_mesg で始まらなければなりません。
arglen
はメッセージ (ヘッダと引数) の全体の長さです。

関数は着信応答に適合するために使用することができるメッセージ ID を返し、エラーが発生したなら、-1 を返します。

関数の別のクラスは、コントロールメッセージを送信して、適合する応答を待つために使用されます。この操作はデーモンをブロックするので、利用者が応答が起こるのを確信している場合にだけ、それを使用することに注意してください。 MIB 変数 begemotNgTimeout で設定可能な最大のタイムアウトがあります。関数が応答を待っている間に到着する他のメッセージは、モジュールのアイドル関数への次の呼び出し時に、キューに入れられ、配信されます。

ng_dialog()
与えられた path に従ってコントロールメッセージを送信し、適合する応答を待ちます。
ng_dialog_node()
コントロールメッセージを node と名前が付けられたノードに送信して、適合する応答を待ちます。
ng_dialog_id()
コントロールメッセージを ID id のノードに送信し、適合する応答を待ちます。

すべての 3 つの関数は、 ng_output*() 関数として同じ引数を取ります。関数は、 malloc(3) よって割り付けられたバッファ中に応答メッセージを返し、エラーの場合は、NULL を返します。応答バッファの最大サイズは変数 begemotNgResBufSiz で設定することができます。

データメッセージは関数 ng_send_data() で送信することができます。この関数はデータを送信する snmp_node のフックの名前、メッセージバッファへのポインタ、とメッセージのサイズを取ります。エラー起こるなら、-1 を返します。

非同期制御とデータメッセージ

モジュールは、非同期的にコントロールとデータメッセージを受信するための関数を登録することができます。

関数 ng_register_cookie() はコントロールメッセージ受信関数を登録します。コントロールメッセージが受信され、すなわち、ダイアログ関数によって消費されていないなら、登録されたコントロールメッセージ受信関数がスキャンされます。受信されたメッセージのクッキーが ng_register_cookie() 呼び出しへの cookie 引数と同じで ng_register_cookie() 呼び出しへの id 引数が 0 か、またはコントロールメッセージを送信したノード ID と等しいなら、ハンドラ関数 func は受信されたメッセージへのポインタ、メッセージが受信された (または、フック上で受信されないなら、NULLの) フック、送信者のノードの ID、および登録呼び出しの uarg 引数で呼び出されます。ハンドラ関数は、複数の関数がが同じクッキーとノード ID で登録されるかもしれないので、メッセージの内容を変更するべきではありません、

コントロールメッセージ登録は、登録呼び出しの返り値で ng_unregister_cookie() を呼び出すことによってを登録を取り消すことができます。登録している間のエラーが起こるなら、 ng_register_cookie() は、NULL を返します。

モジュールは、 snmp_node のフックの 1 つでデータメッセージのためのコールバックを登録するために ng_register_hook() を呼び出すことができます。そのフックでデータメッセージを受信するなら、フック名、データメッセージへのポインタ、メッセージのサイズ、および登録関数への引数 uarg でコールバック関数 func は呼び出されます。メッセージは読み込み専用として取り扱われるべきです。データメッセージ登録は、登録呼び出しの返り値で ng_unregister_hook() を呼び出すことによってを登録を取り消すことができます。登録している間のエラーが起こるなら、 ng_register_hook() は、NULL を返します。

関数 ng_unregister_module() はそのモジュールのためのすべてのコントロールとデータ登録を取り除きます。

ノードとノードの特性を見つける

関数 ng_node_id() は、 path によってアドレス指定されたノードの ID を返し、ノードが存在しないなら、0 を返します。

関数 ng_node_id_node() は、 node と名前がつけられたノードの ID を返すか、ノードが存在しないなら、0 を返します。

関数 ng_node_node() は、ID id でノードの名前を検索して、 name によって指されたバッファにそれを書き込みます。このバッファの長さは少なくとも NG_NODESIZ バイトであるべきです。関数はノードの ID を返し、ノードが見つけられないなら、0 を返します。

関数 ng_node_type() は、ID id でノードの名前を検索して、 type によって指されたバッファにそれを書き込みます。このバッファの長さは少なくとも NG_TYPESIZ バイトであるべきです。関数はノードの ID を返し、ノードが見つけられないなら、0 を返します。

関数 ng_peer_hook_id() は、 id のノードでフック hook のピア (通信相手) のフックの名前を peer_hook によって指されたバッファに書き込みます。このバッファの長さは少なくとも NG_HOOKSIZ バイトであるべきです。関数はノードとフックが見つかったなら、0 を返し、そうでなければ、-1 を返します。関数は中間の tee ノードをスキップします ( ng_tee(4) 参照)。

関数 ng_next_node_id() はノード id のフック hook の反対側にあるピアノードのノード ID を返します。 type が NULL でないなら、関数はピアノードのタイプが type であるチェックします。関数は中間の tee ノードをスキップします ( ng_tee(4) 参照)。それはピアノードのノード ID を返すか、エラーが起こるか、またはタイプが適合しないなら、0 を返します。

グラフを変更する

多くの関数はノードとフックを作成するか、または破壊するために使用することができます。

関数 ng_mkpeer_id() はフック peerhook がノード idhook に接続されるタイプ type の新しいノードを作成します。 name が NULL でないなら、新しいノードはこの名前で名前が付けられます。関数は新しいノードのノードの ID を返し、エラーが起こったなら、0 を返します。

関数 ng_connect_node() と ng_connect_id() は、 ID id か名前 node によって識別されるノードの peerhook へのモジュールソケットノード snmp_node の新しいフック接続 ourhook を作成します。関数は成功すれば、0 を返し、そうでなければ、-1 を返します。

関数 ng_connect2_id() は、ID id でノードのフック ourhook を ID peer でノードのフック peerhook に接続します。関数は成功すれば、0 を返し、そうでなければ、-1 を返します。関数 ng_connect2_tee_id() は、2 つのノードの間に無名の tee ノードを置くことを除いて、 ng_connect2_id() と同じです。

関数 ng_rmhook() は、モジュールの snmp_node 上でフック hook を取り除きます。関数 ng_rmhook_id() は、ID id のノード上でフック hook を取り除きます。さらに、関数 ng_rmhook_tee_id() は、ノードと最初の tee でないピアの間のすべての tee ノードをシャットダウンします。

関数 ng_shutdown_id() は、与えられたノードを破壊します。

関連ファイル

/usr/share/bsnmp/defs/netgraph_tree.def
snmp_netgraph によって実装された MIB ツリーの説明。
/usr/share/bsnmp/mibs/BEGEMOT-NETGRAPH.txt
これは、このモジュールで実装された MIB です。

関連項目

gensnmptree(1), snmpmod(3)

作者

Hartmut Brandt <harti@FreeBSD.org>
November 14, 2003 FreeBSD