mpas 类型
类型名称 |
解释 |
BPFMAPTYPE_ARRAY |
|
BPFMAPTYPEPERCPUARRAY |
|
BPFMAPTYPEBLOOMFILTER |
|
BPFMAPTYPECGROUPSTORAGE |
|
BPFMAPTYPECGRPSTORAGE |
|
BPFMAPTYPE_CPUMAP |
|
BPFMAPTYPE_DEVMAP |
|
BPFMAPTYPEDEVMAPHASH |
|
BPFMAPTYPE_HASH |
哈希表映射,用于保存 key/value 对 |
BPFMAPTYPEPERCPUHASH |
|
BPFMAPTYPELRUHASH |
哈希表,拥有 LRU 功能 |
BPFMAPTYPELPMTRIE |
|
BPFMAPTYPEARRAYOF_MAPS |
|
BPFMAPTYPEHASHOF_MAPS |
|
BPFMAPTYPE_QUEUE |
|
BPFMAPTYPE_STACK |
调用栈跟踪映射,用于存储调试栈信息 |
BPFMAPTYPESKSTORAGE |
|
BPFMAPTYPE_SOCKMAP |
套接字映射,用于存储套接字引用,特别是用于套接字的重定向 |
BPFMAPTYPE_SOCKHASH |
|
BPFMAPTYPE_XSKMAP |
|
定义一个 maps
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__type(key, u32);
__type(value, long);
__uint(max_entries, 256);
} my_map SEC(".mpas");
相关函数
- bpfmaplookupelem(&mymap, &index) 从 map 中查找一个元素
- _syncfetchandadd(value, 1) 原子自增 1
- bpfmapupdateelem(&mymap, &index, &value, BPF_ANY) 更新数值
- long bpfmapdeleteelem(struct bpfmap *map, const void *key) 删除元素
遍历 maps
- 遍历 maps 有点意思,起到关键的就是
next_key
- bpfmapgetnextkey 通过一个
null key
获取 nextkey,指针取地址
- bpfmaplookupelem 查找元素
- 将 next_key 赋值给当前 key。
- 用起来其它的语言方便
#include <bpf/libbpf.h>
#include <bpf/bpf.h>
static void walk_hash_elements(int map_fd)
{
struct key *cur_key = NULL;
struct key next_key;
struct value value;
int err;
for (;;) {
err = bpf_map_get_next_key(map_fd, cur_key, &next_key);
if (err)
break;
bpf_map_lookup_elem(map_fd, &next_key, &value);
// Use key and value here
cur_key = &next_key;
}
}
参考