diff src/g23m-gprs/llc/llc_t200f.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/llc/llc_t200f.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,347 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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 (T200-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef LLC_T200F_C
+#define LLC_T200F_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_f.h"      /* to get the global function */
+#include "llc_t200f.h"  /* to get local typedef's and defines */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : t200_init
++------------------------------------------------------------------------------
+| Description : This procedure initialises all necessary variables of 
+|               timer_t200 for all SAPIs.
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void t200_init (void)
+{ 
+  UBYTE inc;
+
+
+  TRACE_FUNCTION( "t200_init" );
+
+  /*
+   * Initialise timer data structures and initial state of every incarnation.
+   * The timer length is not set in this procedure, it is instead initialised
+   * by llc_init_parameters().
+   */
+  for (inc = 0; inc < T200_NUM_INC; inc++)
+  {
+    SWITCH_SERVICE (llc, t200, inc);
+
+    /*
+     * Free old used resources (in case of an LLC restart):
+     * memory, stored primitives, running timer.
+     */
+    t200_stop();
+
+  }
+
+  SWITCH_SERVICE (llc, t200, 0);
+  INIT_STATE (T200_0, T200_TLLI_UNASSIGNED);
+
+  SWITCH_SERVICE (llc, t200, 1);
+  INIT_STATE (T200_1, T200_TLLI_UNASSIGNED);
+  
+  SWITCH_SERVICE (llc, t200, 2);
+  INIT_STATE (T200_2, T200_TLLI_UNASSIGNED);
+  
+  SWITCH_SERVICE (llc, t200, 3);
+  INIT_STATE (T200_3, T200_TLLI_UNASSIGNED);
+  
+  SWITCH_SERVICE (llc, t200, 4);
+  INIT_STATE (T200_4, T200_TLLI_UNASSIGNED);
+  
+  SWITCH_SERVICE (llc, t200, 5);
+  INIT_STATE (T200_5, T200_TLLI_UNASSIGNED);
+
+  return;
+} /* t200_init() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : t200_start
++------------------------------------------------------------------------------
+| Description : This procedure starts timer T200 for the current sapi and 
+|               stores a copy of the given frame and the originator. The 
+|               frame address is a pointer to a LL_UNITDATA_REQ primitive 
+|               which is associated with T200 and will be freed by the lower 
+|               layers after transmission. Therefore a copy has to be stored. 
+|               cause is the associated GRLC_DATA_REQ!cause for the frame. 
+|               originator is an identifier of the service who started the 
+|               timer. The frame is returned to the service (originator) 
+|               which started T200 with the corresponding EXPIRED signal.
+|
+| Parameters  : frame       - a pointer to the frame that shall be associated 
+|                             with the timer
+|               cause       - RLC/MAC cause of frame
+|               originator  - the service which started the timer, must not be
+|                             NO_SERVICE
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void t200_start 
+(
+#ifdef LL_DESC 
+ T_LL_UNITDESC_REQ *frame, 
+#else
+ T_LL_UNITDATA_REQ *frame, 
+#endif
+ UBYTE cause,
+ T_SERVICE originator
+)
+{
+#ifdef LL_DESC
+  USHORT  frame_len, frame_offset;
+  UBYTE   *prim_buf, *frame_buf;
+  T_desc3 *desc3, *frame_desc3;
+#endif /* LL_DESC */
+
+  TRACE_FUNCTION( "t200_start" );
+
+#ifdef LL_DESC
+  /*
+   * Start timer T200 for the current SAPI.
+   */
+#ifdef _SIMULATION_
+  /*
+   * In simulation mode, use always a timer value of 5 seconds.
+   */
+  vsi_t_start (VSI_CALLER
+    (USHORT)(TIMER_T200_BASE + UIMAP(llc_data->current_sapi)),
+    5000);
+#else
+  vsi_t_start (VSI_CALLER
+    (USHORT)(TIMER_T200_BASE + UIMAP(llc_data->current_sapi)),
+    llc_data->t200->length);
+#endif /* _SIMULATION_ */
+
+  {
+    /*
+     * Allocate copy of frame which shall be stored. Because an exact copy
+     * of frame shall be stored, the SDU offset must be added to the used
+     * SDU length.
+     */
+    frame_desc3    = (T_desc3*)frame->desc_list3.first;
+    frame_len      = frame->desc_list3.list_len;
+    frame_offset   = frame_desc3->offset;
+    {    
+      PALLOC(ll_unitdesc_req, LL_UNITDESC_REQ);
+      desc3 = llc_palloc_desc(frame_len, frame_offset);/* Only one desc3 and buffer are allocated */
+      
+      /*
+       * Copy primitive contents to newly allocated primitive. SDU contents
+       * have to be copied separately, because they are allocated dynamically
+       * and not of known size in the primitve structure:
+       * First copy primitive with SDU, but only sdu.l_buf/o_buf and first octet
+       * of sdu.buf.
+       * Then memcpy actual SDU content with size defined in sdu.l_buf.
+       */
+      *ll_unitdesc_req = *frame;
+      ll_unitdesc_req->desc_list3.first = (ULONG)desc3;
+
+      prim_buf  = (UBYTE*)desc3->buffer;
+      frame_buf = (UBYTE*)frame_desc3->buffer; 
+
+      memcpy (&(prim_buf[desc3->offset]), 
+        &(frame_buf[frame_offset]), frame_len);
+
+      /*
+       * Store the given frame address, RLC/MAC cause, and the originator 
+       * for this timer.
+       */
+      llc_data->t200->frame       = ll_unitdesc_req;
+      llc_data->t200->cause       = cause;
+      llc_data->t200->originator  = originator;
+    }
+  }
+
+  return;
+
+#else /* LL_DESC */
+  /*
+   * Start timer T200 for the current SAPI.
+   */
+#ifdef _SIMULATION_
+  /*
+   * In simulation mode, use always a timer value of 5 seconds.
+   */
+  vsi_t_start (VSI_CALLER
+    (USHORT)(TIMER_T200_BASE + UIMAP(llc_data->current_sapi)),
+    5000);
+#else
+  vsi_t_start (VSI_CALLER
+    (USHORT)(TIMER_T200_BASE + UIMAP(llc_data->current_sapi)),
+    llc_data->t200->length);
+#endif /* _SIMULATION_ */
+
+  {
+    /*
+     * Allocate copy of frame which shall be stored. Because an exact copy
+     * of frame shall be stored, the SDU offset must be added to the used
+     * SDU length.
+     */
+    PALLOC_SDU (ll_unitdata_req, LL_UNITDATA_REQ, 
+      (USHORT)(frame->sdu.o_buf + frame->sdu.l_buf));
+
+    /*
+     * Copy primitive contents to newly allocated primitive. SDU contents
+     * have to be copied separately, because they are allocated dynamically
+     * and not of known size in the primitve structure:
+     * First copy primitive with SDU, but only sdu.l_buf/o_buf and first octet
+     * of sdu.buf.
+     * Then memcpy actual SDU content with size defined in sdu.l_buf.
+     */
+    *ll_unitdata_req = *frame;
+    memcpy (&(ll_unitdata_req->sdu.buf[ll_unitdata_req->sdu.o_buf/8]), 
+      &(frame->sdu.buf[frame->sdu.o_buf/8]), frame->sdu.l_buf/8);
+
+    /*
+     * Store the given frame address, RLC/MAC cause, and the originator 
+     * for this timer.
+     */
+    llc_data->t200->frame       = ll_unitdata_req;
+    llc_data->t200->cause       = cause;
+    llc_data->t200->originator  = originator;
+  }
+
+  return;
+#endif /* LL_DESC */
+} /* t200_start() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : t200_stop
++------------------------------------------------------------------------------
+| Description : This procedure stops (resets) timer T200 for the current sapi. 
+|               The associated frame address and the originator of T200 are 
+|               discarded (i.e. the allocated primitive of the frame is freed).
+|
+| Parameters  : 
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void t200_stop (void)
+{ 
+  TRACE_FUNCTION( "t200_stop" );
+
+  /*
+   * Stop timer T200 for the current SAPI.
+   */
+  vsi_t_stop (VSI_CALLER
+    (USHORT)(TIMER_T200_BASE + UIMAP(llc_data->current_sapi)));
+
+  /*
+   * Free stored primitive.
+   */
+  if (llc_data->t200->frame)
+  {
+#ifdef LL_DESC
+    /*
+     * The descriptor contents of the primitive structure
+     * must be freed as well.
+     */
+    llc_cl_desc3_free((T_desc3*)llc_data->t200->frame->desc_list3.first);
+#endif /* LL_DESC */
+    PFREE (llc_data->t200->frame);
+  }
+
+  /*
+   * Delete timer data of the timer for the given SAPI.
+   */
+  llc_data->t200->frame       = NULL;
+  llc_data->t200->originator  = NO_SERVICE;
+  llc_data->t200->cause       = 0;
+
+  return;
+} /* t200_stop() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : t200_get_timer_data
++------------------------------------------------------------------------------
+| Description : This procedure returns frame address, frame cause, and the
+|               originator identifier for timer T200 of the current sapi. 
+|               (see procedure t200_start)
+|
+| Parameters  : frame       - will be set to the frame pointer which is stored 
+|                             for the timer, must be a valid pointer
+|               cause       - will be set to the RLC/MAC frame cause
+|               originator  - will be set to the originating service for the
+|                             timer, must be a valid pointer
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void t200_get_timer_data 
+(
+#ifdef LL_DESC 
+  T_LL_UNITDESC_REQ **frame, 
+#else
+  T_LL_UNITDATA_REQ **frame, 
+#endif
+                                 UBYTE *cause,
+                                 T_SERVICE *originator)
+{
+  TRACE_FUNCTION( "t200_get_timer_data" );
+  
+  /*
+   * Get timer data of the timer for the given SAPI.
+   */
+  *frame      = llc_data->t200->frame;
+  *cause      = llc_data->t200->cause;
+  *originator = llc_data->t200->originator;
+
+  return;
+} /* t200_get_timer_data() */