Helper function bpf_map_update_elem
The update map element helper call is used to write values from maps.
Note
This helper function is only callable from eBPF, but has the same name as the bpf_map_update_elem
userspace library function, which can only be used from userspace programs.
Definition
Copyright (c) 2015 The Libbpf Authors. All rights reserved.
static long (* const bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2;
Usage
Arguments of this helper are map
which is a pointer to a map definition, key
which is a pointer to the key you
wish to write to, value
which is a pointer to the value you wish to write to the map, and flags
which are described below.
The flags
argument can be one of the following values:
BPF_NOEXIST
- If set the update will only happen if the key doesn't exist yet, to prevent overwriting existing data.BPF_EXIST
- If set the update will only happen if the key exists, to ensure an update and no new key creation.BPF_ANY
- It doesn't matter, an update will be attempted in both cases.
Info
BPF_NOEXIST
isn't supported for array type maps since all keys always exist.
The return value will be 0
on success or a negative valued error number indicating a failure.
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>
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__type(key, u32);
__type(value, u32);
__uint(max_entries, 1);
} cnt_map SEC(".maps");
SEC("tracepoint/syscalls/sys_enter_openat")
int bpf_prog1(void* ctx)
{
const char fmt_str[] = "Hello, world! number of openat calls total %d\n";
u32 key = 0, init_val=0;
u32 *cnt = bpf_map_lookup_elem(&cnt_map, &key);
if(cnt) {
__sync_fetch_and_add(cnt, 1);
} else {
bpf_map_update_elem(&cnt_map, &key, &init_val, BPF_ANY);
return 0;
}
bpf_trace_printk(fmt_str, sizeof(fmt_str), *cnt);
return 0;
}
char LICENSE[] SEC("license") = "GPL";