aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mgcp.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2007-11-16 08:18:30 +0000
committerAnders Broman <anders.broman@ericsson.com>2007-11-16 08:18:30 +0000
commitc002250952a9cb942185f43fb80199d3cfbe6882 (patch)
tree8071e5c2987bb6d59250c04c73490dcbb322525c /epan/dissectors/packet-mgcp.c
parent07166afb69a91beac3c4eb3f190c069320b1eb29 (diff)
From Harmeet Sawhney:
Parse MGCP over TCP with ASCII TPKT header http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=1964 svn path=/trunk/; revision=23466
Diffstat (limited to 'epan/dissectors/packet-mgcp.c')
-rw-r--r--epan/dissectors/packet-mgcp.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/epan/dissectors/packet-mgcp.c b/epan/dissectors/packet-mgcp.c
index 870e0d6e30..5d8fa91678 100644
--- a/epan/dissectors/packet-mgcp.c
+++ b/epan/dissectors/packet-mgcp.c
@@ -281,6 +281,7 @@ static void dissect_mgcp_connectionparams(proto_tree *parent_tree, tvbuff_t *tvb
static void dissect_mgcp_localconnectionoptions(proto_tree *parent_tree, tvbuff_t *tvb,
gint offset, gint param_type_len,
gint param_val_len);
+
static void mgcp_raw_text_add(tvbuff_t *tvb, proto_tree *tree);
@@ -294,7 +295,11 @@ static gint tvb_find_dot_line(tvbuff_t* tvb, gint offset, gint len, gint* next_o
static gboolean is_rfc2234_alpha(guint8 c);
static dissector_handle_t sdp_handle;
-
+static dissector_handle_t mgcp_handle;
+extern void
+dissect_asciitpkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ dissector_handle_t subdissector_handle);
+extern guint16 is_asciitpkt(tvbuff_t *tvb);
/*
* Init Hash table stuff
@@ -329,7 +334,6 @@ static guint mgcp_call_hash(gconstpointer k)
}
-
/************************************************************************
* dissect_mgcp - The dissector for the Media Gateway Control Protocol
************************************************************************/
@@ -431,6 +435,34 @@ static void dissect_mgcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
}
+/************************************************************************
+ * dissect_tpkt_mgcp - The dissector for the ASCII TPKT Media Gateway Control Protocol
+ ************************************************************************/
+static void dissect_tpkt_mgcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ guint16 ascii_tpkt;
+
+ /* Check whether this looks like a ASCII TPKT-encapsulated
+ * MGCP packet.
+ */
+ ascii_tpkt = is_asciitpkt(tvb);
+
+ if (ascii_tpkt == 0 )
+ {
+ /*
+ * It's not a ASCII TPKT packet
+ * in MGCP
+ */
+ dissect_mgcp(tvb, pinfo, tree);
+ }
+ else
+ {
+ /*
+ * Dissect ASCII TPKT header
+ */
+ dissect_asciitpkt(tvb, pinfo, tree, mgcp_handle);
+ }
+}
#define MAX_MGCP_MESSAGES_IN_PACKET 5
static mgcp_info_t pi_arr[MAX_MGCP_MESSAGES_IN_PACKET];
@@ -908,21 +940,21 @@ void proto_register_mgcp(void)
void proto_reg_handoff_mgcp(void)
{
static int mgcp_prefs_initialized = FALSE;
- static dissector_handle_t mgcp_handle;
-
+ static dissector_handle_t mgcp_tpkt_handle;
/* Get a handle for the SDP dissector. */
sdp_handle = find_dissector("sdp");
if (!mgcp_prefs_initialized)
{
mgcp_handle = create_dissector_handle(dissect_mgcp, proto_mgcp);
+ mgcp_tpkt_handle = create_dissector_handle(dissect_tpkt_mgcp, proto_mgcp);
mgcp_prefs_initialized = TRUE;
}
else
{
- dissector_delete("tcp.port", gateway_tcp_port, mgcp_handle);
+ dissector_delete("tcp.port", gateway_tcp_port, mgcp_tpkt_handle);
dissector_delete("udp.port", gateway_udp_port, mgcp_handle);
- dissector_delete("tcp.port", callagent_tcp_port, mgcp_handle);
+ dissector_delete("tcp.port", callagent_tcp_port, mgcp_tpkt_handle);
dissector_delete("udp.port", callagent_udp_port, mgcp_handle);
}
@@ -933,9 +965,9 @@ void proto_reg_handoff_mgcp(void)
callagent_tcp_port = global_mgcp_callagent_tcp_port;
callagent_udp_port = global_mgcp_callagent_udp_port;
- dissector_add("tcp.port", global_mgcp_gateway_tcp_port, mgcp_handle);
+ dissector_add("tcp.port", global_mgcp_gateway_tcp_port, mgcp_tpkt_handle);
dissector_add("udp.port", global_mgcp_gateway_udp_port, mgcp_handle);
- dissector_add("tcp.port", global_mgcp_callagent_tcp_port, mgcp_handle);
+ dissector_add("tcp.port", global_mgcp_callagent_tcp_port, mgcp_tpkt_handle);
dissector_add("udp.port", global_mgcp_callagent_udp_port, mgcp_handle);
}