<p>sungtae kim has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/11287">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res/ari/resource_channels.c: Added detail hangup reason<br><br>Currently, DELETE /ari/channels/<channelID> supports only few hangup reasons.<br>It's good enough for simple use, but when it needs to set the detail reason,<br>it comes challenges.<br>And setting reason text is not clear to use. Because of the Asterisk uses<br>numbers for ChannelDestroyed event, use the reason code is easier to use.<br>Added reason_code query parameter for that.<br><br>ASTERISK-28385<br><br>Change-Id: I1cf1d991ffd759d0591b347445a55f416ddc3ff2<br>---<br>M res/ari/ari_model_validators.c<br>M res/ari/ari_model_validators.h<br>M res/ari/resource_channels.c<br>M res/ari/resource_channels.h<br>M res/res_ari_channels.c<br>M rest-api/api-docs/channels.json<br>6 files changed, 165 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/87/11287/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/ari/ari_model_validators.c b/res/ari/ari_model_validators.c</span><br><span>index e3ca10a..8910bbb 100644</span><br><span>--- a/res/ari/ari_model_validators.c</span><br><span>+++ b/res/ari/ari_model_validators.c</span><br><span>@@ -2455,6 +2455,7 @@</span><br><span>   struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_args = 0;</span><br><span>    int has_channel = 0;</span><br><span>         int has_destination = 0;</span><br><span>@@ -2491,6 +2492,7 @@</span><br><span>             } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2547,6 +2549,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ApplicationMoveFailed missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_args) {</span><br><span>             ast_log(LOG_ERROR, "ARI ApplicationMoveFailed missing required field args\n");</span><br><span>             res = 0;</span><br><span>diff --git a/res/ari/ari_model_validators.h b/res/ari/ari_model_validators.h</span><br><span>index adf3e1a..f9285b4 100644</span><br><span>--- a/res/ari/ari_model_validators.h</span><br><span>+++ b/res/ari/ari_model_validators.h</span><br><span>@@ -1603,7 +1603,7 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - args: List[string] (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * - destination: string (required)</span><br><span>diff --git a/res/ari/resource_channels.c b/res/ari/resource_channels.c</span><br><span>index c195eef..24ab511 100644</span><br><span>--- a/res/ari/resource_channels.c</span><br><span>+++ b/res/ari/resource_channels.c</span><br><span>@@ -48,6 +48,94 @@</span><br><span> </span><br><span> #include <limits.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct causes_map {</span><br><span style="color: hsl(120, 100%, 40%);">+        int cause;</span><br><span style="color: hsl(120, 100%, 40%);">+    const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct causes_map causes[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { AST_CAUSE_NOTDEFINED, "not_defined" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { AST_CAUSE_UNALLOCATED, "unallocated" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { AST_CAUSE_NO_ROUTE_TRANSIT_NET, "no_route_transit_network" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_NO_ROUTE_DESTINATION, "no_route_destination" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_MISDIALLED_TRUNK_PREFIX, "misdialed_trunk_prefix" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { AST_CAUSE_CHANNEL_UNACCEPTABLE, "channel_unacceptable" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_CALL_AWARDED_DELIVERED, "call_awarded_delivered" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_PRE_EMPTED, "pre_empted" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_NUMBER_PORTED_NOT_HERE, "number_ported_not_here" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_NORMAL_CLEARING, "normal" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { AST_CAUSE_USER_BUSY, "busy" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { AST_CAUSE_NO_USER_RESPONSE, "timeout" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { AST_CAUSE_NO_ANSWER, "no_answer" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_SUBSCRIBER_ABSENT, "subscriber_absent" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_CALL_REJECTED, "rejected" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { AST_CAUSE_NUMBER_CHANGED, "number_changed" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_REDIRECTED_TO_NEW_DESTINATION, "redirected_to_new_destination" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_ANSWERED_ELSEWHERE, "answered_elsewhere" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_DESTINATION_OUT_OF_ORDER, "destination_out_of_order" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_INVALID_NUMBER_FORMAT, "number_incomplete" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { AST_CAUSE_FACILITY_REJECTED, "facility_rejected" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_RESPONSE_TO_STATUS_ENQUIRY, "response_to_status_enquiry" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_NORMAL_UNSPECIFIED, "normal_unspecified" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_NORMAL_CIRCUIT_CONGESTION, "congestion" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { AST_CAUSE_NETWORK_OUT_OF_ORDER, "failure" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { AST_CAUSE_NORMAL_TEMPORARY_FAILURE, "normal_temporary_failure" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_SWITCH_CONGESTION, "switch_congestion" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_ACCESS_INFO_DISCARDED, "access_info_discarded" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_REQUESTED_CHAN_UNAVAIL, "requested_chan_unavailable" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_FACILITY_NOT_SUBSCRIBED, "facility_not_subscribed" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { AST_CAUSE_OUTGOING_CALL_BARRED, "outgoing_call_barred" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_INCOMING_CALL_BARRED, "incoming_call_barred" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_BEARERCAPABILITY_NOTAUTH, "bearercapability_not_auth" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { AST_CAUSE_BEARERCAPABILITY_NOTAVAIL, "codec_mismatch" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { AST_CAUSE_BEARERCAPABILITY_NOTIMPL, "bearercapability_not_implemented" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_CHAN_NOT_IMPLEMENTED, "channel_not_implemented" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { AST_CAUSE_FACILITY_NOT_IMPLEMENTED, "facility_not_implemented" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_INVALID_CALL_REFERENCE, "invalid_call_reference" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_INCOMPATIBLE_DESTINATION, "incompatible_destination" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_INVALID_MSG_UNSPECIFIED, "invalid_msg_unspecified" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { AST_CAUSE_MANDATORY_IE_MISSING, "mandatory_ie_missing" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_MESSAGE_TYPE_NONEXIST, "message_type_nonexist" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_WRONG_MESSAGE, "wrong_message" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_IE_NONEXIST, "ie_nonexist" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { AST_CAUSE_INVALID_IE_CONTENTS, "invalid_ie_contents" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { AST_CAUSE_WRONG_CALL_STATE, "wrong_call_state" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_RECOVERY_ON_TIMER_EXPIRE, "recovery_on_timer_expire" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { AST_CAUSE_MANDATORY_IE_LENGTH_ERROR, "mandatory_ie_length_error" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { AST_CAUSE_PROTOCOL_ERROR, "protocol_error" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { AST_CAUSE_INTERWORKING, "interworking" },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Return reason code if the given cause is correct reason code.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Otherwise return -1.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_available_reason_code(int cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int x;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (x = 0; x < ARRAY_LEN(causes); x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (causes[x].cause == cause)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return causes[x].cause;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Return 1 if the given cause is correct reason code */</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_reason_to_code(const char* reason)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int x;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (x = 0; x < ARRAY_LEN(causes); x++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!strcmp(causes[x].name, reason)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        return causes[x].cause;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> /*!</span><br><span>  * \brief Ensure channel is in a state that allows operation to be performed.</span><br><span>@@ -885,33 +973,13 @@</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (ast_strlen_zero(args->reason) || !strcmp(args->reason, "normal")) {</span><br><span style="color: hsl(0, 100%, 40%);">-         cause = AST_CAUSE_NORMAL;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else if (!strcmp(args->reason, "busy")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                cause = AST_CAUSE_BUSY;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!strcmp(args->reason, "congestion")) {</span><br><span style="color: hsl(0, 100%, 40%);">-          cause = AST_CAUSE_CONGESTION;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (!strcmp(args->reason, "no_answer")) {</span><br><span style="color: hsl(0, 100%, 40%);">-           cause = AST_CAUSE_NOANSWER;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if (!strcmp(args->reason, "timeout")) {</span><br><span style="color: hsl(0, 100%, 40%);">-             cause = AST_CAUSE_NO_USER_RESPONSE;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else if (!strcmp(args->reason, "rejected")) {</span><br><span style="color: hsl(0, 100%, 40%);">-            cause = AST_CAUSE_CALL_REJECTED;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (!strcmp(args->reason, "unallocated")) {</span><br><span style="color: hsl(0, 100%, 40%);">-         cause = AST_CAUSE_UNALLOCATED;</span><br><span style="color: hsl(0, 100%, 40%);">-  } else if (!strcmp(args->reason, "normal_unspecified")) {</span><br><span style="color: hsl(0, 100%, 40%);">-          cause = AST_CAUSE_NORMAL_UNSPECIFIED;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else if (!strcmp(args->reason, "number_incomplete")) {</span><br><span style="color: hsl(0, 100%, 40%);">-           cause = AST_CAUSE_INVALID_NUMBER_FORMAT;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else if (!strcmp(args->reason, "codec_mismatch")) {</span><br><span style="color: hsl(0, 100%, 40%);">-              cause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else if (!strcmp(args->reason, "interworking")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                cause = AST_CAUSE_INTERWORKING;</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (!strcmp(args->reason, "failure")) {</span><br><span style="color: hsl(0, 100%, 40%);">-             cause = AST_CAUSE_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-      } else if(!strcmp(args->reason, "answered_elsewhere")) {</span><br><span style="color: hsl(0, 100%, 40%);">-           cause = AST_CAUSE_ANSWERED_ELSEWHERE;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ast_strlen_zero(args->reason)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              cause = get_reason_to_code(args->reason);</span><br><span>         } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              cause = get_available_reason_code(args->reason_code);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (cause < 0) {</span><br><span>          ast_ari_response_error(</span><br><span>                      response, 400, "Invalid Reason",</span><br><span>                   "Invalid reason for hangup provided");</span><br><span>diff --git a/res/ari/resource_channels.h b/res/ari/resource_channels.h</span><br><span>index 401c8a5..fcd5e7d 100644</span><br><span>--- a/res/ari/resource_channels.h</span><br><span>+++ b/res/ari/resource_channels.h</span><br><span>@@ -207,7 +207,9 @@</span><br><span> struct ast_ari_channels_hangup_args {</span><br><span>     /*! Channel's id */</span><br><span>      const char *channel_id;</span><br><span style="color: hsl(0, 100%, 40%);">- /*! Reason for hanging up the channel */</span><br><span style="color: hsl(120, 100%, 40%);">+      /*! The reason code for hanging up the channel. If the reason is set, this will be ignored. See detail hangup codes at here. https://wiki.asterisk.org/wiki/display/AST/Hangup+Cause+Mappings */</span><br><span style="color: hsl(120, 100%, 40%);">+      int reason_code;</span><br><span style="color: hsl(120, 100%, 40%);">+      /*! Reason for hanging up the channel. See detail hangup code at here. https://wiki.asterisk.org/wiki/display/AST/Hangup+Cause+Mappings */</span><br><span>   const char *reason;</span><br><span> };</span><br><span> /*!</span><br><span>diff --git a/res/res_ari_channels.c b/res/res_ari_channels.c</span><br><span>index 73d1e4b..f6ac3cc 100644</span><br><span>--- a/res/res_ari_channels.c</span><br><span>+++ b/res/res_ari_channels.c</span><br><span>@@ -598,6 +598,10 @@</span><br><span> {</span><br><span>    struct ast_json *field;</span><br><span>      /* Parse query parameters out of it */</span><br><span style="color: hsl(120, 100%, 40%);">+        field = ast_json_object_get(body, "reason_code");</span><br><span style="color: hsl(120, 100%, 40%);">+   if (field) {</span><br><span style="color: hsl(120, 100%, 40%);">+          args->reason_code = ast_json_integer_get(field);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span>    field = ast_json_object_get(body, "reason");</span><br><span>       if (field) {</span><br><span>                 args->reason = ast_json_string_get(field);</span><br><span>@@ -625,6 +629,9 @@</span><br><span> #endif /* AST_DEVMODE */</span><br><span> </span><br><span>  for (i = get_params; i; i = i->next) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (strcmp(i->name, "reason_code") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       args.reason_code = atoi(i->value);</span><br><span style="color: hsl(120, 100%, 40%);">+         } else</span><br><span>               if (strcmp(i->name, "reason") == 0) {</span><br><span>                   args.reason = (i->value);</span><br><span>                 } else</span><br><span>diff --git a/rest-api/api-docs/channels.json b/rest-api/api-docs/channels.json</span><br><span>index 4ea5f56..da0c6eb 100644</span><br><span>--- a/rest-api/api-docs/channels.json</span><br><span>+++ b/rest-api/api-docs/channels.json</span><br><span>@@ -407,8 +407,17 @@</span><br><span>                                                       "dataType": "string"</span><br><span>                                             },</span><br><span>                                           {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "name": "reason_code",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    "description": "The reason code for hanging up the channel. If the reason is set, this will be ignored. See detail hangup codes at here. https://wiki.asterisk.org/wiki/display/AST/Hangup+Cause+Mappings",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       "paramType": "query",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "required": false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  "allowMultiple": false,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     "dataType": "int",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        "defalutValue": 0</span><br><span style="color: hsl(120, 100%, 40%);">+                                           },</span><br><span style="color: hsl(120, 100%, 40%);">+                                            {</span><br><span>                                                    "name": "reason",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   "description": "Reason for hanging up the channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       "description": "Reason for hanging up the channel. See detail hangup code at here. https://wiki.asterisk.org/wiki/display/AST/Hangup+Cause+Mappings",</span><br><span>                                                    "paramType": "query",</span><br><span>                                                    "required": false,</span><br><span>                                                         "allowMultiple": false,</span><br><span>@@ -417,19 +426,55 @@</span><br><span>                                                    "allowableValues": {</span><br><span>                                                               "valueType": "LIST",</span><br><span>                                                             "values": [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "not_defined",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      "unallocated",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      "no_route_transit_network",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "no_route_destination",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     "misdialed_trunk_prefix",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   "channel_unacceptable",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     "call_awarded_delivered",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   "pre_empted",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       "number_ported_not_here",</span><br><span>                                                                  "normal",</span><br><span>                                                                  "busy",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                       "congestion",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                 "no_answer",</span><br><span>                                                                       "timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  "no_answer",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        "subscriber_absent",</span><br><span>                                                                       "rejected",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   "unallocated",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                        "normal_unspecified",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       "number_changed",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   "redirected_to_new_destination",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    "answered_elsewhere",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       "destination_out_of_order",</span><br><span>                                                                        "number_incomplete",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                  "codec_mismatch",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     "interworking",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     "facility_rejected",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        "response_to_status_enquiry",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       "congestion",</span><br><span>                                                                      "failure",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                    "answered_elsewhere"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        "normal_temporary_failure",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "switch_congestion",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        "access_info_discarded",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    "requested_chan_unavailable",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       "facility_not_subscribed",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  "outgoing_call_barred",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     "incoming_call_barred",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     "bearercapability_not_auth",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        "codec_mismatch",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   "bearercapability_not_implemented",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "channel_not_implemented",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  "facility_not_implemented",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "invalid_call_reference",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   "incompatible_destination",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "invalid_msg_unspecified",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  "mandatory_ie_missing",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     "message_type_nonexist",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    "wrong_message",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    "ie_nonexist",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      "invalid_ie_contents",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      "wrong_call_state",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "recovery_on_timer_expire",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 "mandatory_ie_length_error",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        "protocol_error",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   "interworking"</span><br><span>                                                             ]</span><br><span>                                                    }</span><br><span>                                            }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/11287">change 11287</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/11287"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I1cf1d991ffd759d0591b347445a55f416ddc3ff2 </div>
<div style="display:none"> Gerrit-Change-Number: 11287 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: sungtae kim <pchero21@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>