1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2 /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
7 /* BFD and kernel.h both define GCC_VERSION, differently */
12 #include <linux/bpf.h>
13 #include <linux/compiler.h>
14 #include <linux/kernel.h>
16 #include <bpf/hashmap.h>
17 #include <bpf/libbpf.h>
19 #include "json_writer.h"
21 /* Make sure we do not use kernel-only integer typedefs */
22 #pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64
24 static inline __u64
ptr_to_u64(const void *ptr
)
26 return (__u64
)(unsigned long)ptr
;
29 static inline void *u64_to_ptr(__u64 ptr
)
31 return (void *)(unsigned long)ptr
;
34 #define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); })
35 #define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); })
36 #define BAD_ARG() ({ p_err("what is '%s'?", *argv); -1; })
37 #define GET_ARG() ({ argc--; *argv++; })
38 #define REQ_ARGS(cnt) \
44 p_err("'%s' needs at least %d arguments, %d found", \
45 argv[-1], _cnt, argc); \
53 #define ERR_MAX_LEN 1024
55 #define BPF_TAG_FMT "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"
57 #define HELP_SPEC_PROGRAM \
58 "PROG := { id PROG_ID | pinned FILE | tag PROG_TAG | name PROG_NAME }"
59 #define HELP_SPEC_OPTIONS \
60 "OPTIONS := { {-j|--json} [{-p|--pretty}] | {-d|--debug}"
61 #define HELP_SPEC_MAP \
62 "MAP := { id MAP_ID | pinned FILE | name MAP_NAME }"
63 #define HELP_SPEC_LINK \
64 "LINK := { id LINK_ID | pinned FILE }"
66 /* keep in sync with the definition in skeleton/pid_iter.bpf.c */
75 extern const char *bin_name
;
77 extern json_writer_t
*json_wtr
;
78 extern bool json_output
;
79 extern bool show_pinned
;
80 extern bool show_pids
;
81 extern bool block_mount
;
82 extern bool verifier_logs
;
83 extern bool relaxed_maps
;
84 extern bool use_loader
;
85 extern struct btf
*base_btf
;
86 extern struct hashmap
*refs_table
;
88 void __printf(1, 2) p_err(const char *fmt
, ...);
89 void __printf(1, 2) p_info(const char *fmt
, ...);
91 bool is_prefix(const char *pfx
, const char *str
);
92 int detect_common_prefix(const char *arg
, ...);
93 void fprint_hex(FILE *f
, void *arg
, unsigned int n
, const char *sep
);
94 void usage(void) __noreturn
;
96 void set_max_rlimit(void);
98 int mount_tracefs(const char *target
);
108 struct obj_ref
*refs
;
113 struct bpf_line_info
;
115 int build_pinned_obj_table(struct hashmap
*table
,
116 enum bpf_obj_type type
);
117 void delete_pinned_obj_table(struct hashmap
*table
);
118 __weak
int build_obj_refs_table(struct hashmap
**table
,
119 enum bpf_obj_type type
);
120 __weak
void delete_obj_refs_table(struct hashmap
*table
);
121 __weak
void emit_obj_refs_json(struct hashmap
*table
, __u32 id
,
122 json_writer_t
*json_wtr
);
123 __weak
void emit_obj_refs_plain(struct hashmap
*table
, __u32 id
,
125 void print_dev_plain(__u32 ifindex
, __u64 ns_dev
, __u64 ns_inode
);
126 void print_dev_json(__u32 ifindex
, __u64 ns_dev
, __u64 ns_inode
);
130 int (*func
)(int argc
, char **argv
);
133 int cmd_select(const struct cmd
*cmds
, int argc
, char **argv
,
134 int (*help
)(int argc
, char **argv
));
136 #define MAX_PROG_FULL_NAME 128
137 void get_prog_full_name(const struct bpf_prog_info
*prog_info
, int prog_fd
,
138 char *name_buff
, size_t buff_len
);
140 int get_fd_type(int fd
);
141 const char *get_fd_type_name(enum bpf_obj_type type
);
142 char *get_fdinfo(int fd
, const char *key
);
143 int open_obj_pinned(const char *path
, bool quiet
);
144 int open_obj_pinned_any(const char *path
, enum bpf_obj_type exp_type
);
145 int mount_bpffs_for_file(const char *file_name
);
146 int create_and_mount_bpffs_dir(const char *dir_name
);
147 int do_pin_any(int argc
, char **argv
, int (*get_fd_by_id
)(int *, char ***));
148 int do_pin_fd(int fd
, const char *name
);
150 /* commands available in bootstrap mode */
151 int do_gen(int argc
, char **argv
);
152 int do_btf(int argc
, char **argv
);
154 /* non-bootstrap only commands */
155 int do_prog(int argc
, char **arg
) __weak
;
156 int do_map(int argc
, char **arg
) __weak
;
157 int do_link(int argc
, char **arg
) __weak
;
158 int do_event_pipe(int argc
, char **argv
) __weak
;
159 int do_cgroup(int argc
, char **arg
) __weak
;
160 int do_perf(int argc
, char **arg
) __weak
;
161 int do_net(int argc
, char **arg
) __weak
;
162 int do_tracelog(int argc
, char **arg
) __weak
;
163 int do_feature(int argc
, char **argv
) __weak
;
164 int do_struct_ops(int argc
, char **argv
) __weak
;
165 int do_iter(int argc
, char **argv
) __weak
;
167 int parse_u32_arg(int *argc
, char ***argv
, __u32
*val
, const char *what
);
168 int prog_parse_fd(int *argc
, char ***argv
);
169 int prog_parse_fds(int *argc
, char ***argv
, int **fds
);
170 int map_parse_fd(int *argc
, char ***argv
);
171 int map_parse_fds(int *argc
, char ***argv
, int **fds
);
172 int map_parse_fd_and_info(int *argc
, char ***argv
, struct bpf_map_info
*info
,
175 struct bpf_prog_linfo
;
176 #if defined(HAVE_LLVM_SUPPORT) || defined(HAVE_LIBBFD_SUPPORT)
177 int disasm_print_insn(unsigned char *image
, ssize_t len
, int opcodes
,
178 const char *arch
, const char *disassembler_options
,
179 const struct btf
*btf
,
180 const struct bpf_prog_linfo
*prog_linfo
,
181 __u64 func_ksym
, unsigned int func_idx
,
183 int disasm_init(void);
186 int disasm_print_insn(unsigned char *image
, ssize_t len
, int opcodes
,
187 const char *arch
, const char *disassembler_options
,
188 const struct btf
*btf
,
189 const struct bpf_prog_linfo
*prog_linfo
,
190 __u64 func_ksym
, unsigned int func_idx
,
195 static inline int disasm_init(void)
197 p_err("No JIT disassembly support");
201 void print_data_json(uint8_t *data
, size_t len
);
202 void print_hex_data_json(uint8_t *data
, size_t len
);
204 unsigned int get_page_size(void);
205 unsigned int get_possible_cpus(void);
207 ifindex_to_arch(__u32 ifindex
, __u64 ns_dev
, __u64 ns_ino
, const char **opt
);
210 const struct btf
*btf
;
213 bool prog_id_as_func_ptr
;
216 /* btf_dumper_type - print data along with type information
217 * @d: an instance containing context for dumping types
218 * @type_id: index in btf->types array. this points to the type to be dumped
219 * @data: pointer the actual data, i.e. the values to be printed
221 * Returns zero on success and negative error code otherwise
223 int btf_dumper_type(const struct btf_dumper
*d
, __u32 type_id
,
225 void btf_dumper_type_only(const struct btf
*btf
, __u32 func_type_id
,
226 char *func_only
, int size
);
228 void btf_dump_linfo_plain(const struct btf
*btf
,
229 const struct bpf_line_info
*linfo
,
230 const char *prefix
, bool linum
);
231 void btf_dump_linfo_json(const struct btf
*btf
,
232 const struct bpf_line_info
*linfo
, bool linum
);
233 void btf_dump_linfo_dotlabel(const struct btf
*btf
,
234 const struct bpf_line_info
*linfo
, bool linum
);
239 int do_xdp_dump(struct ifinfomsg
*ifinfo
, struct nlattr
**tb
);
240 int do_filter_dump(struct tcmsg
*ifinfo
, struct nlattr
**tb
, const char *kind
,
241 const char *devname
, int ifindex
);
243 int print_all_levels(__maybe_unused
enum libbpf_print_level level
,
244 const char *format
, va_list args
);
246 size_t hash_fn_for_key_as_id(long key
, void *ctx
);
247 bool equal_fn_for_key_as_id(long k1
, long k2
, void *ctx
);
249 /* bpf_attach_type_input_str - convert the provided attach type value into a
250 * textual representation that we accept for input purposes.
252 * This function is similar in nature to libbpf_bpf_attach_type_str, but
253 * recognizes some attach type names that have been used by the program in the
254 * past and which do not follow the string inference scheme that libbpf uses.
255 * These textual representations should only be used for user input.
257 * @t: The attach type
258 * Returns a pointer to a static string identifying the attach type. NULL is
259 * returned for unknown bpf_attach_type values.
261 const char *bpf_attach_type_input_str(enum bpf_attach_type t
);
263 static inline bool hashmap__empty(struct hashmap
*map
)
265 return map
? hashmap__size(map
) == 0 : true;
268 int pathname_concat(char *buf
, int buf_sz
, const char *path
,
271 /* print netfilter bpf_link info */
272 void netfilter_dump_plain(const struct bpf_link_info
*info
);
273 void netfilter_dump_json(const struct bpf_link_info
*info
, json_writer_t
*wtr
);