hc
2024-03-26 e9199a72d842cbda78ac614eee5db7cdaa6f2530
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
/* SPDX-License-Identifier: GPL-2.0 */
/* PPTP constants and structs */
#ifndef _NF_CONNTRACK_PPTP_H
#define _NF_CONNTRACK_PPTP_H
 
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/types.h>
#include <linux/netfilter/nf_conntrack_common.h>
#include <net/netfilter/nf_conntrack_expect.h>
#include <uapi/linux/netfilter/nf_conntrack_tuple_common.h>
 
const char *pptp_msg_name(u_int16_t msg);
 
/* 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 nf_ct_pptp_master {
   enum pptp_ctrlsess_state sstate;    /* session state */
   enum pptp_ctrlcall_state cstate;    /* call state */
   __be16 pac_call_id;            /* call id of PAC */
   __be16 pns_call_id;            /* call id of PNS */
 
   /* 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 nf_ct_gre_keymap *keymap[IP_CT_DIR_MAX];
};
 
struct nf_nat_pptp {
   __be16 pns_call_id;            /* NAT'ed PNS call id */
   __be16 pac_call_id;            /* NAT'ed PAC call id */
};
 
#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;
   __be16    packetType;
   __be32    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 {
   __be16    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 {
   __be16    protocolVersion;
   __u16    reserved1;
   __be32    framingCapability;
   __be32    bearerCapability;
   __be16    maxChannels;
   __be16    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 {
   __be16    protocolVersion;
   __u8    resultCode;
   __u8    generalErrorCode;
   __be32    framingCapability;
   __be32    bearerCapability;
   __be16    maxChannels;
   __be16    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;
   __u8    reserved1;
   __u16    reserved2;
};
 
/* PptpStopSessionResultCode */
#define PPTP_STOP_OK            1
#define PPTP_STOP_GENERAL_ERROR        2
 
struct PptpStopSessionReply {
   __u8    resultCode;
   __u8    generalErrorCode;
   __u16    reserved1;
};
 
struct PptpEchoRequest {
   __be32 identNumber;
};
 
/* PptpEchoReplyResultCode */
#define PPTP_ECHO_OK            1
#define PPTP_ECHO_GENERAL_ERROR        2
 
struct PptpEchoReply {
   __be32    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 {
   __be16    callID;
   __be16    callSerialNumber;
   __be32    minBPS;
   __be32    maxBPS;
   __be32    bearerType;
   __be32    framingType;
   __be16    packetWindow;
   __be16    packetProcDelay;
   __be16    phoneNumberLength;
   __u16    reserved1;
   __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 {
   __be16    callID;
   __be16    peersCallID;
   __u8    resultCode;
   __u8    generalErrorCode;
   __be16    causeCode;
   __be32    connectSpeed;
   __be16    packetWindow;
   __be16    packetProcDelay;
   __be32    physChannelID;
};
 
struct PptpInCallRequest {
   __be16    callID;
   __be16    callSerialNumber;
   __be32    callBearerType;
   __be32    physChannelID;
   __be16    dialedNumberLength;
   __be16    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 {
   __be16    callID;
   __be16    peersCallID;
   __u8    resultCode;
   __u8    generalErrorCode;
   __be16    packetWindow;
   __be16    packetProcDelay;
   __u16    reserved;
};
 
struct PptpInCallConnected {
   __be16    peersCallID;
   __u16    reserved;
   __be32    connectSpeed;
   __be16    packetWindow;
   __be16    packetProcDelay;
   __be32    callFramingType;
};
 
struct PptpClearCallRequest {
   __be16    callID;
   __u16    reserved;
};
 
struct PptpCallDisconnectNotify {
   __be16    callID;
   __u8    resultCode;
   __u8    generalErrorCode;
   __be16    causeCode;
   __u16    reserved;
   __u8    callStatistics[128];
};
 
struct PptpWanErrorNotify {
   __be16    peersCallID;
   __u16    reserved;
   __be32    crcErrors;
   __be32    framingErrors;
   __be32    hardwareOverRuns;
   __be32    bufferOverRuns;
   __be32    timeoutErrors;
   __be32    alignmentErrors;
};
 
struct PptpSetLinkInfo {
   __be16    peersCallID;
   __u16    reserved;
   __be32    sendAccm;
   __be32    recvAccm;
};
 
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
(*nf_nat_pptp_hook_outbound)(struct sk_buff *skb,
                struct nf_conn *ct, enum ip_conntrack_info ctinfo,
                unsigned int protoff,
                struct PptpControlHeader *ctlh,
                union pptp_ctrl_union *pptpReq);
 
extern int
(*nf_nat_pptp_hook_inbound)(struct sk_buff *skb,
               struct nf_conn *ct, enum ip_conntrack_info ctinfo,
               unsigned int protoff,
               struct PptpControlHeader *ctlh,
               union pptp_ctrl_union *pptpReq);
 
extern void
(*nf_nat_pptp_hook_exp_gre)(struct nf_conntrack_expect *exp_orig,
               struct nf_conntrack_expect *exp_reply);
 
extern void
(*nf_nat_pptp_hook_expectfn)(struct nf_conn *ct,
                struct nf_conntrack_expect *exp);
 
#endif /* _NF_CONNTRACK_PPTP_H */