diff options
author | chinarulezzz <s.alex08@mail.ru> | 2016-12-21 06:20:55 +0200 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-12-21 12:07:38 +0000 |
commit | 031db50c64995d0879b77570f562c0eb98d52e4a (patch) | |
tree | 959974b7a58b4187b0ddc16e2d96dd952e5c08a8 /epan/dissectors/packet-tns.c | |
parent | 56cf6998bbe66ddc614bf04915847dc047218b39 (diff) |
packet-tns.c: add Version and Services parsing for SNS messages.
Tested with pcaps from SampleCaptures wiki.
Change-Id: I13656ec484f276024160c8994a6750704058b2db
Reviewed-on: https://code.wireshark.org/review/19367
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-tns.c')
-rw-r--r-- | epan/dissectors/packet-tns.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/epan/dissectors/packet-tns.c b/epan/dissectors/packet-tns.c index 1a469b58d5..5d27d148b3 100644 --- a/epan/dissectors/packet-tns.c +++ b/epan/dissectors/packet-tns.c @@ -143,6 +143,10 @@ static int hf_tns_data_setp_cli_plat = -1; static int hf_tns_data_setp_version = -1; static int hf_tns_data_setp_banner = -1; +static int hf_tns_data_sns_cli_vers = -1; +static int hf_tns_data_sns_srv_vers = -1; +static int hf_tns_data_sns_srvcnt = -1; + static gint ett_tns = -1; static gint ett_tns_connect = -1; static gint ett_tns_accept = -1; @@ -428,10 +432,25 @@ static guint get_data_func_id(tvbuff_t *tvb, int offset) } } +static void vsnum_to_vstext_basecustom(gchar *result, guint32 vsnum) +{ + /* + * Translate hex value to human readable version value, described at + * http://docs.oracle.com/cd/B28359_01/server.111/b28310/dba004.htm + */ + g_snprintf(result, ITEM_LABEL_LENGTH, "%d.%d.%d.%d.%d", + vsnum >> 24, + (vsnum >> 20) & 0xf, + (vsnum >> 12) & 0xf, + (vsnum >> 8) & 0xf, + vsnum & 0xff); +} + static void dissect_tns_data(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tns_tree) { proto_tree *data_tree; guint data_func_id; + gboolean is_request; static const int * flags[] = { &hf_tns_data_flag_send, &hf_tns_data_flag_rc, @@ -445,6 +464,7 @@ static void dissect_tns_data(tvbuff_t *tvb, int offset, packet_info *pinfo, prot NULL }; + is_request = pinfo->match_uint == pinfo->destport; data_tree = proto_tree_add_subtree(tns_tree, tvb, offset, -1, ett_tns_data, NULL, "Data"); proto_tree_add_bitmask(data_tree, tvb, offset, hf_tns_data_flag, ett_tns_data_flag, flags, ENC_BIG_ENDIAN); @@ -471,7 +491,7 @@ static void dissect_tns_data(tvbuff_t *tvb, int offset, packet_info *pinfo, prot proto_tree *versions_tree; proto_item *ti; char sep; - if ( pinfo->match_uint == pinfo->destport ) /* check if is request */ + if ( is_request ) { versions_tree = proto_tree_add_subtree(data_tree, tvb, offset, -1, ett_tns_acc_versions, &ti, "Accepted Versions"); sep = ':'; @@ -544,12 +564,28 @@ static void dissect_tns_data(tvbuff_t *tvb, int offset, packet_info *pinfo, prot break; case SQLNET_SNS: + { proto_tree_add_item(data_tree, hf_tns_data_id, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; proto_tree_add_item(data_tree, hf_tns_data_length, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + if ( is_request ) + { + proto_tree_add_item(data_tree, hf_tns_data_sns_cli_vers, tvb, offset, 4, ENC_BIG_ENDIAN); + } + else + { + proto_tree_add_item(data_tree, hf_tns_data_sns_srv_vers, tvb, offset, 4, ENC_BIG_ENDIAN); + } + offset += 4; + + proto_tree_add_item(data_tree, hf_tns_data_sns_srvcnt, tvb, offset, 2, ENC_BIG_ENDIAN); + /* move back, to include data_id into data_dissector */ - offset -= 4; + offset -= 10; break; + } } call_data_dissector(tvb_new_subset_remaining(tvb, offset), pinfo, data_tree); @@ -1274,6 +1310,16 @@ void proto_register_tns(void) "Server Banner", "tns.data_setp_resp.banner", FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_tns_data_sns_cli_vers, { + "Client Version", "tns.data_sns.cli_vers", FT_UINT32, BASE_CUSTOM, + CF_FUNC(vsnum_to_vstext_basecustom), 0x0, NULL, HFILL }}, + { &hf_tns_data_sns_srv_vers, { + "Server Version", "tns.data_sns.srv_vers", FT_UINT32, BASE_CUSTOM, + CF_FUNC(vsnum_to_vstext_basecustom), 0x0, NULL, HFILL }}, + { &hf_tns_data_sns_srvcnt, { + "Services", "tns.data_sns.srvcnt", FT_UINT16, BASE_DEC, + NULL, 0x0, NULL, HFILL }}, + { &hf_tns_reserved_byte, { "Reserved Byte", "tns.reserved_byte", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, |