Helper function bpf_ringbuf_reserve
Definition
Copyright (c) 2015 The Libbpf Authors. All rights reserved.
Reserve size bytes of payload in a ring buffer ringbuf. flags must be 0.
Returns
Valid pointer with size bytes of memory available; NULL, otherwise.
static void *(* const bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) = (void *) 131;
Usage
The rinfbuf
argument must be a pointer to a ring buffer definition. The size
argument specifies the number of bytes to be reserved in the ring buffer. And the flags
argument must be set to 0.
This function is generally used in combination with a struct
that defines the structure of the data stored in the ring buffer. Hence, in this case, the size
argument would be set to the size of the struct. The function returns a pointer to the reserved memory, which can be used to write data to the ring buffer. See the example below for more details.
Also check bpf_ringbuf_submit and bpf_ringbuf_discard for more information on how to handle the reserved memory in the ring buffer.
Program types
This helper call can be used in the following program types:
- BPF_PROG_TYPE_CGROUP_DEVICE
- BPF_PROG_TYPE_CGROUP_SKB
- BPF_PROG_TYPE_CGROUP_SOCK
- BPF_PROG_TYPE_CGROUP_SOCKOPT
- BPF_PROG_TYPE_CGROUP_SOCK_ADDR
- BPF_PROG_TYPE_CGROUP_SYSCTL
- BPF_PROG_TYPE_FLOW_DISSECTOR
- BPF_PROG_TYPE_KPROBE
- BPF_PROG_TYPE_LSM
- BPF_PROG_TYPE_LWT_IN
- BPF_PROG_TYPE_LWT_OUT
- BPF_PROG_TYPE_LWT_SEG6LOCAL
- BPF_PROG_TYPE_LWT_XMIT
- BPF_PROG_TYPE_PERF_EVENT
- BPF_PROG_TYPE_RAW_TRACEPOINT
- BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
- BPF_PROG_TYPE_SCHED_ACT
- BPF_PROG_TYPE_SCHED_CLS
- BPF_PROG_TYPE_SK_LOOKUP
- BPF_PROG_TYPE_SK_MSG
- BPF_PROG_TYPE_SK_REUSEPORT
- BPF_PROG_TYPE_SK_SKB
- BPF_PROG_TYPE_SOCKET_FILTER
- BPF_PROG_TYPE_SOCK_OPS
- BPF_PROG_TYPE_STRUCT_OPS
- BPF_PROG_TYPE_SYSCALL
- BPF_PROG_TYPE_TRACEPOINT
- BPF_PROG_TYPE_TRACING
- BPF_PROG_TYPE_XDP
Example
struct ringbuf_data *rb_data = bpf_ringbuf_reserve(&my_ringbuf, sizeof(struct ringbuf_data), 0);
if (! rb_data) {
// if bpf_ringbuf_reserve fails, print an error message and return
bpf_printk("bpf_ringbuf_reserve failed\n");
return 1;
}
Where my_ringbuf
is the pointer to the ring buffer, and ringbuf_data
is a struct that defines the structure of the data to be stored in the ring buffer.