diff options
author | Guy Harris <guy@alum.mit.edu> | 2004-12-31 22:00:44 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2004-12-31 22:00:44 +0000 |
commit | 3f0d0ca5ea5f6034904e4cb03b38b66e7b03e165 (patch) | |
tree | 174322d6dcc7eaee33e5f06cecd6843ea9cb0de1 /epan/dissectors | |
parent | ed15a739621ddac0970e45aae3de9ec6a397b54f (diff) |
Note what Fibre Channel spec documents this protocol.
Don't assign the const pointers passed to hash routines to non-const
pointers.
In "zonenm_to_str()", don't assume there's a null terminator in the
packet - use "tvb_get_string()" so that the buffer into which it's
copied is explicitly null-terminated.
Put the Domain & Port into the protocol tree as a "0xXXXXXXXX" string,
rather than as a string with one blank in it.
svn path=/trunk/; revision=12909
Diffstat (limited to 'epan/dissectors')
-rw-r--r-- | epan/dissectors/packet-fcdns.c | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/epan/dissectors/packet-fcdns.c b/epan/dissectors/packet-fcdns.c index 78c2099ebd..1bdda592c8 100644 --- a/epan/dissectors/packet-fcdns.c +++ b/epan/dissectors/packet-fcdns.c @@ -59,6 +59,10 @@ #include "packet-fcdns.h" #include "packet-fcswils.h" +/* + * See FC-GS-2. + */ + /* Initialize the protocol and registered fields */ static int proto_fcdns = -1; static int hf_fcdns_gssubtype = -1; @@ -137,8 +141,8 @@ static dissector_handle_t data_handle; static gint fcdns_equal(gconstpointer v, gconstpointer w) { - fcdns_conv_key_t *v1 = (fcdns_conv_key_t *)v; - fcdns_conv_key_t *v2 = (fcdns_conv_key_t *)w; + const fcdns_conv_key_t *v1 = v; + const fcdns_conv_key_t *v2 = w; return (v1->conv_idx == v2->conv_idx); } @@ -146,7 +150,7 @@ fcdns_equal(gconstpointer v, gconstpointer w) static guint fcdns_hash (gconstpointer v) { - fcdns_conv_key_t *key = (fcdns_conv_key_t *)v; + const fcdns_conv_key_t *key = v; guint val; val = key->conv_idx; @@ -1135,26 +1139,30 @@ dissect_fcdns_daid (tvbuff_t *tvb, proto_tree *req_tree, gboolean isreq) } } -static gchar * +static guint8 * zonenm_to_str (tvbuff_t *tvb, gint offset) { int len = tvb_get_guint8 (tvb, offset); - return ((gchar *)tvb_get_ptr (tvb, offset+4, len)); + return tvb_get_string (tvb, offset+4, len); } static void dissect_fcdns_zone_mbr (tvbuff_t *tvb, proto_tree *zmbr_tree, int offset) { - int mbrlen = 4 + tvb_get_guint8 (tvb, offset+3); - - proto_tree_add_item (zmbr_tree, hf_fcdns_zone_mbrtype, tvb, - offset, 1, 0); + guint8 mbrtype; + int idlen; + char dpbuf[2+8+1]; + char *str; + + mbrtype = tvb_get_guint8 (tvb, offset); + proto_tree_add_uint (zmbr_tree, hf_fcdns_zone_mbrtype, tvb, + offset, 1, mbrtype); proto_tree_add_text (zmbr_tree, tvb, offset+2, 1, "Flags: 0x%x", tvb_get_guint8 (tvb, offset+2)); + idlen = tvb_get_guint8 (tvb, offset+3); proto_tree_add_text (zmbr_tree, tvb, offset+3, 1, - "Identifier Length: %d", - tvb_get_guint8 (tvb, offset+3)); - switch (tvb_get_guint8 (tvb, offset)) { + "Identifier Length: %d", idlen); + switch (mbrtype) { case FC_SWILS_ZONEMBR_WWN: proto_tree_add_string (zmbr_tree, hf_fcdns_zone_mbrid, tvb, offset+4, 8, @@ -1163,29 +1171,26 @@ dissect_fcdns_zone_mbr (tvbuff_t *tvb, proto_tree *zmbr_tree, int offset) 8))); break; case FC_SWILS_ZONEMBR_DP: - proto_tree_add_string_format (zmbr_tree, - hf_fcdns_zone_mbrid, - tvb, offset+4, 4, " ", - "0x%x", - tvb_get_ntohl (tvb, - offset+4)); + sprintf(dpbuf, "0x%08x", tvb_get_ntohl (tvb, offset+4)); + proto_tree_add_string (zmbr_tree, hf_fcdns_zone_mbrid, tvb, + offset+4, 4, dpbuf); break; case FC_SWILS_ZONEMBR_FCID: proto_tree_add_string (zmbr_tree, hf_fcdns_zone_mbrid, tvb, offset+4, 4, fc_to_str (tvb_get_ptr (tvb, - offset+4, + offset+5, 3))); break; case FC_SWILS_ZONEMBR_ALIAS: + str = zonenm_to_str (tvb, offset+4); proto_tree_add_string (zmbr_tree, hf_fcdns_zone_mbrid, tvb, - offset+4, - tvb_get_guint8 (tvb, offset+3), - zonenm_to_str (tvb, offset+4)); + offset+4, idlen, str); + g_free (str); break; default: proto_tree_add_string (zmbr_tree, hf_fcdns_zone_mbrid, tvb, - offset+4, mbrlen, + offset+4, idlen, "Unknown member type format"); } @@ -1935,5 +1940,3 @@ proto_reg_handoff_fcdns (void) data_handle = find_dissector ("data"); } - - |