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