xref: /openbsd-src/lib/libpcap/bpf_image.c (revision 19fef81560be48509a81878548a6da7da6687cb4)
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