Re: [PATCH 3/3] ss: pretty-print BPF socket-local storage
From: Martin KaFai Lau <martin.lau@linux.dev>
Date: 2023-11-28 23:42:19
On 11/27/23 6:30 PM, Quentin Deslandes wrote:
+static int bpf_maps_opts_load_btf(struct bpf_map_info *info, struct btf **btf)
+{
+ if (info->btf_vmlinux_value_type_id) {
+ if (!bpf_map_opts.kernel_btf) {
+ bpf_map_opts.kernel_btf = libbpf_find_kernel_btf();
+ if (!bpf_map_opts.kernel_btf) {
+ fprintf(stderr, "ss: failed to load kernel BTF\n");
+ return -1;
+ }
+ }
+
+ *btf = bpf_map_opts.kernel_btf;
+ } else if (info->btf_value_type_id) {
+ *btf = btf__load_from_kernel_by_id(info->btf_id);
+ if (!*btf) {
+ fprintf(stderr, "ss: failed to load BTF for map ID %u\n",
+ info->id);
+ return -1;
+ }
+ } else {
+ *btf = NULL;
+ }
+
+ return 0;
+}[ ... ]
+static void out_bpf_sk_storage(int map_id, const void *data, size_t len,
+ out_prefix_t *prefix)
+{
+ uint32_t type_id;
+ struct bpf_sk_storage_map_info *map_info;
+
+ map_info = bpf_map_opts_get_info(map_id);
+ if (!map_info) {
+ OUT_P(prefix, "map_id: %d: missing map info", map_id);
+ return;
+ }
+
+ if (map_info->info.value_size != len) {
+ OUT_P(prefix, "map_id: %d: invalid value size, expecting %u, got %lu\n",
+ map_id, map_info->info.value_size, len);
+ return;
+ }
+
+ type_id = map_info->info.btf_vmlinux_value_type_id ?: map_info->info.btf_value_type_id;sk_storage does not use info.btf_vmlinux_value_type_id, so no need to handle this case. Only info.btf_value_type_id is used.
+ + OUT_P(prefix, "map_id: %d [\n", map_id); + out_prefix_push(prefix); + + out_btf_dump_type(map_info->btf, 0, type_id, data, len, prefix); + + out_prefix_pop(prefix); + OUT_P(prefix, "]"); +} +