view src/g23m-gprs/sndcp/sndcp.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :  GPRS (8441)
|  Modul   :  sndcp.h
+-----------------------------------------------------------------------------
|  Copyright 2002 Texas Instruments Berlin, AG
|                 All rights reserved.
|
|                 This file is confidential and a trade secret of Texas
|                 Instruments Berlin, AG
|                 The receipt of or possession of this file does not convey
|                 any rights to reproduce or disclose its contents or to
|                 manufacture, use, or sell anything it may describe, in
|                 whole, or in part, without the specific written consent of
|                 Texas Instruments Berlin, AG.
|
|  These files implement Van Jacobson Compression algorithm which is taken from
|  University of California Berkley's Implementation.
|
|
|  "Copyright (c)1989 Regents of the University of California.
|  All rights reserved.Redistribution and use in source and binary forms are
|  permitted, provided that the above  copyright notice and this paragraph are
|  duplicated in all such forms and that any documentation advertising materials,
|  and  other materials related to such distributionand use acknowledge that the
|  software was developed by the University of California, Berkeley.
|  The name of the University may not be  used to endorse or promote products
|  derived from this software without specific  prior written permission. 
|  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
|  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND 
|  FITNESS FOR A PARTICULAR PURPOSE"
+-----------------------------------------------------------------------------
|  Purpose :  Definitions for the Protocol Stack Entity
|             SNDCP
+-----------------------------------------------------------------------------
*/

/*---- HISTORY --------------------------------------------------------------*/

#ifndef SNDCP_H
#define SNDCP_H

#ifndef _SNDCP_DTI_2_
#define _SNDCP_DTI_2_
#endif


#ifndef SNDCP_UPM_INCLUDED
#define SNDCP_UPM_INCLUDED
#endif


#include "prim.h"

#ifdef SNDCP_2to1

#ifndef T_desc_list3
#define T_desc_list3 T_LL_desc_list3
#endif
#ifndef T_ll_qos
#define T_ll_qos T_PS_qos_r97
#endif

#endif /* SNDCP_2to1 */

#ifdef TI_PS_FF_V42BIS
  #include "v42b_type.h"
#endif /* TI_PS_FF_V42BIS */

/*
 * Compiler switch for tracing of user data, e.q. TCP/IP header and payload
 * Payload is traced only if config primitive TRACE_PACKET_ON was received.
 */
#ifdef SNDCP_TRACE_ALL
 /*
  * compiler switch for tracing of a buffer as hex-dump
  */
  #define SNDCP_TRACE_BUFFER
#endif /* SNDCP_TRACE_ALL */

/*
 * compiler switch for tracing of decoded TCP/IP datagram
 * Per default only the 40 bytes or only decoded TCPIP header is traced.
 * Payload is traced only if config primitive TRACE_PACKET_ON was received.
 */
#define SNDCP_TRACE_IP_DATAGRAM
#define SNDCP_UL_PACKET              (0x1)
#define SNDCP_DL_PACKET              (0x2)

/*
 * defines the user of the vsi interface
 */
#define VSI_CALLER            SNDCP_handle,


/*
 * Macros
 */

 /*
 * This is just a TEMPORARY define until the issues with OPTION_MULTITHREAD
 * are settled. This define SHOULD be contained in GSM.H.
 */
#undef _ENTITY_PREFIXED
#define _ENTITY_PREFIXED(N) sndcp_##N

/*
 * Customized Trace Macros
 */
#ifndef TRACE_EVENT_P16
  #define TRACE_EVENT_P16(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)\
       vsi_o_event_ttrace(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16);
#endif /* TRACE_EVENT_P16 */
#ifndef TRACE_EVENT_P14
  #define TRACE_EVENT_P14(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14)\
       vsi_o_event_ttrace(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14);
#endif /* TRACE_EVENT_P14 */
#ifndef TRACE_EVENT_P12
  #define TRACE_EVENT_P12(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)\
       vsi_o_event_ttrace(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
#endif /* TRACE_EVENT_P12 */
#ifndef TRACE_EVENT_P10
  #define TRACE_EVENT_P10(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)\
       vsi_o_event_ttrace(f,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10);
#endif /* TRACE_EVENT_P10 */

/* 
 * The following macro is similar to PFREE_DESC2. Instead of doing
 * a PFREE(P) it does a MFREE(p). This macro is used to free primitives
 * like sn_data_req which are removed from SN SAP and added into this 
 * header file.
 */
#define MFREE_PRIM(p) { MFREE_DESC2 ((p)->desc_list2.first);      \
                        MFREE ((p));                              \
                      }

/*
 * Constants
 */

/*
 * Possible values for su->cia_state.
 */
#define CIA_IDLE      23
#define CIA_BUSY      23 /*29*/

/*
 * Maximum number of DTI links.
 */
#if defined (SNDCP_2to1) || defined (REL99)|| \
    defined (_SIMULATION_)
#define SNDCP_MAX_DTI_LINKS        16
#else
#define SNDCP_MAX_DTI_LINKS        3
#endif
/*
 * Maximum number of Van Jacobson header compressors.
 */
#define SNDCP_MAX_VJ_COUNT        1


/*
 * The default value for N201-I according to
 * GSM 4.64, version 6.51, table 9
 * For test purposes a smaller value is used.
 */
#ifdef _SIMULATION_
#define N201_I_DEFAULT    70
#else /* _SIMULATION_ */
#define N201_I_DEFAULT    1503
#endif /* _SIMULATION_ */


/*
 * The default value for N201-U according to
 * GSM 4.64, version 6.51, table 9.
 * For test purposes a smaller value is used.
 */
#ifdef _SIMULATION_
#define N201_U_DEFAULT    70
#else /* _SIMULATION_ */
#define N201_U_DEFAULT    500
#endif /* _SIMULATION_ */

/*
 * N-PDU size
 */
#define SNDCP_N_PDU_SIZE  750

/*
 * The re-establishment time for GSM 4.65, 6.2.1.4.
 */
#ifdef _SIMULATION_
#define MG_RE_EST_TIME    3000
#else /* _SIMULATION_ */
#define MG_RE_EST_TIME    3000
#endif /* _SIMULATION_ */

/*
 * Bitoffset for encoding/decoding
 */

#define ENCODE_OFFSET         (37 * 8)

/*
 * Byteoffset for encoding/decoding
 */

#define ENCODE_OFFSET_BYTE         37

/*
 * return values for procedures mg_decode_xid, mg_check_cnf_xid.
 */
/*
 * Parsed XID is ok (used for format and/or content).
 */
#define MG_XID_OK                   0
/*
 * Parsed XID block has incorrect content.
 */
#define MG_XID_BAD_CONTENT     1
/*
 * Parsed XID block was in bad format.
 */
#define MG_XID_BAD_FORMAT      2

/*
 * Other constants for service mg.
 */
/*
 * Maximal number of renegotiations in case of invalid cnf.
 */
#define MG_MAX_RENEGO  4
/*
 * Maximal number of compression entities: 32 each.
 */
#define MG_MAX_ENTITIES 32
/*
 * Maximum number of PCOMP values: 16.
 */
#define MG_MAX_PCOMP 16
/*
 * Maximum number of DCOMP values: 16.
 */
#define MG_MAX_DCOMP 16
/*
 * Possible values for service var 'mod_expects':
 */
#define MG_MOD_X_NONE   0xff
#define MG_MOD_X_REL    1
#define MG_MOD_X_EST    2
#define MG_MOD_X_READY  0
/*
 * State of compression entity or dcomp/pcomp value
 */
#define MG_UNASSIGNED 23
/*
 * State of compression entity or dcomp/pcomp value
 */
#define MG_SELECTED 37
/*
 * State of compression entity or dcomp/pcomp value
 */
#define MG_ASSIGNED 47
/*
 * Possible field lengths in xid blocks in case of omitted parameters.
 * acc. to GSM 4.65, 6.6.2.1.
 * for p bit == 1
 */
#define MG_DATA_P_0_NSAPIS_OM     0
#define MG_DATA_P_0_P0_OM         2
#define MG_DATA_P_0_P1_OM         3
#define MG_DATA_P_0_P2_OM         5

#define MG_HEADER_P_0_NSAPIS_OM   0
#define MG_HEADER_P_0_S0_M_1_OM   2

/*
 * The same for p bit == 0
 */
#define MG_DATA_P_1_NSAPIS_OM     1
#define MG_DATA_P_1_P0_OM         3
#define MG_DATA_P_1_P1_OM         4
#define MG_DATA_P_1_P2_OM         6

#define MG_HEADER_P_1_NSAPIS_OM   1
#define MG_HEADER_P_1_S0_M_1_OM   3


/*
 * Is the 'nsapis' parameter in xid block for data or header entity?
 */
#define MG_XID_V42_NSAPIS        23
#define MG_XID_VJ_NSAPIS         19



/*
 * number of implemented instances of service nu
 */
#define NU_NUM_INC 16

/*
 * LLC operation modes
 */
#define SNDCP_ACK   17
#define SNDCP_UNACK 37


/*
 * Number of unacknowledged segment numbers (acc to GSM 4.65: 3)
 */
#ifdef _SIMULATION_
#define SNDCP_SEGMENT_NUMBERS_UNACK     25
#else
#define SNDCP_SEGMENT_NUMBERS_UNACK     7
#endif /* _SIMULATION_ */

/*
 * Number of acknowledged segment numbers. This value is implementation
 * dependant. Here a bit mask of 32 is used in service sua to check the
 * confirmation status of a segmented N-PDU which then implies a maximum
 * number of 32.
 */
#define SNDCP_SEGMENT_NUMBERS_ACK     32

/* 
 * Maximum Segment Number in a Single NPDU which SNDCP will assemble 
 * in downlink. If SNDCP receives more than SNDCP_MAX_SEG_NUMBER segments
 * in one NPDU, SNDCP will discard the stored segments and will keep on
 * discarding the incoming segments till it receives the last segment.
 */
#define SNDCP_MAX_SEGMENT_NUMBER      100


/*
 * The resulting max value of the fully confirmed 32 segments mask.
 */
#define SNDCP_MAX_COMPLETE 4294967295

/*
 * The length of the queue for N-PDUs (in form of SN_UNITDATA_REQ prims).
 */
#define SN_UNITDATA_Q_LEN     SNDCP_NUMBER_OF_NSAPIS

/*
 * The length of the queue for N-PDUs (in form of SN_DATA_REQ prims).
 */
#define SN_DATA_Q_LEN     SNDCP_NUMBER_OF_NSAPIS

/*
 * The length of an SN Unitdata Pdu header, acc. to GSM 4.65 in bytes.
 * This SN-PDU is the first segment of an N-PDU. The octet for DCOMP and PCOMP
 * is included in the SN-UNITDATA PDU format.
 */
#define SN_UNITDATA_PDP_HDR_LEN_BIG   4


/*
 * The length of an SN Unitdata Pdu header, acc. to GSM 4.65 in bytes.
 * This SN-PDU is not the first segment of an N-PDU. The octet for DCOMP and
 * PCOMP is not included in SN-UNITDATA PDU format.
 */
#define SN_UNITDATA_PDP_HDR_LEN_SMALL   3

/*
 * The length of an SN Data Pdu header, acc. to GSM 4.65 in bytes.
 * This SN-PDU is the first segment of an N-PDU. The octet for DCOMP and PCOMP
 * is included in the SN-DATA PDU format.
 */
#define SN_DATA_PDP_HDR_LEN_BIG   3


/*
 * The length of an SN Data Pdu header, acc. to GSM 4.65 in bytes.
 * This SN-PDU is not the first segment of an N-PDU. The octet for DCOMP and
 * PCOMP is not included in the SN-DATA PDU PDU format. The octet with the
 * N-PDU number is not included in the SN-DATA PDU format.
 */
#define SN_DATA_PDP_HDR_LEN_SMALL   1



/*
 * Number of implemented instances of service su.
 */
#define SU_NUM_INC 4

/*
 * Number of implemented instances of service sua.
 */
#define SUA_NUM_INC 4

/*
 * number of implemented instances of service nd
 */
#define ND_NUM_INC 16

/*
 * number of implemented instances of service sd
 */
#define SD_NUM_INC 4

/*
 * number of implemented instances of service sda
 */
#define SDA_NUM_INC 4

/*
 * Maximum number of NSAPIs according to specification, implementation
 * independent.
 */
#define SNDCP_NUMBER_OF_NSAPIS 16

/*
 * Maximum number of LLC SAPIs according to specification, implementation
 * independent.
 */
#define SNDCP_NUMBER_OF_SAPIS 4

/*
 * Maximum N-pdu number in unacknowledged LLC operation mode
 */
#define MAX_NPDU_NUMBER_UNACK 4096

/*
 * Maximum N-pdu number in acknowledged LLC operation mode
 */
#define MAX_NPDU_NUMBER_ACK 256

/*
 * The implementation dependant length in bits for an XID block that
 * will be requested by the MS.
 */
#define SNDCP_XID_BLOCK_BIT_LEN 192

/*
 * Constants for filling the requested XID block.
 */
/*
 * The parameter type for version.
 */
#define SNDCP_XID_PARAM_TYPE_0      0
/*
 * Length of parameter type 0 in octets.
 */
#define SNDCP_XID_0_LEN             1
/*
 * Version number 0.
 */
#define SNDCP_XID_VERSION           0
/*
 * The parameter type for data compressors.
 */
#define SNDCP_XID_PARAM_TYPE_1      1
/*
 * Length of parameter type 1 in octets.
 * RES value 2 shorter because algorithm type and dcomp bytes omitted.
 */
#define SNDCP_XID_1_LEN             10
#define SNDCP_XID_1_LEN_RES          8
/*
 * P bit value 1.
 */
#define SNDCP_P_BIT_1         1
/*
 * P bit value 0.
 */
#define SNDCP_P_BIT_0         0
/*
 * Compressor entity 0.
 */
#define SNDCP_NTT_0           0
/*
 * the octet with | X | X | X | algorithm type.
 */
#define SNDCP_XID_V42               0
/*
 * Length of V42bis parameters in octets.
 * RES values 1 shorter because of omitted dcomp value.
 */
#define SNDCP_XID_V42_LEN           7
#define SNDCP_XID_V42_LEN_RES       6
/*
 * The octet with| DCOMP1 | X | will be set dynamically.
 * One default value.
 */
#define SNDCP_DCOMP1                      1
/*
 * The two octets with applicable nsapis will be set dynamically.
 * default value is SNDCP_NSAPIS_DEFAULT like in case of header compression.
 */
/*
 * The direction octet will be set dynamically, values may be
 * SNSM_COMP_NEITHER_DIRECT,
 * SNSM_COMP_MS_SGSN_DIRECT,
 * SNSM_COMP_SGSN_MS_DIRECT,
 * SNSM_COMP_BOTH_DIRECT
 * Default: SNSM_COMP_BOTH_DIRECT
 */
#ifndef SNDCP_UPM_INCLUDED
#define SNDCP_V42_DEFAULT_DIRECTION SNSM_COMP_BOTH_DIRECT
#else 
#define SNDCP_V42_DEFAULT_DIRECTION NAS_DCOMP_BOTH_DIRECT
#endif /* Compression parameters */ /* SNDCP_UPM_INCLUDED */
/*
 * The 2 P1 octets (max codewords) will be set dynamically.
 * Default value: 2048
 */
#define SNDCP_V42_DEFAULT_P1        2048
/*
 * The P2 (max char num) octet will be set dynamically.
 * Default value: 20
 */
#define SNDCP_V42_DEFAULT_P2        20
/*
 * The parameter type for header compressors.
 */
#define SNDCP_XID_PARAM_TYPE_2      2
/*
 * Length of parameter type 2 in octets
 * RES value 2 shorter because algorithm type and pcomp bytes omitted.
 */
#define SNDCP_XID_2_LEN_RES         5
#define SNDCP_XID_2_LEN             7
/*
 * The octet with | X | X | X | algorithm type.
 */
#define SNDCP_XID_VJ                0
/*
 * Length of VanJacobson parameters in octets.
 * RES value 1 shorter because pcomp byte omitted.
 */
#define SNDCP_XID_VJ_LEN            4
#define SNDCP_XID_VJ_LEN_RES        3
#define SNDCP_MAX_NUMBER_OF_VJ_SLOTS    16

/*
 * The octet with| PCOMP1 | PCOMP2 | will be set dynamically.
 * Two default values.
 */
#define SNDCP_PCOMP1                      1
#define SNDCP_PCOMP2                      2
/*
 * The two octets with applicable nsapis will be set dynamically.
 * Default value: 0
 */
#define SNDCP_NSAPIS_DEFAULT              0
/*
 * The octet with S0 - 1 will be set dynamically.
 * Default value: 15
 */
#define SNDCP_VJ_DEFAULT_S0_M_1              15

/*
 * "states" of nsapis and sapis that are stored in the arrays nsapi_state_ra
 * and sapi_state_ra
 */
#define MG_IDLE           0
/*
 * Waiting for LL_ESTABLISH_CNF.
 */
#define MG_EST            1
/*
 * Waiting for LL_XID_CNF.
 */
#define MG_XID            2
/*
 * Must send SNSM_ACTIVATE_RES.
 */
#define MG_ACT            4
/*
 * Waiting for LL_RELEASE_CNF.
 */
#define MG_REL            8
/*
 * Must send SNSM_DEACTIVATE_RES.
 */
#define MG_DEACT          0x10
/*
 * Waiting for SNSM_SEQUEMCE_IND.
 */
#define MG_SEQ            0x20
 /*
  * A local LL_RELEASE_REQ must be sent after the end of the running sub
  * procedure.
  */
#define MG_REL_NEC_LOC    0x40
 /*
  * An LL_XID_REQ must be sent after the end of the running sub procedure.
  */
#define MG_XID_NEC        0x80
 /*
  * An LL_ESTABLISH_REQ must be sent after the end of the running sub procedure.
  */
#define MG_EST_NEC        0x100
 /*
  * A non local LL_RELEASE_REQ must be sent after the end of the running sub
  * procedure.
  */
#define MG_REL_NEC_PEER   0x200
 /*
  * A LL_ESTABLISH_IND is expected or received
  */
#define MG_EST_IND        0x400

 /*
  * SNDCP got SN_DTI_REQ and the DTI information is stored !
  */
#define MG_DTI_INFO       0x800 


/*
 * Service definitions. Used to access service data with GET/SET_STATE.
 *
 * Services with multiple incarnation have to be defined as xxx->
 * Services with only one incarnation have to be defined as xxx.
 */
#define CIA                 cia.
#define MG                  mg.
#define NU                  nu->
#define SU                  su->
#define SUA                 sua->
#define ND                  nd->
#define PD                  pd->
#define PDA                 pda->
#define SD                  sd->
#define SDA                 sda->

/*
 * workaround for init
 */
#define NU_0                  nu->
#define NU_1                  nu->
#define NU_2                  nu->
#define NU_3                  nu->
#define NU_4                  nu->
#define NU_5                  nu->
#define NU_6                  nu->
#define NU_7                  nu->
#define NU_8                  nu->
#define NU_9                  nu->
#define NU_10                 nu->
#define NU_11                 nu->
#define NU_12                 nu->
#define NU_13                 nu->
#define NU_14                 nu->
#define NU_15                 nu->

#define SU_0                  su->
#define SU_1                  su->
#define SU_2                  su->
#define SU_3                  su->

#define SUA_0                 sua->
#define SUA_1                 sua->
#define SUA_2                 sua->
#define SUA_3                 sua->

#define ND_0                  nd->
#define ND_1                  nd->
#define ND_2                  nd->
#define ND_3                  nd->
#define ND_4                  nd->
#define ND_5                  nd->
#define ND_6                  nd->
#define ND_7                  nd->
#define ND_8                  nd->
#define ND_9                  nd->
#define ND_10                 nd->
#define ND_11                 nd->
#define ND_12                 nd->
#define ND_13                 nd->
#define ND_14                 nd->
#define ND_15                 nd->

#define SD_0                  sd->
#define SD_1                  sd->
#define SD_2                  sd->
#define SD_3                  sd->

#define SDA_0                 sda->
#define SDA_1                 sda->
#define SDA_2                 sda->
#define SDA_3                 sda->

#define PD_0                  pd->
#define PD_1                  pd->
#define PD_2                  pd->
#define PD_3                  pd->

#define PDA_0                 pda->
#define PDA_1                 pda->
#define PDA_2                 pda->
#define PDA_3                 pda->

#ifdef NTRACE
#undef SNDCP_TRACE_ALL    /* if NTRACE is defined, SNDCP_TRACE_ALL should be disabled */
#endif
/*
 * Service name definitions for trace purposes.
 */
#ifndef NTRACE

#define SERVICE_NAME_CIA     "CIA"

#define SERVICE_NAME_MG     "MG"

#define SERVICE_NAME_ND_0      "ND_0"
#define SERVICE_NAME_ND_1      "ND_1"
#define SERVICE_NAME_ND_2      "ND_2"
#define SERVICE_NAME_ND_3      "ND_3"
#define SERVICE_NAME_ND_4      "ND_4"
#define SERVICE_NAME_ND_5      "ND_5"
#define SERVICE_NAME_ND_6      "ND_6"
#define SERVICE_NAME_ND_7      "ND_7"
#define SERVICE_NAME_ND_8      "ND_8"
#define SERVICE_NAME_ND_9      "ND_9"
#define SERVICE_NAME_ND_10     "ND_10"
#define SERVICE_NAME_ND_11     "ND_11"
#define SERVICE_NAME_ND_12     "ND_12"
#define SERVICE_NAME_ND_13     "ND_13"
#define SERVICE_NAME_ND_14     "ND_14"
#define SERVICE_NAME_ND_15     "ND_15"

#define SERVICE_NAME_NU_0      "NU_0"
#define SERVICE_NAME_NU_1      "NU_1"
#define SERVICE_NAME_NU_2      "NU_2"
#define SERVICE_NAME_NU_3      "NU_3"
#define SERVICE_NAME_NU_4      "NU_4"
#define SERVICE_NAME_NU_5      "NU_5"
#define SERVICE_NAME_NU_6      "NU_6"
#define SERVICE_NAME_NU_7      "NU_7"
#define SERVICE_NAME_NU_8      "NU_8"
#define SERVICE_NAME_NU_9      "NU_9"
#define SERVICE_NAME_NU_10     "NU_10"
#define SERVICE_NAME_NU_11     "NU_11"
#define SERVICE_NAME_NU_12     "NU_12"
#define SERVICE_NAME_NU_13     "NU_13"
#define SERVICE_NAME_NU_14     "NU_14"
#define SERVICE_NAME_NU_15     "NU_15"

#define SERVICE_NAME_SU_0      "SU_0"
#define SERVICE_NAME_SU_1      "SU_1"
#define SERVICE_NAME_SU_2      "SU_2"
#define SERVICE_NAME_SU_3      "SU_3"

#define SERVICE_NAME_SUA_0      "SUA_0"
#define SERVICE_NAME_SUA_1      "SUA_1"
#define SERVICE_NAME_SUA_2      "SUA_2"
#define SERVICE_NAME_SUA_3      "SUA_3"

#define SERVICE_NAME_SD_0      "SD_0"
#define SERVICE_NAME_SD_1      "SD_1"
#define SERVICE_NAME_SD_2      "SD_2"
#define SERVICE_NAME_SD_3      "SD_3"

#define SERVICE_NAME_SDA_0      "SDA_0"
#define SERVICE_NAME_SDA_1      "SDA_1"
#define SERVICE_NAME_SDA_2      "SDA_2"
#define SERVICE_NAME_SDA_3      "SDA_3"

#define SERVICE_NAME_PD_0      "PD_0"
#define SERVICE_NAME_PD_1      "PD_1"
#define SERVICE_NAME_PD_2      "PD_2"
#define SERVICE_NAME_PD_3      "PD_3"

#define SERVICE_NAME_PDA_0     "PDA_0"
#define SERVICE_NAME_PDA_1     "PDA_1"
#define SERVICE_NAME_PDA_2     "PDA_2"
#define SERVICE_NAME_PDA_3     "PDA_3"

#endif /* !NTRACE */


/*
 * 1 re-establishment timer for each sapi.
 */
#define TIMER_MAX     4


/*
 * State definitions for each service.
 */
#define CIA_DEFAULT                           23
                                              
#define MG_DEFAULT                             7
                                              
#define NU_UNACK_SU_RECEPTIVE                  8
#define NU_UNACK_SU_NOT_RECEPTIVE              9
                                              
#define NU_ACK_SUA_RECEPTIVE                  10
#define NU_ACK_SUA_NOT_RECEPTIVE              11
#define NU_SUS_SUA_RECEPTIVE                  12
#define NU_SUS_SUA_NOT_RECEPTIVE              13
#define NU_REC_SUA_NOT_RECEPTIVE              14

#ifndef NCONFIG

#define NU_SEND_UNACK_SU_RECEPTIVE            60
#define NU_SEND_UNACK_SU_NOT_RECEPTIVE        61

#define NU_SEND_ACK_SUA_RECEPTIVE             62
#define NU_SEND_ACK_SUA_NOT_RECEPTIVE         63
#define NU_SEND_SUS_SUA_RECEPTIVE             64
#define NU_SEND_SUS_SUA_NOT_RECEPTIVE         65
#define NU_SEND_REC_SUA_NOT_RECEPTIVE         66

#endif


#define SU_LLC_NOT_RECEPTIVE                  22
#define SU_LLC_RECEPTIVE                      23
#define SU_LLC_RECEPTIVE_SUSPEND              24
#define SU_LLC_NOT_RECEPTIVE_SUSPEND          26

#define SUA_LLC_NOT_RECEPTIVE                 82
#define SUA_LLC_RECEPTIVE                     83
#define SUA_LLC_RECEPTIVE_SUSPEND             84
#define SUA_LLC_NOT_RECEPTIVE_SUSPEND         86

#define ND_DEFAULT                            31
#define ND_RECOVER                            37
#define ND_SUSPEND                            41

#define SD_DEFAULT                            44
#define SD_UNACK_DISCARD                      45
#define SD_UNACK_RECEIVE_FIRST_SEGMENT        46
#define SD_UNACK_RECEIVE_SUBSEQUENT_SEGMENT   47
#define SD_UNACK_WAIT_NSAPI                   48

#define PD_DEFAULT                            50

#define PDA_DEFAULT                           70

#define SDA_DEFAULT                           64
#define SDA_ESTABLISH_REQUESTED               65
#define SDA_RECEIVE_FIRST_SEGMENT             66
#define SDA_RECEIVE_SUBSEQUENT_SEGMENT        67
#define SDA_WAIT_NSAPI                        68
#define SDA_ACK_DISCARD                       69



/*==== TYPES ======================================================*/
/*
 * Value constants for VAL_seg_pos
 */
#define SEG_POS_NONE                   (0x0)      /* In between */
#define SEG_POS_FIRST                  (0x1)      /* first      */
#define SEG_POS_LAST                   (0x2)      /* last       */
#define SEG_POS_FIRST_LAST             (0x3)  /* both       */
/*
 * Value constants for algo_type
 */
#define CIA_ALGO_V42                   (0x0)  /* V42bis algorithm */
/*
 * Value constants for comp_inst
 */
#define CIA_COMP_INST_V42_0            (0x0)  /* first instance for V42bis */

/*
 * The following definitions was originally generated by CCD. 
 * The definitions are not used as 
 * primitive definitions anymore, only for SNDCP internal usage.
 */

typedef struct
{
  U8                        delay;        /*<1> delay class       */
  U8                        relclass;     /*<1> Reliability class */
  U8                        peak;         /*<1> peak throughput   */
  U8                        preced;       /*<1> Precedence class  */
  U8                        mean;         /*<1> main throughput   */
  U8                        _align0;      /*<1> alignment         */
  U8                        _align1;      /*<1> alignment         */
  U8                        _align2;      /*<1> alignment         */
} T_cia_qos;

#ifndef __T_pdu_ref__
#define __T_pdu_ref__
typedef struct
{
  U16                       ref_npdu_num; /*<2> ref_npdu_num      */
  U8                        ref_seg_num;  /*<1> ref_seg_num       */
  U8                        ref_nsapi;    /*<1> ref_nsapi         */
} T_pdu_ref;
#endif

typedef struct
{
  U8               sapi;         /*<1> service access point identifier  */
  U8               algo_type;    /*<1> algorithm type                   */
  U8               comp_inst;    /*<1> compressor instance              */
  U8               packet_type;  /*<1> Type of packet.                  */
  T_pdu_ref        pdu_ref;      /*<8> to the segment to be confirmed   */
  T_desc_list2     desc_list2;   /*<8> list of generic data descriptors */
} T_CIA_COMP_REQ;


typedef struct
{
  U8                sapi;         /*<1> service access point identifier     */
  U8                algo_type;    /*<1> algorithm type                      */
  U8                comp_inst;    /*<1> compressor instance                 */
  U8                seg_pos;      /*<1> First and/or last segment of N-PDU? */
  U8                packet_type;  /*<1> Type of packet.                     */
  U8                _align0;      /*<1> alignment                           */
  U8                _align1;      /*<1> alignment                           */
  U8                _align2;      /*<1> alignment                           */
  U32               tlli;         /*<4> temporary logical link identifier   */
  T_cia_qos         cia_qos;      /*<8> quality of service                  */
  T_pdu_ref         pdu_ref;      /*<8> to the segment to be confirmed      */
  T_desc_list3      desc_list3;   /*<8> List of generic data descriptors    */
} T_CIA_COMP_IND;


typedef struct
{
  U8                 sapi;         /*<1> service access point identifier     */
  U8                 _align0;      /*<1> alignment                           */
  U8                 _align1;      /*<1> alignment                           */
  U8                 _align2;      /*<1> alignment                           */
  U32                tlli;         /*<4> temporary logical link identifier   */
  T_pdu_ref          pdu_ref;      /*<8> to the segment to be confirmed      */
  U8                 algo_type;    /*<1> algorithm type                      */
  U8                 comp_inst;    /*<1> compressor instance                 */
  U8                 seg_pos;      /*<1> First and/or last segment of N-PDU? */
  U8                 pcomp;        /*<1> from sn pdu                         */
  T_sdu              sdu;          /*< > service data unit                   */
} T_CIA_DECOMP_REQ;

typedef struct
{
  U8                 algo_type;    /*<1> algorithm type                   */
  U8                 comp_inst;    /*<1> compressor instance              */
  U8                 pcomp;        /*<1> from sn pdu                      */
  U8                 _align0;      /*<1> alignment                        */
  T_pdu_ref          pdu_ref;      /*<8> to the segment to be confirmed   */
  T_desc_list2       desc_list2;   /*< > list of generic data descriptors */
} T_CIA_DECOMP_IND;



/*
The following definitions was originally generated by CCD. The definitions are not used as 
primitive definitions anymore, only for SNDCP internal usage.
*/
typedef struct
{
  U8              nsapi;      /*<1> network layer sapi                */
  U8              p_id;       /*<1> protocol identifier               */
  U8              _align0;    /*<1> alignment                         */
  U8              _align1;    /*<1> alignment                         */
  T_desc_list2    desc_list2; /*<8> list of generic data descriptors  */
} T_SN_DATA_REQ;

typedef struct
{
  U8               nsapi;      /*<1> network layer sapi               */
  U8               p_id;       /*<1> protocol identifier              */
  U8               _align0;    /*<1> alignment                        */
  U8               _align1;    /*<1> alignment                        */
  T_desc_list2     desc_list2; /*<8> list of generic data descriptors */
} T_SN_UNITDATA_REQ;

typedef struct
{
  U8                nsapi;       /*<1> network layer sapi               */
  U8                p_id;        /*<1> protocol identifier              */
  U8                _align0;     /*<1> alignment                        */
  U8                _align1;     /*<1> alignment                        */
  T_desc_list2      desc_list2;  /*<8> list of generic data descriptors */
} T_SN_UNITDATA_IND;

typedef struct
{
  U8                 nsapi;       /*<1> network layer sapi               */
  U8                 p_id;        /*<1> protocol identifier              */
  U8                 _align0;     /*<1> alignment                        */
  U8                 _align1;     /*<1> alignment                        */
  T_desc_list2       desc_list2;  /*<8> list of generic data descriptors */
} T_SN_DATA_IND;

typedef struct
{
  U8                  nsapi;    /*<1> network layer sapi   */
  U8                  p_id;     /*<1> protocol identifier  */
  U8                  _align0;  /*<1> alignment            */
  U8                  _align1;  /*<1> alignment            */
  T_sdu               sdu;      /*< > service data unit    */
} T_SN_DATA_IND_TEST;

typedef struct
{
  U8                  nsapi;     /*<1> network layer sapi   */
  U8                  p_id;      /*<1> protocol identifier  */
  U8                  _align0;   /*<1> alignment            */
  U8                  _align1;   /*<1> alignment            */
  T_sdu               sdu;       /*< > service data unit    */
} T_SN_UNITDATA_IND_TEST;

/*
 * SNDCP global typedefs
 */

#ifdef SNDCP_UPM_INCLUDED 
typedef T_PS_qos_r97 T_snsm_qos; 
typedef T_SN_ACTIVATE_REQ T_SNSM_ACTIVATE_IND;
#endif  /*SNDCP_UPM_INCLUDED*/




/*
 * Structs used to store XID parameters.
 */
/*
 * Parameters for V42.bis data compression.
 */
typedef struct /* T_XID_V42_BLOCK */
{
  /*
   * Has V42 field been set in the block?.
   */
  BOOL is_set;
  /*
   * P bit.
   */
  UBYTE p_bit;
  /*
   * Entity number.
   */
  UBYTE ntt;
  /*
   * Algorithm type.
   */
  UBYTE algo_type;
  /*
   * The one DCOMP value needed for V42.bis.
   */
  UBYTE dcomp;
  /*
   * Applicable nsapis set?
   */
  BOOL nsapis_set;
  /*
   * Applicable nsapis (bit mask);
   */
  USHORT nsapis;
  /*
   * Direction set?
   */
  BOOL p0_set;
  /*
   * Direction
   */
  UBYTE p0;
  /*
   * Max number of codewords set?
   */
  BOOL p1_set;
  /*
   * Max number of codewords.
   */
  USHORT p1;
  /*
   * Max char number set?
   */
  BOOL p2_set;
  /*
   * Max char number.
   */
  UBYTE p2;

} T_XID_V42_BLOCK;

/*
 *  Used by VanJacobsen to store TCP-Headers
 */
typedef struct sndcp_tcp_header/* T_SNDCP_TCP_HEADER */
{
  /* TCP */
  /*
   *  Source Port
   */
  USHORT th_sport;

  /*
   *  Destination Port
   */
  USHORT th_dport;

  /*
   *  Sequence Number
   */
  ULONG th_seq;

  /*
   *  Acknowledgement Number
   */
  ULONG th_ack;

  /*
   *  Data Offset
   */
  UBYTE th_off;
 /*
  *  Flags: urg, ack, psh, rst, syn, fin
  */
  UBYTE th_flags;

  /*
   *  Window
   */
  USHORT th_win;

  /*
   *  Checksum
   */
  USHORT th_sum;

  /*
   *  Urgent Pointer
   */
  USHORT th_urp;

} T_SNDCP_TCP_HEADER;

/*
 *  Used by VanJacobsen to store IP-Headers
 */
typedef struct sndcp_ip_header/* T_SNDCP_IP_HEADER */
{
  /* IP */

  /*
   *  Protocol Verion, Header Length
   */
  UBYTE ip_vhl;

  /*
   *  Type of Service
   */
  UBYTE ip_tos;

  /*
   *  Total Length
   */
  USHORT ip_len;

  /*
   *  Packet ID
   */
  USHORT ip_id;

  /*
   *  Don't fragment, More fragments, Fragment Offset
   */
  USHORT ip_off;

  /*
   *  Time to live
   */
  UBYTE ip_ttl;

  /*
   *  Protocol
   */
  UBYTE ip_p;

  /*
   *  Header Checksum
   */
  USHORT ip_sum;

  /*
   *  Source Address
   */
  ULONG ip_src;

  /*
   *  Destination Address
   */
  ULONG ip_dst;

} T_SNDCP_IP_HEADER;


/*
 * Parameters for VanJacobson header compression.
 */
typedef struct /* T_XID_VJ_BLOCK */
{
  /*
   * Has VJ field been set in the block?.
   */
  BOOL is_set;
  /*
   * P bit.
   */
  UBYTE p_bit;
  /*
   * Entity number.
   */
  UBYTE ntt;
  /*
   * Algorithm type.
   */
  UBYTE algo_type;
  /*
   * The first PCOMP value needed for Van Jacobson.
   */
  UBYTE pcomp1;
  /*
   * The second PCOMP value needed for Van Jacobson.
   */
  UBYTE pcomp2;
  /*
   * Applicable nsapis set?
   */
  BOOL nsapis_set;
  /*
   * Applicable nsapis (bit mask);
   */
  USHORT nsapis;
  /*
   * Direction. (Note: only for internal purposes, 
   * not included in XID block)
   */
  UBYTE direction;
  /*
   * Number of state slots minus  set?
   */
  UBYTE s0_m_1_set;
  /*
   * Number of state slots minus 1.
   */
  UBYTE s0_m_1;

} T_XID_VJ_BLOCK;

typedef struct /* T_XID_BLOCK */
{
  BOOL version_set;
  UBYTE version;
  T_XID_V42_BLOCK v42;
  T_XID_VJ_BLOCK vj;
} T_XID_BLOCK;


/*
 * This is used to buffer N-PDUs in service nu.
 *
 * Instances of this struct are added to a dynamic list:
 */
typedef struct t /* T_NPDU_BUFFER */
{
  struct t* next;
  T_SN_DATA_REQ* sn_data_req;
  UBYTE npdu_number;
} T_NPDU_BUFFER;

/*
 * This is used to store information about segmented N-PDUs in service sua:
 * One T_SEG_INFO entry is for 1 segmented N-PDU.
 * a. How many segments have been sent from 1 N-PDU?
 * b. Which of these segments have been confirmed by the peer?
 * c. What is the "reference" struct?
 * d. Who is the affected NSAPI?
 *
 * Instances of this struct are added to a dynamic list:
 */
typedef struct tt /* T_SEG_INFO */
{
  struct tt* next;
  UBYTE number_of_segments;
  /*
   * An array of bit flags for 32 possible segments per N-PDU;
   * This restricts number of segments to 32.
   */
  ULONG cnf_segments;
  UBYTE npdu_number;
  UBYTE nsapi;
} T_SEG_INFO;

/*
 * Constants and bit-masks used by header compression algorithm
 */
#define TH_FIN                      0x01    /* FIN-Bit Mask */
#define TH_SYN                      0x02    /* SYN-Bit Mask */
#define TH_RST                      0x04    /* RST-Bit Mask */
#define TH_PUSH                     0x08    /* PSH-Bit Mask */
#define TH_ACK                      0x10    /* ACK-Bit Mask */
#define TH_URG                      0x20    /* URG-Bit Mask */
#define TH_FLAGS                    (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG)
#define TCP_PUSH_BIT                0x10    /* PUSH-Bit Mask */

/* Bits in first octet of compressed packet, for what changed in a packet */
#define NEW_C                       0x40
#define NEW_I                       0x20
#define NEW_S                       0x08
#define NEW_A                       0x04
#define NEW_W                       0x02
#define NEW_U                       0x01

/* reserved, special-case values */
/* echoed interactive traffic */
#define SPECIAL_I                   (NEW_S|NEW_W|NEW_U)
/* unidirectional data */
#define SPECIAL_D                   (NEW_S|NEW_A|NEW_W|NEW_U)
#define SPECIALS_MASK               (NEW_S|NEW_A|NEW_W|NEW_U)

/* maximal change of values for sending compressed headers */
#define MAX_CHANGE                  0xFFFE
/* TCP-IP Protocol ID */
#define PROT_TCPIP                  6
/* Position number of protocol type within a UBYTE buffer */
#define PR_TYPE_POS                 9
/* Header Length Mask */
#define HL_MASK                     0x0F
/* tossing rcvd frames because of input err */
#define SLF_TOSS                    1
/* Max. TCP/IP header length should really be 128 */
#define MAX_HDR_LEN                 128
#define TMP_HDR_LEN                 168
#define MAX_STATES                  SNDCP_MAX_NUMBER_OF_VJ_SLOTS

/* packet types as defined in RFC 1144 */
#define TYPE_IP                     0x40
#define TYPE_UNCOMPRESSED_TCP       0x70
#define TYPE_COMPRESSED_TCP         0x80
#define TYPE_ERROR                  0x00

/*
 * "state" data for each active tcp conversation on the wire.  This is
 * basically a copy of the entire IP/TCP header from the last packet
 * we saw from the conversation together with a small identifier
 * the transmit & receive ends of the line use to locate saved header.
 */
struct cstate {
  struct cstate   *cs_next;    /* next most recently used cstate (xmit only) */
  USHORT          cs_hlen;     /* size of hdr (receive only) */
  UBYTE           cs_id;       /* connection # associated with this state */
  UBYTE           cs_filler;
  UBYTE           cs_hdr[MAX_HDR_LEN]; /* ip/tcp hdr from most recent packet */
  T_SNDCP_IP_HEADER *cs_ip;    /* ptr to ip/tcp hdr from most recent packet */
};

/*
 * all the state data for one serial line (we need one of these per line).
 */
struct slcompress {
  /* most recently used tstate */
  struct cstate   *last_cs;
  /* last rcvd conn. id */
  UBYTE           last_recv;
  /* last sent conn. id */
  UBYTE           last_xmit;
  USHORT          flags;
  /* xmit connection states */
  struct cstate   tstate[MAX_STATES];
  /* receive connection states */
  struct cstate   rstate[MAX_STATES];
  /* buffer to store temporary received ip/tcp header */
  UBYTE           tcpip_hdr[TMP_HDR_LEN];
  USHORT          slots_to_use;
};

/*
 * A struct comp_buf is used in the call cia_comp_vj and cia_decomp_vj because
 * that routine needs to modify both the start address and length if the
 * incoming packet is compressed/decompressed
 */
struct comp_buf {
    /* length of complete packet */
    USHORT        pack_len;
    /* length of header + some data passed to comp/decomp routine */
    USHORT        hdr_len;
    /* pointer to start of packet */
    ULONG         c_hdr;
    /* packet type */
    UBYTE         p_type;
    UBYTE         filler;
    USHORT        filler1;
};



typedef struct /* T_CIA_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * Copy of mg.cur_xid_block.
   */
  T_XID_BLOCK cur_xid_block;

  /*
   * all the state data for one serial line
   */
  struct slcompress comp;

#ifdef SNDCP_TRACE_ALL
  SHORT cia_decomp_ind_number[SNDCP_NUMBER_OF_NSAPIS];
#endif
#ifdef TI_PS_FF_V42BIS
  T_V42B_DICO* enc;
  T_V42B_DICO* dec;
  U16 trabu[1500];
#endif /* TI_PS_FF_V42BIS */
  /*
   * Currently assembled unacknowledged N-PDU downlink.
   */
  T_CIA_DECOMP_IND* cur_cia_decomp_ind[SNDCP_NUMBER_OF_NSAPIS];

} T_CIA_DATA;


typedef struct /* T_MG_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * XID parameters that show what the user requested.
   */
  T_XID_BLOCK user_xid_block [SNDCP_NUMBER_OF_NSAPIS];
  /*
   * XID parameters that are sent with LL_XID_REQ or LL_ESTABLISH_REQ.
   */
  T_XID_BLOCK req_xid_block [SNDCP_NUMBER_OF_SAPIS];
  /*
   * Confirmed XID parameters.
   */
  T_XID_BLOCK cnf_xid_block [SNDCP_NUMBER_OF_SAPIS];
  /*
   * Indicated XID parameters.
   */
  T_XID_BLOCK ind_xid_block [SNDCP_NUMBER_OF_SAPIS];
  /*
   * Responded XID parameters.
   */
  T_XID_BLOCK res_xid_block [SNDCP_NUMBER_OF_SAPIS];
  /*
   * Currently used XID parameters.
   */
  T_XID_BLOCK cur_xid_block [SNDCP_NUMBER_OF_SAPIS];
  /*
   * XID parameters that have not yet been requested, but are now needed,
   * e.g. when an establishment is pending and another SNSM_ACTIVATE_IND
   * comes in with compression required.
   */
  T_XID_BLOCK new_xid_block [SNDCP_NUMBER_OF_SAPIS];
  /*
   * index: sapi + data compression entity number, elements: state;
   * indicates the state of the given entity, one of MG_UNASSIGNED,
   * MG_SELECTED, MG_ASSIGNED UBYTE .
   */
  UBYTE sapi_dntt_state_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_ENTITIES];
  /* index: sapi + header compression entity number, elements: state;
   * indicates the state of the given entity, one of MG_UNASSIGNED,
   * MG_SELECTED, MG_ASSIGNED UBYTE .
   */
  UBYTE sapi_pntt_state_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_ENTITIES];
  /*
   * index: sapi + data compression entity number + nsapi,
   * elements: is nsapi conneted to given entity?;
   * indicates whether the NSAPI uses the given entity on the given SAPI.
   */
  BOOL sapi_dntt_nsapi_set_ra [SNDCP_NUMBER_OF_SAPIS]
                              [MG_MAX_ENTITIES]
                              [SNDCP_NUMBER_OF_NSAPIS];
  /*
   * index: sapi + header compression entity number + nsapi,
   * elements: is nsapi conneted to given entity?;
   * indictes whether the NSAPI uses the given entity on the given SAPI.
   */
  BOOL sapi_pntt_nsapi_set_ra [SNDCP_NUMBER_OF_SAPIS]
                              [MG_MAX_ENTITIES]
                              [SNDCP_NUMBER_OF_NSAPIS];
  /*
   * index: sapi + dcomp value, elements: state;
   * indicates the state of the given dcomp value, one of MG_UNASSIGNED,
   * MG_SELECTED, MG_ASSIGNED UBYTE .
   */
  UBYTE sapi_dcomp_state_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_DCOMP];
  /*
   * index: sapi + pcomp value, elements: state;
   * indicates the state of the given pcomp value, one of MG_UNASSIGNED,
   * MG_SELECTED, MG_ASSIGNED UBYTE .
   */
  UBYTE sapi_pcomp_state_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_PCOMP];
  /*
   * index: sapi + dcomp value, elements: data compression entity number;
   * indicates the entity to which the given dcomp value in the given SAPi 
   * is assigned.
   */
  UBYTE sapi_dcomp_dntt_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_DCOMP];
  /*
   * index: sapi + pcomp value, elements: header compression entity number;
   * indicates the entity to which the given pcomp value in the given SAPi
   * is assigned.
   */
  UBYTE sapi_pcomp_pntt_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_PCOMP];
  /*
   * index: sapi, elements: number of renegotiations;
   */
  UBYTE renego [SNDCP_NUMBER_OF_SAPIS];
  /*
   * index: sapi + dntt value, elements: will the ntt be rejected?
   * For entities that are proposed by the network but cannot be set up.
   */
  BOOL sapi_dntt_rej_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_ENTITIES];
  /*
   * index: sapi + dntt value, elements: will the ntt be rejected?
   * For entities that are proposed by the network but cannot be set up.
   */
  BOOL sapi_pntt_rej_ra [SNDCP_NUMBER_OF_SAPIS][MG_MAX_ENTITIES];
  /*
   * What is expected in the course of a context modification?
   * Possible values: MG_MOD_X_NONE, MG_MOD_X_REL, MG_MOD_X_EST, MOD_X_READY.
   */
  UBYTE mod_expects;
  /*
   * Bit_mask for all nsapis waiting with snsm_modify_res for est
   * and/or rel.
   */
  USHORT waiting_nsapis;
  /*
   * Bit_mask for all nsapis currently suspended.
   */
  USHORT suspended_nsapis;

} T_MG_DATA;


typedef struct /* T_NU_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * the affected nsapi
   */
  UBYTE nsapi;
  /*
   * The Send N-PDU number for unacknowledged data transfer.
   */
  USHORT send_npdu_number_unack;
  /*
   * The Send N-PDU number for acknowledged data transfer.
   */
  UBYTE send_npdu_number_ack;
  /*
   * The Receive N-PDU number for unacknowledged data transfer.
   */
  UBYTE rec_npdu_number_ack;
  /*
   * Here the sent N-PDUs are stored.
   */
  T_NPDU_BUFFER* first_buffered_npdu;
  /*
   * This is the next npdu buffer to be resent.
   */
  T_NPDU_BUFFER* next_resend;
  /*
   * Is an SN_READY_IND pending?
   */
  BOOL sn_ready_ind_pending;
  /*
   * Is an SN_UNITREADY_IND pending?
   */
  BOOL sn_unitready_ind_pending;
  /*
   * Is an SN_SWITCH_CNF expected?
   */
  BOOL sn_switch_cnf_expected;
#ifdef SNDCP_UPM_INCLUDED
  /*
   * Is an SN_DTI_CNF expected?
   */
  BOOL sn_dti_cnf_expected;
#endif /* SNDCP_UPM_INCLUDED */
  /*
   * Is DTI connection opened?
   */
  BOOL connection_is_opened;
  /*
   * This flag indicates if config prim "DISCARD" or "RESUME"
   * for certain NSAPI was received. TRUE means "DISCARD" was received.
   * FALSE is the default state and will be set if "RESUME" was received.
   */
  BOOL discard;

  /*
   * This variables are needed for statistics showing how much data was
   * discarded and how much sent.
   */
  ULONG sent_data;
  ULONG discarded_data;

} T_NU_DATA;


typedef struct /* T_SU_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * The affected sapi.
   */
  UBYTE sapi;
  /*
   * The max segment size for unacknowledged data transfer.
   */
  USHORT n201_u;
  /*
   * An array with one T_SN_UNITDATA_REQ* per NSAPI. It is ensured by the flow
   * control with service nu that only one sn_unitdata_req per nsapi may be
   * present. This array works like a queue with a read and a write pointer.
   */
  T_SN_UNITDATA_REQ* sn_unitdata_q [SN_UNITDATA_Q_LEN];
  /*
   * An array with the N-PDU numbers for the above sn_unitdata_req primitives.
   */
  USHORT npdu_number_q [SN_UNITDATA_Q_LEN];
  /*
   * The read pointer for sn_unitdata_q.
   */
  UBYTE sn_unitdata_q_read;
  /*
   * The write pointer for sn_unitdata_q.
   */
  UBYTE sn_unitdata_q_write;
#ifdef _SNDCP_DTI_2_
  /*
   * An Array with a number of T_LL_UNITDESC_REQ* to store all segments of
   * 1 N-PDU after they have been received from cia.
   */
  T_LL_UNITDESC_REQ* ll_unitdesc_q [SNDCP_SEGMENT_NUMBERS_UNACK];
  /*
   * The read pointer for ll_unitdesc_q.
   */
  U8 ll_unitdesc_q_read;
  /*
   * The write pointer for ll_unitdesc_q.
   */
  U8 ll_unitdesc_q_write;
#else /* _SNDCP_DTI_2_ */
  /*
   * An Array with a number of T_LL_UNITDATA_REQ* to store all segments of
   * 1 N-PDU after they have been received from cia.
   */
  T_LL_UNITDATA_REQ* ll_unitdata_q [SNDCP_SEGMENT_NUMBERS_UNACK];
  /*
   * The read pointer for ll_unitdata_q.
   */
  UBYTE ll_unitdata_q_read;
  /*
   * The write pointer for ll_unitdata_q.
   */
  UBYTE ll_unitdata_q_write;
#endif /* _SNDCP_DTI_2_ */

  /*
   * In what state is cia?
   * Set to CIA_IDLE at init time and when last segment of N-PDU has been sent
   * to LLC.
   * Set to CIA_BUSY whenever sig_su_cia_cia_comp_req is sent.
   */
  UBYTE cia_state;
} T_SU_DATA;

typedef struct /* T_SUA_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * The affected sapi.
   */
  UBYTE sapi;
  /*
   * The max segment size for acknowledged data transfer.
   */
  USHORT n201_i;
  /*
   * An array with one T_SN_DATA_REQ* per NSAPI. It is ensured by the flow
   * control with service nu that only one sn_data_req per nsapi may be
   * present. This array works like a queue with a read and a write pointer.
   */
  T_SN_DATA_REQ* sn_data_q [SN_DATA_Q_LEN];
  /*
   * An array with the N-PDU numbers for the above sn_data_req primitives.
   */
  UBYTE npdu_number_q [SN_DATA_Q_LEN];
  /*
   * The read pointer for sn_data_q.
   */
  UBYTE sn_data_q_read;
  /*
   * The write pointer for sn_data_q.
   */
  UBYTE sn_data_q_write;
  /*
   * Information about the outgoing segments, first element in dynamic list.
   */
  T_SEG_INFO* first_seg_info;
#ifdef _SNDCP_DTI_2_
  /*
   * An Array with a number of T_LL_DESC_REQ* to store all
   * segments of 1 N-PDU after they have been received from cia.
   */
  T_LL_DESC_REQ* ll_desc_q [SNDCP_SEGMENT_NUMBERS_ACK];
  /*
   * The read pointer for ll_desc_q.
   */
  U8 ll_desc_q_read;
  /*
   * The write pointer for ll_desc_q.
   */
  U8 ll_desc_q_write;
#else /* _SNDCP_DTI_2_ */
  /*
   * An Array with a number of T_LL_DATA_REQ* to store all
   * segments of 1 N-PDU after they have been received from cia.
   */
  T_LL_DATA_REQ* ll_data_q [SNDCP_SEGMENT_NUMBERS_ACK];
  /*
   * The read pointer for ll_data_q.
   */
  UBYTE ll_data_q_read;
  /*
   * The write pointer for ll_data_q.
   */
  UBYTE ll_data_q_write;
#endif /* _SNDCP_DTI_2_ */
  /*
   * In what state is cia?
   * Set to CIA_IDLE at init time and when last segment of N-PDU has been sent
   * to LLC.
   * Set to CIA_BUSY whenever sig_sua_cia_cia_comp_req is sent.
   */
  UBYTE cia_state;
} T_SUA_DATA;



typedef struct /* T_ND_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * the affected nsapi
   */
  UBYTE nsapi;
  /*
   * Receive npdu number for recovery state.
   */
  UBYTE npdu_num;
} T_ND_DATA;

typedef struct /* T_PD_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * the affected sapi
   */
  UBYTE sapi;
} T_PD_DATA;

typedef struct /* T_PDA_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * the affected sapi
   */
  UBYTE sapi;
} T_PDA_DATA;


typedef struct /* T_SD_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * the affected sapi
   */
  UBYTE sapi;
  /*
   * TRUE if an LL_GETUNITDATA_REQ is pending, FALSE else
   */
  BOOL llc_may_send;
  /*
   * The SN_UNITDATA_IND that iscurrently being assembled.
   */
  T_SN_UNITDATA_IND* cur_sn_unitdata_ind[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * Is the affected NSAPI receptive?
   */
  BOOL nsapi_rec_ra[SNDCP_NUMBER_OF_NSAPIS];

} T_SD_DATA;

typedef struct /* T_SDA_DATA */
{
  UBYTE                       state;
  /*
   * Required for state traces.
   */
#ifndef NTRACE
  char                        *name;
  char                        *state_name;
#endif
  /*
   * the affected sapi
   */
  UBYTE sapi;
  /*
   * TRUE if an LL_GETDATA_REQ is pending, FALSE else
   */
  BOOL llc_may_send;
  /*
   * The SN_DATA_IND that iscurrently being assembled.
   */
  T_SN_DATA_IND* cur_sn_data_ind[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * Is the affected NSAPI receptive?
   */
  BOOL nsapi_rec_ra[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * The N-PDU number of the current uncompressed N-PDU.
   */
  UBYTE uncomp_npdu_num;

} T_SDA_DATA;




typedef struct /* T_SNDCP_DATA */
{


  /*
   * Entity global arrays for organizing purposes
   */

  /*
   * index: nsapi, elements: qos;
   * indicating the quality of service for the given NSAPI.
   */
  T_snsm_qos nsapi_qos_ra[SNDCP_NUMBER_OF_NSAPIS];

  /*
   * index: nsapi, elements: flags;
   * indicating whether the given NSAPI (0..15) is currently in use or not.
   */
  BOOL nsapi_used_ra[SNDCP_NUMBER_OF_NSAPIS];

  /*
   * index: nsapi, elements: flags;
   * indicating the sapi that is used by a certain nsapi.
   */
  UBYTE nsapi_sapi_ra[SNDCP_NUMBER_OF_NSAPIS];

  /*
   * index: nsapi, elements: the radio priority to be used in lower layers;
   * indicating the radio priority to be used in LL_(UNIT-)DATA_REQ prims.
   */
  UBYTE nsapi_prio_ra[SNDCP_NUMBER_OF_NSAPIS];

#ifdef REL99
  /*
   * index: nsapi, elements: the packet flwo identifier to be used in lower layers;
   * indicating the packet flwo identifier to be used in LL_(UNIT-)DATA_REQ prims.
   */
  U16 nsapi_pktflowid_ra[SNDCP_NUMBER_OF_NSAPIS];
#endif /*REL99*/

  /*
   * index: sapi, elements: LLC acknowledged?
   * indicating acknowledged (TRUE) or unacknowledged (FALSE) LLC operation
   * mode of the given LLC SAPI.
   */
  BOOL sapi_ack_ra[SNDCP_NUMBER_OF_SAPIS];

  /*
   * index: nsapi, elements: LLC acknowledged?
   * indicating acknowledged (TRUE) or unacknowledged (FALSE) LLC operation
   * mode of the given NSAPI.
   */
  BOOL nsapi_ack_ra[SNDCP_NUMBER_OF_NSAPIS];

  /*
   * index: sapi, elements: the state;
   * indicating one of MG_EST, MG_REL etc...
   */
  USHORT sapi_state_ra[SNDCP_NUMBER_OF_SAPIS];

  /*
   * index: nsapi, elements: the state;
   * indicating one of MG_EST, MG_REL etc...
   */
  USHORT nsapi_state_ra[SNDCP_NUMBER_OF_NSAPIS];

  /*
   * How many Van Jacobson compressors have been set up?
   * Must not be bigger than SNDCP_MAX_VJ_COUNT.
   */
  UBYTE vj_count;
  /*
   * SNDCP sends an LL_XID_REQ at each context activation.
   * This may switched off by setting this variable to FALSE.
   */
  BOOL always_xid;

#ifndef NCONFIG
  /*
   * In case of config primitive SEND_UNITDATA this variable indicates the
   * number of octets to be sent.
   */
  U32 data_count[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * Number of milliseconds to delay each SSM_ACTIVATE_IND after config prim DELAY.
   */
  USHORT millis;
#endif


#define _SNDCP_MEAN_TRACE_
#ifdef _SNDCP_MEAN_TRACE_
  /*
   * Used for tracing mean throughput up and down SN SAP.
   */
  /*
   * Time in ms.
   */
  T_TIME start_time_uplink_ack [SNDCP_NUMBER_OF_NSAPIS];
  T_TIME start_time_uplink_unack [SNDCP_NUMBER_OF_NSAPIS];
  T_TIME start_time_downlink_ack [SNDCP_NUMBER_OF_NSAPIS];
  T_TIME start_time_downlink_unack [SNDCP_NUMBER_OF_NSAPIS];

  T_TIME cur_time_uplink_ack [SNDCP_NUMBER_OF_NSAPIS];
  T_TIME cur_time_uplink_unack [SNDCP_NUMBER_OF_NSAPIS];
  T_TIME cur_time_downlink_ack [SNDCP_NUMBER_OF_NSAPIS];
  T_TIME cur_time_downlink_unack [SNDCP_NUMBER_OF_NSAPIS];

  /*
   * Number of transferred octets.
   * Skipped octets after config prim DISCARD are skipped.
   */
  ULONG cur_num_uplink_ack [SNDCP_NUMBER_OF_NSAPIS];
  ULONG cur_num_uplink_unack [SNDCP_NUMBER_OF_NSAPIS];
  ULONG cur_num_downlink_ack [SNDCP_NUMBER_OF_NSAPIS];
  ULONG cur_num_downlink_unack [SNDCP_NUMBER_OF_NSAPIS];

  /*
   * Number of transferred packets.
   * Skipped packets after config prim DISCARD are skipped.
   */
  ULONG cur_pac_uplink_ack [SNDCP_NUMBER_OF_NSAPIS];
  ULONG cur_pac_uplink_unack [SNDCP_NUMBER_OF_NSAPIS];
  ULONG cur_pac_downlink_ack [SNDCP_NUMBER_OF_NSAPIS];
  ULONG cur_pac_downlink_unack [SNDCP_NUMBER_OF_NSAPIS];

  /*
   * Direction and ack_mode parameters.
   */
#define SNDCP_MEAN_UP       1
#define SNDCP_MEAN_DOWN     2
#define SNDCP_MEAN_ACK      3
#define SNDCP_MEAN_UNACK    4

#endif /* _SNDCP_MEAN_TRACE_ */

#ifndef SNDCP_UPM_INCLUDED 
#define SNDCP_INTERFACE_ACK   1
#endif 
#define SNDCP_INTERFACE_UNACK 0

#ifdef _SNDCP_DTI_2_
  DTI_HANDLE hDTI;
#else /* _SNDCP_DTI_2_*/
  DTI_HANDLE* hDTI;
#endif /* _SNDCP_DTI_2_*/




  U32 nsapi_linkid_ra [SNDCP_NUMBER_OF_NSAPIS];
  U8* nsapi_neighbor_ra [SNDCP_NUMBER_OF_NSAPIS];
  U8  nsapi_interface_ra [SNDCP_NUMBER_OF_NSAPIS];
  /*
   * Possible values from dti.h: HOME or NEIGHBOR
   * Do not use SN or SNSM values.
   */
  BOOL nsapi_direction_ra [SNDCP_NUMBER_OF_NSAPIS];

#ifdef FLOW_TRACE
  BOOL  flow_control_ra [5][2][2];
#endif /* FLOW_TRACE */

  /*
   * Service data structures
   *
   * Services with multiple incarnations require an array of structures
   * named xxx_base[] with xxx = service abbrevation, and additionally a
   * pointer named *xxx, which will be accessed instead of xxx_base.
   *
   * Services with only one incarnation just have to declare one structure
   * named xxx (no need for xxx_base[] and *xxx).
   *
   * The differentiation between the two access possibilites is made with
   * the defines of the service names above (SNDCP_SERVICE_XXX).
   */
  T_CIA_DATA                   cia;

  T_MG_DATA                    mg;

  T_PD_DATA                    pd_base[SD_NUM_INC];
  T_PD_DATA                    *pd;

  T_PDA_DATA                   pda_base[SD_NUM_INC];
  T_PDA_DATA                   *pda;

  T_NU_DATA                    nu_base[NU_NUM_INC];
  T_NU_DATA                    *nu;

  T_SU_DATA                    su_base[SU_NUM_INC];
  T_SU_DATA                    *su;

  T_SUA_DATA                    sua_base[SUA_NUM_INC];
  T_SUA_DATA                    *sua;

  T_ND_DATA                    nd_base[ND_NUM_INC];
  T_ND_DATA                    *nd;

  T_SD_DATA                    sd_base[SD_NUM_INC];
  T_SD_DATA                    *sd;

  T_SDA_DATA                    sda_base[SDA_NUM_INC];
  T_SDA_DATA                    *sda;

  /*
   * Receiving states.(Regarding to 3GPP 04.65, capture 6.7.1.2)
   * index: NSAPI number, elements: SD/SDA receiving states relaiting to NSAPI.
   * One SAPI can receive SN-PDU's for diffent NSAPI's used currently on 
   * this SAPI. In this case SD/SDA services have to have different receiving 
   * states for each on this SAPI achtive NSAPI.
   */
  UBYTE rec_states[SNDCP_NUMBER_OF_NSAPIS];

  /*
   * Reference to pdu.
   */
  T_pdu_ref cur_pdu_ref[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * The dcomp value in the first segment of the currently reassembled N-PDU.
   */
  UBYTE cur_dcomp[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * The pcomp value in the first segment of the currently reassembled N-PDU.
   */
  UBYTE cur_pcomp[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * First and/or last segment?
   */
  UBYTE cur_seg_pos[SNDCP_NUMBER_OF_NSAPIS];
  /*
   * Has the currently reassembled n-pdu a big header?
   */
  BOOL big_head[SNDCP_NUMBER_OF_NSAPIS];

 /*
  * Global variable indicating if the config primitive
  * TRACE_HEADER_ON has been received and the IP header
  * will be traced
  */
  BOOL trace_ip_header;
 /*
  * Global variable indicating if the config primitive
  * TRACE_PACKET_ON has been received and the complete
  * IP packets (Header+Payload) will traced
  */
  BOOL trace_ip_datagram;
 /*
  * Global variable indicating if the config primitive
  * TRACE_IP_BIN has been received and the complete
  * IP packets (Header+Payload) will be exported via BIN TRACE
  */
  BOOL trace_ip_bin;
  /*
   * This flag indicates if IP filter is activated or not. Per default
   * the IP filter is disabled and the state is set to FALSE.
   * TRUE means "IP_FILTER_ON" was received and filter is activated.
   */
  BOOL ip_filter;
  /*
   * This Counter indicates the Current Segment Number in single NPDU
   * which is being assembled currently.
   * This Counter Value is introduced to encounter the PARTITION 
   * Problem which we may face when there are more than 100 segments in
   * one NPDU are received in downlink.
   */
  U8 cur_segment_number[SNDCP_NUMBER_OF_NSAPIS];
  
  /* Flag to indicate if flow control is received before NSAPI is used.
   * If the flow control is received the corresponding bit for the NSAPI
   * is set in the variable 
   */
  USHORT nsapi_rcv_rdy_b4_used;
  U8 nsapi;
  BOOL tcp_flow;
} T_SNDCP_DATA;


/*==== EXPORT =====================================================*/

/*
 * Entity data base
 */
#ifdef SNDCP_PEI_C
       T_SNDCP_DATA sndcp_data_base, *sndcp_data;
#else
EXTERN T_SNDCP_DATA sndcp_data_base, *sndcp_data;
#endif

#define ENTITY_DATA           sndcp_data


/*
 * Communication handles
 */
#define hCommMMI             _ENTITY_PREFIXED(hCommMMI)

#ifdef SNDCP_UPM_INCLUDED 
#define hCommUPM             _ENTITY_PREFIXED(hCommUPM)
#else
#define hCommSM              _ENTITY_PREFIXED(hCommSM)
#endif  /*#ifdef SNDCP_UPM_INCLUDED*/

#define hCommLLC              _ENTITY_PREFIXED(hCommLLC)

#ifdef SNDCP_PEI_C
       T_HANDLE hCommMMI       = VSI_ERROR;
/*       T_HANDLE hCommSM         = VSI_ERROR; */
#ifdef SNDCP_UPM_INCLUDED 
       T_HANDLE hCommUPM         = VSI_ERROR;
#endif  /*SNDCP_UPM_INCLUDED*/
       T_HANDLE hCommLLC        = VSI_ERROR;

       T_HANDLE SNDCP_handle;
/*
 * make the pei_create function unique
 */
#define pei_create _ENTITY_PREFIXED(pei_create)


#else
EXTERN T_HANDLE hCommMMI;
/*EXTERN T_HANDLE hCommSM; */
#ifdef SNDCP_UPM_INCLUDED 
EXTERN T_HANDLE hCommUPM;
#endif
EXTERN T_HANDLE hCommLLC;

EXTERN T_HANDLE SNDCP_handle;

#endif /* SNDCP_PEI_C */


#endif /* SNDCP_H */