]> granicus.if.org Git - strace/blob - tests/bpf.c
eafd801a2de91a16aed24d1725ce65ce14e1786b
[strace] / tests / bpf.c
1 /*
2  * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  *    derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "tests.h"
29 #include <stdio.h>
30 #include <stdint.h>
31 #include <unistd.h>
32 #include <sys/syscall.h>
33
34 #if defined HAVE_UNION_BPF_ATTR_LOG_BUF && defined __NR_bpf
35 # include <linux/bpf.h>
36
37 static const struct bpf_insn insns[] = {
38         { .code = BPF_JMP | BPF_EXIT }
39 };
40
41 static char log_buf[4096];
42
43 static int
44 map_create(void)
45 {
46         union bpf_attr attr = {
47                 .key_size = 4,
48                 .value_size = 8,
49                 .max_entries = 256
50         };
51         return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
52 }
53
54 static int
55 map_any(int cmd)
56 {
57         union bpf_attr attr = {
58                 .map_fd = -1,
59                 .key = 0xdeadbeef,
60                 .value = 0xbadc0ded
61         };
62         return syscall(__NR_bpf, cmd, &attr, sizeof(attr));
63 }
64
65 static int
66 prog_load(void)
67 {
68         union bpf_attr attr = {
69                 .insn_cnt = sizeof(insns) / sizeof(insns[0]),
70                 .insns = (unsigned long) insns,
71                 .license = (unsigned long) "GPL",
72                 .log_level = 42,
73                 .log_size = sizeof(log_buf),
74                 .log_buf = (unsigned long) log_buf
75         };
76         return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
77 }
78
79 int
80 main(void)
81 {
82         if (!map_create())
83                 return 77;
84         printf("bpf\\(BPF_MAP_CREATE, "
85                "\\{map_type=BPF_MAP_TYPE_UNSPEC, key_size=4, value_size=8, max_entries=256\\}, "
86                "%u\\) += -1 .*\n",
87                 (unsigned) sizeof(union bpf_attr));
88
89         if (!map_any(BPF_MAP_LOOKUP_ELEM))
90                 return 77;
91         printf("bpf\\(BPF_MAP_LOOKUP_ELEM, "
92                "\\{map_fd=-1, key=0xdeadbeef\\}, %u\\) += -1 .*\n",
93                 (unsigned) sizeof(union bpf_attr));
94
95         if (!map_any(BPF_MAP_UPDATE_ELEM))
96                 return 77;
97         printf("bpf\\(BPF_MAP_UPDATE_ELEM, "
98                "\\{map_fd=-1, key=0xdeadbeef, value=0xbadc0ded, flags=BPF_ANY\\}, "
99                "%u\\) += -1 .*\n",
100                 (unsigned) sizeof(union bpf_attr));
101
102         if (!map_any(BPF_MAP_DELETE_ELEM))
103                 return 77;
104         printf("bpf\\(BPF_MAP_DELETE_ELEM, "
105                "\\{map_fd=-1, key=0xdeadbeef\\}, %u\\) += -1 .*\n",
106                 (unsigned) sizeof(union bpf_attr));
107
108         if (!map_any(BPF_MAP_GET_NEXT_KEY))
109                 return 77;
110         printf("bpf\\(BPF_MAP_GET_NEXT_KEY, "
111                "\\{map_fd=-1, key=0xdeadbeef\\}, %u\\) += -1 .*\n",
112                 (unsigned) sizeof(union bpf_attr));
113
114         if (!prog_load())
115                 return 77;
116         printf("bpf\\(BPF_PROG_LOAD, "
117                "\\{prog_type=BPF_PROG_TYPE_UNSPEC, insn_cnt=1, insns=%p, "
118                "license=\"GPL\", log_level=42, log_size=4096, log_buf=%p, "
119                "kern_version=0\\}, %u\\) += -1 .*\n",
120                 insns, log_buf, (unsigned) sizeof(union bpf_attr));
121
122         return 0;
123 }
124
125 #else
126
127 int
128 main(void)
129 {
130         return 77;
131 }
132
133 #endif