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