1fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* bpf.h 2fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 3fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * Use of this source code is governed by a BSD-style license that can be 4fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * found in the LICENSE file. 5fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * 6fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * Berkeley Packet Filter functions. 7fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes */ 8fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 9fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#ifndef BPF_H 10fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define BPF_H 11fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 12fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#include <asm/bitsperlong.h> /* for __BITS_PER_LONG */ 1368db15cc2ea5b8314b4c8f7f3920423aeb5e25ebSamuel Tan#include <endian.h> 14d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes#include <linux/audit.h> 15fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#include <linux/filter.h> 16fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#include <stddef.h> 17fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#include <sys/user.h> 18fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 19a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes#ifdef __cplusplus 20a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obesextern "C" { 21a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes#endif 22a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes 238b488a5b1f0b5eab62516b50e638c1484409bb87Jorge Lucangeli Obes#include "arch.h" 248b488a5b1f0b5eab62516b50e638c1484409bb87Jorge Lucangeli Obes 258a56ec283c64512a16e4e19ae6a293ba7f543dafJorge Lucangeli Obes#if __BITS_PER_LONG == 32 || defined(__ILP32__) 26fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define BITS32 27fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#elif __BITS_PER_LONG == 64 28fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define BITS64 29fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#endif 30fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 31fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* Constants for comparison operators. */ 32fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define MIN_OPERATOR 128 33a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obesenum { 34fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes EQ = MIN_OPERATOR, 35fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes NE, 36fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes LT, 37fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes LE, 38fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes GT, 39ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes GE, 40fd6f8e31caec28bdd127eb97e2c2111cfcbac447Jorge Lucangeli Obes SET, 41fd6f8e31caec28bdd127eb97e2c2111cfcbac447Jorge Lucangeli Obes IN 42fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes}; 43fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 44fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* 45fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * BPF return values and data structures, 46fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes * since they're not yet in the kernel. 47fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes */ 48fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */ 49fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SECCOMP_RET_TRAP 0x00030000U /* return SIGSYS */ 50fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SECCOMP_RET_ERRNO 0x00050000U /* return -1 and set errno */ 51fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */ 52fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 53fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SECCOMP_RET_DATA 0x0000ffffU /* mask for return value */ 54fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 55fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesstruct seccomp_data { 56fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes int nr; 57fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes __u32 arch; 58fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes __u64 instruction_pointer; 59fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes __u64 args[6]; 60fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes}; 61fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 62d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes#define syscall_nr (offsetof(struct seccomp_data, nr)) 63d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes#define arch_nr (offsetof(struct seccomp_data, arch)) 64d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes 65fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* Size-dependent defines. */ 66fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#if defined(BITS32) 67ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes/* 68ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes * On 32 bits, comparisons take 2 instructions: 1 for loading the argument, 69ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes * 1 for the actual comparison. 70ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes */ 71ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#define BPF_LOAD_ARG_LEN 1U 72ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#define BPF_COMP_LEN 1U 73fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define BPF_ARG_COMP_LEN (BPF_LOAD_ARG_LEN + BPF_COMP_LEN) 74fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 75fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define bpf_comp_jeq bpf_comp_jeq32 76ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#define bpf_comp_jset bpf_comp_jset32 77fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 78fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define LO_ARG(idx) offsetof(struct seccomp_data, args[(idx)]) 79fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 80ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#elif defined(BITS64) 81ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes/* 82ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes * On 64 bits, comparisons take 7 instructions: 4 for loading the argument, 83ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes * and 3 for the actual comparison. 84ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes */ 85ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#define BPF_LOAD_ARG_LEN 4U 86ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#define BPF_COMP_LEN 3U 87fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define BPF_ARG_COMP_LEN (BPF_LOAD_ARG_LEN + BPF_COMP_LEN) 88fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 89fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define bpf_comp_jeq bpf_comp_jeq64 90ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#define bpf_comp_jset bpf_comp_jset64 91fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 92fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* Ensure that we load the logically correct offset. */ 9368db15cc2ea5b8314b4c8f7f3920423aeb5e25ebSamuel Tan#if defined(__LITTLE_ENDIAN__) || __BYTE_ORDER == __LITTLE_ENDIAN 94fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define LO_ARG(idx) offsetof(struct seccomp_data, args[(idx)]) 95fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define HI_ARG(idx) offsetof(struct seccomp_data, args[(idx)]) + sizeof(__u32) 96fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#else 97a21c8fc135523df5bbd4523b36096dff6e8ade4aJorge Lucangeli Obes#error "Unsupported endianness" 98fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#endif 99fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 100ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#else 101ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes#error "Unknown bit width" 102ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes 103fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#endif 104fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 105fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* Common jump targets. */ 106fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define NEXT 0 107fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SKIP 1 108fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define SKIPN(_n) (_n) 109fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 110fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* Support for labels in BPF programs. */ 111fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define JUMP_JT 0xff 112fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define JUMP_JF 0xff 113fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define LABEL_JT 0xfe 114fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define LABEL_JF 0xfe 115fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 116fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define MAX_BPF_LABEL_LEN 32 117fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 1188cc9d4adccb73c0ece2baf52bcce757628a6bc52Jorge Lucangeli Obes#define BPF_LABELS_MAX 512U /* Each syscall could have an argument block. */ 119fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesstruct bpf_labels { 1208cc9d4adccb73c0ece2baf52bcce757628a6bc52Jorge Lucangeli Obes size_t count; 121fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes struct __bpf_label { 122fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes const char *label; 123fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes unsigned int location; 124fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes } labels[BPF_LABELS_MAX]; 125fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes}; 126fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 127fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* BPF instruction manipulation functions and macros. */ 12802d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiangstatic inline size_t set_bpf_instr(struct sock_filter *instr, 129a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes unsigned short code, unsigned int k, 130a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes unsigned char jt, unsigned char jf) 13102d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang{ 13202d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang instr->code = code; 13302d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang instr->k = k; 13402d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang instr->jt = jt; 13502d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang instr->jf = jf; 13602d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang return 1U; 13702d0654f088b5de57f49f85c5ec064e6e581c6fcYunlian Jiang} 138fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 139fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_stmt(_block, _code, _k) \ 140fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_instr((_block), (_code), (_k), 0, 0) 141fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 142fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_jump(_block, _code, _k, _jt, _jf) \ 143fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_instr((_block), (_code), (_k), (_jt), (_jf)) 144fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 145fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_lbl(_block, _lbl_id) \ 146fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_jump((_block), BPF_JMP+BPF_JA, (_lbl_id), \ 147fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes LABEL_JT, LABEL_JF) 148fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 149fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_jump_lbl(_block, _lbl_id) \ 150fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_jump((_block), BPF_JMP+BPF_JA, (_lbl_id), \ 151fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes JUMP_JT, JUMP_JF) 152fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 153fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_ret_kill(_block) \ 154fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_stmt((_block), BPF_RET+BPF_K, SECCOMP_RET_KILL) 155fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 156bda833cbcee330eab91561a9b50b6bc24c47f2e9Jorge Lucangeli Obes#define set_bpf_ret_trap(_block) \ 157bda833cbcee330eab91561a9b50b6bc24c47f2e9Jorge Lucangeli Obes set_bpf_stmt((_block), BPF_RET+BPF_K, SECCOMP_RET_TRAP) 158bda833cbcee330eab91561a9b50b6bc24c47f2e9Jorge Lucangeli Obes 159fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_ret_errno(_block, _errno) \ 160fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_stmt((_block), BPF_RET+BPF_K, \ 161fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes SECCOMP_RET_ERRNO | ((_errno) & SECCOMP_RET_DATA)) 162fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 163fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes#define set_bpf_ret_allow(_block) \ 164fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes set_bpf_stmt((_block), BPF_RET+BPF_K, SECCOMP_RET_ALLOW) 165fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 166d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes#define bpf_load_syscall_nr(_filter) \ 167d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes set_bpf_stmt((_filter), BPF_LD+BPF_W+BPF_ABS, syscall_nr) 168d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes 169fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* BPF label functions. */ 170fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesint bpf_resolve_jumps(struct bpf_labels *labels, 171fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes struct sock_filter *filter, size_t count); 172fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesint bpf_label_id(struct bpf_labels *labels, const char *label); 173fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesvoid free_label_strings(struct bpf_labels *labels); 174fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 175fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* BPF helper functions. */ 176fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obessize_t bpf_load_arg(struct sock_filter *filter, int argidx); 177fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obessize_t bpf_comp_jeq(struct sock_filter *filter, unsigned long c, 178fd6f8e31caec28bdd127eb97e2c2111cfcbac447Jorge Lucangeli Obes unsigned char jt, unsigned char jf); 179ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obessize_t bpf_comp_jset(struct sock_filter *filter, unsigned long mask, 180fd6f8e31caec28bdd127eb97e2c2111cfcbac447Jorge Lucangeli Obes unsigned char jt, unsigned char jf); 181fd6f8e31caec28bdd127eb97e2c2111cfcbac447Jorge Lucangeli Obessize_t bpf_comp_jin(struct sock_filter *filter, unsigned long mask, 182fd6f8e31caec28bdd127eb97e2c2111cfcbac447Jorge Lucangeli Obes unsigned char jt, unsigned char jf); 183fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 184fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes/* Functions called by syscall_filter.c */ 185d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes#define ARCH_VALIDATION_LEN 3U 186d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes#define ALLOW_SYSCALL_LEN 2U 187d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes 188fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obessize_t bpf_arg_comp(struct sock_filter **pfilter, 189fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes int op, int argidx, unsigned long c, unsigned int label_id); 190d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obessize_t bpf_validate_arch(struct sock_filter *filter); 191d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obessize_t bpf_allow_syscall(struct sock_filter *filter, int nr); 192d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obessize_t bpf_allow_syscall_args(struct sock_filter *filter, 193d4467260de60d23ca7d2d506517caf71ef90984dJorge Lucangeli Obes int nr, unsigned int id); 194fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 195ffec8919585a3a30e9f8a3551e85cf06fc62cd8aJorge Lucangeli Obes/* Debug functions. */ 196fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesvoid dump_bpf_prog(struct sock_fprog *fprog); 197fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obesvoid dump_bpf_filter(struct sock_filter *filter, unsigned short len); 198fc8ab53c3ee4697b907a35ac54f26fb9477f6e7cJorge Lucangeli Obes 199a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes#ifdef __cplusplus 200a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes}; /* extern "C" */ 201a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes#endif 202a67bd6a31668498f3e21af49f64950ef78645515Jorge Lucangeli Obes 203224e4275abc940fa96d8cf8eec69a052957aa7e1Jorge Lucangeli Obes#endif /* BPF_H */ 204