1*19fef815Sderaadt /* $OpenBSD: bpf_image.c,v 1.12 2024/04/05 18:01:56 deraadt Exp $ */
2df930be7Sderaadt
3df930be7Sderaadt /*
401efc7efSderaadt * Copyright (c) 1990, 1991, 1992, 1994, 1995, 1996
5df930be7Sderaadt * The Regents of the University of California. All rights reserved.
6df930be7Sderaadt *
7df930be7Sderaadt * Redistribution and use in source and binary forms, with or without
8df930be7Sderaadt * modification, are permitted provided that: (1) source code distributions
9df930be7Sderaadt * retain the above copyright notice and this paragraph in its entirety, (2)
10df930be7Sderaadt * distributions including binary code include the above copyright notice and
11df930be7Sderaadt * this paragraph in its entirety in the documentation or other materials
12df930be7Sderaadt * provided with the distribution, and (3) all advertising materials mentioning
13df930be7Sderaadt * features or use of this software display the following acknowledgement:
14df930be7Sderaadt * ``This product includes software developed by the University of California,
15df930be7Sderaadt * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16df930be7Sderaadt * the University nor the names of its contributors may be used to endorse
17df930be7Sderaadt * or promote products derived from this software without specific prior
18df930be7Sderaadt * written permission.
19df930be7Sderaadt * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20df930be7Sderaadt * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21df930be7Sderaadt * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22df930be7Sderaadt */
23df930be7Sderaadt
24df930be7Sderaadt #include <sys/types.h>
25df930be7Sderaadt #include <sys/time.h>
26df930be7Sderaadt
27df930be7Sderaadt #include <stdio.h>
28df930be7Sderaadt #include <string.h>
29df930be7Sderaadt
3001efc7efSderaadt #include "pcap-int.h"
3101efc7efSderaadt
329b113833Smickey #ifdef HAVE_OS_PROTO_H
339b113833Smickey #include "os-proto.h"
349b113833Smickey #endif
359b113833Smickey
36df930be7Sderaadt char *
bpf_image(const struct bpf_insn * p,int n)37*19fef815Sderaadt bpf_image(const struct bpf_insn *p, int n)
38df930be7Sderaadt {
39df930be7Sderaadt int v;
40df930be7Sderaadt char *fmt, *op;
41df930be7Sderaadt static char image[256];
42df930be7Sderaadt char operand[64];
43df930be7Sderaadt
44df930be7Sderaadt v = p->k;
45df930be7Sderaadt switch (p->code) {
46df930be7Sderaadt
47df930be7Sderaadt default:
48df930be7Sderaadt op = "unimp";
49df930be7Sderaadt fmt = "0x%x";
50df930be7Sderaadt v = p->code;
51df930be7Sderaadt break;
52df930be7Sderaadt
53df930be7Sderaadt case BPF_RET|BPF_K:
54df930be7Sderaadt op = "ret";
55df930be7Sderaadt fmt = "#%d";
56df930be7Sderaadt break;
57df930be7Sderaadt
58df930be7Sderaadt case BPF_RET|BPF_A:
59df930be7Sderaadt op = "ret";
60df930be7Sderaadt fmt = "";
61df930be7Sderaadt break;
62df930be7Sderaadt
63df930be7Sderaadt case BPF_LD|BPF_W|BPF_ABS:
64df930be7Sderaadt op = "ld";
65df930be7Sderaadt fmt = "[%d]";
66df930be7Sderaadt break;
67df930be7Sderaadt
68df930be7Sderaadt case BPF_LD|BPF_H|BPF_ABS:
69df930be7Sderaadt op = "ldh";
70df930be7Sderaadt fmt = "[%d]";
71df930be7Sderaadt break;
72df930be7Sderaadt
73df930be7Sderaadt case BPF_LD|BPF_B|BPF_ABS:
74df930be7Sderaadt op = "ldb";
75df930be7Sderaadt fmt = "[%d]";
76df930be7Sderaadt break;
77df930be7Sderaadt
78df930be7Sderaadt case BPF_LD|BPF_W|BPF_LEN:
79df930be7Sderaadt op = "ld";
80df930be7Sderaadt fmt = "#pktlen";
81df930be7Sderaadt break;
82df930be7Sderaadt
83a8e9f808Sdlg case BPF_LD|BPF_W|BPF_RND:
84a8e9f808Sdlg op = "ld";
85a8e9f808Sdlg fmt = "#random";
86a8e9f808Sdlg break;
87a8e9f808Sdlg
88df930be7Sderaadt case BPF_LD|BPF_W|BPF_IND:
89df930be7Sderaadt op = "ld";
90df930be7Sderaadt fmt = "[x + %d]";
91df930be7Sderaadt break;
92df930be7Sderaadt
93df930be7Sderaadt case BPF_LD|BPF_H|BPF_IND:
94df930be7Sderaadt op = "ldh";
95df930be7Sderaadt fmt = "[x + %d]";
96df930be7Sderaadt break;
97df930be7Sderaadt
98df930be7Sderaadt case BPF_LD|BPF_B|BPF_IND:
99df930be7Sderaadt op = "ldb";
100df930be7Sderaadt fmt = "[x + %d]";
101df930be7Sderaadt break;
102df930be7Sderaadt
103df930be7Sderaadt case BPF_LD|BPF_IMM:
104df930be7Sderaadt op = "ld";
105df930be7Sderaadt fmt = "#0x%x";
106df930be7Sderaadt break;
107df930be7Sderaadt
108df930be7Sderaadt case BPF_LDX|BPF_IMM:
109df930be7Sderaadt op = "ldx";
110df930be7Sderaadt fmt = "#0x%x";
111df930be7Sderaadt break;
112df930be7Sderaadt
113df930be7Sderaadt case BPF_LDX|BPF_MSH|BPF_B:
114df930be7Sderaadt op = "ldxb";
115df930be7Sderaadt fmt = "4*([%d]&0xf)";
116df930be7Sderaadt break;
117df930be7Sderaadt
118df930be7Sderaadt case BPF_LD|BPF_MEM:
119df930be7Sderaadt op = "ld";
120df930be7Sderaadt fmt = "M[%d]";
121df930be7Sderaadt break;
122df930be7Sderaadt
123df930be7Sderaadt case BPF_LDX|BPF_MEM:
124df930be7Sderaadt op = "ldx";
125df930be7Sderaadt fmt = "M[%d]";
126df930be7Sderaadt break;
127df930be7Sderaadt
128df930be7Sderaadt case BPF_ST:
129df930be7Sderaadt op = "st";
130df930be7Sderaadt fmt = "M[%d]";
131df930be7Sderaadt break;
132df930be7Sderaadt
133df930be7Sderaadt case BPF_STX:
134df930be7Sderaadt op = "stx";
135df930be7Sderaadt fmt = "M[%d]";
136df930be7Sderaadt break;
137df930be7Sderaadt
138df930be7Sderaadt case BPF_JMP|BPF_JA:
139df930be7Sderaadt op = "ja";
140df930be7Sderaadt fmt = "%d";
1419b113833Smickey v = n + 1 + p->k;
142df930be7Sderaadt break;
143df930be7Sderaadt
144df930be7Sderaadt case BPF_JMP|BPF_JGT|BPF_K:
145df930be7Sderaadt op = "jgt";
146df930be7Sderaadt fmt = "#0x%x";
147df930be7Sderaadt break;
148df930be7Sderaadt
149df930be7Sderaadt case BPF_JMP|BPF_JGE|BPF_K:
150df930be7Sderaadt op = "jge";
151df930be7Sderaadt fmt = "#0x%x";
152df930be7Sderaadt break;
153df930be7Sderaadt
154df930be7Sderaadt case BPF_JMP|BPF_JEQ|BPF_K:
155df930be7Sderaadt op = "jeq";
156df930be7Sderaadt fmt = "#0x%x";
157df930be7Sderaadt break;
158df930be7Sderaadt
159df930be7Sderaadt case BPF_JMP|BPF_JSET|BPF_K:
160df930be7Sderaadt op = "jset";
161df930be7Sderaadt fmt = "#0x%x";
162df930be7Sderaadt break;
163df930be7Sderaadt
164df930be7Sderaadt case BPF_JMP|BPF_JGT|BPF_X:
165df930be7Sderaadt op = "jgt";
166df930be7Sderaadt fmt = "x";
167df930be7Sderaadt break;
168df930be7Sderaadt
169df930be7Sderaadt case BPF_JMP|BPF_JGE|BPF_X:
170df930be7Sderaadt op = "jge";
171df930be7Sderaadt fmt = "x";
172df930be7Sderaadt break;
173df930be7Sderaadt
174df930be7Sderaadt case BPF_JMP|BPF_JEQ|BPF_X:
175df930be7Sderaadt op = "jeq";
176df930be7Sderaadt fmt = "x";
177df930be7Sderaadt break;
178df930be7Sderaadt
179df930be7Sderaadt case BPF_JMP|BPF_JSET|BPF_X:
180df930be7Sderaadt op = "jset";
181df930be7Sderaadt fmt = "x";
182df930be7Sderaadt break;
183df930be7Sderaadt
184df930be7Sderaadt case BPF_ALU|BPF_ADD|BPF_X:
185df930be7Sderaadt op = "add";
186df930be7Sderaadt fmt = "x";
187df930be7Sderaadt break;
188df930be7Sderaadt
189df930be7Sderaadt case BPF_ALU|BPF_SUB|BPF_X:
190df930be7Sderaadt op = "sub";
191df930be7Sderaadt fmt = "x";
192df930be7Sderaadt break;
193df930be7Sderaadt
194df930be7Sderaadt case BPF_ALU|BPF_MUL|BPF_X:
195df930be7Sderaadt op = "mul";
196df930be7Sderaadt fmt = "x";
197df930be7Sderaadt break;
198df930be7Sderaadt
199df930be7Sderaadt case BPF_ALU|BPF_DIV|BPF_X:
200df930be7Sderaadt op = "div";
201df930be7Sderaadt fmt = "x";
202df930be7Sderaadt break;
203df930be7Sderaadt
204df930be7Sderaadt case BPF_ALU|BPF_AND|BPF_X:
205df930be7Sderaadt op = "and";
206df930be7Sderaadt fmt = "x";
207df930be7Sderaadt break;
208df930be7Sderaadt
209df930be7Sderaadt case BPF_ALU|BPF_OR|BPF_X:
210df930be7Sderaadt op = "or";
211df930be7Sderaadt fmt = "x";
212df930be7Sderaadt break;
213df930be7Sderaadt
214df930be7Sderaadt case BPF_ALU|BPF_LSH|BPF_X:
215df930be7Sderaadt op = "lsh";
216df930be7Sderaadt fmt = "x";
217df930be7Sderaadt break;
218df930be7Sderaadt
219df930be7Sderaadt case BPF_ALU|BPF_RSH|BPF_X:
220df930be7Sderaadt op = "rsh";
221df930be7Sderaadt fmt = "x";
222df930be7Sderaadt break;
223df930be7Sderaadt
224df930be7Sderaadt case BPF_ALU|BPF_ADD|BPF_K:
225df930be7Sderaadt op = "add";
226df930be7Sderaadt fmt = "#%d";
227df930be7Sderaadt break;
228df930be7Sderaadt
229df930be7Sderaadt case BPF_ALU|BPF_SUB|BPF_K:
230df930be7Sderaadt op = "sub";
231df930be7Sderaadt fmt = "#%d";
232df930be7Sderaadt break;
233df930be7Sderaadt
234df930be7Sderaadt case BPF_ALU|BPF_MUL|BPF_K:
235df930be7Sderaadt op = "mul";
236df930be7Sderaadt fmt = "#%d";
237df930be7Sderaadt break;
238df930be7Sderaadt
239df930be7Sderaadt case BPF_ALU|BPF_DIV|BPF_K:
240df930be7Sderaadt op = "div";
241df930be7Sderaadt fmt = "#%d";
242df930be7Sderaadt break;
243df930be7Sderaadt
244df930be7Sderaadt case BPF_ALU|BPF_AND|BPF_K:
245df930be7Sderaadt op = "and";
246a9b0695fSjakob fmt = "#0x%x";
247df930be7Sderaadt break;
248df930be7Sderaadt
249df930be7Sderaadt case BPF_ALU|BPF_OR|BPF_K:
250df930be7Sderaadt op = "or";
251a9b0695fSjakob fmt = "#0x%x";
252df930be7Sderaadt break;
253df930be7Sderaadt
254df930be7Sderaadt case BPF_ALU|BPF_LSH|BPF_K:
255df930be7Sderaadt op = "lsh";
256df930be7Sderaadt fmt = "#%d";
257df930be7Sderaadt break;
258df930be7Sderaadt
259df930be7Sderaadt case BPF_ALU|BPF_RSH|BPF_K:
260df930be7Sderaadt op = "rsh";
261df930be7Sderaadt fmt = "#%d";
262df930be7Sderaadt break;
263df930be7Sderaadt
264df930be7Sderaadt case BPF_ALU|BPF_NEG:
265df930be7Sderaadt op = "neg";
266df930be7Sderaadt fmt = "";
267df930be7Sderaadt break;
268df930be7Sderaadt
269df930be7Sderaadt case BPF_MISC|BPF_TAX:
270df930be7Sderaadt op = "tax";
271df930be7Sderaadt fmt = "";
272df930be7Sderaadt break;
273df930be7Sderaadt
274df930be7Sderaadt case BPF_MISC|BPF_TXA:
275df930be7Sderaadt op = "txa";
276df930be7Sderaadt fmt = "";
277df930be7Sderaadt break;
278df930be7Sderaadt }
27913c7aa11Sderaadt (void)snprintf(operand, sizeof operand, fmt, v);
28013c7aa11Sderaadt (void)snprintf(image, sizeof image,
281df930be7Sderaadt (BPF_CLASS(p->code) == BPF_JMP &&
282df930be7Sderaadt BPF_OP(p->code) != BPF_JA) ?
283df930be7Sderaadt "(%03d) %-8s %-16s jt %d\tjf %d"
284df930be7Sderaadt : "(%03d) %-8s %s",
285df930be7Sderaadt n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
286df930be7Sderaadt return image;
287df930be7Sderaadt }
288