FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/aci/psa_ssf.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children | b522307de6f2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/aci/psa_ssf.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,1561 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : PSA_SSF ++----------------------------------------------------------------------------- +| 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 defines the functions for the protocol +| stack adapter for supplementary services. ++----------------------------------------------------------------------------- +*/ + +#ifndef PSA_SSF_C +#define PSA_SSF_C +#endif + +#include "aci_all.h" + +#undef TRACING + +/*==== INCLUDES ===================================================*/ +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_cmd.h" + +#include "ksd.h" +#include "aci.h" +#include "psa.h" +#include "psa_ss.h" +#include "psa_util.h" +#include "cmh_ss.h" +#include "cmh.h" + +/*==== CONSTANTS ==================================================*/ +#define MAX_MOSTI_NR (7) /* max number of ti's for MOS */ + +#define MAX_ITM (5) /* max number of items per line */ +#define ITM_WDT (14) /* item width in chars */ +#define HDR_WDT (10) /* header width in chars */ + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ + +/*==== VARIABLES ==================================================*/ +LOCAL UBYTE tiPool = 0xFF; /* holds pool of transaction identifiers */ + +/*==== FUNCTIONS ==================================================*/ + +LOCAL void psaSS_asmSSForBS ( UBYTE ssCode, UBYTE bscSrvType, + UBYTE bscSrv, T_ssForBS *ssForBS); + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmEmptyRslt | ++-------------------------------------------------------------------+ + + PURPOSE : assemble an empty return result facility information + element. + +*/ + +GLOBAL void psaSS_asmEmptyRslt ( void ) +{ + TRACE_FUNCTION("psaSS_asmEmptyRslt"); + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + + ssFIECodeBuf.l_buf = 8; + + ssShrdPrm.cmpType = CT_RET_RSLT; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmErrorRslt | ++-------------------------------------------------------------------+ + + PURPOSE : assemble an return error facility information + element. + +*/ + +GLOBAL void psaSS_asmErrorRslt ( SHORT sId, UBYTE err ) +{ + TRACE_FUNCTION("psaSS_asmErrorRslt"); + + ssShrdPrm.stb[sId].failType = SSF_SS_ERR; + ssShrdPrm.stb[sId].errCd = err; + ssShrdPrm.cmpType = CT_RET_ERR; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmInterrogateSS | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the interrogate SS facility information element. + +*/ + +GLOBAL void psaSS_asmInterrogateSS ( UBYTE ssCode, + UBYTE bscSrvType, + UBYTE bscSrv ) +{ + MCAST( irgtSS, INTERROGATE_SS_INV ); + + TRACE_FUNCTION("psaSS_asmInterrogateSS"); + + memset( irgtSS, 0, sizeof( T_INTERROGATE_SS_INV )); + + /* set basic settings */ + irgtSS->msg_type = INTERROGATE_SS_INV; + irgtSS->v_ssForBS = TRUE; + + /* set service code */ + irgtSS->ssForBS.v_ssCode = TRUE; + irgtSS->ssForBS.ssCode = ssCode; + + /* set basic service type */ + switch( bscSrvType ) + { + case( BS_BEAR_SRV ): + + irgtSS->ssForBS.basicService.v_bearerService = TRUE; + irgtSS->ssForBS.basicService.bearerService = bscSrv; + break; + + case( BS_TELE_SRV ): + + irgtSS->ssForBS.basicService.v_teleservice = TRUE; + irgtSS->ssForBS.basicService.teleservice = bscSrv; + break; + + default: + irgtSS->ssForBS.basicService.v_bearerService = FALSE; + irgtSS->ssForBS.basicService.v_teleservice = FALSE; + } + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmRegisterSS | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the register SS facility information element. + +*/ + +GLOBAL void psaSS_asmRegisterSS ( UBYTE ssCode, UBYTE bscSrvType, + UBYTE bscSrv, UBYTE ton, UBYTE npi, + UBYTE *num, UBYTE tos, UBYTE oe, + UBYTE *sub, UBYTE time ) +{ + MCAST( regSS, REGISTER_SS_INV ); + + TRACE_FUNCTION("psaSS_asmRegisterSS"); + + memset( regSS, 0, sizeof( T_REGISTER_SS_INV )); + + /* set basic settings */ + regSS->msg_type = REGISTER_SS_INV; + regSS->v_registerSSArg = TRUE; + + /* set service code */ + regSS->registerSSArg.v_ssCode = TRUE; + regSS->registerSSArg.ssCode = ssCode; + + /* set basic service type */ + switch( bscSrvType ) + { + case( BS_BEAR_SRV ): + + regSS->registerSSArg.basicService.v_bearerService = TRUE; + regSS->registerSSArg.basicService.bearerService = bscSrv; + break; + + case( BS_TELE_SRV ): + + regSS->registerSSArg.basicService.v_teleservice = TRUE; + regSS->registerSSArg.basicService.teleservice = bscSrv; + break; + } + + /* set forwarded to number */ + if( num NEQ NULL ) + { + regSS->registerSSArg.v_forwardedToNumber = TRUE; + regSS->registerSSArg.forwardedToNumber.c_bcdDigit + = (UBYTE)utl_dialStr2BCD((char *) num, + regSS->registerSSArg.forwardedToNumber.bcdDigit, + MAX_PARTY_NUM); + + if(ton NEQ MNCC_TON_NOT_PRES AND + npi NEQ MNCC_NPI_NOT_PRES) + { + regSS->registerSSArg.forwardedToNumber.v_noa = TRUE; + regSS->registerSSArg.forwardedToNumber.noa = ton; + + regSS->registerSSArg.forwardedToNumber.v_npi = TRUE; + regSS->registerSSArg.forwardedToNumber.npi = npi; + } + } + + /* set forwarded to subaddress */ + if( sub NEQ NULL ) + { + regSS->registerSSArg.v_forwardedToSubaddress = TRUE; + regSS->registerSSArg.forwardedToSubaddress.c_subadr_str + = (UBYTE)utl_dialStr2BCD((char *) sub, + regSS->registerSSArg.forwardedToSubaddress.subadr_str, + MAX_SUBADDR_NUM); + + regSS->registerSSArg.forwardedToSubaddress.v_tos = TRUE; + regSS->registerSSArg.forwardedToSubaddress.tos = tos; + + regSS->registerSSArg.forwardedToSubaddress.v_oei = TRUE; + regSS->registerSSArg.forwardedToSubaddress.oei = oe; + } + + /* set no reply timer */ +//TISH, patch for OMAPS00130690 +#if 0 + if( ssCode EQ SS_CD_CFNRY AND time NEQ KSD_TIME_NONE ) +#else + if( ((ssCode EQ SS_CD_CFNRY) OR (ssCode EQ SS_CD_ALL_FWSS) OR (ssCode EQ SS_CD_ALL_CFWSS)) AND time NEQ KSD_TIME_NONE ) +#endif +//end + { + regSS->registerSSArg.v_noReplyConditionTime = TRUE; + regSS->registerSSArg.noReplyConditionTime = time; + } + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmEraseSS | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the erase SS facility information element. + +*/ + +GLOBAL void psaSS_asmEraseSS ( UBYTE ssCode, UBYTE bscSrvType, + UBYTE bscSrv ) +{ + MCAST( ersSS, ERASE_SS_INV ); + + TRACE_FUNCTION("psaSS_asmEraseSS"); + + memset( ersSS, 0, sizeof( T_ERASE_SS_INV )); + + /* set basic settings */ + ersSS->msg_type = ERASE_SS_INV; + ersSS->v_ssForBS = TRUE; + + /* Implements Measure # 194 */ + psaSS_asmSSForBS ( ssCode, bscSrvType, bscSrv, &(ersSS->ssForBS)); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmActivateSS | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the interrogate SS facility information element. + +*/ + +GLOBAL void psaSS_asmActivateSS ( UBYTE ssCode, UBYTE bscSrvType, + UBYTE bscSrv ) +{ + MCAST( actSS, ACTIVATE_SS_INV ); + + TRACE_FUNCTION("psaSS_asmActivateSS"); + + memset( actSS, 0, sizeof( T_ACTIVATE_SS_INV )); + + /* set basic settings */ + actSS->msg_type = ACTIVATE_SS_INV; + actSS->v_ssForBS = TRUE; + + /* Implements Measure # 194 */ + psaSS_asmSSForBS ( ssCode, bscSrvType, bscSrv, &(actSS->ssForBS)); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmDeactivateSS | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the deactivate SS facility information element. + +*/ + +GLOBAL void psaSS_asmDeactivateSS ( UBYTE ssCode, UBYTE bscSrvType, + UBYTE bscSrv ) +{ + MCAST( deactSS, DEACTIVATE_SS_INV ); + + TRACE_FUNCTION("psaSS_asmDeactivateSS"); + + memset( deactSS, 0, sizeof( T_DEACTIVATE_SS_INV )); + + /* set basic settings */ + deactSS->msg_type = DEACTIVATE_SS_INV; + deactSS->v_ssForBS = TRUE; + + /* Implements Measure # 195 */ + psaSS_asmSSForBS ( ssCode, bscSrvType, bscSrv, &(deactSS->ssForBS)); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmRegisterPWD | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the register password facility information + element. + +*/ + +GLOBAL void psaSS_asmRegisterPWD ( UBYTE ssCode ) +{ + MCAST( regPWD, REGISTER_PWD_INV ); + + TRACE_FUNCTION("psaSS_asmRegisterPWD"); + + memset( regPWD, 0, sizeof( T_REGISTER_PWD_INV )); + + /* set service code */ + regPWD->v_ssCode = TRUE; + regPWD->ssCode = ssCode; + regPWD->msg_type = REGISTER_PWD_INV; + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmVerifyPWD | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the verify password facility information + element. + +*/ + +GLOBAL void psaSS_asmVerifyPWD ( UBYTE *pwd ) +{ + MCAST( vrfPWD, GET_PWD_RES ); + + TRACE_FUNCTION("psaSS_asmVerifyPWD"); + + memset( vrfPWD, 0, sizeof( T_GET_PWD_RES )); + + /* set service code */ + vrfPWD->v_currPassword = TRUE; + vrfPWD->msg_type = GET_PWD_RES; + + strncpy( (char *) vrfPWD->currPassword.digit, (char *) pwd, MAX_PWD_NUM ); + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_RET_RSLT; + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmProcUSSDReq | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the process USSD request facility information + element. + +*/ + +GLOBAL void psaSS_asmProcUSSDReq ( UBYTE dcs, UBYTE *ussd, UBYTE len ) +{ +/* UBYTE cmpLen;*/ + + MCAST( ussdReq, PROCESS_USSD_REQ_INV ); + + TRACE_FUNCTION("psaSS_asmProcUSSDReq"); + + memset( ussdReq, 0, sizeof( T_PROCESS_USSD_REQ_INV )); + + /* set service code */ + ussdReq->v_ussdArg = TRUE; + ussdReq->msg_type = PROCESS_USSD_REQ_INV; + + /* set data coding scheme */ + ussdReq->ussdArg.v_ussdDataCodingScheme = TRUE; + ussdReq->ussdArg.ussdDataCodingScheme = dcs; + + /* set ussd response string */ +/* if( utl_getAlphabetCb( dcs ) EQ 0 ) *//* 7bit alphabet */ +/* cmpLen = utl_cvt8To7( ussd, (UBYTE)MINIMUM( MAX_USSD_STRING, len), + ussdReq->ussdArg.ussdString.b_ussdString, 0 ); + else*/ + { +/* cmpLen = len;*/ + memcpy( ussdReq->ussdArg.ussdString.b_ussdString, ussd, + MINIMUM( MAX_USSD_STRING, len)); + } + + ussdReq->ussdArg.v_ussdString = TRUE; + ussdReq->ussdArg.ussdString.o_ussdString = 0; + ussdReq->ussdArg.ussdString.l_ussdString = len<<3; /*cmpLen<<3;*/ + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmCnfUSSDReq | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the confirm USSD request facility information + element. +*/ + +GLOBAL void psaSS_asmCnfUSSDReq ( UBYTE dcs, UBYTE *ussd, UBYTE len ) +{ + UBYTE cmpLen; + UBYTE src_len; + + MCAST( ussdReq, USSD_REQ_RES ); + + TRACE_FUNCTION("psaSS_asmCnfUSSDReq"); + + memset( ussdReq, 0, sizeof( T_USSD_REQ_RES )); + + /* set service code */ + ussdReq->v_ussdRes = TRUE; + ussdReq->msg_type = USSD_REQ_RES; + + /* set data coding scheme */ + ussdReq->ussdRes.v_ussdDataCodingScheme = TRUE; + ussdReq->ussdRes.ussdDataCodingScheme = dcs; + + /* set ussd response string */ + /* Implements Measure 25 */ + /* This function is more correct than utl_getAlphabetCb as it takes care + of reserved codings */ + if( cmh_getAlphabetCb( dcs ) EQ 0 ) /* 7bit alphabet */ + { + src_len = (UBYTE)MINIMUM( MAX_USSD_STRING, len); + cmpLen = utl_cvt8To7( ussd, src_len, + ussdReq->ussdRes.ussdString.b_ussdString, 0 ); + /* According to spec 23.038 section 6.1.2.3 for USSD packing, for bytes end with + * (8*n)-1 i.e where n is 1,2,3....i.e byte 7, 15, 23 ... to be padded + * with carriage return <CR>(0xD) + */ + if ((src_len+1)%8 EQ 0) + { + ussdReq->ussdRes.ussdString.b_ussdString[cmpLen-1] |= (0xD << 1); + } + } + else + { + cmpLen = len; + memcpy( ussdReq->ussdRes.ussdString.b_ussdString, ussd, + MINIMUM( MAX_USSD_STRING, len)); + } + + ussdReq->ussdRes.v_ussdString = TRUE; + ussdReq->ussdRes.ussdString.o_ussdString = 0; + ussdReq->ussdRes.ussdString.l_ussdString = cmpLen<<3; + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_RET_RSLT; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_USSDProt1 | ++-------------------------------------------------------------------+ + + PURPOSE : send USSD according to protocol version 1. +*/ + +GLOBAL BOOL psaSS_asmUSSDProt1 ( SHORT sId ) +{ + UBYTE ussdBuf8Bit[MAX_USSD_STRING]; /* buffers 8 bit ussd string */ + USHORT ussdLen8Bit; + + TRACE_FUNCTION("psaSS_asmUSSDProt1"); + + if( ssShrdPrm.ussdLen AND + ssShrdPrm.stb[sId].SSver NEQ NOT_PRESENT_8BIT ) + { + MCAST( ussdData, PROCESS_USSD_INV ); + + memset( ussdData, 0, sizeof( T_PROCESS_USSD_INV )); + + /* set service code */ + ussdData->v_ssUserData = TRUE; + ussdData->msg_type = PROCESS_USSD_INV; + + /* GSM data must be 8-bit coded */ + if (ssShrdPrm.ussdDcs EQ 0x0F) + { + ussdLen8Bit = utl_cvt7To8 (ssShrdPrm.ussdBuf, ssShrdPrm.ussdLen, ussdBuf8Bit, 0); + } + else + { + memcpy ( ussdBuf8Bit, ssShrdPrm.ussdBuf, ssShrdPrm.ussdLen); + ussdLen8Bit = ssShrdPrm.ussdLen; + } + + /* set ussd data string, if convertible */ + if( !utl_cvtGsmIra ( ussdBuf8Bit, + ussdLen8Bit, + ussdData->ssUserData.b_ssUserData, + MAX_USSD_DATA, + CSCS_DIR_GsmToIra ) ) + { + return( FALSE ); + } + + ussdData->ssUserData.o_ssUserData = 0; + ussdData->ssUserData.l_ssUserData = ssShrdPrm.ussdLen<<3; + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; + + /* skip SS version indicator */ + ssShrdPrm.stb[sId].SSver = NOT_PRESENT_8BIT; + + /* repeat USSD string */ + psaSS_NewTrns(sId); + + return( TRUE ); + } + + return( FALSE ); +} + + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmDeactivateCCBS | ++-------------------------------------------------------------------+ + + PURPOSE : assemble the deactivate CCBS facility information + element. + +*/ + +GLOBAL void psaSS_asmDeactivateCCBS ( UBYTE idx ) +{ + MCAST( ersCCBS, ERASE_CC_ENTRY_INV ); + + TRACE_FUNCTION("psaSS_asmDeactivateCCBS"); + + memset( ersCCBS, 0, sizeof( T_ERASE_CC_ENTRY_INV )); + + /* set service code */ + ersCCBS->v_eraseCCEntryArg = TRUE; + ersCCBS->msg_type = ERASE_CC_ENTRY_INV; + + ersCCBS->eraseCCEntryArg.v_ssCode = TRUE; + ersCCBS->eraseCCEntryArg.ssCode = SS_CD_CCBS; + + if( idx NEQ KSD_IDX_NONE ) + { + ersCCBS->eraseCCEntryArg.v_ccbsIndex = TRUE; + ersCCBS->eraseCCEntryArg.ccbsIndex = idx; + } + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_dasmInvokeCmp | ++-------------------------------------------------------------------+ + + PURPOSE : disassemble the result component. +*/ + +GLOBAL void psaSS_dasmInvokeCmp ( SHORT sId, T_inv_comp *invCmp ) +{ + USHORT ivId; /* holds invoke Id */ + UBYTE opCode; /* holds operation code */ + + TRACE_FUNCTION("psaSS_dasmInvokeCmp"); + + if( invCmp -> v_inv_id ) + ivId = invCmp -> inv_id; + else + ivId = NOT_PRESENT_16BIT; + + if( invCmp -> v_op_code ) + opCode = invCmp -> op_code; + else + opCode = NOT_PRESENT_8BIT; + + /* store op code and invoke id for result */ + ssShrdPrm.stb[sId].iId = (UBYTE)ivId; + ssShrdPrm.stb[sId].opCode = opCode; + + if( invCmp -> params.l_params ) + { + UBYTE ccdRet; + + memcpy( ssFIEDecodeBuf, &invCmp -> params, MNCC_FACILITY_LEN ); + + ccdRet = ccd_decodeMsg (CCDENT_FAC, + DOWNLINK, + (T_MSGBUF *) ssFIEDecodeBuf, + (UBYTE *) _decodedMsg, + opCode); + + if( ccdRet NEQ ccdOK ) + { + TRACE_EVENT_P1("CCD Decoding Error: %d",ccdRet ); + ssShrdPrm.stb[sId].failType = SSF_CCD_DEC; + cmhSS_TransFail(sId); + } + } + else + memset( ssFIEDecodeBuf, 0, MNCC_FACILITY_LEN ); /* put all valid flags to FALSE */ + + switch( opCode ) + { + case( OPC_GET_PASSWORD ): + { + MCAST( getPWD, GET_PWD_INV ); + + cmhSS_getPassword( sId, getPWD ); + } + break; + + case( OPC_UNSTRUCT_SS_NOTIFY ): + { + MCAST( ussdNtfy, USSD_NOTIFY_INV ); + + cmhSS_USSDNotify( sId, ussdNtfy ); + } + break; + + case( OPC_UNSTRUCT_SS_REQ ): + { + MCAST( ussdReq, USSD_REQ_INV ); + + cmhSS_USSDRequest( sId, ussdReq ); + } + break; + + case( OPC_FWD_CHECK_SS_IND ): + { + cmhSS_FwdChckSS( sId ); + } + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_dasmResultCmp | ++-------------------------------------------------------------------+ + + PURPOSE : disassemble the result component. +*/ + +GLOBAL void psaSS_dasmResultCmp ( SHORT sId, T_res_comp *resCmp ) +{ + UBYTE opCode; /* holds operation code */ + + TRACE_FUNCTION("psaSS_dasmResultCmp"); + + /* get operation code of the result */ + if( resCmp -> v_sequence AND + resCmp -> sequence.v_op_code ) + { + opCode = resCmp -> sequence.op_code; + } + else + opCode = ssShrdPrm.stb[sId].opCode; + + /* decode additional parameters of result */ + if( resCmp -> v_sequence AND + resCmp -> sequence.params.l_params ) + { + UBYTE ccdRet; + + memcpy( ssFIEDecodeBuf, &resCmp -> sequence.params, MNCC_FACILITY_LEN); + + ccdRet = ccd_decodeMsg (CCDENT_FAC, + DOWNLINK, + (T_MSGBUF *) ssFIEDecodeBuf, + (UBYTE *) _decodedMsg, + opCode); + + if( ccdRet NEQ ccdOK ) + { +/* Implements Measure#32: Row 1310 */ + TRACE_EVENT_P1("CCD Decoding Error: %d", ccdRet ); + cmhSS_SSResultFailure( sId ); + return; + } + } + + /* determine to which operation the result belongs to */ + switch( opCode ) + { + case( OPC_REGISTER_SS ): + { + MCAST( regSS, REGISTER_SS_RES ); + + cmhSS_SSRegistrated( sId, regSS ); + } + break; + + case( OPC_ERASE_SS ): + { + MCAST( ersSS, ERASE_SS_RES ); + + cmhSS_SSErased( sId, ersSS ); + } + break; + + case( OPC_ACTIVATE_SS ): + { + MCAST( actSS, ACTIVATE_SS_RES ); + + if( !(resCmp -> v_sequence) OR !(resCmp -> sequence.params.l_params) ) + { + memset(actSS, 0, sizeof(T_ACTIVATE_SS_RES)); + } + cmhSS_SSActivated( sId, actSS ); + } + break; + + case( OPC_DEACTIVATE_SS ): + { + MCAST( deactSS, DEACTIVATE_SS_RES ); + + cmhSS_SSDeactivated( sId, deactSS ); + } + break; + + case( OPC_INTERROGATE_SS ): + { + MCAST( irgtSS, INTERROGATE_SS_RES ); + + cmhSS_SSInterrogated( sId, irgtSS ); + } + break; + + case( OPC_REGISTER_PASSWORD ): + { + MCAST( regPWD, REGISTER_PWD_RES ); + + cmhSS_SSPWDRegistrated( sId, regPWD ); + } + break; + + case( OPC_PROC_UNSTRUCT_SS_DATA ): + { + MCAST( prcUSSDDat, PROCESS_USSD_RES ); + + cmhSS_USSDDatProcessed( sId, prcUSSDDat ); + } + break; + + case( OPC_PROC_UNSTRUCT_SS_REQ ): + { + MCAST( prcUSSDReq, PROCESS_USSD_REQ_RES ); + + cmhSS_USSDReqProcessed( sId, prcUSSDReq ); + } + break; + + case( OPC_ERASE_CC_ENTRY ): + { + MCAST( ersCCNtry, ERASE_CC_ENTRY_RES ); + + cmhSS_CCNtryErased( sId, ersCCNtry ); + } + break; + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_dasmErrorCmp | ++-------------------------------------------------------------------+ + + PURPOSE : disassemble the error component. +*/ + +GLOBAL T_ACI_RETURN psaSS_dasmErrorCmp ( SHORT sId, T_err_comp *errCmp, BOOL is_fac_ussd ) +{ + TRACE_EVENT_P1("psaSS_dasmErrorCmp: errCmp: %02x",errCmp -> err_code); + + if( errCmp -> v_err_code ) + { + ssShrdPrm.stb[sId].failType = SSF_SS_ERR; + ssShrdPrm.stb[sId].errCd = errCmp -> err_code; + + + switch(errCmp -> err_code) + { + case ERR_PWD_REG_FAIL: + if( errCmp -> v_params AND errCmp -> params.l_params ) + { + T_PW_REGISTRATION_FAILURE_ERR *pwRegFail; + + pwRegFail = (T_PW_REGISTRATION_FAILURE_ERR *)errCmp -> params.b_params; + + TRACE_EVENT_P1("VGK:Error reported %d", errCmp -> err_code); + TRACE_EVENT_P1("VGK:Error params %d", pwRegFail->pwRegistrationFailureCause); + + if (pwRegFail->v_pwRegistrationFailureCause) + ssShrdPrm.stb[sId].errPrms = pwRegFail->pwRegistrationFailureCause; + } + break; + + default: + break; + } + + /* check for protocol incompatibility for USSD */ + if( is_fac_ussd AND + errCmp -> err_code EQ ERR_FAC_NOT_SUPPORTED ) + { + if( psaSS_asmUSSDProt1(sId) ) + { + return( AT_CMPL ); + } + } + + } + return( AT_FAIL ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_dasmRejectCmp | ++-------------------------------------------------------------------+ + + PURPOSE : disassemble the error component. +*/ + +GLOBAL T_ACI_RETURN psaSS_dasmRejectCmp ( SHORT sId, T_rej_comp *rejCmp, BOOL is_fac_ussd ) +{ + TRACE_FUNCTION("psaSS_dasmRejectCmp"); + + if( rejCmp -> v_gen_problem ) + { + ssShrdPrm.stb[sId].failType = SSF_GEN_PRB; + ssShrdPrm.stb[sId].rejPrb = rejCmp -> gen_problem; + } + + else if( rejCmp -> v_inv_problem ) + { + ssShrdPrm.stb[sId].failType = SSF_INV_PRB; + ssShrdPrm.stb[sId].rejPrb = rejCmp -> inv_problem; + + /* check for protocol incompatibility for USSD */ + if( is_fac_ussd AND + rejCmp -> inv_problem EQ INV_PROB_UNRECOG_OP ) + { + if( psaSS_asmUSSDProt1(sId) ) + { + return( AT_CMPL ); + } + } + } + + else if( rejCmp -> v_res_problem ) + { + ssShrdPrm.stb[sId].failType = SSF_RSL_PRB; + ssShrdPrm.stb[sId].rejPrb = rejCmp -> res_problem; + } + + else if( rejCmp -> v_err_problem ) + { + ssShrdPrm.stb[sId].failType = SSF_ERR_PRB; + ssShrdPrm.stb[sId].rejPrb = rejCmp -> err_problem; + } + return( AT_FAIL ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SATF | +| ROUTINE : psaSAT_ss_end_ind | ++-------------------------------------------------------------------+ + + PURPOSE : handles responses to user after a SS. + is_fac_ussd TRUE if facility is a USSD +*/ + +GLOBAL T_ACI_RETURN psaSS_ss_end_ind ( SHORT sId, T_COMPONENT *com, BOOL is_fac_ussd ) +{ + if( com->v_res_comp ) + { + psaSS_dasmResultCmp( sId, &com->res_comp ); + return( AT_EXCT ); + } + + if( com->v_err_comp ) + { + return(psaSS_dasmErrorCmp( sId, &com->err_comp, is_fac_ussd )); + } + + if( com->v_rej_comp ) + { + return(psaSS_dasmRejectCmp( sId, &com->rej_comp, is_fac_ussd )); + } + + TRACE_EVENT( "WRONG COMPONENT TYPE RECEIVED" ); + return(AT_FAIL); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_stbNewEntry | ++-------------------------------------------------------------------+ + + PURPOSE : returns the service table index for a free entry to be + used, otherwise the function returns -1 to indicate that + no entry is free. +*/ + +GLOBAL SHORT psaSS_stbNewEntry ( void ) +{ + SHORT stbIdx; /* holds service table index */ + + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx++ ) + { + if( (ssShrdPrm.stb[stbIdx].ntryUsdFlg EQ FALSE) OR + (ssShrdPrm.stb[stbIdx].srvStat EQ SSS_IDL) ) + { + psaSS_InitStbNtry( stbIdx ); + + return( stbIdx ); + } + } + + return( -1 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_stbFindTi | ++-------------------------------------------------------------------+ + + PURPOSE : returns the service table index for the entry that holds + service parameters for the passed transaction identifier. + Returning -1 indicates that the passed ti was not found. +*/ + +GLOBAL SHORT psaSS_stbFindTi ( UBYTE ti2Find ) +{ + SHORT stbIdx; /* holds service table index */ + + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx++ ) + { + if( ssShrdPrm.stb[stbIdx].ti EQ ti2Find ) + + return( stbIdx ); + } + + return( -1 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_stbFindInvId | ++-------------------------------------------------------------------+ + + PURPOSE : returns the service table index for the entry that holds + service parameters for the passed invoke id. + Returning -1 indicates that the passed ti was not found. +*/ + +GLOBAL SHORT psaSS_stbFindInvId ( UBYTE iId2Find ) +{ + SHORT stbIdx; /* holds service table index */ + + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx++ ) + { + if( ssShrdPrm.stb[stbIdx].ntryUsdFlg EQ TRUE AND + ssShrdPrm.stb[stbIdx].iId EQ iId2Find ) + + return( stbIdx ); + } + + return( -1 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_chgSrvTypCnt | ++-------------------------------------------------------------------+ + + PURPOSE : this function modifies the service type counter (MOS/MTS) + defined by the passed service id by the passed delta value. +*/ + +GLOBAL void psaSS_chngSrvTypCnt ( SHORT sId, SHORT dlt ) +{ + + switch( ssShrdPrm.stb[sId].srvType ) + { + case( ST_MOS ): + + ssShrdPrm.nrOfMOS += dlt; + + if( ssShrdPrm.nrOfMOS < 0 ) ssShrdPrm.nrOfMOS = 0; + + break; + + case( ST_MTS ): + + ssShrdPrm.nrOfMTS += dlt; + + if( ssShrdPrm.nrOfMTS < 0 ) ssShrdPrm.nrOfMTS = 0; + + break; + + default: + + TRACE_EVENT( "UNEXP SERVICE TYPE IN STB" ); + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_getMOSTi | ++-------------------------------------------------------------------+ + + PURPOSE : this function selects a ti out of a pool of valid ti's + and inserts it into the passed service table entry. if no + ti is available the function returns -1. + a bit of the pool stands for a valid ti. + 0 indicates a used ti, 1 indicates a free ti. +*/ + +GLOBAL SHORT psaSS_getMOSTi( SHORT sId ) +{ + UBYTE idx; /* holds pool idx */ + + for( idx = 0; idx < MAX_MOSTI_NR; idx++ ) + { + if( tiPool & (1u << idx) ) + { + tiPool &= ~(1u << idx); + ssShrdPrm.stb[sId].ti = idx; + return( 0 ); + } + } + return( -1 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_retMOSTi | ++-------------------------------------------------------------------+ + + PURPOSE : this function returns a used ti to the ti pool if the + call was a MOS. the ti is free for the next MOS + afterwards. + a bit of the pool stands for a valid ti. + 0 indicates a used ti, 1 indicates a free ti. +*/ + +GLOBAL void psaSS_retMOSTi( SHORT sId ) +{ + if( ssShrdPrm.stb[sId].srvType EQ ST_MOS ) + + if( ssShrdPrm.stb[sId].ti < MAX_MOSTI_NR ) + + tiPool |= (0x01 << ssShrdPrm.stb[sId].ti); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SS | +| ROUTINE : psaSS_InitStbNtry | ++-------------------------------------------------------------------+ + + PURPOSE : initialize the indexed service table entry. + +*/ + +GLOBAL void psaSS_InitStbNtry ( SHORT idx ) +{ + +/* + *------------------------------------------------------------------- + * initialize call table entry + *------------------------------------------------------------------- + */ + ssShrdPrm.stb[idx].ntryUsdFlg = FALSE; + ssShrdPrm.stb[idx].ti = (UBYTE)-1; /* NO_ENTRY is -1 and ti where is is assigning is UBYTE,so typecast with UBYTE */ + ssShrdPrm.stb[idx].iId = 0; + ssShrdPrm.stb[idx].srvStat = NO_VLD_SSS; + ssShrdPrm.stb[idx].srvType = NO_VLD_ST; + ssShrdPrm.stb[idx].orgOPC = NOT_PRESENT_8BIT; + ssShrdPrm.stb[idx].opCode = NOT_PRESENT_8BIT; + ssShrdPrm.stb[idx].ssCode = NOT_PRESENT_8BIT; + ssShrdPrm.stb[idx].ussdReqFlg = FALSE; + ssShrdPrm.stb[idx].failType = NO_VLD_SSF; + ssShrdPrm.stb[idx].entCs = NOT_PRESENT_16BIT; + ssShrdPrm.stb[idx].rejPrb = NOT_PRESENT_8BIT; + ssShrdPrm.stb[idx].errCd = NOT_PRESENT_8BIT; + ssShrdPrm.stb[idx].errPrms = NOT_PRESENT_8BIT; + ssShrdPrm.stb[idx].curCmd = AT_CMD_NONE; + ssShrdPrm.stb[idx].srvOwn = (T_OWN)CMD_SRC_NONE; + ssShrdPrm.stb[idx].SSver = DEF_SS_VER; + ssShrdPrm.stb[idx].ussd_operation = FALSE; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_stbFindUssdReq | ++-------------------------------------------------------------------+ + + PURPOSE : returns the service table index for the entry that has a + USSD request pending. + Returning -1 indicates that no such service was found. +*/ + +GLOBAL SHORT psaSS_stbFindUssdReq ( void ) +{ + SHORT stbIdx; /* holds call table index */ + + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx++ ) + { + if( ssShrdPrm.stb[stbIdx].ntryUsdFlg EQ TRUE AND + ssShrdPrm.stb[stbIdx].ussdReqFlg EQ TRUE AND + ssShrdPrm.stb[stbIdx].srvStat EQ SSS_ACT ) + { + return( stbIdx ); + } + } + + return( -1 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_stbFindActSrv | ++-------------------------------------------------------------------+ + + PURPOSE : returns the service table index for the first entry that + holds an active service which is not the passed index. + Returning -1 indicates that no active service was found. +*/ + +GLOBAL SHORT psaSS_stbFindActSrv ( SHORT sId ) +{ + SHORT stbIdx; /* holds call table index */ + + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx++ ) + { + if( ssShrdPrm.stb[stbIdx].ntryUsdFlg EQ TRUE AND + ssShrdPrm.stb[stbIdx].srvStat EQ SSS_ACT ) + { + if( stbIdx NEQ sId ) + + return( stbIdx ); + } + } + + return( -1 ); +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SS | +| ROUTINE : psaSS_Init | ++-------------------------------------------------------------------+ + + PURPOSE : initialize the protocol stack adapter for SS. + +*/ + +GLOBAL void psaSS_Init ( void ) +{ + UBYTE stbIdx; /* holds index to service table */ + +/* + *------------------------------------------------------------------- + * initialize service table + *------------------------------------------------------------------- + */ + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx++ ) + { + psaSS_InitStbNtry( stbIdx ); + } + + /* + *------------------------------------------------------------------- + * initialize shared parameter + *------------------------------------------------------------------- + */ + ssShrdPrm.nrOfMOS = 0; + ssShrdPrm.nrOfMTS = 0; + ssShrdPrm.iIdNxt = 0; +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SS | +| ROUTINE : psaSS_DumpFIE | ++-------------------------------------------------------------------+ + + PURPOSE : Dump facility information element to debug output. + +*/ + +GLOBAL void psaSS_DumpFIE ( T_fac_inf * fie ) +{ + + CHAR strBuf[40+1]; /* holds string buffer */ + UBYTE idx, cnt, mcnt; /* buffer index */ + CHAR *pDest; /* points to destination */ + +/* + *------------------------------------------------------------------- + * format FIE + *------------------------------------------------------------------- + */ + TRACE_EVENT( "FIE SENT/RECEIVED:" ); + + mcnt = fie->l_fac >> 3; + + if( mcnt EQ 0 ) + { + TRACE_EVENT("Empty Facility"); + return; + } + + for( cnt = 0; cnt < mcnt; cnt+=idx ) + { + pDest = strBuf; + + for( idx = 0; idx < 20 AND idx+cnt < mcnt; idx++ ) + { +/* Implements Measure#32: Row 1312 */ + pDest += sprintf( pDest, format_2X_str, (UBYTE)fie->fac[idx+cnt] ); + } + + *pDest = 0x0; + + TRACE_EVENT( strBuf ); + } +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_stbDump | ++-------------------------------------------------------------------+ + + PURPOSE : this function dumps the service table to the debug output. +*/ + +GLOBAL void psaSS_stbDump ( void ) +{ +#ifdef TRACING + + SHORT stbIdx; /* holds service table index */ + char lnBuf[HDR_WDT+(MAX_ITM*ITM_WDT)+1]; /* holds buffer for output line */ + char verBuf[VERSION_LEN+1]; /* holds buffer for SS version */ + SHORT itmIdx; /* holds items per line index */ + SHORT chrNr; /* holds number of processed chars */ + + for( stbIdx = 0; stbIdx < MAX_SS_NR; stbIdx+=MAX_ITM ) + { + /* --- service id ----------------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " srv id"); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx+stbIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*d", ITM_WDT, stbIdx + itmIdx ); + } + TRACE_EVENT( lnBuf ); + + /* --- entry used flag -----------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "entry used" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].ntryUsdFlg ); + } + TRACE_EVENT( lnBuf ); + + /* --- transaction identifier ----------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " ti" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].ti ); + } + TRACE_EVENT( lnBuf ); + + /* --- service status ------------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "srv status" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].srvStat ); + } + TRACE_EVENT( lnBuf ); + + /* --- service type --------------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " srv type" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].srvType ); + } + TRACE_EVENT( lnBuf ); + + /* --- SS version ----------------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "SS version" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*d", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].SSver ); + } + TRACE_EVENT( lnBuf ); + + /* --- failure type ------------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "fail. type" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*d", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].failType ); + } + TRACE_EVENT( lnBuf ); + + /* --- entity cause ------------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, "ent. cause" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*d", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].entCs ); + } + TRACE_EVENT( lnBuf ); + + /* --- reject problem ----------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " rej. prob" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].rejPrb ); + } + TRACE_EVENT( lnBuf ); + + /* --- error code ----------------------------------------------------*/ + chrNr = sprintf( lnBuf, "%*.*s", HDR_WDT, HDR_WDT, " err. code" ); + + for( itmIdx = 0; (itmIdx<MAX_ITM)AND(itmIdx<MAX_SS_NR); itmIdx++ ) + { + chrNr += sprintf( lnBuf+chrNr, "%*hd", ITM_WDT, + ssShrdPrm.stb[stbIdx+itmIdx].errCd ); + } + TRACE_EVENT( lnBuf ); + + } + +#endif /* of #ifdef TRACING */ +} +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : CMH_F | +| ROUTINE : psaSS_GetPendingTrn | ++-------------------------------------------------------------------+ + + PURPOSE : Find Id of a pending call for multy-transaction operation + +*/ + +GLOBAL SHORT psaSS_GetPendingTrn ( void ) +{ + SHORT bit_len; + SHORT i; + + bit_len = 8 * sizeof(ssShrdPrm.mltyTrnFlg); + for (i = 0; i < bit_len; i++) + { + if ( ssShrdPrm.mltyTrnFlg & ( 0x1 << i ) ) + return i; + } + + return -1; +} + +GLOBAL void psaSS_KillAllPendingTrn ( void ) /* sId: main transaction: not to be killed */ +{ + SHORT pending_idx; + + TRACE_FUNCTION("psaSS_KillAllPendingTrn( )"); + + while ( ssShrdPrm.mltyTrnFlg ) + { + pending_idx = psaSS_GetPendingTrn( ); + ssShrdPrm.mltyTrnFlg &= ~( 1u << pending_idx ); /* unsent id flag */ + + ssShrdPrm.stb[ pending_idx ].ntryUsdFlg = FALSE; /* free entry in ss table */ + ssShrdPrm.stb[ pending_idx ].srvStat = NO_VLD_SSS; /* not sure if it's necessary...? */ + + PFREE( ssShrdPrm.stb[pending_idx].save_prim ); /* free pending primitive */ + } +} + +/* Implements Measure # 195 */ +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SSF | +| ROUTINE : psaSS_asmEraseSS | ++-------------------------------------------------------------------+ + + PURPOSE : Assemble the erase, activate and deactivate SS facility + information element. + +*/ + +LOCAL void psaSS_asmSSForBS ( UBYTE ssCode, UBYTE bscSrvType, + UBYTE bscSrv, T_ssForBS *ssForBS) +{ + + TRACE_FUNCTION("psaSS_asmSSForBS( )"); + + /* set service code */ + ssForBS->v_ssCode = TRUE; + ssForBS->ssCode = ssCode; + + /* set basic service type */ + switch( bscSrvType ) + { + case( BS_BEAR_SRV ): + + ssForBS->basicService.v_bearerService = TRUE; + ssForBS->basicService.bearerService = bscSrv; + break; + + case( BS_TELE_SRV ): + + ssForBS->basicService.v_teleservice = TRUE; + ssForBS->basicService.teleservice = bscSrv; + break; + } + + memset( &ssFIECodeBuf, 0, sizeof( ssFIECodeBuf )); + ssFIECodeBuf.l_buf = MAX_FIE_CODE_BUF_LEN<<3; + ccd_codeMsg (CCDENT_FAC, UPLINK, + (T_MSGBUF *)&ssFIECodeBuf, _decodedMsg, + NOT_PRESENT_8BIT); + + ssShrdPrm.cmpType = CT_INV; + +} + +/*==== EOF ========================================================*/ +