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;
}
}