forked from osmocom/wireshark
ACDR: Fix handling of short signaling packets
HOST --> PSTN layout is different than PSTN --> HOST. The layout of HOST --> PSTN is: BE16 - OpCode BE16 - Data Size REST - Data
This commit is contained in:
parent
31ca0069c9
commit
93b3f3b575
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue