diff src/g23m-gprs/grr/grr_cpapf.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/grr/grr_cpapf.c	Thu Oct 13 04:24:13 2016 +0000
@@ -0,0 +1,1762 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  GRR
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  This module implements local functions for service CPAP of
+|             entity GRR.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GRR_CPAPF_C
+#define GRR_CPAPF_C
+#endif
+
+#define ENTITY_GRR
+
+/*==== INCLUDES =============================================================*/
+
+#include <string.h>
+#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_grr.h"    /* to get cnf-definitions */
+#include "mon_grr.h"    /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "message.h"
+#include "pcm.h"        /* to get a lot of macros */
+#include "grr.h"        /* to get the global entity definitions */
+#include "grr_f.h"      /* to get the global function definitions */
+#include "grr_tcf.h"    /* to get the tc function definitions */
+#include "grr_tcs.h"    /* to get the tc sig function definitions */
+#include "grr_cpapf.h"
+#include "grr_meass.h"  /* to get the definitions for interference measurements */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+LOCAL void cpap_set_da_assignment_pdch (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i);
+LOCAL void cpap_set_dl_assignment_pdch (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i);
+LOCAL BOOL cpap_check_and_save_freq (void);
+
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_init
++------------------------------------------------------------------------------
+| Description : The function cpap_init() .... 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_init ( void )
+{ 
+  TRACE_FUNCTION( "cpap_init" );
+
+  INIT_STATE(CPAP,CPAP_IDLE);
+  grr_data->cpap.new_tbf_type   = CGRLC_TBF_MODE_NULL;
+  grr_data->cpap.v_tma_ia       = FALSE;
+  grr_data->cpap.p_d_imm_assign = NULL;
+} /* cpap_init() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_eval_ia
++------------------------------------------------------------------------------
+| Description : The function cpap_eval_ia() .... 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL T_EVAL_IA cpap_eval_ia ( void )
+{ 
+  MCAST(d_imm_assign,D_IMM_ASSIGN);/*  T_D_IMM_ASSIGN T_U_CTRL_ACK */
+  T_EVAL_IA result = E_IA_NULL;
+  T_tfi_ass_alloc * p_tfi_ass;
+  TRACE_FUNCTION( "cpap_eval_ia" );
+
+  if(d_imm_assign->tma EQ TMA_1) 
+  {
+    /* the 1st message is only delivered by rr if the 2nd message has arrived */
+    /* with correct request reference so it has not to be checked here again  */
+    result = E_IA_TMA;       /* 1st part of TWO MESSAGE ASSIGNMENT */
+  }
+  else if(d_imm_assign->d_t EQ D_T_DED)
+  {
+    result = E_IA_DCCH;
+  }
+  else if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+       d_imm_assign->ia_rest_oct.ia_assign_par.v_pck_upl_ass_ia AND
+       d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia.v_tfi_ass_alloc)
+  {
+    T_pck_upl_ass_ia *pck_upl_ass_ia = 
+      &(d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia);
+    p_tfi_ass = &(pck_upl_ass_ia->tfi_ass_alloc); /* more contents than before*/
+
+    grr_data->uplink_tbf.ts_usage     = (0x80>>d_imm_assign->pck_chan_desc.tn);
+    grr_data->uplink_tbf.nts          = 1;
+    /*
+     * handle polling bit
+     */
+    if(p_tfi_ass->poll AND
+        (!grr_check_if_tbf_start_is_elapsed(grr_decode_tbf_start_abs((T_abs *)&d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia.tfi_ass_alloc.tbf_start_time ),grr_data->ul_fn)))
+      grr_data->uplink_tbf.polling_bit  = d_imm_assign->pck_chan_desc.tn;
+    else
+      grr_data->uplink_tbf.polling_bit  = 0xFF;  
+    
+    grr_data->uplink_tbf.cs_mode      = p_tfi_ass->ccm;
+    grr_data->uplink_tbf.tlli_cs_mode = p_tfi_ass->tlli_bcc;
+
+
+    
+    if(p_tfi_ass->allo_flag EQ 0)    /* Dynamic Allocation */
+    { 
+      if(p_tfi_ass->v_usf AND p_tfi_ass->v_usf_gran)
+      {
+        result = E_IA_UL;             /* Dynamic Allocation */
+        grr_data->uplink_tbf.mac_mode = CGRLC_MAC_MODE_DA;
+      }
+      else /* dynamic alloc but no usf value */
+      {
+        result = E_IA_ERROR_RA;
+        TRACE_ERROR("dynamic alloc but no usf value!");
+      }
+    }
+    else /*fixed alloc*/
+      if (p_tfi_ass->v_allo_len5 AND p_tfi_ass->v_allo_bmp5 AND 
+                                         p_tfi_ass->v_tbf_start_time)
+    {
+      result = E_IA_UL;               /* Fixed Allocation */
+      grr_data->uplink_tbf.mac_mode = CGRLC_MAC_MODE_FA;
+    }
+    else /* fixed alloc but no alloc bitmap or tbf starting time */
+    {
+      result = E_IA_ERROR_RA;
+      TRACE_ERROR("fixed alloc but no alloc bitmap or tbf starting time!");
+    }
+
+    if (!cpap_check_and_save_freq())
+    {
+      result = E_IA_ERROR_RA;
+      TRACE_EVENT("cpap_eval_ia: return E_IA_ERROR_RA (frequencies wrong)");
+    }
+
+    if( result NEQ E_IA_ERROR_RA )
+    {
+      /* process power control parameter */
+      grr_store_type_pck_upl_ass_ia( p_tfi_ass,
+                                     d_imm_assign->pck_chan_desc.tn );
+    }
+  }
+  else if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+     d_imm_assign->ia_rest_oct.ia_assign_par.v_pck_upl_ass_ia AND
+     d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia.v_sngl_block_alloc)
+  { /* single block */
+    T_sngl_block_alloc *sngl_block_ass = 
+        &d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia.sngl_block_alloc;
+
+    if( grr_data->tc.v_sb_without_tbf )
+    {
+      result = E_IA_SB_WITHOUT_TBF;
+    }
+    else
+    {
+      result = E_IA_SB_2PHASE_ACCESS;
+    }
+
+    if (!cpap_check_and_save_freq())
+    {
+      result = E_IA_ERROR_RA;
+      TRACE_EVENT("cpap_eval_ia: return E_IA_ERROR_RA (frequencies wrong)");
+    }
+
+    if( result NEQ E_IA_ERROR_RA )
+    {
+      /* process power control parameter */
+      grr_store_type_pck_snbl_ass_ia( sngl_block_ass,
+                                      d_imm_assign->pck_chan_desc.tn );
+    }
+  }
+  else if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+     d_imm_assign->ia_rest_oct.ia_assign_par.v_ia_2nd_part)
+  {
+    result = E_IA_TMA_SECOND;
+  }
+  else
+  {
+    result = E_IA_ERROR_RA;
+    TRACE_ERROR("corrupted message recieved!");
+  }
+  return(result);
+} /* cpap_eval_ia() */
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_eval_ia_dl
++------------------------------------------------------------------------------
+| Description : The function cpap_eval_ia_dl() .... 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL T_EVAL_IA_DL cpap_eval_ia_dl ( void )
+{ 
+  MCAST(d_imm_assign,D_IMM_ASSIGN);/*  T_D_IMM_ASSIGN */
+  T_EVAL_IA_DL result = E_IA_DL_IGNORE;
+  T_pck_downl_ass_ia * p_dl_assign;
+
+  TRACE_FUNCTION( "cpap_eval_ia_dl" );
+
+  if(d_imm_assign->d_t EQ D_T_DED)
+  {
+    result = E_IA_DL_DCCH;
+  }
+  else if(d_imm_assign->tma EQ TMA_1) 
+  {
+    /* the 1st message is only delivered by rr if the 2nd message has arrived */
+    /* with correct request reference so it has not to be checked here again  */
+    if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.v_pck_downl_ass_ia AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia.v_tfi_ass_rlc)
+    {
+      p_dl_assign =
+        &(d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia);
+      if(grr_check_all_tlli((BUF_tlli_value *)&(p_dl_assign->ded_tlli)))
+      {
+        result = E_IA_DL_TMA;        
+      }
+      else
+      {
+        result = E_IA_DL_NOT_OURS;
+      }
+    }
+    else
+    {
+      result = E_IA_DL_IGNORE;
+      TRACE_ERROR("the 1st message is only delivered by rr if the 2nd message has arrived");
+    }
+  }
+  else if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.v_pck_downl_ass_ia AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia.v_tfi_ass_rlc)
+  {
+    p_dl_assign =
+      &(d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia);
+    if(grr_check_all_tlli((BUF_tlli_value *)&(p_dl_assign->ded_tlli)))
+    {
+      result = E_IA_DL_ASSIGN;
+      grr_data->downlink_tbf.ts_usage    = (0x80>>d_imm_assign->pck_chan_desc.tn);
+      grr_data->downlink_tbf.nts         = 1; 
+      /*
+       * handle polling bit
+       */
+      if(p_dl_assign->tfi_ass_rlc.poll AND
+         (!grr_check_if_tbf_start_is_elapsed(grr_decode_tbf_start_abs((T_abs *)&d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia.tbf_start_time ),grr_data->ul_fn)))
+        grr_data->downlink_tbf.polling_bit = d_imm_assign->pck_chan_desc.tn;
+      else
+        grr_data->downlink_tbf.polling_bit = 0xFF;
+ 
+      grr_data->downlink_tbf.mac_mode    = DA;                          /* by default set to */
+      grr_data->downlink_tbf.t3192       = FALSE;                      /* indicates if t3192 is running*/
+      grr_data->downlink_tbf.rlc_mode    = p_dl_assign->tfi_ass_rlc.rlc_mode;
+      grr_data->downlink_tbf.ctrl_ack_bit= 0;   
+
+      if (!cpap_check_and_save_freq())
+      {
+        result = E_IA_DL_IGNORE;
+        TRACE_EVENT("cpap_eval_ia_dl: return E_IA_DL_IGNORE (frequencies wrong)");
+      }
+
+      if( result EQ E_IA_DL_ASSIGN )
+      {
+        grr_store_type_tfi_ass_rlc( &p_dl_assign->tfi_ass_rlc,
+                                    d_imm_assign->pck_chan_desc.tn );
+      }
+    }
+    else
+    {
+      result = E_IA_DL_NOT_OURS;
+    }
+  }
+  else if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.v_pck_downl_ass_ia AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia.v_tbf_start_time)
+  {
+    p_dl_assign =
+      &(d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia);
+    if(grr_check_all_tlli((BUF_tlli_value *)&(p_dl_assign->ded_tlli)))
+    {
+      result = E_IA_DL_SB;
+      if (!cpap_check_and_save_freq())
+      {
+        result = E_IA_DL_IGNORE;
+        TRACE_EVENT("cpap_eval_ia_dl: return E_IA_DL_IGNORE (frequencies wrong)");
+      }
+    }
+    else
+    {
+      result = E_IA_DL_NOT_OURS;
+    }
+  }
+  else if(d_imm_assign->ia_rest_oct.v_ia_assign_par AND
+    d_imm_assign->ia_rest_oct.ia_assign_par.v_ia_2nd_part)
+  {
+    result = E_IA_DL_TMA_SECOND;
+  }
+
+  if(result EQ E_IA_DL_IGNORE)
+  {
+    TRACE_ERROR("None of the if switches were reached LINE 330 cpapf");
+  }
+  return(result);
+} /* cpap_eval_ia_dl() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_eval_pdch_assignment
++------------------------------------------------------------------------------
+| Description : The function cpap_eval_pdch_assignment() .... 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL T_EVAL_PDCH_ASSIGN cpap_eval_pdch_assignment ( void )
+{ 
+  MCAST(d_pdch_ass_cmd,D_PDCH_ASS_CMD);/*  T_D_PDCH_ASS_CMD */
+  T_EVAL_PDCH_ASSIGN result = E_PDCH_ASSIGN_IGNORE;
+
+  TRACE_FUNCTION( "cpap_eval_pdch_assignment" );
+
+  if(d_pdch_ass_cmd->msg_type EQ D_PDCH_ASS_CMD)
+  {
+    if(!(d_pdch_ass_cmd->v_pck_ul_ass OR d_pdch_ass_cmd->v_pck_dl_ass))
+    {
+      result = E_PDCH_ASSIGN_ERROR;
+      TRACE_ERROR("no Packet Assignment included in message");
+    }
+    else if(d_pdch_ass_cmd->v_pck_ul_ass AND d_pdch_ass_cmd->pck_ul_ass.v_dyn_alloc)
+    {
+      UBYTE tx_slots = 0, ts_usage = 0,i,mask;
+      grr_data->uplink_tbf.mac_mode = CGRLC_MAC_MODE_DA;
+      result = E_PDCH_ASSIGN_UL;
+      if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.v_tagged_usf_tn)
+      {
+        for(i = 0,mask = 0x80;i < 8;i++)
+        {
+          if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.tagged_usf_tn[i].v_usf)
+          {
+            ts_usage |= mask;
+            tx_slots++;
+          }
+          mask >>= 1;
+        }
+      }
+      else if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.v_usf_gamma_csn1)
+      {
+        for(i = 0,mask = 0x80;i < 8;i++)
+        {
+          if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.usf_gamma_csn1[i].v_usf_gamma)
+          {
+            ts_usage |= mask;
+            tx_slots++;
+          }
+          mask >>= 1;
+        }
+      }
+      grr_store_type_dyn_alloc( &d_pdch_ass_cmd->pck_ul_ass.dyn_alloc );
+     
+      grr_data->uplink_tbf.ts_usage = ts_usage;
+      grr_data->uplink_tbf.nts = tx_slots;
+      if( !handle_ms_cap(UL_ASSIGNMENT) )
+      {
+        result = E_PDCH_ASSIGN_ERROR;
+        TRACE_ERROR("too much or no timeslot(s) assigned!");
+      }
+    }
+    else if(d_pdch_ass_cmd->v_pck_ul_ass AND 
+                                    d_pdch_ass_cmd->pck_ul_ass.v_single_alloc)
+    {
+      result = E_PDCH_ASSIGN_SB;
+      if( d_pdch_ass_cmd->pck_ul_ass.single_alloc.v_alpha_gamma EQ TRUE )
+      {
+        grr_store_type_alpha_gamma
+                 ( &d_pdch_ass_cmd->pck_ul_ass.single_alloc.alpha_gamma,
+                    d_pdch_ass_cmd->pck_ul_ass.single_alloc.tn );
+      }
+
+      /* SZML-CPAP/029 */
+    }
+    else if(d_pdch_ass_cmd->v_pck_ul_ass AND 
+                                       d_pdch_ass_cmd->pck_ul_ass.v_fix_alloc)
+    {
+      result = E_PDCH_ASSIGN_UL;
+      grr_data->uplink_tbf.mac_mode = CGRLC_MAC_MODE_FA;
+      if( d_pdch_ass_cmd->pck_ul_ass.fix_alloc.v_pwr_ctrl EQ TRUE )
+      {
+        grr_store_type_pwr_ctrl( &d_pdch_ass_cmd->pck_ul_ass.fix_alloc.pwr_ctrl );
+      }
+
+      /* SZML-CPAP/030 */
+    }
+    else if(d_pdch_ass_cmd->v_pck_dl_ass)
+    {
+      result = E_PDCH_ASSIGN_DL;
+      if( d_pdch_ass_cmd->pck_dl_ass.v_pwr_ctrl EQ TRUE )
+      {
+        grr_store_type_pwr_ctrl( &d_pdch_ass_cmd->pck_dl_ass.pwr_ctrl );
+      }
+
+      /* SZML-CPAP/031 */
+    }
+  }
+  else
+  {
+    TRACE_ERROR("wrong message type!");
+  }
+  return(result);
+} /* cpap_eval_pdch_assignment() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_build_gprs_data_request
++------------------------------------------------------------------------------
+| Description : The function cpap_build_gprs_data_request() .... 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_build_gprs_data_request (T_RRGRR_GPRS_DATA_REQ *rrgrr_gprs_data_req)
+{ 
+  /* T_D_RR_INIT_REQ */ /* T_PRIM_QUEUE */
+  /*  T_D_IMM_ASSIGN */ /* T_GRR_DATA_REQ */
+
+  TRACE_FUNCTION( "cpap_build_gprs_data_request" );
+
+  rrgrr_gprs_data_req->new_ptmsi = grr_data->db.ms_id.new_ptmsi;
+  rrgrr_gprs_data_req->old_ptmsi = grr_data->db.ms_id.old_ptmsi;
+
+  rrgrr_gprs_data_req->tlli = grr_data->db.ms_id.new_tlli;
+  rrgrr_gprs_data_req->rai  = grr_data->db.ms_id.rai;
+  rrgrr_gprs_data_req->mac_req = DA;
+  rrgrr_gprs_data_req->cs_req  = COD_S_1;
+  rrgrr_gprs_data_req->p_chan_req_des.mo_mt = OR_TY_MO;
+  if( grr_data->tc.v_sb_without_tbf )
+  {
+    rrgrr_gprs_data_req->p_chan_req_des.llc_type     = LLC_NOT_ACK;
+    rrgrr_gprs_data_req->p_chan_req_des.rlc_mode_req = RLC_UNACK_MODE;
+    rrgrr_gprs_data_req->p_chan_req_des.prio = RADIO_PRIO_4;
+    rrgrr_gprs_data_req->p_chan_req_des.req_bwd = 80;/* 8000 bit/s */
+    rrgrr_gprs_data_req->p_chan_req_des.rlc_octets = 22;/* one RLC/MAC block */
+  }
+  else
+  {
+    UBYTE i=0;
+    USHORT j =1;
+    if(grr_data->uplink_tbf.prim_type EQ CGRLC_LLC_PRIM_TYPE_DATA_REQ)
+    { /* CGRLC_LLC_PRIM_TYPE_DATA_REQ */
+      rrgrr_gprs_data_req->p_chan_req_des.llc_type     = LLC_NOT_ACK;
+      rrgrr_gprs_data_req->p_chan_req_des.rlc_mode_req = RLC_ACK_MODE;
+    } 
+    else
+    { /* CGRLC_LLC_PRIM_TYPE_UNITDATA_REQ*/
+      rrgrr_gprs_data_req->p_chan_req_des.llc_type     = LLC_IS_ACK;
+      rrgrr_gprs_data_req->p_chan_req_des.rlc_mode_req = RLC_UNACK_MODE;
+    }
+    rrgrr_gprs_data_req->p_chan_req_des.prio =  grr_data->uplink_tbf.prio;
+
+    rrgrr_gprs_data_req->p_chan_req_des.req_bwd    = 0;
+
+    for(i=2; i<=grr_data->uplink_tbf.peak;i++)
+    {
+      j *= 2;
+    }
+    if(grr_data->uplink_tbf.peak)
+      rrgrr_gprs_data_req->p_chan_req_des.req_bwd = j*80;
+
+    rrgrr_gprs_data_req->p_chan_req_des.rlc_octets = grr_data->uplink_tbf.rlc_oct_cnt; 
+  }
+
+  rrgrr_gprs_data_req->gprs_meas_results.c_value  = meas_c_get_value( );
+  rrgrr_gprs_data_req->gprs_meas_results.rxqual   = 0;
+  rrgrr_gprs_data_req->gprs_meas_results.sign_var = 0;
+
+} /* cpap_build_gprs_data_request() */
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_send_ass_fail
++------------------------------------------------------------------------------
+| Description : The function cpap_send_ass_fail() .... 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_send_ass_fail (UBYTE cause)
+{  
+  TRACE_FUNCTION( "cpap_send_ass_fail" );
+  {
+    PALLOC_SDU(rrgrr_data_req,RRGRR_DATA_REQ,3*8);
+
+    rrgrr_data_req->sdu.l_buf  = 3*8;
+    rrgrr_data_req->sdu.o_buf  = 0;
+    rrgrr_data_req->sdu.buf[0] = 0x06;            /* protocol discriminator & skip indicator */
+    rrgrr_data_req->sdu.buf[1] = U_ASSIGN_FAIL;   /* message type */                                   /*lint !e415*/
+    rrgrr_data_req->sdu.buf[2] = cause;           /* RRC_CHANNEL_MODE*/ /* assignment failure cause */ /*lint !e415 !e416*/
+    sig_cpap_tc_dcch_data_req(rrgrr_data_req);
+  }
+} /* cpap_send_ass_fail() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_send_assign_req_pdch
++------------------------------------------------------------------------------
+| Description : The function cpap_send_assign_req_pdch() builds MPHP_ASSIGNMENT_REQ
+|               and send it.
+|
+| Parameters  : tbf_type_i - type of TBF that is to activate
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_send_assign_req_pdch (T_TBF_TYPE tbf_type_i)
+{ 
+  TRACE_FUNCTION( "cpap_send_assign_req_pdch" );
+  {
+    PALLOC(ptr2prim,MPHP_ASSIGNMENT_REQ);
+    
+    memset(ptr2prim,0,sizeof(T_MPHP_ASSIGNMENT_REQ));
+  
+    grr_set_tbf_cfg_req_param( ptr2prim );
+    
+    switch( tbf_type_i )
+    {
+      case CGRLC_TBF_MODE_UL:
+        ptr2prim->assign_cmd = UL_ASSIGNMENT;
+        if(grr_data->uplink_tbf.mac_mode EQ CGRLC_MAC_MODE_DA)
+          cpap_set_da_assignment_pdch(ptr2prim);
+        else
+        {
+          /* SZML-CPAP/032 */
+        }
+
+        sig_cpap_tc_assign_pdch(ptr2prim, PDCH_UL_ASS_CMD);
+        break;
+      case CGRLC_TBF_MODE_DL:
+        ptr2prim->assign_cmd = DL_ASSIGNMENT;
+        cpap_set_dl_assignment_pdch(ptr2prim);
+        sig_cpap_tc_assign_pdch(ptr2prim, PDCH_DL_ASS_CMD);
+        break;
+      default:
+        PFREE(ptr2prim);
+        TRACE_ERROR ( "unknown tbf type!" );
+        break;
+    } /* switch (tbf_type_i) */
+  }
+} /* cpap_send_assign_req_pdch() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_set_da_assignment_pdch
++------------------------------------------------------------------------------
+| Description : This function sets some parameter of MPHP_ASSIGFNMENT_REQ in 
+|               case of uplink dynamic allocation.
+|
+| Parameters  : ptr2prim_i -  ptr to mphp_assignment_req
+|
++------------------------------------------------------------------------------
+*/
+LOCAL void cpap_set_da_assignment_pdch (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i)
+{
+  UBYTE i;
+  MCAST(d_pdch_ass_cmd,D_PDCH_ASS_CMD); /* T_D_PDCH_ASS_CMD */
+                                        /* T_D_IMM_ASSIGN   */
+
+  TRACE_FUNCTION( "cpap_set_da_assignment_pdch" );
+  if( d_pdch_ass_cmd->msg_type EQ D_PDCH_ASS_CMD) 
+  {
+    /* bts downlink power control parameters */
+    if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.v_p0)
+      ptr2prim_i->p_dl_power.p0 = d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.p0;
+    else
+      ptr2prim_i->p_dl_power.p0 = 0xff;
+    /* dynamic allocation must use mode a */
+    ptr2prim_i->p_dl_power.bts_pwr_ctl_mode = MODE_A;
+    ptr2prim_i->p_dl_power.pr_mode = PR_MODE_A_ONE;
+    /*
+     * timing advance
+     */
+    if(d_pdch_ass_cmd->pck_ul_ass.pck_ta.v_ta)
+    {
+      ptr2prim_i->p_timing_advance.ta_value =
+                                         d_pdch_ass_cmd->pck_ul_ass.pck_ta.ta;
+    }
+    else
+    {
+      ptr2prim_i->p_timing_advance.ta_value = 0xff;
+    }
+    if(d_pdch_ass_cmd->pck_ul_ass.pck_ta.v_ta_idx_nm)
+    {
+      ptr2prim_i->p_timing_advance.ta_index =
+                           d_pdch_ass_cmd->pck_ul_ass.pck_ta.ta_idx_nm.ta_idx;
+      ptr2prim_i->p_timing_advance.tn = 
+                            d_pdch_ass_cmd->pck_ul_ass.pck_ta.ta_idx_nm.ta_nm;
+    }
+    else
+    {
+      ptr2prim_i->p_timing_advance.ta_index = 0xff;
+      ptr2prim_i->p_timing_advance.tn = 0xff;
+    }
+    /*
+     *  trainings sequence
+     */    
+    ptr2prim_i->tsc = d_pdch_ass_cmd->chan_desc.tsc; 
+    /*
+     *  frequency parameters
+     */
+    if(!d_pdch_ass_cmd->chan_desc.hop)
+    {
+      if(d_pdch_ass_cmd->chan_desc.v_arfcn)
+      {
+        ptr2prim_i->p_frequency_par.p_chan_sel.hopping=0;
+        memset(ptr2prim_i->p_frequency_par.p_freq_list.p_rf_chan_no.p_radio_freq,0,MPHP_NUMC_MA);
+        ptr2prim_i->p_frequency_par.p_chan_sel.p_rf_ch.arfcn = 
+          grr_g23_arfcn_to_l1(d_pdch_ass_cmd->chan_desc.arfcn);
+      }
+    }
+    /* SZML-CPAP/002 */
+    /* SZML-CPAP/003 */
+   /*
+    * mac mode 
+    */
+    ptr2prim_i->mac_mode = 
+                    (d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.ext_dyn_all)? EDA:DA;
+   /*
+    * uplink allocation structure 
+    */
+    if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.v_tfi)
+      ptr2prim_i->p_ul_alloc.ul_tfi = d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.tfi;
+    else
+      ptr2prim_i->p_ul_alloc.ul_tfi = grr_data->uplink_tbf.tfi; 
+    ptr2prim_i->p_ul_alloc.ts_mask  = grr_data->uplink_tbf.ts_usage; 
+   /*
+    *  dynamic allocation structure
+    */
+    ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_gran = 
+                               d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.usf_gran;
+    if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.v_tagged_usf_tn)
+    {
+      for(i = 0;i < 8;i++)
+      {
+        ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i] = 
+                    d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.tagged_usf_tn[i].usf;
+      }
+    }
+    else if(d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.v_usf_gamma_csn1)
+    {
+      for(i = 0;i < 8;i++)
+      {
+        ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i] = 
+         d_pdch_ass_cmd->pck_ul_ass.dyn_alloc.usf_gamma_csn1[i].usf_gamma.usf;
+      }
+    }
+    else
+    {
+      ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[0] = 5;
+      TRACE_EVENT("USF-Error: set (hardcoded) USF_TN0 = 0x05");
+    }
+    /*  
+     * TBF starting time
+     */
+    if(d_pdch_ass_cmd->v_start_time)
+    {
+      ptr2prim_i->p_tbf_start.tbf_start_present = 1;
+      ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs((T_abs *)&d_pdch_ass_cmd->start_time);
+      if(d_pdch_ass_cmd->v_chan_desc_before)
+      {
+        PALLOC(ptr2prim2,MPHP_ASSIGNMENT_REQ);
+        memset(ptr2prim2,0,sizeof(T_MPHP_ASSIGNMENT_REQ));
+
+        grr_set_tbf_cfg_req_param( ptr2prim2 );
+  
+        ptr2prim2->assign_cmd = UL_ASSIGNMENT;
+        ptr2prim2->p_dl_power.p0 = ptr2prim_i->p_dl_power.p0;
+        ptr2prim2->p_dl_power.bts_pwr_ctl_mode = 
+                                  ptr2prim_i->p_dl_power.bts_pwr_ctl_mode;
+        ptr2prim2->p_dl_power.pr_mode = ptr2prim_i->p_dl_power.pr_mode;
+        ptr2prim2->p_timing_advance.ta_value =
+                                    ptr2prim_i->p_timing_advance.ta_value;
+        ptr2prim2->p_timing_advance.ta_index =
+                                    ptr2prim_i->p_timing_advance.ta_index;
+        ptr2prim2->p_timing_advance.tn = ptr2prim_i->p_timing_advance.tn;
+        /*  trainings sequence  */    
+        ptr2prim2->tsc = d_pdch_ass_cmd->chan_desc_before.tsc; 
+        /*  frequency parameters  */
+        if(!d_pdch_ass_cmd->chan_desc_before.hop)
+        {
+          if(d_pdch_ass_cmd->chan_desc_before.v_arfcn)
+          {
+            ptr2prim_i->p_frequency_par.p_chan_sel.hopping=0;
+            memset(ptr2prim_i->p_frequency_par.p_freq_list.p_rf_chan_no.p_radio_freq,0,MPHP_NUMC_MA);
+            ptr2prim_i->p_frequency_par.p_chan_sel.p_rf_ch.arfcn = 
+                  grr_g23_arfcn_to_l1(d_pdch_ass_cmd->chan_desc_before.arfcn);
+          }
+        }
+        /* SZML-CPAP/004 */
+        /* SZML-CPAP/005 */
+        /*  mac mode  */
+        ptr2prim2->mac_mode = ptr2prim_i->mac_mode;
+        /*  uplink allocation structure  */
+        /* take from grr_data to avoide mistakes */
+        ptr2prim2->p_ul_alloc.ul_tfi  = ptr2prim_i->p_ul_alloc.ul_tfi; 
+        ptr2prim2->p_ul_alloc.ts_mask = ptr2prim_i->p_ul_alloc.ts_mask; 
+        /*  dynamic allocation structure  */
+        ptr2prim2->p_ul_alloc.p_dynamic_alloc.usf_gran = 
+                        ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_gran;
+        for(i = 0;i < 8;i++)
+        {
+          ptr2prim2->p_ul_alloc.p_dynamic_alloc.usf_table[i] = 
+                    ptr2prim_i->p_ul_alloc.p_dynamic_alloc.usf_table[i];
+        }
+        ptr2prim2->p_tbf_start.tbf_start_present = 0;
+        sig_cpap_tc_assign_pdch(ptr2prim2, PDCH_UL_ASS_CMD);
+      } /* if(d_pdch_ass_cmd->v_chan_desc_before) */
+    }
+    else /* if(d_pdch_ass_cmd->v_start_time) */
+    {
+      ptr2prim_i->p_tbf_start.tbf_start_present  = 0;
+      ptr2prim_i->p_tbf_start.fn = 0xFFFFFFFF;
+    }
+  } 
+  else /* if( d_pdch_ass_cmd->msg_type EQ D_PDCH_ASS_CMD) */
+  {
+    TRACE_ERROR ( "Wrong message type in _decodedCtrlMsg" );
+  }
+
+
+  if(ptr2prim_i->p_tbf_start.tbf_start_present)
+    grr_data->uplink_tbf.tbf_start_fn = ptr2prim_i->p_tbf_start.fn;
+  else
+    grr_data->uplink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT;
+  
+  grr_data->uplink_tbf.st_tfi   = ptr2prim_i->p_ul_alloc.ul_tfi;
+  grr_data->uplink_tbf.mac_mode = DA;
+
+  return; 
+}  /* cpap_set_da_assignment_pdch */
+
+
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_set_dl_assignment_pdch
++------------------------------------------------------------------------------
+| Description : This function sets some parameter of T_MPHP_ASSIGNMENT_REQ is 
+|               case of ia downlink allocation
+|
+| Parameters  : ptr2prim_i -  ptr to MPHP_ASSIGNMENT_REQ
+|
++------------------------------------------------------------------------------
+*/
+LOCAL void cpap_set_dl_assignment_pdch (T_MPHP_ASSIGNMENT_REQ * ptr2prim_i)
+{
+  MCAST(d_imm_assign,D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */
+  T_pck_downl_ass_ia *ptr2dl_assign;
+
+  TRACE_FUNCTION( "cpap_set_dl_assignment_pdch" );
+  if( d_imm_assign->msg_type EQ D_IMM_ASSIGN)
+  {
+    ptr2dl_assign = 
+      &d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia;
+    /*
+     * timing advance
+     */
+    if (ptr2dl_assign->tfi_ass_rlc.ta_valid)
+    {
+      ptr2prim_i->p_timing_advance.ta_value = d_imm_assign->time_advance.ta;
+    }
+    else
+    {
+      ptr2prim_i->p_timing_advance.ta_value = 0xff;
+    }
+    if(ptr2dl_assign->v_ta_idx)
+    {
+      ptr2prim_i->p_timing_advance.ta_index = ptr2dl_assign->ta_idx;
+      ptr2prim_i->p_timing_advance.tn      = d_imm_assign->pck_chan_desc.tn;
+    }
+    else
+    {
+      ptr2prim_i->p_timing_advance.ta_index = 0xff;
+      ptr2prim_i->p_timing_advance.tn = 0xff;
+    }
+    /*
+     *  trainings sequence
+     */    
+    ptr2prim_i->tsc = d_imm_assign->pck_chan_desc.tsc; 
+    /*
+     * TBF starting time
+     */
+    if(ptr2dl_assign->v_tbf_start_time)
+    {
+      ptr2prim_i->p_tbf_start.tbf_start_present  = 1;
+      ptr2prim_i->p_tbf_start.fn = grr_decode_tbf_start_abs((T_abs *)&ptr2dl_assign->tbf_start_time);
+    }
+    else
+    {
+      ptr2prim_i->p_tbf_start.tbf_start_present = 0;
+    }
+   /* 
+    * mac mode 
+    */
+    ptr2prim_i->mac_mode = DA;
+   /*
+    *  downlink allocation structure
+    */
+    ptr2prim_i->p_dl_alloc.dl_tfi  = grr_data->downlink_tbf.tfi; /* take from grr_data to avoide mistakes */
+    ptr2prim_i->p_dl_alloc.ts_mask = grr_data->downlink_tbf.ts_usage;
+
+
+    if(ptr2prim_i->p_tbf_start.tbf_start_present)
+      grr_data->downlink_tbf.tbf_start_fn = ptr2prim_i->p_tbf_start.fn;
+    else
+      grr_data->downlink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT;
+    
+    grr_data->downlink_tbf.st_tfi   = ptr2prim_i->p_dl_alloc.dl_tfi;
+    grr_data->downlink_tbf.mac_mode = DA;
+
+  } 
+  return; 
+}  /* cpap_set_dl_assignment_pdch()  */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_send_assign_req_ia
++------------------------------------------------------------------------------
+| Description : The function cpap_send_assign_req_ia() builds MPHP_ASSIGNMENT_REQ
+|               and send it.
+|
+| Parameters  : tbf_type_i - type of TBF that is to activate
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL BOOL cpap_send_assign_req_ia ( T_TBF_TYPE tbf_type_i )
+{ 
+  T_MPHP_ASSIGNMENT_REQ *ptr2prim = NULL;
+
+  TRACE_FUNCTION( "cpap_send_assign_req_ia" );
+
+  ptr2prim = tc_set_freq();
+  if(NULL EQ ptr2prim)
+  {
+    return FALSE;
+  }
+
+  grr_set_tbf_cfg_req_param( ptr2prim );
+
+  switch( tbf_type_i )
+  {
+    case CGRLC_TBF_MODE_UL:
+      ptr2prim->assign_cmd = UL_ASSIGNMENT;
+      if(grr_data->uplink_tbf.mac_mode EQ CGRLC_MAC_MODE_DA)
+        cpap_set_da_assignment_ia(ptr2prim);
+      else if(!cpap_set_fa_assignment_ia(ptr2prim))
+      {
+        PFREE(ptr2prim);
+        return FALSE;
+      }
+      sig_cpap_tc_assign_pdch( ptr2prim, IA_UL );
+      break;
+    case CGRLC_TBF_MODE_DL:
+      ptr2prim->assign_cmd = DL_ASSIGNMENT;
+      cpap_set_dl_assignment_ia(ptr2prim);
+      sig_cpap_tc_assign_pdch( ptr2prim, IA_DL );
+      break;
+    default:
+      return FALSE;
+  } /* switch (tbf_type_i) */
+  return TRUE;
+} /* cpap_send_assign_req_ia() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_set_da_assignment_ia
++------------------------------------------------------------------------------
+| Description : This function sets some parameter of MPHP_ASSIGFNMENT_REQ in 
+|               case of uplink dynamic allocation.
+|
+| Parameters  : ptr2prim_i -  ptr to mphp_assignment_req
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_set_da_assignment_ia (T_MPHP_ASSIGNMENT_REQ *ptr2prim)
+{
+  MCAST(d_imm_assign,D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */
+  T_pck_upl_ass_ia *ptr2ul_assign;
+
+  TRACE_FUNCTION( "cpap_set_da_assignment_ia" );
+
+  if( d_imm_assign->msg_type EQ D_IMM_ASSIGN) 
+  {
+    /*
+     * timing advance
+     */
+    ptr2ul_assign =
+      &d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia;
+    if(ptr2ul_assign->v_tfi_ass_alloc AND ptr2ul_assign->tfi_ass_alloc.v_p0_prmode)
+    {
+      ptr2prim->p_dl_power.p0 = ptr2ul_assign->tfi_ass_alloc.p0_prmode.p0;
+      ptr2prim->p_dl_power.pr_mode =
+                                   ptr2ul_assign->tfi_ass_alloc.p0_prmode.pr_mode;
+    }
+    else
+    {
+      ptr2prim->p_dl_power.p0 = 0xff;
+    }
+  /* Timing Advance */
+    grr_data->ta_params.ta_valid = TRUE;
+    grr_handle_ta ( 1, /* always present in Immediate Assignment*/
+          d_imm_assign->time_advance.ta,
+          ptr2ul_assign->tfi_ass_alloc.v_ta_idx, 
+          ptr2ul_assign->tfi_ass_alloc.ta_idx,
+          d_imm_assign->pck_chan_desc.tn,
+          0xFF,
+          0,
+          0,
+          &ptr2prim->p_timing_advance);
+
+    /*  TBF starting time  */
+    if(ptr2ul_assign->tfi_ass_alloc.v_tbf_start_time)
+    {
+      ptr2prim->p_tbf_start.tbf_start_present   = 1;
+      ptr2prim->p_tbf_start.fn = grr_decode_tbf_start_abs((T_abs *)&ptr2ul_assign->tfi_ass_alloc.tbf_start_time);      
+    }
+    else
+    {
+      ptr2prim->p_tbf_start.tbf_start_present  = 0;
+    } 
+   /*
+    * mac mode 
+    */
+    ptr2prim->mac_mode = DA;   
+   /*
+    * uplink allocation structure 
+    */
+    /* take from grr_data to avoide mistakes */
+    ptr2prim->p_ul_alloc.ul_tfi  = ptr2ul_assign->tfi_ass_alloc.tfi; 
+    ptr2prim->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; 
+   /*
+    *  dynamic allocation structure
+    */    
+    ptr2prim->p_ul_alloc.p_dynamic_alloc.usf_gran = 
+                                        ptr2ul_assign->tfi_ass_alloc.usf_gran;
+    if(ptr2ul_assign->tfi_ass_alloc.v_usf)
+    {
+      ptr2prim->p_ul_alloc.p_dynamic_alloc.usf_table[
+           d_imm_assign->pck_chan_desc.tn] = ptr2ul_assign->tfi_ass_alloc.usf;
+    }
+    else
+    {
+      ptr2prim->p_ul_alloc.p_dynamic_alloc.usf_table[
+                                          d_imm_assign->pck_chan_desc.tn] = 5;
+      TRACE_EVENT("USF-Error: set (hardcoded) USF_TN0 = 0x05");
+    }
+  } 
+  else
+  {
+    TRACE_ERROR ( "Wrong message type in _decodedCtrlMsg" );
+  }
+
+
+  if(ptr2prim->p_tbf_start.tbf_start_present)
+    grr_data->uplink_tbf.tbf_start_fn = ptr2prim->p_tbf_start.fn;
+  else
+    grr_data->uplink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT;
+  
+  grr_data->uplink_tbf.st_tfi   = ptr2prim->p_ul_alloc.ul_tfi;
+  grr_data->uplink_tbf.mac_mode = DA;
+
+
+  return; 
+}  /* cpap_set_da_assignment_ia */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_set_fa_assignment_ia
++------------------------------------------------------------------------------
+| Description : This function sets some parameter of MPHP_ASSIGFNMENT_REQ in 
+|               case of uplink fixed allocation.
+|
+| Parameters  : ptr2prim_i -  ptr to mphp_assignment_req
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE cpap_set_fa_assignment_ia (T_MPHP_ASSIGNMENT_REQ *ptr2prim)
+{
+  MCAST(d_imm_assign,D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */
+  T_pck_upl_ass_ia *ptr2ul_assign;
+
+  TRACE_FUNCTION( "cpap_set_fa_assignment_ia" );
+
+  ptr2ul_assign =
+      &d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia;
+  if( d_imm_assign->msg_type EQ D_IMM_ASSIGN) 
+  {
+    /* PO, BTS_POWER_MODE and PR_ MODE */
+    if(ptr2ul_assign->v_tfi_ass_alloc AND ptr2ul_assign->tfi_ass_alloc.v_p0_bts_prmode)
+    {      
+      ptr2prim->p_dl_power.p0      = ptr2ul_assign->tfi_ass_alloc.p0_bts_prmode.p0;
+      ptr2prim->p_dl_power.bts_pwr_ctl_mode  = ptr2ul_assign->tfi_ass_alloc.p0_bts_prmode.pwr_ctrl_mode;
+      ptr2prim->p_dl_power.pr_mode = ptr2ul_assign->tfi_ass_alloc.p0_bts_prmode.pr_mode;
+    }
+    else
+    {
+      ptr2prim->p_dl_power.p0 = 0xff;
+    }
+    /* 
+   * timing advance
+   */
+    grr_data->ta_params.ta_valid = TRUE;
+    grr_handle_ta ( 1, /* always present in Immediate Assignment*/
+          d_imm_assign->time_advance.ta,
+          ptr2ul_assign->tfi_ass_alloc.v_ta_idx, 
+          ptr2ul_assign->tfi_ass_alloc.ta_idx,
+          d_imm_assign->pck_chan_desc.tn,
+          0xFF,
+          0,
+          0,
+          &ptr2prim->p_timing_advance);
+    /*
+     * mac mode 
+     */
+    ptr2prim->mac_mode = FA;   
+   /*
+    * uplink allocation structure 
+    */
+    /* take from grr_data to avoide mistakes */
+    ptr2prim->p_ul_alloc.ul_tfi  = ptr2ul_assign->tfi_ass_alloc.tfi; 
+    ptr2prim->p_ul_alloc.ts_mask = grr_data->uplink_tbf.ts_usage; 
+    /*  TBF starting time  */
+    if(ptr2ul_assign->tfi_ass_alloc.v_tbf_start_time)
+    {
+      ptr2prim->p_tbf_start.tbf_start_present  = 1;
+      ptr2prim->p_tbf_start.fn = grr_decode_tbf_start_abs((T_abs *)&ptr2ul_assign->tfi_ass_alloc.tbf_start_time);
+    }
+    else
+    {
+      TRACE_ERROR("IA FIX ALLOC WITHOUT TBF STARTING TIME");
+      return FALSE;
+    }
+    /*  
+     * DOWNLINK_CONTROL_TIMESLOT parameter shall always indicate a timeslot number 
+     * which is used for TBF uplink.  GSM 04.60 Chapter 8.1.1.3.4 
+     */
+    switch(grr_data->uplink_tbf.ts_usage)
+    {
+    case 1:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 7;
+      break;    
+    case 2:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 6;
+      break;
+    case 4:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 5;
+      break;
+    case 8:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 4;
+      break;
+    case 16:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 3;
+      break;
+    case 32:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 2;
+      break;
+    case 64:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 1;
+      break;
+    case 128:
+      ptr2prim->p_ul_alloc.p_fixed_alloc.dl_ctrl_ts = 0;
+      break;
+}
+    
+    /*
+     * ALLOCATION BITMAP tc function call not allowed
+     */
+     grr_data->tc.fa_ctrl.fa_type        = FA_NO_CURRENT;
+     tc_calc_fa_bitmap(ptr2prim->p_tbf_start.fn,                 /* starting time of cuurent tbf*/
+                        1,                                          /* block periods*/
+                        ptr2ul_assign->tfi_ass_alloc.allo_len5,     /* bitmap length */
+                        ptr2ul_assign->tfi_ass_alloc.allo_bmp5,     /* ptr to alloc struct*/
+                        &ptr2prim->p_ul_alloc.p_fixed_alloc); /* ptr to fix sttruct*/
+  } 
+  else
+  {
+    TRACE_ERROR ( "Wrong message type in _decodedCtrlMsg" );
+  }
+
+    
+  if(ptr2prim->p_tbf_start.tbf_start_present)
+    grr_data->uplink_tbf.tbf_start_fn = ptr2prim->p_tbf_start.fn;
+  else
+    grr_data->uplink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT;
+  
+  grr_data->uplink_tbf.st_tfi   = ptr2prim->p_ul_alloc.ul_tfi;
+  grr_data->uplink_tbf.mac_mode = FA;
+
+  return TRUE; 
+}  /* cpap_set_fa_assignment_ia */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_set_dl_assignment_ia
++------------------------------------------------------------------------------
+| Description : This function sets some parameter of T_MPHP_ASSIGNMENT_REQ is 
+|               case of ia downlink allocation
+|
+| Parameters  : ptr2prim_i -  ptr to MPHP_ASSIGNMENT_REQ
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_set_dl_assignment_ia (T_MPHP_ASSIGNMENT_REQ *ptr2prim)
+{
+  MCAST(d_imm_assign,D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */
+  T_pck_downl_ass_ia *ptr2dl_assign;
+  TRACE_FUNCTION( "cpap_set_dl_assignment_ia" );
+  if( d_imm_assign->msg_type EQ D_IMM_ASSIGN)
+  {
+    ptr2dl_assign = &d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia;
+    if(ptr2dl_assign->v_p0_bts_prmode)
+    {
+      ptr2prim->p_dl_power.p0 = ptr2dl_assign->p0_bts_prmode.p0;
+      ptr2prim->p_dl_power.bts_pwr_ctl_mode =
+                                   ptr2dl_assign->p0_bts_prmode.pwr_ctrl_mode;
+      ptr2prim->p_dl_power.pr_mode = ptr2dl_assign->p0_bts_prmode.pr_mode;
+    }
+    else
+    {
+      ptr2prim->p_dl_power.p0 = 0xff;
+    }
+    /*
+     * timing advance
+     */
+    grr_handle_ta ( ptr2dl_assign->tfi_ass_rlc.ta_valid, 
+          d_imm_assign->time_advance.ta,
+          0xFF, 
+          0,
+          0,
+          ptr2dl_assign->v_ta_idx,
+          ptr2dl_assign->ta_idx,
+          d_imm_assign->pck_chan_desc.tn,
+          &ptr2prim->p_timing_advance);
+    /*
+     * TBF starting time
+     */
+    if(ptr2dl_assign->v_tbf_start_time)
+    {
+      ptr2prim->p_tbf_start.tbf_start_present  = 1;
+      ptr2prim->p_tbf_start.fn  = grr_decode_tbf_start_abs((T_abs *)&ptr2dl_assign->tbf_start_time);    
+    }
+    else
+    {
+      ptr2prim->p_tbf_start.tbf_start_present  = 0;
+    }
+
+   /* SZML-CPAP/008 */
+    ptr2prim->mac_mode = DA;
+   /*
+    *  downlink allocation structure
+    */
+    ptr2prim->p_dl_alloc.dl_tfi  = ptr2dl_assign->tfi_ass_rlc.tfi;
+    ptr2prim->p_dl_alloc.ts_mask = grr_data->downlink_tbf.ts_usage;
+
+ 
+    if(ptr2prim->p_tbf_start.tbf_start_present)
+      grr_data->downlink_tbf.tbf_start_fn = ptr2prim->p_tbf_start.fn;
+    else
+      grr_data->downlink_tbf.tbf_start_fn = CGRLC_STARTING_TIME_NOT_PRESENT;
+
+    grr_data->downlink_tbf.st_tfi      = ptr2prim->p_dl_alloc.dl_tfi;
+
+  } 
+  return; 
+}  /* cpap_set_dl_assignment_ia()  */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_send_resource_request_ia
++------------------------------------------------------------------------------
+| Description : The function cpap_send_resource_request_ia() sends the primitive 
+|               MPHP_SINGLE_BLOCK_REQ with Packet Resource Request
+|               for two phase access due to the reception of a Immediate
+|               Assignment message. 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE cpap_send_resource_request_ia ( void )
+{
+  { 
+    MCAST(d_imm_assign,D_IMM_ASSIGN);  /* T_D_IMM_ASSIGN */
+    
+    T_pck_upl_ass_ia *ptr2ul_assign;
+    UBYTE frame[23];
+    ULONG start_fn;
+
+
+    TRACE_FUNCTION( "cpap_send_resource_request_ia" );
+
+    ptr2ul_assign = &d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia;
+
+    start_fn = grr_decode_tbf_start_abs((T_abs *)&ptr2ul_assign->sngl_block_alloc.tbf_start_time);
+    if( !(grr_check_if_tbf_start_is_elapsed ( start_fn, grr_data->ul_fn)))
+    {
+      T_U_RESOURCE_REQ resource_req;
+      sig_cpap_tc_build_res_req( &resource_req );
+      grr_encode_ul_ctrl_block( frame, ( UBYTE* )&resource_req );
+    }
+    else
+    {
+      TRACE_ERROR("TBF Starting time is elpased in single block allocation!");
+      return FALSE;
+    }
+    {
+      PALLOC(ptr2prim,MPHP_SINGLE_BLOCK_REQ);
+      memcpy( ptr2prim->l2_frame, frame, 23 );
+      ptr2prim->p_tbf_start.tbf_start_present = 1; 
+      ptr2prim->p_tbf_start.fn                = start_fn;
+
+      if( ptr2ul_assign->v_sngl_block_alloc AND ptr2ul_assign->sngl_block_alloc.v_p0_bts_prmode )
+      {
+        ptr2prim->p_dl_power.p0               = ptr2ul_assign->sngl_block_alloc.p0_bts_prmode.p0;
+        ptr2prim->p_dl_power.bts_pwr_ctl_mode = ptr2ul_assign->sngl_block_alloc.p0_bts_prmode.pwr_ctrl_mode;
+        ptr2prim->p_dl_power.pr_mode          = ptr2ul_assign->sngl_block_alloc.p0_bts_prmode.pr_mode;
+      }
+      else
+      {
+        ptr2prim->p_dl_power.p0      = 0xff;
+      }
+   
+      /*
+       *   mark that single block is because of two phase access procedure 
+       */
+      ptr2prim->purpose      = TWO_PHASE_ACESS;
+      ptr2prim->pc_meas_chan = psc_db->g_pwr_par.pc_meas_chan;
+      ptr2prim->burst_type   = (psc_db->gprs_cell_opt.ab_type EQ AB_8_BIT)
+                               ?AB_8_BIT
+                               :AB_11_BIT;
+     
+      grr_handle_ta ( 1, /*Ta is mandatory in immediate assignment*/
+                      d_imm_assign->time_advance.ta,
+                      0, 
+                      0,
+                      0,
+                      0,
+                      0,
+                      0,
+                      &ptr2prim->p_timing_advance);
+
+      /*
+       *  trainings sequence
+       */    
+      ptr2prim->tsc = d_imm_assign->pck_chan_desc.tsc; 
+      ptr2prim->tn  = d_imm_assign->pck_chan_desc.tn;
+
+      /*
+       *  frequency parameters
+       */
+      grr_set_freq_par( &ptr2prim->p_frequency_par );
+      sig_cpap_tc_assign_sb( ( void* )ptr2prim, TWO_PHASE_ACESS );
+    }
+    return TRUE;
+  }
+} /* cpap_send_resource_request_ia() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_send_single_block_without_tbf
++------------------------------------------------------------------------------
+| Description : The function cpap_send_single_block_without_tbf() sends 
+|               the primitive MPHP_SINGLE_BLOCK_REQ with single
+|               block request without TBF establishment due to the reception
+|               of an immediate assignment message. 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE cpap_send_single_block_without_tbf ( void )
+{
+  PALLOC( prim, MPHP_SINGLE_BLOCK_REQ );
+  {
+    MCAST( d_imm_assign, D_IMM_ASSIGN );
+
+    T_pck_upl_ass_ia                   *assign;
+    UBYTE                               result = FALSE;
+
+    TRACE_FUNCTION( "cpap_send_single_block_without_tbf" );
+
+    assign = &d_imm_assign->ia_rest_oct.ia_assign_par.pck_upl_ass_ia;
+
+    if( assign->v_sngl_block_alloc AND assign->sngl_block_alloc.v_p0_bts_prmode )
+    {
+      prim->p_dl_power.p0               = assign->sngl_block_alloc.p0_bts_prmode.p0;
+      prim->p_dl_power.bts_pwr_ctl_mode = assign->sngl_block_alloc.p0_bts_prmode.pwr_ctrl_mode;
+      prim->p_dl_power.pr_mode          = assign->sngl_block_alloc.p0_bts_prmode.pr_mode;
+    }
+    else
+    {
+      prim->p_dl_power.p0      = 0xff;
+    }
+
+    /*
+     *   mark that single block is because of two phase access procedure 
+     */
+    prim->purpose      = SINGLE_BLOCK_TRANSFER_UL;
+    prim->pc_meas_chan = psc_db->g_pwr_par.pc_meas_chan;
+    prim->burst_type   = ( psc_db->gprs_cell_opt.ab_type EQ AB_8_BIT )
+                         ? AB_8_BIT : AB_11_BIT;
+
+    prim->p_timing_advance.ta_value = d_imm_assign->time_advance.ta;
+
+    grr_data->ta_params.ta_value = d_imm_assign->time_advance.ta;
+    grr_data->ta_params.ta_valid = TRUE;
+
+    if( assign->tfi_ass_alloc.v_ta_idx )
+    {
+      prim->p_timing_advance.ta_index = assign->tfi_ass_alloc.ta_idx;
+      prim->p_timing_advance.tn       = d_imm_assign->pck_chan_desc.tn;
+    }
+    else
+    {
+      prim->p_timing_advance.ta_index = 0xff;
+      prim->p_timing_advance.tn       = 0xff;
+    }
+
+    /*
+     *  trainings sequence
+     */    
+    prim->tsc = d_imm_assign->pck_chan_desc.tsc; 
+
+    /*
+    TRACE_EVENT_P4( "request_ia1 tn:%d tsc: %d p0:%d pr_mode:%d", 
+                    d_imm_assign->pck_chan_desc.tn, prim->tsc, 
+                    prim->p_dl_power.p0, prim->p_dl_power.pr_mode );
+    */
+
+
+    /* SZML-CPAP/009 */
+    /*
+     * handle TBF starting time is always present in single block allocation,
+     * otherwise something is wrong
+     */  
+
+    if( assign->v_sngl_block_alloc)
+    {
+      prim->p_tbf_start.tbf_start_present  = 1; 
+      prim->p_tbf_start.fn = grr_decode_tbf_start_abs((T_abs*) &assign->sngl_block_alloc.tbf_start_time);     
+      if(grr_check_if_tbf_start_is_elapsed ( prim->p_tbf_start.fn, grr_data->ul_fn))
+      {
+        TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!");
+        TRACE_EVENT_P2("CPAP SBR TBF ST ELAPSED st=%ld  c_fn=%ld  ", prim->p_tbf_start.fn,grr_data->dl_fn);
+      }
+      else
+      {
+        result = TRUE;    
+      }
+    }
+ 
+    if( result )
+    {
+      tc_cpy_ctrl_blk_to_buffer( prim->l2_frame );
+
+      prim->tsc = grr_data->tc.freq_set.tsc;
+      prim->tn  = d_imm_assign->pck_chan_desc.tn;
+
+      /*
+       *  frequency parameters
+       */
+      grr_set_freq_par( &prim->p_frequency_par );
+      sig_cpap_tc_assign_sb( (void*)prim, SINGLE_BLOCK_TRANSFER_UL );
+
+    /*
+    TRACE_EVENT_P8("request_ia2 tn:%d tsc: %d ta:%d arfcn:%ld : nr: %d p0:%d pr:%d ctrl:%d", 
+      prim_i->tn,
+      prim_i->tsc, 
+      prim_i->p_timing_advance, 
+      prim_i->p_chan_sel.p_rf_ch.arfcn,
+      prim_i->ptr2prim->p_frequency_par.p_freq_list.p_rf_chan_cnt,
+      prim_i->p_dl_power.p0,
+      prim_i->p_dl_power.pr_mode,
+      prim_i->p_dl_power.bts_pwr_ctl_mode);    
+    */
+    }
+    else
+    {
+      PFREE(prim);
+    }
+
+    return result;
+  }
+} /* cpap_send_single_block_without_tbf() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_send_receive_normal_burst
++------------------------------------------------------------------------------
+| Description : The function cpap_send_receive_normal_burst() sends the 
+|               primitive MPHP_SINGLE_BLOCK_REQ to receive a single packet 
+|               control block on the specified radio resource.
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL UBYTE cpap_send_receive_normal_burst ( void )
+{ 
+  MCAST( d_imm_assign, D_IMM_ASSIGN );
+
+  T_pck_downl_ass_ia *ptr2dl_assign =
+    &d_imm_assign->ia_rest_oct.ia_assign_par.pck_downl_ass_ia;
+  UBYTE               result        = FALSE;
+
+  PALLOC( mphp_single_block_req, MPHP_SINGLE_BLOCK_REQ );
+
+  TRACE_FUNCTION( "cpap_send_receive_normal_burst" );
+
+  memset( mphp_single_block_req, 0, sizeof( T_MPHP_SINGLE_BLOCK_REQ ) );
+
+  mphp_single_block_req->assign_id = 0;
+  grr_data->tc.last_rec_nb_id      = mphp_single_block_req->assign_id;
+  mphp_single_block_req->purpose   = SINGLE_BLOCK_TRANSFER_DL;
+  mphp_single_block_req->tsc       = grr_data->tc.freq_set.tsc;
+  mphp_single_block_req->tn        = d_imm_assign->pck_chan_desc.tn;
+
+  grr_set_freq_par( &mphp_single_block_req->p_frequency_par );
+
+  if( ptr2dl_assign->v_p0_bts_prmode )
+  {
+    mphp_single_block_req->p_dl_power.p0 = ptr2dl_assign->p0_bts_prmode.p0;
+    mphp_single_block_req->p_dl_power.bts_pwr_ctl_mode = 
+                                    ptr2dl_assign->p0_bts_prmode.pwr_ctrl_mode;
+    mphp_single_block_req->p_dl_power.pr_mode = ptr2dl_assign->p0_bts_prmode.pr_mode;
+  }
+  else
+  {
+    mphp_single_block_req->p_dl_power.p0               = 0xff;
+    mphp_single_block_req->p_dl_power.bts_pwr_ctl_mode = 0xff;
+    mphp_single_block_req->p_dl_power.pr_mode          = 0xff;
+  }
+
+  mphp_single_block_req->pc_meas_chan = psc_db->g_pwr_par.pc_meas_chan;
+  mphp_single_block_req->burst_type   = (psc_db->gprs_cell_opt.ab_type EQ AB_8_BIT)
+                                        ?AB_8_BIT
+                                        :AB_11_BIT;
+
+  /* a downlink single block don't need timing advance!! */
+  mphp_single_block_req->p_timing_advance.ta_value = 0xff;
+  mphp_single_block_req->p_timing_advance.ta_index = 0xff;
+  mphp_single_block_req->p_timing_advance.tn       = 0xff;
+  /*
+   * handle TBF starting time
+   * is always present in single block allocation (otherwise something is wrong)
+   */
+  if(ptr2dl_assign->v_tbf_start_time)
+  {
+    mphp_single_block_req->p_tbf_start.tbf_start_present = 1; 
+    mphp_single_block_req->p_tbf_start.fn = grr_decode_tbf_start_abs((T_abs *)&ptr2dl_assign->tbf_start_time);
+    if(grr_check_if_tbf_start_is_elapsed ( mphp_single_block_req->p_tbf_start.fn, grr_data->ul_fn))
+    {
+      TRACE_ERROR("TBF Starting time is ELAPSED in single block allocation!");
+      TRACE_EVENT_P2("CPAP SBR TBF ST ELAPSED st=%ld  c_fn=%ld  ", mphp_single_block_req->p_tbf_start.fn,grr_data->dl_fn);
+    }
+    else
+    {
+      result = TRUE;  
+      grr_data->tc.last_rec_nb_fn = mphp_single_block_req->p_tbf_start.fn;
+    }
+  }
+  else
+  {
+    TRACE_ERROR("TBF Starting time is missing in single block allocation!");
+    /* SZML-CPAP/013 */
+  }
+
+  if(result)
+  {
+    sig_cpap_tc_assign_sb((void*)mphp_single_block_req,SINGLE_BLOCK_TRANSFER_DL);
+  }
+  else
+  {
+    PFREE(mphp_single_block_req);
+    TRACE_ERROR("SINGLE BLOCK STARTING TIME HAS ALREADY BEEN ELAPSED");
+  }
+
+  return result;
+} /* cpap_send_receive_normal_burst() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_store_ia_message
++------------------------------------------------------------------------------
+| Description : The function cpap_store_ia_message() stores the 1st message of
+|               a two message assignment.
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_store_ia_message ( void )
+{ 
+  MCAST(d_imm_assign,D_IMM_ASSIGN);  /* T_D_IMM_ASSIGN */
+
+  TRACE_FUNCTION( "cpap_store_ia_message" );
+
+  memcpy(&grr_data->cpap.tma_ia, d_imm_assign, sizeof(T_D_IMM_ASSIGN));
+  grr_data->cpap.v_tma_ia = TRUE;
+
+} /* cpap_store_ia_message() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_join_tma_messages
++------------------------------------------------------------------------------
+| Description : The function cpap_join_tma_messages() join the stored 1st and
+|               the 2nd message of a two message assignment.
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_join_tma_messages ( void )
+{ 
+  MCAST(d_imm_assign,D_IMM_ASSIGN);  /* T_D_IMM_ASSIGN */
+
+  TRACE_FUNCTION( "cpap_join_tma_messages" );
+
+  /* the 2nd message contains only the packet channel description and the 
+   * mobile allocation if needed.
+   */
+
+  d_imm_assign->tma = TMA_0;
+  d_imm_assign->page_mode.pm = grr_data->cpap.tma_ia.page_mode.pm;
+  d_imm_assign->time_advance.ta = grr_data->cpap.tma_ia.time_advance.ta;
+  if(grr_data->cpap.tma_ia.v_start_time)
+  {
+    d_imm_assign->v_start_time = TRUE;
+    d_imm_assign->start_time.t1 = grr_data->cpap.tma_ia.start_time.t1;
+    d_imm_assign->start_time.t2 = grr_data->cpap.tma_ia.start_time.t2;
+    d_imm_assign->start_time.t3 = grr_data->cpap.tma_ia.start_time.t3;
+  }
+  memcpy( &d_imm_assign->ia_rest_oct,
+          &grr_data->cpap.tma_ia.ia_rest_oct, 
+          sizeof(T_ia_rest_oct)                );
+  grr_data->cpap.v_tma_ia = FALSE;
+
+} /* cpap_join_tma_messages() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_malloc_ia
++------------------------------------------------------------------------------
+| Description : The function cpap_malloc_ia() .... 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_malloc_ia ( void )
+{ 
+  TRACE_FUNCTION( "cpap_malloc_ia" );
+
+  if( grr_data->cpap.p_d_imm_assign EQ NULL )
+  {
+    MALLOC( grr_data->cpap.p_d_imm_assign, sizeof( T_D_IMM_ASSIGN ) );
+  }
+  else
+  {
+    TRACE_ERROR( "cpap_malloc_ia: fatal error, memory reallocation not implemented" );
+  }
+
+  *grr_data->cpap.p_d_imm_assign = *( ( T_D_IMM_ASSIGN * )_decodedMsg );
+
+} /* cpap_malloc_ia() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_mfree_ia
++------------------------------------------------------------------------------
+| Description : The function cpap_mfree_ia() .... 
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void cpap_mfree_ia ( BOOL restore_data )
+{ 
+  TRACE_FUNCTION( "cpap_mfree_ia" );
+
+  if( grr_data->cpap.p_d_imm_assign NEQ NULL )
+  {
+    if( restore_data )
+    {
+      *( ( T_D_IMM_ASSIGN * )_decodedMsg ) = *grr_data->cpap.p_d_imm_assign;
+    }
+
+    MFREE( grr_data->cpap.p_d_imm_assign );
+    grr_data->cpap.p_d_imm_assign = NULL;
+  }
+  else
+  {
+    TRACE_ERROR( "cpap_mfree_ia: fatal error, no memory allocated" );
+  }
+} /* cpap_mfree_ia() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : cpap_check_and_save_freq
++------------------------------------------------------------------------------
+| Description : This function check if the freq_par is valid or not..
+|               If it is hopping case, save the hoppinging freq. 
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+LOCAL BOOL cpap_check_and_save_freq (void)
+{
+  MCAST(d_imm_assign,D_IMM_ASSIGN); /* T_D_IMM_ASSIGN */
+  T_pck_chan_desc *chan_desc = &d_imm_assign->pck_chan_desc;
+  T_mob_alloc *mob_alloc = &d_imm_assign->mob_alloc;
+  BOOL result = FALSE;
+  T_freq_par   freq_par;
+  TRACE_FUNCTION( "cpap_check_and_save_freq" );
+
+  if(chan_desc->hop OR (!chan_desc->hop AND chan_desc->indir))
+  { /* hopping*/
+
+    if (chan_desc->indir)
+    { 
+      /* indirect encoding */
+      /* set up tc's freq_par struct */
+      memset(&freq_par,0,sizeof(T_freq_par));
+      freq_par.v_indi_encod      = TRUE;
+      freq_par.indi_encod.maio   = chan_desc->maio;
+      freq_par.tsc               = chan_desc->tsc;
+      freq_par.indi_encod.ma_num = 
+                          chan_desc->ma_num + MA_NUMBER_4_PSI13_OR_CELL_ALLOC;
+      if( chan_desc->v_ch_mark1)
+      {
+        freq_par.indi_encod.v_chamge_ma_sub   = TRUE;
+        freq_par.indi_encod.chamge_ma_sub.cm1 = chan_desc->ch_mark1;
+      }
+
+      result = tc_set_hopping_par( &freq_par );
+    }
+    else if( chan_desc->v_maio AND chan_desc->v_hsn )
+    { /* direct encoding  */ 
+
+      UBYTE i;
+      memset(&freq_par,0,sizeof(T_freq_par));
+      freq_par.v_di_encod1       = TRUE;
+      freq_par.di_encod1.maio    = chan_desc->maio;
+      freq_par.tsc               = chan_desc->tsc;
+      freq_par.di_encod1.gprs_ms_alloc_ie.hsn = chan_desc->hsn;
+
+      if(0 NEQ mob_alloc->c_mac)
+      {
+        freq_par.di_encod1.gprs_ms_alloc_ie.v_ma_struct = TRUE;
+        freq_par.di_encod1.gprs_ms_alloc_ie.ma_struct.c_ma_map 
+                                                         = mob_alloc->c_mac*8;
+        freq_par.di_encod1.gprs_ms_alloc_ie.ma_struct.ma_len =
+                                                       (mob_alloc->c_mac*8)-1;
+        for(i = 0;i < (mob_alloc->c_mac*8);i++)
+        { /* convert bitbuffer type of rr to type of grr */
+          freq_par.di_encod1.gprs_ms_alloc_ie.ma_struct.ma_map[i]
+                                      = (mob_alloc->mac[i/8]>>(7-(i%8)))&0x01;
+        }
+      }
+
+      result = tc_set_hopping_par( &freq_par );
+    }
+    else
+    { /* corrupted message decoding  */
+        grr_data->tc.v_freq_set = FALSE;
+        result = FALSE;
+    }
+
+  }
+  else if(chan_desc->v_arfcn)
+  {
+    /* absolut radio frequency channel number */
+    grr_data->tc.v_freq_set = TRUE;
+    result                  = TRUE;
+    grr_data->tc.freq_set.freq_par.p_chan_sel.hopping      = FALSE;
+    grr_data->tc.freq_set.tsc        = chan_desc->tsc;
+    grr_data->tc.freq_set.freq_par.p_chan_sel.p_rf_ch.arfcn  = grr_g23_arfcn_to_l1(chan_desc->arfcn);    
+    /* set up tc's freq_par struct */
+    memset(&grr_data->tc.freq_set.freq_par.p_freq_list.p_rf_chan_no.p_radio_freq,0,sizeof(grr_data->tc.freq_set.freq_par.p_freq_list.p_rf_chan_no.p_radio_freq));
+    grr_data->tc.freq_set.freq_par.p_freq_list.p_rf_chan_cnt = 0;
+  }
+  else
+  {
+    grr_data->tc.v_freq_set = FALSE;
+    result = FALSE;
+  }
+
+  grr_data->pwr_ctrl_valid_flags.v_glbl_pwr_ctrl_param = TRUE;
+  grr_data->pwr_ctrl_valid_flags.v_freq_param          = TRUE;
+
+  return result;
+}  /* cpap_check_and_save_freq */
+
+
+
+