#ifndef _NET_BPF_H_
#define _NET_BPF_H_
#define BPF_RELEASE 199606
typedef int32_t bpf_int32;
typedef u_int32_t bpf_u_int32;
#define BPF_ALIGNMENT sizeof(u_int32_t)
#define BPF_WORDALIGN(x) (((x) + (BPF_ALIGNMENT - 1)) & ~(BPF_ALIGNMENT - 1))
#define BPF_MAXINSNS 512
#define BPF_MAXBUFSIZE (2 * 1024 * 1024)
#define BPF_MINBUFSIZE 32
struct bpf_program {
u_int bf_len;
struct bpf_insn *bf_insns;
};
struct bpf_stat {
u_int bs_recv;
u_int bs_drop;
};
struct bpf_version {
u_short bv_major;
u_short bv_minor;
};
#define BPF_MAJOR_VERSION 1
#define BPF_MINOR_VERSION 1
#define BIOCGBLEN _IOR('B',102, u_int)
#define BIOCSBLEN _IOWR('B',102, u_int)
#define BIOCSETF _IOW('B',103, struct bpf_program)
#define BIOCFLUSH _IO('B',104)
#define BIOCPROMISC _IO('B',105)
#define BIOCGDLT _IOR('B',106, u_int)
#define BIOCGETIF _IOR('B',107, struct ifreq)
#define BIOCSETIF _IOW('B',108, struct ifreq)
#define BIOCSRTIMEOUT _IOW('B',109, struct timeval)
#define BIOCGRTIMEOUT _IOR('B',110, struct timeval)
#define BIOCGSTATS _IOR('B',111, struct bpf_stat)
#define BIOCIMMEDIATE _IOW('B',112, u_int)
#define BIOCVERSION _IOR('B',113, struct bpf_version)
#define BIOCSRSIG _IOW('B',114, u_int)
#define BIOCGRSIG _IOR('B',115, u_int)
#define BIOCGHDRCMPLT _IOR('B',116, u_int)
#define BIOCSHDRCMPLT _IOW('B',117, u_int)
#define BIOCLOCK _IO('B',118)
#define BIOCSETWF _IOW('B',119, struct bpf_program)
#define BIOCGFILDROP _IOR('B',120, u_int)
#define BIOCSFILDROP _IOW('B',121, u_int)
#define BIOCSDLT _IOW('B',122, u_int)
#define BIOCGDLTLIST _IOWR('B',123, struct bpf_dltlist)
#define BIOCGDIRFILT _IOR('B',124, u_int)
#define BIOCSDIRFILT _IOW('B',125, u_int)
#define BIOCSWTIMEOUT _IOW('B',126, struct timeval)
#define BIOCGWTIMEOUT _IOR('B',126, struct timeval)
#define BIOCDWTIMEOUT _IO('B',126)
#define BIOCSETFNR _IOW('B',127, struct bpf_program)
#define BPF_DIRECTION_IN (1 << 0)
#define BPF_DIRECTION_OUT (1 << 1)
#define BPF_FILDROP_PASS 0
#define BPF_FILDROP_CAPTURE 1
#define BPF_FILDROP_DROP 2
struct bpf_timeval {
u_int32_t tv_sec;
u_int32_t tv_usec;
};
struct bpf_hdr {
struct bpf_timeval bh_tstamp;
u_int32_t bh_caplen;
u_int32_t bh_datalen;
u_int16_t bh_hdrlen;
u_int16_t bh_ifidx;
u_int16_t bh_flowid;
u_int8_t bh_flags;
#define BPF_F_PRI_MASK 0x07
#define BPF_F_FLOWID 0x08
#define BPF_F_DIR_SHIFT 4
#define BPF_F_DIR_MASK (0x3 << BPF_F_DIR_SHIFT)
#define BPF_F_DIR_IN (BPF_DIRECTION_IN << BPF_F_DIR_SHIFT)
#define BPF_F_DIR_OUT (BPF_DIRECTION_OUT << BPF_F_DIR_SHIFT)
u_int8_t bh_drops;
u_int16_t bh_csumflags;
};
#ifdef _KERNEL
#define SIZEOF_BPF_HDR sizeof(struct bpf_hdr)
#endif
#define DLT_NULL 0
#define DLT_EN10MB 1
#define DLT_EN3MB 2
#define DLT_AX25 3
#define DLT_PRONET 4
#define DLT_CHAOS 5
#define DLT_IEEE802 6
#define DLT_ARCNET 7
#define DLT_SLIP 8
#define DLT_PPP 9
#define DLT_FDDI 10
#define DLT_ATM_RFC1483 11
#define DLT_LOOP 12
#define DLT_ENC 13
#define DLT_RAW 14
#define DLT_SLIP_BSDOS 15
#define DLT_PPP_BSDOS 16
#define DLT_PFSYNC 18
#define DLT_PPP_SERIAL 50
#define DLT_PPP_ETHER 51
#define DLT_C_HDLC 104
#define DLT_IEEE802_11 105
#define DLT_PFLOG 117
#define DLT_IEEE802_11_RADIO 127
#define DLT_USER0 147
#define DLT_USER1 148
#define DLT_USER2 149
#define DLT_USER3 150
#define DLT_USER4 151
#define DLT_USER5 152
#define DLT_USER6 153
#define DLT_USER7 154
#define DLT_USER8 155
#define DLT_USER9 156
#define DLT_USER10 157
#define DLT_USER11 158
#define DLT_USER12 159
#define DLT_USER13 160
#define DLT_USER14 161
#define DLT_USER15 162
#define DLT_USBPCAP 249
#define DLT_MPLS 219
#define DLT_OPENFLOW 267
#define BPF_CLASS(code) ((code) & 0x07)
#define BPF_LD 0x00
#define BPF_LDX 0x01
#define BPF_ST 0x02
#define BPF_STX 0x03
#define BPF_ALU 0x04
#define BPF_JMP 0x05
#define BPF_RET 0x06
#define BPF_MISC 0x07
#define BPF_SIZE(code) ((code) & 0x18)
#define BPF_W 0x00
#define BPF_H 0x08
#define BPF_B 0x10
#define BPF_MODE(code) ((code) & 0xe0)
#define BPF_IMM 0x00
#define BPF_ABS 0x20
#define BPF_IND 0x40
#define BPF_MEM 0x60
#define BPF_LEN 0x80
#define BPF_MSH 0xa0
#define BPF_RND 0xc0
#define BPF_OP(code) ((code) & 0xf0)
#define BPF_ADD 0x00
#define BPF_SUB 0x10
#define BPF_MUL 0x20
#define BPF_DIV 0x30
#define BPF_OR 0x40
#define BPF_AND 0x50
#define BPF_LSH 0x60
#define BPF_RSH 0x70
#define BPF_NEG 0x80
#define BPF_MOD 0x90
#define BPF_XOR 0xa0
#define BPF_JA 0x00
#define BPF_JEQ 0x10
#define BPF_JGT 0x20
#define BPF_JGE 0x30
#define BPF_JSET 0x40
#define BPF_SRC(code) ((code) & 0x08)
#define BPF_K 0x00
#define BPF_X 0x08
#define BPF_RVAL(code) ((code) & 0x18)
#define BPF_A 0x10
#define BPF_MISCOP(code) ((code) & 0xf8)
#define BPF_TAX 0x00
#define BPF_TXA 0x80
struct bpf_insn {
u_int16_t code;
u_char jt;
u_char jf;
u_int32_t k;
};
struct bpf_dltlist {
u_int bfl_len;
u_int *bfl_list;
};
struct bpf_ops {
u_int32_t (*ldw)(const void *, u_int32_t, int *);
u_int32_t (*ldh)(const void *, u_int32_t, int *);
u_int32_t (*ldb)(const void *, u_int32_t, int *);
};
#define BPF_STMT(code, k) { (u_int16_t)(code), 0, 0, k }
#define BPF_JUMP(code, k, jt, jf) { (u_int16_t)(code), jt, jf, k }
__BEGIN_DECLS
u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int)
__bounded((__buffer__, 2, 4));
u_int _bpf_filter(const struct bpf_insn *, const struct bpf_ops *,
const void *, u_int);
__END_DECLS
#ifdef _KERNEL
struct ifnet;
struct mbuf;
int bpf_validate(struct bpf_insn *, int);
int bpf_mtap(caddr_t, const struct mbuf *, u_int);
int bpf_mtap_hdr(caddr_t, const void *, u_int, const struct mbuf *, u_int);
int bpf_mtap_af(caddr_t, u_int32_t, const struct mbuf *, u_int);
int bpf_mtap_ether(caddr_t, const struct mbuf *, u_int);
int bpf_tap_hdr(caddr_t, const void *, u_int, const void *, u_int, u_int);
void bpfattach(caddr_t *, struct ifnet *, u_int, u_int);
void bpfdetach(struct ifnet *);
void *bpfsattach(caddr_t *, const char *, u_int, u_int);
void *bpfxattach(caddr_t *, const char *, struct ifnet *, u_int, u_int);
void bpfsdetach(void *);
void bpfilterattach(int);
u_int bpf_mfilter(const struct bpf_insn *, const struct mbuf *, u_int);
#endif
#define BPF_MEMWORDS 16
#endif