• Home
  • Raw
  • Download

Lines Matching +full:key +full:- +full:value

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2 /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
85 return -1; in map_type_from_str()
90 if (map_is_per_cpu(info->type)) in alloc_value()
91 return malloc(round_up(info->value_size, 8) * in alloc_value()
94 return malloc(info->value_size); in alloc_value()
98 struct bpf_map_info *map_info, void *key, in do_dump_btf() argument
99 void *value) in do_dump_btf() argument
104 /* start of key-value pair */ in do_dump_btf()
105 jsonw_start_object(d->jw); in do_dump_btf()
107 if (map_info->btf_key_type_id) { in do_dump_btf()
108 jsonw_name(d->jw, "key"); in do_dump_btf()
110 ret = btf_dumper_type(d, map_info->btf_key_type_id, key); in do_dump_btf()
115 value_id = map_info->btf_vmlinux_value_type_id ? in do_dump_btf()
116 : map_info->btf_value_type_id; in do_dump_btf()
118 if (!map_is_per_cpu(map_info->type)) { in do_dump_btf()
119 jsonw_name(d->jw, "value"); in do_dump_btf()
120 ret = btf_dumper_type(d, value_id, value); in do_dump_btf()
124 jsonw_name(d->jw, "values"); in do_dump_btf()
125 jsonw_start_array(d->jw); in do_dump_btf()
127 step = round_up(map_info->value_size, 8); in do_dump_btf()
129 jsonw_start_object(d->jw); in do_dump_btf()
130 jsonw_int_field(d->jw, "cpu", i); in do_dump_btf()
131 jsonw_name(d->jw, "value"); in do_dump_btf()
132 ret = btf_dumper_type(d, value_id, value + i * step); in do_dump_btf()
133 jsonw_end_object(d->jw); in do_dump_btf()
137 jsonw_end_array(d->jw); in do_dump_btf()
141 /* end of key-value pair */ in do_dump_btf()
142 jsonw_end_object(d->jw); in do_dump_btf()
158 static void print_entry_json(struct bpf_map_info *info, unsigned char *key, in print_entry_json() argument
159 unsigned char *value, struct btf *btf) in print_entry_json() argument
163 if (!map_is_per_cpu(info->type)) { in print_entry_json()
164 jsonw_name(json_wtr, "key"); in print_entry_json()
165 print_hex_data_json(key, info->key_size); in print_entry_json()
166 jsonw_name(json_wtr, "value"); in print_entry_json()
167 print_hex_data_json(value, info->value_size); in print_entry_json()
176 do_dump_btf(&d, info, key, value); in print_entry_json()
182 step = round_up(info->value_size, 8); in print_entry_json()
184 jsonw_name(json_wtr, "key"); in print_entry_json()
185 print_hex_data_json(key, info->key_size); in print_entry_json()
194 jsonw_name(json_wtr, "value"); in print_entry_json()
195 print_hex_data_json(value + i * step, in print_entry_json()
196 info->value_size); in print_entry_json()
209 do_dump_btf(&d, info, key, value); in print_entry_json()
217 print_entry_error_msg(struct bpf_map_info *info, unsigned char *key, in print_entry_error_msg() argument
223 break_names = info->key_size > 16 || msg_size > 16; in print_entry_error_msg()
224 single_line = info->key_size + msg_size <= 24 && !break_names; in print_entry_error_msg()
226 printf("key:%c", break_names ? '\n' : ' '); in print_entry_error_msg()
227 fprint_hex(stdout, key, info->key_size, " "); in print_entry_error_msg()
231 printf("value:%c%s", break_names ? '\n' : ' ', error_msg); in print_entry_error_msg()
237 print_entry_error(struct bpf_map_info *map_info, void *key, int lookup_errno) in print_entry_error() argument
239 /* For prog_array maps or arrays of maps, failure to lookup the value in print_entry_error()
240 * means there is no entry for that key. Do not print an error message in print_entry_error()
243 if ((map_is_map_of_maps(map_info->type) || in print_entry_error()
244 map_is_map_of_progs(map_info->type)) && lookup_errno == ENOENT) in print_entry_error()
249 jsonw_name(json_wtr, "key"); in print_entry_error()
250 print_hex_data_json(key, map_info->key_size); in print_entry_error()
251 jsonw_name(json_wtr, "value"); in print_entry_error()
262 map_info->type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY) in print_entry_error()
265 print_entry_error_msg(map_info, key, in print_entry_error()
270 static void print_entry_plain(struct bpf_map_info *info, unsigned char *key, in print_entry_plain() argument
271 unsigned char *value) in print_entry_plain() argument
273 if (!map_is_per_cpu(info->type)) { in print_entry_plain()
276 break_names = info->key_size > 16 || info->value_size > 16; in print_entry_plain()
277 single_line = info->key_size + info->value_size <= 24 && in print_entry_plain()
280 if (info->key_size) { in print_entry_plain()
281 printf("key:%c", break_names ? '\n' : ' '); in print_entry_plain()
282 fprint_hex(stdout, key, info->key_size, " "); in print_entry_plain()
287 if (info->value_size) { in print_entry_plain()
288 printf("value:%c", break_names ? '\n' : ' '); in print_entry_plain()
289 fprint_hex(stdout, value, info->value_size, " "); in print_entry_plain()
297 step = round_up(info->value_size, 8); in print_entry_plain()
299 if (info->key_size) { in print_entry_plain()
300 printf("key:\n"); in print_entry_plain()
301 fprint_hex(stdout, key, info->key_size, " "); in print_entry_plain()
304 if (info->value_size) { in print_entry_plain()
306 printf("value (CPU %02d):%c", in print_entry_plain()
307 i, info->value_size > 16 ? '\n' : ' '); in print_entry_plain()
308 fprint_hex(stdout, value + i * step, in print_entry_plain()
309 info->value_size, " "); in print_entry_plain()
344 /* on per cpu maps we must copy the provided value on all value instances */
345 static void fill_per_cpu_value(struct bpf_map_info *info, void *value) in fill_per_cpu_value() argument
349 if (!map_is_per_cpu(info->type)) in fill_per_cpu_value()
353 step = round_up(info->value_size, 8); in fill_per_cpu_value()
355 memcpy(value + i * step, value, info->value_size); in fill_per_cpu_value()
359 void *key, void *value, __u32 key_size, __u32 value_size, in parse_elem() argument
363 if (!key && !value) in parse_elem()
365 p_err("did not find %s", key ? "key" : "value"); in parse_elem()
366 return -1; in parse_elem()
369 if (is_prefix(*argv, "key")) { in parse_elem()
370 if (!key) { in parse_elem()
372 p_err("duplicate key"); in parse_elem()
374 p_err("unnecessary key"); in parse_elem()
375 return -1; in parse_elem()
378 argv = parse_bytes(argv + 1, "key", key, key_size); in parse_elem()
380 return -1; in parse_elem()
382 return parse_elem(argv, info, NULL, value, key_size, value_size, in parse_elem()
384 } else if (is_prefix(*argv, "value")) { in parse_elem()
387 if (!value) { in parse_elem()
389 p_err("duplicate value"); in parse_elem()
391 p_err("unnecessary value"); in parse_elem()
392 return -1; in parse_elem()
397 if (map_is_map_of_maps(info->type)) { in parse_elem()
401 p_err("value smaller than 4B for map in map?"); in parse_elem()
402 return -1; in parse_elem()
405 p_err("not enough value arguments for map in map"); in parse_elem()
406 return -1; in parse_elem()
411 return -1; in parse_elem()
413 *value_fd = value; in parse_elem()
415 } else if (map_is_map_of_progs(info->type)) { in parse_elem()
419 p_err("value smaller than 4B for map of progs?"); in parse_elem()
420 return -1; in parse_elem()
423 p_err("not enough value arguments for map of progs"); in parse_elem()
424 return -1; in parse_elem()
432 return -1; in parse_elem()
434 *value_fd = value; in parse_elem()
437 argv = parse_bytes(argv, "value", value, value_size); in parse_elem()
439 return -1; in parse_elem()
441 fill_per_cpu_value(info, value); in parse_elem()
444 return parse_elem(argv, info, key, NULL, key_size, value_size, in parse_elem()
450 return -1; in parse_elem()
460 return parse_elem(argv + 1, info, key, value, key_size, in parse_elem()
464 p_err("expected key or value, got: %s", *argv); in parse_elem()
465 return -1; in parse_elem()
470 jsonw_uint_field(wtr, "id", info->id); in show_map_header_json()
471 if (info->type < ARRAY_SIZE(map_type_name)) in show_map_header_json()
472 jsonw_string_field(wtr, "type", map_type_name[info->type]); in show_map_header_json()
474 jsonw_uint_field(wtr, "type", info->type); in show_map_header_json()
476 if (*info->name) in show_map_header_json()
477 jsonw_string_field(wtr, "name", info->name); in show_map_header_json()
480 jsonw_printf(wtr, "%d", info->map_flags); in show_map_header_json()
495 print_dev_json(info->ifindex, info->netns_dev, info->netns_ino); in show_map_close_json()
497 jsonw_uint_field(json_wtr, "bytes_key", info->key_size); in show_map_close_json()
498 jsonw_uint_field(json_wtr, "bytes_value", info->value_size); in show_map_close_json()
499 jsonw_uint_field(json_wtr, "max_entries", info->max_entries); in show_map_close_json()
505 if (info->type == BPF_MAP_TYPE_PROG_ARRAY) { in show_map_close_json()
534 if (info->btf_id) in show_map_close_json()
535 jsonw_int_field(json_wtr, "btf_id", info->btf_id); in show_map_close_json()
542 hash_for_each_possible(map_table.table, obj, hash, info->id) { in show_map_close_json()
543 if (obj->id == info->id) in show_map_close_json()
544 jsonw_string(json_wtr, obj->path); in show_map_close_json()
549 emit_obj_refs_json(&refs_table, info->id, json_wtr); in show_map_close_json()
558 printf("%u: ", info->id); in show_map_header_plain()
559 if (info->type < ARRAY_SIZE(map_type_name)) in show_map_header_plain()
560 printf("%s ", map_type_name[info->type]); in show_map_header_plain()
562 printf("type %u ", info->type); in show_map_header_plain()
564 if (*info->name) in show_map_header_plain()
565 printf("name %s ", info->name); in show_map_header_plain()
567 printf("flags 0x%x", info->map_flags); in show_map_header_plain()
568 print_dev_plain(info->ifindex, info->netns_dev, info->netns_ino); in show_map_header_plain()
581 printf("\tkey %uB value %uB max_entries %u", in show_map_close_plain()
582 info->key_size, info->value_size, info->max_entries); in show_map_close_plain()
588 if (info->type == BPF_MAP_TYPE_PROG_ARRAY) { in show_map_close_plain()
615 hash_for_each_possible(map_table.table, obj, hash, info->id) { in show_map_close_plain()
616 if (obj->id == info->id) in show_map_close_plain()
617 printf("\n\tpinned %s", obj->path); in show_map_close_plain()
627 if (!info->btf_id && !frozen) in show_map_close_plain()
632 if (info->btf_id) in show_map_close_plain()
633 printf("btf_id %d", info->btf_id); in show_map_close_plain()
636 printf("%sfrozen", info->btf_id ? " " : ""); in show_map_close_plain()
638 emit_obj_refs_plain(&refs_table, info->id, "\n\tpids "); in show_map_close_plain()
650 int err = -1; in do_show_subset()
655 return -1; in do_show_subset()
714 errno == EINVAL ? " -- kernel too old?" : ""); in do_show()
744 return errno == ENOENT ? 0 : -1; in do_show()
747 static int dump_map_elem(int fd, void *key, void *value, in dump_map_elem() argument
751 if (bpf_map_lookup_elem(fd, key, value)) { in dump_map_elem()
752 print_entry_error(map_info, key, errno); in dump_map_elem()
753 return -1; in dump_map_elem()
757 print_entry_json(map_info, key, value, btf); in dump_map_elem()
765 do_dump_btf(&d, map_info, key, value); in dump_map_elem()
767 print_entry_plain(map_info, key, value); in dump_map_elem()
783 return -1; in maps_have_btf()
799 if (info->btf_vmlinux_value_type_id) { in get_map_kv_btf()
806 } else if (info->btf_value_type_id) { in get_map_kv_btf()
809 err = btf__get_from_id(info->btf_id, &btf); in get_map_kv_btf()
812 btf = err ? ERR_PTR(err) : ERR_PTR(-ESRCH); in get_map_kv_btf()
835 void *key, *value, *prev_key; in map_dump() local
840 key = malloc(info->key_size); in map_dump()
841 value = alloc_value(info); in map_dump()
842 if (!key || !value) { in map_dump()
844 err = -1; in map_dump()
867 if (info->type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY && in map_dump()
868 info->value_size != 8) in map_dump()
870 map_type_name[info->type]); in map_dump()
872 err = bpf_map_get_next_key(fd, prev_key, key); in map_dump()
878 if (!dump_map_elem(fd, key, value, info, btf, wtr)) in map_dump()
880 prev_key = key; in map_dump()
893 free(key); in map_dump()
894 free(value); in map_dump()
908 int err = -1; in do_dump()
916 return -1; in do_dump()
947 if (!wtr && i != nb_fds - 1) in do_dump()
968 static int alloc_key_value(struct bpf_map_info *info, void **key, void **value) in alloc_key_value() argument
970 *key = NULL; in alloc_key_value()
971 *value = NULL; in alloc_key_value()
973 if (info->key_size) { in alloc_key_value()
974 *key = malloc(info->key_size); in alloc_key_value()
975 if (!*key) { in alloc_key_value()
976 p_err("key mem alloc failed"); in alloc_key_value()
977 return -1; in alloc_key_value()
981 if (info->value_size) { in alloc_key_value()
982 *value = alloc_value(info); in alloc_key_value()
983 if (!*value) { in alloc_key_value()
984 p_err("value mem alloc failed"); in alloc_key_value()
985 free(*key); in alloc_key_value()
986 *key = NULL; in alloc_key_value()
987 return -1; in alloc_key_value()
1000 void *key, *value; in do_update() local
1008 return -1; in do_update()
1010 err = alloc_key_value(&info, &key, &value); in do_update()
1014 err = parse_elem(argv, &info, key, value, info.key_size, in do_update()
1019 err = bpf_map_update_elem(fd, key, value, flags); in do_update()
1028 free(key); in do_update()
1029 free(value); in do_update()
1037 static void print_key_value(struct bpf_map_info *info, void *key, in print_key_value() argument
1038 void *value) in print_key_value() argument
1044 err = btf__get_from_id(info->btf_id, &btf); in print_key_value()
1051 print_entry_json(info, key, value, btf); in print_key_value()
1061 print_entry_plain(info, key, value); in print_key_value()
1069 do_dump_btf(&d, info, key, value); in print_key_value()
1073 print_entry_plain(info, key, value); in print_key_value()
1082 void *key, *value; in do_lookup() local
1091 return -1; in do_lookup()
1093 err = alloc_key_value(&info, &key, &value); in do_lookup()
1097 err = parse_elem(argv, &info, key, NULL, info.key_size, 0, NULL, NULL); in do_lookup()
1101 err = bpf_map_lookup_elem(fd, key, value); in do_lookup()
1107 printf("key:\n"); in do_lookup()
1108 fprint_hex(stdout, key, info.key_size, " "); in do_lookup()
1119 print_key_value(&info, key, value); in do_lookup()
1122 free(key); in do_lookup()
1123 free(value); in do_lookup()
1133 void *key, *nextkey; in do_getnext() local
1142 return -1; in do_getnext()
1144 key = malloc(info.key_size); in do_getnext()
1146 if (!key || !nextkey) { in do_getnext()
1148 err = -1; in do_getnext()
1153 err = parse_elem(argv, &info, key, NULL, info.key_size, 0, in do_getnext()
1158 free(key); in do_getnext()
1159 key = NULL; in do_getnext()
1162 err = bpf_map_get_next_key(fd, key, nextkey); in do_getnext()
1164 p_err("can't get next key: %s", strerror(errno)); in do_getnext()
1170 if (key) { in do_getnext()
1171 jsonw_name(json_wtr, "key"); in do_getnext()
1172 print_hex_data_json(key, info.key_size); in do_getnext()
1174 jsonw_null_field(json_wtr, "key"); in do_getnext()
1180 if (key) { in do_getnext()
1181 printf("key:\n"); in do_getnext()
1182 fprint_hex(stdout, key, info.key_size, " "); in do_getnext()
1185 printf("key: None\n"); in do_getnext()
1187 printf("next key:\n"); in do_getnext()
1194 free(key); in do_getnext()
1204 void *key; in do_delete() local
1213 return -1; in do_delete()
1215 key = malloc(info.key_size); in do_delete()
1216 if (!key) { in do_delete()
1218 err = -1; in do_delete()
1222 err = parse_elem(argv, &info, key, NULL, info.key_size, 0, NULL, NULL); in do_delete()
1226 err = bpf_map_delete_elem(fd, key); in do_delete()
1231 free(key); in do_delete()
1253 int err = -1, fd; in do_create()
1256 return -1; in do_create()
1261 return -1; in do_create()
1280 } else if (is_prefix(*argv, "key")) { in do_create()
1282 "key size")) in do_create()
1284 } else if (is_prefix(*argv, "value")) { in do_create()
1286 "value size")) in do_create()
1322 return -1; in do_create()
1362 void *key, *value; in do_pop_dequeue() local
1371 return -1; in do_pop_dequeue()
1373 err = alloc_key_value(&info, &key, &value); in do_pop_dequeue()
1377 err = bpf_map_lookup_and_delete_elem(fd, key, value); in do_pop_dequeue()
1391 print_key_value(&info, key, value); in do_pop_dequeue()
1394 free(key); in do_pop_dequeue()
1395 free(value); in do_pop_dequeue()
1406 return -1; in do_freeze()
1410 return -1; in do_freeze()
1439 " %1$s %2$s create FILE type TYPE key KEY_SIZE value VALUE_SIZE \\\n" in do_help()
1443 " %1$s %2$s update MAP [key DATA] [value VALUE] [UPDATE_FLAGS]\n" in do_help()
1444 " %1$s %2$s lookup MAP [key DATA]\n" in do_help()
1445 " %1$s %2$s getnext MAP [key DATA]\n" in do_help()
1446 " %1$s %2$s delete MAP key DATA\n" in do_help()
1450 " %1$s %2$s push MAP value VALUE\n" in do_help()
1452 " %1$s %2$s enqueue MAP value VALUE\n" in do_help()
1460 " VALUE := { DATA | MAP | PROG }\n" in do_help()
1470 bin_name, argv[-2]); in do_help()