Helper function bpf_map_update_elem
The update map element helper call is used to write values from maps.
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";