diff src/g23m-gprs/gmm/gmm_rxp.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-gprs/gmm/gmm_rxp.c	Thu Oct 13 04:24:13 2016 +0000
@@ -0,0 +1,377 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GPRS (8441)
+|  Modul   :  gmm_rxp.c
++----------------------------------------------------------------------------- 
+|  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 GMM and implements all 
+|             functions to handles the incoming primitives as described in 
+|             the SDL-documentation (RX-statemachine)
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef GMM_RXP_C
+#define GMM_RXP_C
+#endif
+
+#define ENTITY_GMM
+
+/*==== 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 "ccdapi.h"     /* to get CCD API */
+#include "cnf_gmm.h"    /* to get cnf-definitions */
+#include "mon_gmm.h"    /* to get mon-definitions */
+#include "prim.h"       /* to get the definitions of used SAP and directions */
+#include "gmm.h"        /* to get the global entity definitions */
+
+#include "gmm_kerns.h"  /* to get some signals */
+#include "gmm_rxf.h"    /* to get some functions */
+
+#include  <string.h>    /* to get memset */
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+
+/*
++------------------------------------------------------------------------------
+| Function    : rx_ll_unitdata_ind
++------------------------------------------------------------------------------
+| Description : Handles the primitive LL_UNITDATA_IND
+|
+| Parameters  : *ll_unitdata_ind - Ptr to primitive payload
+|
++------------------------------------------------------------------------------
+*/
+GLOBAL void rx_ll_unitdata_ind ( T_LL_UNITDATA_IND *ll_unitdata_ind_ )
+{ 
+  UBYTE pd;
+  UBYTE tiskip;
+  UBYTE ccdenttype;
+#ifndef GMM_TCS4
+  U8   *payload;
+  U16   length;
+#endif
+  
+  GMM_TRACE_FUNCTION( "rx_ll_unitdata_ind" );
+  {
+  PPASS (ll_unitdata_ind_, ll_unitdata_ind, LL_UNITDATA_IND );
+
+  
+  switch( GET_STATE( RX ) )
+  {
+    case RX_READY:
+      /*
+       * get the Protokol discriminator
+       */
+      GET_PD (ll_unitdata_ind->sdu, pd);
+     
+      if ( pd == PD_SM )
+      {
+        /*
+         * macro PPASS (ll_unitdata_ind,
+         *              gmmsm_unitdata_ind,
+         *              GMMSM_UNITDATA_IND);
+         * is not possible, because o f different parameters
+         */
+#ifdef GMM_TCS4
+        PALLOC_SDU ( gmmsm_unitdata_ind, MMPM_UNITDATA_IND, (USHORT)(ll_unitdata_ind->sdu.l_buf+ll_unitdata_ind->sdu.o_buf) );
+#else
+        PALLOC_SDU ( gmmsm_unitdata_ind, GMMSM_UNITDATA_IND, (USHORT)(ll_unitdata_ind->sdu.l_buf+ll_unitdata_ind->sdu.o_buf) );
+#endif
+        gmmsm_unitdata_ind->sdu.l_buf = ll_unitdata_ind->sdu.l_buf;
+        gmmsm_unitdata_ind->sdu.o_buf = ll_unitdata_ind->sdu.o_buf;            
+        memcpy (&gmmsm_unitdata_ind->sdu.buf[0],&ll_unitdata_ind->sdu.buf[0],
+                (gmmsm_unitdata_ind->sdu.l_buf+gmmsm_unitdata_ind->sdu.o_buf+7)/8);
+        
+        PSEND ( hCommSM, gmmsm_unitdata_ind );
+
+        #ifdef TRACE_EVE
+          #ifndef GMM_TCS4
+            switch ( gmmsm_unitdata_ind->sdu.buf[((gmmsm_unitdata_ind->sdu.o_buf)>>3)+1])
+            {
+              case ACTIVATE_PDP_REQ:
+                TRACE_EVENT ( "OPar: ACTIVATE_PDP_REQ");break;
+              case ACTIVATE_PDP_ACC:      
+                TRACE_EVENT ( "OPar: ACTIVATE_PDP_ACC");break;
+              case ACTIVATE_PDP_REJ:      
+                TRACE_EVENT ( "OPar: ACTIVATE_PDP_REJ");break;
+              case REQ_PDP_ACT:      
+                TRACE_EVENT ( "OPar: REQ_PDP_ACT");break;
+              case REQ_PDP_ACT_REJ:      
+                TRACE_EVENT ( "OPar: REQ_PDP_ACT_REJ");break;
+              case MOD_PDP_REQ:      
+                TRACE_EVENT ( "OPar: MOD_PDP_REQ");break;
+              case MOD_PDP_ACC:      
+                TRACE_EVENT ( "OPar: MOD_PDP_ACC");break;
+              case DEACT_PDP_REQ:      
+                TRACE_EVENT ( "OPar: DEACT_PDP_REQ");break;
+              case DEACT_PDP_ACC:      
+                TRACE_EVENT ( "OPar: DEACT_PDP_ACC");break; 
+              case SM_STATUS:      
+                TRACE_EVENT ( "OPar: SM_STATUS");break;
+              default:
+                TRACE_EVENT ( "OPar: SNDCP unknown");break;
+          }
+          #else  /* #ifndef GMM_TCS4 */
+            switch ( gmmsm_unitdata_ind->sdu.buf[((gmmsm_unitdata_ind->sdu.o_buf)>>3)+1])
+            {
+              case ACTIVATE_PDP_CONTEXT_REQUEST:
+                TRACE_EVENT ( "OPar: ACTIVATE_PDP_CONTEXT_REQUEST");break;
+              case ACTIVATE_PDP_CONTEXT_ACCEPT:      
+                TRACE_EVENT ( "OPar: ACTIVATE_PDP_CONTEXT_ACCEPT");break;
+              case ACTIVATE_PDP_CONTEXT_REJECT:      
+                TRACE_EVENT ( "OPar: ACTIVATE_PDP_CONTEXT_REJECT");break;
+              case REQUEST_PDP_CONTEXT_ACTIVATION:      
+                TRACE_EVENT ( "OPar: REQUEST_PDP_CONTEXT_ACTIVATION");break;
+              case REQUEST_PDP_CONTEXT_ACTIVATION_REJECT:      
+                TRACE_EVENT ( "OPar: REQUEST_PDP_CONTEXT_ACTIVATION_REJECT");break;
+              case U_MODIFY_PDP_CONTEXT_REQUEST:      
+                TRACE_EVENT ( "OPar: U_MODIFY_PDP_CONTEXT_REQUEST");break;
+              case U_MODIFY_PDP_CONTEXT_ACCEPT:      
+                TRACE_EVENT ( "OPar: U_MODIFY_PDP_CONTEXT_ACCEPT");break;
+              case DEACTIVATE_PDP_CONTEXT_REQUEST:      
+                TRACE_EVENT ( "OPar: DEACTIVATE_PDP_CONTEXT_REQUEST");break;
+              case DEACTIVATE_PDP_CONTEXT_ACCEPT:      
+                TRACE_EVENT ( "OPar: DEACTIVATE_PDP_CONTEXT_ACCEPT");break; 
+              case SM_STATUS:      
+                TRACE_EVENT ( "OPar: SM_STATUS");break;
+              default:
+                TRACE_EVENT ( "OPar: SNDCP unknown");break;
+			}
+          #endif /* #ifndef GMM_TCS4 */
+      #endif /* _SIMULATION_ */
+        
+        PFREE ( ll_unitdata_ind );
+        GMM_RETURN;
+      }
+      else if ( PD_GMM != pd && PD_TST != pd )
+      {
+        /* 
+         * 04.07 ch. 11.2.3.1.1
+         * "If the Mobile Station receives, on a SAP where it expects standard L3 messages, a
+         * standard L3 message with a protocol discriminator different from those specified in
+         * table 11.2, or for a protocol that it does not support, the Mobile Station shall
+         * ignore the message."
+         */
+        TRACE_ERROR ("message with wrong PD received");
+        
+        PFREE (ll_unitdata_ind);
+        GMM_RETURN;
+      }  
+      GET_TI (ll_unitdata_ind->sdu, tiskip);
+
+      if ( tiskip != SKIP_VALID )
+      {
+        TRACE_ERROR ("SKIP is invalid in reseived GMM meassage");
+        PFREE ( ll_unitdata_ind );
+        GMM_RETURN;
+      }
+      /*
+       * rx_decode_msg
+       */
+      ll_unitdata_ind->sdu.l_buf -= 8;
+      ll_unitdata_ind->sdu.o_buf += 8;
+      ccdenttype = (PD_GMM==pd)?CCDENT_GMM:CCDENT_TST;
+      
+      if (ccdOK != ccd_decodeMsg (ccdenttype,
+                       DOWNLINK,
+                       (T_MSGBUF /*FAR*/ *) &ll_unitdata_ind->sdu,
+                       (UBYTE /*FAR*/ *) _decodedMsg,
+                       NOT_PRESENT_8BIT) 
+         )
+      {
+        /*
+         * Error Handling
+         */
+        USHORT parlist[6];
+        UBYTE  ccd_err;
+
+        /* 
+         * clear parlist
+         */
+        memset (parlist,0, sizeof (parlist));
+        ccd_err = ccd_getFirstError (ccdenttype, parlist);
+
+        /*
+         * Error Handling
+         */
+        do 
+        {
+          switch (ccd_err)
+          {
+            case ERR_COMPREH_REQUIRED:    /* Comprehension required     */
+            case ERR_MAND_ELEM_MISS:      /* Mandatory elements missing */
+              rx_gmm_status (ERRCS_INVALID_M_INFO);
+              TRACE_ERROR( "CCD ERROR: Mandatory elements missing");
+              PFREE (ll_unitdata_ind);
+              GMM_RETURN;
+              /* break; */
+            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_ERROR("wrong sequence of information elements");
+              break;
+            case ERR_MAX_IE_EXCEED:
+              TRACE_ERROR("maximum amount of repeatable information elements has exceeded");
+              break;
+            case ERR_MAX_REPEAT:
+              TRACE_ERROR("a repeatable element occurs too often in the message");
+              break;
+            case ERR_INVALID_MID:     
+              rx_gmm_status (ERRCS_TYPE_INVALID);
+              TRACE_ERROR("the message ID is not correct");
+              PFREE (ll_unitdata_ind);
+              GMM_RETURN;
+            case ERR_INTERNAL_ERROR:
+              TRACE_ERROR("an internal CCD error occured ");
+              rx_gmm_status (ERRCS_MESSAGE_INVALID);            
+              PFREE (ll_unitdata_ind);
+              GMM_RETURN;
+              /* break; */
+            default:
+              TRACE_ERROR( "CCD ERROR: unknown error");
+              break;
+              /* break; */
+					}
+          ccd_err = ccd_getNextError (ccdenttype, parlist);
+        }while(ccd_err NEQ ERR_NO_MORE_ERROR);
+      }
+
+#ifndef GMM_TCS4
+      payload  = &(ll_unitdata_ind->sdu.buf[0]);     /* beginning of buffer      */
+      payload += (ll_unitdata_ind->sdu.o_buf) >> 3;  /*  plus offset (bytes)     */
+      length   = (ll_unitdata_ind->sdu.l_buf) >> 3;  /* length (bytes, bits / 8) */
+#endif
+
+      switch (_decodedMsg[0])
+      {
+        case ATTACH_ACCEPT:
+          TRACE_0_PARA ( "ATTACH_ACC");
+#ifndef GMM_TCS4
+          TRACE_BINDUMP( GMM_handle,
+             TC_USER4,
+             "ATTACH ACCEPT",
+             payload,
+             length);
+#endif
+          sig_rx_kern_att_acc_ind ();
+          break;
+        case ATTACH_REJECT:
+          TRACE_0_PARA ( "ATTACH_REJ");
+#ifndef GMM_TCS4
+          TRACE_BINDUMP( GMM_handle,
+             TC_USER4,
+             "ATTACH REJECT",
+             payload,
+             length);
+#endif
+          sig_rx_kern_att_rej_ind ();
+          break;
+        case D_DETACH_REQUEST:
+          TRACE_0_PARA ( "D_DETACH_REQ");
+          sig_rx_kern_det_req_ind ();
+          break;
+        case D_DETACH_ACCEPT:
+          TRACE_0_PARA ( "D_DETACH_ACC");
+          sig_rx_kern_det_acc_ind ();
+          break;
+        case ROUTING_AREA_UPDATE_ACCEPT:
+          TRACE_0_PARA ( "RAU_ACC");
+#ifndef GMM_TCS4
+          TRACE_BINDUMP( GMM_handle,
+             TC_USER4,
+             "ROUTING AREA UPDATE ACCEPT",
+             payload,
+             length);
+#endif
+          sig_rx_kern_rau_acc_ind ();
+          break;
+        case ROUTING_AREA_UPDATE_REJECT:
+          TRACE_0_PARA ( "RAU_REJ");
+#ifndef GMM_TCS4
+          TRACE_BINDUMP( GMM_handle,
+             TC_USER4,
+             "ROUTING AREA UPDATE REJECT",
+             payload,
+             length);
+#endif
+          sig_rx_kern_rau_rej_ind ();
+          break;
+        case P_TMSI_REALLOCATION_COMMAND:
+          TRACE_0_PARA ( "PTMSI_REALLOC_CMD");
+          sig_rx_kern_realloc_cmd_ind ();
+          break;
+        case AUTHENTICATION_AND_CIPHERING_REQUEST:
+          TRACE_0_PARA ( "A&C_REQ");
+          sig_rx_kern_auth_req_ind ();
+          break;
+        case AUTHENTICATION_AND_CIPHERING_REJECT:
+          TRACE_0_PARA ( "A&C_REJ");
+          sig_rx_kern_auth_rej_ind ();
+          break;
+        case IDENTITY_REQUEST:
+          TRACE_0_PARA ( "ID_REQ");
+          sig_rx_kern_id_req_ind ();
+          break;
+        case GMM_STATUS:
+          TRACE_0_PARA ( "GMM_STATUS");
+          sig_rx_kern_status_ind ();
+          break;
+        case GMM_INFORMATION:
+          TRACE_0_PARA ( "GMM_INFO");
+          sig_rx_kern_info_ind ();
+          break;
+        case GPRS_TEST_MODE_CMD:
+          TRACE_0_PARA ( "GPRS_TEST_MODE_CMD");
+          sig_rx_kern_tst_cmd_ind ();
+          break;
+#ifdef GMM_TCS4
+  #ifdef FF_EGPRS
+        case EGPRS_START_RADIO_BLOCK_LOOPBACK_CMD:
+          TRACE_0_PARA ( "EGPRS_START_RADIO_BLOCK_LOOPBACK_CMD");
+          sig_rx_kern_egprs_loopb_cmd_ind ();
+          break;
+  #endif /*FF_EGPRS*/
+#endif /*GMM_TCS4*/
+        default:
+          /* 
+           * This branch should never be reached
+           */
+          rx_gmm_status ( ERRCS_TYPE_INVALID );
+          TRACE_ERROR( "NO valid GMM message reseived" );
+          break;
+      }
+
+      PFREE (ll_unitdata_ind);
+      break;
+    default:
+      PFREE (ll_unitdata_ind);
+      TRACE_ERROR( "LL_UNITDATA_IND unexpected" );
+      break;
+  }
+  }
+  GMM_RETURN;
+} /* rx_ll_unitdata_ind() */