line source
+ − /*
+ − +-----------------------------------------------------------------------------
+ − | 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