Helper function bpf_map_peek_elem
Definition
Copyright (c) 2015 The Libbpf Authors. All rights reserved.
Get an element from map without removing it.
Returns
0 on success, or a negative error in case of failure.
static long (* const bpf_map_peek_elem)(void *map, void *value) = (void *) 89;
Usage
Docs could be improved
This part of the docs is incomplete, contributions are very welcome
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_LIRC_MODE2
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
Map types
This helper call can be used with the following map types:
Example
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#define TC_ACT_OK 0
struct {
__uint(type, BPF_MAP_TYPE_QUEUE);
__uint(max_entries, 8);
__uint(value_size, sizeof(__u32));
} ingress SEC(".maps");
SEC("tc")
int tc_ingress(struct __sk_buff *skb)
{
void* data_end = (void *)(long)skb->data_end;
void* data = (void *)(long)skb->data;
u32 value;
int err;
struct ethhdr* eth = (struct ethhdr *)data;
if ((void *)(eth + 1) > data_end)
return TC_ACT_OK;
struct iphdr* iph = (struct iphdr *)(eth + 1);
if ((void *)(iph + 1) > data_end)
return TC_ACT_OK; // Check IP header
err = bpf_map_push_elem(&ingress, &iph->saddr, 0);
bpf_printk("Pushed something to queue");
if (err)
return TC_ACT_OK;
err = bpf_map_peek_elem(&ingress, &value);
bpf_printk("Peeked at something in queue");
if (err)
return TC_ACT_OK;
if(value == iph->saddr)
{
err = bpf_map_pop_elem(&ingress, &value);
bpf_printk("Popped something from queue");
if (err)
return TC_ACT_OK;
}
return TC_ACT_OK;
}
char _license[] SEC("license") = "GPL";