High-level FLOW_DISSECTOR DSL for BPF programs.
FLOW_DISSECTOR programs implement custom packet parsing logic for the kernel networking stack. They're used for flow hashing (RSS, ECMP routing) and can override the built-in C-based flow dissector.
Context: __sk_buff (same as TC programs) Output: struct bpf_flow_keys (written via skb->flow_keys pointer)
Return values:
Use cases:
Example: (defprogram my-flow-dissector :type :flow-dissector :license "GPL" :body (concat (flow-dissector-prologue :r6 :r2 :r3) ;; Parse headers and fill flow_keys (flow-dissector-ok)))
High-level FLOW_DISSECTOR DSL for BPF programs.
FLOW_DISSECTOR programs implement custom packet parsing logic for the
kernel networking stack. They're used for flow hashing (RSS, ECMP routing)
and can override the built-in C-based flow dissector.
Context: __sk_buff (same as TC programs)
Output: struct bpf_flow_keys (written via skb->flow_keys pointer)
Return values:
- BPF_OK (0): Continue/success
- BPF_DROP (-1): Stop dissection
Use cases:
- Custom protocol parsing (e.g., GRE, custom encapsulation)
- Non-standard header handling
- Protocol-specific flow hashing
- Debugging packet classification
Example:
(defprogram my-flow-dissector
:type :flow-dissector
:license "GPL"
:body (concat
(flow-dissector-prologue :r6 :r2 :r3)
;; Parse headers and fill flow_keys
(flow-dissector-ok)))(build-flow-dissector-program
{:keys [ctx-reg data-reg data-end-reg body default-action]
:or {ctx-reg :r6 data-reg :r2 data-end-reg :r3 default-action :ok}})Build a complete FLOW_DISSECTOR program.
Parameters:
Returns assembled program bytes.
Build a complete FLOW_DISSECTOR program. Parameters: - opts: Map with: :ctx-reg - Register to save context (default :r6) :data-reg - Register for data pointer (default :r2) :data-end-reg - Register for data_end (default :r3) :body - Vector of body instructions :default-action - :ok or :drop (default :ok) Returns assembled program bytes.
Common Ethernet protocol values (ETH_P_*).
Common Ethernet protocol values (ETH_P_*).
(flow-dissector-action action)Get FLOW_DISSECTOR action value.
Parameters:
Returns integer value.
Get FLOW_DISSECTOR action value. Parameters: - action: :ok (0) or :drop (-1) Returns integer value.
(flow-dissector-bounds-check data-reg data-end-reg offset fail-insns)Generate bounds check for packet access.
Parameters:
Returns vector of instructions.
Generate bounds check for packet access. Parameters: - data-reg: Register with data pointer - data-end-reg: Register with data_end pointer - offset: Offset to check (must be accessible) - fail-insns: Number of instructions to skip on bounds check failure Returns vector of instructions.
(flow-dissector-drop)Generate instructions to return BPF_DROP (stop dissection).
Returns vector of instructions.
Generate instructions to return BPF_DROP (stop dissection). Returns vector of instructions.
(flow-dissector-get-flow-keys-ptr ctx-reg dst-reg)Load pointer to flow_keys from __sk_buff.
The flow_keys field in __sk_buff contains a pointer to the bpf_flow_keys structure that the dissector should fill.
Parameters:
Returns ldx instruction.
Load pointer to flow_keys from __sk_buff. The flow_keys field in __sk_buff contains a pointer to the bpf_flow_keys structure that the dissector should fill. Parameters: - ctx-reg: Register containing __sk_buff pointer - dst-reg: Destination register for flow_keys pointer Returns ldx instruction.
(flow-dissector-load-ctx-field ctx-reg dst-reg field)Load a field from __sk_buff context.
Parameters:
Returns ldx instruction.
Load a field from __sk_buff context. Parameters: - ctx-reg: Register containing __sk_buff pointer - dst-reg: Destination register - field: Field keyword from skb-offsets Returns ldx instruction.
(flow-dissector-ok)Generate instructions to return BPF_OK (success).
Returns vector of instructions.
Generate instructions to return BPF_OK (success). Returns vector of instructions.
(flow-dissector-parse-ethernet data-reg data-end-reg keys-reg tmp-reg)Generate instructions to parse Ethernet header and check ethertype.
Sets up:
Parameters:
Returns vector of instructions (succeeds or falls through to drop).
Generate instructions to parse Ethernet header and check ethertype. Sets up: - Network header offset (nhoff) = 14 - Network protocol (n_proto) from ethertype Parameters: - data-reg: Register with data pointer - data-end-reg: Register with data_end pointer - keys-reg: Register with flow_keys pointer - tmp-reg: Temporary register Returns vector of instructions (succeeds or falls through to drop).
(flow-dissector-parse-ipv4 data-reg
data-end-reg
keys-reg
nhoff
tmp-reg
tmp-reg2)Generate instructions to parse IPv4 header.
Sets up:
Parameters:
Returns vector of instructions.
Generate instructions to parse IPv4 header. Sets up: - addr_proto = ETH_P_IP - ip_proto from IPv4 header - ipv4_src and ipv4_dst - Transport header offset (thoff) Parameters: - data-reg: Register with data pointer - data-end-reg: Register with data_end pointer - keys-reg: Register with flow_keys pointer - nhoff: Network header offset (usually 14 for Ethernet) - tmp-reg: Temporary register - tmp-reg2: Second temporary register Returns vector of instructions.
(flow-dissector-parse-tcp-ports data-reg data-end-reg keys-reg thoff tmp-reg)Generate instructions to parse TCP source and destination ports.
Parameters:
Returns vector of instructions.
Generate instructions to parse TCP source and destination ports. Parameters: - data-reg: Register with data pointer - data-end-reg: Register with data_end pointer - keys-reg: Register with flow_keys pointer - thoff: Transport header offset - tmp-reg: Temporary register Returns vector of instructions.
(flow-dissector-parse-udp-ports data-reg data-end-reg keys-reg thoff tmp-reg)Generate instructions to parse UDP source and destination ports.
Same as TCP ports (both have ports at same offsets).
Parameters:
Returns vector of instructions.
Generate instructions to parse UDP source and destination ports. Same as TCP ports (both have ports at same offsets). Parameters: - data-reg: Register with data pointer - data-end-reg: Register with data_end pointer - keys-reg: Register with flow_keys pointer - thoff: Transport header offset - tmp-reg: Temporary register Returns vector of instructions.
(flow-dissector-prologue ctx-save-reg data-reg data-end-reg)Generate FLOW_DISSECTOR program prologue.
Saves context and loads data pointers from __sk_buff.
Parameters:
Returns vector of instructions.
Generate FLOW_DISSECTOR program prologue. Saves context and loads data pointers from __sk_buff. Parameters: - ctx-save-reg: Register to save __sk_buff pointer - data-reg: Register for packet data pointer - data-end-reg: Register for data_end pointer Returns vector of instructions.
(flow-dissector-section-name)(flow-dissector-section-name name)Generate ELF section name for FLOW_DISSECTOR program.
Returns "flow_dissector" or "flow_dissector/<name>".
Generate ELF section name for FLOW_DISSECTOR program. Returns "flow_dissector" or "flow_dissector/<name>".
FLOW_DISSECTOR return values.
FLOW_DISSECTOR return values.
Flags for bpf_flow_keys.flags field.
Flags for bpf_flow_keys.flags field.
(flow-keys-load-u16 keys-reg dst-reg field)Load 16-bit value from flow_keys field.
Parameters:
Returns ldx instruction.
Load 16-bit value from flow_keys field. Parameters: - keys-reg: Register containing flow_keys pointer - dst-reg: Destination register - field: Field keyword Returns ldx instruction.
(flow-keys-load-u32 keys-reg dst-reg field)Load 32-bit value from flow_keys field.
Parameters:
Returns ldx instruction.
Load 32-bit value from flow_keys field. Parameters: - keys-reg: Register containing flow_keys pointer - dst-reg: Destination register - field: Field keyword Returns ldx instruction.
(flow-keys-load-u8 keys-reg dst-reg field)Load 8-bit value from flow_keys field.
Parameters:
Returns ldx instruction.
Load 8-bit value from flow_keys field. Parameters: - keys-reg: Register containing flow_keys pointer - dst-reg: Destination register - field: Field keyword Returns ldx instruction.
(flow-keys-offset field)Get offset for bpf_flow_keys field.
Parameters:
Returns integer offset.
Get offset for bpf_flow_keys field. Parameters: - field: Field keyword from flow-keys-offsets Returns integer offset.
Offsets in bpf_flow_keys structure.
This structure is passed to FLOW_DISSECTOR programs for output. The program fills in these fields based on packet parsing.
Offsets in bpf_flow_keys structure. This structure is passed to FLOW_DISSECTOR programs for output. The program fills in these fields based on packet parsing.
(flow-keys-set-addr-proto keys-reg value-reg)Set address protocol in flow_keys.
Parameters:
Returns stx instruction.
Set address protocol in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing protocol (ETH_P_IP, ETH_P_IPV6) Returns stx instruction.
(flow-keys-set-ip-proto keys-reg value-reg)Set IP protocol in flow_keys.
Parameters:
Returns stx instruction.
Set IP protocol in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing protocol (TCP=6, UDP=17, etc.) Returns stx instruction.
(flow-keys-set-ipv4-addrs keys-reg src-reg dst-reg)Set IPv4 source and destination addresses in flow_keys.
Parameters:
Returns vector of instructions.
Set IPv4 source and destination addresses in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - src-reg: Register containing source IPv4 address - dst-reg: Register containing destination IPv4 address Returns vector of instructions.
(flow-keys-set-is-encap keys-reg value-reg)Set is_encap flag in flow_keys.
Parameters:
Returns stx instruction.
Set is_encap flag in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing flag value (0 or 1) Returns stx instruction.
(flow-keys-set-is-first-frag keys-reg value-reg)Set is_first_frag flag in flow_keys.
Parameters:
Returns stx instruction.
Set is_first_frag flag in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing flag value (0 or 1) Returns stx instruction.
(flow-keys-set-is-frag keys-reg value-reg)Set is_frag flag in flow_keys.
Parameters:
Returns stx instruction.
Set is_frag flag in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing flag value (0 or 1) Returns stx instruction.
(flow-keys-set-n-proto keys-reg value-reg)Set network protocol in flow_keys.
Parameters:
Returns stx instruction.
Set network protocol in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing protocol (network byte order) Returns stx instruction.
(flow-keys-set-nhoff keys-reg value-reg)Set network header offset in flow_keys.
Parameters:
Returns stx instruction.
Set network header offset in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing offset value Returns stx instruction.
(flow-keys-set-ports keys-reg sport-reg dport-reg)Set source and destination ports in flow_keys.
Parameters:
Returns vector of instructions.
Set source and destination ports in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - sport-reg: Register containing source port - dport-reg: Register containing destination port Returns vector of instructions.
(flow-keys-set-thoff keys-reg value-reg)Set transport header offset in flow_keys.
Parameters:
Returns stx instruction.
Set transport header offset in flow_keys. Parameters: - keys-reg: Register containing flow_keys pointer - value-reg: Register containing offset value Returns stx instruction.
(flow-keys-store-u16 keys-reg field value-reg)Store 16-bit value to flow_keys field.
Parameters:
Returns stx instruction.
Store 16-bit value to flow_keys field. Parameters: - keys-reg: Register containing flow_keys pointer - field: Field keyword - value-reg: Register containing value to store Returns stx instruction.
(flow-keys-store-u32 keys-reg field value-reg)Store 32-bit value to flow_keys field.
Parameters:
Returns stx instruction.
Store 32-bit value to flow_keys field. Parameters: - keys-reg: Register containing flow_keys pointer - field: Field keyword - value-reg: Register containing value to store Returns stx instruction.
(flow-keys-store-u8 keys-reg field value-reg)Store 8-bit value to flow_keys field.
Parameters:
Returns stx instruction.
Store 8-bit value to flow_keys field. Parameters: - keys-reg: Register containing flow_keys pointer - field: Field keyword - value-reg: Register containing value to store Returns stx instruction.
(htonl value)Convert 32-bit value from host to network byte order (big-endian).
Parameters:
Returns network byte order value.
Convert 32-bit value from host to network byte order (big-endian). Parameters: - value: 32-bit integer Returns network byte order value.
(htons value)Convert 16-bit value from host to network byte order (big-endian).
Parameters:
Returns network byte order value.
Convert 16-bit value from host to network byte order (big-endian). Parameters: - value: 16-bit integer Returns network byte order value.
(make-flow-dissector-info program-name instructions)Create program metadata for a FLOW_DISSECTOR program.
Parameters:
Returns map with program metadata.
Create program metadata for a FLOW_DISSECTOR program. Parameters: - program-name: Name for the BPF program - instructions: Program instructions Returns map with program metadata.
(ntohl value)Convert 32-bit value from network to host byte order.
Parameters:
Returns host byte order value.
Convert 32-bit value from network to host byte order. Parameters: - value: 32-bit integer in network byte order Returns host byte order value.
(ntohs value)Convert 16-bit value from network to host byte order.
Parameters:
Returns host byte order value.
Convert 16-bit value from network to host byte order. Parameters: - value: 16-bit integer in network byte order Returns host byte order value.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |