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