'maps' is a generic storage of different types for sharing data between kernel and userspace. The maps are accessed from user space via BPF syscall, which has commands: - create a map with given type and attributes fd = bpf(BPF_MAP_CREATE, union bpf_attr *attr, u32 size) returns fd or negative error - lookup key in a given map referenced by fd err = bpf(BPF_MAP_LOOKUP_ELEM, union bpf_attr *attr, u32 size) using attr->map_fd, attr->key, attr->value returns zero and stores found elem into value or negative error - create or update key/value pair in a given map err = bpf(BPF_MAP_UPDATE_ELEM, union bpf_attr *attr, u32 size) using attr->map_fd, attr->key, attr->value returns zero or negative error - find and delete element by key in a given map err = bpf(BPF_MAP_DELETE_ELEM, union bpf_attr *attr, u32 size) using attr->map_fd, attr->key - iterate map elements (based on input key return next_key) err = bpf(BPF_MAP_GET_NEXT_KEY, union bpf_attr *attr, u32 size) using attr->map_fd, attr->key, attr->next_key - close(fd) deletes the map
Showing the changes to include/uapi/linux (1 of 3 files). Show all
Unified · Split
| @@ -70,6 +70,35 @@ enum bpf_cmd { · 69 unmodified lines | ||
| 70 | 70 | * map is deleted when fd is closed |
| 71 | 71 | */ |
| 72 | 72 | BPF_MAP_CREATE, |
| 73 | + | |
| 74 | + /* lookup key in a given map | |
| 75 | + * err = bpf(BPF_MAP_LOOKUP_ELEM, union bpf_attr *attr, u32 size) | |
| 76 | + * Using attr->map_fd, attr->key, attr->value | |
| 77 | + * returns zero and stores found elem into value | |
| 78 | + * or negative error | |
| 79 | + */ | |
| 80 | + BPF_MAP_LOOKUP_ELEM, | |
| 81 | + | |
| 82 | + /* create or update key/value pair in a given map | |
| 83 | + * err = bpf(BPF_MAP_UPDATE_ELEM, union bpf_attr *attr, u32 size) | |
| 84 | + * Using attr->map_fd, attr->key, attr->value | |
| 85 | + * returns zero or negative error | |
| 86 | + */ | |
| 87 | + BPF_MAP_UPDATE_ELEM, | |
| 88 | + | |
| 89 | + /* find and delete elem by key in a given map | |
| 90 | + * err = bpf(BPF_MAP_DELETE_ELEM, union bpf_attr *attr, u32 size) | |
| 91 | + * Using attr->map_fd, attr->key | |
| 92 | + * returns zero or negative error | |
| 93 | + */ | |
| 94 | + BPF_MAP_DELETE_ELEM, | |
| 95 | + | |
| 96 | + /* lookup key in a given map and return next key | |
| 97 | + * err = bpf(BPF_MAP_GET_NEXT_KEY, union bpf_attr *attr, u32 size) | |
| 98 | + * Using attr->map_fd, attr->key, attr->next_key | |
| 99 | + * returns zero and stores next key or negative error | |
| 100 | + */ | |
| 101 | + BPF_MAP_GET_NEXT_KEY, | |
| 73 | 102 | }; |
| 74 | 103 | |
| 75 | 104 | enum bpf_map_type { |
| @@ -83,6 +112,15 @@ union bpf_attr { · 7 unmodified lines | ||
| 83 | 112 | __u32 value_size; /* size of value in bytes */ |
| 84 | 113 | __u32 max_entries; /* max number of entries in a map */ |
| 85 | 114 | }; |
| 115 | + | |
| 116 | + struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ | |
| 117 | + __u32 map_fd; | |
| 118 | + __aligned_u64 key; | |
| 119 | + union { | |
| 120 | + __aligned_u64 value; | |
| 121 | + __aligned_u64 next_key; | |
| 122 | + }; | |
| 123 | + }; | |
| 86 | 124 | } __attribute__((aligned(8))); |
| 87 | 125 | |
| 88 | 126 | #endif /* _UAPI__LINUX_BPF_H__ */ |