diff src/g23m-gprs/grlc/grlc_gffp.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/grlc/grlc_gffp.c	Thu Oct 13 04:24:13 2016 +0000
@@ -0,0 +1,482 @@
+/*  
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  GRLC
++----------------------------------------------------------------------------- 
+|  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 primitive handler functions for service
+|             GFF of entity GRLC.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GRLC_GFFP_C
+#define GRLC_GFFP_C
+#endif
+
+#define ENTITY_GRLC
+
+/*==== INCLUDES =============================================================*/
+
+#include <stdio.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 "prim.h"       /* to get the definitions of used SAP and directions */
+#include "message.h"
+#include "grlc.h"        /* to get the global entity definitions */
+#include "grlc_gfff.h" 
+#include "grlc_f.h" 
+#include <string.h>
+#include "grlc_rus.h"
+#include "grlc_rds.h"
+#include "grlc_func.h"
+#include "grlc_tpcs.h"
+#include "grlc_meass.h"
+#include "cl_rlcmac.h"
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+#include "grlc_tms.h"
+#endif
+
+/*==== CONST ================================================================*/
+
+#define BITS_PER_RADIO_BLOCK 456
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+/*
++------------------------------------------------------------------------------
+| Function    : gff_mac_pwr_ctrl_ind
++------------------------------------------------------------------------------
+| Description : Handles the primitive MAC_PWR_CTRL_IND
+|
+| Parameters  : *mac_pwr_ctrl_ind - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void gff_mac_pwr_ctrl_ind ( T_MAC_PWR_CTRL_IND * mac_pwr_ctrl_ind )
+{ 
+  TRACE_FUNCTION( "gff_mac_pwr_ctrl_ind" );
+  
+#if defined _TARGET_ && !defined (NTRACE)
+
+  if( grlc_data->tpc.n_tpc_trace & M_TPC_TRACE_FUNCTION )
+  {
+    T_L1TEST_CALL_MPHP_POWER_CONTROL l1test_call;
+
+    UBYTE i;
+    
+    l1test_call.assignment_id = ( U8 )mac_pwr_ctrl_ind->assignment_id;
+    l1test_call.crc_error     =       mac_pwr_ctrl_ind->crc_error;
+    l1test_call.bcch_level    = ( S8 )mac_pwr_ctrl_ind->bcch_level;
+
+    for( i = 0; i < L1TEST_BURST_PER_BLOCK; i++ )
+    {
+      l1test_call.burst_level[i] = ( S8 )mac_pwr_ctrl_ind->burst_level[i];
+      l1test_call.radio_freq [i] =       mac_pwr_ctrl_ind->radio_freq[i];
+    }
+
+    TRACE_MEMORY_PRIM ( hCommL1, hCommGRLC, L1TEST_CALL_MPHP_POWER_CONTROL,
+                        &l1test_call, sizeof( T_L1TEST_CALL_MPHP_POWER_CONTROL ) );
+  }
+
+#endif /* #if defined _TARGET_ && !defined (NTRACE) */
+
+  gff_clip_rxlev( &mac_pwr_ctrl_ind->bcch_level,
+                  &mac_pwr_ctrl_ind->bcch_level, 1 );
+  
+  gff_clip_rxlev( mac_pwr_ctrl_ind->burst_level,
+                  mac_pwr_ctrl_ind->burst_level, 
+                  MAC_BURST_PER_BLOCK );
+
+  sig_gff_tpc_pwr_ctrl_ind( mac_pwr_ctrl_ind );
+
+#if defined _TARGET_ && !defined (NTRACE)
+
+  if( grlc_data->tpc.n_tpc_trace & M_TPC_TRACE_FUNCTION )
+  {
+    T_L1TEST_RETURN_MPHP_POWER_CONTROL l1test_return;
+    
+    tpc_get_pch( &l1test_return.pch[0] );
+    
+    TRACE_MEMORY_PRIM ( hCommGRLC, hCommL1, L1TEST_RETURN_MPHP_POWER_CONTROL,
+                        &l1test_return, sizeof( T_L1TEST_RETURN_MPHP_POWER_CONTROL ) );
+  }
+
+#endif /* #if defined _TARGET_ && !defined (NTRACE) */
+
+} /* gff_mac_pwr_ctrl_ind() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : gff_mac_data_ind
++------------------------------------------------------------------------------
+| Description : Handles the primitive MAC_DATA_IND
+|
+| Parameters  : *mac_data_ind - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void gff_mac_data_ind ( T_MAC_DATA_IND * mac_data_ind )
+{ 
+  UBYTE   i;
+  USHORT  rx_no;
+
+  TRACE_FUNCTION( "mac_data_ind" );
+  
+  rx_no  = grlc_data->func.dl_blocks.data_ptr.rx_no;
+
+#ifdef _SIMULATION_
+  {
+    /*
+     * copy received primitive to grlc_data->func.mac_data_ind
+     */
+
+    TRACE_EVENT_P5("mac_data_ind fn=%ld tn= %d -> mask=%x UL_MASK=%x DL_MASK=%x"
+                                                   ,mac_data_ind->fn
+                                                   ,mac_data_ind->dl_data.tn
+                                                   ,0x80>>mac_data_ind->dl_data.tn
+                                                   ,grlc_data->ul_tn_mask
+                                                   ,grlc_data->dl_tn_mask);
+
+    grlc_data->dl_fn = mac_data_ind->fn;
+    grlc_data->ul_fn = mac_data_ind->fn;
+    memcpy (
+            &(grlc_data->func.mac_data_ind),
+            mac_data_ind,
+            sizeof(T_MAC_DATA_IND));
+    PFREE(mac_data_ind);
+    mac_data_ind = &(grlc_data->func.mac_data_ind);
+    rx_no = 1;
+  }
+#endif
+
+  switch( GET_STATE( GFF ) ) 
+  {
+    case GFF_ACTIVE:  
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+    case GFF_TWO_PHASE: 		
+#endif
+      {
+        T_BER_IND ber_ind;
+
+        ber_ind.num_dl_blck = 0;
+
+        for(i=0; i< rx_no; i++)
+        {
+        
+
+#ifdef _TARGET_
+          {
+            /*
+             * copy next primitive to grlc_data->func.mac_data_ind
+             */
+            grlc_data->func.mac_data_ind.fn      = grlc_data->func.dl_blocks.fn;
+            grlc_data->func.mac_data_ind.rx_no   = grlc_data->func.dl_blocks.data_ptr.rx_no;
+            grlc_data->func.mac_data_ind.dl_data = grlc_data->func.dl_blocks.data_ptr.dl_data[i];  
+            mac_data_ind = &(grlc_data->func.mac_data_ind);
+          }
+          
+          TRACE_MEMORY_PRIM ( hCommL1, hCommGRLC, MAC_DATA_IND,
+                              mac_data_ind, sizeof( T_MAC_DATA_IND ) );
+          
+#endif /* #ifdef _TARGET_ */
+
+          /* 
+           * In Test mode B,if there is CRC error on the payload data the MS will,
+           * where required by the USF, transmit the decoded payload data. The block
+           * transmitted will be a valid uplink block format.
+           */
+	      
+          if( ( (mac_data_ind->dl_data.block_status & 0x0100) EQ 0x0000)  OR ( (grlc_data->testmode.mode EQ CGRLC_LOOP) ) )
+          {
+            /*
+             * Only successfully decoded blocks shall be considered
+             */
+
+            if( gff_analyse_dl_data( mac_data_ind->fn, &( mac_data_ind->dl_data ) ) )
+            {
+              /*
+               * Only blocks intended for that MS shall be considered
+               */
+
+              if( ber_ind.num_dl_blck < MAC_MAX_DL_DATA_BLCKS )
+              {
+                ber_ind.be_info[ber_ind.num_dl_blck].total = BITS_PER_RADIO_BLOCK;
+
+                if( ( mac_data_ind->dl_data.block_status & 0x000F ) EQ 0x0006 )
+                {
+                  /* 
+                   * If CS4 is used, the MS is allowed to report RXQUAL = 7,
+                   * so just set the BER to 100%
+                   */
+                  ber_ind.be_info[ber_ind.num_dl_blck].fault =
+                                                          BITS_PER_RADIO_BLOCK;
+                }
+                else
+                {
+                  ber_ind.be_info[ber_ind.num_dl_blck].fault =
+                                    grlc_data->func.mac_data_ind.dl_data.d_nerr;
+                }
+
+                ber_ind.num_dl_blck++;
+              }
+              else
+              {
+                TRACE_ERROR( "be_info overflow in gff_mac_data_ind" );
+              }
+            }
+          }
+          else
+          {
+            TRACE_ERROR( "MAC_DATA_IND with bad CRC" );
+
+            TRACE_BINDUMP
+              ( hCommGRLC, TC_USER5,
+                cl_rlcmac_get_msg_name( D_MSG_TYPE_CRC_ERROR_c, RLC_MAC_ROUTE_DL ),
+                mac_data_ind->dl_data.dl_block, MAX_L2_FRAME_SIZE ); /*lint !e569*/
+
+            /* grlc_data->nr_of_crc_errors++; */
+          }
+        }
+
+        if( ber_ind.num_dl_blck NEQ 0 )
+        {
+           meas_sq_update( &ber_ind );
+        }
+      }
+      break;
+    default:
+      /*TRACE_ERROR( "MAC_DATA_IND unexpected" );*/
+      break;
+  }
+
+/*call control of asyn part TARGET DEBUGGING*/
+#if defined (_TARGET_)
+  grlc_data->dl_cnt_asyn = grlc_data->dl_cnt_syn;
+#endif /* defined (_TARGET_) */
+
+} /* gff_mac_data_ind() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : gff_mac_ready_ind
++------------------------------------------------------------------------------
+| Description : Handles the primitive MAC_READY_IND
+|
+| Parameters  : *mac_ready_ind - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void gff_mac_ready_ind ( T_MAC_READY_IND * mac_ready_ind )
+{ 
+  TRACE_FUNCTION( "mac_ready_ind" );
+
+  /*
+   * calculate the frame number from downlink call
+   */
+#ifdef _TARGET_
+  {
+    ULONG current_dl_fn;
+    ULONG last_dl_fn;
+    ULONG last_ul_fn;
+    ULONG current_ul_fn;
+    BOOL  trace_dl_gap = TRUE;
+
+    current_dl_fn = grlc_data->func.mac_ready_ind.fn;
+    last_dl_fn    = grlc_data->last_dl_fn;
+    last_ul_fn    = grlc_data->last_ul_fn;
+
+    grlc_data->func.mac_ready_ind.fn = grlc_data->ul_fn ;
+    current_ul_fn                   = grlc_data->ul_fn;
+
+    if(grlc_data->func.mac_ready_ind.last_poll_resp)
+    {
+      TRACE_EVENT_P5("POLL NOT SENT BY LAYER 1 fn=%ld last_poll_resp=0x%x np_fn=%ld,bs=%d,ind=%d"
+                                                ,grlc_data->func.mac_ready_ind.fn
+                                                ,grlc_data->func.mac_ready_ind.last_poll_resp
+																								,grlc_data->next_poll_fn
+																								,grlc_data->ul_poll_resp[0].block_status
+																								,grlc_data->ul_poll_pos_index);
+    }
+
+    /* handle gaps*/
+    if ((grlc_data->next_poll_fn EQ 2) OR (grlc_data->next_poll_fn EQ 1))
+    { /* last poll is sent*/
+      grlc_data->func.mac_ready_ind.last_poll_resp = 0; /* no ul gap for poll */ 
+    }
+    else if( grlc_data->ul_call_errors AND 
+             (grlc_data->ul_fn_errors[grlc_data->ul_call_errors-1] EQ grlc_data->next_poll_fn ))
+    {
+      trace_dl_gap = FALSE;
+      TRACE_EVENT_P7("CALL ERR:c_dl_fn=%ld l_dl_fn=%ld c_ul_fn=%ld l_ul_fn=%ld callerr=%d err_fn=%ld lp_fn=%ld",
+                                                    current_dl_fn,
+                                                    last_dl_fn,
+                                                    current_ul_fn,
+                                                    last_ul_fn,
+                                                    grlc_data->ul_call_errors,
+                                                    grlc_data->ul_fn_errors[grlc_data->ul_call_errors-1],
+                                                    grlc_data->next_poll_fn);
+
+      grlc_data->func.mac_ready_ind.last_poll_resp = 0xFF;
+      grlc_data->next_poll_fn =2 ;
+    }
+    else if(current_ul_fn >= grlc_data->next_poll_fn) 
+    {
+      trace_dl_gap = FALSE;
+      TRACE_EVENT_P6("2UL GAP NO POLL:c_dl_fn=%ld l_dl_fn=%ld c_ul_fn=%ld l_ul_fn=%ld lpr=%d lp_fn=%ld",
+                                                    current_dl_fn,
+                                                    last_dl_fn,
+                                                    current_ul_fn,
+                                                    last_ul_fn,
+                                                    grlc_data->func.mac_ready_ind.last_poll_resp,
+                                                    grlc_data->next_poll_fn);
+
+      grlc_data->func.mac_ready_ind.last_poll_resp = 0xFF;
+      grlc_data->next_poll_fn =2 ;
+    }
+    else if((grlc_data->next_poll_fn > current_ul_fn) AND (current_ul_fn < 52)) /*fn overflow*/
+    {
+      trace_dl_gap = FALSE;
+      TRACE_EVENT_P6("3UL GAP NO POLL:c_dl_fn=%ld l_dl_fn=%ld c_ul_fn=%ld l_ul_fn=%ld lpr=%d lp_fn=%ld",
+                                                    current_dl_fn,
+                                                    last_dl_fn,
+                                                    current_ul_fn,
+                                                    last_ul_fn,
+                                                    grlc_data->func.mac_ready_ind.last_poll_resp,
+                                                    grlc_data->next_poll_fn);
+      grlc_data->func.mac_ready_ind.last_poll_resp = 0xFF;
+      grlc_data->next_poll_fn =2 ;
+    }
+    
+    if( trace_dl_gap                           AND 
+        ( ( current_dl_fn - last_dl_fn ) > 5 ) AND
+        ( grlc_data->dl_cnt_syn OR grlc_data->dl_fn_store[0] OR grlc_data->dl_fn_store[1] ) )
+    {
+      TRACE_EVENT_P2( "DL GAP: c_dl_fn=%ld l_dl_fn=%ld", current_dl_fn, last_dl_fn );
+    }
+  }
+#endif /* _TARGET_ */
+
+#ifdef _SIMULATION_
+  {
+    /*
+     * copy received primitive to grlc_data->func.mac_ready_ind
+     */
+    grlc_data->ul_fn = mac_ready_ind->fn;
+    memcpy (
+            &(grlc_data->func.mac_ready_ind),
+            mac_ready_ind,
+            sizeof(T_MAC_READY_IND));
+    PFREE(mac_ready_ind);
+  }
+#endif
+
+
+  mac_ready_ind = &(grlc_data->func.mac_ready_ind);
+
+#ifdef _TARGET_
+
+  TRACE_MEMORY_PRIM ( hCommL1, hCommGRLC, MAC_READY_IND, 
+                      mac_ready_ind, sizeof( T_MAC_READY_IND ) );
+
+#endif /* #ifdef _TARGET_ */
+
+  /*
+   * handle ta value
+   */
+  gff_handle_continious_ta();
+
+
+  switch( GET_STATE(GFF) )
+  {
+    case GFF_ACTIVE:
+      if(grlc_data->tfi_change NEQ TFI_CHANGE_NULL)
+      {
+        grlc_activate_tfi(mac_ready_ind->fn);
+      }
+      grlc_data->ul_poll_pos_index = 0;
+      if(grlc_data->gff.rlc_status EQ RLC_STATUS_BOTH)
+      {
+        sig_gff_ru_mac_ready_ind(mac_ready_ind);
+        sig_gff_rd_mac_ready_ind(mac_ready_ind);
+      }
+      else if(grlc_data->gff.rlc_status EQ RLC_STATUS_UL)
+        sig_gff_ru_mac_ready_ind(mac_ready_ind);
+      else if(grlc_data->gff.rlc_status EQ RLC_STATUS_DL)
+        sig_gff_rd_mac_ready_ind(mac_ready_ind);
+      else
+      {
+        TRACE_ERROR("unknown rlc status: gff active but no tbf");
+      }
+      break;
+#if defined REL99 AND defined TI_PS_FF_TBF_EST_PACCH
+    case GFF_TWO_PHASE:
+      grlc_data->ul_poll_pos_index = 0;
+      sig_gff_tm_mac_ready_ind_two_phase(mac_ready_ind);
+      break;
+#endif
+    default:
+      /*TRACE_ERROR( "MAC_READY_IND unexpected" );*/
+      break;
+  }
+
+#if defined (_TARGET_)
+  /*call control of asyn part*/
+  grlc_data->ul_cnt_asyn = grlc_data->ul_cnt_syn;
+#endif /* defined (_TARGET_) */
+
+
+} /* gff_mac_ready_ind() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : gff_l1test_call_mphp_power_control
++------------------------------------------------------------------------------
+| Description : Handles the primitive L1TEST_CALL_MPHP_POWER_CONTROL
+|
+| Parameters  : *mphp_power_control - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+
+#ifdef _SIMULATION_
+
+GLOBAL void gff_l1test_call_mphp_power_control 
+                  ( T_L1TEST_CALL_MPHP_POWER_CONTROL *call_mphp_power_control )
+{ 
+  PALLOC( return_mphp_power_control, L1TEST_RETURN_MPHP_POWER_CONTROL );
+
+  maca_power_control( call_mphp_power_control->assignment_id,
+                      call_mphp_power_control->crc_error,
+                      call_mphp_power_control->bcch_level,
+                      call_mphp_power_control->radio_freq,
+                      call_mphp_power_control->burst_level,
+                      return_mphp_power_control->pch );
+
+  PSEND( hCommL1, return_mphp_power_control );
+
+  TRACE_FUNCTION( "gff_l1test_call_mphp_power_control" );
+
+  PFREE( call_mphp_power_control );
+
+} /* gff_l1test_call_mphp_power_control() */
+
+#endif /* #ifdef _SIMULATION_ */