Solaris Bandwidth Manager 1.6 の開発

第 4 章 C Statistics API のリファレンス

この章では、C Statistics API によって定義されている関数のリファレンス情報をアルファベット順に示します。C Statistics API の使用方法については、第 3 章「C Statistics API の使用」を参照してください。

ba_close()

名前

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()

名前

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 と通信方向を抽出します。たとえば、ifnamele0_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()

名前

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()

名前

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()

名前

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 の場合、ifnamele0_in になります。

引数

ba_encode_ifname() 関数には次の引数を渡します。

interface

管理されるインタフェース名が入った文字列を指すポインタ (le0hme0 など)

direction

インタフェース方向 (BA_DIR_INCOMING または BA_DIR_OUTGOING) を示す整数

ifname

コード化されたインタフェース名を指すポインタ。十分なメモリーを割り当ててください。 

戻り値

ba_encode_ifname() 関数は、正常に終了した場合には書き込まれた文字数、エラー時には -1 を返します。

エラー

ba_encode_ifname() 呼び出しの際にエラーが発生すると、変数 ba_errno表 4-2 に示したエラーコードの 1 つに設定されます。

ba_free()

名前

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()

名前

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

管理されるインタフェース名が入った文字列を指すポインタ (le0hme0 など)。クラス情報を取得する通信方向を指定するには、インタフェース名に _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()

名前

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()

名前

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

管理されるインタフェース名を含む文字列を指すポインタ (le0hme0 など)。クラス情報を取得する通信方向を指定するには、インタフェース名に _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()

名前

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

管理されるインタフェース名を含む文字列を指すポインタ (le0hme0 など)

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()

名前

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() 関数には次の引数を渡します。

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()

名前

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

管理されるインタフェース名が入った文字列を指すポインタ (le0hme0 など)。クラス情報を取得する通信方向を指定するには、インタフェース名に _in または _out を追加する。通信方向を省略した場合には、_out が追加されたと見なされる

戻り値

ba_get_num_classes() 関数は、正常に終了した場合にはクラス数、エラー時には -1 を返します。

エラー

ba_get_num_classes() 呼び出しの際にエラーが発生すると、変数 ba_errno表 4-2 に示したエラーコードの 1 つに設定されます。

ba_get_num_interfaces()

名前

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()

名前

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

管理されているインタフェース名が入った文字列を指すポインタ (le0hih0hme0 など)

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()

名前

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_suffixhme0_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()

名前

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()

名前

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()

名前

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) をチェックしてください。

ba_perror()

名前

ba_perror() - エラーメッセージを出力します。

形式

#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_errnoBA_INVIFACE に設定され、msgstr を次のように設定したとします。


ba_get_num_classes (le1)

この場合、ba_perror() 呼び出しによって生成されるメッセージは、次のようになります。


ba_get_num_classes (le1): interface not found

引数

ba_perror() 関数には次の引数を渡します。

msgstr

各メッセージの始めに出力される文字列 

ba_reset_class_stats()

名前

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

管理されているインタフェース名が入った文字列を指すポインタ (le0hme0 など)

classname

クラス名が入った文字列を指すポインタ 

戻り値

ba_reset_class_stats() 関数は、正常に終了した場合には 0、エラー時には -1 を返します。

エラー

ba_reset_class_stats() 呼び出しの際にエラーが発生すると、変数 ba_errno表 4-2 に示したエラーコードの 1 つに設定されます。

ba_set_event_mask()

名前

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_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()

名前

ba_strerror() - エラーメッセージを取得します。

形式

#include <netinet/ba_stat.h>

char *ba_sterror(int errnum);

説明

ba_strerror() 関数は、エラーコード errnum に関連付けられたエラーメッセージを取得します。この関数は、システム関数 strerror(3C) に同等です。

引数

ba_strerror() 関数には次の引数を渡します。

errnum

整数のエラーコード 

戻り値

ba_strerror() 関数は、正常に終了した場合にはエラーメッセージを含む文字列を指すポインタ、エラー時には -1 を返します。

Statistics API のエラーメッセージ

表 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

フィルタはまだ参照されています。