FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/psa_mmp.c @ 52:6d77f6e1670a
bug in the last commit
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 19 Oct 2020 05:27:40 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : PSA_MM +----------------------------------------------------------------------------- | 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 processing functions for the | primitives send to the protocol stack adapter by the | registrations part of mobility management. +----------------------------------------------------------------------------- */ #ifndef PSA_MMP_C #define PSA_MMP_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "aci_cmh.h" #include "ati_cmd.h" #include "aci_cmd.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 "cmh.h" #include "cmh_mm.h" #include "psa_cc.h" #include "psa_sim.h" #ifdef FF_TIMEZONE #include "rv/rv_general.h" #include "rtc/rtc_tz.h" #endif /*==== CONSTANTS ==================================================*/ /*==== TYPES ======================================================*/ /*==== EXPORT =====================================================*/ #ifdef FF_EM_MODE EXTERN SHORT em_relcs; #endif /* FF_EM_MODE */ /*==== VARIABLES ==================================================*/ EXTERN T_PCEER causeMod; EXTERN SHORT causeCeer; /*==== FUNCTIONS ==================================================*/ /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_reg_cnf | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_REG_CNF primitive send by MM. this confirms a successful network registration by passing the selected network description. */ GLOBAL void psa_mmr_reg_cnf ( T_MMR_REG_CNF *mmr_reg_cnf ) { TRACE_FUNCTION ("psa_mmr_reg_cnf()"); /* Reg Cnf will be sent when RR starts the power scanning and hence ignore it */ if (mmr_reg_cnf->bootup_cause EQ PWR_SCAN_START) { TRACE_EVENT("Dummy cnf from the lower layer"); PFREE (mmr_reg_cnf); return; } /* *------------------------------------------------------------------- * update shared parameter and notify ACI *------------------------------------------------------------------- */ mmShrdPrm.usedPLMN = mmr_reg_cnf -> plmn; mmShrdPrm.regStat = RS_FULL_SRV; mmShrdPrm.lac = mmr_reg_cnf->lac; mmShrdPrm.cid = mmr_reg_cnf->cid; causeMod = P_CEER_mod; /* Clear module which was set for ceer */ causeCeer = CEER_NotPresent; /* Reset extended error cause */ TRACE_EVENT_P2("MMR_REG_CNF received: LAC: %04X, CID: %04X", mmShrdPrm.lac, mmShrdPrm.cid); psaCC_send_satevent( EVENT_LOC_STATUS, -1, NEAR_END, FALSE ); /* Check whether any read request has been sent to SIM */ if(cmhMM_OpCheckName()) /*EONS: retrieves network name from SIM if needed.*/ { cmhMM_Registered (); } /* free the primitive buffer */ PFREE (mmr_reg_cnf); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_nreg_cnf | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_NREG_CNF primitive send by MM. this confirms a successful network deregistration. */ GLOBAL void psa_mmr_nreg_cnf ( T_MMR_NREG_CNF *mmr_nreg_cnf ) { TRACE_FUNCTION ("psa_mmr_nreg_cnf()"); /* *------------------------------------------------------------------- * update shared parameter and notify ACI *------------------------------------------------------------------- */ mmShrdPrm.deregCs = mmr_nreg_cnf -> detach_cause; if( mmShrdPrm.deregCs EQ CS_SIM_REM ) mmShrdPrm.regStat = RS_LMTD_SRV; else mmShrdPrm.regStat = RS_NO_SRV; mmShrdPrm.usedPLMN.v_plmn = INVLD_PLMN; psaCC_send_satevent( EVENT_LOC_STATUS, -1, NEAR_END, FALSE ); cmhMM_Deregistered (); /* *------------------------------------------------------------------- * free the primitive buffer *------------------------------------------------------------------- */ PFREE(mmr_nreg_cnf); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_nreg_ind | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_NREG_IND primitive send by MM. this indicates the loss of network registration by passing the cause. */ GLOBAL void psa_mmr_nreg_ind ( T_MMR_NREG_IND *mmr_nreg_ind ) { TRACE_FUNCTION ("psa_mmr_nreg_ind()"); /* *------------------------------------------------------------------- * update shared parameter and notify ACI *------------------------------------------------------------------- */ mmShrdPrm.deregCs = mmr_nreg_ind -> service; causeMod = P_CEER_mm; /* Set module for extended error */ causeCeer = mmr_nreg_ind -> cause; /* Set extended error cause */ #ifdef FF_EM_MODE em_relcs = mmr_nreg_ind -> service; #endif /* FF_EM_MODE */ switch( mmr_nreg_ind -> service ) { case( NREG_LIMITED_SERVICE ): mmShrdPrm.regStat = RS_LMTD_SRV; mmShrdPrm.usedPLMN.v_plmn = INVLD_PLMN; break; case( NREG_NO_SERVICE ): mmShrdPrm.regStat = RS_NO_SRV; mmShrdPrm.usedPLMN.v_plmn = INVLD_PLMN; break; default: #ifndef GPRS TRACE_EVENT_P1 ("UNEXP NREG SERVICE = %4x", mmr_nreg_ind -> service); #endif /* GPRS */ mmShrdPrm.regStat = RS_NO_SRV; } psaCC_send_satevent( EVENT_LOC_STATUS, -1, NEAR_END, FALSE ); if (!mmr_nreg_ind->search_running) cmhMM_Deregistered (); /* free the primitive buffer */ PFREE(mmr_nreg_ind); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_plmn_ind | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_PLMN_IND primitive send by MM. this indicates the network search result und a list of found plmn's. */ GLOBAL void psa_mmr_plmn_ind ( T_MMR_PLMN_IND *mmr_plmn_ind ) { TRACE_FUNCTION ("psa_mmr_plmn_ind()"); /* *------------------------------------------------------------------- * update shared parameter and notify ACI *------------------------------------------------------------------- */ mmShrdPrm.srchRslt = mmr_plmn_ind -> cause; switch( mmr_plmn_ind -> cause ) { case MMCS_SUCCESS: psaMM_CpyPLMNLst (mmr_plmn_ind -> plmn, mmr_plmn_ind -> forb_ind, mmr_plmn_ind ->lac_list); if (psaSIM_ChkSIMSrvSup(SRV_PNN) AND psaSIM_ChkSIMSrvSup(SRV_OPL)) cmhMM_OpSetPNNLst(); /*EONS: reads PNN list from SIM, cmhMM_NetworkLst() is called from there!*/ else cmhMM_NetworkLst(); break; case MMCS_PLMN_NOT_IDLE_MODE: case MMCS_SIM_REMOVED: cmhMM_SelNetwork (mmr_plmn_ind -> cause); break; default: TRACE_EVENT_P1 ("UNEXP NET RSLT = %4x", mmr_plmn_ind -> cause); cmhMM_SelNetwork (mmr_plmn_ind -> cause); break; } /* *------------------------------------------------------------------- * free the primitive buffer *------------------------------------------------------------------- */ PFREE(mmr_plmn_ind); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : convert_mmr_to_rtc_tz | +-------------------------------------------------------------------+ PURPOSE : convert the time zone received with the MMR_INFO_IND primitive into the normal time zone according to the special coding algorithm. GSM03.40 and search for the TP-Service-Centre-Time Stamp: The Time Zone indicates the difference, expressed in quarters of an hour, between the local time and GMT. In the first of the two semi-octets, the first bit (bit 3 of the seventh octet of the TP-Service-Centre-Time-Stamp field) represents the algebraic sign of this difference (0 : positive, 1 : negative). +1:00 hour = +4 quarter hours = 0x04 but Nibble Swap => 0x40 +8:00 hours = +32 quarter hours = 0x32 but Nibble Swap => 0x23 -2:45 hours = -11 quarter hours = 0x91 but Nibble Swap => 0x19 */ #ifdef FF_TIMEZONE LOCAL unsigned int convert_mmr_to_rtc_tz (U8 mmr_timezone) { unsigned int absolute_value = (10*(mmr_timezone & 0x7))+((mmr_timezone >> 4) & 0xf); if ((mmr_timezone & 0x08)) { absolute_value = ~absolute_value+1; } return (absolute_value); } #endif /* FF_TIMEZONE */ #if defined FF_TIMEZONE AND defined _SIMULATION_ /* The below two functions have been added for Simulation as a Stub for NITZ feature */ LOCAL T_RV_RET RTC_SetCurrentTZ(T_RTC_TZ currentTimeZone) { if (currentTimeZone<RTC_GMT_NT_1200 OR currentTimeZone>RTC_GMT_PT_1200) { return RV_INVALID_PARAMETER; } return RV_OK; } LOCAL T_RTC_TZ RTC_GetCurrentTZ(void) { T_RTC_TZ timezone = +4; /* as per values given in test case */ return timezone; } #endif /* FF_TIMEZONE AND _SIMULATION_ */ /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_info_ind | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_INFO_IND primitive send by MM. */ GLOBAL void psa_mmr_info_ind ( T_MMR_INFO_IND *mmr_info_ind ) { T_ACI_CMD_SRC srcId; #ifdef FF_TIMEZONE T_RTC_TZ rtc_timezone = RTC_TIME_ERROR; T_RV_RET rtc_return = RV_INTERNAL_ERR; BOOL tz_update = FALSE; #endif TRACE_FUNCTION ("psa_mmr_info_ind()"); if (mmr_info_ind->ntz.v_tz) { mmShrdPrm.tz = mmr_info_ind->ntz.tz; #ifdef FF_TIMEZONE rtc_timezone = (T_RTC_TZ) convert_mmr_to_rtc_tz(mmr_info_ind->ntz.tz); #endif } else { TRACE_EVENT("psa_mmr_info_ind(): timezone invalid"); } /* Check whether any of the ACI command sources have requested to be updated, and update if required. */ for ( srcId = CMD_SRC_LCL; srcId < CMD_SRC_MAX; srcId++) { #ifndef FF_TIMEZONE if ((cmhPrm[srcId].mmCmdPrm.CTZRMode EQ CTZR_MODE_ON) AND mmr_info_ind->ntz.v_tz) { R_AT(RAT_CTZV,srcId)(&mmr_info_ind->ntz.tz); } #else /*the following if statement is for time zone reporting*/ if ((cmhPrm[srcId].mmCmdPrm.CTZRMode EQ CTZR_MODE_ON) AND mmr_info_ind->ntz.v_tz) { R_AT(RAT_CTZV,srcId)(rtc_timezone); } /*the following if statement is for time and date reporting*/ if ((cmhPrm[srcId].mmCmdPrm.PCTZVMode EQ PCTZV_MODE_ON) AND mmr_info_ind->time.v_time) { R_AT(RAT_P_CTZV, srcId)(mmr_info_ind, rtc_timezone); } /*the following if statements are for network name reporting*/ if (cmhPrm[srcId].mmCmdPrm.CNIVMode EQ CNIV_MODE_ON) { R_AT(RAT_P_CNIV,srcId)(mmr_info_ind); } if (cmhPrm[srcId].mmCmdPrm.CTZUMode EQ CTZU_MODE_ON) { tz_update = TRUE; } #endif /* FF_TINEZONE */ } #ifdef FF_TIMEZONE if (tz_update AND mmr_info_ind->ntz.v_tz AND rtc_timezone NEQ RTC_TIME_ERROR) { rtc_return = RTC_SetCurrentTZ(rtc_timezone); if (rtc_return NEQ RV_OK) { TRACE_ERROR ("RTC setting failed..."); } else { if (rtc_timezone EQ RTC_GetCurrentTZ()) { TRACE_EVENT_P1("psa_mmr_info_ind(): timezone successfully set to %d", rtc_timezone); } } } #endif /* FF_TINEZONE */ /* * free the primitive buffer */ PFREE(mmr_info_ind); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_ciphering_ind | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_CIPHERING_IND primitive send by MM. */ GLOBAL void psa_mmr_ciphering_ind ( T_MMR_CIPHERING_IND *mmr_ciphering_ind ) { TRACE_FUNCTION ("psa_mmr_ciphering_ind()"); cmhMM_CipheringInd(mmr_ciphering_ind->ciph); /* *------------------------------------------------------------------- * free the primitive buffer *------------------------------------------------------------------- */ PFREE(mmr_ciphering_ind); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : PSA_MMP | | ROUTINE : psa_mmr_ahplmn_ind | +-------------------------------------------------------------------+ PURPOSE : processes the MMR_AHPLMN_IND primitive send by MM. */ GLOBAL void psa_mmr_ahplmn_ind(T_MMR_AHPLMN_IND *mmr_ahplmn_ind) { TRACE_FUNCTION("psa_mmr_ahplmn_ind()"); mmShrdPrm.ActingHPLMN = mmr_ahplmn_ind->ahplmn; cmhMM_Registered (); PFREE(mmr_ahplmn_ind); } /*==== EOF =========================================================*/