aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJirka Novak <j.novak@netsystem.cz>2021-10-27 00:28:54 +0200
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-10-27 06:47:55 +0000
commite880cf61d7a7c2f9c4f5aa05add465bb3debb642 (patch)
tree1ed25548c98d2dd6990320fcbc27588a78ad1f2f
parentc87743f93393e3a96061259a416a76b94458ca06 (diff)
Flow sequence: Shows more information about various skinny messages
For many skinny messages additional information is shown next to message. It simplifies call flow analysis.
-rw-r--r--docbook/release-notes.adoc2
-rw-r--r--epan/dissectors/packet-skinny.c84
-rw-r--r--epan/dissectors/packet-skinny.h1
-rw-r--r--ui/voip_calls.c1
4 files changed, 87 insertions, 1 deletions
diff --git a/docbook/release-notes.adoc b/docbook/release-notes.adoc
index 780e814e47..bb7f959dab 100644
--- a/docbook/release-notes.adoc
+++ b/docbook/release-notes.adoc
@@ -119,6 +119,8 @@ The following features are new (or have been significantly updated) since versio
* RTP streams are created based on Skinny protocol messages
+* Flow sequence shows more infor about various Skinny messages
+
// === Removed Features and Support
// === Removed Dissectors
diff --git a/epan/dissectors/packet-skinny.c b/epan/dissectors/packet-skinny.c
index f1b81cc89e..4882fc69af 100644
--- a/epan/dissectors/packet-skinny.c
+++ b/epan/dissectors/packet-skinny.c
@@ -362,7 +362,7 @@ static const value_string DisplayLabels_200[] = {
{ 0x00014, "Off Hook" },
{ 0x00015, "On Hook" },
{ 0x00016, "Ring Out" },
- { 0x00017, "From" },
+ { 0x00017, "From " },
{ 0x00018, "Connected" },
{ 0x00019, "Busy" },
{ 0x0001a, "Line In Use" },
@@ -627,6 +627,28 @@ static const value_string KeyPadButton[] = {
};
static value_string_ext KeyPadButton_ext = VALUE_STRING_EXT_INIT(KeyPadButton);
+static const value_string KeyPadButton_short[] = {
+ { 0x00000, "0" },
+ { 0x00001, "1" },
+ { 0x00002, "2" },
+ { 0x00003, "3" },
+ { 0x00004, "4" },
+ { 0x00005, "5" },
+ { 0x00006, "6" },
+ { 0x00007, "7" },
+ { 0x00008, "8" },
+ { 0x00009, "9" },
+ { 0x0000a, "A" },
+ { 0x0000b, "B" },
+ { 0x0000c, "C" },
+ { 0x0000d, "D" },
+ { 0x0000e, "*" },
+ { 0x0000f, "#" },
+ { 0x00010, "+" },
+ { 0x00000, NULL }
+};
+static value_string_ext KeyPadButton_short_ext = VALUE_STRING_EXT_INIT(KeyPadButton_short);
+
static const value_string DeviceStimulus[] = {
{ 0x00001, "LastNumberRedial" },
{ 0x00002, "SpeedDial" },
@@ -2338,6 +2360,7 @@ dissect_skinny_displayLabel(ptvcursor_t *cursor, int hfindex, gint length)
}
}
if (show_replaced_str) {
+ si->additionalInfo = g_strdup_printf("\"%s\"", wmem_strbuf_get_str(wmem_new));
proto_item_append_text(item, " => \"%s\"" , wmem_strbuf_get_str(wmem_new));
}
ptvcursor_advance(cursor, length);
@@ -2497,6 +2520,13 @@ handle_KeypadButtonMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_
{
guint32 hdr_data_length = tvb_get_letohl(ptvcursor_tvbuff(cursor), 0);
+ si->additionalInfo = g_strdup_printf("\"%s\"",
+ try_val_to_str_ext(
+ tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)),
+ &KeyPadButton_short_ext
+ )
+ );
+
ptvcursor_add(cursor, hf_skinny_kpButton, 4, ENC_LITTLE_ENDIAN);
if (hdr_data_length > 8) {
si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -2797,6 +2827,7 @@ handle_OpenReceiveChannelAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_
guint32 passThroughPartyId = 0;
address media_addr;
guint16 media_port = 0;
+ char *media_addr_str = NULL;
si->mediaReceptionStatus = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
ptvcursor_add(cursor, hf_skinny_mediaReceptionStatus, 4, ENC_LITTLE_ENDIAN);
@@ -2806,6 +2837,9 @@ handle_OpenReceiveChannelAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_
ptvcursor_current_offset(cursor), ENC_LITTLE_ENDIAN);
srtp_add_address(pinfo, PT_UDP, &media_addr, media_port, 0,
"SKINNY", pinfo->num, false, NULL, NULL, NULL);
+ media_addr_str = address_to_display(NULL, &media_addr);
+ si->additionalInfo = g_strdup_printf("%s:%d", media_addr_str, media_port);
+ wmem_free(NULL, media_addr_str);
ptvcursor_add(cursor, hf_skinny_portNumber, 4, ENC_LITTLE_ENDIAN);
passThroughPartyId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
si->passThroughPartyId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -4477,6 +4511,12 @@ handle_RegisterAckMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_c
static void
handle_StartToneMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_conv_info_t * skinny_conv _U_)
{
+ si->additionalInfo = g_strdup_printf("\"%s\"",
+ try_val_to_str_ext(
+ tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)),
+ &DeviceTone_ext
+ )
+ );
ptvcursor_add(cursor, hf_skinny_tone, 4, ENC_LITTLE_ENDIAN);
ptvcursor_add(cursor, hf_skinny_tone_output_direction, 4, ENC_LITTLE_ENDIAN);
si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -4588,6 +4628,7 @@ handle_StartMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U
guint16 saltlen = 0;
address media_addr;
guint16 media_port = 0;
+ char *media_addr_str = NULL;
ptvcursor_add(cursor, hf_skinny_conferenceId, 4, ENC_LITTLE_ENDIAN);
passThroughPartyId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -4599,6 +4640,9 @@ handle_StartMediaTransmissionMessage(ptvcursor_t *cursor, packet_info * pinfo _U
ptvcursor_current_offset(cursor), ENC_LITTLE_ENDIAN);
srtp_add_address(pinfo, PT_UDP, &media_addr, media_port, 0,
"SKINNY", pinfo->num, false, NULL, NULL, NULL);
+ media_addr_str = address_to_display(NULL, &media_addr);
+ si->additionalInfo = g_strdup_printf("%s:%d", media_addr_str, media_port);
+ wmem_free(NULL, media_addr_str);
ptvcursor_add(cursor, hf_skinny_remotePortNumber, 4, ENC_LITTLE_ENDIAN);
ptvcursor_add(cursor, hf_skinny_milliSecondPacketSize, 4, ENC_LITTLE_ENDIAN);
compressionType = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -4792,6 +4836,10 @@ handle_CallInfoMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_conv
ptvcursor_add_no_advance(cursor, hf_skinny_RestrictInformationType_BitsReserved, 4, ENC_LITTLE_ENDIAN);
ptvcursor_advance(cursor, 4);
ptvcursor_pop_subtree(cursor); /* end bitfield: partyPIRestrictionBits */
+
+ if (si->callingParty && si->calledParty) {
+ si->additionalInfo = g_strdup_printf("\"%s -> %s\"", si->callingParty, si->calledParty);
+ }
}
/*
@@ -5265,6 +5313,7 @@ handle_OpenReceiveChannelMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, s
guint16 saltlen = 0;
address media_addr;
guint16 media_port = 0;
+ char *media_addr_str = NULL;
ptvcursor_add(cursor, hf_skinny_conferenceId, 4, ENC_LITTLE_ENDIAN);
passThroughPartyId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -5353,6 +5402,9 @@ handle_OpenReceiveChannelMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, s
ptvcursor_current_offset(cursor), ENC_LITTLE_ENDIAN);
srtp_add_address(pinfo, PT_UDP, &media_addr, media_port, 0,
"SKINNY", pinfo->num, false, NULL, NULL, NULL);
+ media_addr_str = address_to_display(NULL, &media_addr);
+ si->additionalInfo = g_strdup_printf("%s:%d", media_addr_str, media_port);
+ wmem_free(NULL, media_addr_str);
ptvcursor_add(cursor, hf_skinny_sourcePortNumber, 4, ENC_LITTLE_ENDIAN);
}
if (hdr_version >= V16_MSG_TYPE) {
@@ -5600,6 +5652,12 @@ static void
handle_CallStateMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_conv_info_t * skinny_conv _U_)
{
si->callState = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
+ si->additionalInfo = g_strdup_printf("\"%s\"",
+ try_val_to_str_ext(
+ tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor)),
+ &DCallState_ext
+ )
+ );
ptvcursor_add(cursor, hf_skinny_callState, 4, ENC_LITTLE_ENDIAN);
si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN);
@@ -5791,6 +5849,13 @@ handle_DialedNumberMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_
guint32 VariableDirnumSize = (hdr_version >= V18_MSG_TYPE) ? 25 : 24;
if (hdr_version <= V17_MSG_TYPE) {
+ guint32 dialedNumber_len;
+
+ dialedNumber_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), 24)+1;
+ if (dialedNumber_len > 1) {
+ si->additionalInfo = g_strdup_printf("\"%s\"", tvb_format_stringzpad(pinfo->pool, ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), dialedNumber_len));
+ }
+
ptvcursor_add(cursor, hf_skinny_dialedNumber, 24, ENC_ASCII|ENC_NA);
si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN);
@@ -5798,6 +5863,13 @@ handle_DialedNumberMessage(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_
ptvcursor_add(cursor, hf_skinny_callReference, 4, ENC_LITTLE_ENDIAN);
}
if (hdr_version >= V18_MSG_TYPE) {
+ guint32 dialedNumber_len;
+
+ dialedNumber_len = tvb_strnlen(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), VariableDirnumSize)+1;
+ if (dialedNumber_len > 1) {
+ si->additionalInfo = g_strdup_printf("\"%s\"", tvb_format_stringzpad(pinfo->pool, ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), dialedNumber_len));
+ }
+
ptvcursor_add(cursor, hf_skinny_dialedNumber, VariableDirnumSize, ENC_ASCII|ENC_NA);
si->lineId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
ptvcursor_add(cursor, hf_skinny_lineInstance, 4, ENC_LITTLE_ENDIAN);
@@ -7384,6 +7456,10 @@ handle_CallInfoV2Message(ptvcursor_t *cursor, packet_info * pinfo _U_, skinny_co
ptvcursor_advance(cursor, 1);
}
}
+
+ if (si->callingParty && si->calledParty) {
+ si->additionalInfo = g_strdup_printf("\"%s -> %s\"", si->callingParty, si->calledParty);
+ }
}
/*
@@ -7628,6 +7704,7 @@ handle_StartMediaTransmissionAckMessage(ptvcursor_t *cursor, packet_info * pinfo
guint32 passThroughPartyId = 0;
address media_addr;
guint16 media_port = 0;
+ char *media_addr_str = NULL;
ptvcursor_add(cursor, hf_skinny_conferenceId, 4, ENC_LITTLE_ENDIAN);
passThroughPartyId = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
@@ -7641,6 +7718,9 @@ handle_StartMediaTransmissionAckMessage(ptvcursor_t *cursor, packet_info * pinfo
ptvcursor_current_offset(cursor), ENC_LITTLE_ENDIAN);
srtp_add_address(pinfo, PT_UDP, &media_addr, media_port, 0,
"SKINNY", pinfo->num, false, NULL, NULL, NULL);
+ media_addr_str = address_to_display(NULL, &media_addr);
+ si->additionalInfo = g_strdup_printf("%s:%d", media_addr_str, media_port);
+ wmem_free(NULL, media_addr_str);
ptvcursor_add(cursor, hf_skinny_portNumber, 4, ENC_LITTLE_ENDIAN);
si->mediaTransmissionStatus = tvb_get_letohl(ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor));
ptvcursor_add(cursor, hf_skinny_mediaTransmissionStatus, 4, ENC_LITTLE_ENDIAN);
@@ -8113,6 +8193,8 @@ static int dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
si->multimediaReceptionStatus = -1;
si->multimediaTransmissionStatus = -1;
si->multicastReceptionStatus = -1;
+ g_free(si->additionalInfo);
+ si->additionalInfo = NULL;
col_add_fstr(pinfo->cinfo, COL_INFO,"%s ", si->messageName);
col_set_fence(pinfo->cinfo, COL_INFO);
diff --git a/epan/dissectors/packet-skinny.h b/epan/dissectors/packet-skinny.h
index 779154b7c9..82632744e4 100644
--- a/epan/dissectors/packet-skinny.h
+++ b/epan/dissectors/packet-skinny.h
@@ -74,6 +74,7 @@ typedef struct _skinny_info_t
gint32 multimediaTransmissionStatus;
gint32 multicastReceptionStatus;
//skinny_conv_info_t * skinny_conv;
+ gchar * additionalInfo;
} skinny_info_t;
/*
diff --git a/ui/voip_calls.c b/ui/voip_calls.c
index 6630b02107..dd3edb1a5a 100644
--- a/ui/voip_calls.c
+++ b/ui/voip_calls.c
@@ -4066,6 +4066,7 @@ skinny_calls_packet(void *tap_offset_ptr, packet_info *pinfo, epan_dissect_t *ed
add_to_graph(tapinfo, pinfo, edt, si->messageName, comment,
callsinfo->call_num, &(pinfo->src), &(pinfo->dst), 1);
g_free(comment);
+ append_to_frame_graph(tapinfo, pinfo->num, si->additionalInfo, NULL);
tapinfo->redraw |= REDRAW_SKINNY;