| /* |
| * Copyright (C) 2017-2018 Netronome Systems, Inc. |
| * |
| * This software is dual licensed under the GNU General License Version 2, |
| * June 1991 as shown in the file COPYING in the top-level directory of this |
| * source tree or the BSD 2-Clause License provided below. You have the |
| * option to license this software under the complete terms of either license. |
| * |
| * The BSD 2-Clause License: |
| * |
| * Redistribution and use in source and binary forms, with or |
| * without modification, are permitted provided that the following |
| * conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials |
| * provided with the distribution. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS |
| * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN |
| * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| */ |
| |
| #ifndef __BPF_TOOL_H |
| #define __BPF_TOOL_H |
| |
| /* BFD and kernel.h both define GCC_VERSION, differently */ |
| #undef GCC_VERSION |
| #include <stdbool.h> |
| #include <stdio.h> |
| #include <linux/bpf.h> |
| #include <linux/compiler.h> |
| #include <linux/kernel.h> |
| #include <linux/hashtable.h> |
| #include <tools/libc_compat.h> |
| |
| #include "json_writer.h" |
| |
| #define ptr_to_u64(ptr) ((__u64)(unsigned long)(ptr)) |
| |
| #define NEXT_ARG() ({ argc--; argv++; if (argc < 0) usage(); }) |
| #define NEXT_ARGP() ({ (*argc)--; (*argv)++; if (*argc < 0) usage(); }) |
| #define BAD_ARG() ({ p_err("what is '%s'?", *argv); -1; }) |
| #define GET_ARG() ({ argc--; *argv++; }) |
| #define REQ_ARGS(cnt) \ |
| ({ \ |
| int _cnt = (cnt); \ |
| bool _res; \ |
| \ |
| if (argc < _cnt) { \ |
| p_err("'%s' needs at least %d arguments, %d found", \ |
| argv[-1], _cnt, argc); \ |
| _res = false; \ |
| } else { \ |
| _res = true; \ |
| } \ |
| _res; \ |
| }) |
| |
| #define ERR_MAX_LEN 1024 |
| |
| #define BPF_TAG_FMT "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" |
| |
| #define HELP_SPEC_PROGRAM \ |
| "PROG := { id PROG_ID | pinned FILE | tag PROG_TAG }" |
| #define HELP_SPEC_OPTIONS \ |
| "OPTIONS := { {-j|--json} [{-p|--pretty}] | {-f|--bpffs} }" |
| #define HELP_SPEC_MAP \ |
| "MAP := { id MAP_ID | pinned FILE }" |
| |
| enum bpf_obj_type { |
| BPF_OBJ_UNKNOWN, |
| BPF_OBJ_PROG, |
| BPF_OBJ_MAP, |
| }; |
| |
| extern const char *bin_name; |
| |
| extern json_writer_t *json_wtr; |
| extern bool json_output; |
| extern bool show_pinned; |
| extern struct pinned_obj_table prog_table; |
| extern struct pinned_obj_table map_table; |
| |
| void p_err(const char *fmt, ...); |
| void p_info(const char *fmt, ...); |
| |
| bool is_prefix(const char *pfx, const char *str); |
| void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep); |
| void usage(void) __noreturn; |
| |
| struct pinned_obj_table { |
| DECLARE_HASHTABLE(table, 16); |
| }; |
| |
| struct pinned_obj { |
| __u32 id; |
| char *path; |
| struct hlist_node hash; |
| }; |
| |
| int build_pinned_obj_table(struct pinned_obj_table *table, |
| enum bpf_obj_type type); |
| void delete_pinned_obj_table(struct pinned_obj_table *tab); |
| void print_dev_plain(__u32 ifindex, __u64 ns_dev, __u64 ns_inode); |
| void print_dev_json(__u32 ifindex, __u64 ns_dev, __u64 ns_inode); |
| |
| struct cmd { |
| const char *cmd; |
| int (*func)(int argc, char **argv); |
| }; |
| |
| int cmd_select(const struct cmd *cmds, int argc, char **argv, |
| int (*help)(int argc, char **argv)); |
| |
| int get_fd_type(int fd); |
| const char *get_fd_type_name(enum bpf_obj_type type); |
| char *get_fdinfo(int fd, const char *key); |
| int open_obj_pinned(char *path); |
| int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type); |
| int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32)); |
| int do_pin_fd(int fd, const char *name); |
| |
| int do_prog(int argc, char **arg); |
| int do_map(int argc, char **arg); |
| int do_event_pipe(int argc, char **argv); |
| int do_cgroup(int argc, char **arg); |
| int do_perf(int argc, char **arg); |
| |
| int prog_parse_fd(int *argc, char ***argv); |
| int map_parse_fd(int *argc, char ***argv); |
| int map_parse_fd_and_info(int *argc, char ***argv, void *info, __u32 *info_len); |
| |
| void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, |
| const char *arch); |
| void print_data_json(uint8_t *data, size_t len); |
| void print_hex_data_json(uint8_t *data, size_t len); |
| |
| unsigned int get_page_size(void); |
| unsigned int get_possible_cpus(void); |
| const char *ifindex_to_bfd_name_ns(__u32 ifindex, __u64 ns_dev, __u64 ns_ino); |
| |
| struct btf_dumper { |
| const struct btf *btf; |
| json_writer_t *jw; |
| bool is_plain_text; |
| }; |
| |
| /* btf_dumper_type - print data along with type information |
| * @d: an instance containing context for dumping types |
| * @type_id: index in btf->types array. this points to the type to be dumped |
| * @data: pointer the actual data, i.e. the values to be printed |
| * |
| * Returns zero on success and negative error code otherwise |
| */ |
| int btf_dumper_type(const struct btf_dumper *d, __u32 type_id, |
| const void *data); |
| #endif |