Helper function bpf_timer_init
This helper initializes a timer.
Definition
Copyright (c) 2015 The Libbpf Authors. All rights reserved.
Initialize the timer. First 4 bits of flags specify clockid. Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. All other bits of flags are reserved. The verifier will reject the program if timer is not from the same map.
Returns
0 on success. -EBUSY if timer is already initialized. -EINVAL if invalid flags are passed. -EPERM if timer is in a map that doesn't have any user references. The user space should either hold a file descriptor to a map with timers or pin such map in bpffs. When map is unpinned or file descriptor is closed all timers in the map will be cancelled and freed.
static long (* const bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) = (void *) 169;
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_LSM
- BPF_PROG_TYPE_LWT_IN
- BPF_PROG_TYPE_LWT_OUT
- BPF_PROG_TYPE_LWT_SEG6LOCAL
- BPF_PROG_TYPE_LWT_XMIT
- 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_SYSCALL
- BPF_PROG_TYPE_TRACING
- BPF_PROG_TYPE_XDP
Example
#include <linux/bpf.h>
#include <time.h>
#include <stdbool.h>
#include <errno.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
struct elem {
    struct bpf_timer t;
};
struct {
    __uint(type, BPF_MAP_TYPE_ARRAY);
    __uint(max_entries, 1);
    __type(key, int);
    __type(value, struct elem);
} hmap SEC(".maps");
static int timer_callback(void* hmap, int* key, struct bpf_timer *timer)
{
        bpf_printk("Callback was invoked do something useful");
    return 0;
}
SEC("cgroup_skb/egress")
int bpf_prog1(void *ctx)
{
    struct bpf_timer *timer;
    int err, key = 0;
    struct elem init;
    struct elem* ele;
    __builtin_memset(&init, 0, sizeof(struct elem));
    bpf_map_update_elem(&hmap, &key, &init, BPF_ANY);
    ele = bpf_map_lookup_elem(&hmap, &key);
    if (!ele)
        return 1;
    timer = &ele->t;
    err = bpf_timer_init(timer, &hmap, CLOCK_MONOTONIC);
    if (err && err != -EBUSY)
        return 1;
    bpf_timer_set_callback(timer, timer_callback);
    bpf_timer_start(timer, 0, 0);
    bpf_timer_cancel(timer);
    return 0;
}
char _license[] SEC("license") = "GPL";