1*5706f5deSalnsn /* $NetBSD: bpfjit.h,v 1.4 2014/06/25 19:32:37 alnsn Exp $ */ 2e8c0d6c6Salnsn 3e8c0d6c6Salnsn /*- 4*5706f5deSalnsn * Copyright (c) 2011-2014 Alexander Nasonov. 5e8c0d6c6Salnsn * All rights reserved. 6e8c0d6c6Salnsn * 7e8c0d6c6Salnsn * Redistribution and use in source and binary forms, with or without 8e8c0d6c6Salnsn * modification, are permitted provided that the following conditions 9e8c0d6c6Salnsn * are met: 10e8c0d6c6Salnsn * 11e8c0d6c6Salnsn * 1. Redistributions of source code must retain the above copyright 12e8c0d6c6Salnsn * notice, this list of conditions and the following disclaimer. 13e8c0d6c6Salnsn * 2. Redistributions in binary form must reproduce the above copyright 14e8c0d6c6Salnsn * notice, this list of conditions and the following disclaimer in 15e8c0d6c6Salnsn * the documentation and/or other materials provided with the 16e8c0d6c6Salnsn * distribution. 17e8c0d6c6Salnsn * 18e8c0d6c6Salnsn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e8c0d6c6Salnsn * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e8c0d6c6Salnsn * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21e8c0d6c6Salnsn * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22e8c0d6c6Salnsn * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23e8c0d6c6Salnsn * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 24e8c0d6c6Salnsn * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25e8c0d6c6Salnsn * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26e8c0d6c6Salnsn * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27e8c0d6c6Salnsn * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28e8c0d6c6Salnsn * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29e8c0d6c6Salnsn * SUCH DAMAGE. 30e8c0d6c6Salnsn */ 31e8c0d6c6Salnsn 32e8c0d6c6Salnsn #ifndef _NET_BPFJIT_H_ 33e8c0d6c6Salnsn #define _NET_BPFJIT_H_ 34e8c0d6c6Salnsn 35e8c0d6c6Salnsn #ifndef _KERNEL 36e8c0d6c6Salnsn #include <stddef.h> 37e8c0d6c6Salnsn #include <stdint.h> 38e8c0d6c6Salnsn #endif 39e8c0d6c6Salnsn 40e8c0d6c6Salnsn #include <sys/types.h> 41e8c0d6c6Salnsn 42e8c0d6c6Salnsn #ifdef __linux 43e8c0d6c6Salnsn #include <pcap-bpf.h> 44e8c0d6c6Salnsn #else 45e8c0d6c6Salnsn #include <net/bpf.h> 46e8c0d6c6Salnsn #endif 47e8c0d6c6Salnsn 48e8c0d6c6Salnsn /* 4919fed70dSalnsn * Return value of a function generated by sljit have sljit_uw type 5019fed70dSalnsn * which can have a greater width. In such cases, we rely on the fact 5119fed70dSalnsn * that calling conventions use same registers for smaller types. 52e8c0d6c6Salnsn * SLJIT_MOV_UI is passed to sljit_emit_return() to make sure that the 53e8c0d6c6Salnsn * return value is truncated to unsigned int. 54e8c0d6c6Salnsn */ 5519fed70dSalnsn typedef unsigned int (*bpfjit_func_t)(const bpf_ctx_t *, bpf_args_t *); 56e8c0d6c6Salnsn 5719fed70dSalnsn bpfjit_func_t bpfjit_generate_code(const bpf_ctx_t *, 5819fed70dSalnsn const struct bpf_insn *, size_t); 59d0748eb9Srmind void bpfjit_free_code(bpfjit_func_t); 60e8c0d6c6Salnsn 61e8c0d6c6Salnsn #ifdef _KERNEL 62d0748eb9Srmind struct bpfjit_ops { 6319fed70dSalnsn bpfjit_func_t (*bj_generate_code)(const bpf_ctx_t *, 6419fed70dSalnsn const struct bpf_insn *, size_t); 65d0748eb9Srmind void (*bj_free_code)(bpfjit_func_t); 66e8c0d6c6Salnsn }; 67e8c0d6c6Salnsn 68e8c0d6c6Salnsn extern struct bpfjit_ops bpfjit_module_ops; 69e8c0d6c6Salnsn #endif 70e8c0d6c6Salnsn 71e8c0d6c6Salnsn #endif /* !_NET_BPFJIT_H_ */ 72