Common eBPF program fragments and DSL utilities shared between XDP and TC programs.
Common eBPF program fragments and DSL utilities shared between XDP and TC programs.
(add-imm dst imm)Add immediate to register.
Add immediate to register.
(assemble-program & fragments)Assemble a program from instruction fragments. Returns BPF bytecode ready for loading.
Assemble a program from instruction fragments. Returns BPF bytecode ready for loading.
(build-bounds-check offset size fail-offset)Generate instructions to check if accessing [data + offset, data + offset + size) is within packet bounds. Jumps forward by fail-offset if out of bounds.
Assumes: r6 = data start, r7 = data end Uses: r8 as scratch
Generate instructions to check if accessing [data + offset, data + offset + size) is within packet bounds. Jumps forward by fail-offset if out of bounds. Assumes: r6 = data start, r7 = data end Uses: r8 as scratch
(build-get-prandom-u32)Get a pseudo-random 32-bit number. Result in r0.
Get a pseudo-random 32-bit number. Result in r0.
(build-ktime-get-ns)Get current time in nanoseconds. Result in r0.
Get current time in nanoseconds. Result in r0.
(build-l3-csum-replace skb-reg csum-off old-reg new-reg)Generate incremental IP checksum update.
skb-reg: Register containing skb/xdp_md pointer csum-off: Offset of checksum field in packet old-val: Old value (in register) new-val: New value (in register)
Generate incremental IP checksum update. skb-reg: Register containing skb/xdp_md pointer csum-off: Offset of checksum field in packet old-val: Old value (in register) new-val: New value (in register)
(build-l4-csum-replace skb-reg csum-off old-reg new-reg flags)Generate incremental L4 (TCP/UDP) checksum update.
skb-reg: Register containing skb/xdp_md pointer csum-off: Offset of checksum field in packet old-val: Old value (in register) new-val: New value (in register) flags: BPF_F flags (use BPF-F-PSEUDO-HDR for IP address changes)
Generate incremental L4 (TCP/UDP) checksum update. skb-reg: Register containing skb/xdp_md pointer csum-off: Offset of checksum field in packet old-val: Old value (in register) new-val: New value (in register) flags: BPF_F flags (use BPF-F-PSEUDO-HDR for IP address changes)
(build-map-lookup map-fd key-stack-off)Generate instructions for bpf_map_lookup_elem.
Args: map-fd: The map file descriptor (will be loaded as 64-bit immediate) key-stack-off: Stack offset where key is stored (negative)
Returns: instructions that leave result pointer in r0 (or NULL)
Generate instructions for bpf_map_lookup_elem. Args: map-fd: The map file descriptor (will be loaded as 64-bit immediate) key-stack-off: Stack offset where key is stored (negative) Returns: instructions that leave result pointer in r0 (or NULL)
(build-map-update map-fd key-stack-off value-stack-off flags)Generate instructions for bpf_map_update_elem.
Args: map-fd: The map file descriptor key-stack-off: Stack offset where key is stored value-stack-off: Stack offset where value is stored flags: Update flags (0 = any, 1 = noexist, 2 = exist)
Generate instructions for bpf_map_update_elem. Args: map-fd: The map file descriptor key-stack-off: Stack offset where key is stored value-stack-off: Stack offset where value is stored flags: Update flags (0 = any, 1 = noexist, 2 = exist)
(build-parse-eth pass-offset)Parse Ethernet header and check for IPv4.
Assumes: r6 = data, r7 = data_end After: jumps forward by pass-offset if not IPv4 Uses: r8 as scratch
Parse Ethernet header and check for IPv4. Assumes: r6 = data, r7 = data_end After: jumps forward by pass-offset if not IPv4 Uses: r8 as scratch
(build-parse-ip pass-offset)Parse IPv4 header, extract protocol and addresses.
Assumes: r6 = data, r7 = data_end, Ethernet header already validated Stores on stack: stack[-4] = protocol (1 byte as word) stack[-8] = src IP stack[-12] = dst IP stack[-16] = IP header length (bytes) Uses: r8, r9 as scratch
Parse IPv4 header, extract protocol and addresses. Assumes: r6 = data, r7 = data_end, Ethernet header already validated Stores on stack: stack[-4] = protocol (1 byte as word) stack[-8] = src IP stack[-12] = dst IP stack[-16] = IP header length (bytes) Uses: r8, r9 as scratch
(build-parse-l4 pass-offset)Parse TCP/UDP header to extract ports.
Assumes: stack[-16] = IP header length, r6 = data, r7 = data_end Stores on stack: stack[-20] = src port stack[-24] = dst port Uses: r8, r9
Parse TCP/UDP header to extract ports. Assumes: stack[-16] = IP header length, r6 = data, r7 = data_end Stores on stack: stack[-20] = src port stack[-24] = dst port Uses: r8, r9
(build-random-mod-100)Generate random number in range [0, 99]. Result in r0. Uses: r0, r1 as scratch
Generate random number in range [0, 99]. Result in r0. Uses: r0, r1 as scratch
(build-ringbuf-discard ptr-reg)Discard ring buffer reservation.
ptr-reg: Register containing pointer from reserve
Discard ring buffer reservation. ptr-reg: Register containing pointer from reserve
(build-ringbuf-reserve ringbuf-fd size)Reserve space in ring buffer.
ringbuf-fd: Ring buffer map FD size: Size to reserve
Returns ptr in r0 (or NULL on failure)
Reserve space in ring buffer. ringbuf-fd: Ring buffer map FD size: Size to reserve Returns ptr in r0 (or NULL on failure)
(build-ringbuf-submit ptr-reg)Submit ring buffer entry.
ptr-reg: Register containing pointer from reserve
Submit ring buffer entry. ptr-reg: Register containing pointer from reserve
(flatten-instructions & instruction-groups)Flatten nested instruction vectors. Returns a flat vector of instructions.
Flatten nested instruction vectors. Returns a flat vector of instructions.
(ldx-dw dst src off)Load double-word (8 bytes) from memory.
Load double-word (8 bytes) from memory.
(ldx-h dst src off)Load half-word (2 bytes) from memory.
Load half-word (2 bytes) from memory.
(ldx-w dst src off)Load word (4 bytes) from memory.
Load word (4 bytes) from memory.
(map-fd m)Get the raw file descriptor for a map. This is needed when building eBPF programs that reference maps.
Get the raw file descriptor for a map. This is needed when building eBPF programs that reference maps.
(mov-imm dst imm)Move immediate value to register.
Move immediate value to register.
(mov-reg dst src)Move register to register.
Move register to register.
(stx-b dst src off)Store byte to memory. Signature: *(dst + off) = src
Store byte to memory. Signature: *(dst + off) = src
(stx-dw dst src off)Store double-word to memory. Signature: *(dst + off) = src
Store double-word to memory. Signature: *(dst + off) = src
(stx-h dst src off)Store half-word to memory. Signature: *(dst + off) = src
Store half-word to memory. Signature: *(dst + off) = src
(stx-w dst src off)Store word to memory. Signature: *(dst + off) = src
Store word to memory. Signature: *(dst + off) = src
(sub-imm dst imm)Subtract immediate from register.
Subtract immediate from register.
(sub-reg dst src)Subtract register from register.
Subtract register from register.
(tc-drop-all)Simple TC program that drops all packets.
Simple TC program that drops all packets.
(tc-pass-all)Simple TC program that passes all packets.
Simple TC program that passes all packets.
(xdp-drop-all)Simple XDP program that drops all packets.
Simple XDP program that drops all packets.
(xdp-pass-all)Simple XDP program that passes all packets. Useful for testing XDP attachment.
Simple XDP program that passes all packets. Useful for testing XDP attachment.
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 |