diff src/g23m-gsm/ss/ss_for.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-gsm/ss/ss_for.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,402 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-PS (6147)
+|  Modul   :  SS_FOR
++----------------------------------------------------------------------------- 
+|  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 defines the functions for the formatter
+|             capability of the module supplementary services.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef SS_FOR_C
+#define SS_FOR_C
+
+#define ENTITY_SS
+
+/*==== INCLUDES ===================================================*/
+#if defined (NEW_FRAME)
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "typedefs.h"
+#include "pcm.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_ss.h"
+#include "mon_ss.h"
+#include "pei.h"
+#include "tok.h"
+#include "ss.h"
+
+#else
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include "stddefs.h"
+#include "pcm.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_ss.h"
+#include "mon_ss.h"
+#include "vsi.h"
+#include "pei.h"
+#include "tok.h"
+#include "ss.h"
+
+#endif
+
+/*==== EXPORT =====================================================*/
+
+/*==== PRIVAT =====================================================*/
+
+/*==== VARIABLES ==================================================*/
+#ifdef TI_PS_HCOMM_CHANGE
+#if defined (NEW_FRAME)
+EXTERN T_HANDLE ss_handle;
+#endif
+#else
+#if defined (NEW_FRAME)
+EXTERN T_HANDLE hCommMM;                 /* MM   Communication       */
+EXTERN T_HANDLE ss_handle;
+#else
+EXTERN T_VSI_CHANDLE  hCommMM;         /* MM   Communication       */
+#endif
+#endif /* TI_PS_HCOMM_CHANGE */
+
+#if !defined (SHARED_CCD_BUF)
+GLOBAL UBYTE               _decodedMsg[MAX_MSTRUCT_LEN_SS];
+#else
+GLOBAL UBYTE *             _decodedMsg;
+#endif
+#ifdef SS_TEST
+EXTERN UBYTE  trc[];
+#endif
+
+/*==== FUNCTIONS ==================================================*/
+
+/*
+ * -------------------------------------------------------------------
+ * Procedures
+ * -------------------------------------------------------------------
+ */
+
+/*
++-----------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_FOR                        |
+| STATE   : code                ROUTINE : for_mmss_establish_n_data_ind |
++-----------------------------------------------------------------------+
+
+  PURPOSE : This common routine process the primitives MMSS_ESTATBLISH_IND 
+            and MMSS_DATA_IND
+
+*/
+
+
+LOCAL void for_mmss_establish_n_data_ind(T_PRIM *prim)
+{
+  GET_INSTANCE_DATA;
+
+  CHAR   *msg_type;
+  BOOL   invalid_msg = FALSE;
+  T_sdu  *sdu;
+  
+  TRACE_FUNCTION ("for_mmss_establish_n_data_ind()");
+  
+  if(prim->custom.opc EQ MMSS_ESTABLISH_IND)
+  {
+    sdu = &((T_MMSS_ESTABLISH_IND  *)P2D(prim))->sdu;
+    ss_data->est_flag              = TRUE;
+  }
+  else
+  {
+    sdu = &((T_MMSS_DATA_IND  *)P2D(prim))->sdu;
+    ss_data->est_flag  =  FALSE;
+  }
+  
+  if ((ss_data->ti & 7) NEQ 7)
+  {
+    sdu->o_buf += 8;
+    sdu->l_buf -= 8;
+  
+    CCD_START;
+  
+    if(ccd_decodeMsg (CCDENT_SS,
+                      DOWNLINK,
+                      (T_MSGBUF *) sdu, 
+                      (UBYTE    *) _decodedMsg,
+                      NOT_PRESENT_8BIT) NEQ ccdOK )
+    {
+      USHORT parlist[6];      
+      UBYTE  prev_err;
+      UBYTE  ccd_err;
+      memset (parlist,0, sizeof (parlist));
+      ccd_err = ccd_getFirstError (CCDENT_SS, parlist);      
+     /*
+     * Error Handling
+     */
+        ss_data->error = CAUSE_UNSPECIFIED; /*Normal*/
+        do      /* Read errors */
+        {
+          switch (ccd_err)
+          {
+            case ERR_INVALID_MID:     /* Send RELEASE REQUEST message with cause #97 */
+             /*TS TS 24.010 Section 3.7.4 */
+               send_rel_comp(CAUSE_MESSAGE_TYPE_NOT_IMPLEM);
+               PFREE(P2D(prim)); 
+              CCD_END;
+              return;
+      
+            case ERR_COMPREH_REQUIRED:    /* comprehension required     */
+            case ERR_MAND_ELEM_MISS:      /* Mandatory elements missing */
+          case ERR_MSG_LEN:             /* Message Length exceeds its limit */
+              /*TS TS 24.010 Section 3.7.5 */
+              ss_data->error = CAUSE_INVALID_MAND_INFO;
+              break;
+
+#if defined (WIN32)
+              /* This part is interesting only in implementation and testing; may be 
+               * included if specific handling for specific errors is required in 
+               * future releases 
+               */
+          case ERR_IE_NOT_EXPECTED:
+               TRACE_ERROR("CCD ERROR: IE not expected. properly an R99 optional element like cell notification, eplmn, or t3302");
+               break;
+      
+            case ERR_IE_SEQUENCE:
+              TRACE_EVENT_P1("Wrong sequence of IE,  CCD error code = %u", ccd_err);
+              break;
+      
+            case ERR_MAX_IE_EXCEED:
+              TRACE_EVENT_P1("Maximum amount of repeatable IE has exceeded,  CCD error code = %u", ccd_err);
+              break;
+      
+            case ERR_MAX_REPEAT:
+              TRACE_EVENT_P1("A repeatable IE occurs too often in the message,  CCD error code = %u", ccd_err);
+              break;
+     
+            case ERR_PATTERN_MISMATCH:
+            case ERR_INVALID_TYPE:
+              TRACE_EVENT_P1 ("MNC decoding erroneous = %u", ccd_err);
+              break;
+#endif /* #if defined (WIN32) */
+            default:
+#if defined (WIN32)
+              TRACE_EVENT_P1 ("Unexpected warnings/errors = %u", ccd_err);
+#endif /* #if defined (WIN32) */
+              break; /* No or non-interesting error */
+          }
+              prev_err = ccd_err;
+              ccd_err = ccd_getNextError (CCDENT_SS, parlist);             
+      }while ( prev_err NEQ ERR_NO_MORE_ERROR                       
+                  AND !ss_check_critical_error(ss_data->error) );  
+    }
+
+    switch (_decodedMsg[0])
+    {
+      case D_SS_FACILITY:
+           ss_d_ss_facility ();
+        msg_type = "D_SS_FACILITY";
+        break;
+      case D_SS_REGISTER:
+           ss_d_ss_register ();
+        msg_type = "D_SS_REGISTER";
+        break;
+      case B_SS_REL_COMP:
+           ss_b_ss_rel_comp ();
+        msg_type = "B_SS_REL_COMP";
+        break;
+      default:
+        /* This should NOT be reached */
+        TRACE_FUNCTION("**UNKNOWN MESSAGE ID**");
+        msg_type = "UNKNOWN MESSAGE";
+        invalid_msg = TRUE;
+        break;
+    }
+    if(!invalid_msg)
+    {
+      TRACE_BINDUMP( ss_handle,
+                     TC_USER4,
+                     msg_type,
+                     (&(sdu->buf[0]))+(((sdu->o_buf)>>3) -1),
+                     (((sdu->l_buf)>>3) +1));
+    }
+
+    CCD_END;
+  }
+  else  if(prim->custom.opc EQ MMSS_ESTABLISH_IND)
+  {
+    /* Establishment with a reserved TI. Release the MM connection */
+    PALLOC (mmss_release_req, MMSS_RELEASE_REQ); /* T_MMSS_RELEASE_REQ */
+    mmss_release_req->ti = ss_data->ti;
+    PSENDX (MM, mmss_release_req);
+  }
+
+  PFREE(P2D(prim));
+}
+
+
+
+/*
+ * -------------------------------------------------------------------
+ * PRIMITIVE Processing functions
+ * -------------------------------------------------------------------
+ */
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_FOR                     |
+| STATE   : code                ROUTINE : for_mmss_establish_ind     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MMSS_ESTATBLISH_IND.
+
+*/
+
+GLOBAL void for_mmss_establish_ind (T_MMSS_ESTABLISH_IND *mmss_establish_ind_org)
+{
+  GET_INSTANCE_DATA;	
+
+  /* Enable the PCO to correctly decode the message */
+  PPASS (mmss_establish_ind_org, mmss_establish_ind, MMSS_ESTABLISH_IND);
+
+  TRACE_FUNCTION ("for_mmss_establish_ind()");
+
+  GET_PD (mmss_establish_ind->sdu, ss_data->pd);
+  GET_TI (mmss_establish_ind->sdu, ss_data->ti);
+
+  ss_data->ti += ((ss_data->ti > 7) ? -8 : 8);
+
+    for_mmss_establish_n_data_ind((T_PRIM *)D2P(mmss_establish_ind));
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_FOR                     |
+| STATE   : code                ROUTINE : for_mmss_data_ind          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the primitive MMSS_DATA_IND.
+
+*/
+
+GLOBAL void for_mmss_data_ind (T_MMSS_DATA_IND *mmss_data_ind_org)
+{
+  GET_INSTANCE_DATA;	
+
+  /* Enable the PCO to correctly decode the message */
+  PPASS (mmss_data_ind_org, mmss_data_ind, MMSS_DATA_IND);
+
+  TRACE_FUNCTION ("for_mmss_data_ind()");
+
+  GET_PD (mmss_data_ind->sdu, ss_data->pd);
+  GET_TI (mmss_data_ind->sdu, ss_data->ti);
+
+  ss_data->ti += ((ss_data->ti > 7) ? -8 : 8);
+
+    for_mmss_establish_n_data_ind((T_PRIM *)D2P(mmss_data_ind));
+}
+
+/*
+ * -------------------------------------------------------------------
+ * SIGNAL Processing functions
+ * -------------------------------------------------------------------
+ */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : SS_FOR                     |
+| STATE   : code                ROUTINE : ss_for_data_req            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process the signal DATA_REQ.
+
+*/
+
+GLOBAL void ss_for_data_req (USHORT bit_size_message)
+{
+  GET_INSTANCE_DATA;
+  CHAR *msg_type;
+  BOOL invalid_msg = FALSE;
+  PALLOC_SDU (mmss_data_req, MMSS_DATA_REQ, bit_size_message);
+
+  TRACE_FUNCTION ("ss_for_data_req()");
+
+  mmss_data_req->sdu.l_buf = bit_size_message;
+  mmss_data_req->sdu.o_buf = ENCODE_OFFSET;
+
+  if (ccd_codeMsg (CCDENT_SS,
+                   UPLINK,
+                   (T_MSGBUF *) &mmss_data_req->sdu,
+                   (UBYTE    *) _decodedMsg,
+                   NOT_PRESENT_8BIT)
+      EQ ccdOK)
+  {
+    SET_PD (mmss_data_req->sdu, PD_SS);
+    SET_TI (mmss_data_req->sdu, ss_data->ti);
+
+    mmss_data_req->sdu.o_buf -= 8;
+    mmss_data_req->sdu.l_buf += 8;
+
+    /* Trace Bindump() for uplink messages.
+    * called from mnss_facility_req / mnss_end_req / mnss_esatblish_req etc
+    */
+    switch (_decodedMsg[0])
+    {
+      case U_SS_FACILITY:
+      msg_type = "U_SS_FACILITY";
+      break;
+      case U_SS_REGISTER:
+      msg_type = "U_SS_REGISTER";
+      break;
+      case B_SS_REL_COMP:
+      msg_type = "B_SS_REL_COMP";
+      break;
+      default:
+      TRACE_FUNCTION("**UNKNOWN MESSAGE ID**");
+      msg_type = "UNKNOWN MESSAGE";
+      invalid_msg = TRUE;
+      break;
+    }
+    if(!invalid_msg)
+    {
+      TRACE_BINDUMP( ss_handle,
+                     TC_USER4,
+                     msg_type,
+                     (&(mmss_data_req->sdu.buf[0]))+(((mmss_data_req->sdu.o_buf)>>3) -1),
+                     (((mmss_data_req->sdu.l_buf)>>3) +1));
+    }
+
+    PSENDX (MM, mmss_data_req);
+  }
+  else
+  {
+    PFREE (mmss_data_req);
+  }
+}
+
+#endif /* #ifndef SS_FOR_C */