mirror of
https://github.com/torvalds/linux.git
synced 2024-11-12 23:23:03 +00:00
57c61da8bf
Add support to dump fd-based attach types via bpftool. This includes both the tc BPF link and attach ops programs. Dumped information contain the attach location, function entry name, program ID and link ID when applicable. Example with tc BPF link: # ./bpftool net xdp: tc: bond0(4) tcx/ingress cil_from_netdev prog_id 784 link_id 10 bond0(4) tcx/egress cil_to_netdev prog_id 804 link_id 11 flow_dissector: netfilter: Example with tc BPF attach ops: # ./bpftool net xdp: tc: bond0(4) tcx/ingress cil_from_netdev prog_id 654 bond0(4) tcx/egress cil_to_netdev prog_id 672 flow_dissector: netfilter: Currently, permanent flags are not yet supported, so 'unknown' ones are dumped via NET_DUMP_UINT_ONLY() and once we do have permanent ones, we dump them as human readable string. Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/r/20230719140858.13224-7-daniel@iogearbox.net Signed-off-by: Alexei Starovoitov <ast@kernel.org>
104 lines
2.0 KiB
C
104 lines
2.0 KiB
C
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
|
// Copyright (C) 2018 Facebook
|
|
|
|
#ifndef _NETLINK_DUMPER_H_
|
|
#define _NETLINK_DUMPER_H_
|
|
|
|
#define NET_START_OBJECT \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_start_object(json_wtr); \
|
|
}
|
|
|
|
#define NET_START_OBJECT_NESTED(name) \
|
|
{ \
|
|
if (json_output) { \
|
|
jsonw_name(json_wtr, name); \
|
|
jsonw_start_object(json_wtr); \
|
|
} else { \
|
|
fprintf(stdout, "%s {", name); \
|
|
} \
|
|
}
|
|
|
|
#define NET_START_OBJECT_NESTED2 \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_start_object(json_wtr); \
|
|
else \
|
|
fprintf(stdout, "{"); \
|
|
}
|
|
|
|
#define NET_END_OBJECT_NESTED \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_end_object(json_wtr); \
|
|
else \
|
|
fprintf(stdout, "}"); \
|
|
}
|
|
|
|
#define NET_END_OBJECT \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_end_object(json_wtr); \
|
|
}
|
|
|
|
#define NET_END_OBJECT_FINAL \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_end_object(json_wtr); \
|
|
else \
|
|
fprintf(stdout, "\n"); \
|
|
}
|
|
|
|
#define NET_START_ARRAY(name, fmt_str) \
|
|
{ \
|
|
if (json_output) { \
|
|
jsonw_name(json_wtr, name); \
|
|
jsonw_start_array(json_wtr); \
|
|
} else { \
|
|
fprintf(stdout, fmt_str, name); \
|
|
} \
|
|
}
|
|
|
|
#define NET_END_ARRAY(endstr) \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_end_array(json_wtr); \
|
|
else \
|
|
fprintf(stdout, "%s", endstr); \
|
|
}
|
|
|
|
#define NET_DUMP_UINT(name, fmt_str, val) \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_uint_field(json_wtr, name, val); \
|
|
else \
|
|
fprintf(stdout, fmt_str, val); \
|
|
}
|
|
|
|
#define NET_DUMP_UINT_ONLY(str) \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_uint(json_wtr, str); \
|
|
else \
|
|
fprintf(stdout, "%u ", str); \
|
|
}
|
|
|
|
#define NET_DUMP_STR(name, fmt_str, str) \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_string_field(json_wtr, name, str);\
|
|
else \
|
|
fprintf(stdout, fmt_str, str); \
|
|
}
|
|
|
|
#define NET_DUMP_STR_ONLY(str) \
|
|
{ \
|
|
if (json_output) \
|
|
jsonw_string(json_wtr, str); \
|
|
else \
|
|
fprintf(stdout, "%s ", str); \
|
|
}
|
|
|
|
#endif
|