[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/protocol/interface/general/rfc2507_lib_common.h b/mcu/protocol/interface/general/rfc2507_lib_common.h
new file mode 100644
index 0000000..7ccddc1
--- /dev/null
+++ b/mcu/protocol/interface/general/rfc2507_lib_common.h
@@ -0,0 +1,769 @@
+/******************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2007
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*******************************************************************************/
+
+/*******************************************************************************
+ * Filename:
+ * --------------------------------------------------------
+ *   rfc2507_lib_comon.h
+ *
+ * Project:
+ * --------------------------------------------------------
+ *   MONZA
+ *
+ * Description:
+ * --------------------------------------------------------
+ *   RFC2507 library common enums, macros and function declarations
+ *
+ * Author:
+ * --------------------------------------------------------
+ * -------
+ *
+ * --------------------------------------------------------
+ * $Log$
+ *
+ * 12 12 2014 tc.chang
+ * [MOLY00087434] [Universal Bin] Check in.
+ * RFC2507
+ *
+ * 07 25 2012 andrew.wu
+ * [MOLY00001136] [RFC2507]Change KAL API usage
+ * change kal_get_time() to kal_get_systicks()
+ *
+ * 03 15 2012 andrew.wu
+ * removed!
+ * Modification for GCC migration
+ *
+ * 08 08 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 08 07 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 08 07 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 08 03 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 08 03 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 07 26 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 06 12 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 06 03 2011 tc.chang
+ * removed!
+ * Send FULL_HEADER if the length of compressed header is larger than the length of the original header.
+ * .
+ *
+ * 05 25 2011 tc.chang
+ * removed!
+ * .
+ *
+ * 12 14 2010 max.yin
+ * removed!
+ * .
+ *
+ * 10 18 2010 max.yin
+ * removed!
+ * .
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ ******************************************************************************/
+
+#ifndef  _RFC2507_LIB_COMMON_H
+#define  _RFC2507_LIB_COMMON_H
+
+#include "kal_public_api.h"
+#include "kal_public_defs.h"
+#include "kal_general_types.h"
+#include "rfc2507_lib.h"
+
+/* Macro */
+#if !defined(__MTK_TARGET__) && defined(__RFC2507_CHECK_MEM_LEAK__)
+
+/* For MoDOS UT environment. */
+#define rfc2507_alloc_sys_mem(size) rfc2507_get_ctrl_buffer(size, __FILE__, __LINE__)
+#define rfc2507_dealloc_sys_mem(ptr) rfc2507_free_ctrl_buffer(ptr, __FILE__, __LINE__)
+extern void* rfc2507_get_ctrl_buffer(kal_uint16 size, kal_char * file_name, kal_uint32 line);
+extern void rfc2507_free_ctrl_buffer(void* buf, kal_char * file_name, kal_uint32 line);
+#else /* __RFC2507_CHECK_MEM_LEAK__ */
+
+/* Target load  */
+#define rfc2507_alloc_sys_mem(size) get_ctrl_buffer(size)
+#define rfc2507_dealloc_sys_mem(ptr) free_ctrl_buffer(ptr)
+#endif /* __RFC2507_CHECK_MEM_LEAK__ */
+
+#define BITS_PER_BYTE 8
+
+/*
+ * Macros for determining RFC2507 PID values from a supplied base
+ * (RFC2507_PARAMETERS FirstPid).
+ */
+#define RFC2507_FULL_HEADER_PID(x)              (x + 0)
+#define RFC2507_COMPRESSED_TCP_PID(x)           (x + 1)
+#define RFC2507_COMPRESSED_TCP_NODELTA_PID(x)   (x + 2)
+#define RFC2507_COMPRESSED_NON_TCP_PID(x)       (x + 3)
+#define RFC2507_CONTEXT_STATE_PID(x)            (x + 4)
+#define RFC2507_REGULAR_HEADER_PID              (0xFE)
+
+/* MUST skip 0 for TCP packet SN when compressing TCP header.
+ * Also used for differentiation in Rfc2507ProcessStoredPacket().
+ */
+#define INVALID_TCP_PSN         0
+
+/*
+ * A constant defining the maximum number of IP sub-header length fields that
+ * may be used for a FULL_HEADER packet
+ */
+#define FULL_HEADER_MAX_LENGTH_FIELDS       2
+
+/*
+ *  2009.4.14 Robert add
+ *  Max. subheader number in SUB_HEADER_CHAIN_LIST.
+ */
+#define RFC2507_MAX_SUB_HEADER_CHAIN_NUM    10
+
+/*
+ * Definitions of special values for TLV-encoding options
+ */
+#define TLV_OPTION_TYPE_PAD1    0
+#define TLV_OPTION_TYPE_PADN    1
+
+/*
+ * Contants for determining the type of an IP packet
+ */
+#define IP_VERSION_NUMBER_MASK  0xF0
+#define IP_V4_VERSION_NUMBER    0x40
+#define IP_V6_VERSION_NUMBER    0x60
+
+/*
+ * Constants and macro for determining the length of IP_V4_SUB_HEADER
+ */
+#define IP_V4_IHL_MASK          0x0F
+#define IP_V4_MINIMUM_IHL       5
+#define IP_V4_LEN_OFFSET        0
+#define BYTES_PER_IP_V4_LEN(x)  (((x) & IP_V4_IHL_MASK) * 4)
+#define IP_V4_HAS_OPTIONS(x)    (((x) & IP_V4_IHL_MASK) != IP_V4_MINIMUM_IHL)
+
+/*
+ * Constants and macros for determining that the IPv4 packet is a fragment
+ */
+#define IP_V4_FLAGS_OFFSET      6
+#define IP_V4_FLAGS_MASK        0xE0
+#define IP_V4_FLAGS_SHIFT       5
+#define IP_V4_FLAGS(x)          (((x) & IP_V4_FLAGS_MASK) >> IP_V4_FLAGS_SHIFT)
+#define IP_V4_MF_FLAG           0x01
+#define IP_V4_MF_FLAG_IS_SET(x) (0 != (IP_V4_FLAGS(x) & IP_V4_MF_FLAG))
+#define IP_V4_FRAGMENT_FIELD    6
+#define IP_V4_FRAGMENT_MASK     0x1FFF
+
+/*
+ * Macro for determining the position of the IP_V4_TYPE_OF_SERVICE field in a
+ * IP_V4_SUB_HEADER
+ */
+#define IP_V4_TYPE_OF_SERVICE_OFFSET    1
+#define IP_V4_TYPE_OF_SERVICE_DEF_MASK  0xFC
+
+/*
+ * Macro for determining positions of IPv4 fields
+ */
+#define IP_V4_TOTAL_LENGTH_OFFSET       2
+#define IP_V4_IDENTIFICATION_OFFSET     4
+#define IP_V4_IDENTIFICATION_LENGTH     2
+#define IP_V4_PROTOCOL_OFFSET           9
+#define IP_V4_CHECKSUM_OFFSET           10
+
+#define IP_V4_SUB_HEADER_LEN            20
+#define IP_V6_SUB_HEADER_LEN            40
+
+#define IP_V6_PAYLOAD_LENGTH_OFFSET     4
+#define IP_V6_PROTOCOL_OFFSET           6
+#define IP_V6_ADDRESS_LENGTH            16
+
+/*
+ * Constant and macro to determine the length of HOP_BY_HOP_OPTIONS_SUB_HEADER,
+ * DESTINATION_OPTIONS_SUB_HEADER and ROUTING_SUB_HEADER
+ */
+#define HDR_EXT_LEN_OFFSET              1
+#define BYTES_PER_HDR_EXT_LEN(x)        (((x) + 1) * 8)
+
+#define TLV_OPTION_DATA_OFFSET          2
+
+/*
+ * Constant for determining the type of the sub-header after
+ * HOP_BY_HOP_OPTIONS_SUB_HEADER, DESTINATION_OPTIONS_SUB_HEADER,
+ * ROUTING_SUB_HEADER, FRAGMENT_SUB_HEADER and AUTHENTICATION_SUB_HEADER
+ */
+#define NEXT_HEADER_PROTOCOL_OFFSET     0
+
+/*
+ * Constants defining the positions of the "type" and "segments left" fields of
+ * the ROUTING_SUB_HEADER
+ */
+#define ROUTING_TYPE_OFFSET             2
+#define ROUTING_SEGMENTS_LEFT_OFFSET    3
+
+#define FRAGMENT_SUB_HEADER_LEN         8
+
+/*
+ * Macros to determine the length of AUTHENTICATION_SUB_HEADER
+ */
+#define AUTHENTICATION_LEN_OFFSET       1
+#define BYTES_PER_AUTHENTICATION_LEN(x) (((x) + 2) * 4)
+#define AUTHENTICATION_DATA_OFFSET      8
+
+/*
+ * Macros to determine the length of MINIMAL_ENCAPSULATION_SUB_HEADER
+ */
+#define MINIMAL_ENCAPSULATION_LEN_OFFSET 1
+#define BYTES_PER_MINIMAL_ENCAPSULATION_LEN(x)  (((x) & 0x80) ? 12 : 8)
+#define MINIMAL_ENCAPSULATION_CHECKSUM_OFFSET 2
+
+#define ESP_SUB_HEADER_LEN              4
+
+#define TCP_LEN_OFFSET                  12
+#define BYTES_PER_TCP_LEN(x)            (((x) >> 4) * 4)
+#define MIN_TCP_SUB_HEADER_LEN          20
+
+#define UDP_LENGTH_OFFSET               4
+#define UDP_CHECKSUM_OFFSET             6
+#define UDP_CHECKSUM_LENGTH             2
+#define UDP_SUB_HEADER_LEN              8
+
+#define PROTOCOL_NUMBER_TCP             6
+
+/*
+ *  2009.4.14 Robert add
+ *  Subheader chain operation macro.
+ */
+#define GET_SUB_HDR_ITEM(_pList_, _Index_) \
+    ( &((_pList_)->HdrItem[_Index_]) )
+
+#define GET_FIRST_HDR(_pList_)  Rfc2507_GetFirstSubHdrItem((SUB_HEADER_CHAIN_LIST  *)_pList_)
+#define GET_LAST_HDR(_pList_)   Rfc2507_GetLastSubHdrItem((SUB_HEADER_CHAIN_LIST  *)_pList_)
+#define GET_NEXT_HDR(_pList_)   Rfc2507_GetNextSubHdrItem((SUB_HEADER_CHAIN_LIST  *)_pList_)
+#define GET_PREV_HDR(_pList_)   Rfc2507_GetPrevSubHdrItem((SUB_HEADER_CHAIN_LIST  *)_pList_)
+
+/* Remember to modify the mapping table */
+typedef enum
+{
+    RFC2507_INT_DECOMPRESS_SUCCESS,
+    RFC2507_INT_DECOMPRESS_SUCCESS_MORE_TO_GO,
+    RFC2507_TCP_DECOMPRESS_SUCCESS_RCV_CONTEXT_STATE,
+    RFC2507_TCP_DECOMPRESS_FAIL_CANNOT_CREATE_CID,
+    RFC2507_TCP_DECOMPRESS_FAIL_NO_PACKET_IN_WINDOW,
+    RFC2507_TCP_DECOMPRESS_FAIL_CID_NO_EXIST,
+    RFC2507_TCP_DECOMPRESS_FAIL_CAN_BE_FREED_SEND_CONTEXT_STATE,
+    RFC2507_TCP_DECOMPRESS_FAIL_CAN_BE_FREED,
+    RFC2507_NON_TCP_DECOMPRESS_FAIL_CAN_BE_FREED,
+    RFC2507_NON_TCP_DECOMPRESS_FAIL_STORED,
+    RFC2507_DECOMPRESS_UNKNOWN_PID_TYPE,
+    NO_OF_RFC2507_INTERNAL_DECOMPRESS_RESULT,
+    INVALID_RFC2507_INTERNAL_DECOMPRESS_RESULT
+} RFC2507_INTERNAL_DECOMPRESS_RESULT_ENUM;
+
+/*
+ * SUB_HEADER_TYPE: Enumeration listing the types of sub-header supported
+ * and the number of sub-headers supported.
+ */
+typedef enum
+{
+    IP_V4_SUB_HEADER,
+    IP_V6_SUB_HEADER,
+    HOP_BY_HOP_OPTIONS_SUB_HEADER,
+    DESTINATION_OPTIONS_SUB_HEADER,
+    ROUTING_SUB_HEADER,
+    FRAGMENT_SUB_HEADER,
+    AUTHENTICATION_SUB_HEADER,
+    ESP_SUB_HEADER,                     /* Encapsulating Security Payload */
+    MINIMAL_ENCAPSULATION_SUB_HEADER,
+    TCP_SUB_HEADER,
+    UDP_SUB_HEADER,
+    NO_NEXT_SUB_HEADER,
+    NO_SUB_HEADERS
+} SUB_HEADER_TYPE;
+
+/*
+ * SUB_HEADER_LIST: Structure used for lists of sub-headers in CID information
+ */
+typedef struct
+{
+    kal_uint16      Offset;     /*
+                                 * Offset of the start of the sub-header
+                                 * from the start of the SDU (in bytes)
+                                 */
+    SUB_HEADER_TYPE Type;       /*
+                                 * The type of the sub-header at this offset
+                                 */
+} SUB_HEADER_LIST;
+
+/*
+ * FIELD_COMPRESSION_TYPE: Enumeration listing the field types for compression
+ * and decompression of sub-headers
+ */
+typedef enum
+{
+    NOCHANGE_FIELD,
+    DELTA_FIELD,
+    RANDOM_FIELD,
+    INFERRED_FIELD
+} FIELD_COMPRESSION_TYPE;
+
+/*
+ * FIELD_DEFINING_TYPE: Enumeration listing the field types for defining packet
+ * streams for compression of sub-headers
+ */
+typedef enum
+{
+    NOT_DEF_FIELD,
+    DEF_FIELD,
+    ROUTING_TYPE_0_DEF_FIELD
+} FIELD_DEFINING_TYPE;
+
+/*
+ * FIELD_INFO: Structure to hold information on the fields in a sub-header
+ */
+typedef struct
+{
+    kal_uint16              Start;      /*
+                                         * The position of the start of the
+                                         * field in terms of bits from the
+                                         * start of the sub-header
+                                         */
+    kal_uint8               Length;     /*
+                                         * The length of the field in bits
+                                         */
+    FIELD_COMPRESSION_TYPE  Type;       /*
+                                         * The type of the field for
+                                         * compression purposes
+                                         */
+    FIELD_DEFINING_TYPE     Defining;   /*
+                                         * Indicates how this field is used in
+                                         * defining the packet stream (CID)
+                                         */
+} FIELD_INFO;
+
+/*
+ * SUB_HEADER_INFO: Structure to hold information on the sub-headers
+ */
+typedef struct
+{
+    SUB_HEADER_TYPE     Type;           /*
+                                         * A unique identifier indicating the
+                                         * type of the sub-header
+                                         */
+    kal_uint8           Protocol;       /*
+                                         * The value of the field in the
+                                         * previous sub-header that identifies
+                                         * this type sub-header follows. Not
+                                         * necessarily unique.
+                                         */
+    kal_uint8           NoFields;       /*
+                                         * The number of fields in the
+                                         * sub-header, indicating the number
+                                         * of elements in the FieldInfo array
+                                         * that follows
+                                         */
+    const FIELD_INFO   *FieldInfo;      /*
+                                         * An array of structures, with each
+                                         * element in the array describing a
+                                         * field within the sub-header
+                                         */
+} SUB_HEADER_INFO;
+
+
+/*
+ * IP_V4_FIELDS: Enumeration listing the fields in an IPv4 sub-header, acting as
+ * an index to the Rfc2507SubHeaderInfo[IP_V4_SUB_HEADER].FieldInfo array of FIELD_INFO, with the last item in
+ * this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    IP_V4_VERSION,
+    IP_V4_IHL,
+    IP_V4_TYPE_OF_SERVICE,
+    IP_V4_TOTAL_LENGTH,
+    IP_V4_IDENTIFICATION,
+    IP_V4_FLAG,
+    IP_V4_FRAGMENT_OFFSET,
+    IP_V4_TIME_TO_LIVE,
+    IP_V4_PROTOCOL,
+    IP_V4_HEADER_CHECKSUM,
+    IP_V4_SOURCE_ADDRESS,
+    IP_V4_DESTINATION_ADDRESS,
+    NO_IP_V4_FIELDS
+} IP_V4_FIELDS;
+
+/*
+ * IP_V6_FIELDS: Enumeration listing the fields in an IPv6 sub-header, acting as
+ * an index to the Rfc2507SubHeaderInfo[IP_V6_SUB_HEADER].FieldInfo array of FIELD_INFO, with the last item in
+ * this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    IP_V6_VERSION,
+    IP_V6_TRAFFIC_CLASS,
+    IP_V6_FLOW_LABEL,
+    IP_V6_PAYLOAD_LENGTH,
+    IP_V6_NEXT_HEADER,
+    IP_V6_HOP_LIMIT,
+    IP_V6_SOURCE_ADDRESS,
+    IP_V6_DESTINATION_ADDRESS,
+    NO_IP_V6_FIELDS
+} IP_V6_FIELDS;
+
+/*
+ * HOP_BY_HOP_OPTIONS_FIELDS: Enumeration listing the fields in a hop-by-hop
+ * options sub-header, acting as an index to the Rfc2507SubHeaderInfo[HOP_BY_HOP_OPTIONS_SUB_HEADER].FieldInfo
+ * array of FIELD_INFO, with the last item in this enumeration defining the
+ * number of elements in that array
+ */
+typedef enum
+{
+    HOP_BY_HOP_OPTIONS_NEXT_HEADER,
+    HOP_BY_HOP_OPTIONS_HDR_EXT_LEN,
+    HOP_BY_HOP_OPTIONS_OPTION_TYPE,
+    HOP_BY_HOP_OPTIONS_OPTION_LENGTH,
+    HOP_BY_HOP_OPTIONS_OPTION_DATA,
+    NO_HOP_BY_HOP_OPTIONS_FIELDS
+} HOP_BY_HOP_OPTIONS_FIELDS;
+
+/*
+ * DESTINATION_OPTIONS_FIELDS: Enumeration listing the fields in a hop-by-hop
+ * options sub-header, acting as an index to the Rfc2507SubHeaderInfo[HOP_BY_HOP_OPTIONS_SUB_HEADER].FieldInfo
+ * array of FIELD_INFO, with the last item in this enumeration defining the
+ * number of elements in that array
+ */
+typedef enum
+{
+    DESTINATION_OPTIONS_NEXT_HEADER,
+    DESTINATION_OPTIONS_HDR_EXT_LEN,
+    DESTINATION_OPTIONS_OPTION_TYPE,
+    DESTINATION_OPTIONS_OPTION_LENGTH,
+    DESTINATION_OPTIONS_OPTION_DATA,
+    NO_DESTINATION_OPTIONS_FIELDS
+} DESTINATION_OPTIONS_FIELDS;
+
+/*
+ * ROUTING_FIELDS: Enumeration listing the fields in a routing sub-header,
+ * acting as an index to the Rfc2507SubHeaderInfo[ROUTING_SUB_HEADER].FieldInfo array of FIELD_INFO, with the
+ * last item in this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    ROUTING_NEXT_HEADER,
+    ROUTING_HDR_EXT_LEN,
+    ROUTING_ROUTING_TYPE,
+    ROUTING_SEGMENTS_LEFT,
+    ROUTING_TYPE_SPECIFIC_DATA,
+    NO_ROUTING_FIELDS
+} ROUTING_FIELDS;
+
+/*
+ * FRAGMENT_FIELDS: Enumeration listing the fields in a fragment sub-header,
+ * acting as an index to the Rfc2507SubHeaderInfo[FRAGMENT_SUB_HEADER].FieldInfo array of FIELD_INFO, with the
+ * last item in this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    FRAGMENT_NEXT_HEADER,
+    FRAGMENT_RESERVED,
+    FRAGMENT_OFFSET,
+    FRAGMENT_RES,
+    FRAGMENT_M,
+    FRAGMENT_IDENTIFICATION,
+    NO_FRAGMENT_FIELDS
+} FRAGMENT_FIELDS;
+
+/*
+ * AUTHENTICATION_FIELDS: Enumeration listing the fields in a authentification
+ * sub-header, acting as an index to the Rfc2507SubHeaderInfo[AUTHENTICATION_SUB_HEADER].FieldInfo array of
+ * FIELD_INFO, with the last item in this enumeration defining the number of
+ * elements in that array
+ */
+typedef enum
+{
+    AUTHENTICATION_NEXT_HEADER,
+    AUTHENTICATION_LENGTH,
+    AUTHENTICATION_RESERVED,
+    AUTHENTICATION_SPI,
+    AUTHENTICATION_DATA,
+    NO_AUTHENTICATION_FIELDS
+} AUTHENTICATION_FIELDS;
+
+/*
+ * ESP_FIELDS: Enumeration listing the fields in a ESP sub-header, acting as an
+ * index to the EspSubHeaderField array of FIELD_INFO, with the last item in
+ * this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    ESP_SPI,
+    ESP_DATA,
+    NO_ESP_FIELDS
+} ESP_FIELDS;
+
+/*
+ * MINIMAL_ENCAPSULATION_FIELDS: Enumeration listing the fields in a minimal
+ * encapsulation sub-header, acting as an index to the
+ * Rfc2507SubHeaderInfo[MINIMAL_ENCAPSULATION_SUB_HEADER].FieldInfo array of FIELD_INFO, with the last item in
+ * this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    MINIMAL_ENCAPSULATION_PROTOCOL,
+    MINIMAL_ENCAPSULATION_S_BIT,
+    MINIMAL_ENCAPSULATION_RESERVED,
+    MINIMAL_ENCAPSULATION_HEADER_CHECKSUM,
+    MINIMAL_ENCAPSULATION_ORIG_DEST_ADDR,
+    MINIMAL_ENCAPSULATION_ORIG_SRC_ADDR,
+    NO_MINIMAL_ENCAPSULATION_FIELDS
+} MINIMAL_ENCAPSULATION_FIELDS;
+
+/*
+ * TCP_FIELDS: Enumeration listing the fields in a TCP sub-header, acting as an
+ * index to the Rfc2507SubHeaderInfo[TCP_SUB_HEADER].FieldInfo array of FIELD_INFO, with the last item in
+ * this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    TCP_SOURCE_PORT,
+    TCP_DESTINATION_PORT,
+    TCP_SEQUENCE_NUMBER,
+    TCP_ACKNOWLEDGEMENT_NUMBER,
+    TCP_DATA_OFFSET,
+    TCP_RESERVED,
+    TCP_FLAGS,
+    TCP_WINDOW,
+    TCP_CHECKSUM,
+    TCP_URGENT_POINTER,
+    TCP_OPTIONS,
+    NO_TCP_FIELDS
+} TCP_FIELDS;
+
+/*
+ * UDP_FIELDS: Enumeration listing the fields in a UDP sub-header, acting as an
+ * index to the Rfc2507SubHeaderInfo[UDP_SUB_HEADER].FieldInfo array of FIELD_INFO, with the last item in
+ * this enumeration defining the number of elements in that array
+ */
+typedef enum
+{
+    UDP_SOURCE_PORT,
+    UDP_DESTINATION_PORT,
+    UDP_LENGTH,
+    UDP_CHECKSUM,
+    NO_UDP_FIELDS
+} UDP_FIELDS;
+
+/*
+ * SUB_HEADER_CHAIN_INFO: structure for items in a linked list describing the
+ * sub-headers in an IP packet
+ */
+typedef struct
+{
+    SUB_HEADER_TYPE Type;   /*
+                             * The type of the sub-header. Index to the
+                             * Rfc2507SubHeaderInfo array of structures.
+                             */
+    kal_uint16      Start;  /*
+                             * The byte offset of the start of the sub-header
+                             * from the start of the IP packet
+                             */
+    kal_uint16      Length; /*
+                             * The length in bytes of the sub-header
+                             */
+} SUB_HEADER_CHAIN_INFO;
+
+/*
+ *  2009.4.14 Robert add
+ *  Use array to replace Dlist queue
+ */
+typedef struct
+{
+    kal_uint8              HdrItemCount;    /* Count of the sub-header. */
+    kal_uint8              HdrItemCurrIdx;  /* index of Current item. */
+
+    SUB_HEADER_CHAIN_INFO  HdrItem[RFC2507_MAX_SUB_HEADER_CHAIN_NUM];
+                            /*
+                             * The byte offset of the start of the sub-header
+                             * from the start of the IP packet
+                             */
+} SUB_HEADER_CHAIN_LIST;
+
+typedef struct _WindowHeader
+{
+    struct _WindowHeader *pNext;
+    struct _WindowHeader *pPrev;
+    kal_uint8 *pPacket;
+    kal_uint16 PacketLen;
+    kal_uint16 PacketOffset;
+    kal_uint8 Pid;
+    kal_uint8 PacketInfo;
+    kal_uint8 L2HdrLength;
+    union
+    {
+        RFC2507_TIME_OF_DAY PacketTime;
+        kal_uint32 uwSequenceNo;
+    } uni;
+} WindowHeader;
+
+typedef struct
+{
+    kal_uint8 uCount;
+    WindowHeader *pHead;
+    WindowHeader *pTail;
+} WindowList;
+
+/*********** FUNCTION DECLARATION ****************************************************/
+
+INLINE_MODIFIER INLINE void Rfc2507_OS_CurrentTime(RFC2507_TIME_OF_DAY *currentTimeInTicks)
+{
+    *currentTimeInTicks = kal_get_systicks();
+}
+
+extern void Rfc2507_CidInfoInsertAtStart(RFC2507_CID_LIST *pCidInfoList,RFC2507_COMMON_CID *pNewCidInfo);
+extern void Rfc2507_CidInfoInsertAtEnd(RFC2507_CID_LIST *pCidInfoList,RFC2507_COMMON_CID *pNewCidInfo);
+extern void Rfc2507_CidInfoInsertAtBefore(RFC2507_CID_LIST *pCidInfoList, RFC2507_COMMON_CID *pCurrCidInfo,
+                               RFC2507_COMMON_CID *pNewCidInfo);
+extern void Rfc2507_CidInfoDeleteFromList(RFC2507_CID_LIST *pCidInfoList, RFC2507_COMMON_CID *pCidInfo);
+extern SUB_HEADER_CHAIN_INFO* Rfc2507_GetFirstSubHdrItem(SUB_HEADER_CHAIN_LIST *pSubHdrList );
+extern SUB_HEADER_CHAIN_INFO* Rfc2507_GetLastSubHdrItem(SUB_HEADER_CHAIN_LIST *pSubHdrList );
+extern SUB_HEADER_CHAIN_INFO* Rfc2507_GetNextSubHdrItem(SUB_HEADER_CHAIN_LIST *pSubHdrList );
+extern SUB_HEADER_CHAIN_INFO* Rfc2507_GetPrevSubHdrItem(SUB_HEADER_CHAIN_LIST *pSubHdrList );
+extern void Rfc2507_GetSubHeaderChainInfo(RFC2507_ENTITY_INFO *pEntity, kal_uint8* pPacket,
+                                          SUB_HEADER_CHAIN_LIST *pSubHdrList );
+extern kal_bool Rfc2507_IPv4IsFragment(kal_uint8 *SubHeader);
+extern kal_bool Rfc2507_IPv4IsRandom(kal_uint8 *SubHeader);
+extern kal_uint16 Rfc2507CalculateIpChecksum(kal_uint8 *pData, kal_uint32 length);
+extern kal_bool Rfc2507_CompareSubHeaderChains(kal_uint8  *Chain1, SUB_HEADER_CHAIN_LIST *pSubHdrList1,
+                                               kal_uint8  *Chain2, SUB_HEADER_CHAIN_LIST *pSubHdrList2);
+extern kal_uint16 Rfc2507_CompressOptions(kal_uint8 *dest, kal_uint32 compHdrOffset, const kal_uint8 *src, const kal_uint8 *saved, kal_uint16 size);
+extern kal_uint16 Rfc2507_DecompressOptions(kal_uint8 *saved, const kal_uint8 *src, kal_uint16 size);
+extern kal_bool Rfc2507ContextHasChanged(kal_uint8 *pInputSrc,
+                                         kal_uint8 *pSavedHeader,
+                                         SUB_HEADER_CHAIN_LIST *pSavedSubHdrList,
+                                         SUB_HEADER_CHAIN_LIST *pGivenSubHdrList,
+                                         kal_bool isTcpContext);
+extern kal_uint16 Rfc2507CalculateChecksum(kal_uint8 *pData,
+                                           kal_uint16 dataLength,
+                                           kal_uint8 *pPseudoHeader,
+                                           kal_uint16 pseudoHeaderLength);
+extern void Rfc2507InferFields(SUB_HEADER_CHAIN_LIST *pSubHdrList,
+                               kal_uint8 *pReconstitutedPacket,
+                               kal_uint16 uwPacketLength);
+extern kal_bool Rfc2507InitStoredPacket(RFC2507_DECOMPRESS_INPUT_INFO *pInput, WindowList *pList,
+                                        kal_uint32 unionValue, WindowHeader **pStoredPacket);
+extern void Rfc2507EmptyWindow(RFC2507_ENTITY_INFO *pEntity, WindowList *pList);
+extern void Rfc2507DeleteStoredPacket(WindowList *pList, WindowHeader *pWindowItem);
+extern kal_uint8 Rfc2507ProcessStoredPacket(RFC2507_DECOMPRESS_INPUT_INFO *pInput,
+                                            WindowList *pList,
+                                            kal_uint16 tcpExpectedPacketSn);
+extern kal_uint16 Rfc2507ReconsIpv4SubHeader(kal_uint8 *pSavedHeader,
+                                             kal_uint8 *pPosReceivedHeader,
+                                             SUB_HEADER_CHAIN_LIST *pSubHdrList,
+                                             SUB_HEADER_CHAIN_INFO *pItem,
+                                             kal_bool isTcpDelta,
+                                             kal_uint16 *pSavedHeaderLength);
+extern kal_uint16 Rfc2507DecompressRandomField(kal_uint8 *pSavedHeader,
+                                               kal_uint8 *pPosn,
+                                               SUB_HEADER_CHAIN_LIST *pSubHdrList,
+                                               kal_uint16 *pSavedHeaderLength,
+                                               kal_bool isTcpDelta);
+extern kal_bool Rfc2507CompressRandomField(RFC2507_COMPRESS_INPUT_INFO *pInput,
+                                           SUB_HEADER_CHAIN_LIST *pSubHdrList,
+                                           kal_uint8 *pSavedHeader,
+                                           kal_uint8 *pPosn,
+                                           kal_uint32 *pCompHdrOffset);
+kal_uint8 Rfc2507_BigEndGet8(kal_uint8 *pbSource);
+kal_uint16 Rfc2507_BigEndGet16(kal_uint8 *abSource);
+kal_uint32 Rfc2507_BigEndGet32(kal_uint8 *abSource);
+void Rfc2507_BigEndSet16(kal_uint16 usSource, kal_uint8 *abDestination);
+void Rfc2507_BigEndSet32(kal_uint32 ulSource, kal_uint8 *abDestination);
+
+/***** GLOBAL ************************************************************************/
+extern const SUB_HEADER_INFO Rfc2507SubHeaderInfo[NO_SUB_HEADERS];
+extern const kal_uint8 aRfc2507DecompressResultMappingTable[NO_OF_RFC2507_INTERNAL_DECOMPRESS_RESULT];
+
+#ifdef __RFC2507_PDCP_UT__
+extern kal_uint8 PDCP_UT_SLIDING_WINDOW_SIZE_g;
+#endif
+
+#endif /* _RFC2507_LIB_COMMON_H */