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;
    }
}

参考


推荐阅读: