List of L3 CC Causes and network problem indication in AZQ

If determined as a network problem, the call end event shall be a call drop or call block.

Below is the list of L3 CC Causes and problem-indication used in AZQ (in ANSI C) voice call state determination.

The list and cause values are from 3GPP TS 24.008 table 10.5.123.

void add_cc_cause_cause(uint8_t cc_raw_cause, int* is_nw_problem) //set is_nw_problem to 1 if cause determined as nw problem 

{

  uint8_t val = cc_raw_cause & 0x7f;//lower 7 bits omit ext  

  

  /*if cccause not in

    -user busy

    -no user resp

    -user alerting, no answer

    -normal call clearing

    then signal that there is a problem here and when call end_req comes then omit it to signal block or drop

  */    


  *is_nw_problem = 0; 


    switch(val)

      {

                  //3gpp ts 24.008 table 10.5.123

                  case 0x1://Unassigned (unallocated) number

                   {

                           add_mo_end_cause("Unassigned (unallocated) number");

                           

                   }

                   break;

                   case 0x3://No route to destination

                   {

                           add_mo_end_cause("No route to destination");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x6://Channel unacceptable

                   {

                           add_mo_end_cause("Channel unacceptable");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x8://Operator determined barring

                   {

                           add_mo_end_cause("Operator determined barring");

                           

                   }

                   break;

                   case 0x10://Normal call clearing

                   {

                           add_mo_end_cause("Normal call clearing");

                           

                   }

                   break;

                   case 0x11://User busy

                   {

                           add_mo_end_cause("User busy");

                           

                   }

                   break;

                   case 0x12://No user responding

                   {

                           add_mo_end_cause("No user responding");

                           

                   }

                   break;

                   case 0x13://User alerting, no answer

                   {

       add_mo_end_cause("User alerting, no answer");

                           

                   }

                   break;

                   case 0x15://Call rejected

                   {

                           add_mo_end_cause("Call rejected");

      //should not be - as per dr songkran email - remote reject would be a MT-call-drop - so commented out *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x16://Number changed

                   {

                           add_mo_end_cause("Number changed");

                           

                   }

                   break;

                   case 0x19://Pre-emption

                   {

                           add_mo_end_cause("Pre-emption");

                   }

                   break;

                   case 0x1A://Non selected user clearing

                   {

                           add_mo_end_cause("Non selected user clearing");

      *is_nw_problem = 1;

                   }

                   break;

                   case 0x1B://Destination out of order

                   {

                           add_mo_end_cause("Destination out of order");

                   }

                   break;

                   case 0x1C://Invalid number format (incomplete number)

                   {

                           add_mo_end_cause("Invalid number format (incomplete number)");

                   }

                   break;

                   case 0x1D://Facility rejected

                   {

                           add_mo_end_cause("Facility rejected");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x1E://Response to STATUS ENQUIRY

                   {

                           add_mo_end_cause("Response to STATUS ENQUIRY");

      *is_nw_problem = 1;

                   }

                   break;

                   case 0x1F://Normal, unspecified

                   {

                           add_mo_end_cause("Normal, unspecified");

                           

                   }

                   break;

                   case 0x22://No circuit/channel available

                   {

                           add_mo_end_cause("No circuit/channel available");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x26://Network out of order

                   {

                           add_mo_end_cause("Network out of order");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x29://Temporary failure

                   {

                           add_mo_end_cause("Temporary failure");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x2A://Switching equipment congestion

                   {

                           add_mo_end_cause("Switching equipment congestion");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x2B://Access information discarded

                   {

                           add_mo_end_cause("Access information discarded");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x2C://requested circuit/channel not available

                   {

                           add_mo_end_cause("requested circuit/channel not available");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x2F://Resources unavailable, unspecified

                   {

                           add_mo_end_cause("Resources unavailable, unspecified");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x31://Quality of service unavailable

                   {

                           add_mo_end_cause("Quality of service unavailable");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x32://Requested facility not subscribed

                   {

                           add_mo_end_cause("Requested facility not subscribed");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x37://Incoming calls barred within the CUG

                   {

                           add_mo_end_cause("Incoming calls barred within the CUG");

      *is_nw_problem = 0; //060612 changed to 0 because comes when DTAC remote press red key to dismiss incoming call

                           

                   }

                   break;

                   case 0x39://Bearer capability not authorized

                   {

                           add_mo_end_cause("Bearer capability not authorized");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x3A://Bearer capability not presently available    //Note 3

                   {

                           add_mo_end_cause("Bearer capability not presently available    //Note 3");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x3F://Service or option not available, unspecified

                   {

                           add_mo_end_cause("Service or option not available, unspecified");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x41://Bearer service not implemented

                   {

                           add_mo_end_cause("Bearer service not implemented");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x44://ACM equal to or greater than ACMmax

                   {

                           add_mo_end_cause("ACM equal to or greater than ACMmax");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x45://Requested facility not implemented

                   {

                           add_mo_end_cause("Requested facility not implemented");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x46://Only restricted digital information bearer capability is available

                   {

                           add_mo_end_cause("Only restricted digital information bearer capability is available");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x4F://Service or option not implemented, unspecified

                   {

                           add_mo_end_cause("Service or option not implemented, unspecified");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x51://Invalid transaction identifier value

                   {

                           add_mo_end_cause("Invalid transaction identifier value");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x57://User not member of CUG

                   {

                           add_mo_end_cause("User not member of CUG");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x58://Incompatible destination //Incompatible parameter (Note 2)

                   {

                           add_mo_end_cause("Incompatible destination //Incompatible parameter (Note 2)");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x5B://Invalid transit network selection

                   {

                           add_mo_end_cause("Invalid transit network selection");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x5F://Semantically incorrect message

                   {

                           add_mo_end_cause("Semantically incorrect message");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x60://Invalid mandatory information //Information element identifier(s)

                   {

                           add_mo_end_cause("Invalid mandatory information //Information element identifier(s)");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x61://Message type non-existent or not implemented   //Message type

                   {

                           add_mo_end_cause("Message type non-existent or not implemented   //Message type");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x62://Message type not compatible with protocol state

                   {

                           add_mo_end_cause("Message type not compatible with protocol state");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x63://Information element non-existent or not implemented  //Information element identifier(s) (notes 6,7)

                   {

                           add_mo_end_cause("Information element non-existent or not implemented  //Information element identifier(s) (notes 6,7)");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x64://Conditional IE error  //Information element identifier(s) (note 6)

                   {

                           add_mo_end_cause("Conditional IE error  //Information element identifier(s) (note 6)");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x65://Message not compatible with protocol state

                   {

                           add_mo_end_cause("Message not compatible with protocol state");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x66://Recovery on timer expiry

                   {

                           add_mo_end_cause("Recovery on timer expiry");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x6F://Protocol error, unspecified

                   {

                           add_mo_end_cause("Protocol error, unspecified");

      *is_nw_problem = 1; 

                           

                   }

                   break;

                   case 0x7F://Interworking, unspecified

                   {

                           add_mo_end_cause("Interworking, unspecified");

      *is_nw_problem = 1;                            

                   }

                   break;


                  default: //TODO: handle other cases


      //prevent infinite nested calls

      if(nested_call_lock)

        {

   add_mo_end_cause("unknown cc_cause_retry2");

   return;

        }


      {

      nested_call_lock = 1;


      /*All other values in the range 0 to 31 shall be treated as cause 31.*/

      /*All other values in the range 32 to 47 shall be treated as cause 47.*/                

                    /*All other values in the range 48 to 63 shall be treated as cause 63.*/

                    /*All other values in the range 64 to 79 shall be treated as cause 79.*/

                    /*All other values in the range 80 to 95 shall be treated as cause 95.*/

                    /*All other values in the range 96 to 111 shall be treated as cause 111.*/

      /*All other values in the range 112 to 127 shall be treated as cause 127.*/

      if(/*omit as its uint8_t so its always >= 0 anyway val>=0 &&*/ val <=31)

        add_cc_cause_cause(31, is_nw_problem);

      else

        if(val>=32 && val <=47)

   add_cc_cause_cause(47, is_nw_problem);

        else

   if(val>=48 && val<=63)

     add_cc_cause_cause(63, is_nw_problem);

   else

     if(val>=64 && val <= 79)

       add_cc_cause_cause(79, is_nw_problem);

     else

       if(val>=80 && val<=95)

         add_cc_cause_cause(95, is_nw_problem);

       else

         if(val >=96 && val<=111)

    add_cc_cause_cause(111, is_nw_problem);

         else

    if(val >= 112 && val <= 127)

      add_cc_cause_cause(127, is_nw_problem);

    else

      add_mo_end_cause("unknown cc_cause");

      //clear lock

      nested_call_lock = 0;

      }

      

                  break;


              }


}