History

bpf: add lookup/update/delete/iterate methods to BPF maps

'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

Alexei Starovoitov committed 12 years ago

Commit db20fd21 parent 749730c3 files · +281 −0Browse files

Showing the changes to include/uapi/linux (1 of 3 files). Show all

Unified · Split

include/uapi/linux/bpf.h+38−0
@@ -70,6 +70,35 @@ enum bpf_cmd { · 69 unmodified lines
7070 * map is deleted when fd is closed
7171 */
7272 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,
73102 };
74103
75104 enum bpf_map_type {
@@ -83,6 +112,15 @@ union bpf_attr { · 7 unmodified lines
83112 __u32 value_size; /* size of value in bytes */
84113 __u32 max_entries; /* max number of entries in a map */
85114 };
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+ };
86124 } __attribute__((aligned(8)));
87125
88126 #endif /* _UAPI__LINUX_BPF_H__ */