hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/tools/bpf/bpftool/main.h
....@@ -1,35 +1,5 @@
1
-/*
2
- * Copyright (C) 2017-2018 Netronome Systems, Inc.
3
- *
4
- * This software is dual licensed under the GNU General License Version 2,
5
- * June 1991 as shown in the file COPYING in the top-level directory of this
6
- * source tree or the BSD 2-Clause License provided below. You have the
7
- * option to license this software under the complete terms of either license.
8
- *
9
- * The BSD 2-Clause License:
10
- *
11
- * Redistribution and use in source and binary forms, with or
12
- * without modification, are permitted provided that the following
13
- * conditions are met:
14
- *
15
- * 1. Redistributions of source code must retain the above
16
- * copyright notice, this list of conditions and the following
17
- * disclaimer.
18
- *
19
- * 2. Redistributions in binary form must reproduce the above
20
- * copyright notice, this list of conditions and the following
21
- * disclaimer in the documentation and/or other materials
22
- * provided with the distribution.
23
- *
24
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
- * SOFTWARE.
32
- */
1
+/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2
+/* Copyright (C) 2017-2018 Netronome Systems, Inc. */
333
344 #ifndef __BPF_TOOL_H
355 #define __BPF_TOOL_H
....@@ -44,9 +14,22 @@
4414 #include <linux/hashtable.h>
4515 #include <tools/libc_compat.h>
4616
17
+#include <bpf/libbpf.h>
18
+
4719 #include "json_writer.h"
4820
49
-#define ptr_to_u64(ptr) ((__u64)(unsigned long)(ptr))
21
+/* Make sure we do not use kernel-only integer typedefs */
22
+#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64
23
+
24
+static inline __u64 ptr_to_u64(const void *ptr)
25
+{
26
+ return (__u64)(unsigned long)ptr;
27
+}
28
+
29
+static inline void *u64_to_ptr(__u64 ptr)
30
+{
31
+ return (void *)(unsigned long)ptr;
32
+}
5033
5134 #define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); })
5235 #define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); })
....@@ -72,16 +55,30 @@
7255 #define BPF_TAG_FMT "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
7356
7457 #define HELP_SPEC_PROGRAM \
75
- "PROG := { id PROG_ID | pinned FILE | tag PROG_TAG }"
58
+ "PROG := { id PROG_ID | pinned FILE | tag PROG_TAG | name PROG_NAME }"
7659 #define HELP_SPEC_OPTIONS \
77
- "OPTIONS := { {-j|--json} [{-p|--pretty}] | {-f|--bpffs} }"
60
+ "OPTIONS := { {-j|--json} [{-p|--pretty}] | {-f|--bpffs} |\n" \
61
+ "\t {-m|--mapcompat} | {-n|--nomount} }"
7862 #define HELP_SPEC_MAP \
79
- "MAP := { id MAP_ID | pinned FILE }"
63
+ "MAP := { id MAP_ID | pinned FILE | name MAP_NAME }"
64
+#define HELP_SPEC_LINK \
65
+ "LINK := { id LINK_ID | pinned FILE }"
8066
67
+extern const char * const prog_type_name[];
68
+extern const size_t prog_type_name_size;
69
+
70
+extern const char * const attach_type_name[__MAX_BPF_ATTACH_TYPE];
71
+
72
+extern const char * const map_type_name[];
73
+extern const size_t map_type_name_size;
74
+
75
+/* keep in sync with the definition in skeleton/pid_iter.bpf.c */
8176 enum bpf_obj_type {
8277 BPF_OBJ_UNKNOWN,
8378 BPF_OBJ_PROG,
8479 BPF_OBJ_MAP,
80
+ BPF_OBJ_LINK,
81
+ BPF_OBJ_BTF,
8582 };
8683
8784 extern const char *bin_name;
....@@ -89,15 +86,26 @@
8986 extern json_writer_t *json_wtr;
9087 extern bool json_output;
9188 extern bool show_pinned;
89
+extern bool show_pids;
90
+extern bool block_mount;
91
+extern bool verifier_logs;
92
+extern bool relaxed_maps;
9293 extern struct pinned_obj_table prog_table;
9394 extern struct pinned_obj_table map_table;
95
+extern struct pinned_obj_table link_table;
96
+extern struct obj_refs_table refs_table;
9497
95
-void p_err(const char *fmt, ...);
96
-void p_info(const char *fmt, ...);
98
+void __printf(1, 2) p_err(const char *fmt, ...);
99
+void __printf(1, 2) p_info(const char *fmt, ...);
97100
98101 bool is_prefix(const char *pfx, const char *str);
102
+int detect_common_prefix(const char *arg, ...);
99103 void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep);
100104 void usage(void) __noreturn;
105
+
106
+void set_max_rlimit(void);
107
+
108
+int mount_tracefs(const char *target);
101109
102110 struct pinned_obj_table {
103111 DECLARE_HASHTABLE(table, 16);
....@@ -109,9 +117,35 @@
109117 struct hlist_node hash;
110118 };
111119
120
+struct obj_refs_table {
121
+ DECLARE_HASHTABLE(table, 16);
122
+};
123
+
124
+struct obj_ref {
125
+ int pid;
126
+ char comm[16];
127
+};
128
+
129
+struct obj_refs {
130
+ struct hlist_node node;
131
+ __u32 id;
132
+ int ref_cnt;
133
+ struct obj_ref *refs;
134
+};
135
+
136
+struct btf;
137
+struct bpf_line_info;
138
+
112139 int build_pinned_obj_table(struct pinned_obj_table *table,
113140 enum bpf_obj_type type);
114141 void delete_pinned_obj_table(struct pinned_obj_table *tab);
142
+__weak int build_obj_refs_table(struct obj_refs_table *table,
143
+ enum bpf_obj_type type);
144
+__weak void delete_obj_refs_table(struct obj_refs_table *table);
145
+__weak void emit_obj_refs_json(struct obj_refs_table *table, __u32 id,
146
+ json_writer_t *json_wtr);
147
+__weak void emit_obj_refs_plain(struct obj_refs_table *table, __u32 id,
148
+ const char *prefix);
115149 void print_dev_plain(__u32 ifindex, __u64 ns_dev, __u64 ns_inode);
116150 void print_dev_json(__u32 ifindex, __u64 ns_dev, __u64 ns_inode);
117151
....@@ -126,34 +160,75 @@
126160 int get_fd_type(int fd);
127161 const char *get_fd_type_name(enum bpf_obj_type type);
128162 char *get_fdinfo(int fd, const char *key);
129
-int open_obj_pinned(char *path, bool quiet);
130
-int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type);
131
-int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32));
163
+int open_obj_pinned(const char *path, bool quiet);
164
+int open_obj_pinned_any(const char *path, enum bpf_obj_type exp_type);
165
+int mount_bpffs_for_pin(const char *name);
166
+int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***));
132167 int do_pin_fd(int fd, const char *name);
133168
134
-int do_prog(int argc, char **arg);
135
-int do_map(int argc, char **arg);
136
-int do_event_pipe(int argc, char **argv);
137
-int do_cgroup(int argc, char **arg);
138
-int do_perf(int argc, char **arg);
169
+/* commands available in bootstrap mode */
170
+int do_gen(int argc, char **argv);
171
+int do_btf(int argc, char **argv);
139172
173
+/* non-bootstrap only commands */
174
+int do_prog(int argc, char **arg) __weak;
175
+int do_map(int argc, char **arg) __weak;
176
+int do_link(int argc, char **arg) __weak;
177
+int do_event_pipe(int argc, char **argv) __weak;
178
+int do_cgroup(int argc, char **arg) __weak;
179
+int do_perf(int argc, char **arg) __weak;
180
+int do_net(int argc, char **arg) __weak;
181
+int do_tracelog(int argc, char **arg) __weak;
182
+int do_feature(int argc, char **argv) __weak;
183
+int do_struct_ops(int argc, char **argv) __weak;
184
+int do_iter(int argc, char **argv) __weak;
185
+
186
+int parse_u32_arg(int *argc, char ***argv, __u32 *val, const char *what);
140187 int prog_parse_fd(int *argc, char ***argv);
188
+int prog_parse_fds(int *argc, char ***argv, int **fds);
141189 int map_parse_fd(int *argc, char ***argv);
190
+int map_parse_fds(int *argc, char ***argv, int **fds);
142191 int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len);
143192
193
+struct bpf_prog_linfo;
194
+#ifdef HAVE_LIBBFD_SUPPORT
144195 void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
145
- const char *arch);
196
+ const char *arch, const char *disassembler_options,
197
+ const struct btf *btf,
198
+ const struct bpf_prog_linfo *prog_linfo,
199
+ __u64 func_ksym, unsigned int func_idx,
200
+ bool linum);
201
+int disasm_init(void);
202
+#else
203
+static inline
204
+void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes,
205
+ const char *arch, const char *disassembler_options,
206
+ const struct btf *btf,
207
+ const struct bpf_prog_linfo *prog_linfo,
208
+ __u64 func_ksym, unsigned int func_idx,
209
+ bool linum)
210
+{
211
+}
212
+static inline int disasm_init(void)
213
+{
214
+ p_err("No libbfd support");
215
+ return -1;
216
+}
217
+#endif
146218 void print_data_json(uint8_t *data, size_t len);
147219 void print_hex_data_json(uint8_t *data, size_t len);
148220
149221 unsigned int get_page_size(void);
150222 unsigned int get_possible_cpus(void);
151
-const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino);
223
+const char *
224
+ifindex_to_bfd_params(__u32 ifindex, __u64 ns_dev, __u64 ns_ino,
225
+ const char **opt);
152226
153227 struct btf_dumper {
154228 const struct btf *btf;
155229 json_writer_t *jw;
156230 bool is_plain_text;
231
+ bool prog_id_as_func_ptr;
157232 };
158233
159234 /* btf_dumper_type - print data along with type information
....@@ -165,4 +240,22 @@
165240 */
166241 int btf_dumper_type(const struct btf_dumper *d, __u32 type_id,
167242 const void *data);
243
+void btf_dumper_type_only(const struct btf *btf, __u32 func_type_id,
244
+ char *func_only, int size);
245
+
246
+void btf_dump_linfo_plain(const struct btf *btf,
247
+ const struct bpf_line_info *linfo,
248
+ const char *prefix, bool linum);
249
+void btf_dump_linfo_json(const struct btf *btf,
250
+ const struct bpf_line_info *linfo, bool linum);
251
+
252
+struct nlattr;
253
+struct ifinfomsg;
254
+struct tcmsg;
255
+int do_xdp_dump(struct ifinfomsg *ifinfo, struct nlattr **tb);
256
+int do_filter_dump(struct tcmsg *ifinfo, struct nlattr **tb, const char *kind,
257
+ const char *devname, int ifindex);
258
+
259
+int print_all_levels(__maybe_unused enum libbpf_print_level level,
260
+ const char *format, va_list args);
168261 #endif