この章では、C Statistics API によって定義されている関数のリファレンス情報をアルファベット順に示します。C Statistics API の使用方法については、第 3 章「C Statistics API の使用」を参照してください。
ba_close() - ドライバファイルを閉じて、イベントマスクをリセットします。
#include <netinet/ba_stat.h> int ba_close();
ba_close() 関数は、ドライバファイル /dev/ipqos を閉じ、イベントマスクをそのデフォルト値 (0) にリセットします。このファイルは、C Statistics API を通したその次の関数呼び出しによって再び自動的に開かれます。
ba_close() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_close() 呼び出しの際にエラーが発生すると、変数 ba_errno は次のように設定されます。
|
BA_SYSERR |
OS エラー: エラー番号 (errno) をチェックしてください。 |
ba_decode_ifname() - 物理的なインタフェース名と通信方向を抽出します。
#include <netinet/ba_stat.h> int ba_decode_ifname( const char *ifname, /*bandwidth manager interface name*/ char *interface, /*physical interface*/ uint_t *direction /*traffic direction*/ );
ba_decode_ifname() 関数は、Solaris Bandwidth Manager インタフェース名 ifname から、インタフェースによって処理されるトラフィックの物理的なインタフェース名 interface と通信方向を抽出します。たとえば、ifname に le0_in が含まれている場合、インタフェースは le0 で、通信方向は BA_DIR_INCOMING です。
ba_decode_ifname() 関数には次の引数を渡します。
|
ifname |
コード化されたインタフェース名 (le0_in など) を含む文字列を指すポインタ |
|
interface |
デコード化された物理的なインタフェース名を指すポインタ。必ず十分なメモリーを割り当ててください。 |
|
direction |
デコード化された通信方向を指すポインタ |
ba_decode_ifname() 関数は、正常に終了した場合には書き込まれた文字数、エラー時には -1 を返します。
ba_decode_ifname() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_disable_signal() - シグナル機構を無効にします。
#include <netinet/ba_stat.h> int ba_disable_signal();
ba_disable_signal() 関数は、ipqos モジュールがユーザープロセスにシグナルを直接送信するために使用するシグナル機構を無効にします。
ba_disable_signal() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_disable_signal() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_enable_signal() - シグナル機構を有効にします。
#include <netinet/ba_stat.h> int ba_enable_signal ( int signo );
ba_enable_signal() 関数は、ipqos モジュールがユーザープロセスにシグナルを直接送信するために使用するシグナル機構を有効にします。
signal(3C) ライブラリ呼び出しを使用する場合、2 つのシグナルが同時に送信されるとシグナルの一部が消失する場合があります。シグナルハンドラでは、シグナルハンドラから戻る前に保留状態のイベントをすべて処理するようにしてください。
ba_enable_signal() 関数には次の引数を渡します。
|
signo |
整数のシグナル値。signo の現在有効な値については、signal(5) のマニュアルページを参照してください。 |
ba_enable_signal() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_enable_signal() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_encode_ifname() - Solaris Bandwidth Manager のインタフェース名を生成します。
#include <netinet/ba_stat.h> int ba_encode_ifname( const char *interface, /*interface name*/ const uint_t direction, /*traffic direction*/ char *ifname );
ba_encode_ifname() 関数は、物理的なインタフェース名 interface と通信方向から、インタフェースによって扱われるインタフェース名 ifname を生成します。たとえば、インタフェースが le0 で方向が BA_DIR_INCOMING の場合、ifname は le0_in になります。
ba_encode_ifname() 関数には次の引数を渡します。
|
interface |
管理されるインタフェース名が入った文字列を指すポインタ (le0、hme0 など) |
|
direction |
インタフェース方向 (BA_DIR_INCOMING または BA_DIR_OUTGOING) を示す整数 |
|
ifname |
コード化されたインタフェース名を指すポインタ。十分なメモリーを割り当ててください。 |
ba_encode_ifname() 関数は、正常に終了した場合には書き込まれた文字数、エラー時には -1 を返します。
ba_encode_ifname() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_free() - バッファーに割り当てられたメモリーを解放します。
#include <netinet/ba_stat.h> void ba_free (int *ptr);
ba_free() 関数は、指定されたバッファーを解放します。この関数は、free() システム関数に同等です。バッファーは、ba_list_interface_config()、ba_list_classes()、または ba_get_flow_stats() 関数の 1 つで割り当てられていなければなりません。
ba_free() 関数には次の引数を渡します。
|
ptr |
解放されるバッファーを指すポインタ |
ba_get_class_stats() - 指定されたクラスの統計情報を取得します。
#include <netinet/ba_stat.h> int ba_get_class_stats ( const char *interface, const char *classname, ba_class_stats_t *stats );
ba_get_class_stats() 関数は、指定された管理対象インタフェースの指定されたクラスについての統計情報を取得します。返される情報は次のとおりです。
送信されたパケット数
送信されたバイト数
帯域幅の借用が試みられた回数
破棄されたパケット数
破棄されたバイト数
ba_get_class_stats() 関数には次の引数を渡します。
|
interface |
管理されるインタフェース名が入った文字列を指すポインタ (le0、hme0 など)。クラス情報を取得する通信方向を指定するには、インタフェース名に _in または _out を追加する。通信方向を省略した場合には、_out が追加されたと見なされる |
|
classname |
クラス名が入った文字列を指すポインタ |
|
stats |
ba_class_stats_t 型の構造体を指すポインタ。これは、指定されたクラスの統計情報が書き込まれるバッファーである |
ba_class_stats_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t interface; /* name and direction of the interface */
ba_name_t classname; /* name of the class */
u_int npackets; /* packets sent in this class */
u_int nbytes; /* bytes sent in this class */
u_int borrows; /* # times tried to borrow */
u_int drops; /* packets dropped */
u_int bdrops; /* bytes dropped */
hrtime_t lastseen; /* timestamp of last packet sent */
*/
} ba_class_stats_t;
|
バッファーには、静的にあるいは動的に十分なメモリーを割り当てる必要があります。次に例を示します。
/* static allocation */
{
class_stats_t stats;
if (ba_get_class_stats("hme0", "root", &stats) != -1) {
printf("Number of bytes sent: %d¥n", stats.nbytes);
} else {
/* error handling */
}
}
/* dynamic allocation */
{
class_stats_t *statsp;
statsp = (class_stats_t *) malloc(sizeof class_stats_t);
if (ba_get_class_stats("hme0", "root", statsp) != -1) {
printf("Number of bytes sent: %d¥n", statsp->nbytes);
} else {
/* error handling */
}
}
|
ba_get_class_stats() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_get_class_stats() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_get_event_mask() - イベントマスクを取得します。
#include <netinet/ba_stat.h> int ba_get_event_mask();
ba_get_event_mask() 関数は、現在のイベントマスクを取得します。
ba_get_event_mask() 関数は、正常に終了した場合にはイベントマスク、エラー時には -1 を返します。
ba_set_event_mask() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_get_flow_stats() - 指定されたクラス内のフローの統計情報を取得します。
#include <netinet/ba_stat.h> int ba_get_flow_stats ( const char *interface, const char *classname, ba_flow_stats_t **flow_stats );
ba_get_flow_stats() 関数は、指定された管理対象インタフェースの指定されたクラスに関連付けられたフローについての統計情報を取得します。
ba_get_flow_stats() 関数には次の引数を渡します。
|
interface |
管理されるインタフェース名を含む文字列を指すポインタ (le0、hme0 など)。クラス情報を取得する通信方向を指定するには、インタフェース名に _in または _out を追加する。通信方向を省略した場合には、_out が追加されたと見なされる |
|
classname |
クラス名が入った文字列を指すポインタ |
|
flow_stats |
ba_flow_stats_t 型の構造体を指すポインタ。これは、フローの統計情報が書き込まれるバッファーである |
ba_flow_stats_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t interface; /* name of the interface */
/* suffixed with _in or _out */
ba_name_t classname; /* name of the class */
struct in_addr ip_local; /* local IP address */
struct in_addr ip_remote; /* remote IP address */
uchar_t protocol; /* protocol */
ushort_t port_local; /* localport number */
ushort_t port_remote; /* remoteport number */
uchar_t tos_sent; /* TOS value */
uint_t npackets; /* number of incoming packets */
uint_t nbytes; /* number of incoming bytes */
uint_t url_length; /* length of the URL string */
union {
uchar_t *url;
u_longlong_t url_pad;
} url_union;
hrtime_t firstseen; /* timestamp of first packet sent (ns)*/
hrtime_t lastseen; /* timestamp of last packet sent (ns) */
} ba_flow_stats_t;
|
ba_get_flow_stats() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_get_flow_stats() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_get_interface_config() - インタフェースの設定情報を取得します。
#include <netinet/ba_stat.h> int ba_get_interface_config( const char *interface, /*interface name*/ ba_interface_t *config /*configuration information*/ );
ba_get_interface_config() 関数は、指定されたインタフェースの設定情報を取得します。
ba_get_interface_config() 関数には次の引数を渡します。
|
interface |
管理されるインタフェース名を含む文字列を指すポインタ (le0、hme0 など) |
ba_interface_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t name_suffix;
uint_t activate;
uint_t rate;
} ba_interface_t;
|
name_suffix は、インタフェースが着信トラフィックを処理することを示す in、または発信トラフィックを処理することを示す out のどちらかです。
ba_get_interface_config() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_get_interface_config() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_get_next_event() - イベントについての情報を取得します。
#include <netinet/ba_stat.h> int ba_get_next_event ( ba_event_t *event, int blocking );
ba_get_next_event() 関数は、FIFO バッファー内で待ち行列に入っている次のイベントについての情報を取得します。この関数は、ブロックモードまたは非ブロックモードで呼び出すことができます。
ブロックモードでは、ba_get_next_event() はバッファー内にイベントが格納されるまで待ってから戻ります。
非ブロックモードでは、ba_get_next_event() はイベントを正常に戻すか、あるいはバッファーが空の場合は -1 を返し、ba_errno を BA_SYSERR に設定し、errno を EWOULDBLOCK (EAGAIN) に設定します。
ba_get_next_event() 関数には次の引数を渡します。
|
event |
FIFO バッファー内の次のイベントについての情報が入った ba_event_t 型の構造体を指すポインタ |
|
blocking |
ブロックモードまたは非ブロックモードを設定する整数。値ゼロはブロックモードを有効にし、ゼロ以外の値は非ブロックモードを有効にする |
ba_event_t 型の構造体は次のように定義されています。
typedef struct {
uint_t ba_event_type;
uint_t ba_event_drops;
union {
struct {
ba_name_t ba_event_iface;
ba_name_t ba_event_info;
} ba_event_config;
struct {
ba_name_t ba_flow_iface;
uint_t ba_num_flows;
ba_flow_event_t ba_event_flows[BA_EVENT_MAX_FLOWS];
} ba_event_flow;
ba_class_stats_t ba_event_stats;
/* the following is for Bandwidth Manager internal use only */
ba_filter_event_t ba_event_filter;
ba_cl_filter_event_t ba_event_cl_filter;
} ba_event_union;
} ba_event_t;
|
ba_event_t 型の構造体の要素は次のように設定されます。
|
ba_event_type |
発生したイベントタイプを識別できるように設定される。可能な値については、表 3-1 を参照してください。 |
|
ba_event_iface |
イベントが発生したインタフェースを識別できるように設定される。イベントの型が、BA_EVENT_CONFIG_STARTING または BA_EVENT_CONFIG_ENDING の場合は、再設定されたインタフェース名が設定され、BA_EVENT_DAEMON_ENDING の場合は、空文字列が設定される。 |
|
ba_event_info |
将来使用するために予約されている |
ba_flow_event_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t classname_in;
ba_name_t classname_out;
struct in_addr ip_local;
struct in_addr ip_remote;
uchar_t protocol;
ushort_t port_local;
ushort_t port_remote;
uchar_t tos_sent_in;
uchar_t tos_sent_out;
uint_t npackets_in;
uint_t nbytes_in;
uint_t npackets_out;
uint_t nbytes_out;
uint_t url_length;
union {
uchar_t *url;
u_longlong_t url_pad;} url_union;
hrtime_t firstseen_in; /* timestamp of first packet sent (ns)*/
hrtime_t lastseen_in; /* timestamp of last packet sent (ns) */
hrtime_t firstseen_out;/* timestamp of first packet sent (ns)*/
hrtime_t lastseen_out; /* timestamp of last packet sent (ns) */
} ba_flow_event_t;
#define ba_flow_url url_union.url
|
ba_get_next_event() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_get_next_event() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_get_num_classes() - 管理されているインタフェースのクラス数を取得します。
#include <netinet/ba_stat.h> int ba_get_num_classes ( const char *interface /* interface name*/ );
ba_get_num_classes() 関数は、管理されているインタフェースごとに設定されているクラス数を取得します。
ba_get_num_classes() 関数には次の引数を渡します。
|
interface |
管理されるインタフェース名が入った文字列を指すポインタ (le0、hme0 など)。クラス情報を取得する通信方向を指定するには、インタフェース名に _in または _out を追加する。通信方向を省略した場合には、_out が追加されたと見なされる |
ba_get_num_classes() 関数は、正常に終了した場合にはクラス数、エラー時には -1 を返します。
ba_get_num_classes() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_get_num_interfaces() - 管理されているインタフェース数を取得します。
#include <netinet/ba_stat.h> int ba_get_num_interfaces();
ba_get_num_interfaces() 関数は、ポリシーエージェントに管理対象として設定されているインタフェースの合計数を取得します。
ba_get_num_interfaces() 関数は、正常に終了した場合にはインタフェース数、エラー時には -1 を返します。
ba_get_num_interfaces() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_list_class_names() - 管理されているインタフェースのクラス名を取得します。
#include <netinet/ba_stat.h> int ba_list_class_names ( const char *interface, /* interface name: le0, hme0, ... */ ba_class_pair_t *classes /* allocate buffer */ );
ba_list_class_names() 関数は、指定された管理対象インタフェースについて、設定されているすべてのクラス名とそれらの親のリストを取得します。root クラスの親は root です。
ba_list_class_names() 関数には次の引数を渡します。
|
interface |
管理されているインタフェース名が入った文字列を指すポインタ (le0、hih0、hme0 など) |
|
classes |
ba_class_pair_t 型の構造体の配列を指すポインタ。これは、クラス名が書き込まれるバッファーである。クラスと親のペアごとに構造体が 1 つ存在する |
ba_class_pair_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t parent; /* name of the parent */
ba_name_t child; /* name of the class */
} ba_class_pair_t;
|
ba_class_pair_t 型の構造体には、次のように定義されている ba_name_t 型の構造体のペアが入ります。
typedef struct {
char name[BA_NAMES_LEN + 1];
char padding[3];
u_short namelen;
char padding2[2];
} ba_name_t;
|
バッファーには、常にクラスの数に応じた十分なメモリーを割り当てる必要があります。次に例を示します。
int nclasses;
ba_class_pairs_t *classesp;
nclasses = ba_get_num_classes("hme0");
if (nclasses > 0) {
classesp = (ba_class_pairs_t *) calloc(nclasses,sizeof ba_class_pairs_t);
if (ba_list_class_names("hme0", classesp) != -1) {
/* process classesp ... */
} else {
/* error handling */
}
free(classesp);
}
|
ba_list_class_names() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_get_list_class_names() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_list_classes() - 指定されたクラスの子クラスを取得します。
#include <netinet/ba_stat.h> int ba_list_classes ( const char *interface_suffix, /* interface name */ const char *classname, /* class name */ ba_class_pair_t **classes /* array containing information requested */ );
ba_list_classes() 関数は、 指定されたクラスの親クラスと子クラスの名前のリストを取得します。これらは親子ペアの配列で返され、指定されたクラス名を含みます。root クラスの親は root です。
ba_list_classes() 関数には次の引数を渡します。
|
interface |
le0_suffix、hme0_suffix など、管理されているインタフェース名が入った文字列を指すポインタ。suffix は、インタフェースが着信トラフィックを処理することを示す in、または発信トラフィックを処理することを示す out のどちらか |
|
classname |
情報を必要としているクラス名が入った文字列を指すポインタ |
|
classes |
親クラスと子クラスの名前が入った、ba_class_pair_t 型の構造体の配列を指すポインタ。親子ペアごとに構造体が 1 つ存在する メモリーは自動的に割り当てられる。メモリーが不要になった時点で ba_free() を呼び出す必要がある |
ba_class_pair_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t parent; /* name of the parent */
ba_name_t child; /* name of the class */
} ba_class_pair_t;
|
ba_class_pair_t 型の構造体には、次のように定義される ba_name_t 型の構造体のペアが入ります。
typedef struct {
char name[BA_NAMES_LEN + 1];
char padding[3];
u_short namelen;
char padding2[2];
} ba_name_t;
|
ba_list_classes() 関数は、正常に終了した場合にはクラス数、エラー時には -1 を返します。
ba_list_classes() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_list_interface_config() - 管理されているすべてのインタフェースの設定情報を取得します。
#include <netinet/ba_stat.h> int ba_list_interface_config( ba_interface_t *interfaces /*interface information*/ );
ba_list_interface_config() 関数は、管理されているすべてのインタフェースの設定情報を取得します。
ba_interface_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t name_suffix;
uint_t activate;
uint_t rate;
} ba_interface_t;
|
name_suffix は、インタフェースが着信トラフィックを処理することを示す in、または発信トラフィックを処理することを示す out のどちらかです。
バッファーには、常にインタフェースの数に応じた十分なメモリーを割り当てる必要があります。
ba_list_interface_config() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_list_interface_config() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_list_interfaces() - 管理されているインタフェース名を取得します。
#include <netinet/ba_stat.h> int ba_list_interfaces ( ba_name_t *interfaces /* allocate buffer */ );
ba_list_interfaces() 関数は、ポリシーエージェントに管理対象として設定されているインタフェース名のリストを取得します。
ba_list_interfaces() 関数には次の引数を渡します。
|
interfaces |
ba_name_t 型の構造体の配列を指すポインタ。これは、インタフェース名が書き込まれるバッファーである。名前ごとに構造体が 1 つ存在する |
ba_name_t 型の構造体は次のように定義されています。
typedef struct {
char name[BA_NAMES_LEN + 1];
char padding[3];
u_short namelen;
char padding2[2];
} ba_name_t;
|
バッファーには、常にクラスの数に応じた十分なメモリーを割り当てる必要があります。次に例を示します。
nintface = ba_get_num_interfaces();
if (nintface > 0) {
interfaces = (ba_name_t *) calloc(nintface, sizeof ba_name_t);
if (ba_list_interfaces(interfaces) != -1) {
/* process interfaces .. */
} else {
/* error handling */
}
free(interfaces);
}
|
ba_list_interfaces() 関数は、正常に終了した場合にはインタフェース数、エラー時には -1 を返します。
ba_list_interfaces() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_open() - ドライバファイルを開き、ファイル記述子を取得します。
#include <netinet/ba_stat.h> int ba_open();
ba_open() 関数は、ipqos モジュールのアクセスに使用されるドライバファイル /dev/ipqos を開き、ファイル記述子を返します。ipqos モジュールのインスタンスは、ユーザープロセスあたり 1 つしか存在できません。そのため、以前の関数呼び出しでそのファイルがすでに開かれている場合は、ba_open() は現在のファイル記述子を返します。
ba_close() 呼び出しによってデバイスドライバがすでに閉じられている場合は、イベントマスクはデフォルト値 (0) にリセットされています。ba_get_next_event() によってイベントを検出するには、イベントマスクを再設定する必要があります。
ba_open() 関数は、正常に終了した場合にはファイル記述子、エラー時には -1 を返します。
ba_open() 呼び出しの際にエラーが発生すると、変数 ba_errno は次のように設定されます。
|
BA_SYSERR |
OS エラー: エラー番号 (errno) をチェックしてください。 |
#include <netinet/ba_stat.h> void ba_perror(const char *msgstr);
ba_perror() 関数は、C Statistics API の呼び出しの際に遭遇した最後のエラーについて説明するメッセージを標準エラー出力に送ります。この関数は、システム関数 perror(3C) に同等です。
エラーメッセージは、次の書式で出力されます。
msgstr: error_message |
msgstr は、メッセージの内容を示すためにユーザーが指定する文字列です。error_message は、ba_strerror(ba_errno) 呼び出しの結果です。通常、msgstr にはエラーの原因となった関数呼び出しについての情報を設定します。
たとえば、ba_get_num_classes() 呼び出しの結果として ba_errno が BA_INVIFACE に設定され、msgstr を次のように設定したとします。
ba_get_num_classes (le1) |
この場合、ba_perror() 呼び出しによって生成されるメッセージは、次のようになります。
ba_get_num_classes (le1): interface not found |
ba_perror() 関数には次の引数を渡します。
|
msgstr |
各メッセージの始めに出力される文字列 |
ba_reset_class_stats() - 指定されたクラスの統計情報をリセットします。
#include <netinet/ba_stat.h> int ba_reset_class_stats ( const char *interface, const char *classname );
ba_reset_class_stats() 関数は、指定されたクラスとその子クラスのすべての統計情報をリセットします。この関数を呼び出せるのは、特権化されたプロセスだけです。
ba_reset_class_stats() 関数には次の引数を渡します。
|
interface |
管理されているインタフェース名が入った文字列を指すポインタ (le0、hme0 など) |
|
classname |
クラス名が入った文字列を指すポインタ |
ba_reset_class_stats() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_reset_class_stats() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_set_event_mask() - イベントマスクを設定します。
#include <netinet/ba_stat.h> int ba_set_event_mask ( int eventmask );
ba_set_event_mask() 関数は、ユーザープロセスにどのイベントを報告するかを定義するイベントマスクを設定します。イベントマスクは、ba_close() 呼び出しによってドライバファイル /dev/ipqos が閉じられる際に、そのデフォルト値 (0) にリセットされます。
イベントマスクは、表 4-1 に示したイベントのビット単位の論理和です。
表 4-1 イベントマスクの設定|
ビット値 |
イベントタイプ |
説明 |
|
1 (00000001) |
BA_EVENT_CONFIG_STARTING |
ポリシーエージェントが新しい設定の読み取りを開始する時に生成される |
|
2 (00000010) |
BA_EVENT_CONFIG_ENDING |
ポリシーエージェントが新しい設定の読み取りを終了する時に生成される |
|
4 (00000100) |
BA_EVENT_DAEMON_ENDING |
ポリシーエージェントが終了する場合または強制的に終了させられる場合に生成される |
|
64 (01000000) |
BA_EVENT_FLOW_ACCOUNTING |
フローがタイムアウトしたか、フローの TOS フィールドが変化した場合に生成される |
|
128 (10000000) |
BA_EVENT_STATS_RESET |
クラスがリセットまたは削除された場合に生成される |
次に例を示します。
ポリシーエージェントが新しい設定の読み取りを開始および終了する時点を検出したいが、デーモンが停止したかどうかを知る必要はない場合は、イベントマスクを BA_EVENT_CONFIG_STARTING | BA_EVENT_CONFIG_ENDING (2 進 011) に設定します。
ポリシーエージェントが停止する時点だけを検出したい場合は、イベントマスクを BA_EVENT_DAEMON_ENDING (2 進 100) に設定します。
可能性のあるすべてのイベントを検出するには、イベントマスクを BA_EVENT_CONFIG_STARTING | BA_EVENT_CONFIG_ENDING | BA_EVENT_DAEMON_ENDING (2 進 111) に設定します。
イベントマスクの関連ビットが設定されると、発生するイベントについての情報は ba_get_next_event() 呼び出しによって取得できるように ba_event_t 型の構造体に書き込まれ、FIFO バッファー内の待ち行列に入ります。
ba_event_t 型の構造体は次のように定義されています。
typedef struct {
uint_t ba_event_type;
uint_t ba_event_drops;
union {
struct {
ba_name_t ba_event_iface;
ba_name_t ba_event_info;
} ba_event_config;
struct {
ba_name_t ba_flow_iface;
uint_t ba_num_flows;
ba_flow_event_t ba_event_flows[BA_EVENT_MAX_FLOWS];
} ba_event_flow;
ba_class_stats_t ba_event_stats;
/* the following is for Bandwidth Manager internal use only */
ba_filter_event_t ba_event_filter;
ba_cl_filter_event_t ba_event_cl_filter;
} ba_event_union;
} ba_event_t;
|
ba_event_t 型の構造体の要素は次のように設定されます。
|
ba_event_type |
発生したイベントのタイプを識別できるように設定される。可能な値については、表 3-1 を参照してください。 |
|
ba_event_iface |
イベントが発生したインタフェースを識別できるように設定される。イベントの型が、BA_EVENT_CONFIG_STARTING または BA_EVENT_CONFIG_ENDING の場合は、再設定されたインタフェース名が設定され、BA_EVENT_DAEMON_ENDING の場合は、空文字列が設定される。 |
|
ba_event_info |
将来使用するために予約されている |
ba_flow_event_t 型の構造体は次のように定義されています。
typedef struct {
ba_name_t classname_in;
ba_name_t classname_out;
struct in_addr ip_local;
struct in_addr ip_remote;
uchar_t protocol;
ushort_t port_local;
ushort_t port_remote;
uchar_t tos_sent_in;
uchar_t tos_sent_out;
uint_t npackets_in;
uint_t nbytes_in;
uint_t npackets_out;
uint_t nbytes_out;
uint_t url_length;
union {
uchar_t *url;
u_longlong_t url_pad;} url_union;
hrtime_t firstseen_in; /* timestamp of first packet sent (ns)*/
hrtime_t lastseen_in; /* timestamp of last packet sent (ns) */
hrtime_t firstseen_out;/* timestamp of first packet sent (ns)*/
hrtime_t lastseen_out; /* timestamp of last packet sent (ns) */
} ba_flow_event_t;
#define ba_flow_url url_union.url
|
ba_set_event_mask() 関数には次の引数を渡します。
|
eventmask |
イベントマスクをビット単位の値で表現する整数 |
ba_set_event_mask() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。
ba_set_event_mask() 呼び出しの際にエラーが発生すると、変数 ba_errno は表 4-2 に示したエラーコードの 1 つに設定されます。
ba_strerror() - エラーメッセージを取得します。
#include <netinet/ba_stat.h> char *ba_sterror(int errnum);
ba_strerror() 関数は、エラーコード errnum に関連付けられたエラーメッセージを取得します。この関数は、システム関数 strerror(3C) に同等です。
ba_strerror() 関数には次の引数を渡します。
|
errnum |
整数のエラーコード |
ba_strerror() 関数は、正常に終了した場合にはエラーメッセージを含む文字列を指すポインタ、エラー時には -1 を返します。
表 4-2 に、C Statistics API が返すエラーを示します。
表 4-2 ba_errno のエラーコード|
番号 |
エラーコード |
エラーメッセージ |
|---|---|---|
|
1 |
BA_NOTRUNNING |
デーモンが動作していません。 |
|
2 |
BA_INVIFACE |
インタフェースが見つかりません。 |
|
3 |
BA_NOROOT |
root クラスがありません。 |
|
4 |
BA_NODEFAULT |
default クラスがありません。 |
|
5 |
BA_INVCLHNDL |
クラスハンドルが無効です。 |
|
6 |
BA_INVPARTHDL |
親ハンドルが無効です。 |
|
7 |
BA_INVPREVHDL |
直前のハンドルが無効です。 |
|
8 |
BA_INVFLTNAME |
フィルタ名が無効です。 |
|
9 |
BA_NAMETOOLONG |
名前の長さが BA_NAMES_LEN の値を超えています。 |
|
10 |
BA_ROOTEXIST |
root クラスはすでに存在しています。 |
|
11 |
BA_DEFEXIST |
default クラスはすでに存在しています。 |
|
12 |
BA_CLEXIST |
クラスはすでに存在しています。 |
|
13 |
BA_NOCLLEFT |
CBQ_MAX_CLASSES に到達しました。 |
|
14 |
BA_ISPARENT |
削除しようとしているクラスに子が存在します。 |
|
15 |
BA_PRIOTOOBIG |
優先順位が RM_MAXPRIO の値を超えています。 |
|
16 |
BA_NOTDAEMON |
指定されたオペレーションはデーモンに予約されています。 |
|
17 |
BA_INVCLNAME |
クラス名が無効です。 |
|
18 |
BA_PERM |
スーパーユーザーではありません。 |
|
19 |
BA_INVEVTMASK |
イベントマスクが範囲外です。 |
|
20 |
BA_SYSERR |
OS エラー: エラー番号 (errno) をチェックしてください。 |
|
21 |
BA_INVSIGNO |
シグナル番号が無効です。 |
|
22 |
BA_INVAL |
API の引数が無効です。 |
|
23 |
BA_NOMEM |
メモリーが残っていません。 |
|
24 |
BA_CONFIGURING |
設定変更 |
|
25 |
BA_INVIFHDL |
インタフェースハンドルが無効です。 |
|
26 |
BA_FLEXIST |
フィルタはすでに存在しています。 |
|
27 |
BA_INVFLHDL |
フィルタハンドルが無効です。 |
|
28 |
BA_INVITHDL |
フィルタ項目ハンドルが無効です。 |
|
29 |
BA_FLINUSE |
フィルタはまだ参照されています。 |