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
8extern const char *const pptp_msg_name[];
9
10/* state of the control session */
11enum 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 */
20enum 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 */
32struct 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
43struct 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
57struct 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
91struct 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
104struct 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
122struct 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
139struct 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
149struct PptpStopSessionReply {
150 __u8 resultCode;
151 __u8 generalErrorCode;
152 __u16 reserved1;
153};
154
155struct PptpEchoRequest {
156 __be32 identNumber;
157};
158
159/* PptpEchoReplyResultCode */
160#define PPTP_ECHO_OK 1
161#define PPTP_ECHO_GENERAL_ERROR 2
162
163struct 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
180struct 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
204struct 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
216struct 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
233struct PptpInCallReply {
234 __be16 callID;
235 __be16 peersCallID;
236 __u8 resultCode;
237 __u8 generalErrorCode;
238 __be16 packetWindow;
239 __be16 packetProcDelay;
240 __u16 reserved;
241};
242
243struct PptpInCallConnected {
244 __be16 peersCallID;
245 __u16 reserved;
246 __be32 connectSpeed;
247 __be16 packetWindow;
248 __be16 packetProcDelay;
249 __be32 callFramingType;
250};
251
252struct PptpClearCallRequest {
253 __be16 callID;
254 __u16 reserved;
255};
256
257struct PptpCallDisconnectNotify {
258 __be16 callID;
259 __u8 resultCode;
260 __u8 generalErrorCode;
261 __be16 causeCode;
262 __u16 reserved;
263 __u8 callStatistics[128];
264};
265
266struct 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
277struct PptpSetLinkInfo {
278 __be16 peersCallID;
279 __u16 reserved;
280 __be32 sendAccm;
281 __be32 recvAccm;
282};
283
284union 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 */
301struct nf_conn;
302struct nf_conntrack_expect;
303
304extern 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
311extern 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
318extern void
319(*nf_nat_pptp_hook_exp_gre)(struct nf_conntrack_expect *exp_orig,
320 struct nf_conntrack_expect *exp_reply);
321
322extern 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