diff src/g23m-gprs/llc/llc_llmef.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_llmef.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,236 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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 
+|             procedures and functions as described in the 
+|             SDL-documentation (LLME-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef LLC_LLMEF_C
+#define LLC_LLMEF_C
+#endif
+
+#define ENTITY_LLC
+
+/*==== INCLUDES =============================================================*/
+
+#include <string.h>     /* to get memcpy() */
+
+#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_par.h"    /* to get the default values of the LLC paramters */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : llme_init
++------------------------------------------------------------------------------
+| Description : This procedure initialises all necessary variables of llme for 
+|               all SAPIs.
+|               Also global variables are initialised that relate not to a
+|               specific service (e.g. tlli_new/tlli_old).
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void llme_init (void)
+{
+  int n;
+
+  TRACE_FUNCTION( "llme_init" );
+
+  /*
+   * Initialise service LLME with state TLLI_UNASSIGNED.
+   */
+  INIT_STATE (LLME, LLME_TLLI_UNASSIGNED);
+
+  /*
+   * Initialise global variables.
+   */
+  llc_data->suspended           = FALSE;
+  llc_data->grlc_suspended      = FALSE;
+
+#ifdef LL_2to1
+  llc_data->tlli_new            = PS_TLLI_INVALID;
+  llc_data->tlli_old            = PS_TLLI_INVALID;
+#else
+  llc_data->tlli_new            = LL_TLLI_INVALID;
+  llc_data->tlli_old            = LL_TLLI_INVALID;
+#endif
+
+  llc_data->ciphering_algorithm = LLGMM_CIPHER_NO_ALGORITHM;
+#ifdef LL_2to1
+  memset (&(llc_data->kc), 0, sizeof(T_LLGMM_llgmm_kc));
+#else
+  memset (&(llc_data->kc), 0, sizeof(T_llgmm_kc));
+#endif
+
+  /* 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;  
+
+  /*
+   * Initialise all the global SAPI data, which is 
+   * not related to only one service
+   */
+  for (n=0; n < MAX_SAPI_INC; n++)
+  {
+    SWITCH_SERVICE (llc, sapi, n);
+
+    llc_data->sapi->vur       = 0;
+
+    llc_data->sapi->va        = 0;
+    llc_data->sapi->vs        = 0;
+    llc_data->sapi->vr        = 0;
+
+    llc_data->sapi->oc_ui_tx  = 0L;
+    llc_data->sapi->oc_ui_rx  = 0L;
+    llc_data->sapi->oc_i_tx   = 0L;
+    llc_data->sapi->oc_i_rx   = 0L;
+
+    llc_data->sapi->pbit_outstanding = FALSE;
+  }
+
+  return;
+} /* llme_init() */
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : llme_init_cipher
++------------------------------------------------------------------------------
+| Description : This procedure initialises the global LLC variables llc_kc
+|               (ciphering key Kc) and llc_ciphering_algorithm (ciphering
+|               algorithm). If ciphering_algorithm is LLGMM_CIPH_NA, the
+|               parameters are ignored and the procedure doesn't change 
+|               anything. The procedures cipher_ll_pdu (service send_pdu) 
+|               and decipher_ll_pdu (service receive_pdu) use the global 
+|               variables for ciphering and deciphering.
+|
+| Parameters  : kc - ciphering key
+|               ciphering_algorithm - ciphering algorithm
+|
++------------------------------------------------------------------------------
+*/
+#ifdef LL_2to1
+GLOBAL void llme_init_cipher (T_LLGMM_llgmm_kc kc, UBYTE ciphering_algorithm)
+#else
+GLOBAL void llme_init_cipher (T_llgmm_kc kc, UBYTE ciphering_algorithm)
+#endif
+{
+  TRACE_FUNCTION( "llme_init_cipher" );
+  
+  if (ciphering_algorithm != LLGMM_CIPHER_NA)
+  {
+    switch (ciphering_algorithm)
+    {
+      case LLGMM_CIPHER_NO_ALGORITHM:
+        TRACE_0_INFO("No cipher algorithm used!");
+        break;
+
+      case LLGMM_CIPHER_GPRS_A5_1:
+        TRACE_0_INFO("Cipher algorithm GEA/1 used!");
+        break;
+
+      case LLGMM_CIPHER_GPRS_A5_2:
+        TRACE_0_INFO("Cipher algorithm GEA/2 used!");
+        break;
+
+      default:
+        TRACE_ERROR("Unknown Cipher algorithm used!");
+        break;
+    }
+
+    /*
+     * Set IOV default values, if kc is changed to a different value
+     */
+#ifdef LL_2to1
+    if ( memcmp (&(llc_data->kc), &kc, sizeof(T_LLGMM_llgmm_kc)) )
+#else
+    if ( memcmp (&(llc_data->kc), &kc, sizeof(T_llgmm_kc)) )
+#endif
+    {
+      TRACE_0_INFO( "kc changed" );
+#ifdef LL_2to1
+      memcpy (&(llc_data->kc), &kc, sizeof(T_LLGMM_llgmm_kc));
+#else
+      memcpy (&(llc_data->kc), &kc, sizeof(T_llgmm_kc));
+#endif
+    
+      /*
+       * Apply the default value of IOV-UI in case no negotiation
+       * is started by the SGSN.
+       * <R.LLC.LLC_PAR.A.016>
+       */
+      llc_data->iov_ui                       = LLC_IOV_UI_ALL_SAPIS;
+
+      /*
+       * Apply the default value of IOV-I in case no negotiation
+       * is started by the SGSN.
+       * <R.LLC.LLC_PAR.A.018>
+       */
+#ifdef LL_2to1
+      llc_data->iov_i_base[IMAP(PS_SAPI_3)]  = LLC_IOV_I_SAPI_3;
+      llc_data->iov_i_base[IMAP(PS_SAPI_5)]  = LLC_IOV_I_SAPI_5;
+      llc_data->iov_i_base[IMAP(PS_SAPI_9)]  = LLC_IOV_I_SAPI_9;
+      llc_data->iov_i_base[IMAP(PS_SAPI_11)] = LLC_IOV_I_SAPI_11;
+#else
+      llc_data->iov_i_base[IMAP(LL_SAPI_3)]  = LLC_IOV_I_SAPI_3;
+      llc_data->iov_i_base[IMAP(LL_SAPI_5)]  = LLC_IOV_I_SAPI_5;
+      llc_data->iov_i_base[IMAP(LL_SAPI_9)]  = LLC_IOV_I_SAPI_9;
+      llc_data->iov_i_base[IMAP(LL_SAPI_11)] = LLC_IOV_I_SAPI_11;
+#endif
+    }
+
+    /*
+     * Set new ciphering algorithm
+     */
+    llc_data->ciphering_algorithm           = ciphering_algorithm;
+  }
+  else
+  {
+    TRACE_0_INFO("Cipher algorithm not changed");
+  }
+  
+  return;
+} /* llme_init_cipher() */