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