| .. | .. |
|---|
| 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 |
|---|