From ce5c6e5de39f4af8b76dad77d2c237064e0930eb Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Tue, 1 Oct 2013 13:35:57 +0400 Subject: [PATCH 13/13] Added basic conversation support Loosely based on a work done by Pascal Quantin (see svn rev. 52306). This was backported from master. See this link for the original patch: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9211 Signed-off-by: Peter Lemenkov --- epan/dissectors/packet-rtpproxy.c | 84 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/epan/dissectors/packet-rtpproxy.c b/epan/dissectors/packet-rtpproxy.c index 7148d58..9f271b1 100644 --- a/epan/dissectors/packet-rtpproxy.c +++ b/epan/dissectors/packet-rtpproxy.c @@ -32,6 +32,7 @@ #include #include +#include static int proto_rtpproxy = -1; @@ -60,6 +61,19 @@ static int hf_rtpproxy_reply = -1; static int hf_rtpproxy_version_request = -1; static int hf_rtpproxy_version_supported = -1; +/* Request/response tracking */ +static int hf_rtpproxy_request_in = -1; +static int hf_rtpproxy_response_in = -1; + +typedef struct _rtpproxy_info { + guint32 req_frame; + guint32 resp_frame; +} rtpproxy_info_t; + +typedef struct _rtpproxy_conv_info { + emem_tree_t *trans; +} rtpproxy_conv_info_t; + static const value_string commandtypenames[] = { { 'V', "Handshake/Ping" }, { 'v', "Handshake/Ping" }, @@ -150,6 +164,33 @@ rtpptoxy_add_tag(proto_tree *rtpproxy_tree, tvbuff_t *tvb, guint begin, guint re return (end == realsize ? -1 : (gint)end); } +void +rtpproxy_add_tid(gboolean is_request, tvbuff_t *tvb, packet_info *pinfo, proto_tree *rtpproxy_tree, rtpproxy_conv_info_t *rtpproxy_conv, gchar* cookie) +{ + rtpproxy_info_t *rtpproxy_info; + proto_item *pi; + + if (!PINFO_FD_VISITED(pinfo)) { + if (is_request){ + rtpproxy_info = se_new(rtpproxy_info_t); + rtpproxy_info->req_frame = PINFO_FD_NUM(pinfo); + rtpproxy_info->resp_frame = 0; + se_tree_insert_string(rtpproxy_conv->trans, cookie, rtpproxy_info, 0); + } else { + rtpproxy_info = (rtpproxy_info_t *)se_tree_lookup_string(rtpproxy_conv->trans, cookie, 0); + if (rtpproxy_info) { + rtpproxy_info->resp_frame = PINFO_FD_NUM(pinfo); + } + } + } else { + rtpproxy_info = (rtpproxy_info_t *)se_tree_lookup_string(rtpproxy_conv->trans, cookie, 0); + if (rtpproxy_info && (is_request ? rtpproxy_info->resp_frame : rtpproxy_info->req_frame)) { + pi = proto_tree_add_uint(rtpproxy_tree, is_request ? hf_rtpproxy_response_in : hf_rtpproxy_request_in, tvb, 0, 0, is_request ? rtpproxy_info->resp_frame : rtpproxy_info->req_frame); + PROTO_ITEM_SET_GENERATED(pi); + } + } +} + static void dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { @@ -161,6 +202,9 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint8* rawstr; proto_item *ti; proto_tree *rtpproxy_tree; + conversation_t *conversation; + rtpproxy_conv_info_t *rtpproxy_conv; + gchar* cookie = NULL; /* Clear out stuff in the info column - we''l set it later */ col_clear(pinfo->cinfo, COL_INFO); @@ -171,6 +215,7 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Extract Cookie */ offset = tvb_find_guint8(tvb, offset, -1, ' '); proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_cookie, tvb, 0, offset, ENC_ASCII | ENC_NA); + cookie = tvb_get_ephemeral_string(tvb, 0, offset); /* Skip whitespace */ offset = tvb_skip_wsp(tvb, offset+1, -1); @@ -188,6 +233,15 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) else col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTPproxy (no LF)"); + /* Try to create conversation */ + conversation = find_or_create_conversation(pinfo); + rtpproxy_conv = (rtpproxy_conv_info_t *)conversation_get_proto_data(conversation, proto_rtpproxy); + if (!rtpproxy_conv) { + rtpproxy_conv = se_new(rtpproxy_conv_info_t); + rtpproxy_conv->trans = se_tree_create_non_persistent(EMEM_TREE_TYPE_RED_BLACK, "rtpproxy transactions");; + conversation_add_proto_data(conversation, proto_rtpproxy, rtpproxy_conv); + } + /* Get payload string */ rawstr = tvb_get_ephemeral_string(tvb, offset, realsize - offset); @@ -198,6 +252,7 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 's': /* A specific case - long statistics answer */ /* %COOKIE% sessions created %NUM0% active sessions: %NUM1% */ + rtpproxy_add_tid(FALSE, tvb, pinfo, rtpproxy_tree, rtpproxy_conv, cookie); if ('e' == tvb_get_guint8(tvb, offset+1)){ col_add_fstr(pinfo->cinfo, COL_INFO, "Reply: %s", rawstr); ti = proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_reply, tvb, offset, -1, ENC_NA); @@ -216,6 +271,7 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 'r': case 'c': case 'q': + rtpproxy_add_tid(TRUE, tvb, pinfo, rtpproxy_tree, rtpproxy_conv, cookie); col_add_fstr(pinfo->cinfo, COL_INFO, "Request: %s", rawstr); ti = proto_tree_add_item(rtpproxy_tree, hf_rtpproxy_request, tvb, offset, -1, ENC_NA); rtpproxy_tree = proto_item_add_subtree(ti, ett_rtpproxy_request); @@ -358,6 +414,7 @@ dissect_rtpproxy(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case '7': case '8': case '9': + rtpproxy_add_tid(FALSE, tvb, pinfo, rtpproxy_tree, rtpproxy_conv, cookie); if (tmp == 'e') col_add_fstr(pinfo->cinfo, COL_INFO, "Error reply: %s", rawstr); else @@ -728,6 +785,33 @@ proto_register_rtpproxy(void) HFILL } }, + { + &hf_rtpproxy_request_in, + { + "Request In", + "rtpproxy.request_in", + FT_FRAMENUM, + BASE_NONE, + NULL, + 0x0, + NULL, + HFILL + } + + }, + { + &hf_rtpproxy_response_in, + { + "Response In", + "rtpproxy.response_in", + FT_FRAMENUM, + BASE_NONE, + NULL, + 0x0, + NULL, + HFILL + } + } }; /* Setup protocol subtree array */ -- 1.8.3.1