1/* 2 * Linux Socket Filter Data Structures 3 */ 4 5#ifndef __LINUX_FILTER_H__ 6#define __LINUX_FILTER_H__ 7 8 9#include <linux/types.h> 10 11 12/* 13 * Current version of the filter code architecture. 14 */ 15#define BPF_MAJOR_VERSION 1 16#define BPF_MINOR_VERSION 1 17 18/* 19 * Try and keep these values and structures similar to BSD, especially 20 * the BPF code definitions which need to match so you can share filters 21 */ 22 23struct sock_filter { /* Filter block */ 24 __u16 code; /* Actual filter code */ 25 __u8 jt; /* Jump true */ 26 __u8 jf; /* Jump false */ 27 __u32 k; /* Generic multiuse field */ 28}; 29 30struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ 31 unsigned short len; /* Number of filter blocks */ 32 struct sock_filter *filter; 33}; 34 35/* 36 * Instruction classes 37 */ 38 39#define BPF_CLASS(code) ((code) & 0x07) 40#define BPF_LD 0x00 41#define BPF_LDX 0x01 42#define BPF_ST 0x02 43#define BPF_STX 0x03 44#define BPF_ALU 0x04 45#define BPF_JMP 0x05 46#define BPF_RET 0x06 47#define BPF_MISC 0x07 48 49/* ld/ldx fields */ 50#define BPF_SIZE(code) ((code) & 0x18) 51#define BPF_W 0x00 52#define BPF_H 0x08 53#define BPF_B 0x10 54#define BPF_MODE(code) ((code) & 0xe0) 55#define BPF_IMM 0x00 56#define BPF_ABS 0x20 57#define BPF_IND 0x40 58#define BPF_MEM 0x60 59#define BPF_LEN 0x80 60#define BPF_MSH 0xa0 61 62/* alu/jmp fields */ 63#define BPF_OP(code) ((code) & 0xf0) 64#define BPF_ADD 0x00 65#define BPF_SUB 0x10 66#define BPF_MUL 0x20 67#define BPF_DIV 0x30 68#define BPF_OR 0x40 69#define BPF_AND 0x50 70#define BPF_LSH 0x60 71#define BPF_RSH 0x70 72#define BPF_NEG 0x80 73#define BPF_JA 0x00 74#define BPF_JEQ 0x10 75#define BPF_JGT 0x20 76#define BPF_JGE 0x30 77#define BPF_JSET 0x40 78#define BPF_SRC(code) ((code) & 0x08) 79#define BPF_K 0x00 80#define BPF_X 0x08 81 82/* ret - BPF_K and BPF_X also apply */ 83#define BPF_RVAL(code) ((code) & 0x18) 84#define BPF_A 0x10 85 86/* misc */ 87#define BPF_MISCOP(code) ((code) & 0xf8) 88#define BPF_TAX 0x00 89#define BPF_TXA 0x80 90 91enum { 92 BPF_S_RET_K = 0, 93 BPF_S_RET_A, 94 BPF_S_ALU_ADD_K, 95 BPF_S_ALU_ADD_X, 96 BPF_S_ALU_SUB_K, 97 BPF_S_ALU_SUB_X, 98 BPF_S_ALU_MUL_K, 99 BPF_S_ALU_MUL_X, 100 BPF_S_ALU_DIV_X, 101 BPF_S_ALU_AND_K, 102 BPF_S_ALU_AND_X, 103 BPF_S_ALU_OR_K, 104 BPF_S_ALU_OR_X, 105 BPF_S_ALU_LSH_K, 106 BPF_S_ALU_LSH_X, 107 BPF_S_ALU_RSH_K, 108 BPF_S_ALU_RSH_X, 109 BPF_S_ALU_NEG, 110 BPF_S_LD_W_ABS, 111 BPF_S_LD_H_ABS, 112 BPF_S_LD_B_ABS, 113 BPF_S_LD_W_LEN, 114 BPF_S_LD_W_IND, 115 BPF_S_LD_H_IND, 116 BPF_S_LD_B_IND, 117 BPF_S_LD_IMM, 118 BPF_S_LDX_W_LEN, 119 BPF_S_LDX_B_MSH, 120 BPF_S_LDX_IMM, 121 BPF_S_MISC_TAX, 122 BPF_S_MISC_TXA, 123 BPF_S_ALU_DIV_K, 124 BPF_S_LD_MEM, 125 BPF_S_LDX_MEM, 126 BPF_S_ST, 127 BPF_S_STX, 128 BPF_S_JMP_JA, 129 BPF_S_JMP_JEQ_K, 130 BPF_S_JMP_JEQ_X, 131 BPF_S_JMP_JGE_K, 132 BPF_S_JMP_JGE_X, 133 BPF_S_JMP_JGT_K, 134 BPF_S_JMP_JGT_X, 135 BPF_S_JMP_JSET_K, 136 BPF_S_JMP_JSET_X, 137}; 138 139#ifndef BPF_MAXINSNS 140#define BPF_MAXINSNS 4096 141#endif 142 143/* 144 * Macros for filter block array initializers. 145 */ 146#ifndef BPF_STMT 147#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } 148#endif 149#ifndef BPF_JUMP 150#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } 151#endif 152 153/* 154 * Number of scratch memory words for: BPF_ST and BPF_STX 155 */ 156#define BPF_MEMWORDS 16 157 158/* RATIONALE. Negative offsets are invalid in BPF. 159 We use them to reference ancillary data. 160 Unlike introduction new instructions, it does not break 161 existing compilers/optimizers. 162 */ 163#define SKF_AD_OFF (-0x1000) 164#define SKF_AD_PROTOCOL 0 165#define SKF_AD_PKTTYPE 4 166#define SKF_AD_IFINDEX 8 167#define SKF_AD_NLATTR 12 168#define SKF_AD_NLATTR_NEST 16 169#define SKF_AD_MARK 20 170#define SKF_AD_QUEUE 24 171#define SKF_AD_HATYPE 28 172#define SKF_AD_MAX 32 173#define SKF_NET_OFF (-0x100000) 174#define SKF_LL_OFF (-0x200000) 175 176 177#endif /* __LINUX_FILTER_H__ */ 178