Berkeley Packet Filter
BPFはデータリンク層へのrawインターフェイスを提供し、生のリンク層パケットの送信と受信を可能にする。
それに加えて、ネットワークインタフェース向けのドライバーがプロミスキャス・モードをサポートしている場合には、インターフェイスをそのモードに切り替えて、他のホスト向けのパケットも含むネットワーク上のすべてのパケットを受信できるようにすることができる。
BPFはパケットのフィルタリングをサポートしているため、ユーザー空間のプロセスは受信したいパケットを指定するフィルタープログラムを実装できる。たとえば、tcpdumpプロセスは、TCP接続を開始するパケットのみを受信する必要があることがある。BPFはプロセスが提供するフィルターを通過したパケットのみを返せるため、この機能を利用することで、オペレーティングシステムのカーネルからプロセスへの不要なパケットのコピーが回避され、パフォーマンスが大幅に向上する。
BPFは、インターフェイス全体ではなく、BPFのフィルタリングメカニズムだけを指す場合がある。LinuxやTru64 UNIXなどの一部のシステムは、BPFのrawインターフェイス以外にデータリンク層へのrawインターフェイスを提供するが、そのrawインターフェイスにはBPFのフィルタリングメカニズムを使用する。
また、eBPFはLinuxカーネル内で実行される拡張された(extended)BPFのJITの仮想マシンである。
BPFはほとんどのUnix系オペレーティングシステムで利用でき、eBPFにはLinuxおよびMicrosoft Windows向けのものがある。
現在、LinuxカーネルはeBPFのみを実行しており、ロードされたcBPFのバイトコードは、プログラムの実行前にカーネル内で透過的にeBPF表現に変換されるようになっている。DoS攻撃を防ぐために、実行前にすべてのバイトコードが検証される。Linux 5.3までは、verifierはループの使用を禁止していた。
BPFのユーザーモードのインタープリターは、pcap APIのlibpcap/WinPcap/Npcapの各実装で提供されるため、特定のフィルタリングメカニズムに対するカーネルモードのサポートがないシステムでパケットをキャプチャする場合、パケットをユーザーモードでフィルタリングできる。ただし、pcap APIを使用するコードは両方のタイプのシステムで機能するが、ユーザーモードでフィルタリングが行われるシステムでは、フィルターで除外されるものを含むすべてのパケットがカーネルからユーザー空間にコピーされる。このインタープリターは、pcapを使用してキャプチャされたパケットを含むファイルを読み取るときにも使用できえる。
もう1つのユーザーモードインタープリターは、JITとeBPFをサポートするuBPFである。そのコードは、Linux 以外のシステムでeBPFサポートを提供するために再利用されている。Microsoftの「eBPF on Windows」は、uBPFとPREVAIL形式の検証ツールを基に構築されている。