// Copyright (c) 1997, Microsoft Corporation, all rights reserved
//
// l2tprfc.h
// RAS L2TP WAN mini-port/call-manager driver
// L2TP RFC header
//
// 01/07/97 Steve Cobb
//
// This header contains definitions from the L2TP draft/RFC, currently
// draft-12.
//


#ifndef _L2TPRFC_H_
#define _L2TPRFC_H_


//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------

// The UDP port at which L2TP messages will arrive.
//
#define L2TP_UdpPort 1701

// The IP protocol number on which messages will arrive.  (No number has been
// assigned so this is a placeholder for now)
//
#define L2TP_IpProtocol 254

// The standard value for the Hello timer in milliseconds.
//
#define L2TP_HelloMs 60000

// The maximum number of bytes in a frame excluding all L2TP and PPP HDLC-ish
// framing overhead.
//
#define L2TP_MaxFrameSize 1500

// Maximum number of bytes in an L2TP control or payload header.
//
#define L2TP_MaxHeaderSize 14

// The maximum number of bytes in the L2TP payload packet header including
// padding.  The 14 represents all possible fields defined in the RFC.  The
// "+8" represents allowance for up to 8 bytes of padding to be specified in
// the header.  While there is theoretically no limit to the padding, there is
// no discussion in the L2TP forum indicating interest in more than 8 bytes.
//
#define L2TP_MaxPayloadHeader (14 + 8)

// The default packet processing delay in 1/10 second, i.e. 1/2 second.
//
#define L2TP_LnsDefaultPpd 5

// The default control send timeout in milliseconds, i.e. 1 second.
//
#define L2TP_DefaultSendTimeoutMs 1000

// The default control/payload piggybacking acknowledge delay in milliseconds.
//
#define L2TP_MaxAckDelay 500

// The implicit receive window offered control channels where no Receive
// Window AVP is provided.
//
#define L2TP_DefaultReceiveWindow 4

// Highest L2TP protocol version we support.
//
#define L2TP_ProtocolVersion 0x0100

// Default maximum send timeout in milliseconds.  The draft only says the cap
// must be no less than 8 seconds, so 10 seconds is selected as reasonable and
// safe.
//
#define L2TP_DefaultMaxSendTimeoutMs 10000

// Default maximum retransmissions before assuming peer is unreachable.
//
#define L2TP_DefaultMaxRetransmits 5

// Size in bytes of the fixed portion of a control message attribute/value
// pair, i.e. the size of an AVP with zero length value.
//
#define L2TP_AvpHeaderSize 6

// L2TP protocol control message types.
//
#define CMT_SCCRQ    1   // Start-Control-Connection-Request
#define CMT_SCCRP    2   // Start-Control-Connection-Reply
#define CMT_SCCCN    3   // Start-Control-Connection-Connected
#define CMT_StopCCN  4   // Stop-Control-Connection-Notify
#define CMT_StopCCRP 5   // Stop-Control-Connection-Reply (obsolete)
#define CMT_Hello    6   // Hello, i.e. keep-alive
#define CMT_OCRQ     7   // Outgoing-Call-Request
#define CMT_OCRP     8   // Outgoing-Call-Reply
#define CMT_OCCN     9   // Outgoing-Call-Connected
#define CMT_ICRQ     10  // Incoming-Call-Request
#define CMT_ICRP     11  // Incoming-Call-Reply
#define CMT_ICCN     12  // Incoming-Call-Connected
#define CMT_CCRQ     13  // Call-Clear-Request (obsolete)
#define CMT_CDN      14  // Call-Disconnect-Notify
#define CMT_WEN      15  // WAN-Error-Notify
#define CMT_SLI      16  // Set-Link-Info

// L2TP Attribute codes.
//
#define ATTR_MsgType            0
#define ATTR_Result             1
#define ATTR_ProtocolVersion    2
#define ATTR_FramingCaps        3
#define ATTR_BearerCaps         4
#define ATTR_TieBreaker         5
#define ATTR_FirmwareRevision   6
#define ATTR_HostName           7
#define ATTR_VendorName         8
#define ATTR_AssignedTunnelId   9
#define ATTR_RWindowSize        10
#define ATTR_Challenge          11
#define ATTR_Q931Cause          12
#define ATTR_ChallengeResponse  13
#define ATTR_AssignedCallId     14
#define ATTR_CallSerialNumber   15
#define ATTR_MinimumBps         16
#define ATTR_MaximumBps         17
#define ATTR_BearerType         18
#define ATTR_FramingType        19
#define ATTR_PacketProcDelay    20
#define ATTR_DialedNumber       21
#define ATTR_DialingNumber      22
#define ATTR_SubAddress         23
#define ATTR_TxConnectSpeed     24
#define ATTR_PhysicalChannelId  25
#define ATTR_InitialLcpConfig   26
#define ATTR_LastSLcpConfig     27
#define ATTR_LastRLcpConfig     28
#define ATTR_ProxyAuthType      29
#define ATTR_ProxyAuthName      30
#define ATTR_ProxyAuthChallenge 31
#define ATTR_ProxyAuthId        32
#define ATTR_ProxyAuthResponse  33
#define ATTR_CallErrors         34
#define ATTR_Accm               35
#define ATTR_RandomVector       36
#define ATTR_PrivateGroupId     37
#define ATTR_RxConnectSpeed     38
#define ATTR_SequencingRequired 39

#define ATTR_MAX 39

// L2TP protocol general error codes.
//
#define GERR_None                0
#define GERR_NoControlConnection 1
#define GERR_BadLength           2
#define GERR_BadValue            3
#define GERR_NoResources         4
#define GERR_BadCallId           5
#define GERR_VendorSpecific      6
#define GERR_TryAnother          7

// Tunnel Result Code AVP values, used in StopCCN message.
//
#define TRESULT_General            1
#define TRESULT_GeneralWithError   2
#define TRESULT_CcExists           3
#define TRESULT_NotAuthorized      4
#define TRESULT_BadProtocolVersion 5
#define TRESULT_Shutdown           6
#define TRESULT_FsmError           7

// Call Result Code values, used in CDN message.
//
#define CRESULT_LostCarrier           1
#define CRESULT_GeneralWithError      2
#define CRESULT_Administrative        3
#define CRESULT_NoFacilitiesTemporary 4
#define CRESULT_NoFacilitiesPermanent 5
#define CRESULT_InvalidDestination    6
#define CRESULT_NoCarrier             7
#define CRESULT_Busy                  8
#define CRESULT_NoDialTone            9
#define CRESULT_Timeout               10
#define CRESULT_NoFraming             11

// L2TP header bitmasks for the first 2 bytes of every L2TP message.
//
#define HBM_T       0x8000 // Control packet
#define HBM_L       0x4000 // Length field present
#define HBM_R       0x2000 // Reset Sr
#define HBM_F       0x0800 // Nr/Ns fields present
#define HBM_S       0x0200 // Offset field present
#define HBM_P       0x0100 // Preferential treatment bit
#define HBM_Bits    0xFFFC // All bits, excluding protocol version field
#define HBM_Ver     0x0003 // Protocol version (L2TP or L2F)
#define HBM_Control 0xc800 // Fixed value of bits in control message

// The defined header bits version number field values.
//
#define VER_L2f  0x0000
#define VER_L2tp 0x0002

// AVP header bitmasks for the first 2 bytes of every Attribute Value Pair.
//
#define ABM_M             0x8000 // Mandatory
#define ABM_H             0x4000 // Hidden
#define ABM_Reserved      0x3C00 // Reserved bits, must be 0
#define ABM_OverallLength 0x03FF // AVP's length including value

// Bearer capabilties AVP bitmasks.
//
#define BBM_Analog  0x00000001
#define BBM_Digital 0x00000002

// Framing capabilities/type AVP bitmasks.
//
#define FBM_Sync  0x00000001
#define FBM_Async 0x00000002

// Proxy Authentication types.
//
#define PAT_Text 1
#define PAT_Chap 2
#define PAT_Pap  3
#define PAT_None 4


//-----------------------------------------------------------------------------
// Data types
//-----------------------------------------------------------------------------

// The "Control Connection" state of a single L2TP tunnel.
//
typedef enum
_L2TPCCSTATE
{
    CCS_Idle = 0,
    CCS_WaitCtlReply,
    CCS_WaitCtlConnect,
    CCS_Established
}
L2TPCCSTATE;


// The "LNS/LAC Outgoing/Incoming Call" state of a single L2TP VC.  Only one
// of the 4 call creation FSMs can be running or Established on a single VC at
// once, so the states are combined in a single table.
//
typedef enum
_L2TPCALLSTATE
{
    CS_Idle = 0,
    CS_WaitTunnel,
    CS_WaitReply,
    CS_WaitConnect,
    CS_WaitDisconnect,
    CS_WaitCsAnswer,
    CS_Established
}
L2TPCALLSTATE;


#endif // _L2TPRFC_H_