xref: /linux/tools/bpf/bpftool/Documentation/bpftool-prog.rst (revision b053b439b72ad152257ecc3f71cfb4c619b0137e)
1================
2bpftool-prog
3================
4-------------------------------------------------------------------------------
5tool for inspection and simple manipulation of eBPF progs
6-------------------------------------------------------------------------------
7
8:Manual section: 8
9
10SYNOPSIS
11========
12
13	**bpftool** [*OPTIONS*] **prog** *COMMAND*
14
15	*OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] | { **-f** | **--bpffs** } }
16
17	*COMMANDS* :=
18	{ **show** | **list** | **dump xlated** | **dump jited** | **pin** | **load**
19	| **loadall** | **help** }
20
21MAP COMMANDS
22=============
23
24|	**bpftool** **prog { show | list }** [*PROG*]
25|	**bpftool** **prog dump xlated** *PROG* [{**file** *FILE* | **opcodes** | **visual** | **linum**}]
26|	**bpftool** **prog dump jited**  *PROG* [{**file** *FILE* | **opcodes** | **linum**}]
27|	**bpftool** **prog pin** *PROG* *FILE*
28|	**bpftool** **prog { load | loadall }** *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*]
29|	**bpftool** **prog attach** *PROG* *ATTACH_TYPE* [*MAP*]
30|	**bpftool** **prog detach** *PROG* *ATTACH_TYPE* [*MAP*]
31|	**bpftool** **prog tracelog**
32|	**bpftool** **prog help**
33|
34|	*MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
35|	*PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* }
36|	*TYPE* := {
37|		**socket** | **kprobe** | **kretprobe** | **classifier** | **action** |
38|		**tracepoint** | **raw_tracepoint** | **xdp** | **perf_event** | **cgroup/skb** |
39|		**cgroup/sock** | **cgroup/dev** | **lwt_in** | **lwt_out** | **lwt_xmit** |
40|		**lwt_seg6local** | **sockops** | **sk_skb** | **sk_msg** | **lirc_mode2** |
41|		**cgroup/bind4** | **cgroup/bind6** | **cgroup/post_bind4** | **cgroup/post_bind6** |
42|		**cgroup/connect4** | **cgroup/connect6** | **cgroup/sendmsg4** | **cgroup/sendmsg6**
43|	}
44|       *ATTACH_TYPE* := {
45|		**msg_verdict** | **skb_verdict** | **skb_parse** | **flow_dissector**
46|	}
47
48
49DESCRIPTION
50===========
51	**bpftool prog { show | list }** [*PROG*]
52		  Show information about loaded programs.  If *PROG* is
53		  specified show information only about given program, otherwise
54		  list all programs currently loaded on the system.
55
56		  Output will start with program ID followed by program type and
57		  zero or more named attributes (depending on kernel version).
58
59	**bpftool prog dump xlated** *PROG* [{ **file** *FILE* | **opcodes** | **visual** | **linum** }]
60		  Dump eBPF instructions of the program from the kernel. By
61		  default, eBPF will be disassembled and printed to standard
62		  output in human-readable format. In this case, **opcodes**
63		  controls if raw opcodes should be printed as well.
64
65		  If **file** is specified, the binary image will instead be
66		  written to *FILE*.
67
68		  If **visual** is specified, control flow graph (CFG) will be
69		  built instead, and eBPF instructions will be presented with
70		  CFG in DOT format, on standard output.
71
72		  If the prog has line_info available, the source line will
73		  be displayed by default.  If **linum** is specified,
74		  the filename, line number and line column will also be
75		  displayed on top of the source line.
76	**bpftool prog dump jited**  *PROG* [{ **file** *FILE* | **opcodes** | **linum** }]
77		  Dump jited image (host machine code) of the program.
78		  If *FILE* is specified image will be written to a file,
79		  otherwise it will be disassembled and printed to stdout.
80
81		  **opcodes** controls if raw opcodes will be printed.
82
83		  If the prog has line_info available, the source line will
84		  be displayed by default.  If **linum** is specified,
85		  the filename, line number and line column will also be
86		  displayed on top of the source line.
87	**bpftool prog pin** *PROG* *FILE*
88		  Pin program *PROG* as *FILE*.
89
90		  Note: *FILE* must be located in *bpffs* mount. It must not
91		  contain a dot character ('.'), which is reserved for future
92		  extensions of *bpffs*.
93
94	**bpftool prog { load | loadall }** *OBJ* *PATH* [**type** *TYPE*] [**map** {**idx** *IDX* | **name** *NAME*} *MAP*] [**dev** *NAME*] [**pinmaps** *MAP_DIR*]
95		  Load bpf program(s) from binary *OBJ* and pin as *PATH*.
96		  **bpftool prog load** pins only the first program from the
97		  *OBJ* as *PATH*. **bpftool prog loadall** pins all programs
98		  from the *OBJ* under *PATH* directory.
99		  **type** is optional, if not specified program type will be
100		  inferred from section names.
101		  By default bpftool will create new maps as declared in the ELF
102		  object being loaded.  **map** parameter allows for the reuse
103		  of existing maps.  It can be specified multiple times, each
104		  time for a different map.  *IDX* refers to index of the map
105		  to be replaced in the ELF file counting from 0, while *NAME*
106		  allows to replace a map by name.  *MAP* specifies the map to
107		  use, referring to it by **id** or through a **pinned** file.
108		  If **dev** *NAME* is specified program will be loaded onto
109		  given networking device (offload).
110		  Optional **pinmaps** argument can be provided to pin all
111		  maps under *MAP_DIR* directory.
112
113		  Note: *PATH* must be located in *bpffs* mount. It must not
114		  contain a dot character ('.'), which is reserved for future
115		  extensions of *bpffs*.
116
117	**bpftool prog attach** *PROG* *ATTACH_TYPE* [*MAP*]
118		  Attach bpf program *PROG* (with type specified by
119		  *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP*
120		  parameter, with the exception of *flow_dissector* which is
121		  attached to current networking name space.
122
123	**bpftool prog detach** *PROG* *ATTACH_TYPE* [*MAP*]
124		  Detach bpf program *PROG* (with type specified by
125		  *ATTACH_TYPE*). Most *ATTACH_TYPEs* require a *MAP*
126		  parameter, with the exception of *flow_dissector* which is
127		  detached from the current networking name space.
128
129	**bpftool prog tracelog**
130		  Dump the trace pipe of the system to the console (stdout).
131		  Hit <Ctrl+C> to stop printing. BPF programs can write to this
132		  trace pipe at runtime with the **bpf_trace_printk()** helper.
133		  This should be used only for debugging purposes. For
134		  streaming data from BPF programs to user space, one can use
135		  perf events (see also **bpftool-map**\ (8)).
136
137	**bpftool prog help**
138		  Print short help message.
139
140OPTIONS
141=======
142	-h, --help
143		  Print short generic help message (similar to **bpftool help**).
144
145	-v, --version
146		  Print version number (similar to **bpftool version**).
147
148	-j, --json
149		  Generate JSON output. For commands that cannot produce JSON, this
150		  option has no effect.
151
152	-p, --pretty
153		  Generate human-readable JSON output. Implies **-j**.
154
155	-f, --bpffs
156		  When showing BPF programs, show file names of pinned
157		  programs.
158
159EXAMPLES
160========
161**# bpftool prog show**
162::
163
164  10: xdp  name some_prog  tag 005a3d2123620c8b  gpl
165	loaded_at Sep 29/20:11  uid 0
166	xlated 528B  jited 370B  memlock 4096B  map_ids 10
167
168**# bpftool --json --pretty prog show**
169
170::
171
172    {
173        "programs": [{
174                "id": 10,
175                "type": "xdp",
176                "tag": "005a3d2123620c8b",
177                "gpl_compatible": true,
178                "loaded_at": "Sep 29/20:11",
179                "uid": 0,
180                "bytes_xlated": 528,
181                "jited": true,
182                "bytes_jited": 370,
183                "bytes_memlock": 4096,
184                "map_ids": [10
185                ]
186            }
187        ]
188    }
189
190|
191| **# bpftool prog dump xlated id 10 file /tmp/t**
192| **# ls -l /tmp/t**
193|   -rw------- 1 root root 560 Jul 22 01:42 /tmp/t
194
195**# bpftool prog dum jited tag 005a3d2123620c8b**
196
197::
198
199    push   %rbp
200    mov    %rsp,%rbp
201    sub    $0x228,%rsp
202    sub    $0x28,%rbp
203    mov    %rbx,0x0(%rbp)
204
205|
206| **# mount -t bpf none /sys/fs/bpf/**
207| **# bpftool prog pin id 10 /sys/fs/bpf/prog**
208| **# bpftool prog load ./my_prog.o /sys/fs/bpf/prog2**
209| **# ls -l /sys/fs/bpf/**
210|   -rw------- 1 root root 0 Jul 22 01:43 prog
211|   -rw------- 1 root root 0 Jul 22 01:44 prog2
212
213**# bpftool prog dum jited pinned /sys/fs/bpf/prog opcodes**
214
215::
216
217    push   %rbp
218    55
219    mov    %rsp,%rbp
220    48 89 e5
221    sub    $0x228,%rsp
222    48 81 ec 28 02 00 00
223    sub    $0x28,%rbp
224    48 83 ed 28
225    mov    %rbx,0x0(%rbp)
226    48 89 5d 00
227
228|
229| **# bpftool prog load xdp1_kern.o /sys/fs/bpf/xdp1 type xdp map name rxcnt id 7**
230| **# bpftool prog show pinned /sys/fs/bpf/xdp1**
231|   9: xdp  name xdp_prog1  tag 539ec6ce11b52f98  gpl
232|	loaded_at 2018-06-25T16:17:31-0700  uid 0
233|	xlated 488B  jited 336B  memlock 4096B  map_ids 7
234| **# rm /sys/fs/bpf/xdp1**
235|
236
237SEE ALSO
238========
239	**bpf**\ (2),
240	**bpf-helpers**\ (7),
241	**bpftool**\ (8),
242	**bpftool-map**\ (8),
243	**bpftool-cgroup**\ (8),
244	**bpftool-net**\ (8),
245	**bpftool-perf**\ (8)
246