diff options
author | Alexei Starovoitov <ast@plumgrid.com> | 2014-09-26 03:16:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-26 15:05:14 -0400 |
commit | db20fd2b01087bdfbe30bce314a198eefedcc42e (patch) | |
tree | c43a4e3edb46deae542c8e79d74d24703ffbdcca /include/uapi | |
parent | 749730ce42a2121e1c88350d69478bff3994b10a (diff) |
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
Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/uapi')
-rw-r--r-- | include/uapi/linux/bpf.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index f58a10f9670c..395cabd2ca0a 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h | |||
@@ -70,6 +70,35 @@ enum bpf_cmd { | |||
70 | * map is deleted when fd is closed | 70 | * map is deleted when fd is closed |
71 | */ | 71 | */ |
72 | BPF_MAP_CREATE, | 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 | enum bpf_map_type { | 104 | enum bpf_map_type { |
@@ -83,6 +112,15 @@ union bpf_attr { | |||
83 | __u32 value_size; /* size of value in bytes */ | 112 | __u32 value_size; /* size of value in bytes */ |
84 | __u32 max_entries; /* max number of entries in a map */ | 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 | } __attribute__((aligned(8))); | 124 | } __attribute__((aligned(8))); |
87 | 125 | ||
88 | #endif /* _UAPI__LINUX_BPF_H__ */ | 126 | #endif /* _UAPI__LINUX_BPF_H__ */ |