diff src/g23m-gprs/gmm/gmm_rdys.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/gmm/gmm_rdys.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,402 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  gmm_rdys.c
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  This modul is part of the entity GMM and implements all 
+|             functions to handles the incoming process internal signals as  
+|             described in the SDL-documentation (RDY-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+
+#ifndef GMM_RDYS_C
+#define GMM_RDYS_C
+#endif
+
+#define ENTITY_GMM
+
+/*==== INCLUDES =============================================================*/
+
+#include "typedefs.h"    /* to get Condat data types */
+#include "vsi.h"        /* to get a lot of macros */
+#include "macdef.h"
+#include "gprs.h"
+#include "gsm.h"        /* to get a lot of macros */
+#include "ccdapi.h"     /* to get CCD API */
+#include "cnf_gmm.h"    /* to get cnf-definitions */
+#include "mon_gmm.h"    /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "gmm.h"        /* to get the global entity definitions */
+
+#include "gmm_rdyf.h"
+#include "gmm_kerns.h"
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_force_ie_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_FORCE_IE_REQ
+|
+| Parameters  : force_to_standby -  parameter from the AIR message
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_force_ie_req ( UBYTE force_to_standby, BOOL 
+attach_complete )
+{ 
+  TRACE_ISIG( "sig_kern_rdy_force_ie_req" );
+  
+  switch( GET_STATE( RDY ) )
+  {
+    case RDY_READY:
+    case RDY_STANDBY_TWICE:
+    case RDY_STANDBY:
+      if ( force_to_standby == STANDBY_YES )
+      /*
+       * force to standby
+       */
+      {
+        /*
+         * Start RAU STANDBY TIMER T3312
+         * <R.GMM.RAUTIMER.M.005>, <R.GMM.READYTIM.M.012>
+         */
+        rdy_start_t3312();
+        if (attach_complete)
+        {
+          SET_STATE(RDY,RDY_STANDBY_TWICE)
+        }
+        else
+        {
+          SET_STATE ( RDY, RDY_STANDBY );
+        }
+        {  
+          /* Instead of sending GMMRR_STANDBY_REQ primitive send 
+           * CGRLC_FORCE_TO_STANDBY_REQ primitive. GRLC will take 
+           * care for GRR standby 
+           */
+          PALLOC (cgrlc_force_to_standby_req,CGRLC_FORCE_TO_STANDBY_REQ);
+          PSEND ( hCommGRLC, cgrlc_force_to_standby_req );
+        }
+      } 
+      else
+      /* 
+       * not force to standby
+       */
+      {
+        /*
+         * The state is kept
+         * SET_STATE ( - )
+         */
+      } /* force to standby? */
+      break;
+    case RDY_DEACTIVATED:
+      /* 
+       * The state is not changed
+       * SET_STATE ( - );
+       */
+      if ( force_to_standby == STANDBY_YES )
+      /*
+       * force to standby
+       */
+      {  
+        /*
+         * Allocate CGRLC_FORCE_TO_STANDBY_REQ primitive 
+         */
+        PALLOC (cgrlc_force_to_standby_req,CGRLC_FORCE_TO_STANDBY_REQ);
+        PSEND ( hCommGRLC, cgrlc_force_to_standby_req );
+      } 
+      
+      break;
+    default:
+      TRACE_ERROR( "SIG_KERN_RDY_FORCE_IE_REQ unexpected" );
+      break;
+  }
+} /* sig_kern_rdy_force_ie_req() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_start_t3312_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_START_T3312_REQ
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_start_t3312_req ( void ) 
+{ 
+  TRACE_ISIG( "sig_kern_rdy_start_t3312_req" );
+  
+  switch( GET_STATE( RDY ) )
+  {
+    case RDY_DEACTIVATED:
+      /* 
+       * <R.GMM.RAUTIMER.M021>
+       */
+      rdy_start_t3312();
+      break;
+    default:
+      break;
+  }
+} /* sig_kern_rdy_start_t3312() */
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_cu_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_CU_REQ
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_cu_req ( void ) 
+{ 
+  TRACE_ISIG( "sig_kern_rdy_cu_req" );
+  
+  switch( GET_STATE( RDY ) )
+  {
+    case RDY_READY:
+    case RDY_DEACTIVATED:
+      /*
+       * This message is used to initiated the initial cell update
+       *
+       *  <R.GMM.READYTIM.M.002>
+       *  <R.GMM.READYTIM.M.003>
+       *  <R.GMM.READYTIM.M.025>
+       *  <R.GMM.READYTIM.M.026>
+       */
+      sig_rdy_kern_cu_ind();
+      TRACE_EVENT("CU");
+      vsi_o_ttrace(VSI_CALLER TC_USER4, "CELL UPDATE");
+      break;
+    default:
+      /*
+       * if the READY timer has expired  MS shall not perform 
+       * the cell updating procedure when a new cell is selected
+       *
+       *  <R.GMM.READYTIM.M.005>
+       */
+  
+      break;
+  }
+} /* sig_kern_rdy_cu_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_t3314_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_T3314_REQ
+|               This procedure handels the negotiated ready timer comming
+|               from the ATTACH_ACCEPT and RAU_ACCEPT message
+|
+|          MSC: 3.17 Timer
+|          MSC: 3.17.6 READY timer behaviour
+|
+| Parameters  : v_ptmsi       - flag from AIR message if PTMSI was negotiated
+|               v_ready_timer - flag from AIR message if  T3314 was negotiated
+|               ready_timer   - ready_timer struct from AIR message with time 
+|                               unit and value of the negotiated T3314
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_t3314_req ( BOOL v_ptmsi, BOOL v_ready_timer,
+                                    T_ready_timer *p_ready_timer,
+                                    T_rau_timer *rau_timer,
+                                    BOOL attach_complete ) 
+{ 
+  TRACE_ISIG( "sig_kern_rdy_t3314_req" );
+  
+  if (TIMER_DEACT == rau_timer->timer_unit)
+  {
+    gmm_data->rdy.t3312_deactivated = TRUE;
+  }
+  else
+  {
+    gmm_data->rdy.t3312_deactivated = FALSE;
+    gmm_data->rdy.t3312_val = rdy_get_timer ( rau_timer );  
+  }
+
+  if (!v_ready_timer)
+  {
+    return;
+  }
+  /*
+   * <R.GMM.READYTIM.A.023>
+   */
+  if ( TIMER_DEACT == p_ready_timer->timer_unit )
+  {
+    rdy_cgrlc_ready_timer_config_req (CGRLC_DEACTIVATED) ;
+    SET_STATE ( RDY, RDY_DEACTIVATED );
+  }
+  else /* if ( p_ready_timer->timer_unit != TIMER_DEACT ) */
+  {
+    /*  
+     *  The value for  READY TIMER T3314 is set with data from AIR
+     */
+    ULONG ready_timer = rdy_get_timer ( (T_rau_timer *)p_ready_timer );
+    /*
+     * changed due t ericsson IOT. I hope that ANITE and R&S will accept this
+     *
+     * BOOL read_timer_changed = (ready_timer!=gmm_data->rdy.t3314_val);
+     */
+    /*  BOOL read_timer_negtiated = v_ready_timer; */
+    
+    gmm_data->rdy.t3314_val = ready_timer;
+    rdy_cgrlc_ready_timer_config_req (gmm_data->rdy.t3314_val) ;    
+
+    switch( GET_STATE( RDY ) )
+    {
+      /*
+       *  LABEL READY_CONTINUE
+       */
+      case RDY_READY:         
+      /*
+       *  LABEL STANDBY_CONTINUE
+       */   
+      case RDY_STANDBY_TWICE:
+      case RDY_STANDBY:
+     
+        if ( p_ready_timer->timer_value == 0 )
+        {
+          /*
+           *  <R.GMM.READYTIM.A.024>
+           */
+          rdy_start_t3312();
+          if (attach_complete)
+          { 
+            SET_STATE(RDY,RDY_STANDBY_TWICE)
+          }
+          else
+          {
+            SET_STATE ( RDY, RDY_STANDBY );
+          }
+          {
+            PALLOC (cgrlc_force_to_standby_req, CGRLC_FORCE_TO_STANDBY_REQ);
+            PSEND ( hCommGRLC, cgrlc_force_to_standby_req );
+          }
+        }
+        else /* if ( p_ready_timer->timer_value != 0 ) */
+        {
+          /* 
+           * v_ptmsi is an indicator for ready_timer negotiation
+           * this decision is here, because the cu will be triggered in
+           * service KERNEL by the ACCEPT message
+           */
+          if ( /*read_timer_negtiated &&*/ (GET_STATE( RDY ) == RDY_READY) && !v_ptmsi ) 
+          {
+            /*
+             * This message is used to initiated the initial cell update
+             *
+             *  <R.GMM.READYTIM.M.025>
+             *  <R.GMM.READYTIM.M.026>
+             */
+            /*
+            PALLOC (llgmm_trigger_req, LLGMM_TRIGGER_REQ);
+              llgmm_trigger_req->trigger_cause = LLGMM_TRICS_CELL_UPDATE;
+              
+            PSEND ( hCommLLC, llgmm_trigger_req );
+            */
+            sig_rdy_kern_cu_ind();
+            TRACE_EVENT ("TRIGGER_REQ because of ready timer neg");
+          }
+        }
+        break;
+      case RDY_DEACTIVATED:
+        /*
+         * I think, that the new  state should be READY, because there is
+         * no other way to leave the state DEACTIVATED
+         *
+         * <R.GMM.READYTIM.A.025>
+         */
+        SET_STATE ( RDY, RDY_READY );
+        break;
+      default:
+        TRACE_ERROR( "SIG_KERN_RDY_T3314_REQ unexpected" );
+        break;
+    }
+  } 
+} /* sig_kern_rdy_t3314_req() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_start_t3302_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_START_T3302_REQ
+|               This signal let the timer T3312 not be startet in state 
+|                attampting to update
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_start_t3302_req ( void )
+{ 
+  TRACE_ISIG( "sig_kern_rdy_start_t3302_req" );
+  gmm_data->rdy.attempting_to_update = TRUE;
+} /* sig_kern_rdy_start_t3302_req() */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_stop_t3302_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_STOP_T3302_REQ
+|               This signal let the timer T3312 not be startet in state 
+|                attampting to update
+|
+| Parameters  : void
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_stop_t3302_req ( void )
+{ 
+  TRACE_ISIG( "sig_kern_rdy_stop_t3302_req" );
+  gmm_data->rdy.attempting_to_update = FALSE;
+} /* sig_kern_rdy_start_t3302_req */
+
+/*
++------------------------------------------------------------------------------
+| Function    : sig_kern_rdy_start_timer_req
++------------------------------------------------------------------------------
+| Description : Handles the internal signal SIG_KERN_RDY_START_TIMER_REQ
+|               This signal ask rdy to start the passed timer with given value
+|               on reception of GMMRR_TRIGGER_REQ
+|
+| Parameters  : UBYTE  timer - timer
+|              ULONG  value - timeout value 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void sig_kern_rdy_start_timer_req ( UBYTE timer, ULONG value )
+{ 
+  TRACE_ISIG( "sig_kern_rdy_start_timer_req" );
+  TRACE_2_INFO ("START TIMER %d: %dsec",timer, (ULONG) (value/1000) );
+  gmm_data->rdy.timer_value[timer] = value;
+  vsi_t_start ( GMM_handle , timer, value);
+  return;
+} /* sig_kern_rdy_start_timer_req */
+
+