EN JA
IPL(4)
IPL(4) FreeBSD Kernel Interfaces Manual IPL(4)

名称

ipl - IP パケットログデバイス

解説

ipl 疑似デバイスの目的は利用者がログを記録したいパケットのパケットヘッダを集める容易な方法を提供することです。パケットヘッダがログに記録された場合、全ヘッダはいずれにしても (どんな IP オプションも含んで - それがヘッダサイズを計算する場合、 TCP/UDP オプションは含まれていません) ログが記録されます。パケットの内容もヘッダの後にログに記録されます。ログリーダがビジーかそうでなければログレコードを読み込むことができない場合、データの IPLLOGSIZE (8192 はデフォルトです) バイトまでが格納されます。

ログに記録されたすべてのパケットヘッダを先頭に追加することは続くパケットに関連する情報を構造体に含んでいることです。また、それはなぜかログに記録されます。構造体のフォーマットは次のとおりです。


/*
* ログ構造体。ログに記録された個々のパケットヘッダはこれらのうちの 1 つ
* によって先頭に追加されます。デバイスから読み込まれたログレコードで
* これに続くことは、任意のパケットデータが続く ipflog 構造体となります。
*/
typedef struct iplog {
u_long ipl_sec;
u_long ipl_usec;
u_int ipl_len;
u_int ipl_count;
size_t ipl_dsize;
struct iplog *ipl_next;
} iplog_t;


typedef struct ipflog {
#if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603))
u_char fl_ifname[IFNAMSIZ];
#else
u_int fl_unit;
u_char fl_ifname[4];
#endif
u_char fl_plen; /* の後ろの余分なデータ */
u_char fl_hlen; /* 保存された IP ヘッダの長さ */
u_short fl_rule; /* 64k ルールを越えないと仮定、合計 */
u_32_t fl_flags;
} ipflog_t;


ipl デバイスから読み込む場合、少なくとも 1 つの完全なログレコードを保持するために十分に大きなバッファで read(2) を呼び出すことが必要です - 部分的なログレコードの読み込みはサポートされていません。

ログ本体が使用される時、パケット内容が 128 バイト以上の場合、パケット内容の 128 バイトだけがログに記録されます。

ipl デバイスから単に読み込むことは可能ですが、任意のカーネルデータを変更する ioctl を使用する時、書き込むためにそれをオープンすることが要求されます。

このデバイスでロードされる ioctl は ipf(4) で見つけることができます。ログの記録を使用するのためにあり、フィルタに影響しない ioctl は次のとおりです。


ioctl(fd, SIOCIPFFB, int *)
ioctl(fd, FIONREAD, int *)

SIOCIPFFB ioctl はログバッファをフラッシュし、フラッシュしたバイト数を返します。 FIONREAD は、ログデータを格納するために現在使用されているバイト数を返します。 IPFILTER_LOG がコンパイルする時定義されない場合、 SIOCIPFFB は利用不可能で、FIONREAD は何もしないで返ります。

すべての読み込み操作は事実上ブロッキングが (読み込まれるデータがない場合、いくらかが利用可能になるまでスリープします) 考慮に値することを意味して、このデバイスで非ブロッキング IO のサポートは現在ありません。

関連項目

ipf(4)

バグ

内部バッファ (静的サイズ) がいっぱいになる時、パケットヘッダが落とされます。

関連ファイル

/dev/ipl0