linux/include/linux/filter.h
<<
>>
Prefs
   1/*
   2 * Linux Socket Filter Data Structures
   3 */
   4
   5#ifndef __LINUX_FILTER_H__
   6#define __LINUX_FILTER_H__
   7
   8#include <linux/compiler.h>
   9#include <linux/types.h>
  10
  11#ifdef __KERNEL__
  12#include <asm/atomic.h>
  13#endif
  14
  15/*
  16 * Current version of the filter code architecture.
  17 */
  18#define BPF_MAJOR_VERSION 1
  19#define BPF_MINOR_VERSION 1
  20
  21/*
  22 *      Try and keep these values and structures similar to BSD, especially
  23 *      the BPF code definitions which need to match so you can share filters
  24 */
  25 
  26struct sock_filter      /* Filter block */
  27{
  28        __u16   code;   /* Actual filter code */
  29        __u8    jt;     /* Jump true */
  30        __u8    jf;     /* Jump false */
  31        __u32   k;      /* Generic multiuse field */
  32};
  33
  34struct sock_fprog       /* Required for SO_ATTACH_FILTER. */
  35{
  36        unsigned short          len;    /* Number of filter blocks */
  37        struct sock_filter __user *filter;
  38};
  39
  40/*
  41 * Instruction classes
  42 */
  43
  44#define BPF_CLASS(code) ((code) & 0x07)
  45#define         BPF_LD          0x00
  46#define         BPF_LDX         0x01
  47#define         BPF_ST          0x02
  48#define         BPF_STX         0x03
  49#define         BPF_ALU         0x04
  50#define         BPF_JMP         0x05
  51#define         BPF_RET         0x06
  52#define         BPF_MISC        0x07
  53
  54/* ld/ldx fields */
  55#define BPF_SIZE(code)  ((code) & 0x18)
  56#define         BPF_W           0x00
  57#define         BPF_H           0x08
  58#define         BPF_B           0x10
  59#define BPF_MODE(code)  ((code) & 0xe0)
  60#define         BPF_IMM         0x00
  61#define         BPF_ABS         0x20
  62#define         BPF_IND         0x40
  63#define         BPF_MEM         0x60
  64#define         BPF_LEN         0x80
  65#define         BPF_MSH         0xa0
  66
  67/* alu/jmp fields */
  68#define BPF_OP(code)    ((code) & 0xf0)
  69#define         BPF_ADD         0x00
  70#define         BPF_SUB         0x10
  71#define         BPF_MUL         0x20
  72#define         BPF_DIV         0x30
  73#define         BPF_OR          0x40
  74#define         BPF_AND         0x50
  75#define         BPF_LSH         0x60
  76#define         BPF_RSH         0x70
  77#define         BPF_NEG         0x80
  78#define         BPF_JA          0x00
  79#define         BPF_JEQ         0x10
  80#define         BPF_JGT         0x20
  81#define         BPF_JGE         0x30
  82#define         BPF_JSET        0x40
  83#define BPF_SRC(code)   ((code) & 0x08)
  84#define         BPF_K           0x00
  85#define         BPF_X           0x08
  86
  87/* ret - BPF_K and BPF_X also apply */
  88#define BPF_RVAL(code)  ((code) & 0x18)
  89#define         BPF_A           0x10
  90
  91/* misc */
  92#define BPF_MISCOP(code) ((code) & 0xf8)
  93#define         BPF_TAX         0x00
  94#define         BPF_TXA         0x80
  95
  96#ifndef BPF_MAXINSNS
  97#define BPF_MAXINSNS 4096
  98#endif
  99
 100/*
 101 * Macros for filter block array initializers.
 102 */
 103#ifndef BPF_STMT
 104#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k }
 105#endif
 106#ifndef BPF_JUMP
 107#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k }
 108#endif
 109
 110/*
 111 * Number of scratch memory words for: BPF_ST and BPF_STX
 112 */
 113#define BPF_MEMWORDS 16
 114
 115/* RATIONALE. Negative offsets are invalid in BPF.
 116   We use them to reference ancillary data.
 117   Unlike introduction new instructions, it does not break
 118   existing compilers/optimizers.
 119 */
 120#define SKF_AD_OFF    (-0x1000)
 121#define SKF_AD_PROTOCOL 0
 122#define SKF_AD_PKTTYPE  4
 123#define SKF_AD_IFINDEX  8
 124#define SKF_AD_NLATTR   12
 125#define SKF_AD_NLATTR_NEST      16
 126#define SKF_AD_MAX      20
 127#define SKF_NET_OFF   (-0x100000)
 128#define SKF_LL_OFF    (-0x200000)
 129
 130#ifdef __KERNEL__
 131struct sk_filter
 132{
 133        atomic_t                refcnt;
 134        unsigned int            len;    /* Number of filter blocks */
 135        struct rcu_head         rcu;
 136        struct sock_filter      insns[0];
 137};
 138
 139static inline unsigned int sk_filter_len(const struct sk_filter *fp)
 140{
 141        return fp->len * sizeof(struct sock_filter) + sizeof(*fp);
 142}
 143
 144struct sk_buff;
 145struct sock;
 146
 147extern int sk_filter(struct sock *sk, struct sk_buff *skb);
 148extern unsigned int sk_run_filter(struct sk_buff *skb,
 149                                  struct sock_filter *filter, int flen);
 150extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
 151extern int sk_detach_filter(struct sock *sk);
 152extern int sk_chk_filter(struct sock_filter *filter, int flen);
 153#endif /* __KERNEL__ */
 154
 155#endif /* __LINUX_FILTER_H__ */
 156