ip_queue.h revision a624e0a1b2d075253b599ababd4ea1351ef42b2a
1/*
2 * This is a module which is used for queueing IPv4 packets and
3 * communicating with userspace via netlink.
4 *
5 * (C) 2000 James Morris, this code is GPL.
6 */
7#ifndef _IP_QUEUE_H
8#define _IP_QUEUE_H
9
10#ifdef __KERNEL__
11#ifdef DEBUG_IPQ
12#define QDEBUG(x...) printk(KERN_DEBUG ## x)
13#else
14#define QDEBUG(x...)
15#endif  /* DEBUG_IPQ */
16#else
17#include <net/if.h>
18#endif	/* ! __KERNEL__ */
19
20/* Messages sent from kernel */
21typedef struct ipq_packet_msg {
22	unsigned long packet_id;	/* ID of queued packet */
23	unsigned long mark;		/* Netfilter mark value */
24	long timestamp_sec;		/* Packet arrival time (seconds) */
25	long timestamp_usec;		/* Packet arrvial time (+useconds) */
26	unsigned int hook;		/* Netfilter hook we rode in on */
27	char indev_name[IFNAMSIZ];	/* Name of incoming interface */
28	char outdev_name[IFNAMSIZ];	/* Name of outgoing interface */
29	__be16 hw_protocol;		/* Hardware protocol (network order) */
30	unsigned short hw_type;		/* Hardware type */
31	unsigned char hw_addrlen;	/* Hardware address length */
32	unsigned char hw_addr[8];	/* Hardware address */
33	size_t data_len;		/* Length of packet data */
34	unsigned char payload[0];	/* Optional packet data */
35} ipq_packet_msg_t;
36
37/* Messages sent from userspace */
38typedef struct ipq_mode_msg {
39	unsigned char value;		/* Requested mode */
40	size_t range;			/* Optional range of packet requested */
41} ipq_mode_msg_t;
42
43typedef struct ipq_verdict_msg {
44	unsigned int value;		/* Verdict to hand to netfilter */
45	unsigned long id;		/* Packet ID for this verdict */
46	size_t data_len;		/* Length of replacement data */
47	unsigned char payload[0];	/* Optional replacement packet */
48} ipq_verdict_msg_t;
49
50typedef struct ipq_peer_msg {
51	union {
52		ipq_verdict_msg_t verdict;
53		ipq_mode_msg_t mode;
54	} msg;
55} ipq_peer_msg_t;
56
57/* Packet delivery modes */
58enum {
59	IPQ_COPY_NONE,		/* Initial mode, packets are dropped */
60	IPQ_COPY_META,		/* Copy metadata */
61	IPQ_COPY_PACKET		/* Copy metadata + packet (range) */
62};
63#define IPQ_COPY_MAX IPQ_COPY_PACKET
64
65/* Types of messages */
66#define IPQM_BASE	0x10	/* standard netlink messages below this */
67#define IPQM_MODE	(IPQM_BASE + 1)		/* Mode request from peer */
68#define IPQM_VERDICT	(IPQM_BASE + 2)		/* Verdict from peer */
69#define IPQM_PACKET	(IPQM_BASE + 3)		/* Packet from kernel */
70#define IPQM_MAX	(IPQM_BASE + 4)
71
72#endif /*_IP_QUEUE_H*/
73