1/* SPDX-License-Identifier: GPL-2.0 */
2/* PPTP constants and structs */
3#ifndef _NF_CONNTRACK_PPTP_H
4#define _NF_CONNTRACK_PPTP_H
5
6#include <linux/netfilter.h>
7#include <linux/skbuff.h>
8#include <linux/types.h>
9#include <linux/netfilter/nf_conntrack_common.h>
10#include <net/netfilter/nf_conntrack_expect.h>
11#include <uapi/linux/netfilter/nf_conntrack_tuple_common.h>
12
13const char *pptp_msg_name(u_int16_t msg);
14
15/* state of the control session */
16enum pptp_ctrlsess_state {
17	PPTP_SESSION_NONE,			/* no session present */
18	PPTP_SESSION_ERROR,			/* some session error */
19	PPTP_SESSION_STOPREQ,			/* stop_sess request seen */
20	PPTP_SESSION_REQUESTED,			/* start_sess request seen */
21	PPTP_SESSION_CONFIRMED,			/* session established */
22};
23
24/* state of the call inside the control session */
25enum pptp_ctrlcall_state {
26	PPTP_CALL_NONE,
27	PPTP_CALL_ERROR,
28	PPTP_CALL_OUT_REQ,
29	PPTP_CALL_OUT_CONF,
30	PPTP_CALL_IN_REQ,
31	PPTP_CALL_IN_REP,
32	PPTP_CALL_IN_CONF,
33	PPTP_CALL_CLEAR_REQ,
34};
35
36/* conntrack private data */
37struct nf_ct_pptp_master {
38	enum pptp_ctrlsess_state sstate;	/* session state */
39	enum pptp_ctrlcall_state cstate;	/* call state */
40	__be16 pac_call_id;			/* call id of PAC */
41	__be16 pns_call_id;			/* call id of PNS */
42
43	/* in pre-2.6.11 this used to be per-expect. Now it is per-conntrack
44	 * and therefore imposes a fixed limit on the number of maps */
45	struct nf_ct_gre_keymap *keymap[IP_CT_DIR_MAX];
46};
47
48struct nf_nat_pptp {
49	__be16 pns_call_id;			/* NAT'ed PNS call id */
50	__be16 pac_call_id;			/* NAT'ed PAC call id */
51};
52
53#define PPTP_CONTROL_PORT	1723
54
55#define PPTP_PACKET_CONTROL	1
56#define PPTP_PACKET_MGMT	2
57
58#define PPTP_MAGIC_COOKIE	0x1a2b3c4d
59
60struct pptp_pkt_hdr {
61	__u16	packetLength;
62	__be16	packetType;
63	__be32	magicCookie;
64};
65
66/* PptpControlMessageType values */
67#define PPTP_START_SESSION_REQUEST	1
68#define PPTP_START_SESSION_REPLY	2
69#define PPTP_STOP_SESSION_REQUEST	3
70#define PPTP_STOP_SESSION_REPLY		4
71#define PPTP_ECHO_REQUEST		5
72#define PPTP_ECHO_REPLY			6
73#define PPTP_OUT_CALL_REQUEST		7
74#define PPTP_OUT_CALL_REPLY		8
75#define PPTP_IN_CALL_REQUEST		9
76#define PPTP_IN_CALL_REPLY		10
77#define PPTP_IN_CALL_CONNECT		11
78#define PPTP_CALL_CLEAR_REQUEST		12
79#define PPTP_CALL_DISCONNECT_NOTIFY	13
80#define PPTP_WAN_ERROR_NOTIFY		14
81#define PPTP_SET_LINK_INFO		15
82
83#define PPTP_MSG_MAX			15
84
85/* PptpGeneralError values */
86#define PPTP_ERROR_CODE_NONE		0
87#define PPTP_NOT_CONNECTED		1
88#define PPTP_BAD_FORMAT			2
89#define PPTP_BAD_VALUE			3
90#define PPTP_NO_RESOURCE		4
91#define PPTP_BAD_CALLID			5
92#define PPTP_REMOVE_DEVICE_ERROR	6
93
94struct PptpControlHeader {
95	__be16	messageType;
96	__u16	reserved;
97};
98
99/* FramingCapability Bitmap Values */
100#define PPTP_FRAME_CAP_ASYNC		0x1
101#define PPTP_FRAME_CAP_SYNC		0x2
102
103/* BearerCapability Bitmap Values */
104#define PPTP_BEARER_CAP_ANALOG		0x1
105#define PPTP_BEARER_CAP_DIGITAL		0x2
106
107struct PptpStartSessionRequest {
108	__be16	protocolVersion;
109	__u16	reserved1;
110	__be32	framingCapability;
111	__be32	bearerCapability;
112	__be16	maxChannels;
113	__be16	firmwareRevision;
114	__u8	hostName[64];
115	__u8	vendorString[64];
116};
117
118/* PptpStartSessionResultCode Values */
119#define PPTP_START_OK			1
120#define PPTP_START_GENERAL_ERROR	2
121#define PPTP_START_ALREADY_CONNECTED	3
122#define PPTP_START_NOT_AUTHORIZED	4
123#define PPTP_START_UNKNOWN_PROTOCOL	5
124
125struct PptpStartSessionReply {
126	__be16	protocolVersion;
127	__u8	resultCode;
128	__u8	generalErrorCode;
129	__be32	framingCapability;
130	__be32	bearerCapability;
131	__be16	maxChannels;
132	__be16	firmwareRevision;
133	__u8	hostName[64];
134	__u8	vendorString[64];
135};
136
137/* PptpStopReasons */
138#define PPTP_STOP_NONE			1
139#define PPTP_STOP_PROTOCOL		2
140#define PPTP_STOP_LOCAL_SHUTDOWN	3
141
142struct PptpStopSessionRequest {
143	__u8	reason;
144	__u8	reserved1;
145	__u16	reserved2;
146};
147
148/* PptpStopSessionResultCode */
149#define PPTP_STOP_OK			1
150#define PPTP_STOP_GENERAL_ERROR		2
151
152struct PptpStopSessionReply {
153	__u8	resultCode;
154	__u8	generalErrorCode;
155	__u16	reserved1;
156};
157
158struct PptpEchoRequest {
159	__be32 identNumber;
160};
161
162/* PptpEchoReplyResultCode */
163#define PPTP_ECHO_OK			1
164#define PPTP_ECHO_GENERAL_ERROR		2
165
166struct PptpEchoReply {
167	__be32	identNumber;
168	__u8	resultCode;
169	__u8	generalErrorCode;
170	__u16	reserved;
171};
172
173/* PptpFramingType */
174#define PPTP_ASYNC_FRAMING		1
175#define PPTP_SYNC_FRAMING		2
176#define PPTP_DONT_CARE_FRAMING		3
177
178/* PptpCallBearerType */
179#define PPTP_ANALOG_TYPE		1
180#define PPTP_DIGITAL_TYPE		2
181#define PPTP_DONT_CARE_BEARER_TYPE	3
182
183struct PptpOutCallRequest {
184	__be16	callID;
185	__be16	callSerialNumber;
186	__be32	minBPS;
187	__be32	maxBPS;
188	__be32	bearerType;
189	__be32	framingType;
190	__be16	packetWindow;
191	__be16	packetProcDelay;
192	__be16	phoneNumberLength;
193	__u16	reserved1;
194	__u8	phoneNumber[64];
195	__u8	subAddress[64];
196};
197
198/* PptpCallResultCode */
199#define PPTP_OUTCALL_CONNECT		1
200#define PPTP_OUTCALL_GENERAL_ERROR	2
201#define PPTP_OUTCALL_NO_CARRIER		3
202#define PPTP_OUTCALL_BUSY		4
203#define PPTP_OUTCALL_NO_DIAL_TONE	5
204#define PPTP_OUTCALL_TIMEOUT		6
205#define PPTP_OUTCALL_DONT_ACCEPT	7
206
207struct PptpOutCallReply {
208	__be16	callID;
209	__be16	peersCallID;
210	__u8	resultCode;
211	__u8	generalErrorCode;
212	__be16	causeCode;
213	__be32	connectSpeed;
214	__be16	packetWindow;
215	__be16	packetProcDelay;
216	__be32	physChannelID;
217};
218
219struct PptpInCallRequest {
220	__be16	callID;
221	__be16	callSerialNumber;
222	__be32	callBearerType;
223	__be32	physChannelID;
224	__be16	dialedNumberLength;
225	__be16	dialingNumberLength;
226	__u8	dialedNumber[64];
227	__u8	dialingNumber[64];
228	__u8	subAddress[64];
229};
230
231/* PptpInCallResultCode */
232#define PPTP_INCALL_ACCEPT		1
233#define PPTP_INCALL_GENERAL_ERROR	2
234#define PPTP_INCALL_DONT_ACCEPT		3
235
236struct PptpInCallReply {
237	__be16	callID;
238	__be16	peersCallID;
239	__u8	resultCode;
240	__u8	generalErrorCode;
241	__be16	packetWindow;
242	__be16	packetProcDelay;
243	__u16	reserved;
244};
245
246struct PptpInCallConnected {
247	__be16	peersCallID;
248	__u16	reserved;
249	__be32	connectSpeed;
250	__be16	packetWindow;
251	__be16	packetProcDelay;
252	__be32	callFramingType;
253};
254
255struct PptpClearCallRequest {
256	__be16	callID;
257	__u16	reserved;
258};
259
260struct PptpCallDisconnectNotify {
261	__be16	callID;
262	__u8	resultCode;
263	__u8	generalErrorCode;
264	__be16	causeCode;
265	__u16	reserved;
266	__u8	callStatistics[128];
267};
268
269struct PptpWanErrorNotify {
270	__be16	peersCallID;
271	__u16	reserved;
272	__be32	crcErrors;
273	__be32	framingErrors;
274	__be32	hardwareOverRuns;
275	__be32	bufferOverRuns;
276	__be32	timeoutErrors;
277	__be32	alignmentErrors;
278};
279
280struct PptpSetLinkInfo {
281	__be16	peersCallID;
282	__u16	reserved;
283	__be32	sendAccm;
284	__be32	recvAccm;
285};
286
287union pptp_ctrl_union {
288	struct PptpStartSessionRequest	sreq;
289	struct PptpStartSessionReply	srep;
290	struct PptpStopSessionRequest	streq;
291	struct PptpStopSessionReply	strep;
292	struct PptpOutCallRequest	ocreq;
293	struct PptpOutCallReply		ocack;
294	struct PptpInCallRequest	icreq;
295	struct PptpInCallReply		icack;
296	struct PptpInCallConnected	iccon;
297	struct PptpClearCallRequest	clrreq;
298	struct PptpCallDisconnectNotify disc;
299	struct PptpWanErrorNotify	wanerr;
300	struct PptpSetLinkInfo		setlink;
301};
302
303struct nf_nat_pptp_hook {
304	int (*outbound)(struct sk_buff *skb,
305			struct nf_conn *ct, enum ip_conntrack_info ctinfo,
306			unsigned int protoff,
307			struct PptpControlHeader *ctlh,
308			union pptp_ctrl_union *pptpReq);
309	int (*inbound)(struct sk_buff *skb,
310		       struct nf_conn *ct, enum ip_conntrack_info ctinfo,
311		       unsigned int protoff,
312		       struct PptpControlHeader *ctlh,
313		       union pptp_ctrl_union *pptpReq);
314	void (*exp_gre)(struct nf_conntrack_expect *exp_orig,
315			struct nf_conntrack_expect *exp_reply);
316	void (*expectfn)(struct nf_conn *ct,
317			 struct nf_conntrack_expect *exp);
318};
319
320extern const struct nf_nat_pptp_hook __rcu *nf_nat_pptp_hook;
321#endif /* _NF_CONNTRACK_PPTP_H */
322