From 77ad89b12ddbec16981b495c60c895d463850c8f Mon Sep 17 00:00:00 2001 From: Guy Harris Date: Wed, 15 Nov 2000 07:07:52 +0000 Subject: Add a mechanism by which a dissector can be registered by name, another dissector can get a "handle" for that dissector by name and then call that dissector through the handle. This allows dissectors that can't be called through a port table or a heuristic table to be called from other dissectors without directly referring to the dissector function - dynamically-loaded modules, under Windows, cannot directly call functions in the main program, and non-plugin dissectors are in the main program and thus cannot be called from plugin dissectors unless either 1) a pointer to the dissector is put in the Big Transfer Vector or 2) some other mechanism for getting a pointer to the dissector is provided. This mechanism could also support registering old-style dissectors and calling them from new-style dissectors without the new-style dissector having to do the argument translation itself (I didn't add support for registering old-style dissectors because I'd prefer to have people tvbuffify their code if they have to register a dissector...). It could also, in the future, perhaps support disabling of protocols; setting "pinfo->current_proto"; inside "call_dissector()" - and inside "{old_}dissector_try_port()" and "{old_"dissector_try_heuristic()" - allowing a pile of stuff that currently has to be done in every dissector be done by common code. (I have some ideas about how to do this, by having "proto_register_protocol()" take an abbreviation - of the sort that would be put in, for example, "pinfo->current_proto" - as an argument; having the calls to register dissectors take an index returned by "proto_register_protocol()" as an argument. The abbreviation could be used elsewhere as well, e.g. in the "Decoding" tab of the "Edit->Protocols" dialog box, and in a GUI for constructing protocol filters. Watch this space.) Make "dissect_sdp()" the first client of this mechanism; it's now static to "packet-sdp.c", and all dissectors that call it - including the MGCP plugin - now call it through a dissector handle fetched by "find_dissector()". (Next step - see if Ethereal can now compile on Windows as a result of this.) svn path=/trunk/; revision=2647 --- packet-sap.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'packet-sap.c') diff --git a/packet-sap.c b/packet-sap.c index 521c6a4146..5575bedf38 100644 --- a/packet-sap.c +++ b/packet-sap.c @@ -4,7 +4,7 @@ * * Heikki Vatiainen * - * $Id: packet-sap.c,v 1.13 2000/11/10 06:50:36 guy Exp $ + * $Id: packet-sap.c,v 1.14 2000/11/15 07:07:43 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -43,7 +43,6 @@ #include #include "packet.h" #include "packet-ipv6.h" -#include "packet-sdp.h" #define UDP_PORT_SAP 9875 @@ -126,6 +125,8 @@ static gint ett_sap_flags = -1; static gint ett_sap_auth = -1; static gint ett_sap_authf = -1; +static dissector_handle_t sdp_handle; + static void dissect_sap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { @@ -277,7 +278,7 @@ dissect_sap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } /* Done with SAP */ - dissect_sdp(tvb, pinfo, tree); + call_dissector(sdp_handle, tvb, pinfo, tree); } return; @@ -363,4 +364,9 @@ void proto_reg_handoff_sap(void) { dissector_add("udp.port", UDP_PORT_SAP, dissect_sap); + + /* + * Get a handle for the SDP dissector. + */ + sdp_handle = find_dissector("sdp"); } -- cgit v1.2.3