FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/gmm/gmm_txf.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/gmm/gmm_txf.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,328 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : gmm_txf.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 modul is part of the entity GMM and implements all +| procedures and functions as described in the +| SDL-documentation (TX-statemachine) ++----------------------------------------------------------------------------- +*/ + + +#ifndef GMM_TXF_C +#define GMM_TXF_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" /* to get the gmm_get_tlli procedure */ +#include <string.h> /* to get memset */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : txgmm_init ++------------------------------------------------------------------------------ +| Description : The function txgmm_init() .... +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void txgmm_init ( void ) +{ + TRACE_FUNCTION( "txgmm_init" ); + + /* + * Initialise service TX with state TX_READY. + */ + INIT_STATE ( TX, TX_READY ); + +} /* txgmm_init() */ +/* ++------------------------------------------------------------------------------ +| Function : tx_fill_unitdata_req ++------------------------------------------------------------------------------ +| Description : This procedure tx_fill_unitdata_req() fills the primitive +| ll_unitdata_req with all necessary dafault parameters.except +| the SDU +| +| +| Parameters : ll_unitdata_req - the primitive, which has to be filled +| +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void tx_fill_unitdata_req ( T_LL_UNITDATA_REQ *ll_unitdata_req_p, T_TLLI_TYPE tlli_type, BOOL cipher ) +{ + GMM_TRACE_FUNCTION ("tx_fill_unitdata_req"); + ll_unitdata_req_p-> sapi = LL_SAPI_1; + ll_unitdata_req_p-> tlli = gmm_get_tlli ( tlli_type ); + ll_unitdata_req_p-> ll_qos.delay = LL_DELAY_SUB; + ll_unitdata_req_p-> ll_qos.peak = LL_PEAK_SUB; + ll_unitdata_req_p-> ll_qos.preced = LL_PRECED_SUB; + ll_unitdata_req_p-> ll_qos.mean = LL_MEAN_SUB; + ll_unitdata_req_p-> cipher = + (gmm_data->config.cipher_on?cipher:FALSE); + /* + * all GMM (and SM) messages are transmitted in RLC/MAC acknowledged mode + */ + ll_unitdata_req_p-> ll_qos.relclass = LL_RLC_PROT; + /* + * all GMM messages have highest priority (!!!!! what about SM?) + */ + ll_unitdata_req_p-> radio_prio = LL_RADIO_PRIO_1; + ll_unitdata_req_p->ll_qos.reserved_1 = 0xff; + ll_unitdata_req_p->ll_qos.reserved_2 = 0xff; + ll_unitdata_req_p->ll_qos.reserved_3 = 0xff; + ll_unitdata_req_p->reserved_unitdata_req1.ref_npdu_num = 0xffff; + ll_unitdata_req_p->reserved_unitdata_req1.ref_nsapi = 0xff; + ll_unitdata_req_p->reserved_unitdata_req1.ref_seg_num = 0xff; + ll_unitdata_req_p->reserved_unitdata_req4 = 0xffffffff; + +#ifdef REL99 + /* + * This change is related to R99. + */ + ll_unitdata_req_p->pkt_flow_id = 0xffff; /* TCS 4.0 */ +#else + ll_unitdata_req_p->reserved_unitdata_req5 = 0xffff; +#endif + + ll_unitdata_req_p->seg_pos = 0xff; + ll_unitdata_req_p->attached_counter= 0x00; + + GMM_RETURN; +} + +/* ++------------------------------------------------------------------------------ +| Function : tx_unitdata_req ++------------------------------------------------------------------------------ +| Description : This procedure tx_unitdata_req() fills the primitive +| ll_unitdata_req with all necessary parameters.and sends +| the message to LLC +| +| +| Parameters : tlli_type - local, foreign or random +| +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void tx_unitdata_req ( T_TLLI_TYPE tlli_type, UBYTE msg_type ) +{ + U8 *payload; +#ifndef GMM_TCS4 + U16 length; +#endif + + GMM_TRACE_FUNCTION( "tx_unitdata_req" ); + _decodedMsg[0] = msg_type; + + /* + * send the message to LLC + */ + { + USHORT bit_size = bit_size_message_table[msg_type] + LLC_SDU_OFFSET_BITS; + PALLOC_SDU ( ll_unitdata_req_p, LL_UNITDATA_REQ, bit_size ); + + ll_unitdata_req_p->sdu.o_buf = LLC_SDU_OFFSET_BITS; + /* + * l_buf has to be set to inform CCD how many bit must be reset + */ + ll_unitdata_req_p->sdu.l_buf = bit_size_message_table[msg_type]; + + /* + * fills the primitive with all necessary data + */ + + if ( gmm_data->cipher ) + { + switch ( _decodedMsg [0] ) + { + case ATTACH_REQUEST: + case ATTACH_REJECT: + case AUTHENTICATION_AND_CIPHERING_REQUEST: + case AUTHENTICATION_AND_CIPHERING_RESPONSE: + case AUTHENTICATION_AND_CIPHERING_REJECT: + case IDENTITY_RESPONSE: + case ROUTING_AREA_UPDATE_REQUEST: + /* + * <R.GMM.CIPHMSG.M.001> + */ + tx_fill_unitdata_req ( ll_unitdata_req_p, + tlli_type, + LL_CIPHER_OFF ); + + break; + default: + tx_fill_unitdata_req ( ll_unitdata_req_p, + tlli_type, + LL_CIPHER_ON ); + break; + } + } + else + { + tx_fill_unitdata_req ( ll_unitdata_req_p, + tlli_type, + LL_CIPHER_OFF ); + + } + + if ( ccd_codeMsg ( CCDENT_GMM, + UPLINK, + (T_MSGBUF *) &ll_unitdata_req_p->sdu, + _decodedMsg, + NOT_PRESENT_8BIT) != ccdOK + ) + { + + /* + * Error Handling + */ + TRACE_ERROR( "CCD_ERROR: Error Handling for ccd-output not yet supported" ) ; + PFREE ( ll_unitdata_req_p ); + } + else + { + /* + * Set the Protocol discriminator to PD_GMM, defined in GSM 4.0.8 + * Set the Skip indicater to 0 + */ + ccd_codeByte (ll_unitdata_req_p->sdu.buf, + (USHORT)(ll_unitdata_req_p->sdu.o_buf - 8), + 8, + PD_GMM); + ll_unitdata_req_p->sdu.l_buf += 8; + ll_unitdata_req_p->sdu.o_buf -= 8; + + #ifndef NTRACE + + payload = &(ll_unitdata_req_p->sdu.buf[0]); /* beginning of buffer */ + payload += (ll_unitdata_req_p->sdu.o_buf) >> 3; /* plus offset (bytes) */ +#ifndef GMM_TCS4 + length = (ll_unitdata_req_p->sdu.l_buf) >> 3; /* length (bytes, bits / 8) */ +#endif + + switch ( _decodedMsg [0] ) + { + case ATTACH_REQUEST: + TRACE_0_OUT_PARA ( "ATTACH_REQ" ); +#ifndef GMM_TCS4 + TRACE_BINDUMP( GMM_handle, + TC_USER4, + "ATTACH REQUEST", + payload, + length); +#endif + break; + case ATTACH_COMPLETE: + TRACE_0_OUT_PARA ( "ATTACH_COMPLETE" ); + break; + case U_DETACH_REQUEST: + TRACE_0_OUT_PARA ( "DETACH_REQ" ); + break; + case U_DETACH_ACCEPT: + TRACE_0_OUT_PARA ( "DETACH_ACC" ); + break; + case ROUTING_AREA_UPDATE_REQUEST: + TRACE_0_OUT_PARA ( "RAU_REQ" ); +#ifndef GMM_TCS4 + TRACE_BINDUMP( GMM_handle, + TC_USER4, + "ROUTING AREA UPDATE REQUEST", + payload, + length); +#endif + break; + case ROUTING_AREA_UPDATE_COMPLETE: + TRACE_0_OUT_PARA ( "RAU_COMPLETE" ); + break; + case P_TMSI_REALLOCATION_COMPLETE: + TRACE_0_OUT_PARA ( "PTMSI_REALLOC_COMPLETE" ); + break; + case AUTHENTICATION_AND_CIPHERING_RESPONSE: + TRACE_0_OUT_PARA ( "A&C_RES" ); + break; + case IDENTITY_RESPONSE: + TRACE_0_OUT_PARA ( "ID_RES"); + break; + case GMM_STATUS: + TRACE_0_OUT_PARA ( "GMM_STATUS"); + break; + /* wrong direction: */ + case ATTACH_ACCEPT: + TRACE_ERROR ( "ATTACH_ACC not uplink direction"); + break; + case ATTACH_REJECT: + TRACE_ERROR ( "ATTACH_REJECT not uplink direction"); + break; + case ROUTING_AREA_UPDATE_ACCEPT: + TRACE_ERROR ( "ROUTING_AREA_UPDATE_ACCEPT not uplink direction"); + break; + case ROUTING_AREA_UPDATE_REJECT: + TRACE_ERROR ( "ROUTING_AREA_UPDATE_REJECT not uplink direction"); + break; + case P_TMSI_REALLOCATION_COMMAND: + TRACE_ERROR ( "PTMSI_REALLOC_CMD not uplink direction"); + break; + case AUTHENTICATION_AND_CIPHERING_REQUEST: + TRACE_ERROR ( "A&C_REQ not uplink direction"); + break; + case AUTHENTICATION_AND_CIPHERING_REJECT: + TRACE_ERROR ( "A&C_REJ not uplink direction"); + break; + case IDENTITY_REQUEST: + TRACE_ERROR ( "ID_REQ not uplink direction"); + break; + case GMM_INFORMATION: + TRACE_ERROR ( "GMM_INFO not uplink direction"); + break; + default: + TRACE_ERROR ("Unknown GMM PDU"); + break; + } + #endif /* _SIMULATION_ */ + + PSEND ( hCommLLC, ll_unitdata_req_p); + + } + } + GMM_RETURN; +} /* tx_fill_unitdata_req() */ + +