ANNOUNCEMENT: Live Wireshark University & Allegro Packets online APAC Wireshark Training Session
April 17th, 2024 | 14:30-16:00 SGT (UTC+8) | Online

Wireshark-dev: Re: [Wireshark-dev] [PATCH] Firebird/Interbase dissector, request for comments

From: "Môshe Van der Sterre" <moshevds@xxxxxxxxx>
Date: Fri, 18 May 2007 18:50:10 +0200
Here is a new patch.
If someone has anything to comment on it, please do so.
Otherwise, I think this may go into svn.

--
Mvg
Môshe van der Sterre
http://www.moshe.nl/
http://www.coecu.nl/
--- wireshark/epan/dissectors/Makefile.common
+++ wireshark/epan/dissectors/Makefile.common
@@ -322,6 +322,7 @@
 	packet-ftp.c	\
 	packet-fw1.c	\
 	packet-g723.c	\
+	packet-gdsdb.c	\
 	packet-gift.c	\
 	packet-giop.c	\
 	packet-gmrp.c	\
@@ -361,7 +362,6 @@
 	packet-hyperscsi.c	\
 	packet-iapp.c	\
 	packet-iax2.c	\
-	packet-ib.c	\
 	packet-icap.c	\
 	packet-icep.c	\
 	packet-icmpv6.c	\
--- wireshark/epan/dissectors/packet-gdsdb.c
+++ wireshark/epan/dissectors/packet-gdsdb.c
@@ -0,0 +1,1852 @@
+/* packetgds_db.c
+ * Routines for Firebird/Interbase dissection
+ * Copyright 2007, Môshe van der Sterre
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@xxxxxxxxxxxxx>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <epan/packet.h>
+#include <epan/prefs.h>
+
+#define TCP_PORT	3050
+
+void proto_reg_handoff_gdsdb(void);
+
+static int proto_gdsdb = -1;
+static gint ett_gdsdb = -1;
+static int hf_gdsdb_opcode = -1;
+static gint ett_gdsdb_opcode = -1;
+
+/* gdsdb_dummy */
+/* gdsdb_connect */
+static int hf_gdsdb_connect_operation = -1;
+static int hf_gdsdb_connect_version = -1;
+static int hf_gdsdb_connect_client = -1;
+static int hf_gdsdb_connect_filename = -1;
+static int hf_gdsdb_connect_count = -1;
+static int hf_gdsdb_connect_userid = -1;
+static int hf_gdsdb_connect_pref = -1;
+static gint ett_gdsdb_connect_pref = -1;
+static int hf_gdsdb_connect_pref_version = -1;
+static int hf_gdsdb_connect_pref_architecture = -1;
+static int hf_gdsdb_connect_pref_mintype = -1;
+static int hf_gdsdb_connect_pref_maxtype = -1;
+static int hf_gdsdb_connect_pref_weight = -1;
+/* gdsdb_accept */
+static int hf_gdsdb_accept_version = -1;
+static int hf_gdsdb_accept_architecture = -1;
+/* gdsdb_request */
+static int hf_gdsdb_request_type = -1;
+static int hf_gdsdb_request_object = -1;
+static int hf_gdsdb_request_partner = -1;
+/* gdsdb_attach */
+static int hf_gdsdb_attach_database = -1;
+static int hf_gdsdb_attach_filename = -1;
+static int hf_gdsdb_attach_dpb = -1;
+/* gdsdb_compile */
+static int hf_gdsdb_compile_database = -1;
+static int hf_gdsdb_compile_blr = -1;
+/* gdsdb_receive */
+static int hf_gdsdb_receive_request = -1;
+static int hf_gdsdb_receive_incarnation = -1;
+static int hf_gdsdb_receive_transaction = -1;
+static int hf_gdsdb_receive_msgnr = -1;
+static int hf_gdsdb_receive_messages = -1;
+static int hf_gdsdb_receive_direction = -1;
+static int hf_gdsdb_receive_offset = -1;
+/* gdsdb_send */
+static int hf_gdsdb_send_request = -1;
+static int hf_gdsdb_send_incarnation = -1;
+static int hf_gdsdb_send_transaction = -1;
+static int hf_gdsdb_send_msgnr = -1;
+static int hf_gdsdb_send_messages = -1;
+/* gdsdb_response */
+static int hf_gdsdb_response_object = -1;
+static int hf_gdsdb_response_blobid = -1;
+static int hf_gdsdb_response_data = -1;
+static int hf_gdsdb_response_status = -1;
+/* gdsdb_transact */
+static int hf_gdsdb_transact_database = -1;
+static int hf_gdsdb_transact_transaction = -1;
+static int hf_gdsdb_transact_messages = -1;
+/* gdsdb_transact_response */
+static int hf_gdsdb_transactresponse_messages = -1;
+/* gdsdb_open_blob2 */
+static int hf_gdsdb_openblob2_bpb = -1;
+/* gdsdb_open_blob */
+static int hf_gdsdb_openblob_transaction = -1;
+static int hf_gdsdb_openblob_id = -1;
+/* gdsdb_segment */
+static int hf_gdsdb_segment_blob = -1;
+static int hf_gdsdb_segment_length = -1;
+static int hf_gdsdb_segment_segment = -1;
+/* gdsdb_seek_blob */
+static int hf_gdsdb_seekblob_blob = -1;
+static int hf_gdsdb_seekblob_mode = -1;
+/* gdsdb_reconnect */
+static int hf_gdsdb_reconnect_database = -1;
+/* gdsdb_info & gdsdb_service_start */
+static int hf_gdsdb_info_object = -1;
+static int hf_gdsdb_info_incarnation = -1;
+static int hf_gdsdb_info_items = -1;
+static int hf_gdsdb_info_buffer_length = -1;
+/* gdsdb_release */
+static int hf_gdsdb_release_object = -1;
+/* gdsdb_prepare2 */
+static int hf_gdsdb_prepare2_transaction = -1;
+/* gdsdb_event & gdsdb_cancel_events */
+static int hf_gdsdb_event_database = -1;
+static int hf_gdsdb_event_items = -1;
+static int hf_gdsdb_event_ast = -1;
+static int hf_gdsdb_event_arg = -1;
+static int hf_gdsdb_event_rid = -1;
+/* gdsdb_ddl */
+static int hf_gdsdb_ddl_database = -1;
+static int hf_gdsdb_ddl_transaction = -1;
+static int hf_gdsdb_ddl_blr = -1;
+/* gdsdb_slice */
+static int hf_gdsdb_slice_transaction = -1;
+static int hf_gdsdb_slice_id = -1;
+static int hf_gdsdb_slice_sdl = -1;
+static int hf_gdsdb_slice_parameters = -1;
+/* gdsdb_slice_response */
+static int hf_gdsdb_sliceresponse_length = -1;
+/* gdsdb_execute */
+static int hf_gdsdb_execute_statement = -1;
+static int hf_gdsdb_execute_transaction = -1;
+static int hf_gdsdb_execute_message_number = -1;
+static int hf_gdsdb_execute_messages = -1;
+/* gdsdb_execute2 */
+static int hf_gdsdb_execute_outblr = -1;
+static int hf_gdsdb_execute_outmsgnr = -1;
+/* gdsdb_exec_immediate2 */
+static int hf_gdsdb_prepare2_blr = -1;
+static int hf_gdsdb_prepare2_number = -1;
+static int hf_gdsdb_prepare2_messages = -1;
+static int hf_gdsdb_prepare2_outblr = -1;
+static int hf_gdsdb_prepare2_outmsgnr = -1;
+/* gdsdb_prepare */
+static int hf_gdsdb_prepare_transaction = -1;
+static int hf_gdsdb_prepare_statement = -1;
+static int hf_gdsdb_prepare_dialect = -1;
+static int hf_gdsdb_prepare_querystr = -1;
+static int hf_gdsdb_prepare_items = -1;
+static int hf_gdsdb_prepare_bufferlength = -1;
+/* gdsdb_fetch */
+static int hf_gdsdb_fetch_statement = -1;
+static int hf_gdsdb_fetch_message_number = -1;
+static int hf_gdsdb_fetch_messages = -1;
+/* gdsdb_fetch_response */
+static int hf_gdsdb_fetchresponse_status = -1;
+static int hf_gdsdb_fetchresponse_messages = -1;
+/* gdsdb_free_statement */
+static int hf_gdsdb_free_statement = -1;
+static int hf_gdsdb_free_option = -1;
+/* gdsdb_insert */
+static int hf_gdsdb_insert_statement = -1;
+static int hf_gdsdb_insert_message_number = -1;
+static int hf_gdsdb_insert_messages = -1;
+/* gdsdb_cursor */
+static int hf_gdsdb_cursor_statement = -1;
+static int hf_gdsdb_cursor_type = -1;
+/* gdsdb_sql_response */
+static int hf_gdsdb_sqlresponse_messages = -1;
+
+enum
+{
+	op_void                   = 0,
+	op_connect                = 1,
+	op_exit                   = 2,
+	op_accept                 = 3,
+	op_reject                 = 4,
+	op_protocol               = 5,
+	op_disconnect             = 6,
+	op_credit                 = 7,
+	op_continuation           = 8,
+	op_response               = 9,
+	op_open_file              = 10,
+	op_create_file            = 11,
+	op_close_file             = 12,
+	op_read_page              = 13,
+	op_write_page             = 14,
+	op_lock                   = 15,
+	op_convert_lock           = 16,
+	op_release_lock           = 17,
+	op_blocking               = 18,
+	op_attach                 = 19,
+	op_create                 = 20,
+	op_detach                 = 21,
+	op_compile                = 22,
+	op_start                  = 23,
+	op_start_and_send         = 24,
+	op_send                   = 25,
+	op_receive                = 26,
+	op_unwind                 = 27,
+	op_release                = 28,
+	op_transaction            = 29,
+	op_commit                 = 30,
+	op_rollback               = 31,
+	op_prepare                = 32,
+	op_reconnect              = 33,
+	op_create_blob            = 34,
+	op_open_blob              = 35,
+	op_get_segment            = 36,
+	op_put_segment            = 37,
+	op_cancel_blob            = 38,
+	op_close_blob             = 39,
+	op_info_database          = 40,
+	op_info_request           = 41,
+	op_info_transaction       = 42,
+	op_info_blob              = 43,
+	op_batch_segments         = 44,
+	op_mgr_set_affinity       = 45,
+	op_mgr_clear_affinity     = 46,
+	op_mgr_report             = 47,
+	op_que_events             = 48,
+	op_cancel_events          = 49,
+	op_commit_retaining       = 50,
+	op_prepare2               = 51,
+	op_event                  = 52,
+	op_connect_request        = 53,
+	op_aux_connect            = 54,
+	op_ddl                    = 55,
+	op_open_blob2             = 56,
+	op_create_blob2           = 57,
+	op_get_slice              = 58,
+	op_put_slice              = 59,
+	op_slice                  = 60,
+	op_seek_blob              = 61,
+	op_allocate_statement     = 62,
+	op_execute                = 63,
+	op_exec_immediate         = 64,
+	op_fetch                  = 65,
+	op_fetch_response         = 66,
+	op_free_statement         = 67,
+	op_prepare_statement      = 68,
+	op_set_cursor             = 69,
+	op_info_sql               = 70,
+	op_dummy                  = 71,
+	op_response_piggyback     = 72,
+	op_start_and_receive      = 73,
+	op_start_send_and_receive = 74,
+	op_exec_immediate2        = 75,
+	op_execute2               = 76,
+	op_insert                 = 77,
+	op_sql_response           = 78,
+	op_transact               = 79,
+	op_transact_response      = 80,
+	op_drop_database          = 81,
+	op_service_attach         = 82,
+	op_service_detach         = 83,
+	op_service_info           = 84,
+	op_service_start          = 85,
+	op_rollback_retaining     = 86,
+	op_max
+};
+
+static const value_string gdsdb_opcode[] = {
+	{ op_void, "Void" },
+	{ op_connect, "Connect" },
+	{ op_exit, "Exit" },
+	{ op_accept, "Accept" },
+	{ op_reject, "Reject" },
+	{ op_protocol, "Protocol" },
+	{ op_disconnect, "Disconnect" },
+	{ op_credit, "Credit" },
+	{ op_continuation, "Continuation" },
+	{ op_response, "Response" },
+	{ op_open_file, "Open file" },
+	{ op_create_file, "Create file" },
+	{ op_close_file, "Close file" },
+	{ op_read_page, "Read page" },
+	{ op_write_page, "Write page" },
+	{ op_lock, "Lock" },
+	{ op_convert_lock, "Convert lock" },
+	{ op_release_lock, "Release lock" },
+	{ op_blocking, "Blocking" },
+	{ op_attach, "Attach" },
+	{ op_create, "Create" },
+	{ op_detach, "Detach" },
+	{ op_compile, "Compile" },
+	{ op_start, "Start" },
+	{ op_start_and_send, "Start and send" },
+	{ op_send, "Send" },
+	{ op_receive, "Receive" },
+	{ op_unwind, "Unwind" },
+	{ op_release, "Release" },
+	{ op_transaction, "Transaction" },
+	{ op_commit, "Commit" },
+	{ op_rollback, "Rollback" },
+	{ op_prepare, "Prepare" },
+	{ op_reconnect, "Reconnect" },
+	{ op_create_blob, "Create blob" },
+	{ op_open_blob, "Open blob" },
+	{ op_get_segment, "Get segment" },
+	{ op_put_segment, "Put segment" },
+	{ op_cancel_blob, "Cancel blob" },
+	{ op_close_blob, "Close blob" },
+	{ op_info_database, "Info database" },
+	{ op_info_request, "Info request" },
+	{ op_transaction, "Info transaction" },
+	{ op_info_blob, "Info blob" },
+	{ op_batch_segments, "Batch segments" },
+	{ op_mgr_set_affinity, "Mgr set affinity" },
+	{ op_mgr_clear_affinity, "Mgr clear affinity" },
+	{ op_mgr_report, "Mgr report" },
+	{ op_que_events, "Que events" },
+	{ op_cancel_events, "Cancel events" },
+	{ op_commit_retaining, "Commit retaining" },
+	{ op_prepare2, "Prepare 2" },
+	{ op_event, "Event" },
+	{ op_connect_request, "Connect request" },
+	{ op_aux_connect, "Aux connect" },
+	{ op_ddl, "DDl" },
+	{ op_open_blob2, "Open blob 2" },
+	{ op_create_blob2, "Create blob 2" },
+	{ op_get_slice, "Get slice" },
+	{ op_put_slice, "Put slice" },
+	{ op_slice, "Slice" },
+	{ op_seek_blob, "Seek blob" },
+	{ op_allocate_statement, "Allocate statement" },
+	{ op_execute, "Execute" },
+	{ op_exec_immediate, "Exec immediate" },
+	{ op_fetch, "Fetch" },
+	{ op_fetch_response, "Fetch response" },
+	{ op_free_statement, "Free statement" },
+	{ op_prepare_statement, "Prepare statement" },
+	{ op_set_cursor, "Set cursor" },
+	{ op_info_sql, "Info sql" },
+	{ op_dummy, "Dummy" },
+	{ op_response_piggyback, "Response piggyback" },
+	{ op_start_and_receive, "Start and receive" },
+	{ op_start_send_and_receive, "Start send and receive" },
+	{ op_exec_immediate2, "Exec immediate 2" },
+	{ op_execute2, "Execute 2" },
+	{ op_insert, "Insert" },
+	{ op_sql_response, "Sql response" },
+	{ op_transact_response, "Transact" },
+	{ op_transact_response, "Transact response" },
+	{ op_drop_database, "Drop database" },
+	{ op_service_attach, "Service attach" },
+	{ op_service_detach, "Service detach" },
+	{ op_service_info, "Service info" },
+	{ op_service_start, "Service start" },
+	{ op_rollback_retaining, "Rollback retaining" },
+	{ 0, NULL }
+};
+
+static const value_string gdsdb_architectures[] = {
+	{ 1, "Generic" },
+	{ 2, "Apollo" },
+	{ 3, "Sun" },
+	{ 4, "Vms" },
+	{ 5, "Ultrix" },
+	{ 6, "Alliant" },
+	{ 7, "MS-Dos" },
+	{ 8, "Sun 4" },
+	{ 9, "Sun 386" },
+	{ 10, "HP-UX" },
+	{ 11, "HP MPE/xl" },
+	{ 12, "Mac" },
+	{ 13, "Mac aux" },
+	{ 14, "rt" },
+	{ 15, "mips Ultrix" },
+	{ 16, "HP-UX 68k" },
+	{ 17, "Xenix" },
+	{ 18, "Aviion" },
+	{ 19, "SGI" },
+	{ 20, "Apollo_dn10k" },
+	{ 21, "Cray" },
+	{ 22, "Imp" },
+	{ 23, "Delta" },
+	{ 24, "SCO" },
+	{ 25, "Next" },
+	{ 26, "Next 386" },
+	{ 27, "m88k" },
+	{ 28, "UnixWare" },
+	{ 29, "Intel 32" },
+	{ 30, "Epson" },
+	{ 31, "Decosf" },
+	{ 32, "Ncr3000" },
+	{ 33, "NT PPC" },
+	{ 34, "DG x86" },
+	{ 35, "SCO ev" },
+	{ 36, "Linux" },
+	{ 37, "FreeBSD"  },
+	{ 38, "NetBSD" },
+	{ 39, "Darwin PPC" },
+	{ 0, NULL }
+};
+
+#define HANDLE_FUNC_TYPE	int
+#define HANDLE_FUNC_PARAMS	tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
+#define HANDLE_FUNCTION(name)	HANDLE_FUNC_TYPE name ( HANDLE_FUNC_PARAMS )
+
+HANDLE_FUNCTION(gdsdb_dummy);
+HANDLE_FUNCTION(gdsdb_connect);
+HANDLE_FUNCTION(gdsdb_accept);
+HANDLE_FUNCTION(gdsdb_request);
+HANDLE_FUNCTION(gdsdb_attach);
+HANDLE_FUNCTION(gdsdb_compile);
+HANDLE_FUNCTION(gdsdb_receive);
+HANDLE_FUNCTION(gdsdb_send);
+HANDLE_FUNCTION(gdsdb_response);
+HANDLE_FUNCTION(gdsdb_transact);
+HANDLE_FUNCTION(gdsdb_transact_response);
+HANDLE_FUNCTION(gdsdb_open_blob2);
+HANDLE_FUNCTION(gdsdb_open_blob);
+HANDLE_FUNCTION(gdsdb_segment);
+HANDLE_FUNCTION(gdsdb_seek_blob);
+HANDLE_FUNCTION(gdsdb_reconnect);
+HANDLE_FUNCTION(gdsdb_info);
+HANDLE_FUNCTION(gdsdb_service_start);
+HANDLE_FUNCTION(gdsdb_release);
+HANDLE_FUNCTION(gdsdb_prepare2);
+HANDLE_FUNCTION(gdsdb_event);
+HANDLE_FUNCTION(gdsdb_cancel_events);
+HANDLE_FUNCTION(gdsdb_ddl);
+HANDLE_FUNCTION(gdsdb_slice);
+HANDLE_FUNCTION(gdsdb_slice_response);
+HANDLE_FUNCTION(gdsdb_execute);
+HANDLE_FUNCTION(gdsdb_exec_immediate2);
+HANDLE_FUNCTION(gdsdb_prepare);
+HANDLE_FUNCTION(gdsdb_fetch);
+HANDLE_FUNCTION(gdsdb_fetch_response);
+HANDLE_FUNCTION(gdsdb_free_statement);
+HANDLE_FUNCTION(gdsdb_insert);
+HANDLE_FUNCTION(gdsdb_cursor);
+HANDLE_FUNCTION(gdsdb_sql_response);
+
+HANDLE_FUNC_TYPE (*gdsdb_handle_opcode[])( HANDLE_FUNC_PARAMS ) = {
+	gdsdb_dummy,	/* op_void */
+	gdsdb_connect,	/* op_connect */
+	gdsdb_dummy,	/* op_exit */
+	gdsdb_accept,	/* op_accept */
+	gdsdb_dummy,	/* op_reject */
+	gdsdb_dummy,	/* op_protocol */
+	gdsdb_dummy,	/* op_disconnect */
+	gdsdb_dummy,	/* op_credit */
+	gdsdb_dummy,	/* op_continuation */
+	gdsdb_response,	/* op_response */
+	gdsdb_dummy,	/* op_open_file */
+	gdsdb_dummy,	/* op_create_file */
+	gdsdb_dummy,	/* op_close_file */
+	gdsdb_dummy,	/* op_read_page */
+	gdsdb_dummy,	/* op_write_page */
+	gdsdb_dummy,	/* op_lock */
+	gdsdb_dummy,	/* op_convert_lock */
+	gdsdb_dummy,	/* op_release_lock */
+	gdsdb_dummy,	/* op_blocking */
+	gdsdb_attach,	/* op_attach */
+	gdsdb_attach,	/* op_create */
+	gdsdb_release,	/* op_detach */
+	gdsdb_compile,	/* op_compile */
+	gdsdb_receive,	/* op_start */
+	gdsdb_send,	/* op_start_and_send */
+	gdsdb_send,	/* op_send */
+	gdsdb_receive,	/* op_receive */
+	gdsdb_release,	/* op_unwind */
+	gdsdb_release,	/* op_release */
+	gdsdb_reconnect,	/* op_transaction */
+	gdsdb_release,	/* op_commit */
+	gdsdb_release,	/* op_rollback */
+	gdsdb_release,	/* op_prepare */
+	gdsdb_reconnect,	/* op_reconnect */
+	gdsdb_open_blob2,	/* op_create_blob */
+	gdsdb_open_blob,	/* op_open_blob */
+	gdsdb_segment,	/* op_get_segment */
+	gdsdb_segment,	/* op_put_segment */
+	gdsdb_release,	/* op_cancel_blob */
+	gdsdb_release,	/* op_close_blob */
+	gdsdb_info,	/* op_info_database */
+	gdsdb_info,	/* op_info_request */
+	gdsdb_info,	/* op_info_transaction */
+	gdsdb_info,	/* op_info_blob */
+	gdsdb_segment,	/* op_batch_segments */
+	gdsdb_dummy,	/* op_mgr_set_affinity */
+	gdsdb_dummy,	/* op_mgr_clear_affinity */
+	gdsdb_dummy,	/* op_mgr_report */
+	gdsdb_event,	/* op_que_events */
+	gdsdb_cancel_events,	/* op_cancel_events */
+	gdsdb_release,	/* op_commit_retaining */
+	gdsdb_release,	/* op_prepare */
+	gdsdb_event,	/* op_event */
+	gdsdb_request,	/* op_connect_request */
+	gdsdb_request,	/* op_aux_connect */
+	gdsdb_ddl,	/* op_ddl */
+	gdsdb_open_blob2,	/* op_open_blob2 */
+	gdsdb_open_blob2,	/* op_create_blob2 */
+	gdsdb_slice,	/* op_get_slice */
+	gdsdb_slice,	/* op_put_slice */
+	gdsdb_slice_response,	/* op_slice */
+	gdsdb_seek_blob,	/* op_seek_blob */
+	gdsdb_release,	/* op_allocate_statement */
+	gdsdb_execute,	/* op_execute */
+	gdsdb_prepare,	/* op_exec_immediate */
+	gdsdb_fetch,	/* op_fetch */
+	gdsdb_fetch_response,	/* op_fetch_response */
+	gdsdb_free_statement,	/* op_free_statement */
+	gdsdb_prepare,	/* op_prepare_statement */
+	gdsdb_cursor,	/* op_set_cursor */
+	gdsdb_info,	/* op_info_sql */
+	gdsdb_dummy,	/* op_dummy */
+	gdsdb_response,	/* op_response_piggyback */
+	gdsdb_receive,	/* op_start_and_receive */
+	gdsdb_send,	/* op_start_send_and_receive */
+	gdsdb_exec_immediate2,	/* op_exec_immediate2 */
+	gdsdb_execute,	/* op_execute2 */
+	gdsdb_insert,	/* op_insert */
+	gdsdb_sql_response,	/* op_sql_response */
+	gdsdb_transact,	/* op_transact */
+	gdsdb_transact_response,	/* op_transact_response */
+	gdsdb_release,	/* op_drop_database */
+	gdsdb_attach,	/* op_service_attach */
+	gdsdb_release,	/* op_service_detach */
+	gdsdb_info,	/* op_service_info */
+	gdsdb_service_start,	/* op_service_start */
+	gdsdb_release	/* op_rollback_retaining */
+};
+
+
+HANDLE_FUNCTION(gdsdb_dummy)
+{
+	/* Don't tell them we match */
+	return 0;
+}
+
+HANDLE_FUNCTION(gdsdb_connect)
+{
+	int offset;
+	int length;
+	int count;
+	int i;
+	proto_item *ti;
+	proto_tree *pref_tree;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (check_col(pinfo->cinfo, COL_INFO)){
+		col_append_str(pinfo->cinfo, COL_INFO, ": ");
+		col_append_str(pinfo->cinfo, COL_INFO,
+			tvb_format_text(tvb, 20,
+				tvb_get_ntohl(tvb, 16)));
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_connect_operation, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_connect_version, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_connect_client, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_connect_filename, tvb,
+							offset, 4, FALSE);
+		length = tvb_get_ntohl(tvb, offset);
+		offset += length + 6;
+		proto_tree_add_item(tree, hf_gdsdb_connect_count, tvb,
+							offset, 4, FALSE);
+		count = tvb_get_ntohl(tvb, offset);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_connect_userid, tvb,
+							offset, 4, FALSE);
+		length = tvb_get_ntohl(tvb, offset);
+		offset += length + 5;
+		for(i=0;i<count;i++){
+			ti = proto_tree_add_item(tree, hf_gdsdb_connect_pref,
+						tvb, offset, 20, FALSE);
+			pref_tree = proto_item_add_subtree(ti,
+						 ett_gdsdb_connect_pref);
+			proto_tree_add_item(pref_tree,
+					hf_gdsdb_connect_pref_version,
+						tvb, offset, 4, FALSE);
+			offset += 4;
+			proto_tree_add_item(pref_tree,
+					hf_gdsdb_connect_pref_architecture,
+						tvb, offset, 4, FALSE);
+			offset += 4;
+			proto_tree_add_item(pref_tree,
+					hf_gdsdb_connect_pref_mintype,
+						tvb, offset, 4, FALSE);
+			offset += 4;
+			proto_tree_add_item(pref_tree,
+					hf_gdsdb_connect_pref_maxtype,
+						tvb, offset, 4, FALSE);
+			offset += 4;
+			proto_tree_add_item(pref_tree,
+					hf_gdsdb_connect_pref_weight,
+						tvb, offset, 4, FALSE);
+			offset += 4;
+		}
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_accept)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_accept_version, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_accept_architecture, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_request)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_request_type, tvb,
+						offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_request_object, tvb,
+						offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_request_partner, tvb,
+						offset, 8, FALSE);
+ 	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_attach)
+{
+	int offset;
+	int length;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (check_col(pinfo->cinfo, COL_INFO)){
+		col_append_str(pinfo->cinfo, COL_INFO, ": ");
+		col_append_str(pinfo->cinfo, COL_INFO,
+			tvb_format_text(tvb, 12,
+				tvb_get_ntohl(tvb, 8)));
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_attach_database, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_attach_filename, tvb,
+							offset, 4, FALSE);
+		length = tvb_get_ntohl(tvb, offset);
+		offset += length + 6;
+		proto_tree_add_uint_format_value(tree,
+				hf_gdsdb_attach_dpb, tvb, offset, 4 + length,
+					length, "%i data bytes", length);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_compile)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_compile_database, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_compile_blr, tvb,
+							offset, 4, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_receive)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_receive_request, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_receive_incarnation, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_receive_transaction, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_receive_msgnr, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_receive_messages, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		while(tvb_bytes_exist(tvb, 0, 12)) {
+			proto_tree_add_item(tree, hf_gdsdb_receive_direction,
+						tvb, offset, 4, FALSE);
+			offset += 4;
+			proto_tree_add_item(tree, hf_gdsdb_receive_offset,
+						 tvb, offset, 8, FALSE);
+			offset += 8;
+		}
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_send)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_send_request, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_send_incarnation, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_send_transaction, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_send_msgnr, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_send_messages, tvb,
+							offset, 4, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_response)
+{
+	int offset;
+	int length;
+
+	if (!tvb_bytes_exist(tvb, 0, 32)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_response_object, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_response_blobid, tvb,
+							offset, 8, FALSE);
+		offset += 8;
+		proto_tree_add_item(tree, hf_gdsdb_response_data, tvb,
+							offset, 4, FALSE);
+		length = tvb_get_ntohl(tvb, offset);
+		offset += length + 4;
+		proto_tree_add_item(tree, hf_gdsdb_response_status, tvb,
+				offset, tvb_length(tvb) - offset, FALSE);
+	}
+
+	return tvb_length(tvb);
+
+}
+
+HANDLE_FUNCTION(gdsdb_transact)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_transact_database, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_transact_transaction, tvb,
+							offset, 4, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_transact_response)
+{
+
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 8)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_transactresponse_messages,
+						tvb, offset, 4, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_open_blob2)
+{
+	int offset;
+	int length;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_openblob2_bpb, tvb, offset,
+								4, FALSE);
+		length = tvb_get_ntohl(tvb, offset);
+                offset += length + 6;
+		proto_tree_add_item(tree, hf_gdsdb_openblob_transaction, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_openblob_id, tvb, offset,
+								8, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_open_blob)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_openblob_transaction, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_openblob_id, tvb, offset,
+								8, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_segment)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_segment_blob */
+/* hf_gdsdb_segment_length */
+/* hf_gdsdb_segment_segment */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_seek_blob)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_seekblob_blob */
+/* hf_gdsdb_seekblob_mode */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_reconnect)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 12)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_reconnect_database */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_info)
+{
+	int offset;
+	int length;
+	guint opcode;
+
+	if (!tvb_bytes_exist(tvb, 0, 20)) {
+		return 0;
+	}
+
+	opcode = tvb_get_ntohl(tvb, 0);
+
+	if (tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_info_object, tvb, offset,
+								4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_info_incarnation, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		if(opcode == op_service_info) {
+			proto_tree_add_item(tree, hf_gdsdb_info_items, tvb,
+							offset, 4, FALSE);
+			length = tvb_get_ntohl(tvb, offset);
+			offset += length + 6;
+		}
+		proto_tree_add_item(tree, hf_gdsdb_info_buffer_length, tvb,
+							offset, 4, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_service_start)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_info_object */
+/* hf_gdsdb_info_incarnation */
+/* hf_gdsdb_info_items */
+/* hf_gdsdb_info_buffer_length */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_release)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 8)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_release_object */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_prepare2)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 12)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_prepare2_transaction */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_event)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 24)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_event_database */
+/* hf_gdsdb_event_items */
+/* hf_gdsdb_event_ast */
+/* hf_gdsdb_event_arg */
+/* hf_gdsdb_event_rid */
+	}
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_cancel_events)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 12)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_event_database */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_ddl)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_ddl_database */
+/* hf_gdsdb_ddl_transaction */
+/* hf_gdsdb_ddl_blr */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_slice)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 24)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_slice_transaction */
+/* hf_gdsdb_slice_id */
+/* hf_gdsdb_slice_sdl */
+/* hf_gdsdb_slice_parameters */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_slice_response)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 8)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_sliceresponse_length */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_execute)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 12)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_execute_statement */
+/* hf_gdsdb_execute_transaction */
+/* hf_gdsdb_execute_message_number */
+/* hf_gdsdb_execute_messages */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_exec_immediate2)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 44)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_prepare2_blr */
+/* hf_gdsdb_prepare2_number */
+/* hf_gdsdb_prepare2_messages */
+/* hf_gdsdb_prepare2_outblr */
+/* hf_gdsdb_prepare2_outmsgnr */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_prepare)
+{
+	int offset;
+	int length;
+
+	if (!tvb_bytes_exist(tvb, 0, 32)) {
+		return 0;
+	}
+	if (check_col(pinfo->cinfo, COL_INFO)){
+		col_append_str(pinfo->cinfo, COL_INFO, ": ");
+		col_append_str(pinfo->cinfo, COL_INFO,
+			tvb_format_text(tvb, 20,
+				tvb_get_ntohl(tvb, 16)));
+	}
+	if(tree) {
+		offset = 4;
+		proto_tree_add_item(tree, hf_gdsdb_prepare_transaction, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_prepare_statement, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_prepare_dialect, tvb,
+							offset, 4, FALSE);
+		offset += 4;
+		proto_tree_add_item(tree, hf_gdsdb_prepare_querystr, tvb,
+							offset, 4, FALSE);
+		length = tvb_get_ntohl(tvb, offset);
+		offset += length + 6;
+		proto_tree_add_uint_format_value(tree,
+			hf_gdsdb_prepare_items, tvb, offset, 4 + length,
+					length, "%i data bytes", length);
+        	offset += tvb_get_ntohl(tvb, offset) + 6;
+		proto_tree_add_item(tree, hf_gdsdb_prepare_bufferlength, tvb,
+							offset, 2, FALSE);
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_fetch)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_fetch_statement */
+/* hf_gdsdb_fetch_message_number */
+/* hf_gdsdb_fetch_messages */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_fetch_response)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 12)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_fetchresponse_status */
+/* hf_gdsdb_fetchresponse_messages */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_free_statement)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 12)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_free_statement */
+/* hf_gdsdb_free_option */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_insert)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_insert_statement */
+/* hf_gdsdb_insert_message_number */
+/* hf_gdsdb_insert_messages */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_cursor)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 16)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_cursor_statement */
+/* hf_gdsdb_cursor_type */
+	}
+
+	return tvb_length(tvb);
+}
+
+HANDLE_FUNCTION(gdsdb_sql_response)
+{
+	int offset;
+
+	if (!tvb_bytes_exist(tvb, 0, 8)) {
+		return 0;
+	}
+	if (tree) {
+/* hf_gdsdb_sqlresponse_messages */
+	}
+
+	return tvb_length(tvb);
+}
+
+static int
+dissect_gdsdb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+	proto_item *ti;
+	proto_tree *gdsdb_tree;
+	guint opcode;
+	gdsdb_tree = NULL; /* So the opcode functions can check on if(tree) */
+	packet_info nopi;
+	nopi.cinfo = NULL;
+
+	if (!tvb_bytes_exist(tvb, 0, 4))
+		return 0;
+
+	opcode = tvb_get_ntohl(tvb, 0);
+	if(opcode >= op_max)
+		return 0;
+	if(!gdsdb_handle_opcode[opcode](tvb, &nopi, NULL))
+		return 0;
+
+	if (check_col(pinfo->cinfo, COL_PROTOCOL))
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, "GDS DB");
+
+	if (check_col(pinfo->cinfo, COL_INFO))
+		col_add_str(pinfo->cinfo, COL_INFO,
+				match_strval(opcode, gdsdb_opcode));
+
+	if (tree) {
+		ti = proto_tree_add_item(tree, proto_gdsdb, tvb, 0, -1,
+								   FALSE);
+		gdsdb_tree = proto_item_add_subtree(ti, ett_gdsdb);
+		proto_tree_add_item(gdsdb_tree, hf_gdsdb_opcode, tvb,
+							0, 4, FALSE);
+	}
+
+	/* opcode < op_max */
+	return gdsdb_handle_opcode[opcode](tvb, pinfo, gdsdb_tree);
+}
+
+void
+proto_register_gdsdb(void)
+{
+	static hf_register_info hf[] = {
+		{ &hf_gdsdb_opcode,
+			{ "Opcode", "gdsdb.opcode",
+			FT_UINT32, BASE_DEC, VALS(gdsdb_opcode), 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_dummy */
+		/* gdsdb_connect */
+		{ &hf_gdsdb_connect_operation,
+			{ "Operation", "gdsdb.connect.operation",
+			FT_UINT32, BASE_DEC, VALS(gdsdb_opcode), 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_version,
+			{ "Version", "gdsdb.connect.version",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_client,
+			{ "Client Architecture", "gdsdb.connect.client",
+			FT_UINT32, BASE_DEC, VALS(gdsdb_architectures), 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_filename,
+			{ "Filename", "gdsdb.connect.filename",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_count,
+			{ "Version option count", "gdsdb.connect.count",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_userid,
+			{ "User ID", "gdsdb.connect.userid",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_pref,
+			{ "Prefered version", "gdsdb.connect.pref",
+			FT_NONE, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_pref_version,
+			{ "Version", "gdsdb.connect.pref.version",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_pref_architecture,
+			{ "Architecture", "gdsdb.connect.pref.arch",
+			FT_UINT32, BASE_DEC, VALS(gdsdb_architectures), 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_pref_mintype,
+			{ "Minimum type", "gdsdb.connect.pref.mintype",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_pref_maxtype,
+			{ "Maximum type", "gdsdb.connect.pref.maxtype",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_connect_pref_weight,
+			{ "Prefference weight", "gdsdb.connect.pref.weight",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_accept */
+		{ &hf_gdsdb_accept_version,
+			{ "Version", "gdsdb.accept.version",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_accept_architecture,
+			{ "Architecture", "gdsdb.accept.arch",
+			FT_UINT32, BASE_DEC, VALS(gdsdb_architectures), 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_request */
+		{ &hf_gdsdb_request_type,
+			{ "Type", "gdsdb.connect.type",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_request_object,
+			{ "Object", "gdsdb.connect.object",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_request_partner,
+			{ "Partner", "gdsdb.connect.partner",
+			FT_UINT64, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_attach */
+		{ &hf_gdsdb_attach_database,
+			{ "Database", "gdsdb.attach.database",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_attach_filename,
+			{ "Filename", "gdsdb.attach.filename",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_attach_dpb,
+			{ "Database parameter block", "gdsdb.attach.dpblenght",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_compile */
+		{ &hf_gdsdb_compile_database,
+			{ "Database", "gdsdb.compile.filename",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_compile_blr,
+			{ "BLR", "gdsdb.compile.blr",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_receive */
+		{ &hf_gdsdb_receive_request,
+			{ "Request", "gdsdb.receive.request",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_receive_incarnation,
+			{ "Incarnation", "gdsdb.receive.incarnation",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_receive_transaction,
+			{ "Transaction", "gdsdb.receive.transation",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_receive_msgnr,
+			{ "Message number", "gdsdb.receive.msgnr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_receive_messages,
+			{ "Message Count", "gdsdb.receive.msgcount",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_receive_direction,
+			{ "Scroll direction", "gdsdb.receive.direction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_receive_offset,
+			{ "Scroll offset", "gdsdb.receive.offset",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_send */
+		{ &hf_gdsdb_send_request,
+			{ "Send request", "gdsdb.send.request",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_send_incarnation,
+			{ "Send request", "gdsdb.send.incarnation",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_send_transaction,
+			{ "Send request", "gdsdb.send.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_send_msgnr,
+			{ "Send request", "gdsdb.send.msgnr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_send_messages,
+			{ "Send request", "gdsdb.send.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_response */
+		{ &hf_gdsdb_response_object,
+			{ "Response object", "gdsdb.response.object",
+			FT_UINT32, BASE_HEX, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_response_blobid,
+			{ "Blob ID", "gdsdb.response.blobid",
+			FT_UINT64, BASE_HEX, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_response_data,
+			{ "Data", "gdsdb.response.data",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_response_status,
+			{ "Status vector", "gdsdb.response.status",
+			FT_NONE, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_transact */
+		{ &hf_gdsdb_transact_database,
+			{ "Database", "gdsdb.transact.database",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_transact_transaction,
+			{ "Database", "gdsdb.transact.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_transact_messages,
+			{ "Messages", "gdsdb.transact.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_transact_response */
+		{ &hf_gdsdb_transactresponse_messages,
+			{ "Messages", "gdsdb.transactresponse.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_open_blob2 */
+		{ &hf_gdsdb_openblob2_bpb,
+			{ "Blob parameter block", "gdsdb.openblob2.bpb",
+			FT_UINT_STRING, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_open_blob */
+		{ &hf_gdsdb_openblob_transaction,
+			{ "Transaction", "gdsdb.openblob2.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_openblob_id,
+			{ "ID", "gdsdb.openblob.id",
+			FT_UINT64, BASE_HEX, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_segment */
+		{ &hf_gdsdb_segment_blob,
+			{ "Blob", "gdsdb.segment.blob",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_segment_length,
+			{ "Lenght", "gdsdb.segment.length",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_segment_segment,
+			{ "Segment", "gdsdb.segment.segment",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_seek_blob */
+		{ &hf_gdsdb_seekblob_blob,
+			{ "Blob", "gdsdb.seekblob.blob",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_seekblob_mode,
+			{ "Mode", "gdsdb.seekblob.mode",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_reconnect */
+		{ &hf_gdsdb_reconnect_database,
+			{ "Database", "gdsdb.reconnect.database",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_info & gdsdb_service_start */
+		{ &hf_gdsdb_info_object,
+			{ "Object", "gdsdb.info.object",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_info_incarnation,
+			{ "Incarnation", "gdsdb.info.object",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_info_items,
+			{ "Items", "gdsdb.info.items",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_info_buffer_length,
+			{ "Buffer lenght", "gdsdb.info.bufferlength",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_release */
+		{ &hf_gdsdb_release_object,
+			{ "Object", "gdsdb.release.object",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_prepare2 */
+		{ &hf_gdsdb_prepare2_transaction,
+			{ "Transaction", "gdsdb.prepare2.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_event & gdsdb_cancel_events */
+		{ &hf_gdsdb_event_database,
+			{ "Database", "gdsdb.event.database",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_event_items,
+			{ "Event description block", "gdsdb.event.items",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_event_ast,
+			{ "ast routine", "gdsdb.event.ast",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_event_arg,
+			{ "Argument to ast routine", "gdsdb.event.arg",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_event_rid,
+			{ "ID", "gdsdb.event.id",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_ddl */
+		{ &hf_gdsdb_ddl_database,
+			{ "Database", "gdsdb.ddl.database",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_ddl_transaction,
+			{ "Transaction", "gdsdb.ddl.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_ddl_blr,
+			{ "BLR", "gdsdb.ddl.blr",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_slice */
+		{ &hf_gdsdb_slice_transaction,
+			{ "Transaction", "gdsdb.slice.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_slice_id,
+			{ "ID", "gdsdb.slice.id",
+			FT_UINT64, BASE_HEX, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_slice_sdl,
+			{ "Slice description language", "gdsdb.slice.sdl",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_slice_parameters,
+			{ "Parameters", "gdsdb.slice.parameters",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_slice_response */
+		{ &hf_gdsdb_sliceresponse_length,
+			{ "Lenght", "gdsdb.sliceresponse.lenght",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_execute */
+		{ &hf_gdsdb_execute_statement,
+			{ "Statement", "gdsdb.execute.statement",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_execute_transaction,
+			{ "Transaction", "gdsdb.execute.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_execute_message_number,
+			{ "Message number", "gdsdb.execute.messagenumber",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_execute_messages,
+			{ "Number of messages", "gdsdb.execute.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_execute2 */
+		{ &hf_gdsdb_execute_outblr,
+			{ "Output BLR", "gdsdb.execute.outblr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_execute_outmsgnr,
+			{ "Output Message number", "gdsdb.execute.outmsgnr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_exec_immediate2 */
+		{ &hf_gdsdb_prepare2_blr,
+			{ "BLR", "gdsdb.prepare.blr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare2_number,
+			{ "Message number", "gdsdb.prepare2.messagenumber",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare2_messages,
+			{ "Number of messages", "gdsdb.prepare2.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare2_outblr,
+			{ "Output BLR", "gdsdb.prepare2.outblr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare2_outmsgnr,
+			{ "Output Message number", "gdsdb.prepare2.outmsgnr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_prepare */
+		{ &hf_gdsdb_prepare_transaction,
+			{ "Prepare, Transaction", "gdsdb.prepare.transaction",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare_statement,
+			{ "Prepare, Statement", "gdsdb.prepare.statement",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare_dialect,
+			{ "Prepare, Dialect", "gdsdb.prepare.dialect",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare_querystr,
+			{ "Prepare, Query", "gdsdb.prepare.querystr",
+			FT_UINT_STRING, BASE_NONE, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare_items,
+			{ "Prepare, Information items", "gdsdb.prepare.items",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_prepare_bufferlength,
+			{ "Prepare, Bufferlength", "gdsdb.prepare.bufferlen",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_fetch */
+		{ &hf_gdsdb_fetch_statement,
+			{ "Statement", "gdsdb.fetch.statement",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_fetch_message_number,
+			{ "Message number", "gdsdb.fetch.messagenr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_fetch_messages,
+			{ "Number of messages", "gdsdb.fetch.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_fetch_response */
+		{ &hf_gdsdb_fetchresponse_status,
+			{ "Status", "gdsdb.fetchresponse.status",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_fetchresponse_messages,
+			{ "Number of messages", "gdsdb.fetchresponse.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_free_statement */
+		{ &hf_gdsdb_free_statement,
+			{ "Statement", "gdsdb.fetchresponse.statement",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_free_option,
+			{ "Option", "gdsdb.fetchresponse.option",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_insert */
+		{ &hf_gdsdb_insert_statement,
+			{ "Statement", "gdsdb.insert.statement",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_insert_message_number,
+			{ "Message number", "gdsdb.insert.messagenr",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_insert_messages,
+			{ "Number of messages", "gdsdb.insert.messages",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_cursor */
+		{ &hf_gdsdb_cursor_statement,
+			{ "Statement", "gdsdb.cursor.statement",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		{ &hf_gdsdb_cursor_type,
+			{ "Type", "gdsdb.cursor.type",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		},
+		/* gdsdb_sql_response */
+		{ &hf_gdsdb_sqlresponse_messages,
+			{ "SQL Response, Message Count", "gdsdb.sqlresponse.msgcount",
+			FT_UINT32, BASE_DEC, NULL, 0x0,
+			NULL, HFILL }
+		}
+	};
+
+	static gint *ett[] = {
+		&ett_gdsdb,
+		&ett_gdsdb_opcode,
+		&ett_gdsdb_connect_pref
+	};
+
+	proto_gdsdb = proto_register_protocol(
+		"Firebird SQL Database Remote Protocol",
+		"FB/IB GDS DB", "gdsdb");
+
+        proto_register_field_array(proto_gdsdb, hf, array_length(hf));
+        proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_gdsdb(void)
+{
+	/* Main dissector */
+
+	dissector_handle_t gdsdb_handle;
+
+	gdsdb_handle = new_create_dissector_handle(dissect_gdsdb,
+								 proto_gdsdb);
+	dissector_add("tcp.port", TCP_PORT, gdsdb_handle);
+}