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