diff gsm-fw/g23m-gsm/cc/cc_for.c @ 673:2f7df7a314f8

gsm-fw/g23m-gsm subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 28 Sep 2014 23:20:04 +0000
parents
children 69f70acb17c9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/g23m-gsm/cc/cc_for.c	Sun Sep 28 23:20:04 2014 +0000
@@ -0,0 +1,2814 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-PS (6147)
+|  Modul   :  CC_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
+|             of the component CC.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef CC_FOR_C
+#define CC_FOR_C
+
+#define ENTITY_CC
+/*==== INCLUDES ===================================================*/
+
+#include <string.h>
+#include "typedefs.h"
+#include "pcm.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "message.h"
+#include "ccdapi.h"
+#include "prim.h"
+#include "cnf_cc.h"
+#include "mon_cc.h"
+#include "pei.h"
+#include "tok.h"
+#include "cc.h"
+#include "cc_em.h"
+
+/*==== EXPORT =====================================================*/
+
+/*==== PROTOTYPES =================================================*/
+/* Implements Measure#  44 */
+LOCAL void for_send_u_release_comp (USHORT cause);
+/* Implements Measure#  42 */
+LOCAL void for_fill_sdu_and_send (UBYTE msg,
+                                  USHORT len);
+
+/* Implements Measure#  11 */
+LOCAL void code_msg (UBYTE * msg,
+                     USHORT len);
+
+
+
+/*==== PRIVAT =====================================================*/
+
+/*==== VARIABLES ==================================================*/
+#if !defined (SHARED_CCD_BUF)
+GLOBAL UBYTE               _decodedMsg [MAX_MSTRUCT_LEN_CC];
+#else
+GLOBAL UBYTE *             _decodedMsg;
+#endif
+
+/*==== FUNCTIONS ==================================================*/
+
+#if 0
+/* xhegadeg 24th May 2005 
+   The part of the code between #if 0 to #endif is never executed.*/ 
+
+/*
+ Reason For Commenting :
+ Issue CC-ENH-30714---->
+   All the Layer3 CC messages are now traced via TRACE_BINDUMP.
+   So no need of the Function cc_trace_bcap() which was earlier
+   used for taking Setup ( Both Uplink & Downlink),Call Confirm,
+   Call Proceeding Traces using TRACE_BCAP.
+*/
+#if defined TRACE_BCAP
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : cc_trace_bcap              |
++--------------------------------------------------------------------+
+
+  PURPOSE : Trace messages containing bearer caps. This has been shown
+            to be useful in the past.
+
+*/
+
+LOCAL void cc_trace_bcap (T_CC_DATA *cc_data, 
+                    const T_sdu *sdu,
+                          UBYTE direction)
+{
+  const UBYTE *msg_ptr;  /* Pointer to non-decoded message */
+  unsigned     msg_len;  /* Length of non-decoded message */
+  unsigned     str_len;  /* Length of trace string */
+
+  /* TRACE_FUNCTION ("cc_trace_bcap()"); */
+
+  trace_buf[0] = '\0';
+  if (direction EQ UPLINK)
+  {
+    switch (_decodedMsg[0])
+    {
+      case U_SETUP:
+        strcpy (trace_buf, "U_SETUP:");
+        break;
+      case U_CALL_CONF:
+        strcpy (trace_buf, "U_CCONF:");
+        break;
+      default:
+        break;
+    }
+  }
+  else
+  {
+    switch (_decodedMsg[0])
+    {
+      case D_SETUP:
+        strcpy (trace_buf, "D_SETUP:");
+        break;
+      case D_CALL_PROCEED:
+        strcpy (trace_buf, "D_CPROC:");
+        break;
+      default:
+        break;
+    }
+  }
+
+  str_len = strlen (trace_buf);
+  msg_len = sdu->l_buf >> 3;
+  msg_ptr = &sdu->buf[sdu->o_buf >> 3];
+
+  if (str_len > 0)
+  {
+    /* Known message containing bearer caps, trace it out */
+    unsigned count; /* Number of dumped hex bytes in the trace line */
+
+    count = 0;
+
+    if (msg_len > 40)
+      msg_len = 40; /* Limit trace load */
+
+    while (msg_len > 0)
+    {
+      sprintf (trace_buf + str_len," %02x", *msg_ptr);
+      msg_ptr++;
+      msg_len--;
+      count++;
+      str_len += 3;
+      if ((msg_len > 0) AND (count >= 20))
+      {
+        /* Start new trace line */
+        TRACE_EVENT (trace_buf);
+        strcpy (trace_buf, "        ");
+        str_len = strlen (trace_buf);
+        count = 0;
+      }
+    }
+    TRACE_EVENT (trace_buf);
+  }
+}
+#endif /* #if defined TRACE_BCAP */
+#endif /* #if 0 */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_init                   |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize the formatter
+
+*/
+
+GLOBAL void for_init (void)
+{
+  TRACE_FUNCTION ("for_init()");
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_est_ind           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_EST_IND from mobility
+            management.
+
+*/
+
+GLOBAL void for_mmcm_est_ind (T_MMCM_ESTABLISH_IND * mmcm_establish_ind)
+{
+  UBYTE     pd;
+  BOOL      rel_flag = FALSE;
+  GET_INSTANCE_DATA;
+
+  /* Enable the PCO to correctly decode the message */
+  PPASS (mmcm_establish_ind, data, MMCM_ESTABLISH_IND);
+
+  TRACE_FUNCTION ("for_mmcm_est_ind()");
+
+  cc_data->ti_ext = 0;
+  cc_data->ti_ext_pres = FALSE;
+
+  GET_PD (data->sdu, pd);
+  GET_TI (data->sdu, cc_data->ti);
+  cc_data->ti_rec = cc_data->ti;
+
+  if (cc_data->ti >= 8)
+    cc_data->ti -= 8;
+  else
+    cc_data->ti += 8;
+
+  if ((pd NEQ M_MM_PD_CC)
+      OR
+      (data->sdu.l_buf < 16))
+      /*
+       * wrong protocol discriminator
+       * or message too short
+       */
+  {
+      rel_flag = TRUE;
+  }
+  else if ((cc_data->ti & 7) EQ 7)
+  {
+      /* TI value indicates extension octet, not allowed currently */
+      /* retrieve the second octet for TI and store it for subsequent handling in or_decode */
+      GET_TI_EXT(data->sdu, cc_data->ti_ext);
+      if ((cc_data->ti_ext & EXTENDED_TI_VALID) EQ EXTENDED_TI_VALID)
+      {
+          cc_data->ti_ext_pres = TRUE;
+      }
+      else
+      { /* no extended TI */
+          rel_flag = TRUE;
+      }
+  }
+  if (rel_flag==TRUE)
+  {
+      PPASS (data, rel, MMCM_RELEASE_REQ);
+      rel->org_entity = NAS_ORG_ENTITY_CC;
+      rel->ti = cc_data->ti;
+      PSENDX (MM, rel);
+      return;
+
+  }
+
+    cc_data->error       = 0;
+    cc_data->error_count = 0;
+    for_decode ((T_PRIM*)(D2P(data)), TRUE);
+
+} /* for_mmcm_est_ind() */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_data_ind          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCM_DATA_IND from mobility
+            management.
+
+*/
+
+GLOBAL void for_mmcm_data_ind (T_MMCM_DATA_IND * mmcm_data_ind)
+{
+  UBYTE     pd;
+  GET_INSTANCE_DATA;
+
+  /* Enable the PCO to correctly decode the message */
+  PPASS (mmcm_data_ind, data, MMCM_DATA_IND);
+
+  TRACE_FUNCTION ("for_mmcm_data_ind()");
+
+  cc_data->ti_ext = 0;
+  cc_data->ti_ext_pres = FALSE;
+  
+  GET_PD (data->sdu, pd);
+  GET_TI (data->sdu, cc_data->ti);
+  cc_data->ti_rec = cc_data->ti;
+
+  if (cc_data->ti >= 8)
+    cc_data->ti -= 8;
+  else
+    cc_data->ti += 8;
+
+  if (((cc_data->ti & 7) EQ 7)
+       OR
+      (pd NEQ M_MM_PD_CC)
+       OR
+      (data->sdu.l_buf < 16))
+  /*
+   * TI value is reserved, not allowed
+   * or wrong protocol discriminator
+   * or message too short
+   */
+  {
+    PFREE (data);
+  }
+  else
+  {
+	  cc_data->error = 0;
+		for_decode ((T_PRIM*)(D2P(data)), FALSE);
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_decode                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : Decoding and distributing of incoming messages.
+
+*/
+typedef void (*T_FUNC_PTR) (void);
+
+LOCAL const T_FUNC_PTR mess_table[] = {
+  cc_unknown_message,             /*  0: not used                  */
+  for_d_alert,                    /*  1: D_ALERT                   */
+  for_d_call_proceed,             /*  2: D_CALL_PROCEED            */
+  for_d_progress,                 /*  3: D_PROGRESS                */
+  for_d_cc_establishment,         /*  4: D_CC_ESTABLISHMENT        */
+  for_d_setup,                    /*  5: D_SETUP                   */
+  cc_unknown_message,             /*  6: not used                  */
+  for_d_connect,                  /*  7: D_CONNECT                 */
+  cc_unknown_message,             /*  8: not used                  */
+  cc_unknown_message,             /*  9: not used                  */
+  cc_unknown_message,             /* 10: not used                  */
+  for_d_recall,                   /* 11: D_RECALL                  */
+  cc_unknown_message,             /* 12: not used                  */
+  cc_unknown_message,             /* 13: not used                  */
+  cc_unknown_message,             /* 14: not used                  */
+  cc_connect_ack,                 /* 15: B_CONNECT_ACK             */
+  for_b_user_information,         /* 16: B_USER_INFO               */
+  cc_unknown_message,             /* 17: not used                  */
+  cc_unknown_message,             /* 18: not used                  */
+  for_b_modify_rej,               /* 19: B_MODIFY_REJ              */
+  cc_unknown_message,             /* 20: not used                  */
+  cc_unknown_message,             /* 21: not used                  */
+  cc_unknown_message,             /* 22: not used                  */
+  for_b_modify,                   /* 23: B_MODIFY                  */
+  cc_unknown_message,             /* 24: not used                  */
+  cc_hold_ack,                    /* 25: D_HOLD_ACK                */
+  for_d_hold_rej,                 /* 26: D_HOLD_REJ                */
+  cc_unknown_message,             /* 27: not used                  */
+  cc_unknown_message,             /* 28: not used                  */
+  cc_retrieve_ack,                /* 29: D_RETRIEVE_ACK            */
+  for_d_retrieve_rej,             /* 30: D_RETRIEVE_REJ            */
+  for_b_modify_comp,              /* 31: B_MODIFY_COMP             */
+  cc_unknown_message,             /* 32: not used                  */
+  cc_unknown_message,             /* 33: not used                  */
+  cc_unknown_message,             /* 34: not used                  */
+  cc_unknown_message,             /* 35: not used                  */
+  cc_unknown_message,             /* 36: not used                  */
+  for_d_disconnect,               /* 37: D_DISCONNECT              */
+  cc_unknown_message,             /* 38: not used                  */
+  cc_unknown_message,             /* 39: not used                  */
+  cc_unknown_message,             /* 40: not used                  */
+  cc_unknown_message,             /* 41: not used                  */
+  for_d_release_comp,             /* 42: D_RELEASE_COMP            */
+  cc_unknown_message,             /* 43: not used                  */
+  cc_unknown_message,             /* 44: not used                  */
+  for_d_release,                  /* 45: D_RELEASE                 */
+  cc_unknown_message,             /* 46: not used                  */
+  cc_unknown_message,             /* 47: not used                  */
+  cc_unknown_message,             /* 48: not used                  */
+  cc_unknown_message,             /* 49: not used                  */
+  cc_stop_dtmf_ack,               /* 50: D_STOP_DTMF_ACK           */
+  cc_unknown_message,             /* 51: not_used                  */
+  cc_status_enquiry,              /* 52: B_STATUS_ENQ              */
+  cc_unknown_message,             /* 53: not used                  */
+  for_d_start_dtmf_ack,           /* 54: D_START_DTMF_ACK          */
+  for_d_start_dtmf_rej,           /* 55: D_START_DTMF_REJ          */
+  cc_unknown_message,             /* 56: not used                  */
+  for_b_congest_ctrl,             /* 57: B_CONGEST_CTRL            */
+  for_d_facility,                 /* 58: D_FACILITY                */
+  cc_unknown_message,             /* 59: not used                  */
+  cc_unknown_message,             /* 60: not used                  */
+  for_b_status,                   /* 61: B_STATUS                  */
+  for_b_notify,                   /* 62: B_NOTIFY                  */
+  cc_unknown_message              /* 63: not used                  */
+};
+
+GLOBAL void for_decode (T_PRIM * prim, BOOL est_flag)
+{
+  GET_INSTANCE_DATA;
+  U8 *payload;
+  U16 length;
+/* Implements Measure#32: Row 43,...,70 */
+
+  PCAST (prim, data, MMCM_DATA_IND);
+
+  TRACE_FUNCTION ("for_decode()");
+
+  if (cc_data->ti_ext_pres EQ TRUE)
+  {
+    data->sdu.l_buf -= 16;
+    data->sdu.o_buf += 16;
+  }
+  else
+  {
+    data->sdu.l_buf -= 8;
+    data->sdu.o_buf += 8;
+  }
+
+
+  cc_data->mt = data->sdu.buf[data->sdu.o_buf >> 3];
+
+  /* Obtain the internal shared CCD output buffer */
+  CCD_START;
+
+  if (ccd_decodeMsg (CCDENT_CC,
+                     DOWNLINK,
+                     (T_MSGBUF *) &data->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_CC, parlist);    
+    /*
+     * Error Handling
+     */
+    do      
+        {
+      TRACE_EVENT_P1 ("cuurent_error = %d", ccd_err);
+          switch (ccd_err)
+          {
+        case ERR_MSG_LEN:                 /* ignore message & send STATUS #96 */
+            case ERR_MAND_ELEM_MISS:          /* ignore message & send STATUS #96 */
+            case ERR_COMPREH_REQUIRED:        /* ignore message & send STATUS #96 */
+
+              for_set_mandatory_error ((UBYTE)parlist[0]);
+              break;
+
+            case ERR_INVALID_MID:             /* ignore message & send STATUS #97 */
+              cc_data->error = M_CC_CAUSE_MESSAGE_TYPE_NOT_IMPLEM;
+              break;
+
+            case ERR_INTERNAL_ERROR:
+#if defined (WIN32)              
+              TRACE_EVENT_P1("An internal CCD error occured,CCD error code = %u", ccd_err);
+#endif /* #if defined (WIN32) */
+              cc_data->error = M_CC_CAUSE_MESSAGE_INCOMPAT;
+              break;
+            
+            case ERR_IE_SEQUENCE:
+#if defined (WIN32) 
+              TRACE_EVENT_P2("sequence error,  CCD error = %u, Parameter = %d", ccd_err, parlist[0]);
+#endif /* #if defined (WIN32) */
+               switch (cc_data->state[srv_convert_ti (cc_data->ti)])
+               {
+                 case M_CC_CS_11:
+                 case M_CC_CS_12:
+                 case M_CC_CS_19:
+                   break;
+                 default: /* 24.008: 9.3.18.1.1	Cause ; This information element shall 
+                            * be included if this message is used to initiate call clearing.
+                            */
+
+                   if (parlist [0] EQ CAUSE_IEI)
+                   {
+                     for_set_mandatory_error ((UBYTE)parlist[0]);
+                   }
+                   break;
+               }
+               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_EVENT_P1("CCD ERROR: IE not expected. probably an R99 optional elemet like cell notification, eplmn, or t3302, CCD error code = %u", ccd_err);
+              break;
+            case ERR_MAX_IE_EXCEED:
+              TRACE_EVENT_P1("Maximum amount of repeatable information elements has exceeded,  CCD error code = %u", ccd_err);
+              break;
+            case ERR_MAX_REPEAT:
+              TRACE_EVENT_P1("A repeatable element 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_CC, parlist);          
+        } while ( prev_err NEQ ERR_NO_MORE_ERROR                       
+                  AND !cc_check_critical_error(cc_data->error)  );                  
+  }
+ /*lint -e416 (creation of out-of-bounds pointer)*/
+  EM_CC_DOWNLINK_SETUP_RECEIVED;
+
+  /* adding TI and PD header to data */
+  data->sdu.l_buf += 8;
+  data->sdu.o_buf -= 8;
+
+  payload  = &(data->sdu.buf[0]);          /* beginning of buffer      */
+  payload += ((data->sdu.o_buf) >> 3);     /*  plus offset (bytes)     */
+  length   = ((data->sdu.l_buf) >> 3);     /* length (bytes, bits / 8) */
+
+/* Implements Measure#32: Row 43,...,70 */
+  switch (_decodedMsg[0])
+  {
+    case D_ALERT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Alert DL ",
+                    payload,
+                    length);
+      break;
+    case D_CALL_PROCEED:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Call Proceed DL ",
+                    payload,
+                    length);
+      break;
+    case D_PROGRESS:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Progress DL ",
+                    payload,
+                    length);
+      break;
+    case D_CC_ESTABLISHMENT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " CC Establishment DL ",
+                    payload,
+                    length);
+      break;
+    case D_SETUP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Setup DL ",
+                    payload,
+                    length);
+      break;
+    case D_CONNECT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Connect DL ",
+                    payload,
+                    length);
+      break;
+    case D_RECALL:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Recall DL ",
+                    payload,
+                    length);
+      break;
+    case B_CONNECT_ACK:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Connect Acknowledge DL ",
+                    payload,
+                    length);
+      break;
+    case B_USER_INFO:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " User Information DL ",
+                    payload,
+                    length);
+      break;
+    case B_MODIFY_REJ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Modification Reject DL ",
+                    payload,
+                    length);
+      break;
+    case B_MODIFY:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Call Modify DL ",
+                    payload,
+                    length);
+      break;
+    case D_HOLD_ACK:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Hold Acknowledge DL ",
+                    payload,
+                    length);
+      break;
+    case D_HOLD_REJ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Hold Reject DL ",
+                    payload,
+                    length);
+      break;
+    case D_RETRIEVE_ACK:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Retrieve Acknowledge DL ",
+                    payload,
+                    length);
+      break;
+    case D_RETRIEVE_REJ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Retrieve Reject DL ",
+                    payload,
+                    length);
+      break;
+    case B_MODIFY_COMP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Modify Complete DL ",
+                    payload,
+                    length);
+      break;
+    case D_DISCONNECT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Disconnect DL ",
+                    payload,
+                    length);
+      break;
+    case D_RELEASE_COMP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Release Complete DL ",
+                    payload,
+                    length);
+      break;
+    case D_RELEASE:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Release DL ",
+                    payload,
+                    length);
+      break;
+    case D_STOP_DTMF_ACK:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Stop DTMF Acknowledge DL ",
+                    payload,
+                    length);
+      break;
+    case B_STATUS_ENQ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Status Enquiry DL ",
+                    payload,
+                    length);
+      break;
+    case D_START_DTMF_ACK:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Start DTMF Acknowledge DL ",
+                    payload,
+                    length);
+      break;
+    case D_START_DTMF_REJ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Start DTMF Reject DL ",
+                    payload,
+                    length);
+      break;
+    case B_CONGEST_CTRL:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Congestion Control DL ",
+                    payload,
+                    length);
+      break;
+    case D_FACILITY:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Facility DL ",
+                    payload,
+                    length);
+      break;
+    case B_STATUS:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Status DL ",
+                    payload,
+                    length);
+      break;
+    case B_NOTIFY:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Notify DL ",
+                    payload,
+                    length);
+      break;
+    default:
+      TRACE_EVENT("Unknown Message");
+      break;
+  } /*switch(_decodedMsg[0]) */
+
+/* removing TI and PD header from data */
+  data->sdu.l_buf -= 8;
+  data->sdu.o_buf += 8;
+
+#if 0 
+#if defined TRACE_BCAP
+  cc_trace_bcap (cc_data, &data->sdu, DOWNLINK);
+#endif /* #if defined TRACE_BCAP */
+#endif /* #if 0 */
+
+  PFREE (data);
+
+  /*
+   * Only the range 0 to 63 is relevant for the cc message type.
+   */
+  if (est_flag)
+  {
+    /* 
+     * The message was received by MMCC_ESTABLISH_IND.
+     */
+    UBYTE result;
+
+    switch (_decodedMsg[0])
+    {
+      case D_SETUP:
+        if ((result = srv_define_ti ()) EQ NOT_PRESENT_8BIT)
+        {
+          /* 
+           * Internal problem: CC has run out of call table entries. 
+           * Release the call.
+           */
+          if ( cc_data->ti_rec < 8)   /* 24.008; ch. 8.3.1 c) */
+          {
+            /* 
+             * for a reasoning why CAUSE_USER_BUSY was chosen see the 
+             * definition of UDUB in GSM 02.01!
+             */
+            for_send_u_release_comp (M_CC_CAUSE_USER_BUSY);
+            return;
+          }
+		}
+
+        if (cc_data->ti_ext_pres EQ TRUE)
+        {
+          /* [ 24.008; ch. 8.3.1]
+           * The mobile station and network shall reject a SETUP, EMERGENCY SETUP or START CC
+           * message received with octet 1 part of the TI value coded as "111" by sending 
+           * RELEASE COMPLETE with cause #81 "Invalid transaction identifier value" The TI value
+           * in RELEASE COMPLETE shall be the complete TI value including the extension octet
+           * from the message that caused the rejection.
+           */
+
+          for_send_u_release_comp (M_CC_CAUSE_INVALID_TI);
+          return;            
+        }
+
+          cc_data->index_ti = result;
+
+        break;
+      
+      case B_STATUS:
+        break;
+      
+      case D_RELEASE_COMP:
+        CCD_END;
+        for_rel_req ();
+        return;
+      
+      default:
+        for_send_u_release_comp (M_CC_CAUSE_INVALID_TI);
+        return;
+    } /* switch (_decodedMsg[0]) */
+  }
+  else
+  {
+    /* 
+     * The message was received by MMCC_DATA_IND.
+     */
+    if ((cc_data->index_ti = srv_convert_ti (cc_data->ti)) 
+        EQ NOT_PRESENT_8BIT)
+    {
+      for_send_u_release_comp (M_CC_CAUSE_INVALID_TI);
+      return;
+    }
+  }
+  if (_decodedMsg[0] < 64)
+  {
+    JUMP (*mess_table [_decodedMsg[0] & 63]) ();
+  }
+  else
+  {
+    cc_unknown_message ();
+  }
+} /* for_decode() */
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_alert                |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_ALERT message.
+
+*/
+GLOBAL void for_d_alert (void)
+{
+  MCAST (alert, D_ALERT);
+
+  TRACE_FUNCTION ("for_d_alert()");
+
+  if (alert->v_progress)
+  {
+    if (for_check_progress_indicator (&alert->progress) EQ FALSE)
+    {
+      for_set_optional_error (PROGRESS_IEI);
+    }
+  }
+
+  cc_alert (alert);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_call_proceed         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_CALL_PROCEED message.
+
+*/
+
+GLOBAL void for_d_call_proceed (void)
+{
+  MCAST (proceed, D_CALL_PROCEED);
+
+  TRACE_FUNCTION ("for_d_call_proceed()");
+
+  if (proceed->v_repeat)
+  {
+    /* Repeat indicator present */
+    if (for_check_repeat_indicator (proceed->repeat) EQ FALSE)
+    {
+      /* Repeat indicator contains garbage */
+      for_set_optional_error (REPEAT_IEI);
+    }
+    if (!(proceed->v_bearer_cap AND proceed->v_bearer_cap_2))
+    {
+      /* Repeat indicator, but not both bearer caps present */
+      for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+  else
+  {
+    /* No repeat indicator present */
+    if (proceed->v_bearer_cap AND proceed->v_bearer_cap_2)
+    {
+      /* No repeat indicator, but both bearer caps present */
+      for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+
+  cc_call_proceeding (proceed);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_connect              |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_CONNECT message.
+
+*/
+
+GLOBAL void for_d_connect (void)
+{
+  MCAST (connect, D_CONNECT);
+
+  TRACE_FUNCTION ("for_d_connect()");
+
+  if (connect->v_progress)
+  {
+    if (for_check_progress_indicator (&connect->progress) EQ FALSE)
+    {
+      for_set_optional_error (PROGRESS_IEI);
+    }
+  }
+
+  if (connect->v_connect_num)
+  {
+    if (for_check_calling_party_bcd
+        ((T_M_CC_calling_num *)&connect->connect_num) EQ FALSE)
+    {
+      for_set_optional_error (CONNECTED_NUMBER_IEI);
+    }
+  }
+
+  if (connect->v_connect_subaddr)
+  {
+    if (for_check_calling_party_sub
+        ((T_M_CC_calling_subaddr *)&connect->connect_subaddr) EQ FALSE)
+    {
+      for_set_optional_error (CONNECTED_SUBADDR_IEI);
+    }
+  }
+
+  cc_connect (connect);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_facility             |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_FACILITY message.
+
+*/
+
+GLOBAL void for_d_facility (void)
+{
+  MCAST (facility, D_FACILITY);
+
+  TRACE_FUNCTION ("for_d_facility()");
+
+  cc_facility (facility);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_disconnect           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_DISCONNECT message.
+
+*/
+
+GLOBAL void for_d_disconnect (void)
+{
+  MCAST (disconnect, D_DISCONNECT);
+
+  TRACE_FUNCTION ("for_d_disconnect()");
+
+  if (disconnect->v_progress)
+  {
+    if (for_check_progress_indicator (&disconnect->progress) EQ FALSE)
+    {
+      for_set_optional_error (PROGRESS_IEI);
+    }
+  }
+
+  if (for_check_cc_cause (&disconnect->cc_cause) EQ FALSE)
+  {
+    for_set_mandatory_error (CAUSE_IEI);
+  }
+
+  cc_disconnect (disconnect);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_modify               |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_MODIFY message.
+
+*/
+
+GLOBAL void for_b_modify (void)
+{
+  MCAST (modify, B_MODIFY);
+
+  TRACE_FUNCTION ("for_b_modify()");
+
+  cc_modify (modify);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_modify_comp          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_MODIFY_COMP message.
+
+*/
+
+GLOBAL void for_b_modify_comp (void)
+{
+  MCAST (modify_com, B_MODIFY_COMP);
+
+  TRACE_FUNCTION ("for_b_modify_comp()");
+
+  cc_modify_complete (modify_com);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_modify_rej           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_MODIFY_REJ message.
+
+*/
+
+GLOBAL void for_b_modify_rej (void)
+{
+  MCAST (modify_rej, B_MODIFY_REJ);
+
+  TRACE_FUNCTION ("for_b_modify_rej()");
+
+  if (for_check_cc_cause (&modify_rej->cc_cause) EQ FALSE)
+  {
+    for_set_mandatory_error (CAUSE_IEI);
+  }
+
+  cc_modify_reject (modify_rej);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_notify               |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_NOTIFY message.
+
+Issue No 7674 :
+Accept the message as according to Anite test case ETSI 11.10 clause 26.8.1.4.2 
+and do nothing,no need to send any Notification Indication to ACI.Also check the 
+State of the CC, if we get a Notify in CC State other than U10 and U26 then Send 
+STATUS message with cause "Message Type Incompatible" to the Network.
+*/
+
+GLOBAL void for_b_notify (void)
+{
+  GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("for_b_notify()");
+
+   /* Processing an incoming notify message.*/
+   switch (cc_data->state[cc_data->index_ti])
+  {
+      /*
+       * CS_0 is handled by the formatter
+       */
+    case M_CC_CS_10:
+    case M_CC_CS_26:
+     
+      CCD_END;
+     
+      break;
+
+    default:
+      CCD_END;
+      /* Implements Measure#  3 and streamline encoding */
+      cc_send_status (M_CC_CAUSE_MESSAGE_TYPE_INCOMPAT);
+      break;
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_progress             |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_PROGRESS message.
+
+*/
+
+GLOBAL void for_d_progress (void)
+{
+  MCAST (progress, D_PROGRESS);
+
+  TRACE_FUNCTION ("for_d_progress()");
+
+  if (for_check_progress_indicator (&progress->progress) EQ FALSE)
+  {
+    for_set_mandatory_error (PROGRESS_IEI);
+  }
+
+  cc_progress (progress);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_release              |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_RELEASE message.
+
+*/
+
+GLOBAL void for_d_release (void)
+{
+  MCAST (release, D_RELEASE);
+
+  TRACE_FUNCTION ("for_d_release()");
+
+  if (release->v_cc_cause)
+  {
+    if (for_check_cc_cause (&release->cc_cause) EQ FALSE)
+    {
+      for_set_optional_error (CAUSE_IEI);
+    }
+  }
+
+  if (release->v_cc_cause_2)
+  {
+    if (for_check_cc_cause ((T_M_CC_cc_cause*)&release->cc_cause_2) EQ FALSE)
+    {
+      for_set_optional_error (CAUSE_IEI);
+    }
+  }
+
+  cc_release (release);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_release_complete     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_RELEASE_COMPLETE message.
+
+*/
+
+GLOBAL void for_d_release_comp (void)
+{
+  MCAST (rel_comp, D_RELEASE_COMP);
+
+  TRACE_FUNCTION ("for_d_release_comp()");
+
+  if (rel_comp->v_cc_cause)
+  {
+    if (for_check_cc_cause (&rel_comp->cc_cause) EQ FALSE)
+    {
+      for_set_optional_error (CAUSE_IEI);
+    }
+  }
+
+  cc_release_complete (rel_comp);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_cc_establishment     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing of a D_CC_ESTABLISHMENT message.
+
+*/
+
+GLOBAL void for_d_cc_establishment (void)
+{
+  MCAST(cc_est, D_CC_ESTABLISHMENT);  
+  T_U_SETUP * setup = NULL;
+  USHORT len_in_bits = (cc_est->setup_cont.c_setup_msg + 1) << 3;
+  BYTE        result;
+
+  TRACE_FUNCTION ("for_d_cc_establishment()");
+  
+  /* 
+   * Decode uplink setup message delivered in setup container.
+   */
+  {
+    PALLOC_SDU (data, MMCM_DATA_REQ, len_in_bits);
+    memcpy(&data->sdu.buf[1], 
+           cc_est->setup_cont.setup_msg, 
+           cc_est->setup_cont.c_setup_msg);
+    data->sdu.buf[0] = U_SETUP;
+    data->sdu.l_buf = len_in_bits;
+    data->sdu.o_buf = 0;
+    result = ccd_decodeMsg (CCDENT_CC,  
+                            UPLINK,
+                            (T_MSGBUF *) &data->sdu,
+                            (UBYTE    *) _decodedMsg,
+                            NOT_PRESENT_8BIT);
+
+    setup = (T_U_SETUP *)_decodedMsg;
+    PFREE (data);
+  }
+
+  if (result NEQ ccdOK)
+  {
+    USHORT parlist[6];
+    UBYTE  first_err;
+
+    memset (parlist,0, sizeof (parlist));
+    first_err = ccd_getFirstError (CCDENT_CC, parlist);
+    /*
+     * Error Handling
+     */
+    switch (first_err)
+    {
+      case ERR_COMPREH_REQUIRED:    /* comprehension required     */
+        for_set_mandatory_error ((UBYTE)parlist[0]);
+        break;
+      case ERR_MAND_ELEM_MISS:      /* Mandatory elements missing */
+        /*
+         * Error handling is carried out by checking the content.
+         */
+        break;
+    }
+  }
+
+  /* Check repeat indicator bearer capabilities */
+  if (setup->v_repeat )
+  {
+    if (for_check_repeat_indicator (setup->repeat) EQ FALSE)
+    {
+      for_set_optional_error (REPEAT_IEI);
+    }
+  }
+
+  /* Check presence of bearer capability I */
+  if (setup->v_bearer_cap) 
+  {  
+    /* Compability check not done here */
+  }
+  else
+    for_set_mandatory_error (BEARER_CAP_IEI);
+  
+  /* Check calling party subaddress */
+  if (setup->v_calling_subaddr) 
+  {
+    if (for_check_calling_party_sub (&setup->calling_subaddr) EQ FALSE)
+    {
+      for_set_optional_error (CALLING_PARTY_SUB_IEI);
+    }
+  }
+
+  /* Check called party BCD number */
+  if (setup->v_ul_called_num) 
+  {
+    if (for_check_called_party_bcd (setup->ul_called_num.ton, 
+                                    setup->ul_called_num.npi) EQ FALSE)
+    {
+      for_set_mandatory_error (CALLED_PARTY_BCD_IEI);
+    }
+  } 
+  else
+  {
+    for_set_mandatory_error (CALLED_PARTY_BCD_IEI);
+  }
+
+  /* Check called party subaddress */
+  if (setup->v_called_subaddr)
+  {
+    if (for_check_called_party_sub (&setup->called_subaddr) EQ FALSE)
+    {
+      for_set_optional_error (CALLED_PARTY_SUB_IEI);
+    }
+  }
+
+  /* Check LLC repeat indicator */
+  if (setup->v_repeat_2) 
+  {
+    if (for_check_repeat_indicator (setup->repeat_2) EQ FALSE)
+    {
+      for_set_optional_error (REPEAT_IEI);
+    }
+  }
+
+  /* Check HLC repeat indicator */
+  if (setup->v_repeat_3)
+  {
+    if (for_check_repeat_indicator (setup->repeat_3) EQ FALSE)
+    {
+      for_set_optional_error (REPEAT_IEI);
+    }
+  }
+  
+  /* Check BC repeat indicator conditions */
+  if (setup->v_repeat) 
+  { 
+    if (!(setup->v_bearer_cap AND setup->v_bearer_cap_2))
+    {
+      cc_for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+
+  /* Check LLC repeat indicator conditions */
+  if (setup->v_repeat_2) 
+  {
+    if (!(setup->v_bearer_cap 
+          AND setup->v_low_layer_comp
+          AND (setup->v_repeat EQ setup->v_repeat_2)))
+    {
+      cc_for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+
+  /* Check second LLC IE condition */
+  if (setup->v_low_layer_comp_2)
+  {
+    if (!setup->v_repeat_2)
+    {
+      cc_for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+
+  /* Check HLC repeat indicator conditions */
+  if (setup->v_high_layer_comp_2) 
+  {
+    if (!(setup->v_repeat AND setup->v_high_layer_comp))
+    {
+      cc_for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+
+  /* Check second HLC IE condition */
+  if (setup->v_high_layer_comp)
+  {
+    if (!setup->v_repeat_3)
+    {
+      cc_for_set_conditional_error (REPEAT_IEI);
+    }
+  }
+
+  /* 
+   * The only interesting part of the CC ESTABLISHMENT message 
+   * is the setup container, so only this is delivered
+   */
+  cc_cc_establishment (setup);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_cc_establishment     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing of a D_RECALL message.
+
+*/
+
+GLOBAL void for_d_recall (void)
+{
+  MCAST (recall, D_RECALL);     
+
+  TRACE_FUNCTION ("for_d_recall()");  
+
+  cc_recall(recall);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_setup                |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_SETUP message.
+
+*/
+
+GLOBAL void for_d_setup (void)
+{
+  MCAST (setup, D_SETUP);
+  UBYTE    rep_cnt = 0;
+  UBYTE    bc_cnt  = 0;
+  UBYTE    lc_cnt  = 0;
+  UBYTE    hc_cnt  = 0;
+
+  TRACE_FUNCTION ("for_d_setup()");
+
+  if (setup->v_repeat)
+  {
+    if (for_check_repeat_indicator (setup->repeat) EQ FALSE)
+    {
+      for_set_optional_error (REPEAT_IEI);
+    }
+  }
+
+  if (setup->v_progress)
+  {
+    if (for_check_progress_indicator (&setup->progress) EQ FALSE)
+    {
+      for_set_optional_error (PROGRESS_IEI);
+    }
+  }
+
+  if (setup->v_signal)
+  {
+    if (for_check_signal (setup->signal) EQ FALSE)
+    {
+      for_set_optional_error (SIGNAL_IEI);
+    }
+  }
+
+  if (setup->v_calling_num)
+  {
+    if (for_check_calling_party_bcd (&setup->calling_num) EQ FALSE)
+    {
+      for_set_optional_error (CALLING_PARTY_BCD_IEI);
+    }
+  }
+
+  if (setup->v_calling_subaddr)
+  {
+    if (for_check_calling_party_sub (&setup->calling_subaddr) EQ FALSE)
+    {
+      for_set_optional_error (CALLING_PARTY_SUB_IEI);
+    }
+  }
+
+  if (setup->v_dl_called_num)
+  {
+    if (for_check_called_party_bcd (setup->dl_called_num.ton, 
+                                    setup->dl_called_num.npi) EQ FALSE)
+    {
+      for_set_optional_error (CALLED_PARTY_BCD_IEI);
+    }
+  }
+
+  if (setup->v_called_subaddr)
+  {
+    if (for_check_called_party_sub (&setup->called_subaddr) EQ FALSE)
+    {
+      for_set_optional_error (CALLED_PARTY_SUB_IEI);
+    }
+  }
+
+  if (setup->v_repeat_2)
+  {
+    if (for_check_repeat_indicator (setup->repeat_2) EQ FALSE)
+    {
+      for_set_optional_error (REPEAT_IEI);
+    }
+  }
+
+  if (setup->v_repeat_3)
+  {
+    if (for_check_repeat_indicator (setup->repeat_3) EQ FALSE)
+    {
+      for_set_optional_error (REPEAT_IEI);
+    }
+  }
+
+  rep_cnt = setup->v_repeat +
+            setup->v_repeat_2 +
+            setup->v_repeat_3;
+
+  bc_cnt  = setup->v_bearer_cap +
+            setup->v_bearer_cap_2;
+
+  lc_cnt  = setup->v_low_layer_comp +
+            setup->v_low_layer_comp_2;
+
+  hc_cnt  = setup->v_high_layer_comp +
+            setup->v_high_layer_comp_2;
+
+  switch (rep_cnt)
+  {
+    case 0:
+      if ((bc_cnt EQ 2) OR
+          (lc_cnt EQ 2) OR
+          (hc_cnt EQ 2))
+      {
+        for_set_conditional_error (REPEAT_IEI);
+      }
+      break;
+
+    case 1:
+      if ((bc_cnt NEQ 2) OR
+          (lc_cnt EQ 2) OR
+          (hc_cnt EQ 2))
+      {
+        for_set_conditional_error (REPEAT_IEI);
+      }
+      break;
+
+    case 2:
+      if ((bc_cnt NEQ 2) OR
+          (lc_cnt NEQ 2) OR
+          (hc_cnt EQ 2))
+      {
+        for_set_conditional_error (REPEAT_IEI);
+      }
+      break;
+
+    case 3:
+      if ((bc_cnt NEQ 2) OR
+          (lc_cnt NEQ 2) OR
+          (hc_cnt NEQ 2))
+      {
+        for_set_conditional_error (REPEAT_IEI);
+      }
+      break;
+  }
+
+  cc_setup (setup);
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_start_dtmf_ack       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_START_DTMF_ACK message.
+
+*/
+
+GLOBAL void for_d_start_dtmf_ack (void)
+{
+  MCAST (start_ack, D_START_DTMF_ACK);
+
+  TRACE_FUNCTION ("for_d_start_dtmf_ack()");
+
+  cc_start_dtmf_ack (start_ack);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_start_dtmf_rej       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_START_DTMF_REJ message.
+
+*/
+
+GLOBAL void for_d_start_dtmf_rej (void)
+{
+  MCAST (start_rej, D_START_DTMF_REJ);
+
+  TRACE_FUNCTION ("for_d_start_dtmf_rej()");
+
+  if (for_check_cc_cause (&start_rej->cc_cause) EQ FALSE)
+  {
+    for_set_mandatory_error (CAUSE_IEI);
+  }
+
+  cc_start_dtmf_rej (start_rej);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_status               |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_STATUS message.
+
+*/
+
+GLOBAL void for_b_status (void)
+{
+  MCAST (status, B_STATUS); /* T_B_STATUS */
+
+  TRACE_FUNCTION ("for_b_status()");
+  if (for_check_cc_cause (&status->cc_cause) EQ FALSE)
+  {
+    for_set_mandatory_error (CAUSE_IEI);
+  }
+
+  for_check_call_state (&status->call_state);
+
+  cc_status (status);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_hold_rej             |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_HOLD_REJ message.
+
+*/
+
+GLOBAL void for_d_hold_rej (void)
+{
+  MCAST (hold_rej, D_HOLD_REJ);
+
+  TRACE_FUNCTION ("for_d_hold_rej()");
+
+  if (for_check_cc_cause (&hold_rej->cc_cause) EQ FALSE)
+  {
+    for_set_mandatory_error (CAUSE_IEI);
+  }
+
+  cc_hold_rej (hold_rej);
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_d_retrieve_rej         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a D_RETRIEVE_REJ message.
+
+*/
+
+GLOBAL void for_d_retrieve_rej (void)
+{
+  MCAST (retrieve_rej, D_RETRIEVE_REJ);
+
+  TRACE_FUNCTION ("for_d_retrieve_rej()");
+
+  if (for_check_cc_cause (&retrieve_rej->cc_cause) EQ FALSE)
+  {
+    for_set_mandatory_error (CAUSE_IEI);
+  }
+
+  cc_retrieve_rej (retrieve_rej);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_congest_ctrl         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_CONGEST_CTRL message.
+
+*/
+
+GLOBAL void for_b_congest_ctrl (void)
+{
+  MCAST (cong, B_CONGEST_CTRL);
+
+  TRACE_FUNCTION ("for_b_congest_ctrl()");
+
+  if (cong->v_cc_cause)
+  {
+    if (for_check_cc_cause (&cong->cc_cause) EQ FALSE)
+    {
+      for_set_optional_error (CAUSE_IEI);
+    }
+  }
+
+  cc_congestion_control (cong);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_b_user_information     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing a B_USER_INFORMATION message.
+
+*/
+
+GLOBAL void for_b_user_information (void)
+{
+  
+  MCAST (user, B_USER_INFO);
+
+  TRACE_FUNCTION ("for_b_user_information()");
+
+  cc_user_information (user);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_sync_ind          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_SYNC_IND from mobility
+            management.
+
+*/
+
+GLOBAL void for_mmcm_sync_ind (T_MMCM_SYNC_IND * sync)
+{
+  GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("for_mmcm_sync_ind()");
+
+  cc_data->ti = sync->ti;
+
+  EM_CC_CHANNEL_MODE_CHANGE;     
+  
+  cc_sync_ind (sync);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_est_cnf           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_EST_CNF from mobility
+            management.
+
+*/
+
+
+GLOBAL void for_mmcm_est_cnf (T_MMCM_ESTABLISH_CNF * est_cnf)
+{
+  GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("for_mmcm_est_cnf()");
+
+  cc_data->ti = est_cnf->ti;
+  if ((cc_data->index_ti = srv_convert_ti (cc_data->ti))
+      NEQ NOT_PRESENT_8BIT)
+  {
+    cc_est_cnf ();    
+  }
+
+  EM_CC_MM_CONNECTION_ESTABLISHED_MO;  
+  
+  PFREE (est_cnf);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_rel_ind           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_REL_IND from mobility
+            management.
+
+*/
+GLOBAL void for_mmcm_rel_ind (T_MMCM_RELEASE_IND * rel_ind)
+{
+  GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("for_mmcm_rel_ind()");
+
+  cc_data->ti = rel_ind->ti;
+  if ((cc_data->index_ti = srv_convert_ti (cc_data->ti))
+      NEQ NOT_PRESENT_8BIT)
+  {
+    cc_rel_ind (rel_ind->cause);
+  }
+
+  EM_CC_LOSS_OF_CONNECTION;
+  
+  PFREE (rel_ind);
+}
+
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_prompt_ind        |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_PROMPT_IND from mobility
+            management. In the CC entity nothing is done with the
+            primitve, a transaction identifier still is not assigned.
+            The reception of the primitive only causes the emission 
+            of MNCC_PROMPT_IND to upper layers.
+
+*/
+
+GLOBAL void for_mmcm_prompt_ind (T_MMCM_PROMPT_IND * mmcm_prompt_ind)
+{
+  TRACE_FUNCTION ("for_mmcm_prompt_ind()");
+  
+  PFREE (mmcm_prompt_ind);
+
+  {
+    PALLOC (mncc_prompt_ind, MNCC_PROMPT_IND);
+    PSENDX (MMI, mncc_prompt_ind);
+
+//    EM2
+  }
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_err_ind           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_ERR_IND from mobility
+            management.
+
+*/
+
+GLOBAL void for_mmcm_err_ind (T_MMCM_ERROR_IND * err_ind)
+{
+  GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("for_mmcm_err_ind()");
+
+  EM_CC_MM_CONNECTION_FAILED;
+
+  cc_data->ti = err_ind->ti;
+  if ((cc_data->index_ti = srv_convert_ti (cc_data->ti))
+      NEQ NOT_PRESENT_8BIT)
+  {
+    cc_err_ind (err_ind);
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_mmcm_reest_cnf         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Processing the primitive MMCC_REEST_CNF from mobility
+            management.
+
+*/
+
+GLOBAL void for_mmcm_reest_cnf (T_MMCM_REESTABLISH_CNF * reest_cnf)
+{
+  GET_INSTANCE_DATA;
+
+  TRACE_FUNCTION ("for_mmcm_reest_cnf()");
+
+  cc_data->ti = reest_cnf->ti;
+  if ((cc_data->index_ti = srv_convert_ti (cc_data->ti))
+      NEQ NOT_PRESENT_8BIT)
+  {
+    cc_reest_cnf ();
+  }
+
+  EM_CC_REESTABLISHED_SUCCESSFUL;
+
+  PFREE (reest_cnf);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_est_req                |
++--------------------------------------------------------------------+
+
+  PURPOSE : Build the primitive MMCC_EST_REQ and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_est_req (T_MMCM_ESTABLISH_REQ * mmcm_establish_req)
+{
+  TRACE_FUNCTION ("for_est_req()");
+
+  EM_CC_START_MO_CALL;  /*Needs perhaps a review */    
+
+  PSENDX (MM, mmcm_establish_req);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_rel_req                |
++--------------------------------------------------------------------+
+
+  PURPOSE : Build the primitive MMCC_RELEASE_REQ and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_rel_req (void)
+{
+  GET_INSTANCE_DATA;
+
+  PALLOC (rel, MMCM_RELEASE_REQ);
+
+  TRACE_FUNCTION ("for_rel_req()");
+    rel->org_entity = NAS_ORG_ENTITY_CC;
+    rel->ti = cc_data->ti;
+
+    PSENDX (MM, rel);
+
+    EM_CC_RELEASE_SENT;     
+
+    if (cc_data->ti NEQ cc_data->setup_reattempt_ti)
+  {
+    srv_free_ti ();
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_reest_req              |
++--------------------------------------------------------------------+
+
+  PURPOSE : Build the primitive MMCC_REEST_REQ and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_reest_req (void)
+{
+  GET_INSTANCE_DATA;
+
+  PALLOC (reest, MMCM_REESTABLISH_REQ);
+
+    TRACE_FUNCTION ("for_reest_req()");
+
+    reest->ti = cc_data->ti;
+
+    PSENDX (MM, reest);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_start_cc               |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the START CC message and send it to MM.
+
+*/
+
+GLOBAL void for_start_cc (T_U_START_CC * start_cc)
+{
+  TRACE_FUNCTION ("for_start_cc()");
+  
+/* Implements Measure#  38 */
+  code_msg ((UBYTE *)start_cc, BSIZE_U_START_CC);
+  
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_cc_est_confirm         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the CC EST. CONFIRMED message and send it to MM.
+
+*/
+
+GLOBAL void for_cc_est_confirm (T_U_CC_EST_CONF * est_cnf) 
+{
+  TRACE_FUNCTION ("for_cc_est_confirm()");
+
+/* Implements Measure#  38 */
+  code_msg ((UBYTE *)est_cnf, BSIZE_U_CC_EST_CONF);
+
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_setup                  |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message setup. The setup
+            message is here not sent to MM, but stored.
+
+*/
+
+GLOBAL void for_setup (T_U_SETUP * setup)
+{
+  GET_INSTANCE_DATA;
+  /*
+   * the maximum length of the outgoing setup message is 128 Bytes plus
+   * the length of the outgoing facility element
+   */
+
+  USHORT len_in_bits = LEN_U_SETUP;
+
+  if (setup->v_facility)
+    len_in_bits += setup->facility.c_fac * 8;
+  {
+    PALLOC_SDU (data, MMCM_DATA_REQ, len_in_bits);
+
+    TRACE_FUNCTION ("for_setup()");
+
+    data->sdu.o_buf = CC_ENCODE_OFFSET;
+
+    ccd_codeMsg (CCDENT_CC,
+                 UPLINK,
+                 (T_MSGBUF *) &data->sdu,
+                 (UBYTE    *) setup,
+                 NOT_PRESENT_8BIT);
+
+    EM_CC_SENT_SETUP_MESSAGE;/*lint !e416 (creation of out-of-bounds pointer)*/
+#if 0
+#if defined TRACE_BCAP
+    cc_trace_bcap (cc_data, &data->sdu, UPLINK);
+#endif
+#endif /* #if 0 */
+
+    srv_free_stored_setup (); /* Security */
+    cc_data->stored_setup = data;
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_emergency_setup        |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message emergency setup. The emergency setup
+            message is here not sent to MM, but stored.
+
+*/
+
+GLOBAL void for_emergency_setup (T_U_EMERGE_SETUP * emerg_setup)
+{
+  GET_INSTANCE_DATA;
+
+  PALLOC_MSG (data, MMCM_DATA_REQ, U_EMERGE_SETUP);
+
+    TRACE_FUNCTION ("for_emergency_setup()");
+
+    data->sdu.o_buf = CC_ENCODE_OFFSET;
+    ccd_codeMsg (CCDENT_CC,
+                 UPLINK,
+                 (T_MSGBUF *) &data->sdu,
+                 (UBYTE    *) emerg_setup,
+                 NOT_PRESENT_8BIT);
+
+    EM_CC_SENT_EMERGENCY_SETUP_MESSAGE;
+
+    srv_free_stored_setup (); /* Security */
+    cc_data->stored_setup = data;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_status                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message status and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_status (T_B_STATUS * status)
+{
+    TRACE_FUNCTION ("for_status()");
+/* Implements Measure#  22 */
+  code_msg ((UBYTE *)status, BSIZE_B_STATUS);
+    EM_CC_STATUS_SENT;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_release_complete       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message release_complete and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_release_complete (T_U_RELEASE_COMP * rel_com)
+{
+  GET_INSTANCE_DATA;
+  /*
+   * the sdu has a maximum length of 34 bytes.
+   * User-User, facility and ss version are never used
+   */
+  PALLOC_SDU (data, MMCM_DATA_REQ, LEN_U_RELEASE_COMPLETE);
+
+  TRACE_FUNCTION ("for_release_complete()");
+
+
+  if (cc_data->ti_ext_pres EQ TRUE)
+  {
+    data->sdu.o_buf = (USHORT)(CC_ENCODE_OFFSET+8);  /* additional byte for extended TI */
+  }
+  else
+  {
+    data->sdu.o_buf = CC_ENCODE_OFFSET;
+  }
+
+  ccd_codeMsg (CCDENT_CC,
+               UPLINK,
+               (T_MSGBUF *) &data->sdu,
+               (UBYTE    *) rel_com,
+               NOT_PRESENT_8BIT);
+
+  EM_CC_RELEASE_COMPLETE_SENT;
+  
+  for_pd (data);
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_disconnect             |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message disconnect and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_disconnect (T_U_DISCONNECT * disconnect)
+{
+  /*
+   * The mandatory part has a length of 33 bytes.
+   * User-User, facility and ss version are never used.
+   */
+  TRACE_FUNCTION ("for_disconnect()");
+/* Implements Measure#  11 */
+  code_msg ((UBYTE *)disconnect, LEN_U_DISCONNECT);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_modify_reject          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message modify reject and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_modify_reject (T_B_MODIFY_REJ * modify_rej)
+{
+  /*
+   * The message has a maximum length of 47 Bytes.
+   * HLC and LLC are never used.
+   */
+  TRACE_FUNCTION ("for_modify_reject()");
+/* Implements Measure#  11 */
+  code_msg ((UBYTE *)modify_rej, LEN_U_MODIFY_REJ);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_modify_complete        |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message modify complete and send them to
+            mobility management.
+
+*/
+GLOBAL void for_modify_complete (T_B_MODIFY_COMP * mod_com)
+{
+
+    TRACE_FUNCTION ("for_modify_complete()");
+/* Implements Measure#  27 */
+  code_msg ((UBYTE *)mod_com, BSIZE_B_MODIFY_COMP);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_start_dtmf             |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message start dtmf and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_start_dtmf ( T_U_START_DTMF * start_dtmf)
+{
+
+  TRACE_FUNCTION ("for_start_dtmf()");
+/* Implements Measure#  22 */
+  code_msg ((UBYTE *)start_dtmf, BSIZE_U_START_DTMF);
+  EM_CC_START_DTMF; 
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_stop_dtmf              |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message stop dtmf and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_stop_dtmf (void)
+{
+  GET_INSTANCE_DATA;
+
+
+  TRACE_FUNCTION ("for_stop_dtmf()");
+/* Implements Measure 42  */
+  for_fill_sdu_and_send (U_STOP_DTMF, BSIZE_U_STOP_DTMF);
+  EM_CC_STOP_DTMF;      
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_call_confirm           |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message call confirm and send them to
+            mobility management.
+
+*/
+
+/* Here measure Measure#  23 is removed since we are accessing data ptr in 
+EM_CC_CALL_CONFIRM_SENT */
+GLOBAL void for_call_confirm (T_U_CALL_CONF * call_confirm)
+{
+  GET_INSTANCE_DATA;
+  PALLOC_MSG (data, MMCM_DATA_REQ, U_CALL_CONF);
+
+  TRACE_FUNCTION ("for_call_confirm()");
+
+  data->sdu.o_buf = CC_ENCODE_OFFSET;
+  ccd_codeMsg (CCDENT_CC,
+               UPLINK,
+               (T_MSGBUF *) &data->sdu,
+               (UBYTE    *) call_confirm,
+               NOT_PRESENT_8BIT);
+
+  EM_CC_CALL_CONFIRM_SENT;/*lint !e416 (creation of out-of-bounds pointer)*/
+#if 0
+#if defined TRACE_BCAP
+  cc_trace_bcap (cc_data, &data->sdu, UPLINK);
+#endif /* #if defined TRACE_BCAP */
+#endif /* #if 0 */
+
+  for_pd (data);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_release                |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message release and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_release (T_U_RELEASE * release)
+{
+  /*
+   * the message has a maximum length of 34 bytes.
+   * It does not include cc_cause2, facility,
+   * user-user or ss version.
+   */
+  TRACE_FUNCTION ("for_release()");
+
+/* Implements Measure#  12 */
+  code_msg ((UBYTE *)release, LEN_U_RELEASE);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_connect_ack            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message connect ack and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_connect_ack (T_B_CONNECT_ACK *b_connect_ack )
+{
+  GET_INSTANCE_DATA;
+
+
+  TRACE_FUNCTION ("for_connect_ack()");
+/* Implements Measure 34  */
+  for_fill_sdu_and_send (B_CONNECT_ACK, BSIZE_B_CONNECT_ACK);
+  EM_CC_CONNECT_ACKNOWLEDGE;
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_retrieve               |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message retrieve and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_retrieve (void)
+{
+
+    TRACE_FUNCTION ("for_retrieve()");
+
+/* Implements Measure 42  */
+  for_fill_sdu_and_send (U_RETRIEVE, BSIZE_U_RETRIEVE);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_hold                   |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message hold and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_hold (void)
+{
+
+    TRACE_FUNCTION ("for_hold()");
+
+/* Implements Measure 42  */
+  for_fill_sdu_and_send (U_HOLD, BSIZE_U_HOLD);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_user_information       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message user information and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_user_information (T_B_USER_INFO * user_info)
+{
+  GET_INSTANCE_DATA;
+
+  /*
+   * The length of the outgoing message depends on
+   * the length of the user information plus message
+   * type, transaction identifier and the more data flag.
+   */
+  PALLOC_SDU (data, MMCM_DATA_REQ, 
+              (USHORT)(LEN_U_USER_USER + user_info->user_user.c_info * 8));
+
+  TRACE_FUNCTION ("for_user_information()");
+
+  EM_CC_USUER_TO_USER_DATA_SENT;
+
+  data->sdu.o_buf = CC_ENCODE_OFFSET;
+  ccd_codeMsg (CCDENT_CC,
+               UPLINK,
+               (T_MSGBUF *) &data->sdu,
+               (UBYTE    *) user_info,
+               NOT_PRESENT_8BIT);
+  for_pd (data);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_congestion_control     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message congestion control and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_congestion_control (T_B_CONGEST_CTRL * cong)
+{
+  
+
+    TRACE_FUNCTION ("for_congestion_control()");
+/* Implements Measure#  27 */
+  code_msg ((UBYTE *)cong, BSIZE_B_CONGEST_CTRL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_modify                 |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message modify and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_modify (T_B_MODIFY * modify)
+{
+
+    TRACE_FUNCTION ("for_modify()");
+
+/* Implements Measure#  28 */
+  code_msg ((UBYTE *)modify, BSIZE_B_MODIFY);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_connect                |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message connect and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_connect (T_U_CONNECT * connect)
+{
+  /*
+   * the message contains only message type
+   * and transaction identifier and no
+   * optional elements
+   */
+
+  TRACE_FUNCTION ("for_connect()");
+
+/* Implements Measure#  13 */
+  code_msg ((UBYTE *)connect, LEN_U_CONNECT);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_alert                  |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message alert and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_alert (T_U_ALERT * alert)
+{
+  /*
+   * the message contains only message type and
+   * transaction identifier and no optional
+   * elements
+   */
+
+  TRACE_FUNCTION ("for_alert()");
+
+/* Implements Measure#  14 */
+  code_msg ((UBYTE *)alert, LEN_U_ALERT);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_facility               |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message facility and send them to
+            mobility management.
+
+*/
+
+GLOBAL void for_facility (T_U_FACILITY * facility)
+{
+  /*
+   * The length of the outgoing message depends
+   * on the length of the facility information
+   * element plus message type, transaction identifier
+   * and ss version.
+   */
+  PALLOC_SDU (data, MMCM_DATA_REQ, 
+              (USHORT)(LEN_U_FACILITY + facility->facility.c_fac * 8));
+
+  TRACE_FUNCTION ("for_facility()");
+
+  data->sdu.o_buf = CC_ENCODE_OFFSET;
+  ccd_codeMsg (CCDENT_CC,
+               UPLINK,
+               (T_MSGBUF *) &data->sdu,
+               (UBYTE    *) facility,
+               NOT_PRESENT_8BIT);
+  for_pd (data);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_pd                     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Add protocol discriminator and transaction identifier.
+
+*/
+
+GLOBAL void for_pd (T_MMCM_DATA_REQ * data)
+{
+  GET_INSTANCE_DATA;
+
+  U8 *payload;
+  U16 length;
+  UBYTE *msg_type;
+/* Implements Measure#32: Row 71,...,95 */
+  
+
+  TRACE_FUNCTION ("for_pd()");
+
+  data->org_entity = NAS_ORG_ENTITY_CC;
+
+  TRACE_EVENT_P1("extended TI %spresent", (cc_data->ti_ext_pres EQ TRUE)? "":"not ");
+  if (cc_data->ti_ext_pres EQ TRUE)
+  {
+    data->sdu.o_buf -= 8;
+    data->sdu.l_buf += 8;
+    data->sdu.buf[data->sdu.o_buf >> 3] = cc_data->ti_ext;
+  }
+
+  SET_PD (data->sdu, M_MM_PD_CC);
+  SET_TI (data->sdu, cc_data->ti);
+  data->sdu.l_buf += 8;
+  data->sdu.o_buf -= 8;
+
+  msg_type = &(data->sdu.buf[CC_ENCODE_OFFSET >> 3]);/*lint !e415 !e416 Likely access or creation of out-of-bounds pointer*/
+  payload  = &(data->sdu.buf[0]);           /* beginning of buffer      */
+  payload += ((data->sdu.o_buf) >> 3);      /*  plus offset (bytes)     */
+  length   = ((data->sdu.l_buf) >> 3);      /* length (bytes, bits / 8) */
+
+  /*lint -e{415}  Likely access or creation of out-of-bounds pointer*/
+  switch (*msg_type)
+  {
+    case U_SETUP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Setup UL ",
+                    payload,
+                    length);
+      break;
+    case U_EMERGE_SETUP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Emergency Setup UL ",
+                    payload,
+                    length);
+      break;
+    case U_START_CC:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Call Control Capability UL ",
+                    payload,
+                    length);
+      break;
+    case U_CC_EST_CONF:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Establishment Confirm UL ",
+                    payload,
+                    length);
+      break;
+    case B_STATUS:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Status UL ",
+                    payload,
+                    length);
+      break;
+    case U_DISCONNECT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Disconnect UL ",
+                    payload,
+                    length);
+      break;
+    case B_MODIFY_REJ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Modify Reject UL ",
+                    payload,
+                    length);
+      break;
+    case B_MODIFY_COMP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Modify Complete UL ",
+                    payload,
+                    length);
+      break;
+    case U_START_DTMF:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Start DTMF UL ",
+                    payload,
+                    length);
+      break;
+    case U_STOP_DTMF:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Stop DTMF UL ",
+                    payload,
+                    length);
+      break;
+    case U_CALL_CONF:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Call Confirm UL ",
+                    payload,
+                    length);
+      break;
+    case U_RELEASE :
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Release  UL ",
+                    payload,
+                    length);
+      break;
+    case B_CONNECT_ACK:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Connect Acknowledge UL ",
+                    payload,
+                    length);
+      break;
+    case U_RETRIEVE:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Retrieve UL ",
+                    payload,
+                    length);
+      break;
+    case U_HOLD:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Hold UL ",
+                    payload,
+                    length);
+      break;
+    case B_USER_INFO:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " User Info UL ",
+                    payload,
+                    length);
+      break;
+    case B_CONGEST_CTRL:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Congestion Control UL ",
+                    payload,
+                    length);
+      break;
+    case B_MODIFY:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Modify UL ",
+                    payload,
+                    length);
+      break;
+    case U_CONNECT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Connect UL ",
+                    payload,
+                    length);
+      break;
+    case U_ALERT:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Alert UL ",
+                    payload,
+                    length);
+      break;
+    case U_FACILITY:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    " Facility UL ",
+                    payload,
+                    length);
+      break;
+    case U_RELEASE_COMP:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    "Release Complete UL ",
+                    payload,
+                    length);
+      break;
+    case B_NOTIFY:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    "Notify UL ",
+                    payload,
+                    length);
+      break;
+    case B_STATUS_ENQ:
+      TRACE_BINDUMP (cc_handle,
+                    TC_USER4,
+                    "Status Enquiry UL ",
+                    payload,
+                    length);
+      break;
+    default:
+      TRACE_EVENT("Unknown Message");
+      break;
+  } /* switch (*msg_type) */
+  PSENDX (MM, data);
+}
+/* Implements Measure#  11, 12, 13, 14, 22, 27, 28 and 38 */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : code_msg                   |
++--------------------------------------------------------------------+
+
+  PURPOSE : Code the message and add protocol discriminator and 
+  transaction identifier.
+
+*/
+
+LOCAL void code_msg (UBYTE * mStruct,
+                     USHORT len)
+{
+  TRACE_FUNCTION ("code_msg()");
+  {
+    /* Here we are using PALLOC_SDU for PALLOC_MSG also since they are same */
+    PALLOC_SDU (data, MMCM_DATA_REQ, len);
+  
+    data->sdu.o_buf = CC_ENCODE_OFFSET;
+    ccd_codeMsg (CCDENT_CC,
+                 UPLINK,
+                 (T_MSGBUF *) &data->sdu,
+                 mStruct,
+                 NOT_PRESENT_8BIT);
+    for_pd (data);
+  }
+}
+
+
+/* Implements Measure# 44 */
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_send_u_release_comp    |
++--------------------------------------------------------------------+
+
+  PURPOSE : Send release complete.
+
+*/
+LOCAL void for_send_u_release_comp (USHORT cause)
+
+{
+  TRACE_FUNCTION ("for_send_u_release_comp()");
+
+  CCD_END;
+  CCD_START;
+  /*
+   * For MM the connection is still valid
+   * CC has already released the connection.
+   */
+  {
+    MCAST (rel_com, U_RELEASE_COMP);
+
+    cc_build_release_complete (rel_com, 
+                               CAUSE_MAKE(DEFBY_STD, 
+                                          ORIGSIDE_MS, 
+                                          MNCC_CC_ORIGINATING_ENTITY,
+                                          cause));
+    for_release_complete (rel_com);
+  }
+  CCD_END;
+  for_rel_req ();
+}
+
+/* Implements Measure# 42 */
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)       MODULE  : CC_FOR                     |
+| STATE   : code                ROUTINE : for_retrieve_hold          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Send release complete.
+
+*/
+
+LOCAL void for_fill_sdu_and_send (UBYTE msg,
+                                  USHORT len)
+{  
+  PALLOC_SDU (data, MMCM_DATA_REQ, len);
+  data->sdu.o_buf = CC_ENCODE_OFFSET;
+  data->sdu.l_buf = 8;
+  /*lint -e{415} (warning-- Likely access or creation of out-of-bounds pointer)*/
+  data->sdu.buf [CC_ENCODE_OFFSET >> 3] = msg;
+  for_pd (data);
+}
+#endif