summaryrefslogtreecommitdiff
path: root/include/linux/netfilter_ipv4/ip_conntrack_pptp.h
blob: 389e3851d52f078cdaa5cc8a1d3048b24564969b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
/* PPTP constants and structs */
#ifndef _CONNTRACK_PPTP_H
#define _CONNTRACK_PPTP_H

/* state of the control session */
enum pptp_ctrlsess_state {
	PPTP_SESSION_NONE,			/* no session present */
	PPTP_SESSION_ERROR,			/* some session error */
	PPTP_SESSION_STOPREQ,			/* stop_sess request seen */
	PPTP_SESSION_REQUESTED,			/* start_sess request seen */
	PPTP_SESSION_CONFIRMED,			/* session established */
};

/* state of the call inside the control session */
enum pptp_ctrlcall_state {
	PPTP_CALL_NONE,
	PPTP_CALL_ERROR,
	PPTP_CALL_OUT_REQ,
	PPTP_CALL_OUT_CONF,
	PPTP_CALL_IN_REQ,
	PPTP_CALL_IN_REP,
	PPTP_CALL_IN_CONF,
	PPTP_CALL_CLEAR_REQ,
};


/* conntrack private data */
struct ip_ct_pptp_master {
	enum pptp_ctrlsess_state sstate;	/* session state */

	/* everything below is going to be per-expectation in newnat,
	 * since there could be more than one call within one session */
	enum pptp_ctrlcall_state cstate;	/* call state */
	u_int16_t pac_call_id;			/* call id of PAC, host byte order */
	u_int16_t pns_call_id;			/* call id of PNS, host byte order */

	/* in pre-2.6.11 this used to be per-expect. Now it is per-conntrack
	 * and therefore imposes a fixed limit on the number of maps */
	struct ip_ct_gre_keymap *keymap_orig, *keymap_reply;
};

/* conntrack_expect private member */
struct ip_ct_pptp_expect {
	enum pptp_ctrlcall_state cstate; 	/* call state */
	u_int16_t pac_call_id;			/* call id of PAC */
	u_int16_t pns_call_id;			/* call id of PNS */
};


#ifdef __KERNEL__

#define IP_CONNTR_PPTP		PPTP_CONTROL_PORT

#define PPTP_CONTROL_PORT	1723

#define PPTP_PACKET_CONTROL	1
#define PPTP_PACKET_MGMT	2

#define PPTP_MAGIC_COOKIE	0x1a2b3c4d

struct pptp_pkt_hdr {
	__u16	packetLength;
	__u16	packetType;
	__u32	magicCookie;
};

/* PptpControlMessageType values */
#define PPTP_START_SESSION_REQUEST	1
#define PPTP_START_SESSION_REPLY	2
#define PPTP_STOP_SESSION_REQUEST	3
#define PPTP_STOP_SESSION_REPLY		4
#define PPTP_ECHO_REQUEST		5
#define PPTP_ECHO_REPLY			6
#define PPTP_OUT_CALL_REQUEST		7
#define PPTP_OUT_CALL_REPLY		8
#define PPTP_IN_CALL_REQUEST		9
#define PPTP_IN_CALL_REPLY		10
#define PPTP_IN_CALL_CONNECT		11
#define PPTP_CALL_CLEAR_REQUEST		12
#define PPTP_CALL_DISCONNECT_NOTIFY	13
#define PPTP_WAN_ERROR_NOTIFY		14
#define PPTP_SET_LINK_INFO		15

#define PPTP_MSG_MAX			15

/* PptpGeneralError values */
#define PPTP_ERROR_CODE_NONE		0
#define PPTP_NOT_CONNECTED		1
#define PPTP_BAD_FORMAT			2
#define PPTP_BAD_VALUE			3
#define PPTP_NO_RESOURCE		4
#define PPTP_BAD_CALLID			5
#define PPTP_REMOVE_DEVICE_ERROR	6

struct PptpControlHeader {
	__u16	messageType;
	__u16	reserved;
};

/* FramingCapability Bitmap Values */
#define PPTP_FRAME_CAP_ASYNC		0x1
#define PPTP_FRAME_CAP_SYNC		0x2

/* BearerCapability Bitmap Values */
#define PPTP_BEARER_CAP_ANALOG		0x1
#define PPTP_BEARER_CAP_DIGITAL		0x2

struct PptpStartSessionRequest {
	__u16	protocolVersion;
	__u8	reserved1;
	__u8	reserved2;
	__u32	framingCapability;
	__u32	bearerCapability;
	__u16	maxChannels;
	__u16	firmwareRevision;
	__u8	hostName[64];
	__u8	vendorString[64];
};

/* PptpStartSessionResultCode Values */
#define PPTP_START_OK			1
#define PPTP_START_GENERAL_ERROR	2
#define PPTP_START_ALREADY_CONNECTED	3
#define PPTP_START_NOT_AUTHORIZED	4
#define PPTP_START_UNKNOWN_PROTOCOL	5

struct PptpStartSessionReply {
	__u16	protocolVersion;
	__u8	resultCode;
	__u8	generalErrorCode;
	__u32	framingCapability;
	__u32	bearerCapability;
	__u16	maxChannels;
	__u16	firmwareRevision;
	__u8	hostName[64];
	__u8	vendorString[64];
};

/* PptpStopReasons */
#define PPTP_STOP_NONE			1
#define PPTP_STOP_PROTOCOL		2
#define PPTP_STOP_LOCAL_SHUTDOWN	3

struct PptpStopSessionRequest {
	__u8	reason;
};

/* PptpStopSessionResultCode */
#define PPTP_STOP_OK			1
#define PPTP_STOP_GENERAL_ERROR		2

struct PptpStopSessionReply {
	__u8	resultCode;
	__u8	generalErrorCode;
};

struct PptpEchoRequest {
	__u32 identNumber;
};

/* PptpEchoReplyResultCode */
#define PPTP_ECHO_OK			1
#define PPTP_ECHO_GENERAL_ERROR		2

struct PptpEchoReply {
	__u32	identNumber;
	__u8	resultCode;
	__u8	generalErrorCode;
	__u16	reserved;
};

/* PptpFramingType */
#define PPTP_ASYNC_FRAMING		1
#define PPTP_SYNC_FRAMING		2
#define PPTP_DONT_CARE_FRAMING		3

/* PptpCallBearerType */
#define PPTP_ANALOG_TYPE		1
#define PPTP_DIGITAL_TYPE		2
#define PPTP_DONT_CARE_BEARER_TYPE	3

struct PptpOutCallRequest {
	__u16	callID;
	__u16	callSerialNumber;
	__u32	minBPS;
	__u32	maxBPS;
	__u32	bearerType;
	__u32	framingType;
	__u16	packetWindow;
	__u16	packetProcDelay;
	__u16	reserved1;
	__u16	phoneNumberLength;
	__u16	reserved2;
	__u8	phoneNumber[64];
	__u8	subAddress[64];
};

/* PptpCallResultCode */
#define PPTP_OUTCALL_CONNECT		1
#define PPTP_OUTCALL_GENERAL_ERROR	2
#define PPTP_OUTCALL_NO_CARRIER		3
#define PPTP_OUTCALL_BUSY		4
#define PPTP_OUTCALL_NO_DIAL_TONE	5
#define PPTP_OUTCALL_TIMEOUT		6
#define PPTP_OUTCALL_DONT_ACCEPT	7

struct PptpOutCallReply {
	__u16	callID;
	__u16	peersCallID;
	__u8	resultCode;
	__u8	generalErrorCode;
	__u16	causeCode;
	__u32	connectSpeed;
	__u16	packetWindow;
	__u16	packetProcDelay;
	__u32	physChannelID;
};

struct PptpInCallRequest {
	__u16	callID;
	__u16	callSerialNumber;
	__u32	callBearerType;
	__u32	physChannelID;
	__u16	dialedNumberLength;
	__u16	dialingNumberLength;
	__u8	dialedNumber[64];
	__u8	dialingNumber[64];
	__u8	subAddress[64];
};

/* PptpInCallResultCode */
#define PPTP_INCALL_ACCEPT		1
#define PPTP_INCALL_GENERAL_ERROR	2
#define PPTP_INCALL_DONT_ACCEPT		3

struct PptpInCallReply {
	__u16	callID;
	__u16	peersCallID;
	__u8	resultCode;
	__u8	generalErrorCode;
	__u16	packetWindow;
	__u16	packetProcDelay;
	__u16	reserved;
};

struct PptpInCallConnected {
	__u16	peersCallID;
	__u16	reserved;
	__u32	connectSpeed;
	__u16	packetWindow;
	__u16	packetProcDelay;
	__u32	callFramingType;
};

struct PptpClearCallRequest {
	__u16	callID;
	__u16	reserved;
};

struct PptpCallDisconnectNotify {
	__u16	callID;
	__u8	resultCode;
	__u8	generalErrorCode;
	__u16	causeCode;
	__u16	reserved;
	__u8	callStatistics[128];
};

struct PptpWanErrorNotify {
	__u16	peersCallID;
	__u16	reserved;
	__u32	crcErrors;
	__u32	framingErrors;
	__u32	hardwareOverRuns;
	__u32	bufferOverRuns;
	__u32	timeoutErrors;
	__u32	alignmentErrors;
};

struct PptpSetLinkInfo {
	__u16	peersCallID;
	__u16	reserved;
	__u32	sendAccm;
	__u32	recvAccm;
};


struct pptp_priv_data {
	__u16	call_id;
	__u16	mcall_id;
	__u16	pcall_id;
};

union pptp_ctrl_union {
		struct PptpStartSessionRequest	sreq;
		struct PptpStartSessionReply	srep;
		struct PptpStopSessionRequest	streq;
		struct PptpStopSessionReply	strep;
                struct PptpOutCallRequest       ocreq;
                struct PptpOutCallReply         ocack;
                struct PptpInCallRequest        icreq;
                struct PptpInCallReply          icack;
                struct PptpInCallConnected      iccon;
		struct PptpClearCallRequest	clrreq;
                struct PptpCallDisconnectNotify disc;
                struct PptpWanErrorNotify       wanerr;
                struct PptpSetLinkInfo          setlink;
};

extern int
(*ip_nat_pptp_hook_outbound)(struct sk_buff **pskb,
			  struct ip_conntrack *ct,
			  enum ip_conntrack_info ctinfo,
			  struct PptpControlHeader *ctlh,
			  union pptp_ctrl_union *pptpReq);

extern int
(*ip_nat_pptp_hook_inbound)(struct sk_buff **pskb,
			  struct ip_conntrack *ct,
			  enum ip_conntrack_info ctinfo,
			  struct PptpControlHeader *ctlh,
			  union pptp_ctrl_union *pptpReq);

extern int
(*ip_nat_pptp_hook_exp_gre)(struct ip_conntrack_expect *exp_orig,
			    struct ip_conntrack_expect *exp_reply);

extern void
(*ip_nat_pptp_hook_expectfn)(struct ip_conntrack *ct,
			     struct ip_conntrack_expect *exp);
#endif /* __KERNEL__ */
#endif /* _CONNTRACK_PPTP_H */