Packet Sniffer SDK DLL Edition

BPF programming

 Previous Next

What is BPF filter program?

A BPF Filter Program is an instructions array, with all branches forwardly directed, terminated by a return instruction. Each instruction performs some action on the pseudo-machine state, which consists of an accumulator (A, DWORD, 4 bytes), an index register (X, DWORD, 4 bytes), scratch memory store (DWORD M[16]), and an implicit program counter - pc.

BPF instructions allow you to create various rules for filtering network packets.

BPF instruction format is defined by HN_BPF_INSTRUCTION structure:

[C/C++]
typedef struct _HN_BPF_INSTRUCTION
 {
   WORD  Code;  // Instruction code
   BYTE  jt;    // Jump if true
   BYTE  jf;    // Jump if false
   DWORD k;     // Generic multiuse field

 }HN_BPF_INSTRUCTION, *PHN_BPF_INSTRUCTION;
[Delphi]
HN_BPF_INSTRUCTION = record
  Code : WORD;   // Instruction code
  jt   : BYTE;   // Jump if true
  jf   : BYTE;   // Jump if false
  k    : DWORD;  // Generic multiuse field
end;
PHN_BPF_INSTRUCTION = ^HN_BPF_INSTRUCTION;

The k field is used in different ways depending on different instructions, and the jt and jf fields are used as offsets by the jump instructions. The opcodes are encoded in a semi-hierarchical fashion. There are eight classes of instructions: BPF_LD, BPF_LDX, BPF_ST, BPF_STX, BPF_ALU, BPF_JMP, BPF_RET, and BPF_MISC. Other various mode and operator bits are added to the class to give the actual instructions.

In the Packet Sniffer SDK library a BPF Filter Program is defined in the HN_BPF_PROGRAMM structure.

To simplify the BPF Filter Programs creating the HNUserFilter component is implemented, which also alows to control HN_BPF_PROGRAMM and HN_BPF_INSTRUCTION structures.