FreeCalypso > hg > fc-tourmaline
view src/g23m-gprs/sndcp/sndcp_pei.c @ 25:ef6d1ca160b2
components/alr: new source location
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 17:13:35 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GPRS (8441) | Modul : sndcp_pei.c +----------------------------------------------------------------------------- | 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. +----------------------------------------------------------------------------- | Purpose : This module implements the process body interface | for the entity SNDCP | | Exported functions: | | pei_create - Create the Protocol Stack Entity | pei_init - Initialize Protocol Stack Entity | pei_primitive - Process Primitive | pei_timeout - Process Timeout | pei_exit - Close resources and terminate | pei_run - Process Primitive | pei_config - Dynamic Configuration | pei_monitor - Monitoring of physical Parameters +----------------------------------------------------------------------------- */ #define SNDCP_PEI_C #define ENTITY_SNDCP /*==== INCLUDES =============================================================*/ #include <stddef.h> /* to get definition of offsetof(), for MAK_FUNC_S */ #include "typedefs.h" /* to get Condat data types */ #include "vsi.h" /* to get a lot of macros */ #include "macdef.h" #include "gprs.h" #include "gsm.h" /* to get a lot of macros */ #include "cnf_sndcp.h" /* to get cnf-definitions */ #include "mon_sndcp.h" /* to get mon-definitions */ #include "prim.h" /* to get the definitions of used SAP and directions */ #include "dti.h" /* To get dti lib */ #include "sndcp.h" /* to get the global entity definitions */ #include "ccdapi.h" /* to get ccd stuff */ #include "sndcp_ciaf.h" /* to get functions for service mg */ #include "sndcp_ciap.h" /* to get primitive handling for service mg */ #include "sndcp_cias.h" /* to get signal handling for service mg*/ #include "sndcp_mgf.h" /* to get functions for service mg */ #include "sndcp_mgp.h" /* to get primitive handling for service mg */ #include "sndcp_mgs.h" /* to get signal handling for service mg*/ #include "sndcp_ndf.h" /* to get functions for service nd */ #include "sndcp_ndp.h" /* to get primitive handling for service nd */ #include "sndcp_nds.h" /* to get signal handling for service nd */ #include "sndcp_nuf.h" /* to get functions for service nu */ #include "sndcp_nup.h" /* to get primitive handling for service nu */ #include "sndcp_nus.h" /* to get signal handling for service nu */ #include "sndcp_pdf.h" /* to get functions for service pd */ #include "sndcp_pdaf.h" /* to get functions for service pda */ #include "sndcp_suf.h" /* to get functions for service su */ #include "sndcp_sup.h" /* to get primitive handling for service su */ #include "sndcp_sus.h" /* to get signal handling for service su */ #include "sndcp_suaf.h" /* to get functions for service sua */ #include "sndcp_suap.h" /* to get primitive handling for service sua */ #include "sndcp_suas.h" /* to get signal handling for service sua */ #include "sndcp_sdf.h" /* to get functions for service sd */ #include "sndcp_sdp.h" /* to get primitive handling for service sd */ #include "sndcp_sds.h" /* to get signal handling for service sd */ #include "sndcp_sdaf.h" /* to get functions for service sda */ #include "sndcp_sdap.h" /* to get primitive handling for service sda */ #include "sndcp_sdas.h" /* to get signal handling for service sda */ #include "sndcp_pdp.h" /* to get primitive handling for service pd */ #include "sndcp_pds.h" /* to get signal handling for service pd */ #include "sndcp_pdap.h" /* to get primitive handling for service pda */ #include "sndcp_pdas.h" /* to get signal handling for service pda */ #include "sndcp_f.h" #include <string.h> /* to get memcpy() */ #include <stdlib.h> /* to get atoi() */ /*==== DEFINITIONS ==========================================================*/ #define TCPIP_NAME "TCP" /*==== TYPES ================================================================*/ /*==== GLOBAL VARS ==========================================================*/ /*==== LOCAL VARS ===========================================================*/ #ifdef _SNDCP_DTI_2_ LOCAL void sndcp_dti_dti_connect_cnf (T_DTI2_CONNECT_CNF *dti2_connect_cnf); LOCAL void sndcp_dti_dti_connect_ind (T_DTI2_CONNECT_IND *dti2_connect_ind); LOCAL void sndcp_dti_dti_disconnect_ind (T_DTI2_DISCONNECT_IND *dti2_disconnect_ind); LOCAL void sndcp_dti_dti_ready_ind (T_DTI2_READY_IND *dti2_ready_ind); LOCAL void sndcp_dti_dti_data_ind (T_DTI2_DATA_IND *dti2_data_ind); LOCAL void sndcp_dti_dti_getdata_req (T_DTI2_GETDATA_REQ *dti_getdata_req); LOCAL void sndcp_dti_dti_data_req (T_DTI2_DATA_REQ *dti_data_req); LOCAL void sndcp_dti_dti_connect_req (T_DTI2_CONNECT_REQ *dti2_connect_req); LOCAL void sndcp_dti_dti_connect_res (T_DTI2_CONNECT_RES *dti2_connect_res); LOCAL void sndcp_dti_dti_disconnect_req (T_DTI2_DISCONNECT_REQ *dti2_disconnect_req); #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_req (T_DTI2_DATA_TEST_REQ *dti_data_test_req); LOCAL void sndcp_dti_dti_data_test_ind (T_DTI2_DATA_TEST_IND *dti_data_test_ind); #endif /*_SIMULATION_*/ #else /*_SNDCP_DTI_2_*/ LOCAL void sndcp_dti_dti_getdata_req (T_DTI_GETDATA_REQ *dti_getdata_req); LOCAL void sndcp_dti_dti_data_req (T_DTI_DATA_REQ *dti_data_req); #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_req (T_DTI_DATA_TEST_REQ *dti_data_test_req); #endif LOCAL void sndcp_dti_dti_ready_ind (T_DTI_READY_IND *dti_ready_ind); LOCAL void sndcp_dti_dti_data_ind (T_DTI_DATA_IND *dti_data_ind); #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_ind (T_DTI_DATA_TEST_IND *dti_data_test_ind); #endif #endif /* _SNDCP_DTI_2_ */ static BOOL first_access = TRUE; static T_MONITOR sndcp_mon; #ifdef TI_PS_OP_ICUT_SNDCP /* PDP_TBR added SNDCP terminal loopback */ U8 SNDCP_LOOPBACK = FALSE; BOOL bufFull[SNDCP_NUMBER_OF_NSAPIS] = {FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,FALSE,FALSE}; T_DTI2_DATA_IND *saveDti2_data_ind[SNDCP_NUMBER_OF_NSAPIS] = {NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; #endif /* TI_PS_OP_ICUT_SNDCP */ /* * Jumptables to primitive handler functions. One table per SAP. * * Use MAK_FUNC_0 for primitives which contains no SDU. * Use MAK_FUNC_S for primitives which contains a SDU. */ /* * Function is needed for function_table[]. This declaration can be removed * as soon as this function is no more called (i.e. all primitives are * handled). */ LOCAL void primitive_not_supported (void *data); #ifndef SNDCP_UPM_INCLUDED static const T_FUNC snsm_table[] = { MAK_FUNC_0(mg_snsm_activate_ind, SNSM_ACTIVATE_IND), /* 6700 */ MAK_FUNC_0(mg_snsm_deactivate_ind, SNSM_DEACTIVATE_IND), /* 6701 */ MAK_FUNC_0(mg_snsm_modify_ind, SNSM_MODIFY_IND), /* 6702 */ MAK_FUNC_0(mg_snsm_sequence_ind, SNSM_SEQUENCE_IND) /* 6703 */ }; #endif #ifndef SNDCP_UPM_INCLUDED static const T_FUNC sn_table[] = { MAK_FUNC_N(primitive_not_supported, 0), /* 2800 */ MAK_FUNC_N(primitive_not_supported, 0), /* 2801 */ MAK_FUNC_N(primitive_not_supported, 0), /* 2802 */ MAK_FUNC_N(primitive_not_supported, 0), /* 2803 */ MAK_FUNC_N(primitive_not_supported, 0), /* 2804 */ MAK_FUNC_N(primitive_not_supported, 0), /* 2805 */ MAK_FUNC_N(primitive_not_supported, 0), /* 2806 */ MAK_FUNC_N(primitive_not_supported, 0) /* 2807 */ #ifdef _SNDCP_MEAN_TRACE_ , MAK_FUNC_0(sndcp_sn_count_req, SN_COUNT_REQ) /* 2808 */ #endif , MAK_FUNC_0(mg_sn_switch_req, SN_SWITCH_REQ) /* 2809 */ }; #else /*#ifndef SNDCP_UPM_INCLUDED*/ static const T_FUNC sn_table[] = { /* edge mode */ MAK_FUNC_0(mg_snsm_activate_ind, SN_ACTIVATE_REQ), /*0x8000009E */ MAK_FUNC_0(mg_snsm_deactivate_ind, SN_DEACTIVATE_REQ), /*0x8001009E */ #ifdef TI_DUAL_MODE MAK_FUNC_0(mg_get_pending_pdu_req, SN_GET_PENDING_PDU_REQ), /*0x8002009E */ #else MAK_FUNC_N(primitive_not_supported, SN_GET_PENDING_PDU_REQ), /* 0x8002009E */ #endif MAK_FUNC_0(mg_snsm_modify_ind, SN_MODIFY_REQ), /*0x8003009E */ MAK_FUNC_0(mg_snsm_sequence_ind, SN_SEQUENCE_REQ), /*0x8004009E */ MAK_FUNC_0(sndcp_sn_count_req, SN_COUNT_REQ), /*0x8005009E */ MAK_FUNC_0(mg_sn_dti_req, SN_DTI_REQ) /*0x8006009E */ }; #endif /*#ifdef SNDCP_UPM_INCLUDED*/ static const T_FUNC ll_table[] = { MAK_FUNC_0(mg_ll_reset_ind, LL_RESET_IND), /* 6200 */ MAK_FUNC_S(mg_ll_establish_cnf, LL_ESTABLISH_CNF), /* 6201 */ MAK_FUNC_S(mg_ll_establish_ind, LL_ESTABLISH_IND), /* 6202 */ MAK_FUNC_0(mg_ll_release_cnf, LL_RELEASE_CNF), /* 6203 */ MAK_FUNC_0(mg_ll_release_ind, LL_RELEASE_IND), /* 6204 */ MAK_FUNC_S(mg_ll_xid_cnf, LL_XID_CNF), /* 6205 */ MAK_FUNC_S(mg_ll_xid_ind, LL_XID_IND), /* 6206 */ MAK_FUNC_0(sua_ll_ready_ind, LL_READY_IND), /* 6207 */ MAK_FUNC_0(su_ll_unitready_ind, LL_UNITREADY_IND), /* 6208 */ MAK_FUNC_0(sua_ll_data_cnf, LL_DATA_CNF), /* 6209 */ MAK_FUNC_S(pda_ll_data_ind, LL_DATA_IND), /* 620A */ MAK_FUNC_S(pd_ll_unitdata_ind, LL_UNITDATA_IND), /* 620B */ MAK_FUNC_0(mg_ll_status_ind, LL_STATUS_IND) /* 620C */ }; #ifdef _SNDCP_DTI_2_ /* * Jumptable for the DTI service access point for downlink data transmission. * Contains the processing-function addresses and opcodes of * indication and confirm primitives. Use of DTILIB can be selected. * */ LOCAL const T_FUNC ddl_table_dti[] = { MAK_FUNC_0(sndcp_dti_dti_connect_ind, DTI2_CONNECT_IND), /* 7750 */ MAK_FUNC_0(sndcp_dti_dti_connect_cnf, DTI2_CONNECT_CNF), /* 7751 */ MAK_FUNC_0(sndcp_dti_dti_disconnect_ind, DTI2_DISCONNECT_IND), /* 7752 */ MAK_FUNC_0(sndcp_dti_dti_ready_ind, DTI2_READY_IND), /* 7753 */ MAK_FUNC_0(sndcp_dti_dti_data_ind, DTI2_DATA_IND) /* 7754 */ #if defined (_SIMULATION_) , MAK_FUNC_0(sndcp_dti_dti_data_test_ind, DTI2_DATA_TEST_IND) /* 7755 */ #endif }; /* * Jumptable for the DTI service access point for uplink data transmission. * Contains the processing-function addresses and opcodes of * request and response primitives. */ LOCAL const T_FUNC dul_table_dti[] = { MAK_FUNC_0(sndcp_dti_dti_connect_req, DTI2_CONNECT_REQ), /*0x3750*/ MAK_FUNC_0(sndcp_dti_dti_connect_res, DTI2_CONNECT_RES), /*0x3751*/ MAK_FUNC_0(sndcp_dti_dti_disconnect_req, DTI2_DISCONNECT_REQ), /*0x3752*/ MAK_FUNC_0(sndcp_dti_dti_getdata_req, DTI2_GETDATA_REQ), /*0x3753*/ MAK_FUNC_0(sndcp_dti_dti_data_req, DTI2_DATA_REQ) /*0x3754*/ #if defined (_SIMULATION_) , MAK_FUNC_0(sndcp_dti_dti_data_test_req, DTI2_DATA_TEST_REQ), /*0x3755*/ MAK_FUNC_N(primitive_not_supported, DTI2_DUMMY_REQ) /*0x3756*/ #endif /* _SIMULATION_ */ }; #else /*_SNDCP_DTI_2_*/ /* * Jumptable for the DTI service access point for uplink data transmission. * Contains the processing-function addresses and opcodes of * request and response primitives. */ LOCAL const T_FUNC dul_table_dti[] = { MAK_FUNC_0(sndcp_dti_dti_getdata_req, DTI_GETDATA_REQ), MAK_FUNC_0(sndcp_dti_dti_data_req, DTI_DATA_REQ) #if defined (_SIMULATION_) , MAK_FUNC_S(sndcp_dti_dti_data_test_req, DTI_DATA_TEST_REQ) #endif /* _SIMULATION_ */ }; /* * Jumptable for the DTI service access point for downlink data transmission. * Contains the processing-function addresses and opcodes of * indication and confirm primitives. Use of DTILIB can be selected. * */ LOCAL const T_FUNC ddl_table_dti[] = { MAK_FUNC_0(sndcp_dti_dti_ready_ind, DTI_READY_IND), MAK_FUNC_0(sndcp_dti_dti_data_ind, DTI_DATA_IND) #if defined (_SIMULATION_) , MAK_FUNC_S(sndcp_dti_dti_data_test_ind, DTI_DATA_TEST_IND) #endif }; #endif /* SNDCP_DTI_2_ */ /*==== DIAGNOSTICS ==========================================================*/ /*==== END DIAGNOSTICS ======================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /* +------------------------------------------------------------------------------ | Function : primitive_not_supported +------------------------------------------------------------------------------ | Description : This function handles unsupported primitives. | | Parameters : - | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void primitive_not_supported (void *data) { TRACE_FUNCTION ("primitive_not_supported"); PFREE (data); } #ifdef _SNDCP_DTI_2_ /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_connect_cnf +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI2_CONNECT_CNF. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_connect_cnf (T_DTI2_CONNECT_CNF *dti2_connect_cnf) { TRACE_FUNCTION ("sndcp_dti_dti_connect_cnf"); dti_dti_connect_cnf (sndcp_data->hDTI, dti2_connect_cnf); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_connect_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI2_CONNECT_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_connect_ind (T_DTI2_CONNECT_IND *dti2_connect_ind) { TRACE_FUNCTION ("sndcp_dti_dti_connect_ind"); dti_dti_connect_ind (sndcp_data->hDTI, dti2_connect_ind); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_disconnect_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI2_DISCONNECT_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_disconnect_ind (T_DTI2_DISCONNECT_IND *dti2_disconnect_ind) { TRACE_FUNCTION ("sndcp_dti_dti_disconnect_ind"); dti_dti_disconnect_ind (sndcp_data->hDTI, dti2_disconnect_ind); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_getdata_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_GETDATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_getdata_req (T_DTI2_GETDATA_REQ *dti2_getdata_req) { TRACE_FUNCTION ("sndcp_dti_dti_getdata_req"); dti_dti_getdata_req (sndcp_data->hDTI, dti2_getdata_req); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_data_req (T_DTI2_DATA_REQ *dti2_data_req) { TRACE_FUNCTION ("sndcp_dti_dti_data_req"); dti_dti_data_req (sndcp_data->hDTI, dti2_data_req); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_test_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_TEST_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_req (T_DTI2_DATA_TEST_REQ *dti2_data_test_req) { TRACE_FUNCTION ("sndcp_dti_dti_data_test_req"); dti_dti_data_test_req (sndcp_data->hDTI, dti2_data_test_req); } #endif /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_data_ind (T_DTI2_DATA_IND *dti2_data_ind) { TRACE_FUNCTION ("sndcp_dti_dti_data_ind"); dti_dti_data_ind (sndcp_data->hDTI, dti2_data_ind); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_ready_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_READY_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_ready_ind (T_DTI2_READY_IND *dti2_ready_ind) { TRACE_FUNCTION ("sndcp_dti_dti_ready_ind"); dti_dti_ready_ind (sndcp_data->hDTI, dti2_ready_ind); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_test_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_TEST_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_ind (T_DTI2_DATA_TEST_IND *dti2_data_test_ind) { TRACE_FUNCTION ("sndcp_dti_dti_data_test_ind"); dti_dti_data_test_ind (sndcp_data->hDTI, dti2_data_test_ind); } #endif /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_connect_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_connect_req (T_DTI2_CONNECT_REQ *dti2_connect_req) { TRACE_FUNCTION ("sndcp_dti_dti_connect_req"); dti_dti_connect_req (sndcp_data->hDTI, dti2_connect_req); /* * FreeCalypso: the following code has been #if 0'ed out because * (a) it fails compilation in the TCS211-like environment with that * compiler version, (b) it is broken fundamentally in that one needs * to call strcmp() or equivalent instead of comparing a pointer * against a string literal, and (c) we are not doing in-baseband TCP/IP * in FreeCalypso, hence it was easier to remove this code than to * work out the correct fix. */ #if 0 if ( sndcp_data->nsapi_neighbor_ra[sndcp_data->nsapi] EQ TCPIP_NAME) { mg_dti_open(sndcp_data->nsapi); } #endif } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_connect_res +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_connect_res (T_DTI2_CONNECT_RES *dti2_connect_res) { TRACE_FUNCTION ("sndcp_dti_dti_connect_res"); dti_dti_connect_res (sndcp_data->hDTI, dti2_connect_res); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_disconnect_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_disconnect_req (T_DTI2_DISCONNECT_REQ *dti2_disconnect_req) { TRACE_FUNCTION ("sndcp_dti_dti_disconnect_req"); dti_dti_disconnect_req (sndcp_data->hDTI, dti2_disconnect_req); } #else /* _SNDCP_DTI_2_ */ /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_getdata_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_GETDATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_getdata_req (T_DTI_GETDATA_REQ *dti_getdata_req) { TRACE_FUNCTION ("sndcp_dti_dti_getdata_req"); dti_dti_getdata_req (sndcp_data->hDTI, dti_getdata_req); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_data_req (T_DTI_DATA_REQ *dti_data_req) { TRACE_FUNCTION ("sndcp_dti_dti_data_req"); dti_dti_data_req (sndcp_data->hDTI, dti_data_req); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_test_req +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_TEST_REQ. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_req (T_DTI_DATA_TEST_REQ *dti_data_test_req) { TRACE_FUNCTION ("sndcp_dti_dti_data_test_req"); dti_dti_data_test_req (sndcp_data->hDTI, dti_data_test_req); } #endif /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_data_ind (T_DTI_DATA_IND *dti_data_ind) { TRACE_FUNCTION ("sndcp_dti_dti_data_ind"); dti_dti_data_ind (sndcp_data->hDTI, dti_data_ind); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_ready_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_READY_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ LOCAL void sndcp_dti_dti_ready_ind (T_DTI_READY_IND *dti_ready_ind) { TRACE_FUNCTION ("sndcp_dti_dti_ready_ind"); dti_dti_ready_ind (sndcp_data->hDTI, dti_ready_ind); } /* +------------------------------------------------------------------------------ | Function : sndcp_dti_dti_data_test_ind +------------------------------------------------------------------------------ | Description : This function handles primitive DTI_DTI_DATA_TEST_IND. | | Parameters : received primitive | | Return : - | +------------------------------------------------------------------------------ */ #ifdef _SIMULATION_ LOCAL void sndcp_dti_dti_data_test_ind (T_DTI_DATA_TEST_IND *dti_data_test_ind) { TRACE_FUNCTION ("sndcp_dti_dti_data_test_ind"); dti_dti_data_test_ind (sndcp_data->hDTI, dti_data_test_ind); } #endif #endif /* _SNDCP_DTI_2_ */ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : pei_primitive +------------------------------------------------------------------------------ | Description : This function is called by the frame when a primitive is | received and needs to be processed. | | | | MMI UPLINK | | | +-------------v------------+ | | | | | SNDCP | | | | | +------^------^-----^------+ | | | | | SM CCI LLC DOWNLINK | | | | | | | Parameters : prim - Pointer to the received primitive | | Return : PEI_OK - function succeeded | PEI_ERROR - function failed | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_primitive (void * primptr) { TRACE_FUNCTION ("pei_primitive"); if (primptr NEQ NULL) { T_PRIM *prim = (T_PRIM *)primptr; #ifdef SNDCP_UPM_INCLUDED U32 opc = (prim->custom.opc); #else USHORT opc = (USHORT)(prim->custom.opc); #endif USHORT n; const T_FUNC *table; /* * This must be called for Partition Pool supervision. Will be replaced * by another macro some time. */ VSI_PPM_REC (&prim->custom, __FILE__, __LINE__); #ifdef SNDCP_UPM_INCLUDED PTRACE_IN (opc); switch (SAP_NR(opc)) { case SAP_NR(SN_UL): table = sn_table; n = TAB_SIZE (sn_table); break; case SAP_NR(LL_DL): table = ll_table; n = TAB_SIZE (ll_table); break; case DTI2_DL: opc -= 0x50; table = ddl_table_dti; n = TAB_SIZE (ddl_table_dti); break; case DTI2_UL: opc -= 0x50; table = dul_table_dti; n = TAB_SIZE (dul_table_dti); break; default: table = NULL; n = 0; break; } #else /*#ifdef SNDCP_UPM_INCLUDED*/ PTRACE_IN (opc); switch (SAP_NR(opc)) { case SAP_NR(SN_UL): table = sn_table; n = TAB_SIZE (sn_table); break; case SNSM_DL: table = snsm_table; n = TAB_SIZE (snsm_table); break; case SAP_NR(LL_DL): table = ll_table; n = TAB_SIZE (ll_table); break; #ifdef _SNDCP_DTI_2_ case DTI2_DL: opc -= 0x50; table = ddl_table_dti; n = TAB_SIZE (ddl_table_dti); break; case DTI2_UL: opc -= 0x50; table = dul_table_dti; n = TAB_SIZE (dul_table_dti); break; #else /* _SNDCP_DTI_2_ */ case DTI_DL: table = ddl_table_dti; n = TAB_SIZE (ddl_table_dti); break; case DTI_UL: table = dul_table_dti; n = TAB_SIZE (dul_table_dti); break; #endif /* _SNDCP_DTI_2_ */ default: table = NULL; n = 0; break; } #endif if (table != NULL) { #ifdef SNDCP_UPM_INCLUDED if ((PRIM_NR(opc)) < n) { table += PRIM_NR(opc); #else if ((opc & PRM_MASK) < n) { table += opc & PRM_MASK; #endif #ifdef PALLOC_TRANSITION P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0; #ifndef NO_COPY_ROUTING P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER); #endif /* NO_COPY_ROUTING */ #endif /* PALLOC_TRANSITION */ JUMP (table->func) (P2D(prim)); } else { primitive_not_supported (P2D(prim)); } return PEI_OK; } /* * primitive is not a GSM primitive - forward it to the environment */ if (opc & SYS_MASK) vsi_c_primitive (VSI_CALLER prim); else { PFREE (P2D(prim)); return PEI_ERROR; } } return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_init +------------------------------------------------------------------------------ | Description : This function is called by the frame. It is used to initialise | the entitiy. | | Parameters : handle - task handle | | Return : PEI_OK - entity initialised | PEI_ERROR - entity not (yet) initialised | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_init (T_HANDLE handle) { #ifdef FLOW_TRACE UBYTE i = 0; UBYTE j = 0; UBYTE k = 0; #endif TRACE_FUNCTION ("pei_init"); /* * Initialize task handle */ SNDCP_handle = handle; /* * Open communication channels */ if (hCommMMI < VSI_OK) { #ifdef _SNDCP_DTI_2_ if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK) return PEI_ERROR; } #else /* _SNDCP_DTI_2_ */ if ((hCommMMI = vsi_c_open (VSI_CALLER MMI_NAME)) < VSI_OK) return PEI_ERROR; } #endif /* _SNDCP_DTI_2_ */ #ifdef SNDCP_UPM_INCLUDED if (hCommUPM < VSI_OK) { if ((hCommUPM = vsi_c_open (VSI_CALLER UPM_NAME)) < VSI_OK) return PEI_ERROR; } #else if (hCommSM < VSI_OK) { if ((hCommSM = vsi_c_open (VSI_CALLER SM_NAME)) < VSI_OK) return PEI_ERROR; } #endif /*#ifdef SNDCP_UPM_INCLUDED*/ if (hCommLLC < VSI_OK) { if ((hCommLLC = vsi_c_open (VSI_CALLER LLC_NAME)) < VSI_OK) return PEI_ERROR; } /* * Initialize global pointer sndcp_data. This is required to access all * entity data. */ sndcp_data = &sndcp_data_base; #ifdef FLOW_TRACE for(i = 0; i < 5; i++) { for (j = 0; j < 2; j++) { for (k = 0; j < 2; j++) { sndcp_trace_flow_control(i, j, k, FALSE); } } } #endif /* * Initialize global data. * * These arrays are not reset here: * nsapi_qos_ra, * nsapi_sapi_ra, * nsapi_prio_ra, * nsapi_tlli_ra, * */ { UBYTE nsapi = 0; UBYTE sapi_index = 0; for (nsapi = 0; nsapi < SNDCP_NUMBER_OF_NSAPIS; nsapi++) { sndcp_data->nsapi_used_ra[nsapi] = FALSE; sndcp_data->nsapi_ack_ra[nsapi] = FALSE; sndcp_data->nsapi_state_ra[nsapi] = MG_IDLE; sndcp_data->nsapi_direction_ra[nsapi] = FALSE; sndcp_data->nsapi_interface_ra[nsapi] = SNDCP_INTERFACE_UNACK; sndcp_data->nsapi_linkid_ra[nsapi] = 0; sndcp_data->nsapi_neighbor_ra[nsapi] = NULL; sndcp_data->cur_segment_number[nsapi] = 0; #ifdef _SNDCP_MEAN_TRACE_ sndcp_data->start_time_uplink_ack [nsapi] = 0; sndcp_data->start_time_uplink_unack [nsapi] = 0; sndcp_data->start_time_downlink_ack [nsapi] = 0; sndcp_data->start_time_downlink_unack [nsapi] = 0; sndcp_data->cur_time_uplink_ack [nsapi] = 0; sndcp_data->cur_time_uplink_unack [nsapi] = 0; sndcp_data->cur_time_downlink_ack [nsapi] = 0; sndcp_data->cur_time_downlink_unack [nsapi] = 0; sndcp_data->cur_num_uplink_ack [nsapi] = 0; sndcp_data->cur_num_uplink_unack [nsapi] = 0; sndcp_data->cur_num_downlink_ack [nsapi] = 0; sndcp_data->cur_num_downlink_unack [nsapi] = 0; sndcp_data->cur_pac_uplink_ack [nsapi] = 0; sndcp_data->cur_pac_uplink_unack [nsapi] = 0; sndcp_data->cur_pac_downlink_ack [nsapi] = 0; sndcp_data->cur_pac_downlink_unack [nsapi] = 0; #ifndef NCONFIG sndcp_data->data_count[nsapi] = 0; #endif #endif /* _SNDCP_MEAN_TRACE_ */ } for (sapi_index = 0; sapi_index < SNDCP_NUMBER_OF_SAPIS; sapi_index++) { sndcp_data->sapi_ack_ra[sapi_index] = FALSE; sndcp_data->sapi_state_ra[sapi_index] = MG_IDLE; } } sndcp_data->vj_count = 0; sndcp_data->always_xid = TRUE; #ifndef NCONFIG sndcp_data->millis = 0; #endif sndcp_data->trace_ip_header = FALSE; sndcp_data->trace_ip_datagram = FALSE; sndcp_data->trace_ip_bin = FALSE; sndcp_data->ip_filter = FALSE; sndcp_data->nsapi_rcv_rdy_b4_used=0; /* * Initialize entity data (call init function of every service) */ cia_init(); mg_init(); nd_init(); nu_init(); pd_init(); pda_init(); sd_init(); sda_init(); su_init(); sua_init(); sndcp_data->hDTI = dti_init(SNDCP_MAX_DTI_LINKS, /* U8 maximum_links */ SNDCP_handle, /* T_HANDLE handle, */ #ifdef _SNDCP_DTI_2_ DTI_DEFAULT_OPTIONS, /* U32 */ #endif /* _SNDCP_DTI_2_ */ sndcp_sig_callback); return (PEI_OK); } /* +------------------------------------------------------------------------------ | Function : pei_timeout +------------------------------------------------------------------------------ | Description : This function is called by the frame when a timer has expired. | | Parameters : index - timer index | | Return : PEI_OK - timeout processed | PEI_ERROR - timeout not processed | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_timeout (USHORT index) { TRACE_FUNCTION ("pei_timeout"); /* * Process timeout */ if (index < TIMER_MAX) { mg_exp_re_est_timer((UBYTE)index); } else { TRACE_ERROR("Unknown Timeout"); } return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_signal +------------------------------------------------------------------------------ | Description : This function is called by the frame when a signal has been | received. | | Parameters : opc - signal operation code | *data - pointer to primitive | | Return : PEI_OK - signal processed | PEI_ERROR - signal not processed | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_signal (ULONG opc, void *data) { TRACE_FUNCTION ("pei_signal"); /* * Process signal */ /* switch (opc) { default: */ TRACE_ERROR("Unknown Signal OPC"); /* break; } */ return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_exit +------------------------------------------------------------------------------ | Description : This function is called by the frame when the entity is | terminated. All open resources are freed. | | Parameters : - | | Return : PEI_OK - exit sucessful | PEI_ERROR - exit not sueccessful | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_exit (void) { UBYTE nsapi = 0; TRACE_FUNCTION ("pei_exit"); /* * Close communication channels */ vsi_c_close (VSI_CALLER hCommMMI); hCommMMI = VSI_ERROR; #ifdef SNDCP_UPM_INCLUDED vsi_c_close (VSI_CALLER hCommUPM); hCommUPM = VSI_ERROR; #else vsi_c_close (VSI_CALLER hCommSM); hCommSM = VSI_ERROR; #endif vsi_c_close (VSI_CALLER hCommLLC); hCommLLC = VSI_ERROR; for (nsapi = 0; nsapi < SNDCP_NUMBER_OF_NSAPIS; nsapi++) { mg_delete_npdus(nsapi); } dti_deinit(sndcp_data->hDTI); sndcp_data->hDTI = NULL; return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_run +------------------------------------------------------------------------------ | Description : This function is called by the frame when entering the main | loop. This fucntion is only required in the active variant. | | This function is not used. | | Parameters : handle - Communication handle | | Return : PEI_OK - sucessful | PEI_ERROR - not successful | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_run (T_HANDLE TaskHandle, T_HANDLE ComHandle ) { /* * !!!!! Does not compile! * T_QMSG Message; TRACE_FUNCTION ("pei_run"); if (pei_init (TaskHandle) != PEI_OK) return PEI_ERROR; while (!exit_flag) { vsi_c_await (VSI_CALLER ComHandle, &Message); switch (Message.MsgType) { case MSG_PRIMITIVE: pei_primitive (Message.Msg.Primitive.Prim ); break; case MSG_SIGNAL: pei_signal ( (USHORT)Message.Msg.Signal.SigOPC, Message.Msg.Signal.SigBuffer ); break; case MSG_TIMEOUT: pei_timeout ( (USHORT)Message.Msg.Timer.Index ); break; default: TRACE_ERROR("Unknown Message Type"); break; } } * * */ return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_config +------------------------------------------------------------------------------ | Description : This function is called by the frame when a primitive is | received indicating dynamic configuration. | | This function is not used in this entity. | | Parameters : handle - Communication handle | | Return : PEI_OK - sucessful | PEI_ERROR - not successful | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_config (char *inString) { TRACE_FUNCTION ("pei_config"); TRACE_FUNCTION (inString); #ifndef NCONFIG /* * Parse next keyword and number of variables */ /*if(!strcmp(inString,"DISCARD")) {*/ if (inString[0] == 'D' && /* DISCARD NSAPI */ inString[1] == 'I' && inString[2] == 'S' && inString[3] == 'C' && inString[4] == 'A' && inString[5] == 'R' && inString[6] == 'D') { UBYTE nsapi = (UBYTE)atoi(&inString[8]); TRACE_EVENT_P1("Each DTI2_DATA Prim on NSAPI %d will be discarded", nsapi); nu_config_discard(nsapi); } else if (inString[0] == 'R' && /* RESUME NSAPI */ inString[1] == 'E' && inString[2] == 'S' && inString[3] == 'U' && inString[4] == 'M' && inString[5] == 'E') { UBYTE nsapi = (UBYTE)atoi(&inString[7]); TRACE_EVENT_P1 ("Each DTI2_DATA Prim on NSAPI %d will be forwarded", nsapi); nu_config_resume(nsapi); } else if (inString[0] == 'S' && inString[1] == 'E' && inString[2] == 'N' && inString[3] == 'D') { UBYTE nsapi = (UBYTE)atoi(&inString[4]); U32 octets = (U32)atoi(&inString[7]); nu_config_send(nsapi, octets); } else if (inString[0] == 'P' && inString[1] == 'R' && inString[2] == 'I' && inString[3] == 'O') { UBYTE nsapi = (UBYTE)atoi(&inString[4]); UBYTE prio = (UBYTE)atoi(&inString[7]); sndcp_set_nsapi_prio(nsapi, prio); } else if (inString[0] == 'N' && inString[1] == 'O' && inString[2] == ' ' && inString[3] == 'X' && inString[4] == 'I' && inString[5] == 'D') { sndcp_no_xid(); } else if (inString[0] == 'D' && inString[1] == 'E' && inString[2] == 'L' && inString[3] == 'A' && inString[4] == 'Y') { USHORT millis = (USHORT)atoi(&inString[5]); mg_config_delay(millis); } else if (inString[0] == 'T' && /* TRACE_HEADER_ON */ inString[1] == 'R' && inString[2] == 'A' && inString[3] == 'C' && inString[4] == 'E' && inString[5] == '_' && inString[6] == 'H' && inString[7] == 'E' && inString[8] == 'A' && inString[9] == 'D' && inString[10] == 'E' && inString[11] == 'R' && inString[12] == '_' && inString[13] == 'O' && inString[14] == 'N') { sndcp_data->trace_ip_header = TRUE; } else if (inString[0] == 'T' && /* TRACE_HEADER_OFF */ inString[1] == 'R' && inString[2] == 'A' && inString[3] == 'C' && inString[4] == 'E' && inString[5] == '_' && inString[6] == 'H' && inString[7] == 'E' && inString[8] == 'A' && inString[9] == 'D' && inString[10] == 'E' && inString[11] == 'R' && inString[12] == '_' && inString[13] == 'O' && inString[14] == 'F' && inString[15] == 'F') { sndcp_data->trace_ip_header = FALSE; }else if (inString[0] == 'T' && /* TRACE_PACKET_ON */ inString[1] == 'R' && inString[2] == 'A' && inString[3] == 'C' && inString[4] == 'E' && inString[5] == '_' && inString[6] == 'P' && inString[7] == 'A' && inString[8] == 'C' && inString[9] == 'K' && inString[10] == 'E' && inString[11] == 'T' && inString[12] == '_' && inString[13] == 'O' && inString[14] == 'N') { sndcp_data->trace_ip_datagram = TRUE; } else if (inString[0] == 'T' && /* TRACE_PACKET_OFF */ inString[1] == 'R' && inString[2] == 'A' && inString[3] == 'C' && inString[4] == 'E' && inString[5] == '_' && inString[6] == 'P' && inString[7] == 'A' && inString[8] == 'C' && inString[9] == 'K' && inString[10] == 'E' && inString[11] == 'T' && inString[12] == '_' && inString[13] == 'O' && inString[14] == 'F' && inString[15] == 'F') { sndcp_data->trace_ip_datagram = FALSE; #ifdef TI_PS_OP_ICUT_SNDCP /* PDP_TBR added SNDCP terminal loopback */ } else if ( inString[0] == 'L' && inString[1] == 'O' && inString[2] == 'O' && inString[3] == 'P' && inString[4] == 'B' && inString[5] == 'A' && inString[6] == 'C' && inString[7] == 'K') { SNDCP_LOOPBACK = 1; TRACE_EVENT("SNDCP LOOPBACK"); #endif /* TI_PS_OP_ICUT_SNDCP */ } else if (inString[0] == 'T' && /* TRACE_IP_BIN */ inString[1] == 'R' && inString[2] == 'A' && inString[3] == 'C' && inString[4] == 'E' && inString[5] == '_' && inString[6] == 'I' && inString[7] == 'P' && inString[8] == '_' && inString[9] == 'B' && inString[10] == 'I' && inString[11] == 'N') { sndcp_data->trace_ip_bin = TRUE; } else if (inString[0] == 'I' && /* IP_FILTER_OFF */ inString[1] == 'P' && inString[2] == '_' && inString[3] == 'F' && inString[4] == 'I' && inString[5] == 'L' && inString[6] == 'T' && inString[7] == 'E' && inString[8] == 'R' && inString[9] == '_' && inString[10] == 'O' && inString[11] == 'F' && inString[12] == 'F') { TRACE_EVENT("INFO IP FILTER: IP filter is disabled."); sndcp_data->ip_filter = FALSE; } else if (inString[0] == 'I' && /* IP_FILTER_ON */ inString[1] == 'P' && inString[2] == '_' && inString[3] == 'F' && inString[4] == 'I' && inString[5] == 'L' && inString[6] == 'T' && inString[7] == 'E' && inString[8] == 'R' && inString[9] == '_' && inString[10] == 'O' && inString[11] == 'N') { TRACE_EVENT("INFO IP FILTER: IP filter is enabled."); sndcp_data->ip_filter = TRUE; } else { TRACE_EVENT("ERROR PEI SNDCP: unknown Config Primitive!"); } #endif return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_monitor +------------------------------------------------------------------------------ | Description : This function is called by the frame in case sudden entity | specific data is requested (e.g. entity Version). | | Parameters : out_monitor - return the address of the data to be | monitoredCommunication handle | | Return : PEI_OK - sucessful (address in out_monitor is valid) | PEI_ERROR - not successful | +------------------------------------------------------------------------------ */ LOCAL SHORT pei_monitor (void ** out_monitor) { TRACE_FUNCTION ("pei_monitor"); /* * Version = "0.S" (S = Step). */ sndcp_mon.version = "SNDCP 0.1"; *out_monitor = &sndcp_mon; return PEI_OK; } /* +------------------------------------------------------------------------------ | Function : pei_create +------------------------------------------------------------------------------ | Description : This function is called by the frame when the process is | created. | | Parameters : out_name - Pointer to the buffer in which to locate | the name of this entity | | Return : PEI_OK - entity created successfuly | PEI_ERROR - entity could not be created | +------------------------------------------------------------------------------ */ GLOBAL SHORT pei_create (T_PEI_INFO **info) { static T_PEI_INFO pei_info = { "SND", /* name */ { /* pei-table */ pei_init, pei_exit, pei_primitive, pei_timeout, pei_signal, pei_run, pei_config, pei_monitor }, 1536, /* stack size */ 10, /* queue entries */ 185, /* priority (1->low, 255->high) */ TIMER_MAX, /* number of timers */ 0x03|PRIM_NO_SUSPEND /* flags: bit 0 active(0) body/passive(1) */ }; /* bit 1 com by copy(0)/reference(1) */ TRACE_FUNCTION ("pei_create"); /* * Close Resources if open */ if (first_access) first_access = FALSE; else pei_exit(); /* * Export startup configuration data */ *info = &pei_info; return PEI_OK; } /*==== END OF FILE ==========================================================*/