.. | .. |
---|
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. */ |
---|
33 | 3 | |
---|
34 | 4 | #ifndef __BPF_TOOL_H |
---|
35 | 5 | #define __BPF_TOOL_H |
---|
.. | .. |
---|
44 | 14 | #include <linux/hashtable.h> |
---|
45 | 15 | #include <tools/libc_compat.h> |
---|
46 | 16 | |
---|
| 17 | +#include <bpf/libbpf.h> |
---|
| 18 | + |
---|
47 | 19 | #include "json_writer.h" |
---|
48 | 20 | |
---|
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 | +} |
---|
50 | 33 | |
---|
51 | 34 | #define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); }) |
---|
52 | 35 | #define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); }) |
---|
.. | .. |
---|
72 | 55 | #define BPF_TAG_FMT "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" |
---|
73 | 56 | |
---|
74 | 57 | #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 }" |
---|
76 | 59 | #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} }" |
---|
78 | 62 | #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 }" |
---|
80 | 66 | |
---|
| 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 */ |
---|
81 | 76 | enum bpf_obj_type { |
---|
82 | 77 | BPF_OBJ_UNKNOWN, |
---|
83 | 78 | BPF_OBJ_PROG, |
---|
84 | 79 | BPF_OBJ_MAP, |
---|
| 80 | + BPF_OBJ_LINK, |
---|
| 81 | + BPF_OBJ_BTF, |
---|
85 | 82 | }; |
---|
86 | 83 | |
---|
87 | 84 | extern const char *bin_name; |
---|
.. | .. |
---|
89 | 86 | extern json_writer_t *json_wtr; |
---|
90 | 87 | extern bool json_output; |
---|
91 | 88 | extern bool show_pinned; |
---|
| 89 | +extern bool show_pids; |
---|
| 90 | +extern bool block_mount; |
---|
| 91 | +extern bool verifier_logs; |
---|
| 92 | +extern bool relaxed_maps; |
---|
92 | 93 | extern struct pinned_obj_table prog_table; |
---|
93 | 94 | extern struct pinned_obj_table map_table; |
---|
| 95 | +extern struct pinned_obj_table link_table; |
---|
| 96 | +extern struct obj_refs_table refs_table; |
---|
94 | 97 | |
---|
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, ...); |
---|
97 | 100 | |
---|
98 | 101 | bool is_prefix(const char *pfx, const char *str); |
---|
| 102 | +int detect_common_prefix(const char *arg, ...); |
---|
99 | 103 | void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep); |
---|
100 | 104 | void usage(void) __noreturn; |
---|
| 105 | + |
---|
| 106 | +void set_max_rlimit(void); |
---|
| 107 | + |
---|
| 108 | +int mount_tracefs(const char *target); |
---|
101 | 109 | |
---|
102 | 110 | struct pinned_obj_table { |
---|
103 | 111 | DECLARE_HASHTABLE(table, 16); |
---|
.. | .. |
---|
109 | 117 | struct hlist_node hash; |
---|
110 | 118 | }; |
---|
111 | 119 | |
---|
| 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 | + |
---|
112 | 139 | int build_pinned_obj_table(struct pinned_obj_table *table, |
---|
113 | 140 | enum bpf_obj_type type); |
---|
114 | 141 | 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); |
---|
115 | 149 | void print_dev_plain(__u32 ifindex, __u64 ns_dev, __u64 ns_inode); |
---|
116 | 150 | void print_dev_json(__u32 ifindex, __u64 ns_dev, __u64 ns_inode); |
---|
117 | 151 | |
---|
.. | .. |
---|
126 | 160 | int get_fd_type(int fd); |
---|
127 | 161 | const char *get_fd_type_name(enum bpf_obj_type type); |
---|
128 | 162 | 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 ***)); |
---|
132 | 167 | int do_pin_fd(int fd, const char *name); |
---|
133 | 168 | |
---|
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); |
---|
139 | 172 | |
---|
| 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); |
---|
140 | 187 | int prog_parse_fd(int *argc, char ***argv); |
---|
| 188 | +int prog_parse_fds(int *argc, char ***argv, int **fds); |
---|
141 | 189 | int map_parse_fd(int *argc, char ***argv); |
---|
| 190 | +int map_parse_fds(int *argc, char ***argv, int **fds); |
---|
142 | 191 | int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len); |
---|
143 | 192 | |
---|
| 193 | +struct bpf_prog_linfo; |
---|
| 194 | +#ifdef HAVE_LIBBFD_SUPPORT |
---|
144 | 195 | 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 |
---|
146 | 218 | void print_data_json(uint8_t *data, size_t len); |
---|
147 | 219 | void print_hex_data_json(uint8_t *data, size_t len); |
---|
148 | 220 | |
---|
149 | 221 | unsigned int get_page_size(void); |
---|
150 | 222 | 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); |
---|
152 | 226 | |
---|
153 | 227 | struct btf_dumper { |
---|
154 | 228 | const struct btf *btf; |
---|
155 | 229 | json_writer_t *jw; |
---|
156 | 230 | bool is_plain_text; |
---|
| 231 | + bool prog_id_as_func_ptr; |
---|
157 | 232 | }; |
---|
158 | 233 | |
---|
159 | 234 | /* btf_dumper_type - print data along with type information |
---|
.. | .. |
---|
165 | 240 | */ |
---|
166 | 241 | int btf_dumper_type(const struct btf_dumper *d, __u32 type_id, |
---|
167 | 242 | 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); |
---|
168 | 261 | #endif |
---|