bpf: add support for BPF_RAW_TRACEPOINT_OPEN command decoding

* bpf_attr.h (struct BPF_RAW_TRACEPOINT_OPEN_struct): New type
definition.
(BPF_RAW_TRACEPOINT_OPEN_struct_size,
expected_BPF_RAW_TRACEPOINT_OPEN_struct_size): New macros.
* xlat/bpf_commands.in (BPF_RAW_TRACEPOINT_OPEN): New constant,
introduced by Linux commit v4.17-rc1~148^2~19^2~4^2~3.
* xlat/bpf_prog_types.in (BPF_PROG_TYPE_RAW_TRACEPOINT): Likewise.
* bpf.c (BEGIN_BPF_CMD_DECODER(BPF_RAW_TRACEPOINT_OPEN)): New bpf
command decoder.
(SYS_FUNC(bpf)) <bpf_cmd_decoders[]>: Add
BPF_CMD_ENTRY(BPF_RAW_TRACEPOINT_OPEN).
* tests/bpf.c (union bpf_attr_data): Add
BPF_ATTR_DATA_FIELD(BPF_RAW_TRACEPOINT_OPEN).
(BPF_PROG_LOAD_checks): Update.
(init_BPF_RAW_TRACEPOINT_attr2): New function.
(BPF_RAW_TRACEPOINT_OPEN_checks): New checks array.
(main) <checks>: Add CHK(BPF_RAW_TRACEPOINT_OPEN).
This commit is contained in:
Eugene Syromyatnikov
2018-05-15 15:38:54 +02:00
committed by Dmitry V. Levin
parent 9b2605de2d
commit 03b50140c7
5 changed files with 84 additions and 4 deletions

15
bpf.c
View File

@ -425,6 +425,20 @@ BEGIN_BPF_CMD_DECODER(BPF_PROG_QUERY)
}
END_BPF_CMD_DECODER(RVAL_DECODED)
BEGIN_BPF_CMD_DECODER(BPF_RAW_TRACEPOINT_OPEN)
{
enum { TP_NAME_SIZE = 128 };
tprintf("{raw_tracepoint={name=");
print_big_u64_addr(attr.name);
printstr_ex(tcp, attr.name, TP_NAME_SIZE, QUOTE_0_TERMINATED);
PRINT_FIELD_FD(", ", attr, prog_fd, tcp);
tprints("}");
}
END_BPF_CMD_DECODER(RVAL_DECODED)
SYS_FUNC(bpf)
{
static const bpf_cmd_decoder_t bpf_cmd_decoders[] = {
@ -445,6 +459,7 @@ SYS_FUNC(bpf)
BPF_CMD_ENTRY(BPF_MAP_GET_FD_BY_ID),
BPF_CMD_ENTRY(BPF_OBJ_GET_INFO_BY_FD),
BPF_CMD_ENTRY(BPF_PROG_QUERY),
BPF_CMD_ENTRY(BPF_RAW_TRACEPOINT_OPEN),
};
static char *buf;

View File

@ -216,4 +216,13 @@ struct BPF_PROG_QUERY_struct /* query */ {
offsetofend(struct BPF_PROG_QUERY_struct, prog_cnt)
#define expected_BPF_PROG_QUERY_struct_size 28
struct BPF_RAW_TRACEPOINT_OPEN_struct /* raw_tracepoint */ {
uint64_t ATTRIBUTE_ALIGNED(8) name;
uint32_t prog_fd;
};
#define BPF_RAW_TRACEPOINT_OPEN_struct_size \
offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct, prog_fd)
#define expected_BPF_RAW_TRACEPOINT_OPEN_struct_size 12
#endif /* !STRACE_BPF_ATTR_H */

View File

@ -77,6 +77,7 @@ union bpf_attr_data {
BPF_ATTR_DATA_FIELD(BPF_MAP_GET_FD_BY_ID);
BPF_ATTR_DATA_FIELD(BPF_OBJ_GET_INFO_BY_FD);
BPF_ATTR_DATA_FIELD(BPF_PROG_QUERY);
BPF_ATTR_DATA_FIELD(BPF_RAW_TRACEPOINT_OPEN);
char char_data[256];
};
@ -524,7 +525,7 @@ static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
},
{ /* 1 */
.data = { .BPF_PROG_LOAD_data = {
.prog_type = 17,
.prog_type = 18,
.insn_cnt = 0xbadc0ded,
.insns = 0,
.license = 0,
@ -535,7 +536,7 @@ static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
.prog_flags = 0,
} },
.size = offsetofend(struct BPF_PROG_LOAD_struct, prog_flags),
.str = "prog_type=0x11 /* BPF_PROG_TYPE_??? */"
.str = "prog_type=0x12 /* BPF_PROG_TYPE_??? */"
", insn_cnt=3134983661, insns=NULL, license=NULL"
", log_level=42, log_size=3141592653, log_buf=NULL"
", kern_version=KERNEL_VERSION(51966, 240, 13)"
@ -543,7 +544,7 @@ static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
},
{ /* 2 */
.data = { .BPF_PROG_LOAD_data = {
.prog_type = 16,
.prog_type = 17,
.insn_cnt = 0xbadc0ded,
.insns = 0xffffffff00000000,
.license = 0xffffffff00000000,
@ -555,7 +556,7 @@ static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
.prog_name = "fedcba987654321",
} },
.size = offsetofend(struct BPF_PROG_LOAD_struct, prog_name),
.str = "prog_type=BPF_PROG_TYPE_SK_MSG"
.str = "prog_type=BPF_PROG_TYPE_RAW_TRACEPOINT"
", insn_cnt=3134983661, insns=0xffffffff00000000"
#if defined MPERS_IS_m32 || SIZEOF_KERNEL_LONG_T > 4
", license=0xffffffff00000000"
@ -897,6 +898,58 @@ static const struct bpf_attr_check BPF_PROG_QUERY_checks[] = {
};
static void
init_BPF_RAW_TRACEPOINT_attr2(struct bpf_attr_check *check)
{
/* TODO: test the 128 byte limit */
static const char tp_name[] = "0123456789qwertyuiop0123456789qwe";
struct BPF_RAW_TRACEPOINT_OPEN_struct *attr =
&check->data.BPF_RAW_TRACEPOINT_OPEN_data;
attr->name = (uintptr_t) tp_name;
}
static struct bpf_attr_check BPF_RAW_TRACEPOINT_OPEN_checks[] = {
{
.data = { .BPF_RAW_TRACEPOINT_OPEN_data = { .name = 0 } },
.size = offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct,
name),
.str = "raw_tracepoint={name=NULL, prog_fd=0}",
},
{ /* 1 */
.data = { .BPF_RAW_TRACEPOINT_OPEN_data = {
.name = 0xffffffff00000000ULL,
.prog_fd = 0xdeadbeef,
} },
.size = offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct,
prog_fd),
.str = "raw_tracepoint={name="
#if defined MPERS_IS_m32 || SIZEOF_KERNEL_LONG_T > 4
"0xffffffff00000000"
#elif defined __arm__ || defined __i386__ || defined __mips__ || \
defined __powerpc__ || defined __riscv__ || defined __s390__ \
|| defined __sparc__ || defined __tile__
"0xffffffff00000000 or NULL"
#else
"NULL"
#endif
", prog_fd=-559038737}",
},
{
.data = { .BPF_RAW_TRACEPOINT_OPEN_data = {
.prog_fd = 0xdeadbeef,
} },
.size = offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct,
prog_fd),
.init_fn = init_BPF_RAW_TRACEPOINT_attr2,
.str = "raw_tracepoint="
"{name=\"0123456789qwertyuiop0123456789qw\"..."
", prog_fd=-559038737}",
}
};
#define CHK(cmd_) \
{ \
cmd_, #cmd_, \
@ -925,6 +978,7 @@ main(void)
CHK(BPF_MAP_GET_FD_BY_ID),
CHK(BPF_OBJ_GET_INFO_BY_FD),
CHK(BPF_PROG_QUERY),
CHK(BPF_RAW_TRACEPOINT_OPEN),
};
page_size = get_page_size();

View File

@ -16,3 +16,4 @@ BPF_PROG_GET_FD_BY_ID 13
BPF_MAP_GET_FD_BY_ID 14
BPF_OBJ_GET_INFO_BY_FD 15
BPF_PROG_QUERY 16
BPF_RAW_TRACEPOINT_OPEN 17

View File

@ -16,3 +16,4 @@ BPF_PROG_TYPE_SOCK_OPS 13
BPF_PROG_TYPE_SK_SKB 14
BPF_PROG_TYPE_CGROUP_DEVICE 15
BPF_PROG_TYPE_SK_MSG 16
BPF_PROG_TYPE_RAW_TRACEPOINT 17