We’ve encountered a problem like yours, but with Zap trunks (Sangoma E1).
I’ve patched FreePBX to handle this correctly, by checking $HANGUPCAUSE.
[Please note that a few ISDN hangup causes are not treated yet]
I’ll try to submit the patch to the devs, hopefully it’ll get included in the next versions of FreePBX.
-
// added by Nicson
-
$exten = "s-UNALLOC";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Unallocated/Unassigned number - giving up'));
-
$ext->add($context, $exten, '', new ext_progress());
-
$ext->add($context, $exten, '', new ext_playback('ss-noservice|noanswer'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-NONET";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting No route to specified transit network - giving up'));
-
$ext->add($context, $exten, '', new ext_progress());
-
$ext->add($context, $exten, '', new ext_playback('ss-noservice|noanswer'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-NOROUTE";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting No route to destination - giving up'));
-
$ext->add($context, $exten, '', new ext_progress());
-
$ext->add($context, $exten, '', new ext_playback('ss-noservice|noanswer'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-CHANUNACCEPT";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Channel unacceptable - giving up'));
-
$ext->add($context, $exten, '', new ext_playtones('busy'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-REJECT";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Call Rejected - giving up'));
-
$ext->add($context, $exten, '', new ext_playtones('busy'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-CHANGED";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Number Changed - giving up'));
-
$ext->add($context, $exten, '', new ext_playtones('busy'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = 's-CONGESTION';
-
// added by Nicson
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "1"]', 's-UNALLOC,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "2"]', 's-NONET,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "3"]', 's-NOROUTE,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "6"]', 's-CHANUNACCEPT,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "11"]', 's-BUSY,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "12"]', 's-NOANSWER,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "13"]', 's-NOANSWER,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "15"]', 's-REJECT,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "16"]', 's-CHANGED,1'));
-
// end added by Nicson
-
$exten = '_s-.';
$ext->add($context, $exten, '', new ext_gotoif('$["x${OUTFAIL_${ARG1}}" = "x"]', 'noreport'));
$ext->add($context, $exten, '', new ext_agi('${OUTFAIL_${ARG1}}'));
-
// added by Nicson
-
$exten = "s-UNALLOC";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Unallocated/Unassigned number - giving up'));
-
$ext->add($context, $exten, '', new ext_answer());
-
$ext->add($context, $exten, '', new ext_playback('ss-noservice'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-NONET";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting No route to specified transit network - giving up'));
-
$ext->add($context, $exten, '', new ext_answer());
-
$ext->add($context, $exten, '', new ext_playback('ss-noservice'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-NOROUTE";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting No route to destination - giving up'));
-
$ext->add($context, $exten, '', new ext_answer());
-
$ext->add($context, $exten, '', new ext_playback('ss-noservice'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-CHANUNACCEPT";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Channel unacceptable - giving up'));
-
$ext->add($context, $exten, '', new ext_playtones('busy'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-REJECT";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Call Rejected - giving up'));
-
$ext->add($context, $exten, '', new ext_playtones('busy'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
-
$exten = "s-CHANGED";
-
$ext->add($context, $exten, '', new ext_noop('Dial failed due to trunk reporting Number Changed - giving up'));
-
$ext->add($context, $exten, '', new ext_playtones('busy'));
-
$ext->add($context, $exten, '', new ext_busy(20));
-
// end added by Nicson
-
$exten = '_s-.';
-
// added by Nicson
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "1"]', 's-UNALLOC,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "2"]', 's-NONET,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "3"]', 's-NOROUTE,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "6"]', 's-CHANUNACCEPT,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "11"]', 's-BUSY,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "12"]', 's-NOANSWER,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "13"]', 's-NOANSWER,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "15"]', 's-REJECT,1'));
-
$ext->add($context, $exten, '', new ext_gotoif('$["${HANGUPCAUSE}" = "16"]', 's-CHANGED,1'));
-
// end added by Nicson
$ext->add($context, $exten, '', new ext_gotoif('$["x${OUTFAIL_${ARG1}}" = "x"]', 'noreport'));
$ext->add($context, $exten, '', new ext_agi('${OUTFAIL_${ARG1}}'));
$ext->add($context, $exten, 'noreport', new ext_noop('TRUNK Dial failed due to ${DIALSTATUS} - failing through to other trunks'));