diff --git a/epan/dissectors/packet-acdr.c b/epan/dissectors/packet-acdr.c index 2cebb6dd95..d6376e3e31 100644 --- a/epan/dissectors/packet-acdr.c +++ b/epan/dissectors/packet-acdr.c @@ -55,6 +55,8 @@ // Signaling Packet Macros: #define HEADER_FIELD_SIG_OPCODE_BYTE_NO 0 #define HEADER_FIELD_SIG_OPCODE_BYTE_COUNT 2 +#define HEADER_FIELD_SIG_SIZE_BYTE_NO 2 +#define HEADER_FIELD_SIG_SIZE_BYTE_COUNT 2 #define HEADER_FIELD_SIG_TIME_BYTE_NO 2 #define HEADER_FIELD_SIG_TIME_BYTE_COUNT 4 #define HEADER_FIELD_SIG_MESSAGE_BYTE_NO 6 @@ -351,6 +353,7 @@ static int hf_ac5x_packet = -1; static int hf_signaling_packet = -1; static int hf_acdr_signaling_opcode = -1; +static int hf_acdr_signaling_size = -1; static int hf_acdr_signaling_timestamp = -1; @@ -403,7 +406,6 @@ static dissector_handle_t lix2x3_dissector_handle; static void dissect_rtp_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8 media_type, guint16 payload_type); -static int dissect_signaling_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static void create_5x_analysis_packet_header_subtree(proto_tree *tree, tvbuff_t *tvb); static void create_5x_hpi_packet_header_subtree(proto_tree *tree, tvbuff_t *tvb); @@ -924,30 +926,41 @@ dissect_rtp_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8 m } static int -dissect_signaling_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +dissect_signaling_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8 trace_point) { tvbuff_t *next_tvb = NULL; proto_item *ti = NULL; guint32 tmp; gint64 timestamp; + gint32 offset = 0; + gint remaining; + const gboolean is_incoming = trace_point == Host2Pstn || trace_point == DspIncoming; proto_tree_add_item(tree, hf_acdr_signaling_opcode, tvb, HEADER_FIELD_SIG_OPCODE_BYTE_NO, HEADER_FIELD_SIG_OPCODE_BYTE_COUNT, ENC_BIG_ENDIAN); - ti = proto_tree_add_item(tree, hf_acdr_signaling_timestamp, tvb, HEADER_FIELD_SIG_TIME_BYTE_NO, - HEADER_FIELD_SIG_TIME_BYTE_COUNT, ENC_NA); + offset += HEADER_FIELD_SIG_OPCODE_BYTE_COUNT; + if (is_incoming) { + proto_tree_add_item(tree, hf_acdr_signaling_size, tvb, HEADER_FIELD_SIG_SIZE_BYTE_NO, + HEADER_FIELD_SIG_SIZE_BYTE_COUNT, ENC_BIG_ENDIAN); + offset += HEADER_FIELD_SIG_SIZE_BYTE_COUNT; + } else { + ti = proto_tree_add_item(tree, hf_acdr_signaling_timestamp, tvb, HEADER_FIELD_SIG_TIME_BYTE_NO, + HEADER_FIELD_SIG_TIME_BYTE_COUNT, ENC_NA); + offset += HEADER_FIELD_SIG_TIME_BYTE_COUNT; - tmp = tvb_get_ntohl(tvb, HEADER_FIELD_SIG_TIME_BYTE_NO); + tmp = tvb_get_ntohl(tvb, HEADER_FIELD_SIG_TIME_BYTE_NO); - timestamp = (((gint64) tmp) << 16); - tmp = tvb_get_ntohs(tvb, HEADER_FIELD_SIG_TIME_BYTE_NO + 2); - timestamp |= tmp; + timestamp = (((gint64) tmp) << 16); + tmp = tvb_get_ntohs(tvb, HEADER_FIELD_SIG_TIME_BYTE_NO + 2); + timestamp |= tmp; - proto_item_append_text(ti, " (%f sec)", timestamp / 1000000.0); + proto_item_append_text(ti, " (%f sec)", timestamp / 1000000.0); + } - next_tvb = tvb_new_subset_length_caplen( - tvb, HEADER_FIELD_SIG_MESSAGE_BYTE_NO, - tvb_reported_length_remaining(tvb, HEADER_FIELD_SIG_OPCODE_BYTE_COUNT + - HEADER_FIELD_SIG_TIME_BYTE_COUNT), -1); + remaining = tvb_reported_length_remaining(tvb, offset); + if (remaining == 0) + return tvb_reported_length(tvb); + next_tvb = tvb_new_subset_length_caplen(tvb, offset, remaining, -1); return call_data_dissector(next_tvb, pinfo, tree); } @@ -1752,13 +1765,19 @@ proto_register_acdr(void) NULL, HFILL } }, { &hf_acdr_signaling_opcode, - { "Signaling OpCode", "acdr.signaling_opcode", + { "OpCode", "acdr.signaling_opcode", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_acdr_signaling_size, + { "Size", "acdr.signaling_size", + FT_UINT16, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, { &hf_acdr_signaling_timestamp, - { "Signaling Timestamp", "acdr.signaling_timestamp", + { "Timestamp", "acdr.signaling_timestamp", FT_BYTES, BASE_NONE, NULL, 0x0, "Timestamp in us resolution", HFILL } @@ -1918,7 +1937,7 @@ dissect_acdr_signaling(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void proto_item *packet_item = proto_tree_add_item(tree, hf_signaling_packet, tvb, 0, -1, ENC_NA); proto_tree *packet_tree = proto_item_add_subtree(packet_item, ett_signaling_packet); - int res = dissect_signaling_packet(tvb, pinfo, packet_tree); + int res = dissect_signaling_packet(tvb, pinfo, packet_tree, acdr_data->trace_point); col_set_str(pinfo->cinfo, COL_PROTOCOL, "Signaling"); col_clear(pinfo->cinfo, COL_INFO);