15cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* 25cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger * Linux Socket Filter Data Structures 35cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger */ 45cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 55cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#ifndef __LINUX_FILTER_H__ 65cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define __LINUX_FILTER_H__ 75cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 85cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 95cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#include <linux/types.h> 10dddfc7f67ee458d4b541be27c6fbdeb304223708Stephen Hemminger#include <linux/bpf_common.h> 115cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 125cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* 135cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger * Current version of the filter code architecture. 145cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger */ 155cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_MAJOR_VERSION 1 165cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_MINOR_VERSION 1 175cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 185cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* 195cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger * Try and keep these values and structures similar to BSD, especially 205cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger * the BPF code definitions which need to match so you can share filters 215cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger */ 225cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 235cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemmingerstruct sock_filter { /* Filter block */ 245cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger __u16 code; /* Actual filter code */ 255cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger __u8 jt; /* Jump true */ 265cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger __u8 jf; /* Jump false */ 275cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger __u32 k; /* Generic multiuse field */ 285cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger}; 295cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 305cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemmingerstruct sock_fprog { /* Required for SO_ATTACH_FILTER. */ 315cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger unsigned short len; /* Number of filter blocks */ 325cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger struct sock_filter *filter; 335cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger}; 345cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 355cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* ret - BPF_K and BPF_X also apply */ 365cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_RVAL(code) ((code) & 0x18) 375cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_A 0x10 385cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 395cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* misc */ 405cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_MISCOP(code) ((code) & 0xf8) 415cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_TAX 0x00 425cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_TXA 0x80 435cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 445cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* 455cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger * Macros for filter block array initializers. 465cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger */ 475cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#ifndef BPF_STMT 485cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } 495cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#endif 505cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#ifndef BPF_JUMP 515cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } 525cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#endif 535cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 545cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* 555cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger * Number of scratch memory words for: BPF_ST and BPF_STX 565cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger */ 575cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define BPF_MEMWORDS 16 585cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 595cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger/* RATIONALE. Negative offsets are invalid in BPF. 605cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger We use them to reference ancillary data. 615cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger Unlike introduction new instructions, it does not break 625cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger existing compilers/optimizers. 635cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger */ 645cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_OFF (-0x1000) 655cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_PROTOCOL 0 665cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_PKTTYPE 4 675cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_IFINDEX 8 685cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_NLATTR 12 695cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_NLATTR_NEST 16 705cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_MARK 20 715cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_QUEUE 24 725cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_HATYPE 28 735cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_RXHASH 32 745cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_CPU 36 755cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_ALU_XOR_X 40 765cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_VLAN_TAG 44 775cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_VLAN_TAG_PRESENT 48 785cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#define SKF_AD_PAY_OFFSET 52 79fd5c1d4391c79900fee667f53dea744ce11238e4Stephen Hemminger#define SKF_AD_RANDOM 56 80cbdc3ed88a955e22d3a4fe0a6ed03ac17e339042Stephen Hemminger#define SKF_AD_VLAN_TPID 60 81cbdc3ed88a955e22d3a4fe0a6ed03ac17e339042Stephen Hemminger#define SKF_AD_MAX 64 825cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 83aeedd8e1e788af86af0634d6799671b685a37ac6Stephen Hemminger#define SKF_NET_OFF (-0x100000) 84aeedd8e1e788af86af0634d6799671b685a37ac6Stephen Hemminger#define SKF_LL_OFF (-0x200000) 85aeedd8e1e788af86af0634d6799671b685a37ac6Stephen Hemminger 86aeedd8e1e788af86af0634d6799671b685a37ac6Stephen Hemminger#define BPF_NET_OFF SKF_NET_OFF 87aeedd8e1e788af86af0634d6799671b685a37ac6Stephen Hemminger#define BPF_LL_OFF SKF_LL_OFF 885cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger 895cf35d6ad72b9c23e0d9c307e2aecec161f2cd23Stephen Hemminger#endif /* __LINUX_FILTER_H__ */ 90