1cb21ac58SAndrii Nakryiko================
2cb21ac58SAndrii Nakryikobpftool-gen
3cb21ac58SAndrii Nakryiko================
4cb21ac58SAndrii Nakryiko-------------------------------------------------------------------------------
5cb21ac58SAndrii Nakryikotool for BPF code-generation
6cb21ac58SAndrii Nakryiko-------------------------------------------------------------------------------
7cb21ac58SAndrii Nakryiko
8cb21ac58SAndrii Nakryiko:Manual section: 8
9cb21ac58SAndrii Nakryiko
10cb21ac58SAndrii NakryikoSYNOPSIS
11cb21ac58SAndrii Nakryiko========
12cb21ac58SAndrii Nakryiko
13cb21ac58SAndrii Nakryiko	**bpftool** [*OPTIONS*] **gen** *COMMAND*
14cb21ac58SAndrii Nakryiko
15cb21ac58SAndrii Nakryiko	*OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] }
16cb21ac58SAndrii Nakryiko
17c8caa0bbSQuentin Monnet	*COMMAND* := { **skeleton** | **help** }
18cb21ac58SAndrii Nakryiko
19cb21ac58SAndrii NakryikoGEN COMMANDS
20cb21ac58SAndrii Nakryiko=============
21cb21ac58SAndrii Nakryiko
22cb21ac58SAndrii Nakryiko|	**bpftool** **gen skeleton** *FILE*
23cb21ac58SAndrii Nakryiko|	**bpftool** **gen help**
24cb21ac58SAndrii Nakryiko
25cb21ac58SAndrii NakryikoDESCRIPTION
26cb21ac58SAndrii Nakryiko===========
27cb21ac58SAndrii Nakryiko	**bpftool gen skeleton** *FILE*
28cb21ac58SAndrii Nakryiko		  Generate BPF skeleton C header file for a given *FILE*.
29cb21ac58SAndrii Nakryiko
30cb21ac58SAndrii Nakryiko		  BPF skeleton is an alternative interface to existing libbpf
31cb21ac58SAndrii Nakryiko		  APIs for working with BPF objects. Skeleton code is intended
32cb21ac58SAndrii Nakryiko		  to significantly shorten and simplify code to load and work
33cb21ac58SAndrii Nakryiko		  with BPF programs from userspace side. Generated code is
34cb21ac58SAndrii Nakryiko		  tailored to specific input BPF object *FILE*, reflecting its
35cb21ac58SAndrii Nakryiko		  structure by listing out available maps, program, variables,
36cb21ac58SAndrii Nakryiko		  etc. Skeleton eliminates the need to lookup mentioned
37cb21ac58SAndrii Nakryiko		  components by name. Instead, if skeleton instantiation
38cb21ac58SAndrii Nakryiko		  succeeds, they are populated in skeleton structure as valid
39c8caa0bbSQuentin Monnet		  libbpf types (e.g., **struct bpf_map** pointer) and can be
40cb21ac58SAndrii Nakryiko		  passed to existing generic libbpf APIs.
41cb21ac58SAndrii Nakryiko
42cb21ac58SAndrii Nakryiko		  In addition to simple and reliable access to maps and
43c8caa0bbSQuentin Monnet		  programs, skeleton provides a storage for BPF links (**struct
44c8caa0bbSQuentin Monnet		  bpf_link**) for each BPF program within BPF object. When
45cb21ac58SAndrii Nakryiko		  requested, supported BPF programs will be automatically
46cb21ac58SAndrii Nakryiko		  attached and resulting BPF links stored for further use by
47cb21ac58SAndrii Nakryiko		  user in pre-allocated fields in skeleton struct. For BPF
48cb21ac58SAndrii Nakryiko		  programs that can't be automatically attached by libbpf,
49cb21ac58SAndrii Nakryiko		  user can attach them manually, but store resulting BPF link
50cb21ac58SAndrii Nakryiko		  in per-program link field. All such set up links will be
51cb21ac58SAndrii Nakryiko		  automatically destroyed on BPF skeleton destruction. This
52cb21ac58SAndrii Nakryiko		  eliminates the need for users to manage links manually and
53cb21ac58SAndrii Nakryiko		  rely on libbpf support to detach programs and free up
54cb21ac58SAndrii Nakryiko		  resources.
55cb21ac58SAndrii Nakryiko
56cb21ac58SAndrii Nakryiko		  Another facility provided by BPF skeleton is an interface to
57cb21ac58SAndrii Nakryiko		  global variables of all supported kinds: mutable, read-only,
58cb21ac58SAndrii Nakryiko		  as well as extern ones. This interface allows to pre-setup
59cb21ac58SAndrii Nakryiko		  initial values of variables before BPF object is loaded and
60cb21ac58SAndrii Nakryiko		  verified by kernel. For non-read-only variables, the same
61cb21ac58SAndrii Nakryiko		  interface can be used to fetch values of global variables on
62cb21ac58SAndrii Nakryiko		  userspace side, even if they are modified by BPF code.
63cb21ac58SAndrii Nakryiko
64cb21ac58SAndrii Nakryiko		  During skeleton generation, contents of source BPF object
65cb21ac58SAndrii Nakryiko		  *FILE* is embedded within generated code and is thus not
66cb21ac58SAndrii Nakryiko		  necessary to keep around. This ensures skeleton and BPF
67cb21ac58SAndrii Nakryiko		  object file are matching 1-to-1 and always stay in sync.
68cb21ac58SAndrii Nakryiko		  Generated code is dual-licensed under LGPL-2.1 and
69cb21ac58SAndrii Nakryiko		  BSD-2-Clause licenses.
70cb21ac58SAndrii Nakryiko
71cb21ac58SAndrii Nakryiko		  It is a design goal and guarantee that skeleton interfaces
72cb21ac58SAndrii Nakryiko		  are interoperable with generic libbpf APIs. User should
73cb21ac58SAndrii Nakryiko		  always be able to use skeleton API to create and load BPF
74cb21ac58SAndrii Nakryiko		  object, and later use libbpf APIs to keep working with
75cb21ac58SAndrii Nakryiko		  specific maps, programs, etc.
76cb21ac58SAndrii Nakryiko
77cb21ac58SAndrii Nakryiko		  As part of skeleton, few custom functions are generated.
78cb21ac58SAndrii Nakryiko		  Each of them is prefixed with object name, derived from
79cb21ac58SAndrii Nakryiko		  object file name. I.e., if BPF object file name is
80cb21ac58SAndrii Nakryiko		  **example.o**, BPF object name will be **example**. The
81cb21ac58SAndrii Nakryiko		  following custom functions are provided in such case:
82cb21ac58SAndrii Nakryiko
83cb21ac58SAndrii Nakryiko		  - **example__open** and **example__open_opts**.
84cb21ac58SAndrii Nakryiko		    These functions are used to instantiate skeleton. It
85c8caa0bbSQuentin Monnet		    corresponds to libbpf's **bpf_object__open**\ () API.
86cb21ac58SAndrii Nakryiko		    **_opts** variants accepts extra **bpf_object_open_opts**
87cb21ac58SAndrii Nakryiko		    options.
88cb21ac58SAndrii Nakryiko
89cb21ac58SAndrii Nakryiko		  - **example__load**.
90cb21ac58SAndrii Nakryiko		    This function creates maps, loads and verifies BPF
91cb21ac58SAndrii Nakryiko		    programs, initializes global data maps. It corresponds to
92c8caa0bbSQuentin Monnet		    libppf's **bpf_object__load**\ () API.
93cb21ac58SAndrii Nakryiko
94cb21ac58SAndrii Nakryiko		  - **example__open_and_load** combines **example__open** and
95cb21ac58SAndrii Nakryiko		    **example__load** invocations in one commonly used
96cb21ac58SAndrii Nakryiko		    operation.
97cb21ac58SAndrii Nakryiko
98cb21ac58SAndrii Nakryiko		  - **example__attach** and **example__detach**
99cb21ac58SAndrii Nakryiko		    This pair of functions allow to attach and detach,
100cb21ac58SAndrii Nakryiko		    correspondingly, already loaded BPF object. Only BPF
101cb21ac58SAndrii Nakryiko		    programs of types supported by libbpf for auto-attachment
102cb21ac58SAndrii Nakryiko		    will be auto-attached and their corresponding BPF links
103cb21ac58SAndrii Nakryiko		    instantiated. For other BPF programs, user can manually
104cb21ac58SAndrii Nakryiko		    create a BPF link and assign it to corresponding fields in
105cb21ac58SAndrii Nakryiko		    skeleton struct. **example__detach** will detach both
106cb21ac58SAndrii Nakryiko		    links created automatically, as well as those populated by
107cb21ac58SAndrii Nakryiko		    user manually.
108cb21ac58SAndrii Nakryiko
109cb21ac58SAndrii Nakryiko		  - **example__destroy**
110cb21ac58SAndrii Nakryiko		    Detach and unload BPF programs, free up all the resources
111cb21ac58SAndrii Nakryiko		    used by skeleton and BPF object.
112cb21ac58SAndrii Nakryiko
113cb21ac58SAndrii Nakryiko		  If BPF object has global variables, corresponding structs
114cb21ac58SAndrii Nakryiko		  with memory layout corresponding to global data data section
115dacce641SAndrii Nakryiko		  layout will be created. Currently supported ones are: *.data*,
116dacce641SAndrii Nakryiko		  *.bss*, *.rodata*, and *.kconfig* structs/data sections.
117dacce641SAndrii Nakryiko		  These data sections/structs can be used to set up initial
118dacce641SAndrii Nakryiko		  values of variables, if set before **example__load**.
119dacce641SAndrii Nakryiko		  Afterwards, if target kernel supports memory-mapped BPF
120dacce641SAndrii Nakryiko		  arrays, same structs can be used to fetch and update
121dacce641SAndrii Nakryiko		  (non-read-only) data from userspace, with same simplicity
122dacce641SAndrii Nakryiko		  as for BPF side.
123cb21ac58SAndrii Nakryiko
124cb21ac58SAndrii Nakryiko	**bpftool gen help**
125cb21ac58SAndrii Nakryiko		  Print short help message.
126cb21ac58SAndrii Nakryiko
127cb21ac58SAndrii NakryikoOPTIONS
128cb21ac58SAndrii Nakryiko=======
129cb21ac58SAndrii Nakryiko	-h, --help
130cb21ac58SAndrii Nakryiko		  Print short generic help message (similar to **bpftool help**).
131cb21ac58SAndrii Nakryiko
132cb21ac58SAndrii Nakryiko	-V, --version
133cb21ac58SAndrii Nakryiko		  Print version number (similar to **bpftool version**).
134cb21ac58SAndrii Nakryiko
135cb21ac58SAndrii Nakryiko	-j, --json
136cb21ac58SAndrii Nakryiko		  Generate JSON output. For commands that cannot produce JSON,
137cb21ac58SAndrii Nakryiko		  this option has no effect.
138cb21ac58SAndrii Nakryiko
139cb21ac58SAndrii Nakryiko	-p, --pretty
140cb21ac58SAndrii Nakryiko		  Generate human-readable JSON output. Implies **-j**.
141cb21ac58SAndrii Nakryiko
142cb21ac58SAndrii Nakryiko	-d, --debug
143cb21ac58SAndrii Nakryiko		  Print all logs available from libbpf, including debug-level
144cb21ac58SAndrii Nakryiko		  information.
145cb21ac58SAndrii Nakryiko
146cb21ac58SAndrii NakryikoEXAMPLES
147cb21ac58SAndrii Nakryiko========
148cb21ac58SAndrii Nakryiko**$ cat example.c**
14916f3ddfbSQuentin Monnet
150cb21ac58SAndrii Nakryiko::
151cb21ac58SAndrii Nakryiko
152cb21ac58SAndrii Nakryiko  #include <stdbool.h>
153cb21ac58SAndrii Nakryiko  #include <linux/ptrace.h>
154cb21ac58SAndrii Nakryiko  #include <linux/bpf.h>
155cb21ac58SAndrii Nakryiko  #include "bpf_helpers.h"
156cb21ac58SAndrii Nakryiko
157cb21ac58SAndrii Nakryiko  const volatile int param1 = 42;
158cb21ac58SAndrii Nakryiko  bool global_flag = true;
159cb21ac58SAndrii Nakryiko  struct { int x; } data = {};
160cb21ac58SAndrii Nakryiko
161cb21ac58SAndrii Nakryiko  struct {
162cb21ac58SAndrii Nakryiko  	__uint(type, BPF_MAP_TYPE_HASH);
163cb21ac58SAndrii Nakryiko  	__uint(max_entries, 128);
164cb21ac58SAndrii Nakryiko  	__type(key, int);
165cb21ac58SAndrii Nakryiko  	__type(value, long);
166cb21ac58SAndrii Nakryiko  } my_map SEC(".maps");
167cb21ac58SAndrii Nakryiko
168cb21ac58SAndrii Nakryiko  SEC("raw_tp/sys_enter")
169cb21ac58SAndrii Nakryiko  int handle_sys_enter(struct pt_regs *ctx)
170cb21ac58SAndrii Nakryiko  {
171cb21ac58SAndrii Nakryiko  	static long my_static_var;
172cb21ac58SAndrii Nakryiko  	if (global_flag)
173cb21ac58SAndrii Nakryiko  		my_static_var++;
174cb21ac58SAndrii Nakryiko  	else
175cb21ac58SAndrii Nakryiko  		data.x += param1;
176cb21ac58SAndrii Nakryiko  	return 0;
177cb21ac58SAndrii Nakryiko  }
178cb21ac58SAndrii Nakryiko
179cb21ac58SAndrii Nakryiko  SEC("raw_tp/sys_exit")
180cb21ac58SAndrii Nakryiko  int handle_sys_exit(struct pt_regs *ctx)
181cb21ac58SAndrii Nakryiko  {
182cb21ac58SAndrii Nakryiko  	int zero = 0;
183cb21ac58SAndrii Nakryiko  	bpf_map_lookup_elem(&my_map, &zero);
184cb21ac58SAndrii Nakryiko  	return 0;
185cb21ac58SAndrii Nakryiko  }
186cb21ac58SAndrii Nakryiko
187cb21ac58SAndrii NakryikoThis is example BPF application with two BPF programs and a mix of BPF maps
188cb21ac58SAndrii Nakryikoand global variables.
189cb21ac58SAndrii Nakryiko
190cb21ac58SAndrii Nakryiko**$ bpftool gen skeleton example.o**
19116f3ddfbSQuentin Monnet
192cb21ac58SAndrii Nakryiko::
193cb21ac58SAndrii Nakryiko
194cb21ac58SAndrii Nakryiko  /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
195cb21ac58SAndrii Nakryiko
196cb21ac58SAndrii Nakryiko  /* THIS FILE IS AUTOGENERATED! */
197cb21ac58SAndrii Nakryiko  #ifndef __EXAMPLE_SKEL_H__
198cb21ac58SAndrii Nakryiko  #define __EXAMPLE_SKEL_H__
199cb21ac58SAndrii Nakryiko
200cb21ac58SAndrii Nakryiko  #include <stdlib.h>
201229c3b47SToke Høiland-Jørgensen  #include <bpf/libbpf.h>
202cb21ac58SAndrii Nakryiko
203cb21ac58SAndrii Nakryiko  struct example {
204cb21ac58SAndrii Nakryiko  	struct bpf_object_skeleton *skeleton;
205cb21ac58SAndrii Nakryiko  	struct bpf_object *obj;
206cb21ac58SAndrii Nakryiko  	struct {
207cb21ac58SAndrii Nakryiko  		struct bpf_map *rodata;
208cb21ac58SAndrii Nakryiko  		struct bpf_map *data;
209cb21ac58SAndrii Nakryiko  		struct bpf_map *bss;
210cb21ac58SAndrii Nakryiko  		struct bpf_map *my_map;
211cb21ac58SAndrii Nakryiko  	} maps;
212cb21ac58SAndrii Nakryiko  	struct {
213cb21ac58SAndrii Nakryiko  		struct bpf_program *handle_sys_enter;
214cb21ac58SAndrii Nakryiko  		struct bpf_program *handle_sys_exit;
215cb21ac58SAndrii Nakryiko  	} progs;
216cb21ac58SAndrii Nakryiko  	struct {
217cb21ac58SAndrii Nakryiko  		struct bpf_link *handle_sys_enter;
218cb21ac58SAndrii Nakryiko  		struct bpf_link *handle_sys_exit;
219cb21ac58SAndrii Nakryiko  	} links;
220cb21ac58SAndrii Nakryiko  	struct example__bss {
221cb21ac58SAndrii Nakryiko  		struct {
222cb21ac58SAndrii Nakryiko  			int x;
223cb21ac58SAndrii Nakryiko  		} data;
224cb21ac58SAndrii Nakryiko  	} *bss;
225cb21ac58SAndrii Nakryiko  	struct example__data {
226cb21ac58SAndrii Nakryiko  		_Bool global_flag;
227cb21ac58SAndrii Nakryiko  		long int handle_sys_enter_my_static_var;
228cb21ac58SAndrii Nakryiko  	} *data;
229cb21ac58SAndrii Nakryiko  	struct example__rodata {
230cb21ac58SAndrii Nakryiko  		int param1;
231cb21ac58SAndrii Nakryiko  	} *rodata;
232cb21ac58SAndrii Nakryiko  };
233cb21ac58SAndrii Nakryiko
234cb21ac58SAndrii Nakryiko  static void example__destroy(struct example *obj);
235cb21ac58SAndrii Nakryiko  static inline struct example *example__open_opts(
236cb21ac58SAndrii Nakryiko                const struct bpf_object_open_opts *opts);
237cb21ac58SAndrii Nakryiko  static inline struct example *example__open();
238cb21ac58SAndrii Nakryiko  static inline int example__load(struct example *obj);
239cb21ac58SAndrii Nakryiko  static inline struct example *example__open_and_load();
240cb21ac58SAndrii Nakryiko  static inline int example__attach(struct example *obj);
241cb21ac58SAndrii Nakryiko  static inline void example__detach(struct example *obj);
242cb21ac58SAndrii Nakryiko
243cb21ac58SAndrii Nakryiko  #endif /* __EXAMPLE_SKEL_H__ */
244cb21ac58SAndrii Nakryiko
245cb21ac58SAndrii Nakryiko**$ cat example_user.c**
24616f3ddfbSQuentin Monnet
247cb21ac58SAndrii Nakryiko::
248cb21ac58SAndrii Nakryiko
249cb21ac58SAndrii Nakryiko  #include "example.skel.h"
250cb21ac58SAndrii Nakryiko
251cb21ac58SAndrii Nakryiko  int main()
252cb21ac58SAndrii Nakryiko  {
253cb21ac58SAndrii Nakryiko  	struct example *skel;
254cb21ac58SAndrii Nakryiko  	int err = 0;
255cb21ac58SAndrii Nakryiko
256cb21ac58SAndrii Nakryiko  	skel = example__open();
257cb21ac58SAndrii Nakryiko  	if (!skel)
258cb21ac58SAndrii Nakryiko  		goto cleanup;
259cb21ac58SAndrii Nakryiko
260cb21ac58SAndrii Nakryiko  	skel->rodata->param1 = 128;
261cb21ac58SAndrii Nakryiko
262cb21ac58SAndrii Nakryiko  	err = example__load(skel);
263cb21ac58SAndrii Nakryiko  	if (err)
264cb21ac58SAndrii Nakryiko  		goto cleanup;
265cb21ac58SAndrii Nakryiko
266cb21ac58SAndrii Nakryiko  	err = example__attach(skel);
267cb21ac58SAndrii Nakryiko  	if (err)
268cb21ac58SAndrii Nakryiko  		goto cleanup;
269cb21ac58SAndrii Nakryiko
270cb21ac58SAndrii Nakryiko  	/* all libbpf APIs are usable */
271cb21ac58SAndrii Nakryiko  	printf("my_map name: %s\n", bpf_map__name(skel->maps.my_map));
272cb21ac58SAndrii Nakryiko  	printf("sys_enter prog FD: %d\n",
273cb21ac58SAndrii Nakryiko  	       bpf_program__fd(skel->progs.handle_sys_enter));
274cb21ac58SAndrii Nakryiko
275cb21ac58SAndrii Nakryiko  	/* detach and re-attach sys_exit program */
276cb21ac58SAndrii Nakryiko  	bpf_link__destroy(skel->links.handle_sys_exit);
277cb21ac58SAndrii Nakryiko  	skel->links.handle_sys_exit =
278cb21ac58SAndrii Nakryiko  		bpf_program__attach(skel->progs.handle_sys_exit);
279cb21ac58SAndrii Nakryiko
280cb21ac58SAndrii Nakryiko  	printf("my_static_var: %ld\n",
281cb21ac58SAndrii Nakryiko  	       skel->bss->handle_sys_enter_my_static_var);
282cb21ac58SAndrii Nakryiko
283cb21ac58SAndrii Nakryiko  cleanup:
284cb21ac58SAndrii Nakryiko  	example__destroy(skel);
285cb21ac58SAndrii Nakryiko  	return err;
286cb21ac58SAndrii Nakryiko  }
287cb21ac58SAndrii Nakryiko
288cb21ac58SAndrii Nakryiko**# ./example_user**
28916f3ddfbSQuentin Monnet
290cb21ac58SAndrii Nakryiko::
291cb21ac58SAndrii Nakryiko
292cb21ac58SAndrii Nakryiko  my_map name: my_map
293cb21ac58SAndrii Nakryiko  sys_enter prog FD: 8
294cb21ac58SAndrii Nakryiko  my_static_var: 7
295cb21ac58SAndrii Nakryiko
296cb21ac58SAndrii NakryikoThis is a stripped-out version of skeleton generated for above example code.
297cb21ac58SAndrii Nakryiko
298cb21ac58SAndrii NakryikoSEE ALSO
299cb21ac58SAndrii Nakryiko========
300cb21ac58SAndrii Nakryiko	**bpf**\ (2),
301cb21ac58SAndrii Nakryiko	**bpf-helpers**\ (7),
302cb21ac58SAndrii Nakryiko	**bpftool**\ (8),
303c8caa0bbSQuentin Monnet	**bpftool-btf**\ (8),
304cb21ac58SAndrii Nakryiko	**bpftool-cgroup**\ (8),
305cb21ac58SAndrii Nakryiko	**bpftool-feature**\ (8),
306c8caa0bbSQuentin Monnet	**bpftool-iter**\ (8),
307c8caa0bbSQuentin Monnet	**bpftool-link**\ (8),
308c8caa0bbSQuentin Monnet	**bpftool-map**\ (8),
309cb21ac58SAndrii Nakryiko	**bpftool-net**\ (8),
310cb21ac58SAndrii Nakryiko	**bpftool-perf**\ (8),
311c8caa0bbSQuentin Monnet	**bpftool-prog**\ (8),
312c8caa0bbSQuentin Monnet	**bpftool-struct_ops**\ (8)
313