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