FreeCalypso > hg > fc-magnetite
view src/g23m-gprs/gmm/gmm_f.c @ 340:2f41f7883261
FCHG: logic error in the charge (re)start condition
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 15 Dec 2017 18:57:05 +0000 |
parents | 219afcfc6250 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GPRS (8441) | Modul : $ +----------------------------------------------------------------------------- | 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 modul is part of the entity GRR and implements all | procedures and functions as described in the | SDL-documentation (-statemachine) +----------------------------------------------------------------------------- */ #ifndef GMM_F_C #define GMM_F_C #endif #define ENTITY_GMM /*==== INCLUDES =============================================================*/ #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 "ccdapi.h" /* to get CCD API */ #include "cnf_gmm.h" /* to get cnf-definitions */ #include "mon_gmm.h" /* to get mon-definitions */ #include "prim.h" /* to get the definitions of used SAP and directions */ #include "gmm.h" /* to get the global entity definitions */ #include "gmm_f.h" #include <stdlib.h> /* JK, delete warnings: to get rand() */ /*==== CONST ================================================================*/ /*==== DIAGNOSTICS ==========================================================*/ #ifndef TRACE_INFO /* only used in local environment */ # define TRACE_INFO(x) #endif #ifndef TRACE_COMMENT /* only used in local environment */ # define TRACE_COMMENT(x) #endif /*==== LOCAL VARS ===========================================================*/ /*==== PRIVATE FUNCTIONS ====================================================*/ /*==== PUBLIC FUNCTIONS =====================================================*/ /* +------------------------------------------------------------------------------ | Function : gmm_set_current_tlli +------------------------------------------------------------------------------ | Description : derives the current TLLI with the given TLLI type and saves | the old TLLI | | Parameters : tlli_type - the wanted TLLI type | +------------------------------------------------------------------------------ */ GLOBAL void gmm_set_current_tlli ( T_TLLI_TYPE tlli_type ) { GMM_TRACE_FUNCTION ("gmm_set_current_tlli"); gmm_data->tlli.old = gmm_data->tlli.current, gmm_data->tlli.current = gmm_get_tlli ( tlli_type ); GMM_TRACE_GMM_DATA(GMM_DEBUG_PRINT_MASK_TLLI); GMM_RETURN; } /* gmm_set_current_tlli */ /* +------------------------------------------------------------------------------ | Function : gmm_get_tlli +------------------------------------------------------------------------------ | Description : returns the wanted TLLI | | Parameters : tlli_type - the wanted TLLI type | +------------------------------------------------------------------------------ */ GLOBAL ULONG gmm_get_tlli ( T_TLLI_TYPE tlli_type ) { GMM_TRACE_FUNCTION ("gmm_get_tlli()"); /* * the random tlli must be created */ if ( GMMRR_TMSI_INVALID == gmm_data->ptmsi.current /* * the random tlli must be created */ && tlli_type != RANDOM_TLLI && tlli_type != CURRENT_TLLI ) { gmm_data->ptmsi.current= GMMRR_TMSI_INVALID; gmm_data->ptmsi.new_grr = GMMRR_TMSI_INVALID; gmm_data->ptmsi.old = GMMRR_TMSI_INVALID; gmm_data->tlli.current_type = INVALID_TLLI; TRACE_0_OUT_PARA ("first tlli used"); GMM_RETURN_ ( LLGMM_TLLI_INVALID); } else { /* gmm_data->ptmsi.v_mid = TRUE; */ switch ( tlli_type ) { case LOCAL_TLLI: gmm_data->tlli.current_type = tlli_type; gmm_data->tlli.current = gmm_data->ptmsi.current | LOCAL_TLLI_SET_MASK; gmm_data->tlli.current &= LOCAL_TLLI_RES_MASK; TRACE_0_OUT_PARA("local tlli used"); break; case FOREIGN_TLLI: gmm_data->tlli.current_type = tlli_type; gmm_data->tlli.current = gmm_data->ptmsi.current | FOREIGN_TLLI_SET_MASK; gmm_data->tlli.current &= FOREIGN_TLLI_RES_MASK; TRACE_0_OUT_PARA ("foreign tlli used"); break; case RANDOM_TLLI: gmm_data->tlli.current_type = CURRENT_TLLI; #ifdef _SIMULATION_ /* This number is a very random number */ gmm_data->ptmsi.current = 0x06081997L; #else gmm_data->ptmsi.current = (rand()<<16) +rand(); #endif gmm_data->tlli.current = gmm_data->ptmsi.current | RANDOM_TLLI_SET_MASK; gmm_data->tlli.current &= RANDOM_TLLI_RES_MASK; gmm_data->ptmsi.current = GMMRR_TMSI_INVALID; gmm_data->ptmsi.old = GMMRR_TMSI_INVALID; TRACE_0_OUT_PARA ("random tlli used"); break; case OLD_TLLI: GMM_RETURN_ (gmm_data->tlli.old); case CURRENT_TLLI: GMM_RETURN_ (gmm_data->tlli.current)/*gmm_get_tlli ( gmm_data->tlli.current_type )*/; case INVALID_TLLI: TRACE_0_OUT_PARA ("first tlli used"); GMM_RETURN_ (LLGMM_TLLI_INVALID); default: TRACE_ERROR ("WRONG TLLI TYPE received"); break; } GMM_RETURN_ (gmm_data->tlli.current); } } /* gmm_get_tlli */ /* +------------------------------------------------------------------------------ | Function : gmm_debug_do_print_gmm_data +------------------------------------------------------------------------------ | Description : prints gmm data control block | | Parameters : print mask: select type of information to be printed | +------------------------------------------------------------------------------ */ GLOBAL void gmm_debug_do_print_gmm_data(GMM_DEBUG_PRINT_MASK_ENUM_TYPE print_mask) { /* * COMMON */ if (print_mask & GMM_DEBUG_PRINT_MASK_COMMON) { TRACE_1_DATA("* Version : %u", gmm_data->version); TRACE_1_DATA("* Cipher : %u", gmm_data->cipher); } /* * STATE */ if (print_mask & GMM_DEBUG_PRINT_MASK_STATE) { #ifndef NTRACE TRACE_1_DATA("* Kern State : %s", gmm_data->kern.state_name); TRACE_1_DATA("* TX State : %s", gmm_data->tx.state_name); TRACE_1_DATA("* RX State : %s", gmm_data->rx.state_name); TRACE_1_DATA("* RDY State : %s", gmm_data->rdy.state_name); TRACE_1_DATA("* SYNC State : %s", gmm_data->sync.state_name); #endif } /* * TLLI */ if (print_mask & GMM_DEBUG_PRINT_MASK_TLLI) { TRACE_1_DATA("* TLLI current : %#x", gmm_data->tlli.current); TRACE_1_DATA("* TLLI old : %#x", gmm_data->tlli.old); switch (gmm_data->tlli.current_type) { case LOCAL_TLLI: TRACE_0_DATA("* TLLI type : LOCAL"); break; case FOREIGN_TLLI: TRACE_0_DATA("* TLLI type : FOREIGN"); break; case RANDOM_TLLI: TRACE_0_DATA("* TLLI type : RANDOM"); break; case CURRENT_TLLI: TRACE_0_DATA("* TLLI type : CURRENT"); break; case OLD_TLLI: TRACE_0_DATA("* TLLI type : OLD"); break; case INVALID_TLLI: TRACE_0_DATA("* TLLI type : INVALID"); break; default: TRACE_1_DATA("* TLLI type : %u unknown!", gmm_data->tlli.current_type); } } /* * IMSI */ if (print_mask & GMM_DEBUG_PRINT_MASK_IMSI) { TRACE_8_DATA("* IMSI[]: %1d %1d %1d %1d %1d %1d %1d %1d", gmm_data->imsi.id[0], gmm_data->imsi.id[1], gmm_data->imsi.id[2], gmm_data->imsi.id[3], gmm_data->imsi.id[4], gmm_data->imsi.id[5], gmm_data->imsi.id[6], gmm_data->imsi.id[7]); TRACE_8_DATA("* IMSI[]: %1d %1d %1d %1d %1d %1d %1d %1d", gmm_data->imsi.id[8], gmm_data->imsi.id[9], gmm_data->imsi.id[10], gmm_data->imsi.id[11], gmm_data->imsi.id[12], gmm_data->imsi.id[13], gmm_data->imsi.id[14], gmm_data->imsi.id[15]); } /* * P-TMSI */ if (print_mask & GMM_DEBUG_PRINT_MASK_PTMSI) { TRACE_1_DATA("* PTMSI current: %#x", gmm_data->ptmsi.current); TRACE_1_DATA("* PTMSI old : %#x", gmm_data->ptmsi.old); TRACE_1_DATA("* PTMSI grr : %#x", gmm_data->ptmsi.new_grr); } /* * CID */ if (print_mask & GMM_DEBUG_PRINT_MASK_CID) { TRACE_0_DATA("* kern. cid rac lac mcc mnc"); TRACE_9_DATA("* cell_id %#6x %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->kern.cell_id.cid, gmm_data->kern.cell_id.rac, gmm_data->kern.cell_id.lac, gmm_data->kern.cell_id.plmn.mcc[0], gmm_data->kern.cell_id.plmn.mcc[1], gmm_data->kern.cell_id.plmn.mcc[2], gmm_data->kern.cell_id.plmn.mnc[0], gmm_data->kern.cell_id.plmn.mnc[1], gmm_data->kern.cell_id.plmn.mnc[2]); TRACE_9_DATA("* mm_cell_env %#6x %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->kern.mm_cell_env.cid, gmm_data->kern.mm_cell_env.rai.rac, gmm_data->kern.mm_cell_env.rai.lac, gmm_data->kern.mm_cell_env.rai.plmn.mcc[0], gmm_data->kern.mm_cell_env.rai.plmn.mcc[1], gmm_data->kern.mm_cell_env.rai.plmn.mcc[2], gmm_data->kern.mm_cell_env.rai.plmn.mnc[0], gmm_data->kern.mm_cell_env.rai.plmn.mnc[1], gmm_data->kern.mm_cell_env.rai.plmn.mnc[2]); TRACE_9_DATA("* sig_cell_info.env %#6x %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->kern.sig_cell_info.env.cid, gmm_data->kern.sig_cell_info.env.rai.rac, gmm_data->kern.sig_cell_info.env.rai.lac, gmm_data->kern.sig_cell_info.env.rai.plmn.mcc[0], gmm_data->kern.sig_cell_info.env.rai.plmn.mcc[1], gmm_data->kern.sig_cell_info.env.rai.plmn.mcc[2], gmm_data->kern.sig_cell_info.env.rai.plmn.mnc[0], gmm_data->kern.sig_cell_info.env.rai.plmn.mnc[1], gmm_data->kern.sig_cell_info.env.rai.plmn.mnc[2]); TRACE_9_DATA("* old_sig_cell_info.env %#6x %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->kern.old_sig_cell_info.env.cid, gmm_data->kern.old_sig_cell_info.env.rai.rac, gmm_data->kern.old_sig_cell_info.env.rai.lac, gmm_data->kern.old_sig_cell_info.env.rai.plmn.mcc[0], gmm_data->kern.old_sig_cell_info.env.rai.plmn.mcc[1], gmm_data->kern.old_sig_cell_info.env.rai.plmn.mcc[2], gmm_data->kern.old_sig_cell_info.env.rai.plmn.mnc[0], gmm_data->kern.old_sig_cell_info.env.rai.plmn.mnc[1], gmm_data->kern.old_sig_cell_info.env.rai.plmn.mnc[2]); TRACE_0_DATA("* sync. cid rac lac mcc mnc"); TRACE_8_DATA("* mm_cell_info %#6x ------ %#6x %1x%1x%1x %1x%1x%1x", gmm_data->sync.mm_cell_info.cid, gmm_data->sync.mm_cell_info.lac, gmm_data->sync.mm_cell_info.plmn.mcc[0], gmm_data->sync.mm_cell_info.plmn.mcc[1], gmm_data->sync.mm_cell_info.plmn.mcc[2], gmm_data->sync.mm_cell_info.plmn.mnc[0], gmm_data->sync.mm_cell_info.plmn.mnc[1], gmm_data->sync.mm_cell_info.plmn.mnc[2]); TRACE_9_DATA("* grr_cell_info.cell_env %#6x %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->sync.grr_cell_info.cell_env.cid, gmm_data->sync.grr_cell_info.cell_env.rai.rac, gmm_data->sync.grr_cell_info.cell_env.rai.lac, gmm_data->sync.grr_cell_info.cell_env.rai.plmn.mcc[0], gmm_data->sync.grr_cell_info.cell_env.rai.plmn.mcc[1], gmm_data->sync.grr_cell_info.cell_env.rai.plmn.mcc[2], gmm_data->sync.grr_cell_info.cell_env.rai.plmn.mnc[0], gmm_data->sync.grr_cell_info.cell_env.rai.plmn.mnc[1], gmm_data->sync.grr_cell_info.cell_env.rai.plmn.mnc[2]); TRACE_9_DATA("* sig_cell_info.env %#6x %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->sync.sig_cell_info.env.cid, gmm_data->sync.sig_cell_info.env.rai.rac, gmm_data->sync.sig_cell_info.env.rai.lac, gmm_data->sync.sig_cell_info.env.rai.plmn.mcc[0], gmm_data->sync.sig_cell_info.env.rai.plmn.mcc[1], gmm_data->sync.sig_cell_info.env.rai.plmn.mcc[2], gmm_data->sync.sig_cell_info.env.rai.plmn.mnc[0], gmm_data->sync.sig_cell_info.env.rai.plmn.mnc[1], gmm_data->sync.sig_cell_info.env.rai.plmn.mnc[2]); TRACE_0_DATA("* kern.attach_cap. rac lac mcc mnc"); TRACE_8_DATA("* rai_accepted %#6x %#6x %1x%1x%1x %1x%1x%1x", gmm_data->kern.attach_cap.rai_accepted.rac, gmm_data->kern.attach_cap.rai_accepted.lac, gmm_data->kern.attach_cap.rai_accepted.mcc[0], gmm_data->kern.attach_cap.rai_accepted.mcc[1], gmm_data->kern.attach_cap.rai_accepted.mcc[2], gmm_data->kern.attach_cap.rai_accepted.mnc[0], gmm_data->kern.attach_cap.rai_accepted.mnc[1], gmm_data->kern.attach_cap.rai_accepted.mnc[2]); } /* * RAI */ /* * KERN ATTACH CAPABILITIES */ if (print_mask & GMM_DEBUG_PRINT_MASK_KERN_ATTACH) { } }