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); +}
- Follow-Ups:
- Prev by Date: Re: [Wireshark-dev] [PATCH] Improved support for MIPv4
- Next by Date: Re: [Wireshark-dev] [Wireshark-commits] rev 21556:/trunk/epan//trunk/epan/: proto.c proto.h - all buildbotsred now :-(
- Previous by thread: Re: [Wireshark-dev] [PATCH] Firebird/Interbase dissector, request for comments
- Next by thread: Re: [Wireshark-dev] [PATCH] Firebird/Interbase dissector, request for comments
- Index(es):