Ethereal-dev: [Ethereal-dev] Patch to packet-isup to display cause value string.
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: "Anders Broman (EAB)" <anders.broman@xxxxxxxxxxxxxxx>
Date: Thu, 20 Feb 2003 08:47:19 +0100
Hi,
Here's a patch to add printing of cause value string to packet-isup.c
Best regards
Anders Broman
--- packet-isup.c Tue Feb 18 21:44:43 2003
+++ packet-isup_b.c Tue Feb 18 21:48:15 2003
@@ -224,6 +224,8 @@
#define PARAM_TYPE_GENERIC_NR 192
#define PARAM_TYPE_GENERIC_DIGITS 193
+
+
static const value_string isup_parameter_type_value[] = {
{ PARAM_TYPE_END_OF_OPT_PARAMS, "End of optional parameters"},
{ PARAM_TYPE_CALL_REF, "Call Reference (national use)"},
@@ -1439,11 +1441,214 @@
/* ------------------------------------------------------------------
Dissector Parameter Cause Indicators - no detailed dissection since defined in Rec. Q.850
*/
+
+/*
+ * Dissect a Cause information element.
+ * The decoding of cause indicators parameter field are defined in ITU-T
+ * Recommendation Q.850 which referes to Q.931 hence the naming is keept from
+ * the "packet-q931.c" which is copied here, cause code values is from q.850 though.
+ */
+
+
+/*
+ * ITU-standardized coding.
+ */
+#define Q931_ITU_STANDARDIZED_CODING 0x00
+/*
+ * Variable-length IEs.
+ */
+#define Q931_IE_VL_EXTENSION 0x80 /* Extension flag */
+
+static const value_string q931_cause_coding_standard_vals[] = {
+ { 0x00, "ITU-T standardized coding" },
+ { 0x20, "ISO/IEC standard" },
+ { 0x40, "National standard" },
+ { 0x60, "Standard specific to identified location" },
+ { 0, NULL }
+};
+
+static const value_string q931_cause_location_vals[] = {
+ { 0x00, "User (U)" },
+ { 0x01, "Private network serving the local user (LPN)" },
+ { 0x02, "Public network serving the local user (LN)" },
+ { 0x03, "Transit network (TN)" },
+ { 0x04, "Public network serving the remote user (RLN)" },
+ { 0x05, "Private network serving the remote user (RPN)" },
+ { 0x07, "International network (INTL)" },
+ { 0x0A, "Network beyond interworking point (BI)" },
+ { 0, NULL }
+};
+
+static const value_string q931_cause_recommendation_vals[] = {
+ { 0x00, "Q.931" },
+ { 0x03, "X.21" },
+ { 0x04, "X.25" },
+ { 0x05, "Q.1031/Q.1051" },
+ { 0, NULL }
+};
+
+/*
+ * Cause codes for Cause.
+ */
+static const value_string q850_cause_code_vals[] = {
+ { 0x00, "Valid cause code not yet received" },
+ { 0x01, "Unallocated (unassigned) number" },
+ { 0x02, "No route to specified transit network" },
+ { 0x03, "No route to destination" },
+ { 0x04, "Send special information tone" },
+ { 0x05, "Misdialled trunk prefix" },
+ { 0x06, "Channel unacceptable" },
+ { 0x07, "Call awarded and being delivered in an established channel" },
+ { 0x08, "Preemtion" },
+ { 0x09, "Preemtion - circuit reserved for reuse" },
+ { 0x0A, " " },
+ { 0x0B, " " },
+ { 0x0E, "QoR: ported number" },
+ { 0x10, "Normal call clearing" },
+ { 0x11, "User busy" },
+ { 0x12, "No user responding" },
+ { 0x13, "No answer from user (user alerted)" },
+ { 0x14, "Subscriber absent" },
+ { 0x15, "Call rejected" },
+ { 0x16, "Number changed" },
+ { 0x17, "Redirection to new destination" },
+ { 0x18, "Call rejected due to feature at the destination" },
+ { 0x19, "Exchange routing error" },
+ { 0x1A, "Non-selected user clearing" },
+ { 0x1B, "Destination out of order" },
+ { 0x1C, "Invalid number format (address incomplete)" },
+ { 0x1D, "Facility rejected" },
+ { 0x1E, "Response to STATUS ENQUIRY" },
+ { 0x1F, "Normal unspecified" },
+ { 0x21, "Circuit out of order" },
+ { 0x22, "No circuit/channel available" },
+ { 0x23, " " },
+ { 0x25, " " },
+ { 0x26, "Network out of order" },
+ { 0x27, "Permanent frame mode connection out of service" },
+ { 0x28, "Permanent frame mode connection operational" },
+ { 0x29, "Temporary failure" },
+ { 0x2A, "Switching equipment congestion" },
+ { 0x2B, "Access information discarded" },
+ { 0x2C, "Requested circuit/channel not available" },
+ { 0x2D, " " },
+ { 0x2E, "Precedence call blocked" },
+ { 0x2F, "Resources unavailable, unspecified" },
+ { 0x31, "Quality of service unavailable" },
+ { 0x32, "Requested facility not subscribed" },
+ { 0x33, " " },
+ { 0x34, " " },
+ { 0x35, "Outgoing calls barred within CUG" },
+ { 0x36, " " },
+ { 0x37, "Incoming calls barred within CUG" },
+ { 0x38, "Call waiting not subscribed" },
+ { 0x39, "Bearer capability not authorized" },
+ { 0x3A, "Bearer capability not presently available" },
+ { 0x3E, "Inconsistency in designated outgoing access information and subscriber class" },
+ { 0x3F, "Service or option not available, unspecified" },
+ { 0x41, "Bearer capability not implemented" },
+ { 0x42, "Channel type not implemented" },
+ { 0x43, " " },
+ { 0x44, " " },
+ { 0x45, "Requested facility not implemented" },
+ { 0x46, "Only restricted digital information bearer capability is available" },
+ { 0x4F, "Service or option not implemented, unspecified" },
+ { 0x51, "Invalid call reference value" },
+ { 0x52, "Identified channel does not exist" },
+ { 0x53, "Call identity does not exist for suspended call" },
+ { 0x54, "Call identity in use" },
+ { 0x55, "No call suspended" },
+ { 0x56, "Call having the requested call identity has been cleared" },
+ { 0x57, "Called user not member of CUG" },
+ { 0x58, "Incompatible destination" },
+ { 0x59, " " },
+ { 0x5A, "Non-existing CUG" },
+ { 0x5B, "Invalid transit network selection (national use)" },
+ { 0x5C, " " },
+ { 0x5D, " " },
+ { 0x5F, "Invalid message, unspecified" },
+ { 0x60, "Mandatory information element is missing" },
+ { 0x61, "Message type non-existent or not implemented" },
+ { 0x62, "Message not compatible with call state or message type non-existent or not implemented" },
+ { 0x63, "Information element nonexistant or not implemented" },
+ { 0x64, "Invalid information element contents" },
+ { 0x65, "Message not compatible with call state" },
+ { 0x66, "Recovery on timer expiry" },
+ { 0x67, "Parameter non-existent or not implemented - passed on" },
+ { 0x6E, "Message with unrecognized parameter discarded" },
+ { 0x6F, "Protocol error, unspecified" },
+ { 0x7F, "Internetworking, unspecified" },
+ { 0, NULL }
+};
+static void
+dissect_q931_cause_ie(tvbuff_t *tvb, int offset, int len,
+ proto_tree *tree )
+{
+ guint8 octet;
+ guint8 coding_standard;
+
+ if (len == 0)
+ return;
+ octet = tvb_get_guint8(tvb, offset);
+ coding_standard = octet & 0x60;
+ proto_tree_add_text(tree, tvb, offset, 1,
+ "Coding standard: %s",
+ val_to_str(coding_standard, q931_cause_coding_standard_vals, NULL));
+ if (coding_standard != Q931_ITU_STANDARDIZED_CODING) {
+ /*
+ * We don't know how the cause is encoded,
+ * so just dump it as data and be done with it.
+ */
+ proto_tree_add_text(tree, tvb, offset,
+ len, "Data: %s",
+ tvb_bytes_to_str(tvb, offset, len));
+ return;
+ }
+ proto_tree_add_text(tree, tvb, offset, 1,
+ "Location: %s",
+ val_to_str(octet & 0x0F, q931_cause_location_vals,
+ "Unknown (0x%X)"));
+ offset += 1;
+ len -= 1;
+
+ if (!(octet & Q931_IE_VL_EXTENSION)) {
+ if (len == 0)
+ return;
+ octet = tvb_get_guint8(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 1,
+ "Recommendation: %s",
+ val_to_str(octet & 0x7F, q931_cause_recommendation_vals,
+ "Unknown (0x%02X)"));
+ offset += 1;
+ len -= 1;
+ }
+
+ if (len == 0)
+ return;
+ octet = tvb_get_guint8(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 1,
+ "Cause value: %s (%i)",
+ val_to_str(octet & 0x7F, q850_cause_code_vals,
+ "Unknown (0x%02X)"));
+ offset += 1;
+ len -= 1;
+
+ if (len == 0)
+ return;
+ proto_tree_add_text(tree, tvb, offset, len,
+ "Diagnostics: %s",
+ tvb_bytes_to_str(tvb, offset, len));
+}
+
+
static void
dissect_isup_cause_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{ guint length = tvb_length(parameter_tvb);
proto_tree_add_text(parameter_tree, parameter_tvb,0, length, "Cause indicators (-> Q.850)");
+ dissect_q931_cause_ie(parameter_tvb,0,length,
+ parameter_tree);
proto_item_set_text(parameter_item, "Cause indicators, see Q.850 (%u byte%s length)", length , plurality(length, "", "s"));
+
}
/* ------------------------------------------------------------------
- Follow-Ups:
- Prev by Date: [Ethereal-dev] Add Cause value iin decimal to q.931 printout
- Next by Date: RE: [Ethereal-dev] Another advice question
- Previous by thread: Re: [Ethereal-dev] Add Cause value iin decimal to q.931 printout
- Next by thread: Re: [Ethereal-dev] Patch to packet-isup to display cause value string.
- Index(es):





