/***************************************************************************** * * Copyright (c) 1998-1999 Microsoft Corporation * * PROTOCOL.H - PPTP and GRE Protocol data types and constants * * Author: Stan Adermann (stana) * * Created: 7/23/1998 * *****************************************************************************/ #ifndef PROTOCOL_H #define PROTOCOL_H /* IP ----------------------------------------------------------------------*/ #define IP_VERSION 0x40 typedef struct { UCHAR iph_verlen; // Version and length. UCHAR iph_tos; // Type of service. USHORT iph_length; // Total length of datagram. USHORT iph_id; // Identification. USHORT iph_offset; // Flags and fragment offset. UCHAR iph_ttl; // Time to live. UCHAR iph_protocol; // Protocol. USHORT iph_xsum; // Header checksum. ULONG iph_src; // Source address. ULONG iph_dest; // Destination address. } IP4_HEADER, *PIP4_HEADER; /* GRE ---------------------------------------------------------------------*/ typedef struct { UCHAR RecursionControl : 3; UCHAR StrictSourceRoutePresent : 1; UCHAR SequenceNumberPresent : 1; UCHAR KeyPresent : 1; UCHAR RoutingPresent : 1; UCHAR ChecksumPresent : 1; UCHAR Version : 3; UCHAR Flags : 4; UCHAR AckSequenceNumberPresent : 1; USHORT ProtocolType; #define GRE_PROTOCOL_TYPE 0x880B #define GRE_PROTOCOL_TYPE_NS 0x0B88 USHORT KeyLength; USHORT KeyCallId; } GRE_HEADER, *PGRE_HEADER; #define GreSequence(g) (*(PULONG)(((PUCHAR)(g)) + sizeof(GRE_HEADER))) #define GreAckSequence(g) \ ((g)->SequenceNumberPresent ? \ (*(PULONG)(((PUCHAR)(g)) + sizeof(GRE_HEADER) + sizeof(ULONG))) : \ GreSequence(g)) /* PPTP --------------------------------------------------------------------*/ #define PPTP_TCP_PORT 1723 #define PPTP_IP_GRE_PROTOCOL 47 #define PPTP_PROTOCOL_VERSION_1_00 0x100 #define PPTP_PROTOCOL_SECURE_VERSION 0x200 #define PPTP_MAGIC_COOKIE 0x1A2B3C4D // host byte order #define IPADDR_ZERO 0 #define IPADDR_BROADCAST 0xffffffff #define IPADDR_IS_MULTICAST(_addr) (((_addr) & 0xf0000000) == 0xe0000000) #define MAX_HOSTNAME_LENGTH 64 #define MAX_VENDOR_LENGTH 64 #define MAX_PHONE_NUMBER_LENGTH 64 #define MAX_SUBADDRESS_LENGTH 64 #define MAX_CALL_STATS_LENGTH 128 #define PPTP_MAX_PACKET_SIZE 1532 #define PPTP_MAX_LOOKAHEAD PPTP_MAX_PACKET_SIZE #define PPTP_MAX_TRANSMIT 32 #define PPTP_MAX_RECEIVE_SIZE (1614+20+12+8) // To allow for PPP padding, etc. #define PPTP_RECV_WINDOW 64 #define PPTP_STATUS_SUCCESS 0 #define PPTP_STATUS_NOT_CONNECTED 1 #define PPTP_STATUS_BAD_FORMAT 2 #define PPTP_STATUS_BAD_VALUE 3 #define PPTP_STATUS_INSUFFICIENT_RESOURCES 4 #define PPTP_STATUS_BAD_CALL_ID 5 #define PPTP_STATUS_PAC_ERROR 6 typedef enum { PPTP_CONTROL_MESSAGE = 1 } PPTP_PACKET_TYPE; typedef enum { CONTROL_START_REQUEST = 1, CONTROL_START_REPLY, CONTROL_STOP_REQUEST, CONTROL_STOP_REPLY, CONTROL_ECHO_REQUEST, CONTROL_ECHO_REPLY, CALL_OUT_REQUEST, CALL_OUT_REPLY, CALL_IN_REQUEST, CALL_IN_REPLY, CALL_IN_CONNECTED, CALL_CLEAR_REQUEST, CALL_DISCONNECT_NOTIFY, WAN_ERROR_NOTIFY, SET_LINK_INFO, NUM_MESSAGE_TYPES } PPTP_MESSAGE_TYPE; typedef struct { USHORT Length; USHORT PacketType; ULONG Cookie; USHORT MessageType; USHORT Reserved0; } PPTP_HEADER, *PPPTP_HEADER; typedef struct { PPTP_HEADER; USHORT Version; union { USHORT Reserved1; struct { UCHAR ResultCode; #define RESULT_CONTROL_START_SUCCESS 1 #define RESULT_CONTROL_START_ERROR 2 #define RESULT_CONTROL_START_ALREADY_CONNECTED 3 #define RESULT_CONTROL_START_UNAUTHORIZED 4 #define RESULT_CONTROL_START_VERSION_NOT_SUPPORTED 5 UCHAR ErrorCode; }; }; ULONG FramingCapabilities; #define FRAMING_ASYNC BIT(0) #define FRAMING_SYNC BIT(1) ULONG BearerCapabilities; #define BEARER_ANALOG BIT(0) #define BEARER_DIGITAL BIT(1) USHORT MaxChannels; USHORT FirmwareRevision; UCHAR HostName[MAX_HOSTNAME_LENGTH]; UCHAR Vendor[MAX_VENDOR_LENGTH]; } PPTP_CONTROL_START_PACKET, PPTP_CONTROL_REPLY_PACKET, *PPPTP_CONTROL_START_PACKET, *PPPTP_CONTROL_REPLY_PACKET; typedef struct { PPTP_HEADER; union { struct { UCHAR Reason; #define CONTROL_STOP_GENERAL 1 #define CONTROL_STOP_VERSION 2 #define CONTROL_STOP_LOCAL 3 UCHAR Reserved1; }; struct { UCHAR ResultCode; #define RESULT_CONTROL_STOP_SUCCESS 1 #define RESULT_CONTROL_STOP_ERROR 2 UCHAR ErrorCode; }; }; USHORT Reserved2; } PPTP_CONTROL_STOP_PACKET, *PPPTP_CONTROL_STOP_PACKET; typedef struct { PPTP_HEADER; ULONG Identifier; } PPTP_CONTROL_ECHO_REQUEST_PACKET, *PPPTP_CONTROL_ECHO_REQUEST_PACKET; typedef struct { PPTP_HEADER; ULONG Identifier; UCHAR ResultCode; #define RESULT_CONTROL_ECHO_SUCCESS 1 #define RESULT_CONTROL_ECHO_FAILURE 2 UCHAR ErrorCode; USHORT Reserved1; } PPTP_CONTROL_ECHO_REPLY_PACKET, *PPPTP_CONTROL_ECHO_REPLY_PACKET; typedef struct { PPTP_HEADER; USHORT CallId; USHORT SerialNumber; ULONG MinimumBPS; ULONG MaximumBPS; ULONG BearerType; ULONG FramingType; USHORT RecvWindowSize; USHORT ProcessingDelay; USHORT PhoneNumberLength; USHORT Reserved1; UCHAR PhoneNumber[MAX_PHONE_NUMBER_LENGTH]; UCHAR Subaddress[MAX_SUBADDRESS_LENGTH]; } PPTP_CALL_OUT_REQUEST_PACKET, *PPPTP_CALL_OUT_REQUEST_PACKET; typedef struct { PPTP_HEADER; USHORT CallId; USHORT PeerCallId; UCHAR ResultCode; #define RESULT_CALL_OUT_CONNECTED 1 #define RESULT_CALL_OUT_ERROR 2 #define RESULT_CALL_OUT_NO_CARRIER 3 #define RESULT_CALL_OUT_BUSY 4 #define RESULT_CALL_OUT_NO_DIAL_TONE 5 #define RESULT_CALL_OUT_TIMEOUT 6 #define RESULT_CALL_OUT_REFUSED 7 UCHAR ErrorCode; USHORT CauseCode; ULONG ConnectSpeed; USHORT RecvWindowSize; USHORT ProcessingDelay; ULONG PhysicalChannelId; } PPTP_CALL_OUT_REPLY_PACKET, *PPPTP_CALL_OUT_REPLY_PACKET; typedef struct { PPTP_HEADER; USHORT CallId; USHORT SerialNumber; ULONG BearerType; ULONG PhysicalChannelId; USHORT DialedNumberLength; USHORT DialingNumberLength; UCHAR DialedNumber[MAX_PHONE_NUMBER_LENGTH]; UCHAR DialingNumber[MAX_PHONE_NUMBER_LENGTH]; UCHAR Subaddress[MAX_SUBADDRESS_LENGTH]; } PPTP_CALL_IN_REQUEST_PACKET, *PPPTP_CALL_IN_REQUEST_PACKET; typedef struct { PPTP_HEADER; USHORT CallId; USHORT PeerCallId; UCHAR ResultCode; #define RESULT_CALL_IN_CONNECTED 1 #define RESULT_CALL_IN_ERROR 2 #define RESULT_CALL_IN_REFUSED 3 UCHAR ErrorCode; USHORT RecvWindowSize; USHORT ProcessingDelay; USHORT Reserved1; } PPTP_CALL_IN_REPLY_PACKET, *PPPTP_CALL_IN_REPLY_PACKET; typedef struct { PPTP_HEADER; USHORT PeerCallId; USHORT Reserved1; ULONG ConnectSpeed; USHORT RecvWindowSize; USHORT ProcessingDelay; ULONG FramingType; } PPTP_CALL_IN_CONNECT_PACKET, *PPPTP_CALL_IN_CONNECT_PACKET; typedef struct { PPTP_HEADER; USHORT CallId; USHORT Reserved1; } PPTP_CALL_CLEAR_REQUEST_PACKET, *PPPTP_CALL_CLEAR_REQUEST_PACKET; typedef struct { PPTP_HEADER; USHORT CallId; UCHAR ResultCode; #define RESULT_CALL_DISCONNECT_LOST_CARRIER 1 #define RESULT_CALL_DISCONNECT_ERROR 2 #define RESULT_CALL_DISCONNECT_ADMIN 3 #define RESULT_CALL_DISCONNECT_REQUEST 4 UCHAR ErrorCode; USHORT CauseCode; USHORT Reserved1; UCHAR CallStatistics[MAX_CALL_STATS_LENGTH]; } PPTP_CALL_DISCONNECT_NOTIFY_PACKET, *PPPTP_CALL_DISCONNECT_NOTIFY_PACKET; typedef struct { PPTP_HEADER; USHORT PeerCallId; USHORT Reserved1; ULONG CrcErrors; ULONG FramingErrors; ULONG HardwareOverruns; ULONG BufferOverruns; ULONG TimeoutErrors; ULONG AlignmentErrors; } PPTP_WAN_ERROR_NOTIFY_PACKET, *PPPTP_WAN_ERROR_NOTIFY_PACKET; typedef struct { PPTP_HEADER; USHORT PeerCallId; USHORT Reserved1; ULONG SendAccm; ULONG RecvAccm; } PPTP_SET_LINK_INFO_PACKET, *PPPTP_SET_LINK_INFO_PACKET; #define MAX_CONTROL_PACKET_LENGTH sizeof(PPTP_CALL_IN_REQUEST_PACKET) #endif //PROTOCOL_H