Helper function bpf_ringbuf_discard
Definition
Copyright (c) 2015 The Libbpf Authors. All rights reserved.
Discard reserved ring buffer sample, pointed to by data. If BPF_RB_NO_WAKEUP is specified in flags, no notification of new data availability is sent. If BPF_RB_FORCE_WAKEUP is specified in flags, notification of new data availability is sent unconditionally. If 0 is specified in flags, an adaptive notification of new data availability is sent.
See 'bpf_ringbuf_output()' for the definition of adaptive notification.
Returns
Nothing. Always succeeds.
static void (* const bpf_ringbuf_discard)(void *data, __u64 flags) = (void *) 133;
Usage
This function discards the reserved memory in the ring buffer. The data
argument must be a pointer to the reserved memory. The flags
argument, similar to bpf_ringbuf_submit, can be set to BPF_RB_NO_WAKEUP, BPF_RB_FORCE_WAKEUP, or 0 to specify how the notification of the discarded data should be handled. This function must be used if space is reserved in the ring buffer but the flow does not lead to bpf_ringbuf_submit.
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_NETFILTER
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
// Reserve space in the ring buffer
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;
}
if(unhappy_flow) {
// Discard the reserved data
bpf_ringbuf_discard(rb_data, 0);
return 1;
}
// Submit the reserved data
bpf_ringbuf_submit(rb_data, 0);