1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* 2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1990, 1991, 1992, 1994, 1995, 1996 3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * The Regents of the University of California. All rights reserved. 4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * distributions including binary code include the above copyright notice and 9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * features or use of this software display the following acknowledgement: 12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * ``This product includes software developed by the University of California, 13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * the University nor the names of its contributors may be used to endorse 15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * or promote products derived from this software without specific prior 16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * written permission. 17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */ 21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H 23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h" 24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef WIN32 27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <pcap-stdinc.h> 28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /* WIN32 */ 29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if HAVE_INTTYPES_H 30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <inttypes.h> 31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#elif HAVE_STDINT_H 32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdint.h> 33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_SYS_BITYPES_H 35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/bitypes.h> 36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif 37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <sys/types.h> 38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* WIN32 */ 39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall 40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h> 41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <string.h> 42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "pcap-int.h" 44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_OS_PROTO_H 46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "os-proto.h" 47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif 48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectchar * 50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbpf_image(p, n) 51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall const struct bpf_insn *p; 52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int n; 53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{ 54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project int v; 55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project const char *fmt, *op; 56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project static char image[256]; 57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project char operand[64]; 58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project v = p->k; 60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project switch (p->code) { 61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project default: 63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "unimp"; 64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "0x%x"; 65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project v = p->code; 66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_RET|BPF_K: 69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ret"; 70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_RET|BPF_A: 74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ret"; 75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = ""; 76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_W|BPF_ABS: 79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ld"; 80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "[%d]"; 81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_H|BPF_ABS: 84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldh"; 85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "[%d]"; 86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_B|BPF_ABS: 89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldb"; 90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "[%d]"; 91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_W|BPF_LEN: 94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ld"; 95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#pktlen"; 96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_W|BPF_IND: 99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ld"; 100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "[x + %d]"; 101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_H|BPF_IND: 104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldh"; 105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "[x + %d]"; 106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_B|BPF_IND: 109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldb"; 110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "[x + %d]"; 111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_IMM: 114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ld"; 115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LDX|BPF_IMM: 119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldx"; 120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LDX|BPF_MSH|BPF_B: 124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldxb"; 125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "4*([%d]&0xf)"; 126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LD|BPF_MEM: 129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ld"; 130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "M[%d]"; 131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_LDX|BPF_MEM: 134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ldx"; 135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "M[%d]"; 136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ST: 139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "st"; 140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "M[%d]"; 141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_STX: 144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "stx"; 145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "M[%d]"; 146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JA: 149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "ja"; 150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "%d"; 151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project v = n + 1 + p->k; 152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JGT|BPF_K: 155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jgt"; 156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JGE|BPF_K: 160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jge"; 161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JEQ|BPF_K: 165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jeq"; 166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JSET|BPF_K: 170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jset"; 171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JGT|BPF_X: 175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jgt"; 176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JGE|BPF_X: 180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jge"; 181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JEQ|BPF_X: 185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jeq"; 186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_JMP|BPF_JSET|BPF_X: 190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "jset"; 191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_ADD|BPF_X: 195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "add"; 196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_SUB|BPF_X: 200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "sub"; 201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_MUL|BPF_X: 205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "mul"; 206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_DIV|BPF_X: 210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "div"; 211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 214d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes case BPF_ALU|BPF_MOD|BPF_X: 215d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes op = "mod"; 216d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes fmt = "x"; 217d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes break; 218d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes 219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_AND|BPF_X: 220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "and"; 221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_OR|BPF_X: 225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "or"; 226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 229d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes case BPF_ALU|BPF_XOR|BPF_X: 230d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes op = "xor"; 231d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes fmt = "x"; 232d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes break; 233d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes 234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_LSH|BPF_X: 235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "lsh"; 236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_RSH|BPF_X: 240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "rsh"; 241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "x"; 242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_ADD|BPF_K: 245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "add"; 246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_SUB|BPF_K: 250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "sub"; 251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_MUL|BPF_K: 255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "mul"; 256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 258478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 259478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_DIV|BPF_K: 260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "div"; 261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 264d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes case BPF_ALU|BPF_MOD|BPF_K: 265d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes op = "mod"; 266d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes fmt = "#%d"; 267d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes break; 268d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes 269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_AND|BPF_K: 270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "and"; 271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 274478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_OR|BPF_K: 275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "or"; 276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#0x%x"; 277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 279d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes case BPF_ALU|BPF_XOR|BPF_K: 280d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes op = "xor"; 281d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes fmt = "#0x%x"; 282d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes break; 283d8845d7191ca81aae8aab4c29410fc8a3d012687Elliott Hughes 284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_LSH|BPF_K: 285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "lsh"; 286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_RSH|BPF_K: 290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "rsh"; 291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = "#%d"; 292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_ALU|BPF_NEG: 295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "neg"; 296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = ""; 297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_MISC|BPF_TAX: 300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "tax"; 301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = ""; 302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project 304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project case BPF_MISC|BPF_TXA: 305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project op = "txa"; 306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project fmt = ""; 307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project break; 308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project } 309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project (void)snprintf(operand, sizeof operand, fmt, v); 310511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall if (BPF_CLASS(p->code) == BPF_JMP && BPF_OP(p->code) != BPF_JA) { 311511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (void)snprintf(image, sizeof image, 312511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "(%03d) %-8s %-16s jt %d\tjf %d", 313511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall n, op, operand, n + 1 + p->jt, n + 1 + p->jf); 314511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } else { 315511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall (void)snprintf(image, sizeof image, 316511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall "(%03d) %-8s %s", 317511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall n, op, operand); 318511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall } 319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project return image; 320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project} 321