FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-gsm/rr/rr_forp.c @ 673:2f7df7a314f8
gsm-fw/g23m-gsm subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 28 Sep 2014 23:20:04 +0000 |
parents | |
children | 3501bc16450a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-gsm/rr/rr_forp.c Sun Sep 28 23:20:04 2014 +0000 @@ -0,0 +1,1564 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| 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 : Decoding of Air Interface Messages. ++----------------------------------------------------------------------------- +*/ + +#ifndef RR_FORC_C +#define RR_FORC_C + +#define ENTITY_RR + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include <stdlib.h> +#include <stddef.h> /* offsetof */ +#include "typedefs.h" +#include "pcm.h" +#include "pconst.cdg" +#include "mconst.cdg" +#include "message.h" +#include "ccdapi.h" +#include "vsi.h" +#include "custom.h" +#include "gsm.h" +#include "prim.h" +#include "tok.h" +#include "rr.h" +#include "rr_em.h" + +/*==== EXPORT =====================================================*/ + +/*==== PRIVAT =====================================================*/ + +/*==== VARIABLES ==================================================*/ + + +/*==== FUNCTIONS ==================================================*/ + + + +LOCAL void for_unitdata_ind_sys_info_5_5bis(T_SI_TYPE si_type, T_MPH_UNITDATA_IND *mph_unitdata_ind, + UBYTE *ba_index, BUF_neigh_cell_desc *neigh_cell_desc, + T_LIST *list,T_VOID_STRUCT *sys_info_5_5bis); + +LOCAL void for_unitdata_ind_sys_info_2_2bis(T_SI_TYPE si_type, T_MPH_UNITDATA_IND *mph_unitdata_ind, + BUF_neigh_cell_desc *neigh_cell_desc, + T_LIST *list, T_VOID_STRUCT *sys_info_2_2bis); + +LOCAL void for_unitdata_ind_si3_si4(T_SI_TYPE si_type, T_MPH_UNITDATA_IND *mph_unitdata_ind, + T_loc_area_ident *loc_area_ident, + T_VOID_STRUCT *sys_info_3_4); +/* + * ------------------------------------------------------------------- + * PRIMITIVE Processing functions + * ------------------------------------------------------------------- + */ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR | +| STATE : code ROUTINE : for_dl_data_ind | ++--------------------------------------------------------------------+ + + PURPOSE : Process the primitive DL_DATA_IND received from RR. + +*/ + +GLOBAL void for_dl_data_ind (T_DL_DATA_IND *dl_data_ind_orig) +{ + GET_INSTANCE_DATA; + UBYTE pd; + UBYTE ti; + UBYTE mt; + U8 *payload; + U16 length; + +#if defined FF_EOTD + UBYTE other_than_applic = 1; +#endif /* FF_EOTD */ + + PPASS(dl_data_ind_orig, dl_data_ind, DL_DATA_IND); + + TRACE_FUNCTION ("for_dl_data_ind()"); + + if (dl_data_ind->sdu.l_buf < 16) + { + /* + * message too short, Ignore the message. + */ + PFREE (dl_data_ind); + return; + } + /* + * get protocol discriminator and transaction identifier + * from the message. + */ + GET_PD (dl_data_ind->sdu, pd); + GET_TI (dl_data_ind->sdu, ti); + + /* + * check the protocol discriminator. + */ + switch (pd) + { + case PD_TST: + /* + * Test messages are handled in RR. + */ + if (ti NEQ 0) + { + /* + * The skip-indicator (equal to transaction identifier in higher layer) + * must be set to 0, else ignore the message. + */ + PFREE (dl_data_ind); + break; + } + + /* + * For test messages the handling is directly coded in RR without CCD. + * Get the message type: + */ + ccd_decodeByte (dl_data_ind->sdu.buf, (USHORT)(dl_data_ind->sdu.o_buf+8),8, + &mt); + + switch (mt) + { + case OPEN_LOOP_CMD: + /* + * Open a TCH loop + */ + dat_for_open_loop_cmd (dl_data_ind); + break; + + case CLOSE_TCH_LOOP_CMD: + /* + * Close a TCH loop + */ + dat_for_close_loop_cmd (dl_data_ind, dl_data_ind->sdu.buf[ + (dl_data_ind->sdu.o_buf+16)>>3]); + break; + + case TEST_INTERFACE: + /* + * Handling of the test interface message for DAI purposes. + */ + dat_for_test_interface (dl_data_ind, dl_data_ind->sdu.buf[ + (dl_data_ind->sdu.o_buf+16)>>3]); + break; + + default: + /* + * Unknown message type, Ignore the message. + */ + PFREE (dl_data_ind); + break; + } + break; + + case PD_RR: + /* + * RR Messages + */ + if (ti NEQ 0) + { + /* + * The skip-indicator (equal to transaction identifier in higher layer) + * must be set to 0, else ignore the message. + */ + PFREE (dl_data_ind); + break; + } + + payload = &(dl_data_ind->sdu.buf[0]); /*Beginning of the buffer */ + payload += (dl_data_ind->sdu.o_buf) >> 3; /* Plus offset (bytes) */ + + length = BYTELEN ( dl_data_ind->sdu.l_buf ); /* Length (bytes) */ + + + /* + * modify length and offset of the incoming message toskip protocol + * discriminator and transaction identifier. CCD starts with the + * message type. + */ + + dl_data_ind->sdu.l_buf -= 8; + dl_data_ind->sdu.o_buf += 8; + + /* + * clean the error field and the output of CCD. + */ + memset (&rr_data->ms_data.error, 0, sizeof (T_ERROR)); + memset (_decodedMsg, 0, MAX_MSTRUCT_LEN_RR); + + /* + * decode the message with CCD. + */ + if (ccd_decodeMsg (CCDENT_RR, DOWNLINK, + (T_MSGBUF *)&dl_data_ind->sdu, + _decodedMsg, NOT_PRESENT_8BIT) NEQ ccdOK) + { + /* + * CCD has detected an error + */ + USHORT parlist[6]; + UBYTE ccd_err; + + /* + * get the first detected error from CCD. + */ + memset (parlist,0, sizeof (parlist)); + ccd_err = ccd_getFirstError (CCDENT_RR, parlist); + + do + { + /* + * Error Handling + */ + switch (ccd_err) + { + case ERR_MSG_LEN: /* some exceeds entire message length */ + case ERR_COMPREH_REQUIRED: /* Comprehension required */ + case ERR_MAND_ELEM_MISS: /* Mandatory elements missing */ + if((_decodedMsg[0] EQ D_CHAN_REL ) AND (ccd_err EQ ERR_MAND_ELEM_MISS) ) + { + break; /* actions same as normal release */ + } + else + { + dat_send_rr_status_msg (RRC_INVALID_MAN_INFO); + PFREE (dl_data_ind); + return; + } + + case ERR_INVALID_MID: /* unknown message type is handled below */ + break; + case ERR_IE_NOT_EXPECTED: + case ERR_IE_SEQUENCE: + case ERR_MAX_IE_EXCEED: + case ERR_MAX_REPEAT: + TRACE_EVENT_P1("CCD error=%d ignored here", ccd_err); + break; + default: + TRACE_ERROR("unknow CCD return"); + break; + } + ccd_err = ccd_getNextError (CCDENT_RR, parlist); + } + while (ccd_err NEQ ERR_NO_MORE_ERROR); + } + + /* + * depending on the message type + */ + + RR_BINDUMP (payload,length,ARFCN_NOT_PRESENT, + FRAME_NUM_NOT_PRESENT,DOWNLINK); + + switch (_decodedMsg[0]) + { + case D_ASSIGN_CMD: + + /* + * Assignment command message to start an intracell + * handover. Check the message content and configure layer 1. + */ + + + for_check_assign_cmd (dl_data_ind, (T_D_ASSIGN_CMD *)_decodedMsg); + break; + + case D_CHAN_REL: + { + /* + * channel release message to release a RR-connection. + */ + MCAST (chan_rel, D_CHAN_REL); + + + + if (chan_rel->v_ba_range) + { + /* + * if the optional information element BA_RANGE is + * included check the frequencies. + */ + if (! for_check_ba_range (&chan_rel->ba_range)) + { + /* + * set the optional element as not available if + * it contains a non-supported channel number. + */ + chan_rel->v_ba_range = FALSE; + } + } + + /* + * start processing of the channel release message. + */ + dat_for_chan_rel (dl_data_ind, chan_rel); + break; + } + + case D_CHAN_MOD: + { + /* + * channel mode modify message to handle a + * changed channel mode. + */ + MCAST (chmod, D_CHAN_MOD); /* T_D_CHAN_MOD */ + + + + switch( chmod->chan_desc.chan_type ) + { + case TCH_H_S0: + case TCH_H_S1: + switch(chmod->chan_mode) + { + case CM_DATA_12_0: /* data 12 k */ + case CM_DATA_6_0: /* data 6 k */ + case CM_DATA_3_6: /* data 3.6 k */ + case CM_DATA_14_4: /* data 14.4 k */ + if(FldGet(rr_data->mscap.datCap2, DHRSup) EQ 0) + { + for_set_content_error (RRC_CHANNEL_MODE); + TRACE_EVENT("Half Rate Data NOT supported"); + } + break; + default: + break; + } + break; + default: + break; + } + + /* + * check the channel description + */ + for_check_channel_descr (&chmod->chan_desc); + + /* + * check the channel mode + */ + for_check_channel_mode (chmod->chan_mode); + + /* + * if there any problem in channel mode or channel description + * the CHANNEL MODE ACK message will be sent with old channel type/mode + */ + if(rr_data->ms_data.error.val EQ RRC_CHANNEL_MODE) + { + dat_for_chan_mod (dl_data_ind, chmod); + break; + } + + + /* + * if the message contains a channel mode information element which indicating AMR + * and the multirate configuration IEI exists, check the multirate configuration IEI. + */ + + if ( (chmod->chan_mode EQ CM_AMR) AND (chmod->v_multirate_conf) ) + { + /* + * From 3GPP TS 04.08 + * + * "Channel Description IE" in Channel Mode Modify + * + * This is sufficient to identify the channel in the case of a TCH/H + TCH/H configuration. + * If used for a multislot configuration, the IE shall describe the present channel configuration with + * TN indicating the main channel. + * + * The IE shall not indicate a new channel configuration when included in the Channel Mode Modify message. + */ + for_check_multirate_conf( &chmod->multirate_conf, rr_data->sc_data.chan_desc.chan_type); + } + + /* + * From 3GPP TS 04.18 Sec. 3.4.6.1.3 Abnormal cases + * If any inconsistencies in MultiRate IEs then ignore the Channel Mode Modify + * and shall not send the CHANNEL MODE MODIFY + */ + if(rr_data->ms_data.error.val EQ RRC_CHANNEL_MODE) + { + PFREE(dl_data_ind); + break; + } + + /* + * process the message + * There is no error in Channel Type, Channel Descr and no inconsistency in Multirate IEs + */ + + dat_for_chan_mod (dl_data_ind, chmod); + break; + } + + case D_CIPH_CMD: + { + /* + * change the cipher mode setting + */ + + MCAST (ciph_cmd, D_CIPH_CMD); /* T_D_CIPH_CMD */ + + + + /* + * check the message content + */ + for_check_cipher_mode_set (&ciph_cmd->ciph_mode_set); + + /* + * process the message + */ + + dat_for_ciph_cmd (dl_data_ind, ciph_cmd); + break; + } + + case D_FREQ_REDEF: + { + /* + * frequency redefinition message to change the frequency + * hopping list during a connection. + */ + + /*lint -e813*/ + T_LIST cell_chan_desc; + + MCAST (freq_redef, D_FREQ_REDEF); /* T_D_FREQ_REDEF */ + + + + /* + * check the channel description + */ + for_check_channel_descr (&freq_redef->chan_desc); + + if (freq_redef->v_cell_chan_desc) + { + /* + * If the message contains a new cell channel description + * build a channel number list. This new list will replace + * the current list stored in RR. + */ + for_create_channel_list ((T_f_range *)&freq_redef->cell_chan_desc, + &cell_chan_desc); + } + + + /* + * process the message. + */ + dat_for_freq_redef (dl_data_ind, freq_redef, &cell_chan_desc); + break; + } + + case D_HANDOV_CMD: + /* + * check the message content and process the handover message. + */ + + + + for_check_handov_cmd (dl_data_ind, (T_D_HANDOV_CMD *)_decodedMsg); + break; + + case B_RR_STATUS: + /* + * incoming status messages are ignored. + */ + + + + EM_RR_STATUS_RECEIVED; + + PFREE (dl_data_ind); + break; + + case D_CLASS_ENQ: + /* + * the network requests the mobile station classmark. + */ + + + +#ifdef REL99 + dat_for_class_enq (dl_data_ind, (T_D_CLASS_ENQ *)_decodedMsg); +#else + dat_for_class_enq (dl_data_ind); +#endif + break; +#ifdef GPRS + case D_PDCH_ASS_CMD: + + + + dl_data_ind->sdu.l_buf += 8; + dl_data_ind->sdu.o_buf -= 8; + rr_data->gprs_data.tbf_est = TBF_EST_NONE; + dat_rrgrr_data_ind (dl_data_ind); + break; + + case D_CHANGE_ORDER: + + + + dl_data_ind->sdu.l_buf += 8; + dl_data_ind->sdu.o_buf -= 8; + rr_data->gprs_data.tbf_est = TBF_EST_NONE; + dat_rrgrr_change_order (dl_data_ind, (T_D_CHANGE_ORDER *)_decodedMsg); + break; +#endif +#if defined FF_EOTD + case B_APPLIC_INFO: + { + MCAST (b_applic_info, B_APPLIC_INFO); + dat_for_applic_info (b_applic_info); + other_than_applic = 0; + PFREE(dl_data_ind); + break; + } +#endif /* FF_EOTD */ + + default: /* switch (_decodedMsg[0]) */ + /* + * Unknown or not supported message + * Answer with a RR STATUS message. + */ + dat_send_rr_status_msg (RRC_MSG_NOT_IMPL); + + PFREE (dl_data_ind); + break; + } + break; + + + default: /* switch (pd) */ + /* + * all other protocol discriminators are for upper layer + * and will be forwarded to MM. + */ + dat_for_l3_data_ind (dl_data_ind); + break; + } + +#if defined FF_EOTD + if ( other_than_applic AND rr_data->applic_rx.state EQ SAI_SEGM ) + rr_applic_rx_init ( &rr_data->applic_rx ); +#endif /* FF_EOTD */ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR | +| STATE : code ROUTINE : for_mph_unitdata_ind | ++--------------------------------------------------------------------+ + + PURPOSE : Reception of unacknowledged message on BCCH, AGCH or PCH. + +*/ + +GLOBAL void for_mph_unitdata_ind (T_MPH_UNITDATA_IND *mph_unitdata_ind_orig) +{ + GET_INSTANCE_DATA; + T_LIST list; /* used for storing a neighbourcell list */ + UBYTE pd; /* Protocol discriminator */ + UBYTE ti; /* Transaction identifier (equal to skip indicator) */ + U8 *payload; + U16 length; + + PPASS(mph_unitdata_ind_orig, mph_unitdata_ind, MPH_UNITDATA_IND); + + if (mph_unitdata_ind->sdu.l_buf < 16) + { + PFREE (mph_unitdata_ind); /* message too short ignore message */ + return; + } + /* + * Extract the protocol discriminator and the + * skip indicator from the unacknowledged message. + */ + GET_UI_PD (mph_unitdata_ind->sdu, pd); + GET_UI_TI (mph_unitdata_ind->sdu, ti); + + payload = &(mph_unitdata_ind->sdu.buf[0]); /*Beginning of the buffer */ + payload += (mph_unitdata_ind->sdu.o_buf) >> 3; /*Plus offset (bytes) */ + + length = BYTELEN ( mph_unitdata_ind->sdu.l_buf ); /*Length (Bytes)*/ + + /* + * Skip both the PD and TI in the message by modifying the pointer + * in the sdu to the begin of the message type. + */ + mph_unitdata_ind->sdu.l_buf -= 8; + mph_unitdata_ind->sdu.o_buf += 8; + + /* + * The protocol discriminator must be RR. + * The skip indicator (TI) must be 0. (GSM 04.08, 10.3.1) + */ + if (! (pd EQ PD_RR AND ti EQ 0)) + { + PFREE (mph_unitdata_ind); + return; + } + + /* + * Clear error field and CCD result field. + */ + memset (&rr_data->ms_data.error,0, sizeof(rr_data->ms_data.error)); + memset (_decodedMsg,0, sizeof(_decodedMsg)); + + /* + * Decode the message with CCD. + */ + if (ccd_decodeMsg (CCDENT_RR, DOWNLINK, + (T_MSGBUF *)&mph_unitdata_ind->sdu, + (UBYTE *)_decodedMsg, + NOT_PRESENT_8BIT) NEQ ccdOK) + { + /* + * CCD has detected an error + */ + UBYTE ccd_err; + USHORT parlist [6]; + + /* + * get the first error + */ + ccd_err = ccd_getFirstError (CCDENT_RR, parlist); + do + { + /* + * Error Handling + */ + switch (ccd_err) + { + case ERR_INVALID_MID: /* unknown message type */ + case ERR_MSG_LEN: /* some IE exceeds entire message length */ + case ERR_COMPREH_REQUIRED: /* comprehension required */ + case ERR_MAND_ELEM_MISS: /* Mandatory elements missing */ + TRACE_EVENT_P2("message with mt=%d ignored due to CCD error=%d", + mph_unitdata_ind->sdu.buf[mph_unitdata_ind->sdu.o_buf>>3], + ccd_err); + PFREE (mph_unitdata_ind); /* in unacknowledged mode ignore message */ + return; + + case ERR_IE_NOT_EXPECTED: + case ERR_IE_SEQUENCE: + case ERR_MAX_IE_EXCEED: + case ERR_MAX_REPEAT: + TRACE_EVENT_P1("CCD error=%d ignored here", ccd_err); + break; + default: + TRACE_ERROR("unknown CCD return"); + break; + } + ccd_err = ccd_getNextError (CCDENT_RR, parlist); + } + while (ccd_err NEQ ERR_NO_MORE_ERROR); + } + + RR_BINDUMP (payload,length,mph_unitdata_ind->arfcn, + mph_unitdata_ind->fn,DOWNLINK); + + /* + * depending on the message type + */ + switch (_decodedMsg[0]) + { + case D_SYS_INFO_1: + { + /* + * system information type 1 message on BCCH + */ + MCAST (sys_info_1, D_SYS_INFO_1); /* T_D_SYS_INFO_1 */ + + + + /* + * successfully received system info + * decrements the BCCH error counter + */ + if (rr_data->bcch_error) + rr_data->bcch_error--; + + /* + * create a cell channel description and store it + * for later use together with frequency hopping + */ + for_create_channel_list ((T_f_range *)&sys_info_1->cell_chan_desc, + &list); + + /* + * Process the message + */ + att_for_sysinfo_type1 (mph_unitdata_ind->arfcn, sys_info_1, &list); + break; + } + + case D_SYS_INFO_2: + { + /* + * System information type 2 message on BCCH + */ +/* Implements RR Clone findings #13 */ + + MCAST (sys_info_2, D_SYS_INFO_2); /* T_D_SYS_INFO_2 */ + + +/* Implements RR Clone findings #13 */ + for_unitdata_ind_sys_info_2_2bis(SI_TYPE_2, mph_unitdata_ind, + &sys_info_2->neigh_cell_desc,&list,(T_VOID_STRUCT *)sys_info_2); + + + break; + + + } + + case D_SYS_INFO_2BIS: + { + /* + * system information type 2bis message on BCCH + */ +/* Implements RR Clone findings #13 */ + + MCAST (sys_info_2bis, D_SYS_INFO_2BIS); /* T_D_SYS_INFO_2BIS */ + + +/* Implements RR Clone findings #13 */ + for_unitdata_ind_sys_info_2_2bis(SI_TYPE_2BIS, mph_unitdata_ind, + &sys_info_2bis->neigh_cell_desc,&list,(T_VOID_STRUCT *)sys_info_2bis); + break; + + + } + + case D_SYS_INFO_2TER: + { + /* + * system information type 2ter message on BCCH + */ + + MCAST (sys_info_2ter, D_SYS_INFO_2TER); /* T_D_SYS_INFO_2TER */ + + + /* + * successfully received system info + * decrements the BCCH error counter + */ + if (rr_data->bcch_error) + rr_data->bcch_error--; + + switch (std) + { + case STD_EGSM: + case STD_DUAL: + case STD_DUAL_EGSM: + case STD_DUAL_US: +#ifdef TI_PS_FF_QUAD_BAND_SUPPORT + case STD_850_1800: + case STD_900_1900: + case STD_850_900_1800: + case STD_850_900_1900: +#endif + /* + * only for extended GSM and dualband + * + * extract the multiband parameter + */ + rr_data->ncell_mb = (sys_info_2ter->neigh_cell_desc.b_neigh_cell_desc + [sys_info_2ter->neigh_cell_desc.o_neigh_cell_desc>>3] + & 0x60) >> 5; + + /* + * create a neighbourcell list + */ + for_create_channel_list ((T_f_range *)&sys_info_2ter->neigh_cell_desc, + &list); + + /* + * process the message in the attachment process + */ + att_for_sysinfo_type2ter (mph_unitdata_ind->arfcn, sys_info_2ter, &list); + break; + + default: + break; + } + break; + } + +#if defined (REL99) && defined (TI_PS_FF_EMR) + case D_SYS_INFO_2QUATER: + { + /* Process and store only for serving cell..Since SI-2quater + is required only for reporting*/ + UBYTE index = att_get_index(mph_unitdata_ind->arfcn); + + if( index EQ SC_INDEX ) + { + MCAST (sys_info_2quater, D_SYS_INFO_2QUATER); /* T_D_SYS_INFO_2QUATER */ + if(for_process_si2quater(&sys_info_2quater->si_2qua_octets)) + { + for_send_enh_para(&rr_data->sc_data.emr_data_current); + /*we received all the instances successfully, we no longer need to monitor SI-2quater*/ + for_mon_si2quater_req(STOP_MON_BCCH); + rr_data->sc_data.cd.si2quater_status = SI2QUATER_ACQ_COMP; + } + } + break; + } +#endif + + case D_SYS_INFO_3: + { + /* + * create system information type 3 message on BCCH + */ + + MCAST (sys_info_3, D_SYS_INFO_3); /* T_D_SYS_INFO_3 */ + + + +/* Implements RR Clone findings #16 */ + for_unitdata_ind_si3_si4(SI_TYPE_3, mph_unitdata_ind, + &sys_info_3->loc_area_ident,(T_VOID_STRUCT *)sys_info_3); + + break; + + + } + + case D_SYS_INFO_4: + { + /* + * system information type 4 message on BCCH + */ + + MCAST (sys_info_4, D_SYS_INFO_4); /* T_D_SYS_INFO_4 */ + + + +/* Implements RR Clone findings #16 */ + for_unitdata_ind_si3_si4(SI_TYPE_4, mph_unitdata_ind, + &sys_info_4->loc_area_ident,(T_VOID_STRUCT *)sys_info_4); + break; + + + } + + case D_SYS_INFO_5: + { + /* + * system information type 5 message on SACCH + */ +/* Implements RR Clone findings #4 */ + + + MCAST (sys_info_5, D_SYS_INFO_5); /* T_D_SYS_INFO_5 */ + + +/* Implements RR Clone findings #4 */ + for_unitdata_ind_sys_info_5_5bis(SI_TYPE_5, mph_unitdata_ind,&rr_data->sc_data.ba_index, + &sys_info_5->neigh_cell_desc, &list,(T_VOID_STRUCT *)sys_info_5); + break; + + + + } + + case D_SYS_INFO_5BIS: + { + /* + * system information type 5bis message on SACCH + */ +/* Implements RR Clone findings #4 */ + + MCAST (sys_info_5bis, D_SYS_INFO_5BIS); /* T_D_SYS_INFO_5BIS */ + + +/* Implements RR Clone findings #4 */ + for_unitdata_ind_sys_info_5_5bis(SI_TYPE_5BIS, mph_unitdata_ind,&rr_data->sc_data.ba_index, + &sys_info_5bis->neigh_cell_desc,&list,(T_VOID_STRUCT *)sys_info_5bis); + break; + + } + + case D_SYS_INFO_5TER: + { + /* + * system information type 5ter message on SACCH + */ + + MCAST (sys_info_5ter, D_SYS_INFO_5TER); /* T_D_SYS_INFO_5TER */ + + + switch (std) + { + case STD_EGSM: + case STD_DUAL: + case STD_DUAL_EGSM: + case STD_DUAL_US: +#ifdef TI_PS_FF_QUAD_BAND_SUPPORT + case STD_850_1800: + case STD_900_1900: + case STD_850_900_1800: + case STD_850_900_1900: +#endif + /* + * only for extended GSM and Dualband + * + * dont use ba index from 5ter, because R&S sends inconsistent + * BCCH data for multiband testcase 26.6.3.6 + * + * extract multiband parameter + */ + rr_data->ncell_mb = (sys_info_5ter->neigh_cell_desc.b_neigh_cell_desc + [sys_info_5ter->neigh_cell_desc.o_neigh_cell_desc>>3] + & 0x60) >> 5; + + /* + * create a neighbourcell list + */ + for_create_channel_list ((T_f_range *)&sys_info_5ter->neigh_cell_desc, + &list); + + /* + * process the message in the attachment process + */ + att_for_sysinfo_type5ter (mph_unitdata_ind->arfcn, &list); + break; + + default: + break; + } + break; + } + + case D_SYS_INFO_6: + { + /* + * system information type 6 message on SACCH + */ + + MCAST (sys_info_6, D_SYS_INFO_6); /* T_D_SYS_INFO_6 */ + + + if (sys_info_6->loc_area_ident.c_mnc EQ 2) + { + /* Internally G23 uses always 3-digit-MNC */ + sys_info_6->loc_area_ident.c_mnc = SIZE_MNC; + sys_info_6->loc_area_ident.mnc[2] = 0xf; + } + + /* + * process the message in the attachment process + */ + att_for_sysinfo_type6 (mph_unitdata_ind->arfcn, sys_info_6); + break; + } + + case D_SYS_INFO_7: /* T_D_SYS_INFO_7 */ + case D_SYS_INFO_8: /* T_D_SYS_INFO_8 */ + /* + * successfully received system info + * decrements the BCCH error counter + */ + + + if (rr_data->bcch_error) + rr_data->bcch_error--; + + /* + * process the message in the attachment process + */ + att_for_sysinfo_type7_8 (mph_unitdata_ind->arfcn, (T_D_SYS_INFO_8 *)_decodedMsg); + break; +#ifdef GPRS + case D_SYS_INFO_13: /* T_D_SYS_INFO_13 */ + { + + MCAST (sys_info_13, D_SYS_INFO_13); + + + if (rr_data->bcch_error) + rr_data->bcch_error--; + + att_for_sysinfo_type13 (mph_unitdata_ind, sys_info_13); + } + break; +#endif + + case D_IMM_ASSIGN: + { + /* + * immediate assignment message on AGCH + */ + + MCAST (imm_assign, D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */ + + + /* + * process the message + */ + dat_for_imm_assign (mph_unitdata_ind, imm_assign); + break; + } + + case D_IMM_ASSIGN_EXT: + { + /* + * immediate assignment extended message on AGCH + */ + + MCAST (imm_assign_ext, D_IMM_ASSIGN_EXT); /* T_D_IMM_ASSIGN_EXT */ + + + /* + * process the message. + */ + dat_for_imm_assign_ext (mph_unitdata_ind, imm_assign_ext); + break; + } + + case D_IMM_ASSIGN_REJ: + { + + MCAST (imm_assign_rej, D_IMM_ASSIGN_REJ); /* T_D_IMM_ASSIGN_REJ */ + + + /* + * process the message + */ + dat_for_imm_assign_rej (imm_assign_rej); + break; + } + + case D_EXT_MEAS_ORDER: + { + + MCAST (ext_meas_order, D_EXT_MEAS_ORDER); + + + + dat_for_ext_meas_order (ext_meas_order); + break; + + } + + default: + TRACE_EVENT_P1 ( "unknown %02x", _decodedMsg[0] ); + break; + } + + PFREE (mph_unitdata_ind); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR | +| STATE : code ROUTINE : for_rr_trace_message | ++--------------------------------------------------------------------+ + + PURPOSE : Function replaces RR_BINDUMP & TRACE_DATA_IND Macros + +*/ + +GLOBAL void for_rr_trace_message (UBYTE *payload, USHORT length, + USHORT arfcn, ULONG fn, UBYTE direction) +{ + GET_INSTANCE_DATA; + + if(direction EQ DOWNLINK) + { + switch(_decodedMsg[0]) + { + case D_ASSIGN_CMD: + TRACE_EVENT ( "ASSIGNMENT_COMMAND DL" ); + break; + + case D_CHAN_REL: + TRACE_EVENT ( "CHANNEL_RELEASE DL" ); + break; + + case D_CHAN_MOD: + TRACE_EVENT ( "CHANNEL_MODE_MODIFY DL" ); + break; + + case D_CIPH_CMD: + TRACE_EVENT ( "CIPHERING_COMMAND DL" ); + break; + + case D_FREQ_REDEF: + TRACE_EVENT ( "FREQ RE-DEFINITION DL" ); + break; + + case D_HANDOV_CMD: + TRACE_EVENT ( "HANDOVER_COMMAND DL" ); + break; + + case B_RR_STATUS: + TRACE_EVENT ( "RR_STATUS DL" ); + break; + + case D_CLASS_ENQ: + TRACE_EVENT ( "CLASSMARK_ENQUIRY DL" ); + break; + + #ifdef GPRS + case D_PDCH_ASS_CMD: + TRACE_EVENT ( "PDCH_ASSIGNMENT_COMMAND DL" ); + break; + + case D_CHANGE_ORDER: + TRACE_EVENT ( "CHANGE_ORDER DL" ); + break; + #endif /*GPRS*/ + + case D_SYS_INFO_1: + TRACE_EVENT ( "SYS_INFO_1 DL" ); + break; + + case D_SYS_INFO_2: + TRACE_EVENT ( "SYS_INFO_2 DL"); + break; + + case D_SYS_INFO_2BIS: + TRACE_EVENT ( "SYS_INFO_2BIS DL" ); + break; + + case D_SYS_INFO_2TER: + TRACE_EVENT ( "SYS_INFO_2TER DL" ); + break; + + case D_SYS_INFO_3: + TRACE_EVENT ( "SYS_INFO_3 DL" ); + break; + + case D_SYS_INFO_4: + TRACE_EVENT ( "SYS_INFO_4 DL" ); + break; + + case D_SYS_INFO_5: + TRACE_EVENT ( "SYS_INFO_5 DL"); + break; + + case D_SYS_INFO_5BIS: + TRACE_EVENT ( "SYS_INFO_5BIS DL" ); + break; + + case D_SYS_INFO_5TER: + TRACE_EVENT ( "SYS_INFO_5TER DL" ); + break; + + case D_SYS_INFO_6: + TRACE_EVENT ( "SYS_INFO_6 DL" ); + break; + + case D_SYS_INFO_7: + TRACE_EVENT ( "SYS_INFO_7 DL" ); + break; + + case D_SYS_INFO_8: + TRACE_EVENT ( "SYS_INFO_8 DL" ); + break; + + #ifdef GPRS + case D_SYS_INFO_13: + TRACE_EVENT ( "SYS_INFO_13 DL" ); + break; + #endif/*GPRS*/ + + case D_IMM_ASSIGN: + TRACE_EVENT ( "IMM_ASSIGN DL" ); + break; + + case D_IMM_ASSIGN_EXT: + TRACE_EVENT ( "IMM_ASSIGN_EXT DL" ); + break; + + case D_IMM_ASSIGN_REJ: + TRACE_EVENT ( "IMM_ASSIGN_REJ DL" ); + break; + + case D_EXT_MEAS_ORDER: + TRACE_EVENT ( "EXT_MEAS_ORDER" ); + break; + + default: + return; + } + } + else /*UPLINK*/ + { + switch(_decodedMsg[0]) + { + case U_PAG_RES: + TRACE_EVENT ( "PAGING_RESPONSE UL" ); + break; + + case U_ASSIGN_FAIL: + TRACE_EVENT ( "ASSIGNMENT_FAILURE UL" ); + break; + + case U_CIPH_COMP: + TRACE_EVENT ( "CIPHERING_COMPLETE UL" ); + break; + + case U_HANDOV_FAIL: + TRACE_EVENT ( "HANDOVER_FAILURE UL" ); + break; + + case U_HANDOV_COMP: + TRACE_EVENT ( "HANDOVER_COMPLETE UL" ); + break; + + case U_ASSIGN_COMP: + TRACE_EVENT ( "ASSIGNMENT_COMPLETE UL" ); + break; + + case U_CHAN_MOD_ACK: + TRACE_EVENT ( "CHANNEL_MODE_ACKNOWLEDGE UL" ); + break; + + case U_MEAS_REP: + TRACE_EVENT ( "MEASUREMENT_REPORT UL" ); + break; + + case U_CLASS_CHNG: + TRACE_EVENT ( "CLASSMARK_CHANGE UL" ); + break; + + case D_RR_INIT_REQ: + TRACE_EVENT ( "RR_INITIALISATION_REQ UL" ); + break; + + case U_PART_REL_COMP: + TRACE_EVENT ( "PARTIAL_RELEASE_COMPLETE UL" ); + break; + + case U_GPRS_SUSP_REQ: + TRACE_EVENT ( "GPRS_SUSPENSION_REQ UL" ); + break; + + case U_EXT_MEAS_REPORT: + TRACE_EVENT ( "EXT_MEAS_REP UL" ); + break; + + default: + return; + } + } + + TRACE_BINDUMP(rr_handle,TC_USER4,NULLSTRING,payload,length); + + TRACE_EVENT_P4 ("[%u] FN=%lu CR=%d SC=%d", + (arfcn)&ARFCN_MASK, fn, + (short)(rr_data->nc_data[CR_INDEX].arfcn), + (short)(rr_data->nc_data[SC_INDEX].arfcn)); + +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR | +| STATE : code ROUTINE : for_unitdata_ind_sys_info_5_5bis | ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the system information type 5 and 5 bis + common parameters. + +*/ +LOCAL void for_unitdata_ind_sys_info_5_5bis(T_SI_TYPE si_type, T_MPH_UNITDATA_IND *mph_unitdata_ind, + UBYTE *ba_index,BUF_neigh_cell_desc *neigh_cell_desc, + T_LIST *list, T_VOID_STRUCT *sys_info_5_5bis ) +{ + + GET_INSTANCE_DATA; + UBYTE old_index; + UBYTE ncell_ext; + + TRACE_FUNCTION("for_unitdata_ind_sys_info_5_5bis()"); + + /* + * store the current band allocation value + */ + old_index = *ba_index; + + /* + * extract the extension indication + */ + ncell_ext = (neigh_cell_desc->b_neigh_cell_desc + [neigh_cell_desc->o_neigh_cell_desc>>3] + & 0x20) ? 1 : 0; + /* + * extract the new band allocation value + */ +#if defined (REL99) && defined (TI_PS_FF_EMR) + rr_data->sc_data.new_ba_index = (neigh_cell_desc->b_neigh_cell_desc + [neigh_cell_desc->o_neigh_cell_desc>>3] + & 0x10) ? 1 : 0; +#else + *ba_index = (neigh_cell_desc->b_neigh_cell_desc + [neigh_cell_desc->o_neigh_cell_desc>>3] + & 0x10) ? 1 : 0; +#endif + + /* + * create a neighbourcell list + */ + for_create_channel_list ((T_f_range *)neigh_cell_desc, + list); + + /* + * process the message in the attachment process + */ + att_for_sysinfo_type5_5bis (mph_unitdata_ind->arfcn, list, + old_index, ncell_ext,si_type); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR +| STATE : code ROUTINE : for_unitdata_ind_sys_info_2_2bis | ++--------------------------------------------------------------------+ + + PURPOSE : This function handles the System Information 2 and 2bis common parameters + +*/ + +LOCAL void for_unitdata_ind_sys_info_2_2bis(T_SI_TYPE si_type, T_MPH_UNITDATA_IND *mph_unitdata_ind, + BUF_neigh_cell_desc *neigh_cell_desc, + T_LIST *list, T_VOID_STRUCT *sys_info_2_2bis) +{ + GET_INSTANCE_DATA; + UBYTE ncell_ext; +#if defined (REL99) && defined (TI_PS_FF_EMR) + UBYTE ba_ind; + UBYTE index; +#endif + + TRACE_FUNCTION("for_unitdata_ind_sys_info_2_2bis()"); + + /* + * successfully received system info + * decrements the BCCH error counter + */ + if (rr_data->bcch_error) + (rr_data->bcch_error)--; + + /* + * extract the ncell extension flag. It indicates + * whether the neighbourcell description is complete + * or must be combined with the neighbourcell description + * of system information 2bis. + */ + ncell_ext = neigh_cell_desc->b_neigh_cell_desc + [neigh_cell_desc->o_neigh_cell_desc>>3] + & 0x20; + +#if defined (REL99) && defined (TI_PS_FF_EMR) + ba_ind = (neigh_cell_desc->b_neigh_cell_desc + [neigh_cell_desc->o_neigh_cell_desc>>3] + & 0x10) ? 1 : 0; + index = att_get_index(mph_unitdata_ind->arfcn); + /* Store BA_IND in appropriate context*/ + for_update_ba_ind (index, ba_ind); +#endif + + /* + * create a neighbourcell list + */ + for_create_channel_list ((T_f_range *)neigh_cell_desc, + list); + /* + * process the message in the attachment process + */ + + att_for_sysinfo_type2_2bis (mph_unitdata_ind->arfcn, sys_info_2_2bis, + list, ncell_ext, si_type); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR | +| STATE : code ROUTINE : for_unitdata_ind_si3_si4 | ++--------------------------------------------------------------------+ + + PURPOSE : This function handles System information type 3 and 4 + common parameters. + +*/ +LOCAL void for_unitdata_ind_si3_si4(T_SI_TYPE si_type, T_MPH_UNITDATA_IND *mph_unitdata_ind, + T_loc_area_ident *loc_area_ident, + T_VOID_STRUCT *sys_info_3_4) + +{ + GET_INSTANCE_DATA; + TRACE_FUNCTION("for_unitdata_ind_si3_si4()"); + + if (loc_area_ident->c_mnc EQ 2) + { + /* Internally G23 uses always 3-digit-MNC */ + loc_area_ident->c_mnc = SIZE_MNC; + loc_area_ident->mnc[2] = 0xf; + } + + /* + * successfully received system info + * decrements the BCCH error counter + */ + if (rr_data->bcch_error) + (rr_data->bcch_error)--; + + + if(si_type EQ SI_TYPE_4) + { + if (((T_D_SYS_INFO_4 *)sys_info_3_4)->v_chan_desc) + { + /* + * If system information contains a CBCH channel + * description check the CBCH channel description + */ + for_check_channel_descr (&((T_D_SYS_INFO_4 *)sys_info_3_4)->chan_desc); + + /* + * Consistency check: If the CBCH channel description + * defines Frequency hopping but the mobile allocation + * is not available, clear the CBCH channel description. + */ + if (((T_D_SYS_INFO_4 *)sys_info_3_4)->chan_desc.hop EQ TRUE AND + ((T_D_SYS_INFO_4 *)sys_info_3_4)->v_mob_alloc EQ FALSE) + ((T_D_SYS_INFO_4 *)sys_info_3_4)->v_chan_desc = FALSE ; + } + att_for_sysinfo_type4 (mph_unitdata_ind->arfcn, (T_D_SYS_INFO_4 *)sys_info_3_4); + } + + /* + * process the message in the attachment process + */ + if(si_type EQ SI_TYPE_3) + att_for_sysinfo_type3 (mph_unitdata_ind->arfcn, (T_D_SYS_INFO_3 *)sys_info_3_4); + +} + +#if defined (REL99) && defined (TI_PS_FF_EMR) +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : RR_FOR | +| STATE : code ROUTINE : for_dl_short_unitdata_ind | ++--------------------------------------------------------------------+ + + PURPOSE : Process the primitive DL_SHORT_UNITDATA_IND received from RR. + +*/ + +GLOBAL void for_dl_short_unitdata_ind (T_DL_SHORT_UNITDATA_IND *dl_short_unitdata_ind_orig) +{ + GET_INSTANCE_DATA; + PPASS(dl_short_unitdata_ind_orig, short_unitdata_ind, DL_SHORT_UNITDATA_IND); + /* + * Clear error field and CCD result field. + */ + memset (&rr_data->ms_data.error,0, sizeof(rr_data->ms_data.error)); + memset (_decodedMsg,0, sizeof(_decodedMsg)); + + /* + * Decode the message with CCD. + * + * The protocol discriminator bit is implicitely checked when trying + * to decode the message + */ + if (ccd_decodeMsg (CCDENT_RR_SHORT, DOWNLINK, + (T_MSGBUF *)&short_unitdata_ind->sdu, + (UBYTE *)_decodedMsg, + NOT_PRESENT_8BIT) NEQ ccdOK) + { + /* + * CCD has detected an error + */ + UBYTE ccd_err; + USHORT parlist [6]; + + /* + * get the first error + */ + ccd_err = ccd_getFirstError (CCDENT_RR, parlist); + do + { + /* + * Error Handling + */ + switch (ccd_err) + { + case ERR_INVALID_MID: /* unknown message type */ + case ERR_MSG_LEN: /* some exceeds entire message length */ + case ERR_MAND_ELEM_MISS: /* Mandatory elements missing */ + TRACE_EVENT_P2("message with mt=%02x ignored due to CCD error=%d", + ((short_unitdata_ind->sdu.buf[short_unitdata_ind->sdu.o_buf>>3]) >> 2) & 0x3F, + ccd_err); + PFREE (short_unitdata_ind); /* in unacknowledged mode ignore message */ + return; + + case ERR_MAX_REPEAT: + TRACE_EVENT_P1("CCD error=%d ignored here", ccd_err); + break; + default: + TRACE_ERROR("unknown CCD return"); + break; + } + ccd_err = ccd_getNextError (CCDENT_RR, parlist); + } + while (ccd_err NEQ ERR_NO_MORE_ERROR); + } + + /* + * depending on the message type + */ + switch (_decodedMsg[0]) + { + case D_MEAS_INF: + { + /* + * add handling of message here:*/ + MCAST (meas_inf, D_MEAS_INF); + if (dat_for_meas_inf(meas_inf) ) + { + /*Send Enhanced para to ALR*/ + attf_send_enh_para_to_alr(rr_data->sc_data.emr_data_current.rep_type, + &rr_data->sc_data.emr_data_current.enh_para); + } + } + break; + default: + TRACE_EVENT_P1 ( "message %02x not supported", _decodedMsg[0] ); + break; + } + + PFREE (short_unitdata_ind); +} +#endif +#endif