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