/* ****************************************************************************** * HEADER FILE * * Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipl2tp_message.h,v $ $Revision: 1.2 $ * $Source: /home/interpeak/CVSRoot/ipl2tp/src/ipl2tp_message.h,v $ * $Author: joel $ $Date: 2006-01-30 10:47:46 $ * $State: Exp $ $Locker: $ * * INTERPEAK_COPYRIGHT_STRING * Design and implementation by Joel Hortelius ****************************************************************************** */ #ifndef IPL2TP_MESSAGE_H #define IPL2TP_MESSAGE_H /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #include "ipl2tp_v2.h" #include "ipl2tp_v3.h" #ifdef __cplusplus extern "C" { #endif /* **************************************************************************** * 4 DEFINES **************************************************************************** */ /* Container flag values */ #define IPL2TP_CONTAINER_SENT 0x01 #define IPL2TP_CONTAINER_RV 0x02 /* *--------------------------------------------------------------------------- * Message type *--------------------------------------------------------------------------- */ #define IPL2TP_MSG_ZLB 0 /*$ ZLB - Zero-Length-Body (internal use) $*/ #define IPL2TP_MSG_SCCRQ 1 /*$ SCCRQ - Start-Control-Connection-Request $*/ #define IPL2TP_MSG_SCCRP 2 /*$ SCCRP - Start-Control-Connection-Reply $*/ #define IPL2TP_MSG_SCCCN 3 /*$ SCCCN - Start-Control-Connection-Connected $*/ #define IPL2TP_MSG_StopCCN 4 /*$ StopCCN - Stop-Control-Connection-Notify $*/ #define IPL2TP_MSG_HELLO 6 /*$ HELLO $*/ #define IPL2TP_MSG_OCRQ 7 /*$ OCRQ - Outgoing-Call-Request $*/ #define IPL2TP_MSG_OCRP 8 /*$ OCRP - Outgoing-Call-Reply $*/ #define IPL2TP_MSG_OCCN 9 /*$ OCCN - Outgoing-Call-Connected $*/ #define IPL2TP_MSG_ICRQ 10 /*$ ICRQ - Incoming-Call-Request $*/ #define IPL2TP_MSG_ICRP 11 /*$ ICRP - Incoming-Call-Reply $*/ #define IPL2TP_MSG_ICCN 12 /*$ ICCN - Incoming-Call-Connected $*/ #define IPL2TP_MSG_CDN 14 /*$ CDN - Call-Disconnect-Notify $*/ #define IPL2TP_MSG_WEN 15 /*$ WEN - WAN-Error-Notify $*/ #define IPL2TP_MSG_SLI 16 /*$ SLI - Set-Link-Info $*/ #define IPL2TP_MSG_ACK 20 /*$ ACK - Explicit acknowledgement $*/ #define IPL2TP_MSG_MAX (IPL2TP_MSG_ACK + 1) #define ipl2tp_message_call(c,t,s,a)\ (*(((t)->table->messages)[c]))(t,s,a) #define ipl2tp_message_sccrq(t)\ ipl2tp_message_call(IPL2TP_MSG_SCCRQ, t, IP_NULL, IP_NULL) #define ipl2tp_message_sccrp(t,a)\ ipl2tp_message_call(IPL2TP_MSG_SCCRP, t, IP_NULL, a) #define ipl2tp_message_scccn(t,a)\ ipl2tp_message_call(IPL2TP_MSG_SCCCN, t, IP_NULL, a) #define ipl2tp_message_stopccn(t)\ ipl2tp_message_call(IPL2TP_MSG_StopCCN, t, IP_NULL, IP_NULL) #define ipl2tp_message_icrq(s)\ ipl2tp_message_call(IPL2TP_MSG_ICRQ, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_icrp(s)\ ipl2tp_message_call(IPL2TP_MSG_ICRP, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_iccn(s)\ ipl2tp_message_call(IPL2TP_MSG_ICCN, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_ocrq(s)\ ipl2tp_message_call(IPL2TP_MSG_OCRQ, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_ocrp(s)\ ipl2tp_message_call(IPL2TP_MSG_OCRP, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_occn(s)\ ipl2tp_message_call(IPL2TP_MSG_OCCN, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_cdn(s)\ ipl2tp_message_call(IPL2TP_MSG_CDN, (s)->tunnel, s, IP_NULL) #define ipl2tp_message_zlb(t)\ ipl2tp_message_call(IPL2TP_MSG_ZLB, t, IP_NULL, IP_NULL) #define ipl2tp_message_hello(t)\ ipl2tp_message_call(IPL2TP_MSG_HELLO, t, IP_NULL, IP_NULL) #define ipl2tp_message_sli(s)\ ipl2tp_message_call(IPL2TP_MSG_SLI, (s)->tunnel, s, IP_NULL) /* *--------------------------------------------------------------------------- * Result code *--------------------------------------------------------------------------- */ /* StopCCN result codes */ /*$$ BEGIN StopCCN_result_code $*/ #define IPL2TP_RES_StopCCN_GENERAL_REQUEST 1 /*$ General request to clear control connection $*/ #define IPL2TP_RES_StopCCN_GENERAL_ERROR 2 /*$ General error; Error code indicates the problem $*/ #define IPL2TP_RES_StopCCN_CHANNEL_EXISTS 3 /*$ Control channel already exists $*/ #define IPL2TP_RES_StopCCN_NOT_AUTHORIZED 4 /*$ Requester is not authorized to establish a control channel $*/ #define IPL2TP_RES_StopCCN_PROTOCOL_VERSION 5 /*$ The protocol version of the requester is not supported $*/ #define IPL2TP_RES_StopCCN_SHUTDOWN 6 /*$ Requester is being shut down $*/ #define IPL2TP_RES_StopCCN_STATE_MACHINE 7 /*$ Finite State Machine error $*/ /* CDN result codes */ #define IPL2TP_RES_CDN_LOSS_OF_CARRIER 1 /*$ Call disconnected due to loss of carrier $*/ #define IPL2TP_RES_CDN_GENERAL_ERROR 2 /*$ Call disconnected for the reason indicated in error code $*/ #define IPL2TP_RES_CDN_ADMINISTRATIVE 3 /*$ Call disconnected for administrative reasons $*/ #define IPL2TP_RES_CDN_RESOURCE_TEMP 4 /*$ Call failed due to temporary lack of appropriate facilities $*/ #define IPL2TP_RES_CDN_RESOURCE_PERM 5 /*$ Call failed due to permanent lack of appropriate facilities $*/ #define IPL2TP_RES_CDN_INVALID_DEST 6 /*$ Invalid destination $*/ #define IPL2TP_RES_CDN_NO_CARRIER 7 /*$ Call failed due to no carrier detected $*/ #define IPL2TP_RES_CDN_BUSY 8 /*$ Call failed due to detection of a busy signal $*/ #define IPL2TP_RES_CDN_NO_DIAL_TONE 9 /*$ Call failed due to lack of a dial tone $*/ #define IPL2TP_RES_CDN_TIMEOUT 10 /*$ Call was not established within time allotted by LAC $*/ #define IPL2TP_RES_CDN_FRAMING 11 /*$ Call was connected but no appropriate framing was detected $*/ #define IPL2TP_RES_CDN_SESSION_TIE_BREAKER 13 /*$ Call was connected but lost tie breaker $*/ #define IPL2TP_RES_CDN_PW_TYPE 14 /*$ Call was connected but no appropriate pw type was detected $*/ #define IPL2TP_RES_CDN_SEQUENCING_L2_SUBLAYER 15 /*$ Call was connected but sequencing required, no L2 sublayer present $*/ #define IPL2TP_RES_CDN_STATE_MACHINE 16 /*$ Call was connected but a state machine error occured $*/ /* Error codes */ #define IPL2TP_ERR_NO_CONTROL_CONN 1 /*$ No control connection exists yet for this LAC-LNS pair $*/ #define IPL2TP_ERR_WRONG_LENGTH 2 /*$ Length is wrong $*/ #define IPL2TP_ERR_OUT_OF_RANGE 3 /*$ One of the fields was out of range or reserved field was non-zero $*/ #define IPL2TP_ERR_RESOURCE_LIMIT 4 /*$ Insufficient resources to handle this operation now $*/ #define IPL2TP_ERR_SESSION_ID 5 /*$ The Session ID is invalid in this context $*/ #define IPL2TP_ERR_VENDOR_ERROR_LAC 6 /*$ A generic vendor-specific error occurred in the LAC $*/ #define IPL2TP_ERR_TRY_ANOTHER_LNS 7 /*$ Try another LNS destination, if possible $*/ #define IPL2TP_ERR_UNKNOWN_M_AVP 8 /*$ Shutdown due to receipt of an unknown AVP with the M-bit set $*/ /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* *=========================================================================== * Ipl2tp_admin *=========================================================================== * * Message administration stuff. */ typedef struct Ipl2tp_admin { Ipcom_list head; /* List header */ Ipcom_tmo timer; /* Timer control block */ Ipl2tp_tunnel *tunnel; /* Tunnel descriptor */ Ipl2tp_session *session; /* Session descriptor */ Ip_u16 timeout; /* Current timeout */ Ip_u8 retransmit; /* Retransmit counter */ Ip_u8 flags; /* Flags */ Ip_u16 size; /* Total size */ Ip_u16 pre_header; /* Pre header (IP/IP) */ void *digest; /* Pointer to digest */ void *rv_value; /* Random vector value */ Ip_u16 rv_length; /* Random vector length */ Ip_u16 *nr; /* Pointer to NR */ Ip_u16 *ns; /* Pointer to NS */ Ip_u16 *length; /* Length field */ Ip_u8 *start; /* Start of header */ Ip_bool is_zlb; /* Is it a ZLB? */ } Ipl2tp_admin; /* The various message forms */ typedef union Ipl2tp_header { Ipl2tp_v3_header v3; /* L2TPv3 control */ Ipl2tp_v2_header v2; /* L2TPv2 control */ } Ipl2tp_header; /* *=========================================================================== * Ipl2tp_container *=========================================================================== * * Message descriptor with additional headers and stuff. */ typedef struct Ipl2tp_message { Ipl2tp_admin admin; /* Admin data */ Ip_u32 session; /* When doing tunneling over IP */ Ipl2tp_header header; /* Header */ } Ipl2tp_message; /* **************************************************************************** * 6 FUNCTIONS **************************************************************************** */ /* *=========================================================================== * ipl2tp_message_name *=========================================================================== * Description: Get name of message. * Parameters: type - Message type. * Returns: Human readable message name. * */ IP_GLOBAL CONST char * ipl2tp_message_name(Ip_u16 message_type); /* *=========================================================================== * ipl2tp_message_recognized *=========================================================================== * Description: Check if message is recognized. * Parameters: type - Message type. * Returns: IP_TRUE if message type is recognized, IP_FALSE otherwise. * */ IP_GLOBAL Ip_bool ipl2tp_message_recognized(Ip_u16 message_type); /* *=========================================================================== * ipl2tp_message_new *=========================================================================== * Description: Allocate a new L2TP control container. * Parameters: tunnel - The tunnel the container belongs to. * session - The session the container belongs to. * Returns: The container if successful; IP_NULL otherwise. * */ IP_GLOBAL Ipl2tp_message *ipl2tp_message_new(Ipl2tp_tunnel *tunnel, Ipl2tp_session *session); /* *=========================================================================== * ipl2tp_message_delete *=========================================================================== * Description: Delete a L2TP control container * Parameters: container - The container * Returns: * */ IP_GLOBAL void ipl2tp_message_delete(Ipl2tp_message *container); /* *=========================================================================== * ipl2tp_message_is_zlb *=========================================================================== * Description: Mark container as ZLB * Parameters: container - The container * Returns: * */ IP_GLOBAL void ipl2tp_message_is_zlb(Ipl2tp_message *container); /* *=========================================================================== * ipl2tp_message_rq *=========================================================================== * Description: Send appropriate request based on type of session. * Parameters: session - The session the container belongs to. * Returns: * */ IP_GLOBAL Ipl2tp_status ipl2tp_message_rq(Ipl2tp_session *session); #ifdef __cplusplus } #endif #endif /* **************************************************************************** * END OF FILE **************************************************************************** */