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