diff gsm-fw/ccd/ccddata_pdi.c @ 648:970d6199f2c5

gsm-fw/ccd/*.[ch]: initial import from the LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 04 Sep 2014 05:48:57 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/ccd/ccddata_pdi.c	Thu Sep 04 05:48:57 2014 +0000
@@ -0,0 +1,363 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : ccddata_pdi.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 :  contains table with information to decode airmessages 
+|             depending on the carrier-primitive
++----------------------------------------------------------------------------- 
+*/ 
+
+#include "pdi.h"
+#include "ccdtable.h"
+#include "mconst.cdg"
+#include "pconst.cdg"
+
+/* declaration of special ccdmsg preparation handlers */
+int invoke_ccd_setStore(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mphX_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mphp_sing_block_req_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mphp_sing_block_con_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mphp_sing_block_con_edge_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mphp_polling_resp_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mac_data_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int mac_poll_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int rlc_data_0_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+int rlc_data_1_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len);
+
+/* declaration of primitive members to be collected */
+static char* ccd_loadstore_elements[]=
+{
+  "loadstore_val0",
+  "loadstore_val1",
+  NULL
+};
+
+static char* mphX_constrainer[]=
+{
+  "error_flag",
+  NULL
+};
+
+static char* mphp_sing_block_constrainer[]=
+{
+  "purpose",
+  NULL
+};
+
+static char* mphp_sing_block_con_edge_constrainer[]=
+{
+  "purpose",
+  "sb_status",
+  "dl_error",
+  NULL
+};
+
+static char* mphp_polling_resp_constrainer[] =
+{
+  "poll_resp_type",
+  NULL
+};
+
+static char* mac_data_constrainer[] =
+{
+  "block_status",
+  NULL
+};
+
+static char* rlc_data_constrainer[] =
+{
+  "rlc_id",
+  NULL
+};
+
+
+/* decode info filter */
+static T_PDI_DECODEINFO m_dinfo[]={
+  /* type */  /* attrib */ /* prim */ /* entity */ /* mt */ /* pdi_prepare_ccdmsg */ /* primmbr */
+  {PDI_DECODETYPE_L3PDU_N,   "sdu", "PH_*", "", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_L3PDU_N,   "sdu", "MPH_*", "", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_RR_SHORT,   "sdu", "DL_SHORT*", "RR_SHORT", 0xff, NULL, NULL},
+#ifdef DL_DATA_REQ
+#if (DL_DATA_REQ & 0x4000)
+  /* Toggle direction for old-style DL_* primtives */
+  {PDI_DECODETYPE_L3PDU_N,   "sdu", "DL_*", "", 0xff, NULL, NULL},
+#endif
+#endif
+
+  {PDI_DECODETYPE_NOPD_N, "sdu", "XX_CCD_ASN1_DECODE_REQ", "ASN1_MSG", 0xff, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD, "sdu", "XX_CCD_ASN1_CODE_IND", "ASN1_MSG", 0xff, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD_N, "sdu", "XX_DYNARR_DECODE_REQ", "ASN1_MSG", 0xff, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD, "sdu", "XX_DYNARR_CODE_IND", "ASN1_MSG", 0xff, NULL, NULL},  
+  {PDI_DECODETYPE_MAC_H_CHECK,   "dl_block", "MAC_DATA_IND", "GRR", 0xff,
+                                  mac_data_checker, mac_data_constrainer},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "dl_block", "MAC_DATA_IND_EGPRS", "GRR", 0xff,
+                                  mac_data_checker, mac_data_constrainer},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "ul_block", "MAC_EGPRS_DATA_REQ", "GRR", 0xff,
+                                  mac_data_checker, mac_data_constrainer},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "ul_block", "MAC_DATA_REQ", "GRR", 0xff,
+                                  mac_data_checker, mac_data_constrainer},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "ul_block", "MAC_POLL_REQ", "GRR", 0xff,
+                                  mac_poll_checker, mac_data_constrainer},
+  {PDI_DECODETYPE_NOPD,    "sdu", "RRGRR_GPRS_SI13_IND", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD,    "sdu", "RRGRR_IA_IND", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD,    "sdu", "RRGRR_DATA_IND", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD,    "sdu", "RRGRR_IA_DOWNLINK_IND", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_N,  "sdu", "RRGRR_SI_STATUS_IND", "GRR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_N,  "sdu", "TB_NCELL_SI_DATA_IND", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD,    "sdu", "RRGRR_IAEXT_IND", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD,    "sdu", "RRGRR_DATA_REQ", "RR", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_N,  "sdu", "TB_SCELL_SI_DATA_IND", "RR", 0xff, NULL, NULL},
+#ifdef MPHP_DATA_IND
+/* toggle direction for old 16bit MPHP* */
+#if (MPHP_DATA_IND & 0x80000000)
+  {PDI_DECODETYPE_MAC_H_CHECK,   "frame_array", "MPHP_DATA_IND", "GRR", 0xff,
+                                 mphX_checker, mphX_constrainer},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "data_array", "MPHP_SINGLE_BLOCK_CON", "GRR",
+                           0xff, NULL, NULL},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "data_array", "MPHP_SINGLE_BLOCK_REQ", "GRR",
+                           0xff, mphp_sing_block_req_checker,
+                           mphp_sing_block_constrainer},
+#else
+  {PDI_DECODETYPE_MAC_H_N_CHECK,   "l2_frame", "MPHP_DATA_IND", "GRR", 0xff,
+                                 mphX_checker, mphX_constrainer},
+  {PDI_DECODETYPE_MAC_H_N_CHECK,   "l2_frame", "MPHP_SINGLE_BLOCK_CON", "GRR",
+                           0xff, mphp_sing_block_con_edge_checker,
+                           mphp_sing_block_con_edge_constrainer},
+  {PDI_DECODETYPE_MAC_H_CHECK,   "l2_frame", "MPHP_SINGLE_BLOCK_REQ", "GRR",
+                           0xff, mphp_sing_block_req_checker,
+                           mphp_sing_block_constrainer},
+#endif
+  {PDI_DECODETYPE_MAC_H_CHECK,   "poll_data", "MPHP_POLLING_RESPONSE_REQ",
+                          "GRR", 0xff, mphp_polling_resp_checker,
+                           mphp_polling_resp_constrainer},
+#endif
+#ifdef MPHC_DATA_IND
+/* toggle direction for old 16bit MPHC* */
+#if (MPHC_DATA_IND & 0x80000000)
+  {PDI_DECODETYPE_AIM_CHECK,   "l2_frame", "MPHC_NCELL_BCCH_IND", "RR", 0xff,
+                                 mphX_checker, mphX_constrainer},
+  {PDI_DECODETYPE_AIM_CHECK,   "l2_frame", "MPHC_DATA_IND", "RR", 0xff,
+                                 mphX_checker, mphX_constrainer},
+#else
+  {PDI_DECODETYPE_AIM_N_CHECK,   "l2_frame", "MPHC_NCELL_BCCH_IND", "RR", 0xff,
+                                 mphX_checker, mphX_constrainer},
+  {PDI_DECODETYPE_AIM_N_CHECK,   "l2_frame", "MPHC_DATA_IND", "RR", 0xff,
+                                 mphX_checker, mphX_constrainer},
+#endif
+#endif
+  {PDI_DECODETYPE_MAC_H,   "data_array", "CGRLC_DATA_*", "GRR", 0xff, NULL, NULL},
+
+#ifdef CCDENT_UMTS_AS_ASN1_MSG
+
+// real sdu in test primitives 
+  //  UMTS_AS_ASN1_UL_DCCH_MSG_MSG
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TEST_SDU_UM_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_DCCH_MSG_MSG, rlc_data_1_checker, rlc_data_constrainer},  
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_UM_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_DCCH_MSG_MSG, rlc_data_1_checker, rlc_data_constrainer}, //rlc_id=1
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_UM_DATA_IND", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_DL_DCCH_MSG_MSG, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TEST_SDU_AM_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_DCCH_MSG_MSG, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TEST_SDU_AM_DATA_IND", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_DL_DCCH_MSG_MSG, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_AM_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_DCCH_MSG_MSG, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_AM_DATA_IND", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_DL_DCCH_MSG_MSG, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TEST_SDU_UM_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_CCCH_MSG_MSG, rlc_data_0_checker, rlc_data_constrainer},
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_UM_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_CCCH_MSG_MSG, rlc_data_0_checker, rlc_data_constrainer}, //rlc_id=0 
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TEST_SDU_TR_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_CCCH_MSG_MSG, NULL, NULL},  
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TR_DATA_REQ", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_UL_CCCH_MSG_MSG, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_NOTYPE, "sdu", "RLC_TR_DATA_IND", "UMTS_AS_ASN1_MSG", UMTS_AS_ASN1_DL_CCCH_MSG_MSG, NULL, NULL},
+  //RLC_AM_RETRANSMIT_CNF
+  //RLC_CTCH_DATA_IND
+
+// only as mem handles, not suported yet
+  //  UMTS_AS_ASN1_DL_CCCH_MSG_MSG
+  //  UMTS_AS_ASN1_BCCH_BCH_MSG_MSG
+  //  UMTS_AS_ASN1_DL_DCCH_MSG_MSG     
+  //  UMTS_AS_ASN1_DL_SHCCH_MSG_MSG     
+  //  UMTS_AS_ASN1_UL_SHCCH_MSG_MSG     
+  //  UMTS_AS_ASN1_PCCH_MSG_MSG     
+  //  UMTS_AS_ASN1_HO_TO_UTRANCOMMAND_MSG
+  //  UMTS_AS_ASN1_MASTER_INFO_BLOCK_MSG 
+  //  UMTS_AS_ASN1_BCCH_FACH_MSG_MSG     
+  //  UMTS_AS_ASN1_PDSCH_SYS_INFO_LIST_MSG
+  //  UMTS_AS_ASN1_PUSCH_SYS_INFO_LIST_MSG
+
+/* the following make little sence to decode since they always 
+  comes cutted up in small peaces inside a UMTS_AS_ASN1_BCCH_BCH_MSG_MSG */
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_1_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_2_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_3_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_4_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_5_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_6_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_7_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_8_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_9_MSG    
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_10_MSG   
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_11_MSG   
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_12_MSG   
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_13_MSG   
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_13_1_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_13_2_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_13_3_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_13_4_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_14_MSG   
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_15_MSG   
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_15_1_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_15_2_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_15_3_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_15_4_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_16_MSG  
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_17_MSG  
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_18_MSG  
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_SB_1_MSG
+  //  UMTS_AS_ASN1_SYS_INFO_TYPE_SB_2_MSG
+#endif /* CCDENT_UMTS_AS_ASN1_MSG */
+
+  /* test stack primitives */
+  {PDI_DECODETYPE_L3PDU_N,   "sdu", "XX_TAP*", "", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_N,    "sdu", "XX_LOADSTORE_*", "XX_CSN1", 0xff, invoke_ccd_setStore, ccd_loadstore_elements},
+  {PDI_DECODETYPE_NOPD_N,    "sdu", "XX_CCD_2*", "XX_CSN1", 0xff, NULL, NULL},
+  {PDI_DECODETYPE_NOPD_N,    "sdu", "XX_*", "XX", 0xff, NULL, NULL},
+
+  /* all other primitives */
+  {PDI_DECODETYPE_L3PDU,     "sdu", "*", "", 0xff, NULL, NULL}
+};
+#define DINFO_COUNT (sizeof(m_dinfo) / sizeof(*m_dinfo))
+
+int ccddata_get_pdi_dinfo (const T_PDI_DECODEINFO* (*dinfo) )
+{
+  *dinfo=m_dinfo;
+  return DINFO_COUNT;
+}
+
+/* definition of special ccdmsg preparation handlers */
+int invoke_ccd_setStore(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  int q;
+  for (q=0; q<len; q++)
+  {
+    ccd_setStore(q,values[q]);
+  }
+
+  return PDI_CCDMSG;
+}
+
+int mphX_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 0) //error_flag
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int mphp_sing_block_req_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && (values[0] == 4 || values[0] == 5)) //purpose
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int mphp_sing_block_con_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 3) //purpose
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int mphp_polling_resp_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 3) //poll_resp_type
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int mphp_sing_block_con_edge_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 3 && values[0] == 3 //purpose
+      && values[1] == 3          //sb_status
+      && values[2] == 0)         //dl_error
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int mac_data_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 2) //block_status
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int mac_poll_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 3) //block_status
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int rlc_data_0_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 0) //rlc_id
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}
+
+int rlc_data_1_checker(T_PDI_CCDMSG* ccdmsg, ULONG values[], int len)
+{
+  if (len >= 1 && values[0] == 1) //rlc_id
+  {
+    return PDI_CCDMSG;
+  }
+  else
+  {
+    return PDI_NONE;
+  }
+}