这些标志主要用于在不同的 eBPF 函数调用中指定额外的操作选项。
1. BPF_ANY
- 用途:用于
bpf_map_update_elem
函数。 - 含义:表示在更新 map 元素时,如果 key 已存在,则更新 value;如果不存在,则插入新元素。
- 示例:
bpf_map_update_elem(&map, &key, &value, BPF_ANY);
2. BPF_NOEXIST
- 用途:用于
bpf_map_update_elem
函数。 - 含义:在插入元素时,如果 key 已存在,则返回错误;只有当 key 不存在时才插入。
- 示例:
bpf_map_update_elem(&map, &key, &value, BPF_NOEXIST);
3. BPF_EXIST
- 用途:用于
bpf_map_update_elem
函数。 - 含义:在更新 map 元素时,如果 key 不存在,则返回错误;只有当 key 已存在时才更新。
- 示例:
bpf_map_update_elem(&map, &key, &value, BPF_EXIST);
4. BPF_F_LOCK
- 用途:用于
bpf_spin_lock
,bpf_map_update_elem
,以及一些其他操作需要加锁的场景。 - 含义:此标志通常用于需要原子操作的 map 元素更新中,确保在多 CPU 上访问时不产生竞态条件。
- 示例:
struct bpf_spin_lock lock;
bpf_spin_lock(&lock);
// 需要加锁的操作
bpf_spin_unlock(&lock);
5. BPF_F_CURRENT_CPU
- 用途:用于
bpf_perf_event_output
和bpf_perf_event_read
函数。 - 含义:指定事件数据应写入到当前 CPU 的 perf 缓冲区中,以实现并行化数据处理。
- 示例:
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &data, sizeof(data));
6. BPF_F_INDEX_MASK
- 用途:主要用于
bpf_redirect
函数。 - 含义:在 XDP 程序中可以使用该标志,指定 XDP 的重定向目标接口的掩码。
- 示例:
bpf_redirect(ifindex | BPF_F_INDEX_MASK, 0);
7. BPF_F_PSEUDO_MAP_FD
- 用途:用于访问 map 文件描述符。
- 含义:在一些 BPF 指令中,指定访问 map 的文件描述符而不是 map 的指针,通常用于加载 BPF 字节码时的符号解析。
8. BPF_F_RECOMPUTE_CSUM
- 用途:主要用于
bpf_skb_store_bytes
函数。 - 含义:表示在修改数据包内容后重新计算校验和。
- 示例:
bpf_skb_store_bytes(skb, offset, &data, sizeof(data), BPF_F_RECOMPUTE_CSUM);
9. BPF_F_USER_STACK 和 BPF_F_KERNEL_STACK
- 用途:用于
bpf_get_stackid
函数。 - 含义:指定收集用户态或内核态的调用栈。
- 示例:
int stack_id = bpf_get_stackid(ctx, &stack_map, BPF_F_USER_STACK);
10. BPF_F_FAST_STACK_CMP 和 BPF_F_REUSE_STACKID
- 用途:也用于
bpf_get_stackid
函数。 - 含义:
BPF_F_FAST_STACK_CMP
允许快速比较栈帧,BPF_F_REUSE_STACKID
表示可重用栈 ID。 - 示例:
int stack_id = bpf_get_stackid(ctx, &stack_map, BPF_F_FAST_STACK_CMP | BPF_F_REUSE_STACKID);
11. BPF_F_TEST_RUN_ON_CPU
- 用途:用于
bpf_prog_test_run
测试 API。 - 含义:指定测试程序在指定的 CPU 上运行,用于测试环境的控制