1f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#ifndef _CONNTRACK_PROTO_GRE_H
2f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define _CONNTRACK_PROTO_GRE_H
3f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#include <asm/byteorder.h>
4f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
5f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* GRE PROTOCOL HEADER */
6f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
7f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* GRE Version field */
8f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_VERSION_1701	0x0
9f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_VERSION_PPTP	0x1
10f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
11f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* GRE Protocol field */
12f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_PROTOCOL_PPTP	0x880B
13f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
14f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* GRE Flags */
15f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_FLAG_C		0x80
16f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_FLAG_R		0x40
17f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_FLAG_K		0x20
18f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_FLAG_S		0x10
19f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_FLAG_A		0x80
20f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
21f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_IS_C(f)	((f)&GRE_FLAG_C)
22f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_IS_R(f)	((f)&GRE_FLAG_R)
23f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_IS_K(f)	((f)&GRE_FLAG_K)
24f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_IS_S(f)	((f)&GRE_FLAG_S)
25f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#define GRE_IS_A(f)	((f)&GRE_FLAG_A)
26f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
27f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* GRE is a mess: Four different standards */
28f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardystruct gre_hdr {
29f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#if defined(__LITTLE_ENDIAN_BITFIELD)
30f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__u16	rec:3,
31f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		srr:1,
32f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		seq:1,
33f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		key:1,
34f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		routing:1,
35f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		csum:1,
36f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		version:3,
37f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		reserved:4,
38f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		ack:1;
39f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#elif defined(__BIG_ENDIAN_BITFIELD)
40f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__u16	csum:1,
41f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		routing:1,
42f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		key:1,
43f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		seq:1,
44f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		srr:1,
45f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		rec:3,
46f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		ack:1,
47f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		reserved:4,
48f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy		version:3;
49f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#else
50f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#error "Adjust your <asm/byteorder.h> defines"
51f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#endif
52f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__be16	protocol;
53f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy};
54f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
55f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* modified GRE header for PPTP */
56f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardystruct gre_hdr_pptp {
57f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__u8   flags;		/* bitfield */
58f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__u8   version;		/* should be GRE_VERSION_PPTP */
59f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__be16 protocol;	/* should be GRE_PROTOCOL_PPTP */
60f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__be16 payload_len;	/* size of ppp payload, not inc. gre header */
61f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__be16 call_id;		/* peer's call_id for this session */
62f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	__be32 seq;		/* sequence number.  Present if S==1 */
6325985edcedea6396277003854657b5f3cb31a628Lucas De Marchi	__be32 ack;		/* seq number of highest packet received by */
64f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy				/*  sender in this session */
65f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy};
66f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
67f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardystruct nf_ct_gre {
68f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	unsigned int stream_timeout;
69f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	unsigned int timeout;
70f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy};
71f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
72f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#ifdef __KERNEL__
73f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#include <net/netfilter/nf_conntrack_tuple.h>
74f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
75f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardystruct nf_conn;
76f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
77f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* structure for original <-> reply keymap */
78f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardystruct nf_ct_gre_keymap {
79f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	struct list_head list;
80f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy	struct nf_conntrack_tuple tuple;
81f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy};
82f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
83f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* add new tuple->key_reply pair to keymap */
84f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardyint nf_ct_gre_keymap_add(struct nf_conn *ct, enum ip_conntrack_dir dir,
85f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy			 struct nf_conntrack_tuple *t);
86f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
87f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy/* delete keymap entries */
88f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardyvoid nf_ct_gre_keymap_destroy(struct nf_conn *ct);
89f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
903bb0d1c00f86b13bb184193a8f0189ddd6f0459fAlexey Dobriyanextern void nf_ct_gre_keymap_flush(struct net *net);
91f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardyextern void nf_nat_need_gre(void);
92f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy
93f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#endif /* __KERNEL__ */
94f09943fefe6b702e40893d35b4f10fd1064037fePatrick McHardy#endif /* _CONNTRACK_PROTO_GRE_H */
95