1978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt/* This file was manually copied from the Linux kernel source
2978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt * and manually stripped from __KERNEL__ sections and unused functions.
3978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt */
4978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt
540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy/*
640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy * Definitions and Declarations for tuple.
740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy *
840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy * 16 Dec 2003: Yasuyuki Kozakai @USAGI <yasuyuki.kozakai@toshiba.co.jp>
940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy *	- generalize L3 protocol dependent part.
1040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy *
1140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy * Derived from include/linux/netfiter_ipv4/ip_conntrack_tuple.h
1240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy */
1340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
1440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy#ifndef _NF_CONNTRACK_TUPLE_H
1540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy#define _NF_CONNTRACK_TUPLE_H
1640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
17978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt#include <linux/netfilter/x_tables.h>
1840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy#include <linux/netfilter/nf_conntrack_tuple_common.h>
1940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
2040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy/* A `tuple' is a structure containing the information to uniquely
2140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy  identify a connection.  ie. if two packets have the same tuple, they
2240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy  are in the same connection; if not, they are not.
2340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
2440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy  We divide the structure along "manipulatable" and
2540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy  "non-manipulatable" lines, for the benefit of the NAT code.
2640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy*/
2740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
28978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt#define NF_CT_TUPLE_L3SIZE	ARRAY_SIZE(((union nf_inet_addr *)NULL)->all)
2940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
3040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy/* The protocol-specific manipulable parts of the tuple: always in
3140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy   network order! */
3240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardyunion nf_conntrack_man_proto
3340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy{
3440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	/* Add other protocols here. */
35978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt	__be16 all;
3640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
3740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct {
3840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		__be16 port;
3940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	} tcp;
4040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct {
4140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		__be16 port;
4240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	} udp;
4340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct {
4440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		__be16 id;
4540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	} icmp;
4640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct {
4740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		__be16 port;
48978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt	} dccp;
49978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt	struct {
50978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt		__be16 port;
5140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	} sctp;
5240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct {
5340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		__be16 key;	/* GRE key is 32bit, PPtP only uses 16bit */
5440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	} gre;
5540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy};
5640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
5740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy/* The manipulable part of the tuple. */
5840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardystruct nf_conntrack_man
5940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy{
60978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt	union nf_inet_addr u3;
6140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	union nf_conntrack_man_proto u;
6240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	/* Layer 3 protocol */
6340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	u_int16_t l3num;
6440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy};
6540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
6640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy/* This contains the information to distinguish a connection. */
6740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardystruct nf_conntrack_tuple
6840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy{
6940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct nf_conntrack_man src;
7040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
7140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	/* These are the parts of the tuple which are fixed. */
7240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	struct {
73978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt		union nf_inet_addr u3;
7440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		union {
7540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			/* Add other protocols here. */
76978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt			__be16 all;
7740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
7840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			struct {
7940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy				__be16 port;
8040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			} tcp;
8140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			struct {
8240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy				__be16 port;
8340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			} udp;
8440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			struct {
8540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy				u_int8_t type, code;
8640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			} icmp;
8740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			struct {
8840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy				__be16 port;
89978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt			} dccp;
90978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt			struct {
91978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt				__be16 port;
9240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			} sctp;
9340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			struct {
9440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy				__be16 key;
9540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy			} gre;
9640d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		} u;
9740d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
9840d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		/* The protocol. */
9940d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		u_int8_t protonum;
10040d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
10140d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		/* The direction (for tuplehash) */
10240d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy		u_int8_t dir;
10340d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy	} dst;
10440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy};
10540d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy
106978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardtstruct nf_conntrack_tuple_mask
107978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt{
108978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt	struct {
109978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt		union nf_inet_addr u3;
110978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt		union nf_conntrack_man_proto u;
111978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt	} src;
112978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt};
113978e27e8f8c2e49d0528c6c4ae3a56627fbe8492Jan Engelhardt
11440d54756cd8a2705e22b36f7aef03bb2c472a10bPatrick McHardy#endif /* _NF_CONNTRACK_TUPLE_H */
115