diff options
author | Anders Broman <anders.broman@ericsson.com> | 2007-11-16 08:18:30 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2007-11-16 08:18:30 +0000 |
commit | c002250952a9cb942185f43fb80199d3cfbe6882 (patch) | |
tree | 8071e5c2987bb6d59250c04c73490dcbb322525c /epan/dissectors/packet-mgcp.c | |
parent | 07166afb69a91beac3c4eb3f190c069320b1eb29 (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.c | 48 |
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); } |