FreeCalypso > hg > fc-magnetite
view src/aci2/aci/cmh_mmr.c @ 581:a0a45c5eb3ef
gsmcomp.c: bumping trace partition size to 220 like in gprscomp.c
This change is safe in terms of RAM usage because all of these partition
pools have already been moved from XRAM to IRAM earlier, and our IRAM
usage in VO configs is currently quite low - the one near the limit
is XRAM on C11x.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 29 Jan 2019 03:52:49 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH_MMR +----------------------------------------------------------------------------- | 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 which are responsible | for the responses of the protocol stack adapter for | mobility management. +----------------------------------------------------------------------------- */ #ifndef CMH_MMR_C #define CMH_MMR_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "aci_cmh.h" #include "ati_cmd.h" #include "aci_cmd.h" #include "aci_mem.h" #ifdef FAX_AND_DATA #include "aci_fd.h" #endif /* of #ifdef FAX_AND_DATA */ #include "aci.h" #include "psa.h" #include "psa_mm.h" #include "psa_sim.h" #include "cmh.h" #include "cmh_mm.h" #ifdef DTI #include "dti.h" /* functionality of the dti library */ #include "dti_conn_mng.h" #include "dti_cntrl_mng.h" #endif #include "cmh_sim.h" #ifdef GPRS #include "gaci.h" #include "gaci_cmh.h" #include "psa_gmm.h" #include "cmh_gmm.h" #endif /*==== CONSTANTS ==================================================*/ /*==== TYPES ======================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ /*==== FUNCTIONS ==================================================*/ /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMR | | ROUTINE : cmhMM_Registered | +-------------------------------------------------------------------+ PURPOSE : ME is registered to the network */ GLOBAL SHORT cmhMM_Registered ( void ) { SHORT mncCur, mccCur; /* holds mnc and mcc of current PLMN */ UBYTE cmdBuf; /* buffers current command */ TRACE_FUNCTION ("cmhMM_Registered()"); /* *------------------------------------------------------------------- * check for command context *------------------------------------------------------------------- */ switch( mmEntStat.curCmd ) { case( AT_CMD_NONE ): case( AT_CMD_COPS ): case (AT_CMD_P_COPS): case( AT_CMD_NRG ): /* check for home PLMN or roaming */ if( mmShrdPrm.usedPLMN.v_plmn EQ VLD_PLMN ) { cmhMM_CnvrtPLMN2INT( mmShrdPrm.usedPLMN.mcc, mmShrdPrm.usedPLMN.mnc, &mccCur, &mncCur ); /* Store the new PLMN and the IMSI in the FFS */ if (!cmhMM_OperatorStoreInFFS(mmShrdPrm.usedPLMN.mcc, mmShrdPrm.usedPLMN.mnc, simShrdPrm.imsi.field)) TRACE_EVENT("Could not write PLMN and IMSI in FFS"); if( cmhSIM_plmn_is_hplmn (mccCur, mncCur)) { cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Reg); } else { cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Roam); } } if( mmEntStat.curCmd NEQ AT_CMD_NONE ) { #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif cmdBuf = mmEntStat.curCmd; mmEntStat.curCmd = AT_CMD_NONE; R_AT( RAT_OK, mmEntStat.entOwn ) ( cmdBuf ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_OK, cmdBuf, -1, -1, -1 ); } break; } return 0; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMR | | ROUTINE : cmhMM_Deregistered | +-------------------------------------------------------------------+ PURPOSE : ME is deregistered from network */ GLOBAL SHORT cmhMM_Deregistered ( void ) { T_ACI_RETURN ret; TRACE_FUNCTION ("cmhMM_Deregistered()"); /* *------------------------------------------------------------------- * check for command context *------------------------------------------------------------------- */ switch( mmEntStat.curCmd ) { case( AT_CMD_NONE ): /* *---------------------------------------------------------------- * process event if no command was invoked *---------------------------------------------------------------- */ switch( mmShrdPrm.deregCs ) { case( NREG_LIMITED_SERVICE ): case( NREG_NO_SERVICE ): if (mmShrdPrm.regModeAutoBack) { /* * Fallback to automatic mode is allowed, fallback. * If MM is not in full service and the registration mode * is switched from manual to automatic, * MM starts a network search immediately. */ mmShrdPrm.regModeBeforeAbort = mmShrdPrm.regMode; mmShrdPrm.regMode = MODE_AUTO; mmShrdPrm.regModeAutoBack = FALSE; #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( MODE_AUTO ); #else psaMM_SetRegMode (MODE_AUTO); #endif } cmhMM_Ntfy_NtwRegistrationStatus(cmhMM_GetNregCREGStat()); break; } break; case( AT_CMD_CFUN ): /* *---------------------------------------------------------------- * process event for +CFUN command *---------------------------------------------------------------- */ mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_NoSearch); if (simEntStat.curCmd NEQ AT_CMD_CFUN) /* Has SIM already finished flushing of LDN entries? */ { R_AT( RAT_OK, mmEntStat.entOwn ) ( AT_CMD_CFUN ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_OK, AT_CMD_CFUN, -1, -1, -1 ); } break; case( AT_CMD_BAND ): /* *---------------------------------------------------------------- * process event for %BAND command *---------------------------------------------------------------- */ cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_NoSearch); /* switch back to full functionnality */ ret = sAT_PlusCFUN( mmEntStat.entOwn, CFUN_FUN_Full, CFUN_RST_NotPresent ); /* SPR#919 - SH - fix advised by CLB */ mmEntStat.curCmd = AT_CMD_NONE; simEntStat.curCmd = AT_CMD_NONE; /* end SH */ if( ret EQ AT_CMPL ) { R_AT( RAT_OK, mmEntStat.entOwn ) (AT_CMD_BAND); } else { TRACE_EVENT_P1 ("Fatal Error in sAT_PlusCFUN switching on !!!, ret_type: %d", ret); R_AT( RAT_CME, mmEntStat.entOwn ) ( AT_CMD_BAND, CME_ERR_Unknown ); } /*SPR#919 - SH - fix advised by CLB mmEntStat.curCmd = AT_CMD_NONE; simEntStat.curCmd = AT_CMD_NONE; */ break; case( AT_CMD_COPS ): case( AT_CMD_P_COPS): /* *---------------------------------------------------------------- * process event for +COPS command *---------------------------------------------------------------- */ switch( mmShrdPrm.COPSmode ) { case( COPS_MOD_Auto ): case( COPS_MOD_Man ): mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Denied); #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode */ psaMM_SetRegMode ( mmShrdPrm.regMode); #endif R_AT( RAT_CME, mmEntStat.entOwn ) ( mmEntStat.curCmd, cmhMM_GetNregCMEStat() ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, AT_CMD_COPS, -1, -1, cmhMM_GetNregCMEStat() ); break; case( COPS_MOD_Dereg ): cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_NoSearch); R_AT( RAT_OK, mmEntStat.entOwn ) ( mmEntStat.curCmd ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_OK, mmEntStat.curCmd, -1, -1, -1 ); mmEntStat.curCmd = AT_CMD_NONE; break; case( COPS_MOD_SetOnly ): cmhMM_Ntfy_NtwRegistrationStatus(cmhMM_GetNregCREGStat()); break; case( COPS_MOD_Both ): if (mmShrdPrm.regModeAutoBack) { /* * Tried register to network in manual mode. Attempt failed. * Now trying to register into network in automatic mode. */ mmShrdPrm.regModeBeforeAbort = mmShrdPrm.regMode; mmShrdPrm.regMode = MODE_AUTO; mmShrdPrm.regModeAutoBack = FALSE; #if defined (GPRS) AND defined (DTI) if( psaG_MM_CMD_REG ( ) < 0 ) /* register to network */ #else if( psaMM_Registrate () < 0 ) /* register to network */ #endif { TRACE_EVENT( "FATAL RETURN psaMM_Registrate in +COPS" ); R_AT( RAT_CME, mmEntStat.entOwn ) ( mmEntStat.curCmd, cmhMM_GetNregCMEStat()); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, mmEntStat.curCmd, -1, -1, cmhMM_GetNregCMEStat() ); mmEntStat.curCmd = AT_CMD_NONE; } } else { cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Denied); #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode or set new one */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif R_AT( RAT_CME, mmEntStat.entOwn ) ( mmEntStat.curCmd, cmhMM_GetNregCMEStat() ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, mmEntStat.curCmd, -1, -1, cmhMM_GetNregCMEStat() ); mmEntStat.curCmd = AT_CMD_NONE; } break; } break; case( AT_CMD_NRG ): /* *---------------------------------------------------------------- * process event for %NRG command *---------------------------------------------------------------- */ switch( cmhPrm[mmEntStat.entOwn].mmCmdPrm.NRGsrvMode ) { case( NRG_SVMD_Full ): switch( cmhPrm[mmEntStat.entOwn].mmCmdPrm.NRGregMode ) { case( NRG_RGMD_Auto ): case( NRG_RGMD_Manual ): mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Denied); #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif R_AT( RAT_CME, mmEntStat.entOwn ) ( AT_CMD_NRG, cmhMM_GetNregCMEStat()); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, AT_CMD_NRG, -1, -1, cmhMM_GetNregCMEStat() ); break; case( NRG_RGMD_Both ): if (mmShrdPrm.regModeAutoBack) { /* * Tried register to network in manual mode. Attempt failed. * Now trying to register into network in automatic mode. */ mmShrdPrm.regModeBeforeAbort = mmShrdPrm.regMode; mmShrdPrm.regMode = MODE_AUTO; mmShrdPrm.regModeAutoBack = FALSE; #if defined (GPRS) AND defined (DTI) if( psaG_MM_CMD_REG ( ) < 0 ) /* register to network */ #else if( psaMM_Registrate () < 0 ) /* register to network */ #endif { mmEntStat.curCmd = AT_CMD_NONE; TRACE_EVENT( "FATAL RETURN psaMM_Registrate in %NRG" ); R_AT( RAT_CME, mmEntStat.entOwn ) ( AT_CMD_NRG, cmhMM_GetNregCMEStat()); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, AT_CMD_NRG, -1, -1, cmhMM_GetNregCMEStat() ); } } else { mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Denied); /* If fallback to automatic mode is allowed, fall back */ if (mmShrdPrm.regModeAutoBack) { mmShrdPrm.regModeBeforeAbort = mmShrdPrm.regMode; mmShrdPrm.regModeAutoBack = FALSE; mmShrdPrm.regMode = MODE_AUTO; } #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode or set new one */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif R_AT( RAT_CME, mmEntStat.entOwn ) ( AT_CMD_NRG, cmhMM_GetNregCMEStat() ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, AT_CMD_NRG, -1, -1, cmhMM_GetNregCMEStat() ); } break; } break; case( NRG_SVMD_Limited ): /* pending registration request */ if( regReqPnd EQ TRUE ) { mmShrdPrm.regMode = MODE_AUTO; #if defined (GPRS) AND defined (DTI) (void)psaG_MM_CMD_REG (); /* register to network */ #else (void)psaMM_Registrate (); /* register to network */ #endif regReqPnd = FALSE; break; } if( mmShrdPrm.regStat EQ RS_LMTD_SRV ) { mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(cmhMM_GetNregCREGStat()); R_AT( RAT_OK, mmEntStat.entOwn ) ( AT_CMD_NRG ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_OK, AT_CMD_NRG, -1, -1, -1 ); } else { mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_Denied); #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif R_AT( RAT_CME, mmEntStat.entOwn ) ( AT_CMD_NRG, cmhMM_GetNregCMEStat() ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, AT_CMD_NRG, -1, -1, cmhMM_GetNregCMEStat() ); } break; case( NRG_SVMD_NoSrv ): mmEntStat.curCmd = AT_CMD_NONE; cmhMM_Ntfy_NtwRegistrationStatus(CREG_STAT_NoSearch); R_AT( RAT_OK, mmEntStat.entOwn ) ( AT_CMD_NRG ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_OK, AT_CMD_NRG, -1, -1, -1 ); break; case( NRG_SVMD_SetRegModeOnly ): cmhMM_Ntfy_NtwRegistrationStatus(cmhMM_GetNregCREGStat()); break; } break; } return 0; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMR | | ROUTINE : cmhMM_NetworkLst | +-------------------------------------------------------------------+ PURPOSE : List of networks available */ GLOBAL SHORT cmhMM_NetworkLst ( void ) { /* * We need a structure which has to fit into one not too big partition. * sizeof (T_OP_NAME) = 36 (35 characters plus one alignment byte) * with MAX_LONG_OPER_LEN = 26 and MAX_SHRT_OPER_LEN = 9 * => sizeof (T_OP_NAME) * MAX_OPER = 432 * => This fits into one of the 432er partitions of which we have some. */ typedef struct { char longNamBuf[MAX_LONG_OPER_LEN]; /* buffer long name */ char shrtNamBuf[MAX_SHRT_OPER_LEN]; /* buffer short name*/ } T_OP_NAME; T_OP_NAME * op_name = NULL; /* Holds operator names */ T_OPER_ENTRY plmnDesc; /* PLMN description */ T_ACI_COPS_OPDESC * operLst = NULL; /* operator list T_ACI_COPS_LST */ SHORT lstIdx; /* holds list idx */ SHORT mcc, mnc; /* holds converted mnc and mcc */ BOOL found; /* Result of cmhMM_FindXXX() */ T_ACI_AT_CMD bufCmd; TRACE_FUNCTION ("cmhMM_NetworkLst()"); /* *------------------------------------------------------------------- * check for command context *------------------------------------------------------------------- */ switch( mmEntStat.curCmd ) { case( AT_CMD_COPS ): case (AT_CMD_P_COPS): ACI_MALLOC (op_name, sizeof (T_OP_NAME) * MAX_OPER); ACI_MALLOC (operLst, sizeof (T_ACI_COPS_OPDESC) * MAX_OPER); /* *--------------------------------------------------------------- * for every entry of the PLMN list *--------------------------------------------------------------- */ for( lstIdx = 0; lstIdx < MAX_OPER AND lstIdx < MAX_PLMN_ID; lstIdx++ ) { /* *------------------------------------------------------------- * if last entry of PLMN list, close oper list and return *------------------------------------------------------------- */ if( mmShrdPrm.PLMNLst[lstIdx].v_plmn EQ INVLD_PLMN ) { operLst[lstIdx].status = COPS_STAT_NotPresent; operLst[lstIdx].longOper = NULL; operLst[lstIdx].shortOper = NULL; operLst[lstIdx].numOper[0]= '\0'; break; } /* *------------------------------------------------------------- * find PLMN description *------------------------------------------------------------- */ cmhMM_CnvrtPLMN2INT( mmShrdPrm.PLMNLst[lstIdx].mcc, mmShrdPrm.PLMNLst[lstIdx].mnc, &mcc, &mnc ); found = cmhMM_FindPLMN (&plmnDesc, mcc, mnc, mmShrdPrm.LACLst[lstIdx], TRUE); if (!found) /* no description found */ { operLst[lstIdx].longOper = ""; operLst[lstIdx].shortOper = ""; } else { /* Copy strings into dynamic buffer so that they don't get lost */ memcpy (op_name[lstIdx].longNamBuf, plmnDesc.longName, MAX_LONG_OPER_LEN); memcpy (op_name[lstIdx].shrtNamBuf, plmnDesc.shrtName, MAX_SHRT_OPER_LEN); /* EONS PLMN name conding scheme and source flag */ operLst[lstIdx].pnn = plmnDesc.pnn; operLst[lstIdx].longOper = op_name[lstIdx].longNamBuf; operLst[lstIdx].long_len = plmnDesc.long_len; operLst[lstIdx].long_ext_dcs = plmnDesc.long_ext_dcs; operLst[lstIdx].shortOper = op_name[lstIdx].shrtNamBuf; operLst[lstIdx].shrt_len = plmnDesc.shrt_len; operLst[lstIdx].shrt_ext_dcs = plmnDesc.shrt_ext_dcs; } /* *------------------------------------------------------------- * build numeric representation *------------------------------------------------------------- */ if ((mnc & 0x00F) EQ 0x00F) sprintf (operLst[lstIdx].numOper, "%03X%02X", mcc, (mnc & 0xFF0) >> 4); else sprintf (operLst[lstIdx].numOper, "%03X%03X", mcc, mnc); /* *------------------------------------------------------------- * set PLMN status *------------------------------------------------------------- */ if (mmShrdPrm.PLMNLst[lstIdx].v_plmn EQ mmShrdPrm.usedPLMN.v_plmn AND memcmp (mmShrdPrm.PLMNLst[lstIdx].mcc, mmShrdPrm.usedPLMN.mcc, SIZE_MCC) EQ 0 AND memcmp (mmShrdPrm.PLMNLst[lstIdx].mnc, mmShrdPrm.usedPLMN.mnc, SIZE_MNC) EQ 0) { operLst[lstIdx].status = COPS_STAT_Current; } else { switch( mmShrdPrm.FRBLst[lstIdx] ) { case( FORB_PLMN_NOT_INCLUDED ): operLst[lstIdx].status = COPS_STAT_Available; break; case( 1 /*FORB_PLMN_INCLUDED*/ ): operLst[lstIdx].status = COPS_STAT_Forbidden; break; default: operLst[lstIdx].status = COPS_STAT_Unknown; break; } } } #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif bufCmd = mmEntStat.curCmd; mmEntStat.curCmd = AT_CMD_NONE; if(bufCmd EQ AT_CMD_COPS) { R_AT( RAT_COPS, mmEntStat.entOwn ) ( --lstIdx, &operLst[0]); } else { R_AT( RAT_P_COPS, mmEntStat.entOwn ) ( --lstIdx, &operLst[0]); } R_AT( RAT_OK, mmEntStat.entOwn ) ( mmEntStat.curCmd ); /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_OK, mmEntStat.curCmd , -1, -1, -1 ); ACI_MFREE (op_name); ACI_MFREE (operLst); break; } return 0; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMR | | ROUTINE : cmhMM_SelNetwork | +-------------------------------------------------------------------+ PURPOSE : Select a network */ GLOBAL SHORT cmhMM_SelNetwork ( void ) { TRACE_FUNCTION ("cmhMM_SelNetwork()"); switch( mmEntStat.curCmd ) { case( AT_CMD_COPS ): #if defined (GPRS) AND defined (DTI) psaG_MM_CMD_SET_REGMD ( mmShrdPrm.regMode ); /* restore former registration mode*/ #else /* restore former registration mode */ psaMM_SetRegMode ( mmShrdPrm.regMode ); #endif /* If the SIM is not inserted or if the SIM requires a PIN, more meaningful error * codes are returned*/ if ( (cmhSIM_GetSIMError(mmEntStat.entOwn, mmEntStat.curCmd)) NEQ AT_CMPL) { R_AT( RAT_CME, mmEntStat.entOwn ) ( mmEntStat.curCmd , CME_ERR_NotPresent); } /* log result */ cmh_logRslt ( mmEntStat.entOwn, RAT_CME, mmEntStat.curCmd , -1, -1, CME_ERR_NotPresent ); mmEntStat.curCmd = AT_CMD_NONE; break; } return 0; } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMR | | ROUTINE : cmhMM_CipheringInd | +-------------------------------------------------------------------+ PURPOSE : ciphering indication received */ GLOBAL SHORT cmhMM_CipheringInd ( UBYTE ciph ) { SHORT idx; /* holds index counter */ TRACE_FUNCTION ("cmhMM_CipheringInd()"); if (simShrdPrm.ciSIMEnabled NEQ TRUE) { return 1; } for (idx = 0; idx < CMD_SRC_MAX; idx++) { /* *----------------------------------------------------------------- * new message indication *----------------------------------------------------------------- */ #ifndef GPRS #define CIPH_NA 2 #endif R_AT(RAT_P_CPRI,idx) ( ciph, CIPH_NA ); } return 0; } /*==== EOF ========================================================*/