diff src/g23m-gprs/llc/llc_llmep.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/llc/llc_llmep.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,453 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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 :  This modul is part of the entity LLC and implements all 
+|             functions to handles the incoming primitives as described in 
+|             the SDL-documentation (LLME-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef LLC_LLMEP_C
+#define LLC_LLMEP_C
+#endif
+
+#define ENTITY_LLC
+
+/*==== 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 "cnf_llc.h"    /* to get cnf-definitions */
+#include "mon_llc.h"    /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "llc.h"        /* to get the global entity definitions */
+
+#include "llc_f.h"      /* to get global functions, e.g. llc_init_parameters */
+#include "llc_llmef.h"  /* to get local LLME functions */
+#include "llc_us.h"     /* to get signal interface to U */
+#include "llc_itxs.h"   /* to get signal interface to ITX */
+#include "llc_irxs.h"   /* to get signal interface to IRX */
+#include "llc_uitxs.h"  /* to get signal interface to UITX */
+#include "llc_uirxs.h"  /* to get signal interface to UIRX */
+#include "llc_t200s.h"  /* to get signal interface to T200 */
+#include "llc_txs.h"    /* to get signal interface to TX */
+#include "llc_rxs.h"    /* to get signal interface to RX */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : llme_llgmm_assign_req
++------------------------------------------------------------------------------
+| Description : Handles the primitive LLGMM_ASSIGN_REQ
+|
+| Parameters  : *llgmm_assign_req - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void llme_llgmm_assign_req ( T_LLGMM_ASSIGN_REQ *llgmm_assign_req )
+{
+  T_SAPI sapi;
+
+
+  TRACE_FUNCTION( "llme_llgmm_assign_req" );
+  
+  switch( GET_STATE( LLME ) )
+  {
+    case LLME_TLLI_UNASSIGNED:
+      /*
+       * ATTENTION: Every ASSIGN_REQ primitive must contain a valid new_tlli
+       * when LLC is unassigned, otherwise it should be a protocol error...?
+       * Therefore this check could be omitted.
+       */
+#ifdef LL_2to1
+      if (llgmm_assign_req->new_tlli == PS_TLLI_INVALID)
+#else
+      if (llgmm_assign_req->new_tlli == LLGMM_TLLI_INVALID)
+#endif
+      {
+        PFREE (llgmm_assign_req);
+        TRACE_ERROR ("LLME in state TLLI_UNASSIGNED and new_tlli is invalid!");
+      }
+      else /* LLGMM_TLLI_VALID */
+      {
+        TRACE_1_INFO("TLLI 0x%.8X assigned", llgmm_assign_req->new_tlli);
+
+        llc_data->tlli_new = llgmm_assign_req->new_tlli;
+        llc_data->tlli_old = llgmm_assign_req->old_tlli;
+
+        llme_init_cipher (llgmm_assign_req->llgmm_kc, 
+          llgmm_assign_req->ciphering_algorithm);
+
+        PFREE (llgmm_assign_req);
+
+        /*
+         * Initialises the LLC layer parameters.
+         * NOTE: IOV-UI and IOV-I[] are initialised the second time with this
+         * function call because they were already set in llme_init_cipher().
+         */
+        llc_init_parameters();
+
+        /*
+         * Label ASSIGN
+         */
+
+        SET_STATE (LLME, LLME_TLLI_ASSIGNED);
+
+        /*
+         * ATTENTION:
+         * The following loop implies that all SAPIs are odd numbers beginning
+         * with 1!
+         */
+#ifdef LL_2to1
+        for (sapi = PS_SAPI_1; sapi <= PS_SAPI_11; sapi += 2)
+#else
+        for (sapi = LL_SAPI_1; sapi <= LL_SAPI_11; sapi += 2)
+#endif
+        {
+          SWITCH_LLC (sapi);
+
+          sig_llme_u_assign_req();
+          sig_llme_uitx_assign_req();
+          sig_llme_uirx_assign_req();
+          sig_llme_t200_assign_req();
+
+#ifdef LL_2to1
+          if ((sapi != PS_SAPI_1) && (sapi != PS_SAPI_7))
+#else
+          if ((sapi != LL_SAPI_1) && (sapi != LL_SAPI_7))
+#endif
+          {
+            sig_llme_itx_assign_req();
+            sig_llme_irx_assign_req();
+          }
+        }
+
+        sig_llme_rx_assign_req();
+        sig_llme_tx_assign_req();
+
+        llc_init_requested_xid();
+      }
+      break;
+
+    case LLME_TLLI_ASSIGNED_SUSPENDED:
+      /* 
+       * No break
+       */
+    case LLME_TLLI_ASSIGNED:
+      llc_data->tlli_new = llgmm_assign_req->new_tlli;
+      llc_data->tlli_old = llgmm_assign_req->old_tlli;
+
+      llme_init_cipher (llgmm_assign_req->llgmm_kc,
+                        llgmm_assign_req->ciphering_algorithm);
+
+#ifdef LL_2to1
+      if (llgmm_assign_req->new_tlli EQ PS_TLLI_INVALID)
+#else
+      if (llgmm_assign_req->new_tlli EQ LLGMM_TLLI_INVALID)
+#endif
+      {
+        TRACE_0_INFO("TLLI unassigned");
+
+        /*
+         * Label UNASSIGN
+         */
+
+        SET_STATE (LLME, LLME_TLLI_UNASSIGNED);
+
+        /*
+         * ATTENTION:
+         * The following loop implies that all SAPIs are odd numbers beginning
+         * with 1!
+         */
+#ifdef LL_2to1
+        for (sapi = PS_SAPI_1; sapi <= PS_SAPI_11; sapi += 2)
+#else
+        for (sapi = LL_SAPI_1; sapi <= LL_SAPI_11; sapi += 2)
+#endif
+        {
+          SWITCH_LLC (sapi);
+
+          sig_llme_u_unassign_req();
+          sig_llme_uitx_unassign_req();
+          sig_llme_uirx_unassign_req();
+          sig_llme_t200_unassign_req();
+
+          if ((sapi != LL_SAPI_1) && (sapi != LL_SAPI_7))
+          {
+            sig_llme_itx_unassign_req();
+            sig_llme_irx_unassign_req();
+          }
+        }
+
+        sig_llme_rx_unassign_req();
+        sig_llme_tx_unassign_req();
+
+        /*
+         * Clear suspended mode with unassign.
+         */
+        llc_data->suspended = FALSE;
+
+        /*
+         * In case we have suspended GRLC we have to resume GRLC to 
+         * 'normal operation'
+         */
+        if (llc_data->grlc_suspended == TRUE)
+        {
+          /*
+           * Resume TX operation and indicate, that GRLC was suspened.
+           */
+          sig_llme_tx_resume_req (llc_data->grlc_suspended);
+
+          llc_data->grlc_suspended = FALSE;
+
+        /*  {
+            PALLOC (grr_resume_req, GRR_RESUME_REQ);
+            PSEND (hCommGRR, grr_resume_req);
+          }*/
+        }
+
+        PFREE (llgmm_assign_req);
+      }
+      else /* LLGMM_TLLI_VALID */
+      {
+        TRACE_1_INFO("TLLI 0x%.8X (re-)assigned", llgmm_assign_req->new_tlli);
+        PFREE (llgmm_assign_req);
+      }
+      break;
+
+    default:
+      PFREE (llgmm_assign_req);
+      TRACE_ERROR( "LLGMM_ASSIGN_REQ unexpected" );
+      break;
+  }
+
+} /* llme_llgmm_assign_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : llme_llgmm_trigger_req
++------------------------------------------------------------------------------
+| Description : Handles the primitive LLGMM_TRIGGER_REQ
+|
+| Parameters  : *llgmm_trigger_req - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void llme_llgmm_trigger_req ( T_LLGMM_TRIGGER_REQ *llgmm_trigger_req )
+{ 
+  TRACE_FUNCTION( "llme_llgmm_trigger_req" );
+  
+  switch( GET_STATE( LLME ) )
+  {
+    case LLME_TLLI_ASSIGNED:
+      /* No break. */
+    case LLME_TLLI_ASSIGNED_SUSPENDED:
+      /*
+       * Switch LLC to SAPI 1 in case TX forwards the trigger request to UITX.
+       */
+      SWITCH_LLC (LL_SAPI_1);
+
+      sig_llme_tx_trigger_req (llgmm_trigger_req->trigger_cause);
+
+      PFREE (llgmm_trigger_req);
+      break;
+    default:
+      PFREE (llgmm_trigger_req);
+      TRACE_ERROR( "LLGMM_TRIGGER_REQ unexpected" );
+      break;
+  }
+
+} /* llme_llgmm_trigger_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : llme_llgmm_suspend_req
++------------------------------------------------------------------------------
+| Description : Handles the primitive LLGMM_SUSPEND_REQ
+|
+| Parameters  : *llgmm_suspend_req - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void llme_llgmm_suspend_req ( T_LLGMM_SUSPEND_REQ *llgmm_suspend_req )
+{ 
+  T_SAPI sapi;
+
+  
+  TRACE_FUNCTION( "llme_llgmm_suspend_req" );
+
+  TRACE_1_PARA("cause:%d", llgmm_suspend_req->susp_cause );
+  
+  switch( GET_STATE( LLME ) )
+  {
+    case LLME_TLLI_ASSIGNED:
+      TRACE_0_INFO("LLC suspended");
+
+      /*
+       * Set global suspended indicator for the other services.
+       */
+      llc_data->suspended = TRUE;
+
+      SET_STATE (LLME, LLME_TLLI_ASSIGNED_SUSPENDED);
+
+      /*
+       * ATTENTION:
+       * The following loop implies that all the relevant SAPIs are the odd 
+       * numbers from 3 to 11 (except 7)
+       */
+      for (sapi = LL_SAPI_3; sapi <= LL_SAPI_11; sapi += 2)
+      {
+        SWITCH_LLC (sapi);
+
+        if (sapi != LL_SAPI_7)
+        {
+          sig_llme_itx_suspend_req();
+        }
+      }
+
+      /*
+       * No break!
+       */
+    case LLME_TLLI_ASSIGNED_SUSPENDED:
+      /*
+       * In case of RAU suspend GRLC if not already done
+       */
+      if ( (llc_data->grlc_suspended == FALSE)           AND 
+           (llgmm_suspend_req->susp_cause == LLGMM_RAU)   )
+      {
+        sig_llme_tx_suspend_req ();
+
+        llc_data->grlc_suspended = TRUE;
+
+        {
+          PALLOC (grlc_activate_gmm_queue_req, GRLC_ACTIVATE_GMM_QUEUE_REQ);
+          PSEND (hCommGRLC, grlc_activate_gmm_queue_req);
+        }
+      }
+
+      break;
+  
+    default:
+      TRACE_ERROR( "LLGMM_SUSPEND_REQ unexpected" );
+      break;
+  
+  }
+  if ( (llgmm_suspend_req->susp_cause == LLGMM_LIMITED) OR
+           (llgmm_suspend_req->susp_cause == LLGMM_NO_GPRS_SERVICE))
+      /* init current values */
+#ifdef REL99
+      llc_data->cur_pfi          = LL_PFI_SIGNALING; 
+#endif
+      llc_data->cur_qos.delay    = LL_DELAY_SUB;
+      llc_data->cur_qos.relclass = LL_NO_REL;
+      llc_data->cur_qos.peak     = LL_PEAK_SUB;
+      llc_data->cur_qos.preced   = LL_PRECED_SUB;
+      llc_data->cur_qos.mean     = LL_MEAN_SUB;
+      llc_data->cur_radio_prio   = LL_RADIO_PRIO_1;  
+  PFREE (llgmm_suspend_req);
+
+} /* llme_llgmm_suspend_req() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : llme_llgmm_resume_req
++------------------------------------------------------------------------------
+| Description : Handles the primitive LLGMM_RESUME_REQ
+|
+| Parameters  : *llgmm_resume_req - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void llme_llgmm_resume_req ( T_LLGMM_RESUME_REQ *llgmm_resume_req )
+{ 
+  T_SAPI sapi;
+
+  
+  TRACE_FUNCTION( "llme_llgmm_resume_req" );
+  
+  switch( GET_STATE( LLME ) )
+  {
+    case LLME_TLLI_ASSIGNED_SUSPENDED:
+      TRACE_0_INFO("LLC resumed");
+
+      /*
+       * Clear global suspended indicator for the other services.
+       */
+      llc_data->suspended = FALSE;
+
+      SET_STATE (LLME, LLME_TLLI_ASSIGNED);
+
+      /*
+       * FIRST! indicate to TX that we resume normal operation and 
+       * that LLC/GRLC flow control should be reseted in case GRLC was 
+       * suspened.
+       */
+      sig_llme_tx_resume_req (llc_data->grlc_suspended);
+
+      /*
+       * Reset GRLC, if suspended, to 'normal operation'
+       */
+      if (llc_data->grlc_suspended == TRUE)
+      {
+       /* PALLOC (grr_resume_req, GRR_RESUME_REQ);
+        PSEND (hCommGRR, grr_resume_req);*/
+
+        llc_data->grlc_suspended = FALSE;
+      }
+
+      /*
+       * ATTENTION:
+       * The following loop implies that all the relevant SAPIs are the odd 
+       * numbers from 3 to 11 (except 7)
+       */
+      for (sapi = LL_SAPI_3; sapi <= LL_SAPI_11; sapi += 2)
+      {
+        SWITCH_LLC (sapi);
+
+        if (sapi != LL_SAPI_7)
+        {
+          sig_llme_itx_resume_req();
+        }
+      }
+      break;
+  
+    default:
+      TRACE_ERROR( "LLGMM_RESUME_REQ unexpected" );
+      break;
+  }
+
+  PFREE (llgmm_resume_req);
+
+} /* llme_llgmm_resume_req() */
+