FreeCalypso > hg > fc-tourmaline
view src/g23m-gprs/sndcp/sndcp.h @ 268:f2e52cab0a73
abb_inth.c: check all interrupt causes, not just one
The original code used if - else if - else if etc constructs, thus
the first detected interrupt was the only one handled. However,
Iota ITSTATREG is a clear-on-read register, thus if we only handle
the first detected interrupt and skip checking the others, then the
other interrupts will be lost, if more than one interrupt happened
to occur in one ABB interrupt handling cycle - a form of rare race
condition. Change the code to check all interrupts that were read
in this cycle.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 13 Jun 2021 18:17:53 +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 */