diff options
-rw-r--r-- | epan/dissectors/asn1/camel/camel.cnf | 8 | ||||
-rw-r--r-- | epan/dissectors/asn1/inap/inap.cnf | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-camel.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-inap.c | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-isup.c | 975 | ||||
-rw-r--r-- | epan/dissectors/packet-isup.h | 8 |
6 files changed, 299 insertions, 712 deletions
diff --git a/epan/dissectors/asn1/camel/camel.cnf b/epan/dissectors/asn1/camel/camel.cnf index a298179964..b8922fbb75 100644 --- a/epan/dissectors/asn1/camel/camel.cnf +++ b/epan/dissectors/asn1/camel/camel.cnf @@ -240,7 +240,7 @@ if((camel_ver == 2)||(camel_ver == 1)){ return offset; subtree = proto_item_add_subtree(actx->created_item, ett_camel_callingpartynumber); -dissect_isup_calling_party_number_parameter(parameter_tvb, subtree, NULL); +dissect_isup_calling_party_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL); #.END #---------------------------------------------------------------------------------------- @@ -254,7 +254,7 @@ dissect_isup_calling_party_number_parameter(parameter_tvb, subtree, NULL); return offset; subtree = proto_item_add_subtree(actx->created_item, ett_camel_calledpartybcdnumber); - dissect_isup_called_party_number_parameter(parameter_tvb, subtree, NULL); + dissect_isup_called_party_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL); #.END #---------------------------------------------------------------------------------------- @@ -268,7 +268,7 @@ dissect_isup_calling_party_number_parameter(parameter_tvb, subtree, NULL); return offset; subtree = proto_item_add_subtree(actx->created_item, ett_camel_locationnumber); -dissect_isup_location_number_parameter(parameter_tvb, subtree, NULL); +dissect_isup_location_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL); #.END #---------------------------------------------------------------------------------------- @@ -449,7 +449,7 @@ proto_tree *subtree; if (!parameter_tvb) return offset; - dissect_isup_redirecting_number_parameter(parameter_tvb, tree, NULL); + dissect_isup_redirecting_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); #.END #---------------------------------------------------------------------------------------- diff --git a/epan/dissectors/asn1/inap/inap.cnf b/epan/dissectors/asn1/inap/inap.cnf index a8565f81e7..cea4e082ed 100644 --- a/epan/dissectors/asn1/inap/inap.cnf +++ b/epan/dissectors/asn1/inap/inap.cnf @@ -234,7 +234,7 @@ static const inap_err_t inap_err_tab[] = { if (!parameter_tvb) return offset; -dissect_isup_called_party_number_parameter(parameter_tvb, tree, NULL); +dissect_isup_called_party_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); #.FN_BODY CallingPartyNumber VAL_PTR = ¶meter_tvb tvbuff_t *parameter_tvb; @@ -244,7 +244,7 @@ dissect_isup_called_party_number_parameter(parameter_tvb, tree, NULL); if (!parameter_tvb) return offset; - dissect_isup_calling_party_number_parameter(parameter_tvb, tree, NULL); + dissect_isup_calling_party_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); #.FN_BODY BearerCapability/bearerCap VAL_PTR = ¶meter_tvb @@ -289,7 +289,7 @@ dissect_isup_called_party_number_parameter(parameter_tvb, tree, NULL); if (!parameter_tvb) return offset; - dissect_isup_redirecting_number_parameter(parameter_tvb, tree, NULL); + dissect_isup_redirecting_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); #.FN_BODY HighLayerCompatibility VAL_PTR = ¶meter_tvb /* diff --git a/epan/dissectors/packet-camel.c b/epan/dissectors/packet-camel.c index 942ab8bb25..0b80f9d13d 100644 --- a/epan/dissectors/packet-camel.c +++ b/epan/dissectors/packet-camel.c @@ -2182,7 +2182,7 @@ dissect_camel_CalledPartyNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in return offset; subtree = proto_item_add_subtree(actx->created_item, ett_camel_calledpartybcdnumber); - dissect_isup_called_party_number_parameter(parameter_tvb, subtree, NULL); + dissect_isup_called_party_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL); return offset; } @@ -2202,7 +2202,7 @@ dissect_camel_CallingPartyNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, i return offset; subtree = proto_item_add_subtree(actx->created_item, ett_camel_callingpartynumber); -dissect_isup_calling_party_number_parameter(parameter_tvb, subtree, NULL); +dissect_isup_calling_party_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL); return offset; } @@ -2808,7 +2808,7 @@ dissect_camel_LocationNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int o return offset; subtree = proto_item_add_subtree(actx->created_item, ett_camel_locationnumber); -dissect_isup_location_number_parameter(parameter_tvb, subtree, NULL); +dissect_isup_location_number_parameter(parameter_tvb, actx->pinfo, subtree, NULL); return offset; } @@ -4857,7 +4857,7 @@ dissect_camel_RedirectingPartyID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, i if (!parameter_tvb) return offset; - dissect_isup_redirecting_number_parameter(parameter_tvb, tree, NULL); + dissect_isup_redirecting_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); return offset; } diff --git a/epan/dissectors/packet-inap.c b/epan/dissectors/packet-inap.c index 948d6c591f..4ff6ce0c24 100644 --- a/epan/dissectors/packet-inap.c +++ b/epan/dissectors/packet-inap.c @@ -2362,7 +2362,7 @@ dissect_inap_CalledPartyNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int if (!parameter_tvb) return offset; -dissect_isup_called_party_number_parameter(parameter_tvb, tree, NULL); +dissect_isup_called_party_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); @@ -2413,7 +2413,7 @@ dissect_inap_CallingPartyNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in if (!parameter_tvb) return offset; - dissect_isup_calling_party_number_parameter(parameter_tvb, tree, NULL); + dissect_isup_calling_party_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); @@ -4808,7 +4808,7 @@ dissect_inap_RedirectingPartyID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in if (!parameter_tvb) return offset; - dissect_isup_redirecting_number_parameter(parameter_tvb, tree, NULL); + dissect_isup_redirecting_number_parameter(parameter_tvb, actx->pinfo, tree, NULL); diff --git a/epan/dissectors/packet-isup.c b/epan/dissectors/packet-isup.c index 23177cd96b..a8d818b97e 100644 --- a/epan/dissectors/packet-isup.c +++ b/epan/dissectors/packet-isup.c @@ -2721,6 +2721,17 @@ static gboolean isup_show_cic_in_info = TRUE; static int hf_isup_called = -1; static int hf_isup_calling = -1; static int hf_isup_redirecting = -1; +static int hf_isup_redirection_number = -1; +static int hf_isup_subsequent_number = -1; +static int hf_isup_connected_number = -1; +static int hf_isup_transit_network_selection = -1; +static int hf_isup_original_called_number = -1; +static int hf_isup_location_number = -1; +static int hf_isup_call_transfer_number = -1; +static int hf_isup_called_in_number = -1; +static int hf_isup_generic_number = -1; +static int hf_isup_jurisdiction = -1; +static int hf_isup_charge_number = -1; static int hf_isup_cic = -1; static int hf_bicc_cic = -1; @@ -3133,6 +3144,7 @@ static expert_field ei_isup_not_dissected_yet = EI_INIT; static expert_field ei_isup_message_type_no_optional_parameters = EI_INIT; static expert_field ei_isup_status_subfield_not_present = EI_INIT; static expert_field ei_isup_empty_number = EI_INIT; +static expert_field ei_isup_too_many_digits = EI_INIT; static dissector_handle_t bicc_handle; @@ -3331,36 +3343,113 @@ dissect_isup_transmission_medium_requirement_parameter(tvbuff_t *parameter_tvb, proto_item_set_text(parameter_item, "Transmission medium requirement: %u (%s)", transmission_medium_requirement, val_to_str_ext_const(transmission_medium_requirement, &isup_transmission_medium_requirement_value_ext, "spare")); } + +char * +dissect_isup_digits_common(tvbuff_t *tvb, gint offset, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, + const char *param_name, gint hf_number, gint hf_odd_digit, gint hf_even_digit, + gboolean even_indicator, e164_number_type_t number_type, guint nature_of_address) +{ + gint i = 0; + gint length; + proto_item *digits_item; + proto_tree *digits_tree; + guint8 digit_pair = 0; + char number[MAXDIGITS + 1] = ""; + e164_info_t e164_info; + gboolean old_visible; + gboolean set_visibility = FALSE; + + length = tvb_reported_length_remaining(tvb, offset); + if (length == 0) { + expert_add_info(pinfo, item, &ei_isup_empty_number); + proto_item_set_text(item, "%s: (empty)", param_name); + return NULL; + } + + /* We are going to be using proto_item_append_string() on hf_number so we + * must disable the TRY_TO_FAKE_THIS_ITEM() optimisation for the tree by + * setting it as visible. See proto.h for details. + */ + if(proto_field_is_referenced(tree, hf_number)) { + old_visible = proto_tree_set_visible(tree, TRUE); + set_visibility = TRUE; + } + digits_item = proto_tree_add_string(tree, hf_number, tvb, offset, -1, ""); + digits_tree = proto_item_add_subtree(digits_item, ett_isup_address_digits); + if(set_visibility) { + proto_tree_set_visible(tree, old_visible); + } + + while (length > 0) { + digit_pair = tvb_get_guint8(tvb, offset); + proto_tree_add_uint(digits_tree, hf_odd_digit, tvb, offset, 1, digit_pair); + number[i++] = number_to_char(digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); + + if (i > MAXDIGITS) { + expert_add_info(pinfo, digits_item, &ei_isup_too_many_digits); + break; + } + + if ((length - 1) > 0) { + proto_tree_add_uint(digits_tree, hf_even_digit, tvb, offset, 1, digit_pair); + number[i++] = number_to_char((digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); + + if (i > MAXDIGITS) { + expert_add_info(pinfo, digits_item, &ei_isup_too_many_digits); + break; + } + } + + offset += 1; + length = tvb_reported_length_remaining(tvb, offset); + } + + if (even_indicator && (tvb_reported_length(tvb) > 0)) { + /* Even Indicator set -> last (even) digit is valid and has be displayed */ + proto_tree_add_uint(digits_tree, hf_isup_calling_party_even_address_signal_digit, + tvb, offset - 1, 1, digit_pair); + number[i++] = number_to_char((digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); + } + + number[i++] = '\0'; + + /* Now that we have all the digits decoded, add them to the parameter field */ + proto_item_append_string(digits_item, number); + + if (number_type != NONE) { + e164_info.e164_number_type = number_type; + e164_info.nature_of_address = nature_of_address; + e164_info.E164_number_str = number; + e164_info.E164_number_length = i - 1; + dissect_e164_number(tvb, digits_tree, 2, (offset - 2), e164_info); + } + + proto_item_set_text(item, "%s: %s", param_name, number); + + return wmem_strdup(wmem_packet_scope(), number); +} + /* ------------------------------------------------------------------ Dissector Parameter Called party number */ void -dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; - proto_item *hidden_item; guint8 indicators1, indicators2; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char called_number[MAXDIGITS + 1] = ""; - e164_info_t e164_info; gint number_plan; - static const int * indicators1_flags[] = { + static const int *indicators1_flags[] = { &hf_isup_odd_even_indicator, &hf_isup_called_party_nature_of_address_indicator, NULL }; - static const int * indicators2_flags[] = { + static const int *indicators2_flags[] = { &hf_isup_inn_indicator, &hf_isup_numbering_plan_indicator, NULL }; - indicators1 = tvb_get_guint8(parameter_tvb, 0); proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_flags, ENC_NA); indicators2 = tvb_get_guint8(parameter_tvb, 1); @@ -3368,110 +3457,30 @@ dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree * proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_flags, ENC_NA); offset = 2; - if (tvb_reported_length_remaining(parameter_tvb, offset) == 0) { - proto_tree_add_string_format_value(parameter_tree, hf_isup_called, parameter_tvb, offset, 0, "", "(empty)"); - proto_item_set_text(parameter_item, "Called Number: (empty)"); - return; - } - - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, offset, -1, - ett_isup_address_digits, &address_digits_item, "Called Party Number"); - - while ((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - } - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { /* Even Indicator set -> last even digit is valid */ - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - - called_number[i++] = '\0'; - proto_item_set_text(address_digits_item, "Called Party Number: %s", called_number); - proto_item_set_text(parameter_item, "Called Party Number: %s", called_number); - if (number_plan == 1) { - e164_info.e164_number_type = CALLED_PARTY_NUMBER; - e164_info.nature_of_address = indicators1 & 0x7f; - e164_info.E164_number_str = called_number; - e164_info.E164_number_length = i - 1; - dissect_e164_number(parameter_tvb, address_digits_tree, 2, (offset - 2), e164_info); - hidden_item = proto_tree_add_string(address_digits_tree, hf_isup_called, parameter_tvb, - offset - length, length, called_number); - PROTO_ITEM_SET_HIDDEN(hidden_item); - } else { - proto_tree_add_string(address_digits_tree, hf_isup_called, parameter_tvb, - offset - length, length, called_number); - } - tap_called_number = wmem_strdup(wmem_packet_scope(), called_number); + tap_called_number = dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Called Party Number", hf_isup_called, hf_isup_called_party_odd_address_signal_digit, + hf_isup_called_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + number_plan == 1 ? CALLED_PARTY_NUMBER : NONE, + (indicators1 & 0x7f)); } + /* ------------------------------------------------------------------ Dissector Parameter Subsequent number */ static void -dissect_isup_subsequent_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_subsequent_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char called_number[MAXDIGITS + 1] = ""; indicators1 = tvb_get_guint8(parameter_tvb, 0); proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1); offset = 1; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, offset, -1, - ett_isup_address_digits, &address_digits_item, - "Subsequent Number"); - - while ((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - called_number[i] = '\0'; - - proto_item_set_text(address_digits_item, "Subsequent Number: %s", called_number); - proto_item_set_text(parameter_item, "Subsequent Number: %s", called_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Subsequent Number", hf_isup_subsequent_number, hf_isup_called_party_odd_address_signal_digit, + hf_isup_called_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } /* ------------------------------------------------------------------ Dissector Parameter Information Request Indicators @@ -5174,18 +5183,10 @@ dissect_isup_optional_forward_call_indicators_parameter(tvbuff_t *parameter_tvb, Dissector Parameter calling party number */ void -dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; - proto_item *hidden_item; guint8 indicators1, indicators2; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; - e164_info_t e164_info; gint number_plan; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, @@ -5207,61 +5208,11 @@ dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree number_plan = (indicators2 & 0x70)>> 4; offset = 2; - length = tvb_reported_length_remaining(parameter_tvb, offset); - if (length == 0) { - proto_tree_add_string_format_value(parameter_tree, hf_isup_calling, parameter_tvb, offset, 0, "", "(empty)"); - proto_item_set_text(parameter_item, "Calling Number: (empty)"); - return; - } - - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Calling Party Number"); - - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - proto_item_append_text(address_digits_item, ": %s", calling_number); - calling_number[i++] = '\0'; - if (number_plan == 1) { - e164_info.e164_number_type = CALLING_PARTY_NUMBER; - e164_info.nature_of_address = indicators1 & 0x7f; - e164_info.E164_number_str = calling_number; - e164_info.E164_number_length = i - 1; - dissect_e164_number(parameter_tvb, address_digits_tree, 2, (offset - 2), e164_info); - hidden_item = proto_tree_add_string(address_digits_tree, hf_isup_calling, parameter_tvb, - offset - length, length, calling_number); - PROTO_ITEM_SET_HIDDEN(hidden_item); - } else { - proto_tree_add_string(address_digits_tree, hf_isup_calling, parameter_tvb, - offset - length, length, calling_number); - } - - proto_item_set_text(parameter_item, "Calling Party Number: %s", calling_number); - tap_calling_number = wmem_strdup(wmem_packet_scope(), calling_number); + tap_calling_number = dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Calling Party Number", hf_isup_calling, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + number_plan == 1 ? CALLING_PARTY_NUMBER : NONE, + (indicators1 & 0x7f)); } /* ------------------------------------------------------------------ Dissector Parameter Original called number @@ -5269,14 +5220,8 @@ dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree void dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_calling_party_nature_of_address_indicator, @@ -5294,65 +5239,20 @@ dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, packet_in proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA); offset = 2; - length = tvb_reported_length_remaining(parameter_tvb, offset); - - if (length == 0) { - expert_add_info(pinfo, parameter_item, &ei_isup_empty_number); - proto_item_set_text(parameter_item, "Original Called Number: (empty)"); - return; - } - - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Original Called Number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Original Called Number: %s", calling_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Original Called Number", hf_isup_original_called_number, + hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, + ((indicators1 & 0x80) == 0), NONE, 0); } /* ------------------------------------------------------------------ Dissector Parameter Redirecting number */ void -dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_calling_party_nature_of_address_indicator, @@ -5364,71 +5264,25 @@ dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *p NULL }; - proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA); indicators1 = tvb_get_guint8(parameter_tvb, 0); proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA); offset = 2; - length = tvb_reported_length_remaining(parameter_tvb, offset); - - if (length == 0) { - proto_tree_add_string_format_value(parameter_tree, hf_isup_redirecting, parameter_tvb, offset, 0, "", "(empty)"); - proto_item_set_text(parameter_item, "Redirecting Number: (empty)"); - return; - } - - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Redirecting Number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_tree_add_string(address_digits_tree, hf_isup_redirecting, parameter_tvb, offset - length, length, calling_number); - proto_item_set_text(parameter_item, "Redirecting Number: %s", calling_number); + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Redirecting Number", hf_isup_redirecting, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Parameter Redirection number */ static void -dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char called_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_called_party_nature_of_address_indicator, @@ -5440,48 +5294,17 @@ dissect_isup_redirection_number_parameter(tvbuff_t *parameter_tvb, proto_tree *p NULL }; - proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA); indicators1 = tvb_get_guint8(parameter_tvb, 0); proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA); offset = 2; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Redirection Number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - called_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", called_number); - proto_item_set_text(parameter_item, "Redirection Number: %s", called_number); + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Redirection Number", hf_isup_redirection_number, hf_isup_called_party_odd_address_signal_digit, + hf_isup_called_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Parameter Connection request */ @@ -5583,16 +5406,10 @@ dissect_isup_signalling_point_code_parameter(tvbuff_t *parameter_tvb, proto_tree Dissector Parameter Connected number */ static void -dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_calling_party_nature_of_address_indicator, @@ -5605,65 +5422,25 @@ dissect_isup_connected_number_parameter(tvbuff_t *parameter_tvb, proto_tree *par NULL }; - proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators1_fields, ENC_NA); indicators1 = tvb_get_guint8(parameter_tvb, 0); proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA); offset = 2; - length = tvb_reported_length_remaining(parameter_tvb, offset); - if (length == 0) - return; /* empty connected number */ - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Connected Number"); - - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Connected Number: %s", calling_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Connected Number", hf_isup_connected_number, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Transit network selection */ static void -dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; - guint8 indicators; - guint8 address_digit_pair = 0; + guint8 indicators1; gint offset = 0; - gint i = 0; - gint length; - char network_id[MAXDIGITS + 1] = ""; static const int * indicators_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_type_of_network_identification, @@ -5672,45 +5449,15 @@ dissect_isup_transit_network_selection_parameter(tvbuff_t *parameter_tvb, proto_ }; proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 0, 1, indicators_fields, ENC_NA); - indicators = tvb_get_guint8(parameter_tvb, 0); + indicators1 = tvb_get_guint8(parameter_tvb, 0); offset = 1; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Network identification"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - network_id[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - network_id[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - network_id[i++] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", network_id); - proto_item_set_text(parameter_item, "Transit network selection: %s", network_id); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Transit network selection", hf_isup_transit_network_selection, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Parameter Circuit assignment map */ @@ -6351,16 +6098,10 @@ dissect_isup_transmission_medium_requirement_prime_parameter(tvbuff_t *parameter Dissector Parameter location number */ void -dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1, indicators2; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_calling_party_nature_of_address_indicator, @@ -6395,43 +6136,12 @@ dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *para offset = 2; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Location number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Location number: %s", calling_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Location number", hf_isup_location_number, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Parameter Redirection number restriction */ @@ -6483,20 +6193,15 @@ dissect_isup_loop_prevention_indicators_parameter(tvbuff_t *parameter_tvb, proto proto_item_set_text(parameter_item, "Loop prevention indicators: Response (%u)", indicator); } } + /* ------------------------------------------------------------------ Dissector Parameter Call transfer number */ static void -dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1, indicators2; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; indicators1 = tvb_get_guint8(parameter_tvb, 0); proto_tree_add_boolean(parameter_tree, hf_isup_odd_even_indicator, parameter_tvb, 0, 1, indicators1); @@ -6510,41 +6215,12 @@ dissect_isup_call_transfer_number_parameter(tvbuff_t *parameter_tvb, proto_tree proto_tree_add_uint(parameter_tree, hf_isup_screening_indicator_enhanced, parameter_tvb, 1, 1, indicators2); offset = 2; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Call transfer number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Call transfer number: %s", calling_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Call Transfer Number", hf_isup_call_transfer_number, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Parameter CCSS */ @@ -6664,20 +6340,15 @@ dissect_isup_call_diversion_treatment_indicators_parameter(tvbuff_t *parameter_t proto_tree_add_boolean(parameter_tree, hf_isup_extension_ind, parameter_tvb, 0, CALL_DIV_TREATMENT_IND_LENGTH, indicator); proto_item_set_text(parameter_item, "Call diversion treatment indicators: 0x%x", indicator); } + /* ------------------------------------------------------------------ Dissector Parameter called IN number */ static void -dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_calling_party_nature_of_address_indicator, @@ -6694,41 +6365,12 @@ dissect_isup_called_in_number_parameter(tvbuff_t *parameter_tvb, proto_tree *par proto_tree_add_bitmask_list(parameter_tree, parameter_tvb, 1, 1, indicators2_fields, ENC_NA); offset = 2; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Called IN Number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Called IN Number: %s", calling_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Called IN Number", hf_isup_called_in_number, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ Dissector Parameter Call offering treatment indicators */ @@ -6883,6 +6525,7 @@ dissect_isup_calling_geodetic_location_parameter(tvbuff_t *parameter_tvb, packet proto_item_set_text(parameter_item, "Calling geodetic location"); } + /* ------------------------------------------------------------------ Dissector Parameter Generic number */ @@ -6903,18 +6546,11 @@ static const range_string number_qualifier_indicator_vals[] = { { 0xff, 0xff, "reserved for expansion"}, { 0, 0, NULL} }; - void dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1, indicators2; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_calling_party_nature_of_address_indicator, @@ -6947,43 +6583,10 @@ dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinf } offset = 3; - length = tvb_reported_length_remaining(parameter_tvb, offset); - if (length == 0) { - expert_add_info(pinfo, parameter_item, &ei_isup_empty_number); - proto_item_set_text(parameter_item, "Generic Number: (empty)"); - return; - } - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Generic number"); - - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { - /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Generic Number", hf_isup_generic_number, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); /* * Indicators1 = Nature of address @@ -6992,62 +6595,26 @@ dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinf indicators1 = indicators1 & 0x7f; indicators2 = (indicators2 & 0x70)>>4; if ((indicators1 == ISUP_CALLED_PARTY_NATURE_INTERNATNL_NR) && (indicators2 == ISDN_NUMBERING_PLAN)) - dissect_e164_cc(parameter_tvb, address_digits_tree, 3, E164_ENC_BCD); - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Generic number: %s", calling_number); - + dissect_e164_cc(parameter_tvb, parameter_tree, 3, E164_ENC_BCD); } + /* ------------------------------------------------------------------ Dissector Parameter Jurisdiction parameter */ static void -dissect_isup_jurisdiction_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_jurisdiction_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char called_number[MAXDIGITS + 1] = ""; offset = 0; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Jurisdiction"); - - while ((length = tvb_reported_length_remaining(parameter_tvb, offset)) > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - } - - if (tvb_reported_length(parameter_tvb) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_called_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - called_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - called_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", called_number); - proto_item_set_text(parameter_item, "Jurisdiction: %s", called_number); + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Jurisdiction", hf_isup_jurisdiction, hf_isup_called_party_odd_address_signal_digit, + hf_isup_called_party_even_address_signal_digit, (tvb_reported_length(parameter_tvb) > 0), + NONE, 0); +} -}/* ------------------------------------------------------------------ +/* ------------------------------------------------------------------ Dissector Parameter Generic name */ static void @@ -7089,16 +6656,10 @@ dissect_isup_generic_digits_parameter(tvbuff_t *parameter_tvb, proto_tree *param Dissector Parameter Charge number */ static void -dissect_isup_charge_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) +dissect_isup_charge_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_item *address_digits_item; - proto_tree *address_digits_tree; guint8 indicators1; - guint8 address_digit_pair = 0; gint offset = 0; - gint i = 0; - gint length; - char calling_number[MAXDIGITS + 1] = ""; static const int * indicators1_fields[] = { &hf_isup_odd_even_indicator, &hf_isup_charge_number_nature_of_address_indicator, @@ -7110,42 +6671,12 @@ dissect_isup_charge_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parame proto_tree_add_item(parameter_tree, hf_isup_numbering_plan_indicator, parameter_tvb, 1, 1, ENC_NA); offset = 2; - address_digits_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, - offset, -1, ett_isup_address_digits, &address_digits_item, - "Charge Number"); - - length = tvb_reported_length_remaining(parameter_tvb, offset); - while (length > 0) { - address_digit_pair = tvb_get_guint8(parameter_tvb, offset); - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_odd_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char(address_digit_pair & ISUP_ODD_ADDRESS_SIGNAL_DIGIT_MASK); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - if ((length - 1) > 0) { - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - offset += 1; - length = tvb_reported_length_remaining(parameter_tvb, offset); - } - - if (((indicators1 & 0x80) == 0) && (tvb_reported_length(parameter_tvb) > 0)) { /* Even Indicator set -> last even digit is valid & has be displayed */ - proto_tree_add_uint(address_digits_tree, hf_isup_calling_party_even_address_signal_digit, - parameter_tvb, offset - 1, 1, address_digit_pair); - calling_number[i++] = number_to_char((address_digit_pair & ISUP_EVEN_ADDRESS_SIGNAL_DIGIT_MASK) / 0x10); - if (i > MAXDIGITS) - THROW(ReportedBoundsError); - } - calling_number[i] = '\0'; - - proto_item_append_text(address_digits_item, ": %s", calling_number); - proto_item_set_text(parameter_item, "Charge Number: %s", calling_number); - + dissect_isup_digits_common(parameter_tvb, offset, pinfo, parameter_tree, parameter_item, + "Charge Number", hf_isup_charge_number, hf_isup_calling_party_odd_address_signal_digit, + hf_isup_calling_party_even_address_signal_digit, ((indicators1 & 0x80) == 0), + NONE, 0); } + /* ------------------------------------------------------------------ */ static void dissect_isup_unknown_parameter(tvbuff_t *parameter_tvb, proto_item *parameter_item) @@ -8395,10 +7926,10 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_info * dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item, pinfo); break; case PARAM_TYPE_CALLED_PARTY_NR: - dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_called_party_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_SUBSQT_NR: - dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_subsequent_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_NATURE_OF_CONN_IND: dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8413,13 +7944,13 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_info * dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item, itu_isup_variant); break; case PARAM_TYPE_CALLING_PARTY_NR: - dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_calling_party_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_REDIRECTING_NR: - dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_redirecting_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_REDIRECTION_NR: - dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_redirection_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CONNECTION_REQ: dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8464,13 +7995,13 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_info * dissect_isup_user_to_user_information_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CONNECTED_NR: - dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_connected_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_SUSP_RESUME_IND: dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_TRANSIT_NETW_SELECT: - dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_transit_network_selection_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_EVENT_INFO: dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8554,7 +8085,7 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_info * dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_LOCATION_NR: - dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_location_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_REDIR_NR_RSTRCT: dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8566,7 +8097,7 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_info * dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_CALL_TRANS_NR: - dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_call_transfer_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CCSS: dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8593,7 +8124,7 @@ dissect_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_info * dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_CALLED_IN_NR: - dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_called_in_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CALL_OFF_TREAT_IND: dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8753,10 +8284,10 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_access_transport_parameter(parameter_tvb, parameter_tree, parameter_item, pinfo); break; case PARAM_TYPE_CALLED_PARTY_NR: - dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_called_party_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_SUBSQT_NR: - dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_subsequent_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_NATURE_OF_CONN_IND: dissect_isup_nature_of_connection_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8771,13 +8302,13 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_calling_partys_category_parameter(parameter_tvb, parameter_tree, parameter_item, itu_isup_variant); break; case PARAM_TYPE_CALLING_PARTY_NR: - dissect_isup_calling_party_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_calling_party_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_REDIRECTING_NR: - dissect_isup_redirecting_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_redirecting_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_REDIRECTION_NR: - dissect_isup_redirection_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_redirection_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CONNECTION_REQ: dissect_isup_connection_request_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8822,13 +8353,13 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_user_to_user_information_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CONNECTED_NR: - dissect_isup_connected_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_connected_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_SUSP_RESUME_IND: dissect_isup_suspend_resume_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_TRANSIT_NETW_SELECT: - dissect_isup_transit_network_selection_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_transit_network_selection_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_EVENT_INFO: dissect_isup_event_information_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8915,7 +8446,7 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_transmission_medium_requirement_prime_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_LOCATION_NR: - dissect_isup_location_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_location_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_REDIR_NR_RSTRCT: dissect_isup_redirection_number_restriction_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8927,7 +8458,7 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_loop_prevention_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_CALL_TRANS_NR: - dissect_isup_call_transfer_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_call_transfer_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CCSS: dissect_isup_ccss_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8954,7 +8485,7 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_call_diversion_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_CALLED_IN_NR: - dissect_isup_called_in_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_called_in_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_CALL_OFF_TREAT_IND: dissect_isup_call_offering_treatment_indicators_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8987,7 +8518,7 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_generic_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_JURISDICTION: - dissect_isup_jurisdiction_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_jurisdiction_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_GENERIC_NAME: dissect_isup_generic_name_parameter(parameter_tvb, parameter_tree, parameter_item); @@ -8996,7 +8527,7 @@ dissect_ansi_isup_optional_parameter(tvbuff_t *optional_parameters_tvb, packet_i dissect_isup_generic_digits_parameter(parameter_tvb, parameter_tree, parameter_item); break; case PARAM_TYPE_CHARGE_NR: - dissect_isup_charge_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_charge_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); break; case PARAM_TYPE_APPLICATON_TRANS: dissect_isup_application_transport_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); @@ -9098,7 +8629,7 @@ dissect_ansi_isup_circuit_reservation_message(tvbuff_t *message_tvb, proto_tree Dissector Message Type Initial address message */ static gint -dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree, guint8 itu_isup_variant) +dissect_isup_initial_address_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree, guint8 itu_isup_variant) { proto_item *parameter_item; proto_tree *parameter_tree; tvbuff_t *parameter_tvb; @@ -9201,7 +8732,7 @@ dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tre offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length); - dissect_isup_called_party_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_called_party_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); offset += PARAMETER_POINTER_LENGTH; return offset; @@ -9210,7 +8741,7 @@ dissect_isup_initial_address_message(tvbuff_t *message_tvb, proto_tree *isup_tre /* ------------------------------------------------------------------ Dissector Message Type subsequent address message */ -static gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, proto_tree *isup_tree) +static gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup_tree) { proto_item *parameter_item; proto_tree *parameter_tree; tvbuff_t *parameter_tvb; @@ -9238,7 +8769,7 @@ static gint dissect_isup_subsequent_address_message(tvbuff_t *message_tvb, proto offset + parameter_pointer + PARAMETER_LENGTH_IND_LENGTH, MIN(parameter_length, actual_length), parameter_length); - dissect_isup_subsequent_number_parameter(parameter_tvb, parameter_tree, parameter_item); + dissect_isup_subsequent_number_parameter(parameter_tvb, pinfo, parameter_tree, parameter_item); offset += PARAMETER_POINTER_LENGTH; return offset; @@ -10037,11 +9568,11 @@ dissect_ansi_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree /* distinguish between message types:*/ switch (message_type) { case MESSAGE_TYPE_INITIAL_ADDR: - offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree, itu_isup_variant); + offset += dissect_isup_initial_address_message(parameter_tvb, pinfo, isup_tree, itu_isup_variant); opt_part_possible = TRUE; break; case MESSAGE_TYPE_SUBSEQ_ADDR: - offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree); + offset += dissect_isup_subsequent_address_message(parameter_tvb, pinfo, isup_tree); opt_part_possible = TRUE; break; case MESSAGE_TYPE_INFO_REQ: @@ -10338,11 +9869,11 @@ dissect_isup_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *isup /* distinguish between message types:*/ switch (message_type) { case MESSAGE_TYPE_INITIAL_ADDR: - offset += dissect_isup_initial_address_message(parameter_tvb, isup_tree, itu_isup_variant); + offset += dissect_isup_initial_address_message(parameter_tvb, pinfo, isup_tree, itu_isup_variant); opt_part_possible = TRUE; break; case MESSAGE_TYPE_SUBSEQ_ADDR: - offset += dissect_isup_subsequent_address_message(parameter_tvb, isup_tree); + offset += dissect_isup_subsequent_address_message(parameter_tvb, pinfo, isup_tree); opt_part_possible = TRUE; break; case MESSAGE_TYPE_INFO_REQ: @@ -11870,18 +11401,73 @@ proto_register_isup(void) NULL, HFILL }}, { &hf_isup_called, - { "ISUP Called Number", "isup.called", - FT_STRING, BASE_NONE, NULL, 0x0, + { "Called Party Number", "isup.called", + FT_STRING, ENC_ASCII, NULL, 0x0, NULL, HFILL }}, { &hf_isup_calling, - { "ISUP Calling Number", "isup.calling", - FT_STRING, BASE_NONE, NULL, 0x0, + { "Calling Party Number", "isup.calling", + FT_STRING, ENC_ASCII, NULL, 0x0, NULL, HFILL }}, { &hf_isup_redirecting, - { "ISUP Redirecting Number", "isup.redirecting", - FT_STRING, BASE_NONE, NULL, 0x0, + { "Redirecting Number", "isup.redirecting", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_redirection_number, + { "Redirection Number", "isup.redirection_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_subsequent_number, + { "Subsequent Number", "isup.subsequent_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_connected_number, + { "Connected Number", "isup.connected_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_transit_network_selection, + { "Transit Network Selection", "isup.transit_network_selection", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_original_called_number, + { "Original Called Number", "isup.original_called_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_location_number, + { "Location Number", "isup.location_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_call_transfer_number, + { "Call Transfer Number", "isup.call_transfer_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_called_in_number, + { "Called IN Number", "isup.called_in_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_generic_number, + { "Generic Number", "isup.generic_number", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_jurisdiction, + { "Jurisdiction", "isup.jurisdiction", + FT_STRING, ENC_ASCII, NULL, 0x0, + NULL, HFILL }}, + + { &hf_isup_charge_number, + { "Charge Number", "isup.charge_number", + FT_STRING, ENC_ASCII, NULL, 0x0, NULL, HFILL }}, { &hf_isup_apm_msg_fragments, @@ -12366,6 +11952,7 @@ proto_register_isup(void) { &ei_isup_status_subfield_not_present, { "isup.status_subfield_not_present", PI_PROTOCOL, PI_NOTE, "Status subfield is not present with this message type", EXPFILL }}, { &ei_isup_message_type_no_optional_parameters, { "isup.message_type.no_optional_parameters", PI_PROTOCOL, PI_NOTE, "No optional parameters are possible with this message type", EXPFILL }}, { &ei_isup_empty_number, { "isup.empty_number", PI_PROTOCOL, PI_NOTE, "(empty) number", EXPFILL }}, + { &ei_isup_too_many_digits, { "isup.too_many_digits", PI_MALFORMED, PI_ERROR, "Too many digits", EXPFILL }} }; static const enum_val_t isup_variants[] = { diff --git a/epan/dissectors/packet-isup.h b/epan/dissectors/packet-isup.h index d2c1ad7861..54aceb348f 100644 --- a/epan/dissectors/packet-isup.h +++ b/epan/dissectors/packet-isup.h @@ -172,18 +172,18 @@ WS_DLL_PUBLIC value_string_ext isup_calling_partys_category_value_ext; */ void dissect_nsap(tvbuff_t *parameter_tvb,gint offset,gint len, proto_tree *parameter_tree); WS_DLL_PUBLIC -void dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item); +void dissect_isup_called_party_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item); WS_DLL_PUBLIC -void dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item); +void dissect_isup_calling_party_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item); void dissect_isup_cause_indicators_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item); WS_DLL_PUBLIC void dissect_isup_redirection_information_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item); WS_DLL_PUBLIC void dissect_isup_original_called_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item); WS_DLL_PUBLIC -void dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item); +void dissect_isup_redirecting_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item); -void dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item); +void dissect_isup_location_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item); void dissect_isup_generic_number_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, proto_item *parameter_item); |