diff src/g23m-gprs/llc/llc_txl.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_txl.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,243 @@
+/* 
++----------------------------------------------------------------------------- 
+|  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 labels
+|             in the SDL-documentation (TX-statemachine) that are called from
+|             more than one diagram/place.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef LLC_TXL_C
+#define LLC_TXL_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_uitxs.h"  /* to get signal interface to UITX */
+#include "llc_itxs.h"  /* to get signal interface to ITX */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+#ifdef TRACE_EVE
+
+LOCAL void tx_trace_outprim_para(UBYTE sapi, T_sdu *frame)
+{
+  int len = BYTELEN(frame->l_buf);
+  
+  if( (len >= U_CTRL_MIN_OCTETS) && ((frame->buf[(frame->o_buf/8)+1] & U_FRAME_MASK) EQ U_FRAME_ID) )
+  {
+    switch (frame->buf[(frame->o_buf/8)+1] & 0x0F)
+    {
+      case U_FRAME_DM:   TRACE_2_OUT_PARA("DM s:%d len:%d", sapi, len);   break;
+      case U_FRAME_DISC: TRACE_2_OUT_PARA("DISC s:%d len:%d", sapi, len); break;
+      case U_FRAME_UA:   TRACE_2_OUT_PARA("UA s:%d len:%d", sapi, len);   break;
+      case U_FRAME_SABM: TRACE_2_OUT_PARA("SABM s:%d len:%d", sapi, len); break;
+      case U_FRAME_FRMR: TRACE_2_OUT_PARA("FRMR s:%d len:%d", sapi, len); break;
+      case U_FRAME_XID:  TRACE_2_OUT_PARA("XID s:%d len:%d", sapi, len);  break;
+      default:           TRACE_2_OUT_PARA("U ??? s:%d len:%d", sapi, len);break;
+    }
+  }
+  else 
+  if( (len >= UI_CTRL_MIN_OCTETS) && ((frame->buf[(frame->o_buf/8)+1] & UI_FRAME_MASK) EQ UI_FRAME_ID) )
+  {
+    T_FRAME_NUM nr;
+
+    USHORT cipher = (USHORT)(frame->buf[(frame->o_buf/8)+2] >> 1) & 0x0001;
+
+    nr  = (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+1] & 0x07) << 6;
+    nr |= (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+2] >> 2);
+
+    TRACE_4_OUT_PARA("UI s:%d len:%d nr:%d c:%d", sapi, len, nr, cipher);
+  }
+  else
+  if ((len >= I_CTRL_MIN_OCTETS) && (frame->buf[(frame->o_buf/8)+1] & I_FRAME_MASK) EQ I_FRAME_ID)
+  {
+    T_FRAME_NUM ns, nr;
+    ns = (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+1] & 0x1F) << 4;
+    ns |= (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+2] >> 4);
+
+    nr = (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+2] & 0x07) << 6;
+    nr |= (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+3] >> 2);
+
+    /*
+     * Determine the command of the I frame (S1 & S2 bits)
+     */
+    switch (frame->buf[(frame->o_buf/8)+3] & 0x03)
+    {
+      case I_FRAME_RR:  TRACE_4_OUT_PARA("I-RR s:%d len:%d nr:%d ns:%d", sapi, len, nr, ns);  break;
+      case I_FRAME_ACK: TRACE_4_OUT_PARA("I-ACK s:%d len:%d nr:%d ns:%d", sapi, len, nr, ns); break;
+      case I_FRAME_RNR: TRACE_4_OUT_PARA("I-RNR s:%d len:%d nr:%d ns:%d", sapi, len, nr, ns); break;
+      case I_FRAME_SACK:TRACE_4_OUT_PARA("I-SACK s:%d len:%d nr:%d ns:%d", sapi, len, nr, ns);break;
+      default:          TRACE_2_OUT_PARA("I ??? s:%d len:%d", sapi, len);                     break;
+    }
+  }
+  else 
+  if( (len >= S_CTRL_MIN_OCTETS) && (frame->buf[(frame->o_buf/8)+1] & S_FRAME_MASK) EQ S_FRAME_ID)
+  {
+    T_FRAME_NUM nr;
+
+    nr = (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+1] & 0x07) << 6;
+    nr |= (T_FRAME_NUM)(frame->buf[(frame->o_buf/8)+2] >> 2);
+
+    switch (frame->buf[(frame->o_buf/8)+2] & 0x03)
+    {
+      case I_FRAME_RR:  TRACE_3_OUT_PARA("S-RR s:%d len:%d nr:%d", sapi, len, nr);  break;
+      case I_FRAME_ACK: TRACE_3_OUT_PARA("S-ACK s:%d len:%d nr:%d", sapi, len, nr); break;
+      case I_FRAME_RNR: TRACE_3_OUT_PARA("S-RNR s:%d len:%d nr:%d", sapi, len, nr); break;
+      case I_FRAME_SACK:TRACE_3_OUT_PARA("S-SACK s:%d len:%d nr:%d", sapi, len, nr);break;
+      default:          TRACE_2_OUT_PARA("S ??? s:%d len:%d", sapi, len);           break;
+    }
+  }
+  else
+  {
+    TRACE_2_OUT_PARA("??? s:%d len:%d", sapi, len);
+  }
+} /* tx_trace_outprim_para() */
+
+#endif
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : tx_label_s_data
++------------------------------------------------------------------------------
+| Description : Describes label S_DATA
+|
+| Parameters  : rx_service    - indicates the service to receive a READY_IND
+|                               signal, or NO_SERVICE
+|               grlc_data_req  - a valid pointer to a GRLC_DATA_REQ primitive
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void tx_label_s_data (T_SERVICE rx_service, 
+                             T_GRLC_DATA_REQ *grlc_data_req)
+{ 
+  UBYTE sapi = grlc_data_req->sapi;
+
+  TRACE_FUNCTION( "tx_label_s_data" );
+
+#ifdef TRACE_EVE
+  tx_trace_outprim_para (sapi, &grlc_data_req->sdu);
+#endif  
+
+  PSEND (hCommGRLC, grlc_data_req);
+
+  SET_STATE (TX, TX_TLLI_ASSIGNED_NOT_READY);
+
+  /*
+   * Recursion possible. Therefore send ready indication after all!
+   */
+  if (rx_service EQ SERVICE_UITX)
+  {
+    SWITCH_LLC (sapi);
+    sig_tx_uitx_ready_ind();
+  }
+  else if (rx_service EQ SERVICE_ITX)
+  {
+    SWITCH_LLC (sapi);
+    sig_tx_itx_ready_ind();
+  }
+
+  return;
+} /* tx_label_s_data() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : tx_label_s_unitdata
++------------------------------------------------------------------------------
+| Description : Describes label S_UNITDATA
+|
+| Parameters  : rx_service        - indicates the service to receive a 
+|                                   READY_IND signal, or NO_SERVICE
+|               grlc_unitdata_req  - a valid pointer to a GRLC_UNITDATA_REQ 
+|                                   primitive
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void tx_label_s_unitdata (T_SERVICE rx_service, 
+                                 T_GRLC_UNITDATA_REQ *grlc_unitdata_req)
+{ 
+  UBYTE sapi = grlc_unitdata_req->sapi;
+
+  TRACE_FUNCTION( "tx_label_s_unitdata" );
+
+#ifdef TRACE_EVE
+  tx_trace_outprim_para (sapi, &grlc_unitdata_req->sdu);
+#endif  
+
+  PSEND (hCommGRLC, grlc_unitdata_req);
+
+  SET_STATE (TX, TX_TLLI_ASSIGNED_NOT_READY);
+
+  /*
+   * Handle ready indication at last! Recursion possible!
+   */
+  if (rx_service EQ SERVICE_UITX)
+  {
+    SWITCH_LLC (sapi);
+    sig_tx_uitx_ready_ind();
+  }
+
+  return;
+} /* tx_label_s_unitdata() */
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : tx_label_s_removed
++------------------------------------------------------------------------------
+| Description : Describes label S_REMOVED
+|
+| Parameters  : rx_service        - indicates the service to receive a 
+|                                   READY_IND signal, or NO_SERVICE
+|               sapi              - sapi of removed entry
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void tx_label_s_removed (T_SERVICE rx_service, UBYTE sapi)
+{ 
+  TRACE_FUNCTION( "tx_label_s_removed" );
+
+  if (rx_service EQ SERVICE_UITX)
+  {
+    SWITCH_LLC (sapi);
+    sig_tx_uitx_ready_ind();
+  }
+  else if (rx_service EQ SERVICE_ITX)
+  {
+    SWITCH_LLC (sapi);
+    sig_tx_itx_ready_ind();
+  }
+
+  return;
+} /* tx_label_s_removed() */