/*
 *------------------------------------------------------------------
 * cnat_v4_pptp_alg.h
 *
 * Copyright (c) 2009-2013 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *------------------------------------------------------------------
 */

#ifndef __CNAT_V4_PPTP_ALG_H__
#define __CNAT_V4_PPTP_ALG_H__

/* Debug utils of PPTP */
#define PPTP_DBG(debug, ...)  \
            if(PREDICT_FALSE(cnat_pptp_debug_flag >= debug)) { \
                    PLATFORM_DEBUG_PRINT("%s:%s:%d - ", \
                           __FILE__, __FUNCTION__, __LINE__);\
                    PLATFORM_DEBUG_PRINT(__VA_ARGS__);\
                    PLATFORM_DEBUG_PRINT("\n"); \
            } 

#define PPTP_DUMP_PACKET(ip, len) pptp_hex_dump(ip, len)


#define PPTP_DISABLED  0 
#define PPTP_ENABLED   1

#define PPTP_GRE_TIMEOUT  60 /*sec */

#define TCP_PPTP_PORT 1723

#define PPTP_PAC 0 
#define PPTP_PNS 1

/* PPTP MSG TYPE */

#define PPTP_MSG_TYPE_CONTROL  1
#define PPTP_MSG_TYPE_MGMT     2 

/* PPTP control messages */

/* control connection mgmt */ 
#define PPTP_START_CC_RQ           1 
#define PPTP_START_CC_RP           2 
#define PPTP_STOP_CC_RQ            3 
#define PPTP_STOP_CC_RP            4 
#define PPTP_ECHO_RQ               5 
#define PPTP_ECHO_RP               6 

/* call mgmt */
#define PPTP_OBOUND_CALL_RQ        7 
#define PPTP_OBOUND_CALL_RP        8 
#define PPTP_IBOUND_CALL_RQ        9 
#define PPTP_IBOUND_CALL_RP        10 
#define PPTP_IBOUND_CALL_CN        11 
#define PPTP_CALL_CLEAR_RQ         12 
#define PPTP_CALL_DISCON_NT        13 

/* other */

#define PPTP_WAN_ERR_NT            14
#define PPTP_SET_LINK_INF          15

#define PPTP_MIN_HDR_LEN           8

/* Byte offsets from start of TCP Data(PPTP header) */ 

#define PPTP_CTRL_MGMT_TYPE_OFFSET   0x02 
#define PPTP_CC_TYPE_OFFSET          0x08
#define PPTP_HDR_CALL_ID_OFFSET      0x0c 
#define PPTP_HDR_PEER_CALL_ID_OFFSET 0x0e 

#define PPTP_HDR_RESULT_CODE_OFFSET_STCCRP 0x0e 
#define PPTP_HDR_RESULT_CODE_OFFSET        0x10 


/* Offset of control/mgmt msg types 
            from start of TCP header */ 

#define TCP_HEADER_SIZE(tcp)   \
                  ((tcp->hdr_len>>4) << 2)

  
#define PPTP_MSG_START_OFFSET(tcp)    \
                  ((u8*)tcp + TCP_HEADER_SIZE(tcp))


#define PPTP_CC_MSG_TYPE_OFFSET(tcp) \
                  (PPTP_MSG_START_OFFSET(tcp) + \
                  PPTP_CC_TYPE_OFFSET )

#define PPTP_MGMT_MSG_TYPE_OFFSET(tcp) \
                  ( PPTP_MSG_START_OFFSET(tcp) + \
                  PPTP_CTRL_MGMT_TYPE_OFFSET )

#define PPTP_CALL_ID_OFFSET(tcp) \
                   ( PPTP_MSG_START_OFFSET(tcp) + \
                   PPTP_HDR_CALL_ID_OFFSET )

#define PPTP_PEER_CALL_ID_OFFSET(tcp) \
                   ( PPTP_MSG_START_OFFSET(tcp) + \
                   PPTP_HDR_PEER_CALL_ID_OFFSET )

#define PPTP_RESULT_CODE_OFFSET(tcp) \
                   ( PPTP_MSG_START_OFFSET(tcp) + \
                   PPTP_HDR_RESULT_CODE_OFFSET )

#define PPTP_RESULT_CODE_OFFSET_STCCRP(tcp) \
                   ( PPTP_MSG_START_OFFSET(tcp) + \
                   PPTP_HDR_RESULT_CODE_OFFSET_STCCRP)

/* values */
#define PPTP_CC_MSG_TYPE(tcp) \
              (u16*)PPTP_CC_MSG_TYPE_OFFSET(tcp)

#define PPTP_MGMT_MSG_TYPE(tcp) \
              (u16*)PPTP_MGMT_MSG_TYPE_OFFSET(tcp)

#define PPTP_CALL_ID(tcp) \
              (u16*)PPTP_CALL_ID_OFFSET(tcp)

#define PPTP_PEER_CALL_ID(tcp) \
              (u16*)PPTP_PEER_CALL_ID_OFFSET(tcp)

#define PPTP_RESULT_CODE(tcp) \
              *(u8*)PPTP_RESULT_CODE_OFFSET(tcp);
              
#define PPTP_RESULT_CODE_STCCRP(tcp) \
              *(u8*)PPTP_RESULT_CODE_OFFSET_STCCRP(tcp);


/* other code */
#define PPTP_CHAN_SUCCESS   1


/* Data structures */

extern u32 cnat_pptp_debug_flag;

#endif /* __CNAT_V4_PPTP_ALG_H__ */