EN JA
BPF(9)
BPF(9) FreeBSD Kernel Developer's Manual BPF(9)

名称

bpfバークレイパケットフィルタ (Berkeley Packet Filter)

書式

#include < net/bpf.h>

void
bpfattach( struct ifnet *ifp, u_int dlt, u_int hdrlen);

void
bpfattach2( struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp);

void
bpfdetach( struct ifnet *ifp);

void
bpf_tap( struct ifnet *ifp, u_char *pkt, u_int *pktlen);

void
bpf_mtap( struct ifnet *ifp, struct mbuf *m);

void
bpf_mtap2( struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m);

u_int
bpf_filter( const struct bpf_insn *pc , u_char *pkt, u_int wirelen, u_int buflen);

int
bpf_validate( const struct bpf_insn *fcode, int flen);

解説

バークレイパケットフィルタ (Berkeley Packet Filter) は、データリンクレイヤ (層) のためのプロトコル独立の生のインタフェースを提供します。パケットが他のホストに向かうことになっていても、ネットワークのすべてのパケットは、ネットワークインタフェースからユーザプログラムに渡すことができます。各プログラムは、 bpf フィルタマシンプログラムの形式でフィルタを指定することができます。 bpf(4) は、ユーザプログラムによって使用されるインタフェースを記述します。このマニュアルページは、パケットを bpf に渡すインタフェースによって使用される関数と、 bpf フィルタマシンプログラムをテストして、実行するための関数について説明しています。

bpfattach() 関数は、ネットワークインタフェースを bpf にアタッチします。 ifp 引数は、インタフェースにアタッチされるインタフェースを定義する構造体へのポインタです。 dlt 引数は、次のデータリンクレイヤタイプです: DLT_NULL (リンクレイヤカプセル化なし), DLT_EN10MB (イーサネット), DLT_IEEE802_11 (802.11 無線ネットワーク), その他。リンクレイヤタイプの残りは、 < net/bpf.h> で見つけることができます。 hdrlen 引数は、リンクヘッダの固定サイズです。可変長ヘッダは、まだサポートされていません。 bpf システムは、 ifp->if_bpf へのポインタを保持します。この変数は、 bpf が、このインタフェースからのパケットを下記の関数を使用して盗聴するように要求されたとき、 NULL でない値に設定されます。

bpfattach2() 関数は、 ifp->if_bpf を使用するよりむしろ明白な if_bpf を登録することによって、複数の bpf インスタンスが単一のインタフェースにアタッチされることを可能にします。そして、アタッチされた任意のデータリンクレイヤタイプのためのインタフェースで tcpdump(1) を実行することは可能です。

bpfdetach() 関数は、 ifp によって指定されたインタフェースから bpf インスタンスをデタッチします。 bpfdetach() 関数は、アタッチされた、各 bpf インスタンスのための一度呼び出されるべきです。

bpf_tap() 関数は、パケットを bpf に渡すためにインタフェースによって使用されます。 pkt によって指された (リンクヘッダを含んた) パケットデータは、連続したバッファでなければなりませんが、長さは、 pktlen です。 ifp 引数は、盗聴されるインタフェースを定義する構造体へのポインタです。バケットは、各プロセスフィルタによって解析され、受け付けられるなら、読み込みプロセスのためにバッファリングされます。

bpf_mtap() 関数は、 mbuf チェーン m にあるパケットを盗聴するために使用されることを除いて、 bpf_tap() に似ています。 ifp 引数は、盗聴されるインタフェースを定義する構造体へのポインタです。 bpf_tap() のように、 bpf_mtap() は、データリンクレイヤタイプが指定されのは何でもリンクヘッダを必要とします。 bpf は、 mbuf チェーンを解放しないし、そのポインタを保持しません、 mbuf チェーンから読み込まれるだけであることに注意してください、これは、必要なら、リンクヘッダを含む mbuf をチェーンの前に追加できることを意味します。これを達成するクリーナインタフェースは、 bpf_mtap2() によって提供されます。

bpf_mtap2() 関数は、パケットを含んでいる mbuf m と無関係である長さ dlen のリンクヘッダ data をユーザに渡すことができます。これは、いくつかのリンクヘッダを渡すことを簡素化します。

bpf_filter() 関数は、パケット pkt 上での pc で開始されるフィルタプログラムを実行します。 wirelen 引数は、オリジナルのパケットの長さで、 buflen は、データの現在の量です。 0 の buflen 値は、特別です。それは、 pkt が実際に mbuf チェーン ( struct mbuf *) へのポインタであることを示します。

bpf_validate() 関数は、長さ flen のフィルタコード fcode が有効であるかチェックします。

戻り値

bpf_filter() 関数は、フィルタがなければ、 (符号なし整数にキャスト (cast) された) -1 を返します。そうでなければ、それは、フィルタプログラムの結果を返します。

bpf_validate() 関数は、プログラムが有効なフィルタプログラムでないとき、0 を返します。

イベントハンドラ

bpf は、各タイムリスナ (time listener) がインタフェースにアタッチするか、またはインタフェースからデタッチする bpf_track EVENTHANDLER(9) イベントを呼び出します。 ( struct ifnet *) へのポインタは、最初の引数として渡され、インタフェース dlt が続きます。最後の引数は、リスナがアタッチされている (1) またはデタッチされている (0) ことを示します。ハンドラは、 EVENTHANDLER(9) ディスパッチャの内側の bpf サブシステムのスリープと呼び出しを制限することを意味する、 bpf のグローバルロックを保持して、呼び出されることに注意してください。ハンドラは、書き込み専用のリスナのために呼び出されないことに注意してください。

歴史

Enet パケットフィルタは、Carnegie-Mellon University (カーネギメロン大学) の Mike Accetta と Rick Rashid によって 1980 年に作成されました。 Stanford (スタンフォード) の Jeffrey Mogul は、 BSD にコードを移植して、1983 年から開発を続けています。それ以来、それは、 DEC の Ultrix Packet Filter、 SunOS 4.1 での STREAMS NIT モジュールと BPF に発展しています。

作者

Lawrence Berkeley Laboratory (ローレンスバークレイ研究所) の Steven McCanne は、1990 年夏に BPF を実装しました。デザインの多くは、 Van Jacobson のおかげです。このマニュアルページは、 Orla McGann によって書かれました。
May 11, 2012 FreeBSD