Expand description
This module contains all the definitions related to eBPF, and some functions permitting to manipulate eBPF instructions.
The number of bytes in an instruction, the maximum number of instructions in a program, and also all operation codes are defined here as constants.
The structure for an instruction used by this crate, as well as the function to extract it from a program, is also defined in the module.
To learn more about these instructions, see the Linux kernel documentation: https://www.kernel.org/doc/Documentation/networking/filter.txt, or for a shorter version of the list of the operation codes: https://github.com/iovisor/bpf-docs/blob/master/eBPF.md
Structs§
- Insn
- An eBPF instruction.
Constants§
- ADD32_
IMM - BPF opcode:
add32 dst, imm
///dst += imm
. - ADD32_
REG - BPF opcode:
add32 dst, src
///dst += src
. - ADD64_
IMM - BPF opcode:
add64 dst, imm
///dst += imm
. - ADD64_
REG - BPF opcode:
add64 dst, src
///dst += src
. - AND32_
IMM - BPF opcode:
and32 dst, imm
///dst &= imm
. - AND32_
REG - BPF opcode:
and32 dst, src
///dst &= src
. - AND64_
IMM - BPF opcode:
and64 dst, imm
///dst &= imm
. - AND64_
REG - BPF opcode:
and64 dst, src
///dst &= src
. - ARSH32_
IMM - BPF opcode:
arsh32 dst, imm
///dst >>= imm (arithmetic)
. - ARSH32_
REG - BPF opcode:
arsh32 dst, src
///dst >>= src (arithmetic)
. - ARSH64_
IMM - BPF opcode:
arsh64 dst, imm
///dst >>= imm (arithmetic)
. - ARSH64_
REG - BPF opcode:
arsh64 dst, src
///dst >>= src (arithmetic)
. - BE
- BPF opcode:
be dst
///dst = htobe<imm>(dst), with imm in {16, 32, 64}
. - BPF_1B
- BPF size modifier: 1 byte.
- BPF_2B
- BPF size modifier: 2 bytes.
- BPF_4B
- BPF size modifier: 4 bytes.
- BPF_8B
- BPF size modifier: 8 bytes.
- BPF_ABS
- BPF mode modifier: absolute load.
- BPF_ADD
- BPF ALU/ALU64 operation code: addition.
- BPF_
ALU32_ LOAD - BPF operation class: 32 bit arithmetic or load.
- BPF_
ALU64_ STORE - BPF operation class: 64 bit arithmetic or store.
- BPF_
ALU_ OP_ MASK - Mask to extract the arithmetic operation code from an instruction operation code.
- BPF_AND
- BPF ALU/ALU64 operation code: and.
- BPF_
ARSH - BPF ALU/ALU64 operation code: sign extending right shift.
- BPF_B
- BPF size modifier: byte (1 byte).
- BPF_
CALL - BPF JMP operation code: syscall function call.
- BPF_
CLS_ MASK - Mask to extract the operation class from an operation code.
- BPF_DIV
- BPF ALU/ALU64 operation code: division. [DEPRECATED]
- BPF_DW
- BPF size modifier: double word (8 bytes).
- BPF_END
- BPF ALU/ALU64 operation code: endianness conversion.
- BPF_
EXIT - BPF JMP operation code: return from program.
- BPF_H
- BPF size modifier: half-word (2 bytes).
- BPF_HOR
- BPF ALU/ALU64 operation code: high or.
- BPF_IMM
- BPF mode modifier: immediate value.
- BPF_IND
- BPF mode modifier: indirect load. [DEPRECATED]
- BPF_JA
- BPF JMP operation code: jump.
- BPF_JEQ
- BPF JMP operation code: jump if equal.
- BPF_JGE
- BPF JMP operation code: jump if greater or equal.
- BPF_JGT
- BPF JMP operation code: jump if greater than.
- BPF_JLE
- BPF JMP operation code: jump if lower or equal.
- BPF_JLT
- BPF JMP operation code: jump if lower than.
- BPF_JMP
- BPF operation class: control flow.
- BPF_JNE
- BPF JMP operation code: jump if not equal.
- BPF_
JSET - BPF JMP operation code: jump if
src
®
. - BPF_
JSGE - BPF JMP operation code: jump if greater or equal (signed).
- BPF_
JSGT - BPF JMP operation code: jump if greater than (signed).
- BPF_
JSLE - BPF JMP operation code: jump if lower or equal (signed).
- BPF_
JSLT - BPF JMP operation code: jump if lower than (signed).
- BPF_K
- BPF source operand modifier: 32-bit immediate value.
- BPF_LD
- BPF operation class: load from immediate. [DEPRECATED]
- BPF_LDX
- BPF operation class: load from register. [DEPRECATED]
- BPF_
LMUL - BPF PQR operation code: low multiplication.
- BPF_LSH
- BPF ALU/ALU64 operation code: left shift.
- BPF_MEM
- BPF mode modifier: load from / store to memory. [DEPRECATED]
- BPF_MOD
- BPF ALU/ALU64 operation code: modulus. [DEPRECATED]
- BPF_MOV
- BPF ALU/ALU64 operation code: move.
- BPF_MUL
- BPF ALU/ALU64 operation code: multiplication. [DEPRECATED]
- BPF_NEG
- BPF ALU/ALU64 operation code: negation. [DEPRECATED]
- BPF_OR
- BPF ALU/ALU64 operation code: or.
- BPF_PQR
- BPF operation class: product / quotient / remainder.
- BPF_RSH
- BPF ALU/ALU64 operation code: right shift.
- BPF_
SDIV - BPF PQR operation code: signed division quotient.
- BPF_
SHMUL - BPF PQR operation code: signed high multiplication.
- BPF_
SREM - BPF PQR operation code: signed division remainder.
- BPF_ST
- BPF operation class: store immediate. [DEPRECATED]
- BPF_STX
- BPF operation class: store value from register. [DEPRECATED]
- BPF_SUB
- BPF ALU/ALU64 operation code: subtraction.
- BPF_
SYSCALL - BPF JMP operation code: static syscall.
- BPF_
UDIV - BPF PQR operation code: unsigned division quotient.
- BPF_
UHMUL - BPF PQR operation code: unsigned high multiplication.
- BPF_
UREM - BPF PQR operation code: unsigned division remainder.
- BPF_W
- BPF size modifier: word (4 bytes).
- BPF_X
- BPF source operand modifier:
src
register. - BPF_XOR
- BPF ALU/ALU64 operation code: exclusive or.
- CALL_
IMM - BPF opcode:
call imm
/// syscall function call to syscall with keyimm
. - CALL_
REG - BPF opcode: tail call.
- DIV32_
IMM - BPF opcode:
div32 dst, imm
///dst /= imm
. - DIV32_
REG - BPF opcode:
div32 dst, src
///dst /= src
. - DIV64_
IMM - BPF opcode:
div64 dst, imm
///dst /= imm
. - DIV64_
REG - BPF opcode:
div64 dst, src
///dst /= src
. - EF_
SBPF_ V2 - Solana BPF version flag
- EXIT
- BPF opcode:
exit
///return r0
. /// Valid only until SBPFv3 - FIRST_
SCRATCH_ REG - First scratch register
- FRAME_
PTR_ REG - Frame pointer register
- HOR64_
IMM - BPF opcode:
hor64 dst, imm
///dst |= imm << 32
. - HOST_
ALIGN - Alignment of the memory regions in host address space in bytes
- INSN_
SIZE - Size of an eBPF instructions, in bytes.
- JA
- BPF opcode:
ja +off
///PC += off
. - JEQ_IMM
- BPF opcode:
jeq dst, imm, +off
///PC += off if dst == imm
. - JEQ_REG
- BPF opcode:
jeq dst, src, +off
///PC += off if dst == src
. - JGE_IMM
- BPF opcode:
jge dst, imm, +off
///PC += off if dst >= imm
. - JGE_REG
- BPF opcode:
jge dst, src, +off
///PC += off if dst >= src
. - JGT_IMM
- BPF opcode:
jgt dst, imm, +off
///PC += off if dst > imm
. - JGT_REG
- BPF opcode:
jgt dst, src, +off
///PC += off if dst > src
. - JLE_IMM
- BPF opcode:
jle dst, imm, +off
///PC += off if dst <= imm
. - JLE_REG
- BPF opcode:
jle dst, src, +off
///PC += off if dst <= src
. - JLT_IMM
- BPF opcode:
jlt dst, imm, +off
///PC += off if dst < imm
. - JLT_REG
- BPF opcode:
jlt dst, src, +off
///PC += off if dst < src
. - JNE_IMM
- BPF opcode:
jne dst, imm, +off
///PC += off if dst != imm
. - JNE_REG
- BPF opcode:
jne dst, src, +off
///PC += off if dst != src
. - JSET_
IMM - BPF opcode:
jset dst, imm, +off
///PC += off if dst & imm
. - JSET_
REG - BPF opcode:
jset dst, src, +off
///PC += off if dst & src
. - JSGE_
IMM - BPF opcode:
jsge dst, imm, +off
///PC += off if dst >= imm (signed)
. - JSGE_
REG - BPF opcode:
jsge dst, src, +off
///PC += off if dst >= src (signed)
. - JSGT_
IMM - BPF opcode:
jsgt dst, imm, +off
///PC += off if dst > imm (signed)
. - JSGT_
REG - BPF opcode:
jsgt dst, src, +off
///PC += off if dst > src (signed)
. - JSLE_
IMM - BPF opcode:
jsle dst, imm, +off
///PC += off if dst <= imm (signed)
. - JSLE_
REG - BPF opcode:
jsle dst, src, +off
///PC += off if dst <= src (signed)
. - JSLT_
IMM - BPF opcode:
jslt dst, imm, +off
///PC += off if dst < imm (signed)
. - JSLT_
REG - BPF opcode:
jslt dst, src, +off
///PC += off if dst < src (signed)
. - LD_
1B_ REG - BPF opcode:
ldxb dst, [src + off]
///dst = (src + off) as u8
. - LD_
2B_ REG - BPF opcode:
ldxh dst, [src + off]
///dst = (src + off) as u16
. - LD_
4B_ REG - BPF opcode:
ldxw dst, [src + off]
///dst = (src + off) as u32
. - LD_
8B_ REG - BPF opcode:
ldxdw dst, [src + off]
///dst = (src + off) as u64
. - LD_
B_ REG - BPF opcode:
ldxb dst, [src + off]
///dst = (src + off) as u8
. - LD_
DW_ IMM - BPF opcode:
lddw dst, imm
///dst = imm
. [DEPRECATED] - LD_
DW_ REG - BPF opcode:
ldxdw dst, [src + off]
///dst = (src + off) as u64
. - LD_
H_ REG - BPF opcode:
ldxh dst, [src + off]
///dst = (src + off) as u16
. - LD_
W_ REG - BPF opcode:
ldxw dst, [src + off]
///dst = (src + off) as u32
. - LE
- BPF opcode:
le dst
///dst = htole<imm>(dst), with imm in {16, 32, 64}
. - LMUL32_
IMM - BPF opcode:
lmul32 dst, imm
///dst *= (dst * imm) as u32
. - LMUL32_
REG - BPF opcode:
lmul32 dst, src
///dst *= (dst * src) as u32
. - LMUL64_
IMM - BPF opcode:
lmul64 dst, imm
///dst = (dst * imm) as u64
. - LMUL64_
REG - BPF opcode:
lmul64 dst, src
///dst = (dst * src) as u64
. - LSH32_
IMM - BPF opcode:
lsh32 dst, imm
///dst <<= imm
. - LSH32_
REG - BPF opcode:
lsh32 dst, src
///dst <<= src
. - LSH64_
IMM - BPF opcode:
lsh64 dst, imm
///dst <<= imm
. - LSH64_
REG - BPF opcode:
lsh64 dst, src
///dst <<= src
. - MM_
BYTECODE_ START - Virtual address of the bytecode region (in SBPFv3)
- MM_
HEAP_ START - Virtual address of the heap region
- MM_
INPUT_ START - Virtual address of the input region
- MM_
REGION_ SIZE - Size (and alignment) of a memory region
- MM_
RODATA_ START - Virtual address of the readonly data region (also contains the bytecode until SBPFv3)
- MM_
STACK_ START - Virtual address of the stack region
- MOD32_
IMM - BPF opcode:
mod32 dst, imm
///dst %= imm
. - MOD32_
REG - BPF opcode:
mod32 dst, src
///dst %= src
. - MOD64_
IMM - BPF opcode:
mod64 dst, imm
///dst %= imm
. - MOD64_
REG - BPF opcode:
mod64 dst, src
///dst %= src
. - MOV32_
IMM - BPF opcode:
mov32 dst, imm
///dst = imm
. - MOV32_
REG - BPF opcode:
mov32 dst, src
///dst = src
. - MOV64_
IMM - BPF opcode:
mov64 dst, imm
///dst = imm
. - MOV64_
REG - BPF opcode:
mov64 dst, src
///dst = src
. - MUL32_
IMM - BPF opcode:
mul32 dst, imm
///dst *= imm
. - MUL32_
REG - BPF opcode:
mul32 dst, src
///dst *= src
. - MUL64_
IMM - BPF opcode:
mul64 dst, imm
///dst *= imm
. - MUL64_
REG - BPF opcode:
mul64 dst, src
///dst *= src
. - NEG32
- BPF opcode:
neg32 dst
///dst = -dst
. - NEG64
- BPF opcode:
neg64 dst
///dst = -dst
. - OR32_
IMM - BPF opcode:
or32 dst, imm
///dst |= imm
. - OR32_
REG - BPF opcode:
or32 dst, src
///dst |= src
. - OR64_
IMM - BPF opcode:
or64 dst, imm
///dst |= imm
. - OR64_
REG - BPF opcode:
or64 dst, src
///dst |= src
. - PROG_
MAX_ INSNS - Maximum number of instructions in an eBPF program.
- RETURN
- BPF opcode:
return
///return r0
. /// Valid only since SBPFv3 - RSH32_
IMM - BPF opcode:
rsh32 dst, imm
///dst >>= imm
. - RSH32_
REG - BPF opcode:
rsh32 dst, src
///dst >>= src
. - RSH64_
IMM - BPF opcode:
rsh64 dst, imm
///dst >>= imm
. - RSH64_
REG - BPF opcode:
rsh64 dst, src
///dst >>= src
. - SCRATCH_
REGS - Number of scratch registers
- SDIV32_
IMM - BPF opcode:
shmul32 dst, imm
///dst = (dst * imm) as i64
. BPF opcode:shmul32 dst, src
///dst = (dst * src) as i64
. BPF opcode:sdiv32 dst, imm
///dst /= imm
. - SDIV32_
REG - BPF opcode:
sdiv32 dst, src
///dst /= src
. - SDIV64_
IMM - BPF opcode:
sdiv64 dst, imm
///dst /= imm
. - SDIV64_
REG - BPF opcode:
sdiv64 dst, src
///dst /= src
. - SHMU
L64_ IMM - BPF opcode:
shmul64 dst, imm
///dst = (dst * imm) >> 64
. - SHMU
L64_ REG - BPF opcode:
shmul64 dst, src
///dst = (dst * src) >> 64
. - SREM32_
IMM - BPF opcode:
srem32 dst, imm
///dst %= imm
. - SREM32_
REG - BPF opcode:
srem32 dst, src
///dst %= src
. - SREM64_
IMM - BPF opcode:
srem64 dst, imm
///dst %= imm
. - SREM64_
REG - BPF opcode:
srem64 dst, src
///dst %= src
. - ST_
1B_ IMM - BPF opcode:
stb [dst + off], imm
///(dst + offset) as u8 = imm
. - ST_
1B_ REG - BPF opcode:
stxb [dst + off], src
///(dst + offset) as u8 = src
. - ST_
2B_ IMM - BPF opcode:
sth [dst + off], imm
///(dst + offset) as u16 = imm
. - ST_
2B_ REG - BPF opcode:
stxh [dst + off], src
///(dst + offset) as u16 = src
. - ST_
4B_ IMM - BPF opcode:
stw [dst + off], imm
///(dst + offset) as u32 = imm
. - ST_
4B_ REG - BPF opcode:
stxw [dst + off], src
///(dst + offset) as u32 = src
. - ST_
8B_ IMM - BPF opcode:
stdw [dst + off], imm
///(dst + offset) as u64 = imm
. - ST_
8B_ REG - BPF opcode:
stxdw [dst + off], src
///(dst + offset) as u64 = src
. - ST_
B_ IMM - BPF opcode:
stb [dst + off], imm
///(dst + offset) as u8 = imm
. - ST_
B_ REG - BPF opcode:
stxb [dst + off], src
///(dst + offset) as u8 = src
. - ST_
DW_ IMM - BPF opcode:
stdw [dst + off], imm
///(dst + offset) as u64 = imm
. - ST_
DW_ REG - BPF opcode:
stxdw [dst + off], src
///(dst + offset) as u64 = src
. - ST_
H_ IMM - BPF opcode:
sth [dst + off], imm
///(dst + offset) as u16 = imm
. - ST_
H_ REG - BPF opcode:
stxh [dst + off], src
///(dst + offset) as u16 = src
. - ST_
W_ IMM - BPF opcode:
stw [dst + off], imm
///(dst + offset) as u32 = imm
. - ST_
W_ REG - BPF opcode:
stxw [dst + off], src
///(dst + offset) as u32 = src
. - SUB32_
IMM - BPF opcode:
sub32 dst, imm
///dst = imm - dst
. - SUB32_
REG - BPF opcode:
sub32 dst, src
///dst -= src
. - SUB64_
IMM - BPF opcode:
sub64 dst, imm
///dst -= imm
. - SUB64_
REG - BPF opcode:
sub64 dst, src
///dst -= src
. - SYSCALL
- BPF opcode:
syscall
///syscall imm
. /// Valid only since SBPFv3 - UDIV32_
IMM - BPF opcode:
uhmul32 dst, imm
///dst = (dst * imm) as u64
. BPF opcode:uhmul32 dst, src
///dst = (dst * src) as u64
. BPF opcode:udiv32 dst, imm
///dst /= imm
. - UDIV32_
REG - BPF opcode:
udiv32 dst, src
///dst /= src
. - UDIV64_
IMM - BPF opcode:
udiv64 dst, imm
///dst /= imm
. - UDIV64_
REG - BPF opcode:
udiv64 dst, src
///dst /= src
. - UHMU
L64_ IMM - BPF opcode:
uhmul64 dst, imm
///dst = (dst * imm) >> 64
. - UHMU
L64_ REG - BPF opcode:
uhmul64 dst, src
///dst = (dst * src) >> 64
. - UREM32_
IMM - BPF opcode:
urem32 dst, imm
///dst %= imm
. - UREM32_
REG - BPF opcode:
urem32 dst, src
///dst %= src
. - UREM64_
IMM - BPF opcode:
urem64 dst, imm
///dst %= imm
. - UREM64_
REG - BPF opcode:
urem64 dst, src
///dst %= src
. - VIRTUAL_
ADDRESS_ BITS - Upper half of a pointer is the region index, lower half the virtual address inside that region.
- XOR32_
IMM - BPF opcode:
xor32 dst, imm
///dst ^= imm
. - XOR32_
REG - BPF opcode:
xor32 dst, src
///dst ^= src
. - XOR64_
IMM - BPF opcode:
xor64 dst, imm
///dst ^= imm
. - XOR64_
REG - BPF opcode:
xor64 dst, src
///dst ^= src
.
Functions§
- augment_
lddw_ unchecked - Merge the two halves of a LD_DW_IMM instruction
- get_
insn - Get the instruction at
idx
of an eBPF program.idx
is the index (number) of the instruction (not a byte offset). The first instruction has index 0. - get_
insn_ unchecked - Same as
get_insn
except not checked - hash_
symbol_ name - Hash a symbol name