Use value_string_ext fcns to access certain value_string arrays;

Sort a few value_string arrays to be in ascending order by value;
Do minor reformatting and whitespace cleanup.


git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@34813 f5534014-38df-0310-8fa8-9805f1628bb7
This commit is contained in:
wmeier 2010-11-08 21:59:39 +00:00
parent 4b59653f07
commit 3c22ec4ff7
8 changed files with 735 additions and 718 deletions

View File

@ -138,40 +138,41 @@ http://developer.apple.com/mac/library/documentation/Networking/Conceptual/AFP/I
#define AFP_ADDCMT 56
#define AFP_RMVCMT 57
#define AFP_GETCMT 58
#define AFP_ZZZ 122
#define AFP_ADDICON 192
/* AFP 3.0 new calls */
#define AFP_BYTELOCK_EXT 59
#define AFP_CATSEARCH_EXT 67
#define AFP_ENUMERATE_EXT 66
#define AFP_READ_EXT 60
#define AFP_WRITE_EXT 61
#define AFP_LOGIN_EXT 63
#define AFP_GETSESSTOKEN 64
#define AFP_DISCTOLDSESS 65
#define AFP_ENUMERATE_EXT 66
#define AFP_CATSEARCH_EXT 67
/* AFP 3.1 new calls */
#define AFP_ENUMERATE_EXT2 68
#define AFP_ENUMERATE_EXT2 68
/* AFP 3.2 new calls */
#define AFP_GETEXTATTR 69
#define AFP_SETEXTATTR 70
#define AFP_REMOVEATTR 71
#define AFP_LISTEXTATTR 72
#define AFP_GETACL 73
#define AFP_SETACL 74
#define AFP_ACCESS 75
#define AFP_GETEXTATTR 69
#define AFP_SETEXTATTR 70
#define AFP_REMOVEATTR 71
#define AFP_LISTEXTATTR 72
#define AFP_GETACL 73
#define AFP_SETACL 74
#define AFP_ACCESS 75
/* AFP 3.2 calls added in 10.5 */
#define AFP_SPOTLIGHTRPC 76
#define AFP_SYNCDIR 78
#define AFP_SYNCFORK 79
#define AFP_SPOTLIGHTRPC 76
#define AFP_SYNCDIR 78
#define AFP_SYNCFORK 79
/* FPSpotlightRPC subcommand codes */
#define SPOTLIGHT_CMD_GET_VOLPATH 1
#define SPOTLIGHT_CMD_GET_VOLID 2
#define SPOTLIGHT_CMD_GET_THREE 3
#define SPOTLIGHT_CMD_GET_VOLID 2
#define SPOTLIGHT_CMD_GET_THREE 3
/* ----------------------------- */
static int proto_afp = -1;
@ -366,7 +367,7 @@ static const value_string vol_signature_vals[] = {
{0, NULL }
};
const value_string CommandCode_vals[] = {
static const value_string CommandCode_vals[] = {
{AFP_BYTELOCK, "FPByteRangeLock" },
{AFP_CLOSEVOL, "FPCloseVol" },
{AFP_CLOSEDIR, "FPCloseDir" },
@ -419,16 +420,14 @@ const value_string CommandCode_vals[] = {
{AFP_RMVCMT, "FPRemoveComment" },
{AFP_GETCMT, "FPGetComment" },
{AFP_BYTELOCK_EXT, "FPByteRangeLockExt" },
{AFP_CATSEARCH_EXT, "FPCatSearchExt" },
{AFP_ENUMERATE_EXT, "FPEnumerateExt" },
{AFP_ENUMERATE_EXT2, "FPEnumerateExt2" },
{AFP_READ_EXT, "FPReadExt" },
{AFP_WRITE_EXT, "FPWriteExt" },
{AFP_LOGIN_EXT, "FPLoginExt" },
{AFP_GETSESSTOKEN, "FPGetSessionToken" },
{AFP_DISCTOLDSESS, "FPDisconnectOldSession" },
{AFP_ZZZ, "FPZzzzz" },
{AFP_ADDICON, "FPAddIcon" },
{AFP_ENUMERATE_EXT, "FPEnumerateExt" },
{AFP_CATSEARCH_EXT, "FPCatSearchExt" },
{AFP_ENUMERATE_EXT2, "FPEnumerateExt2" },
{AFP_GETEXTATTR, "FPGetExtAttr" },
{AFP_SETEXTATTR, "FPSetExtAttr" },
{AFP_REMOVEATTR, "FPRemoveExtAttr" },
@ -437,10 +436,13 @@ const value_string CommandCode_vals[] = {
{AFP_SETACL, "FPSetACL" },
{AFP_ACCESS, "FPAccess" },
{AFP_SPOTLIGHTRPC, "FPSpotlightRPC" },
{AFP_SYNCFORK, "FPSyncFork" },
{AFP_SYNCDIR, "FPSyncDir" },
{AFP_SYNCFORK, "FPSyncFork" },
{AFP_ZZZ, "FPZzzzz" },
{AFP_ADDICON, "FPAddIcon" },
{0, NULL }
};
value_string_ext CommandCode_vals_ext = VALUE_STRING_EXT_INIT(CommandCode_vals);
static const value_string unicode_hint_vals[] = {
{ 0, "MacRoman" },
@ -546,6 +548,7 @@ static const value_string unicode_hint_vals[] = {
{ 1570, "JIS_X0208_90" },
{ 0, NULL }
};
static value_string_ext unicode_hint_vals_ext = VALUE_STRING_EXT_INIT(unicode_hint_vals);
/* volume bitmap
from Apple AFP3.0.pdf
@ -707,6 +710,7 @@ static const value_string map_name_type_vals[] = {
{5, "Unicode user name to a user UUID" },
{6, "Unicode group name to a group UUID" },
{0, NULL } };
static value_string_ext map_name_type_vals_ext = VALUE_STRING_EXT_INIT(map_name_type_vals);
static const value_string map_id_type_vals[] = {
{1, "User ID to a Macintosh roman user name" },
@ -716,6 +720,7 @@ static const value_string map_id_type_vals[] = {
{5, "User UUID to a unicode user name" },
{6, "Group UUID to a unicode group name" },
{0, NULL } };
static value_string_ext map_id_type_vals_ext = VALUE_STRING_EXT_INIT(map_id_type_vals);
/* map_id subfunctions 5,6: reply type */
static const value_string map_id_reply_type_vals[] = {
@ -773,24 +778,24 @@ static const value_string map_id_reply_type_vals[] = {
table 1-7 p. 28
*/
#define AR_O_SEARCH (1 << 0) /* owner has search access */
#define AR_O_READ (1 << 1) /* owner has read access */
#define AR_O_WRITE (1 << 2) /* owner has write access */
#define AR_O_SEARCH (1 << 0) /* owner has search access */
#define AR_O_READ (1 << 1) /* owner has read access */
#define AR_O_WRITE (1 << 2) /* owner has write access */
#define AR_G_SEARCH (1 << 8) /* group has search access */
#define AR_G_READ (1 << 9) /* group has read access */
#define AR_G_WRITE (1 << 10) /* group has write access */
#define AR_G_SEARCH (1 << 8) /* group has search access */
#define AR_G_READ (1 << 9) /* group has read access */
#define AR_G_WRITE (1 << 10) /* group has write access */
#define AR_E_SEARCH (1 << 16) /* everyone has search access */
#define AR_E_READ (1 << 17) /* everyone has read access */
#define AR_E_WRITE (1 << 18) /* everyone has write access */
#define AR_E_SEARCH (1 << 16) /* everyone has search access */
#define AR_E_READ (1 << 17) /* everyone has read access */
#define AR_E_WRITE (1 << 18) /* everyone has write access */
#define AR_U_SEARCH (1 << 24) /* user has search access */
#define AR_U_READ (1 << 25) /* user has read access */
#define AR_U_WRITE (1 << 26) /* user has write access */
#define AR_U_SEARCH (1 << 24) /* user has search access */
#define AR_U_READ (1 << 25) /* user has read access */
#define AR_U_WRITE (1 << 26) /* user has write access */
#define AR_BLANK (1 << 28) /* Blank Access Privileges (use parent dir privileges) */
#define AR_U_OWN (1UL << 31) /* user is the owner */
#define AR_BLANK (1 << 28) /* Blank Access Privileges (use parent dir privileges) */
#define AR_U_OWN (1UL << 31) /* user is the owner */
static int hf_afp_dir_ar = -1;
static int hf_afp_dir_ar_o_search = -1;
@ -821,9 +826,9 @@ static int hf_afp_user_bitmap_UUID = -1;
static gint ett_afp_user_bitmap = -1;
static const value_string user_flag_vals[] = {
{0, "Use user ID" },
{1, "Default user" },
{0, NULL } };
{0, "Use user ID" },
{1, "Default user" },
{0, NULL } };
static int hf_afp_message = -1;
static int hf_afp_message_type = -1;
@ -898,7 +903,7 @@ kFPUTF8NameBit (bit 13)
#define kGetKerberosSessionKey 8
static const value_string token_type_vals[] = {
{kLoginWithoutID, "LoginWithoutID"},
{kLoginWithoutID, "LoginWithoutID"},
{kLoginWithID, "LoginWithID"},
{kReconnWithID, "ReconnWithID"},
{kLoginWithTimeAndID, "LoginWithTimeAndID"},
@ -909,6 +914,7 @@ static const value_string token_type_vals[] = {
{kGetKerberosSessionKey, "GetKerberosSessionKey"},
{0, NULL } };
static value_string_ext token_type_vals_ext = VALUE_STRING_EXT_INIT(token_type_vals);
/* AFP 3.2 ACL bitmap */
#define kFileSec_UUID (1 << 0)
@ -1026,10 +1032,10 @@ static gint spotlight_endianess;
static guint64
spotlight_ntoh64(tvbuff_t *tvb, gint offset)
{
if (spotlight_endianess == SPOTLIGHT_LITTLE_ENDIAN)
return tvb_get_letoh64(tvb, offset);
else
return tvb_get_ntoh64(tvb, offset);
if (spotlight_endianess == SPOTLIGHT_LITTLE_ENDIAN)
return tvb_get_letoh64(tvb, offset);
else
return tvb_get_ntoh64(tvb, offset);
}
/* Hash Functions */
@ -3956,199 +3962,199 @@ dissect_query_afp_with_did(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
static gint
dissect_spotlight(tvbuff_t *tvb, proto_tree *tree, gint offset)
{
gint i;
gint mdlen;
gint query_offset;
gint query_offset_next;
gint querylen;
gint toc_offset;
gint num_queries;
gint query_data_len;
guint64 query_data64;
guint64 toc_entry;
guint8 *mds;
gint i;
gint mdlen;
gint query_offset;
gint query_offset_next;
gint querylen;
gint toc_offset;
gint num_queries;
gint query_data_len;
guint64 query_data64;
guint64 toc_entry;
guint8 *mds;
proto_item *item_queries_data;
proto_tree *sub_tree_queries;
proto_item *item_toc;
proto_tree *sub_tree_toc;
proto_item *item_query;
proto_tree *sub_tree_query;
proto_item *item_data;
proto_tree *sub_tree_data;
proto_item *item_queries_data;
proto_tree *sub_tree_queries;
proto_item *item_toc;
proto_tree *sub_tree_toc;
proto_item *item_query;
proto_tree *sub_tree_query;
proto_item *item_data;
proto_tree *sub_tree_data;
if (strncmp(tvb_get_ephemeral_string(tvb, offset, 8), "md031234", 8) == 0)
spotlight_endianess = SPOTLIGHT_BIG_ENDIAN;
else
spotlight_endianess = SPOTLIGHT_LITTLE_ENDIAN;
proto_tree_add_text(tree,
tvb,
offset,
8,
"Endianess: %s",
spotlight_endianess == SPOTLIGHT_BIG_ENDIAN ?
"Big Endian" : "Litte Endian");
offset += 8;
if (strncmp(tvb_get_ephemeral_string(tvb, offset, 8), "md031234", 8) == 0)
spotlight_endianess = SPOTLIGHT_BIG_ENDIAN;
else
spotlight_endianess = SPOTLIGHT_LITTLE_ENDIAN;
proto_tree_add_text(tree,
tvb,
offset,
8,
"Endianess: %s",
spotlight_endianess == SPOTLIGHT_BIG_ENDIAN ?
"Big Endian" : "Litte Endian");
offset += 8;
toc_offset = (spotlight_ntoh64(tvb, offset) >> 32) * 8 - 8;
querylen = (spotlight_ntoh64(tvb, offset) & 0xffffffff) * 8 - 8;
proto_tree_add_text(tree,
tvb,
offset,
8,
"ToC Offset: %u Bytes, Query length: %u Bytes",
toc_offset,
querylen);
offset += 8;
toc_offset = (spotlight_ntoh64(tvb, offset) >> 32) * 8 - 8;
querylen = (spotlight_ntoh64(tvb, offset) & 0xffffffff) * 8 - 8;
proto_tree_add_text(tree,
tvb,
offset,
8,
"ToC Offset: %u Bytes, Query length: %u Bytes",
toc_offset,
querylen);
offset += 8;
num_queries = (gint)(spotlight_ntoh64(tvb, offset + toc_offset) & 0xffff) - 1;
num_queries = (gint)(spotlight_ntoh64(tvb, offset + toc_offset) & 0xffff) - 1;
item_queries_data = proto_tree_add_text(tree,
tvb,
offset,
toc_offset,
"Query data (%u queries)",
num_queries);
item_queries_data = proto_tree_add_text(tree,
tvb,
offset,
toc_offset,
"Query data (%u queries)",
num_queries);
sub_tree_queries = proto_item_add_subtree(item_queries_data, ett_afp_spotlight_queries);
/* Queries */
query_offset_next = (spotlight_ntoh64(tvb, offset + toc_offset + 8) & 0xff) * 8 - 16;
for (i = 0; i < num_queries; i++) {
query_offset = query_offset_next;
if (i == num_queries - 1)
/* last */
query_offset_next = toc_offset;
else
/* peek at next offset */
query_offset_next = (spotlight_ntoh64(tvb, offset + toc_offset + 8 + (i+1)*8) & 0xff) * 8 - 16;
sub_tree_queries = proto_item_add_subtree(item_queries_data, ett_afp_spotlight_queries);
/* Queries */
query_offset_next = (spotlight_ntoh64(tvb, offset + toc_offset + 8) & 0xff) * 8 - 16;
for (i = 0; i < num_queries; i++) {
query_offset = query_offset_next;
if (i == num_queries - 1)
/* last */
query_offset_next = toc_offset;
else
/* peek at next offset */
query_offset_next = (spotlight_ntoh64(tvb, offset + toc_offset + 8 + (i+1)*8) & 0xff) * 8 - 16;
/* this is obviously the length of one query */
query_data_len = query_offset_next - query_offset;
/* this is obviously the length of one query */
query_data_len = query_offset_next - query_offset;
if (query_data_len > 8)
item_query = proto_tree_add_text(sub_tree_queries,
tvb,
offset + query_offset,
query_data_len,
"Query %u",
i + 1);
else
item_query = proto_tree_add_text(sub_tree_queries,
tvb,
offset + query_offset,
query_data_len,
"Query %u (empty?)",
i + 1);
if (query_data_len > 8)
item_query = proto_tree_add_text(sub_tree_queries,
tvb,
offset + query_offset,
query_data_len,
"Query %u",
i + 1);
else
item_query = proto_tree_add_text(sub_tree_queries,
tvb,
offset + query_offset,
query_data_len,
"Query %u (empty?)",
i + 1);
/* tree per query */
sub_tree_query = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
query_data64 = spotlight_ntoh64(tvb, offset + query_offset);
/* tree per query */
sub_tree_query = proto_item_add_subtree(item_query, ett_afp_spotlight_query_line);
query_data64 = spotlight_ntoh64(tvb, offset + query_offset);
/* print the query line */
proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset,
8,
"Index: %" G_GINT64_MODIFIER "u, ?: 0x%08" G_GINT64_MODIFIER "x",
query_data64 >> 32,
query_data64 & 0xffffffff);
/* print the query line */
proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset,
8,
"Index: %" G_GINT64_MODIFIER "u, ?: 0x%08" G_GINT64_MODIFIER "x",
query_data64 >> 32,
query_data64 & 0xffffffff);
/* really any data in the query */
if (query_data_len > 8) {
/* populate the query tree */
query_data64 = spotlight_ntoh64(tvb, offset + query_offset + 8);
mdlen = ((query_data64 & 0xffff) - 1) * 8;
proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset + 8,
8,
"?(reappears in ToC): 0x%08" G_GINT64_MODIFIER "x, ?: 0x%04" G_GINT64_MODIFIER "x, strlen: ((%u-1)*8 = ) %u",
query_data64 >> 32,
(query_data64 & 0xffff0000) >> 16,
mdlen/8+1,
mdlen);
/* really any data in the query */
if (query_data_len > 8) {
/* populate the query tree */
query_data64 = spotlight_ntoh64(tvb, offset + query_offset + 8);
mdlen = ((query_data64 & 0xffff) - 1) * 8;
proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset + 8,
8,
"?(reappears in ToC): 0x%08" G_GINT64_MODIFIER "x, ?: 0x%04" G_GINT64_MODIFIER "x, strlen: ((%u-1)*8 = ) %u",
query_data64 >> 32,
(query_data64 & 0xffff0000) >> 16,
mdlen/8+1,
mdlen);
mds = tvb_get_ephemeral_string(tvb, offset + query_offset + 16, mdlen);
proto_item_append_text(item_query, ": \"%s\"", mds);
mds = tvb_get_ephemeral_string(tvb, offset + query_offset + 16, mdlen);
proto_item_append_text(item_query, ": \"%s\"", mds);
proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset + 16,
mdlen,
"mdstring: \"%s\" (%u bytes)",
mds,
mdlen);
proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset + 16,
mdlen,
"mdstring: \"%s\" (%u bytes)",
mds,
mdlen);
item_data = proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset + 16 + mdlen,
query_data_len - 16 - mdlen,
"data: %u bytes",
query_data_len - 16 - mdlen);
item_data = proto_tree_add_text(sub_tree_query,
tvb,
offset + query_offset + 16 + mdlen,
query_data_len - 16 - mdlen,
"data: %u bytes",
query_data_len - 16 - mdlen);
/* If there are more then 8 bytes theres at least x*8+8 bytes */
if ((query_data_len - 16 - mdlen) >= 16) {
sub_tree_data = proto_item_add_subtree(item_data, ett_afp_spotlight_data);
query_data64 = spotlight_ntoh64(tvb, offset + query_offset + 16 + mdlen);
/* If there are more then 8 bytes theres at least x*8+8 bytes */
if ((query_data_len - 16 - mdlen) >= 16) {
sub_tree_data = proto_item_add_subtree(item_data, ett_afp_spotlight_data);
query_data64 = spotlight_ntoh64(tvb, offset + query_offset + 16 + mdlen);
proto_tree_add_text(sub_tree_data,
tvb,
offset + query_offset + 16 + mdlen,
8,
"data: %" G_GINT64_MODIFIER "u * 8 (= %" G_GINT64_MODIFIER "u) bytes, ?: 0x%04" G_GINT64_MODIFIER "x",
(query_data64 & G_GINT64_CONSTANT(0xffffffff00000000)) >> 32,
((query_data64 & G_GINT64_CONSTANT(0xffffffff00000000)) >> 32) * 8,
query_data64 & 0xffffffff);
proto_tree_add_text(sub_tree_data,
tvb,
offset + query_offset + 16 + mdlen + 8,
query_data_len - 16 - mdlen - 8,
"data: %u bytes",
query_data_len - 16 - mdlen - 8);
}
proto_tree_add_text(sub_tree_data,
tvb,
offset + query_offset + 16 + mdlen,
8,
"data: %" G_GINT64_MODIFIER "u * 8 (= %" G_GINT64_MODIFIER "u) bytes, ?: 0x%04" G_GINT64_MODIFIER "x",
(query_data64 & G_GINT64_CONSTANT(0xffffffff00000000)) >> 32,
((query_data64 & G_GINT64_CONSTANT(0xffffffff00000000)) >> 32) * 8,
query_data64 & 0xffffffff);
proto_tree_add_text(sub_tree_data,
tvb,
offset + query_offset + 16 + mdlen + 8,
query_data_len - 16 - mdlen - 8,
"data: %u bytes",
query_data_len - 16 - mdlen - 8);
}
}
}
offset += toc_offset;
}
}
offset += toc_offset;
/* ToC */
item_toc = proto_tree_add_text(tree,
tvb,
offset,
querylen - toc_offset,
"ToC (%u entries)",
num_queries);
sub_tree_toc = proto_item_add_subtree(item_toc, ett_afp_spotlight_toc);
proto_tree_add_text(sub_tree_toc,
tvb,
offset,
8,
"Number of entries (%u)",
num_queries);
for (i = 0; i < num_queries; i++) {
toc_entry = spotlight_ntoh64(tvb, offset + 8 + i*8);
proto_tree_add_text(sub_tree_toc,
tvb,
offset + 8 + i*8,
8,
"Index: %u, ?(reappears in queries): 0x%08" G_GINT64_MODIFIER "x, ?: 0x%04" G_GINT64_MODIFIER "x, Offset: %" G_GINT64_MODIFIER "u",
i+1,
toc_entry >> 32,
(toc_entry & 0xffff0000) >> 16,
(toc_entry & 0xffff) * 8);
}
/* ToC */
item_toc = proto_tree_add_text(tree,
tvb,
offset,
querylen - toc_offset,
"ToC (%u entries)",
num_queries);
sub_tree_toc = proto_item_add_subtree(item_toc, ett_afp_spotlight_toc);
proto_tree_add_text(sub_tree_toc,
tvb,
offset,
8,
"Number of entries (%u)",
num_queries);
for (i = 0; i < num_queries; i++) {
toc_entry = spotlight_ntoh64(tvb, offset + 8 + i*8);
proto_tree_add_text(sub_tree_toc,
tvb,
offset + 8 + i*8,
8,
"Index: %u, ?(reappears in queries): 0x%08" G_GINT64_MODIFIER "x, ?: 0x%04" G_GINT64_MODIFIER "x, Offset: %" G_GINT64_MODIFIER "u",
i+1,
toc_entry >> 32,
(toc_entry & 0xffff0000) >> 16,
(toc_entry & 0xffff) * 8);
}
offset += querylen - toc_offset;
return offset;
offset += querylen - toc_offset;
return offset;
}
static gint
dissect_query_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset, afp_request_val *request_val)
{
gint len;
gint len;
PAD(1);
offset = decode_vol(tree, tvb, offset);
PAD(1);
offset = decode_vol(tree, tvb, offset);
proto_tree_add_item(tree, hf_afp_spotlight_request_flags, tvb, offset, 4, FALSE);
offset += 4;
@ -4159,30 +4165,30 @@ dissect_query_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
proto_tree_add_item(tree, hf_afp_spotlight_request_reserved, tvb, offset, 4, FALSE);
offset += 4;
switch (request_val->spotlight_req_command) {
switch (request_val->spotlight_req_command) {
case SPOTLIGHT_CMD_GET_VOLPATH:
tvb_get_ephemeral_stringz(tvb, offset, &len);
proto_tree_add_item(tree, hf_afp_spotlight_volpath_client, tvb, offset, len, FALSE);
offset += len;
break;
case SPOTLIGHT_CMD_GET_VOLPATH:
tvb_get_ephemeral_stringz(tvb, offset, &len);
proto_tree_add_item(tree, hf_afp_spotlight_volpath_client, tvb, offset, len, FALSE);
offset += len;
break;
case SPOTLIGHT_CMD_GET_VOLID:
/* empty */
break;
case SPOTLIGHT_CMD_GET_VOLID:
/* empty */
break;
case SPOTLIGHT_CMD_GET_THREE:
proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4,FALSE);
offset += 4;
case SPOTLIGHT_CMD_GET_THREE:
proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4,FALSE);
offset += 4;
proto_tree_add_item(tree, hf_afp_spotlight_reqlen, tvb, offset, 4,FALSE);
offset += 4;
proto_tree_add_item(tree, hf_afp_spotlight_reqlen, tvb, offset, 4,FALSE);
offset += 4;
offset = dissect_spotlight(tvb, tree, offset);
offset = dissect_spotlight(tvb, tree, offset);
break;
}
return offset;
break;
}
return offset;
}
/* ************************** */
@ -4361,32 +4367,32 @@ dissect_reply_afp_get_acl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
static gint
dissect_reply_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset, afp_request_val *request_val)
{
gint len;
gint len;
switch (request_val->spotlight_req_command) {
switch (request_val->spotlight_req_command) {
case SPOTLIGHT_CMD_GET_VOLPATH:
proto_tree_add_item(tree, hf_afp_spotlight_returncode, tvb, offset, 4,FALSE);
offset += 4;
case SPOTLIGHT_CMD_GET_VOLPATH:
proto_tree_add_item(tree, hf_afp_spotlight_returncode, tvb, offset, 4,FALSE);
offset += 4;
tvb_get_ephemeral_stringz(tvb, offset, &len);;
tvb_get_ephemeral_stringz(tvb, offset, &len);;
proto_tree_add_item(tree, hf_afp_spotlight_volpath_server, tvb, offset, len, FALSE);
offset += len;
break;
offset += len;
break;
case SPOTLIGHT_CMD_GET_VOLID:
proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4,FALSE);
offset += 4;
break;
case SPOTLIGHT_CMD_GET_VOLID:
proto_tree_add_item(tree, hf_afp_spotlight_volflags, tvb, offset, 4,FALSE);
offset += 4;
break;
case SPOTLIGHT_CMD_GET_THREE:
proto_tree_add_item(tree, hf_afp_spotlight_returncode, tvb, offset, 4,FALSE);
offset += 4;
case SPOTLIGHT_CMD_GET_THREE:
proto_tree_add_item(tree, hf_afp_spotlight_returncode, tvb, offset, 4,FALSE);
offset += 4;
offset = dissect_spotlight(tvb, tree, offset);
break;
}
return offset;
offset = dissect_spotlight(tvb, tree, offset);
break;
}
return offset;
}
@ -4425,10 +4431,10 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
request_val = se_alloc(sizeof(afp_request_val));
request_val->command = afp_command;
if (afp_command == AFP_SPOTLIGHTRPC)
request_val->spotlight_req_command = tvb_get_ntohl(tvb, offset + 2 + 2 + 4);
else
request_val->spotlight_req_command = -1;
if (afp_command == AFP_SPOTLIGHTRPC)
request_val->spotlight_req_command = tvb_get_ntohl(tvb, offset + 2 + 2 + 4);
else
request_val->spotlight_req_command = -1;
request_val->frame_req = pinfo->fd->num;
request_val->frame_res = 0;
@ -4445,12 +4451,12 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
afp_command = request_val->command;
col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
val_to_str(afp_command, CommandCode_vals,
val_to_str_ext(afp_command, &CommandCode_vals_ext,
"Unknown command (%u)"),
aspinfo->reply ? "reply" : "request");
if (aspinfo->reply && aspinfo->code != 0) {
col_append_fstr(pinfo->cinfo, COL_INFO, ": %s (%d)",
val_to_str(aspinfo->code, asp_error_vals,
val_to_str_ext(aspinfo->code, &asp_error_vals_ext,
"Unknown error (%u)"), aspinfo->code);
}
@ -4624,7 +4630,7 @@ dissect_afp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset = dissect_query_afp_with_did(tvb, pinfo, afp_tree, offset);break;
case AFP_SPOTLIGHTRPC:
offset = dissect_query_afp_spotlight(tvb, pinfo, afp_tree, offset, request_val);
break;
break;
}
}
else {
@ -4750,7 +4756,7 @@ proto_register_afp(void)
static hf_register_info hf[] = {
{ &hf_afp_command,
{ "Command", "afp.command",
FT_UINT8, BASE_DEC, VALS(CommandCode_vals), 0x0,
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &CommandCode_vals_ext, 0x0,
"AFP function", HFILL }},
{ &hf_afp_pad,
@ -5580,7 +5586,7 @@ proto_register_afp(void)
{ &hf_afp_path_unicode_hint,
{ "Unicode hint", "afp.path_unicode_hint",
FT_UINT32, BASE_HEX, VALS(unicode_hint_vals), 0x0,
FT_UINT32, BASE_HEX|BASE_EXT_STRING, &unicode_hint_vals_ext, 0x0,
NULL, HFILL }},
{ &hf_afp_path_name,
@ -5790,12 +5796,12 @@ proto_register_afp(void)
{ &hf_afp_map_name_type,
{ "Type", "afp.map_name_type",
FT_UINT8, BASE_DEC, VALS(map_name_type_vals), 0x0,
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &map_name_type_vals_ext, 0x0,
"Map name type", HFILL }},
{ &hf_afp_map_id_type,
{ "Type", "afp.map_id_type",
FT_UINT8, BASE_DEC, VALS(map_id_type_vals), 0x0,
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &map_id_type_vals_ext, 0x0,
"Map ID type", HFILL }},
{ &hf_afp_map_id,
@ -5851,7 +5857,7 @@ proto_register_afp(void)
{ &hf_afp_session_token_type,
{ "Type", "afp.session_token_type",
FT_UINT16, BASE_HEX, VALS(token_type_vals), 0x0,
FT_UINT16, BASE_HEX|BASE_EXT_STRING, &token_type_vals_ext, 0x0,
"Session token type", HFILL }},
/* FIXME FT_UINT32 in specs */
@ -6196,55 +6202,55 @@ proto_register_afp(void)
FT_BOOLEAN, 32, NULL, ACE_ONLY_INHERIT,
NULL, HFILL }},
{ &hf_afp_spotlight_request_flags,
{ "Flags", "afp.spotlight.flags",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Spotlight RPC Flags", HFILL }},
{ &hf_afp_spotlight_request_flags,
{ "Flags", "afp.spotlight.flags",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Spotlight RPC Flags", HFILL }},
{ &hf_afp_spotlight_request_command,
{ "Command", "afp.spotlight.command",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Spotlight RPC Command", HFILL }},
{ &hf_afp_spotlight_request_command,
{ "Command", "afp.spotlight.command",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Spotlight RPC Command", HFILL }},
{ &hf_afp_spotlight_request_reserved,
{ "Padding", "afp.spotlight.reserved",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Spotlight RPC Padding", HFILL }},
{ &hf_afp_spotlight_request_reserved,
{ "Padding", "afp.spotlight.reserved",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Spotlight RPC Padding", HFILL }},
{ &hf_afp_spotlight_volpath_client,
{ "Client's volume path", "afp.spotlight.volpath_client",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_volpath_client,
{ "Client's volume path", "afp.spotlight.volpath_client",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_volpath_server,
{ "Server's volume path", "afp.spotlight.volpath_server",
FT_STRING, BASE_NONE, NULL, 0x0,
"Servers's volume path", HFILL }},
{ &hf_afp_spotlight_volpath_server,
{ "Server's volume path", "afp.spotlight.volpath_server",
FT_STRING, BASE_NONE, NULL, 0x0,
"Servers's volume path", HFILL }},
{ &hf_afp_spotlight_returncode,
{ "Return code", "afp.spotlight.return",
FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_returncode,
{ "Return code", "afp.spotlight.return",
FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_volflags,
{ "Volume flags", "afp.spotlight.volflags",
FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_volflags,
{ "Volume flags", "afp.spotlight.volflags",
FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_reqlen,
{ "Length", "afp.spotlight.reqlen",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_reqlen,
{ "Length", "afp.spotlight.reqlen",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_toc_query_end,
{ "End marker", "afp.spotlight.query_end",
FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_toc_query_end,
{ "End marker", "afp.spotlight.query_end",
FT_UINT32, BASE_HEX, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_mdstring,
{ "mdquery string", "afp.spotlight.mds",
FT_STRINGZ, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_spotlight_mdstring,
{ "mdquery string", "afp.spotlight.mds",
FT_STRINGZ, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_afp_unknown,
{ "Unknown parameter", "afp.unknown",
@ -6283,11 +6289,11 @@ proto_register_afp(void)
&ett_afp_ace_entries,
&ett_afp_ace_entry,
&ett_afp_ace_flags,
&ett_afp_spotlight_queries,
&ett_afp_spotlight_query_line,
&ett_afp_spotlight_query,
&ett_afp_spotlight_data,
&ett_afp_spotlight_toc
&ett_afp_spotlight_queries,
&ett_afp_spotlight_query_line,
&ett_afp_spotlight_query,
&ett_afp_spotlight_data,
&ett_afp_spotlight_toc
};
proto_afp = proto_register_protocol("Apple Filing Protocol", "AFP", "afp");

View File

@ -77,8 +77,8 @@
#define AFPERR_USRLOGIN (-5047) /* user already logged on */
/* also disk quota exceeded? */
extern const value_string asp_error_vals[];
extern const value_string afp_server_addr_type_vals[];
extern value_string_ext asp_error_vals_ext;
extern value_string_ext afp_server_addr_type_vals_ext;
/* server flags */
#define AFPSRVRINFO_COPY (1<<0) /* supports copyfile */
@ -91,8 +91,8 @@ extern const value_string afp_server_addr_type_vals[];
#define AFPSRVRINFO_SRVRECONNECT (1<<7) /* supports reconnect */
#define AFPSRVRINFO_SRVDIRECTORY (1<<8) /* supports directory services */
#define AFPSRVRINFO_SRVUTF8 (1<<9) /* supports UTF8 names AFP 3.1 */
#define AFPSRVRINFO_UUID (1<<10) /* supports UUIDs AFP 3.2 */
#define AFPSRVRINFO_EXT_SLEEP (1<<11) /* supports extended sleep, AFP 3.3 */
#define AFPSRVRINFO_UUID (1<<10) /* supports UUIDs AFP 3.2 */
#define AFPSRVRINFO_EXT_SLEEP (1<<11) /* supports extended sleep, AFP 3.3 */
#define AFPSRVRINFO_FASTBOZO (1<<15) /* fast copying */
@ -125,7 +125,7 @@ struct aspinfo {
/*
* value_string table for AFP command codes.
*/
WS_VAR_IMPORT const value_string CommandCode_vals[];
WS_VAR_IMPORT value_string_ext CommandCode_vals_ext;
/*
* Value from table matching requests and responses; also passed to AFP

View File

@ -172,6 +172,7 @@ static const value_string zip_function_vals[] = {
{8, "Extended reply"},
{0, NULL}
};
static value_string_ext zip_function_vals_ext = VALUE_STRING_EXT_INIT(zip_function_vals);
static const value_string zip_atp_function_vals[] = {
{7, "GetMyZone"},
@ -392,6 +393,7 @@ static const value_string pap_function_vals[] = {
{0, NULL}
};
static value_string_ext pap_function_vals_ext = VALUE_STRING_EXT_INIT(pap_function_vals);
/* -------------------------------- */
@ -423,15 +425,16 @@ typedef struct _e_ddp {
static const value_string op_vals[] = {
{DDP_RTMPDATA, "AppleTalk Routing Table response or data" },
{DDP_NBP, "AppleTalk Name Binding Protocol packet"},
{DDP_ATP, "AppleTalk Transaction Protocol packet"},
{DDP_AEP, "AppleTalk Echo Protocol packet"},
{DDP_RTMPREQ, "AppleTalk Routing Table request"},
{DDP_ZIP, "AppleTalk Zone Information Protocol packet"},
{DDP_ADSP, "AppleTalk Data Stream Protocol"},
{DDP_EIGRP, "Cisco EIGRP for AppleTalk"},
{DDP_NBP, "AppleTalk Name Binding Protocol packet"},
{DDP_ATP, "AppleTalk Transaction Protocol packet"},
{DDP_AEP, "AppleTalk Echo Protocol packet"},
{DDP_RTMPREQ, "AppleTalk Routing Table request"},
{DDP_ZIP, "AppleTalk Zone Information Protocol packet"},
{DDP_ADSP, "AppleTalk Data Stream Protocol"},
{DDP_EIGRP, "Cisco EIGRP for AppleTalk"},
{0, NULL}
};
static value_string_ext op_vals_ext = VALUE_STRING_EXT_INIT(op_vals);
static const value_string rtmp_function_vals[] = {
{1, "Request"},
@ -481,60 +484,63 @@ static const value_string asp_func_vals[] = {
{ASPFUNC_WRTCONT, "Write Cont" },
{ASPFUNC_ATTN, "Attention" },
{0, NULL } };
static value_string_ext asp_func_vals_ext = VALUE_STRING_EXT_INIT(asp_func_vals);
const value_string asp_error_vals[] = {
/* XXX: Array sorted in ascending order (unsigned) to allow value_string_ext binary search */
static const value_string asp_error_vals[] = {
{AFP_OK , "success"},
{ASPERR_NOSESS , "no more sessions available"},
{ASPERR_SESSCLOS , "session closed (ASP)" },
{AFPERR_ACCESS , "permission denied" },
{AFPERR_AUTHCONT , "logincont" },
{AFPERR_BADUAM , "uam doesn't exist" },
{AFPERR_BADVERS , "bad afp version number" },
{AFPERR_BITMAP , "invalid bitmap" },
{AFPERR_CANTMOVE , "can't move file" },
{AFPERR_DENYCONF , "file synchronization locks conflict" },
{AFPERR_DIRNEMPT , "directory not empty" },
{AFPERR_DFULL , "disk full" },
{AFPERR_EOF , "end of file" },
{AFPERR_BUSY , "FileBusy" },
{AFPERR_FLATVOL , "volume doesn't support directories" },
{AFPERR_NOITEM , "ItemNotFound" },
{AFPERR_LOCK , "LockErr" },
{AFPERR_MISC , "misc. err" },
{AFPERR_NLOCK , "no more locks" },
{AFPERR_NOSRVR , "no response by server at that address" },
{AFPERR_EXIST , "object already exists" },
{AFPERR_NOOBJ , "object not found" },
{AFPERR_PARAM , "parameter error" },
{AFPERR_NORANGE , "no range lock" },
{AFPERR_RANGEOVR , "range overlap" },
{AFPERR_SESSCLOS , "session closed" },
{AFPERR_NOTAUTH , "user not authenticated" },
{AFPERR_NOOP , "command not supported" },
{AFPERR_BADTYPE , "object is the wrong type" },
{AFPERR_NFILE , "too many files open" },
{AFPERR_SHUTDOWN , "server is going down" },
{AFPERR_NORENAME , "can't rename" },
{AFPERR_NODIR , "couldn't find directory" },
{AFPERR_ITYPE , "wrong icon type" },
{AFPERR_VLOCK , "volume locked" },
{AFPERR_OLOCK , "object locked" },
{AFPERR_CTNSHRD , "share point contains a share point" },
{AFPERR_NOID , "file thread not found" },
{AFPERR_EXISTID , "file already has an id" },
{AFPERR_DIFFVOL , "different volume" },
{AFPERR_CATCHNG , "catalog has changed" },
{AFPERR_SAMEOBJ , "source file == destination file" },
{AFPERR_BADID , "non-existent file id" },
{AFPERR_PWDSAME , "same password/can't change password" },
{AFPERR_PWDSHORT , "password too short" },
{AFPERR_PWDEXPR , "password expired" },
{AFPERR_INSHRD , "folder being shared is inside a shared folder." },
{AFPERR_INTRASH , "shared folder in trash." },
{AFPERR_PWDCHNG , "password needs to be changed" },
{AFPERR_PWDPOLCY , "password fails policy check" },
{AFPERR_USRLOGIN , "user already logged on" },
{AFPERR_PWDPOLCY , "password fails policy check" },
{AFPERR_PWDCHNG , "password needs to be changed" },
{AFPERR_INTRASH , "shared folder in trash." },
{AFPERR_INSHRD , "folder being shared is inside a shared folder." },
{AFPERR_PWDEXPR , "password expired" },
{AFPERR_PWDSHORT , "password too short" },
{AFPERR_PWDSAME , "same password/can't change password" },
{AFPERR_BADID , "non-existent file id" },
{AFPERR_SAMEOBJ , "source file == destination file" },
{AFPERR_CATCHNG , "catalog has changed" },
{AFPERR_DIFFVOL , "different volume" },
{AFPERR_EXISTID , "file already has an id" },
{AFPERR_NOID , "file thread not found" },
{AFPERR_CTNSHRD , "share point contains a share point" },
{AFPERR_OLOCK , "object locked" },
{AFPERR_VLOCK , "volume locked" },
{AFPERR_ITYPE , "wrong icon type" },
{AFPERR_NODIR , "couldn't find directory" },
{AFPERR_NORENAME , "can't rename" },
{AFPERR_SHUTDOWN , "server is going down" },
{AFPERR_NFILE , "too many files open" },
{AFPERR_BADTYPE , "object is the wrong type" },
{AFPERR_NOOP , "command not supported" },
{AFPERR_NOTAUTH , "user not authenticated" },
{AFPERR_SESSCLOS , "session closed" },
{AFPERR_RANGEOVR , "range overlap" },
{AFPERR_NORANGE , "no range lock" },
{AFPERR_PARAM , "parameter error" },
{AFPERR_NOOBJ , "object not found" },
{AFPERR_EXIST , "object already exists" },
{AFPERR_NOSRVR , "no response by server at that address" },
{AFPERR_NLOCK , "no more locks" },
{AFPERR_MISC , "misc. err" },
{AFPERR_LOCK , "LockErr" },
{AFPERR_NOITEM , "ItemNotFound" },
{AFPERR_FLATVOL , "volume doesn't support directories" },
{AFPERR_BUSY , "FileBusy" },
{AFPERR_EOF , "end of file" },
{AFPERR_DFULL , "disk full" },
{AFPERR_DIRNEMPT , "directory not empty" },
{AFPERR_DENYCONF , "file synchronization locks conflict" },
{AFPERR_CANTMOVE , "can't move file" },
{AFPERR_BITMAP , "invalid bitmap" },
{AFPERR_BADVERS , "bad afp version number" },
{AFPERR_BADUAM , "uam doesn't exist" },
{AFPERR_AUTHCONT , "logincont" },
{AFPERR_ACCESS , "permission denied" },
{ASPERR_SESSCLOS , "session closed (ASP)" },
{ASPERR_NOSESS , "no more sessions available"},
{0, NULL } };
value_string_ext asp_error_vals_ext = VALUE_STRING_EXT_INIT(asp_error_vals);
/*
* XXX - do this with an FT_UINT_STRING?
@ -1205,7 +1211,7 @@ dissect_pap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (check_col(pinfo->cinfo, COL_INFO)) {
col_add_fstr(pinfo->cinfo, COL_INFO, "%s ID: %d",
val_to_str(fn, pap_function_vals, "Unknown (0x%01x)"), connID);
val_to_str_ext(fn, &pap_function_vals_ext, "Unknown (0x%01x)"), connID);
}
switch(fn) {
case PAPOpenConn:
@ -1333,7 +1339,7 @@ dissect_asp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
col_add_fstr(pinfo->cinfo, COL_INFO, "Reply tid %u",aspinfo->seq);
else
col_add_fstr(pinfo->cinfo, COL_INFO, "Function: %s tid %u",
val_to_str(fn, asp_func_vals, "Unknown (0x%01x)"), aspinfo->seq);
val_to_str_ext(fn, &asp_func_vals_ext, "Unknown (0x%01x)"), aspinfo->seq);
}
if (tree) {
@ -1550,7 +1556,7 @@ dissect_ddp_zip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
fn = tvb_get_guint8(tvb, 0);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_add_str(pinfo->cinfo, COL_INFO,
val_to_str(fn, zip_function_vals, "Unknown ZIP function (%02x)"));
val_to_str_ext(fn, &zip_function_vals_ext, "Unknown ZIP function (%02x)"));
}
if (!tree)
@ -1704,7 +1710,7 @@ dissect_ddp_short(tvbuff_t *tvb, packet_info *pinfo, guint8 dnode,
if (check_col(pinfo->cinfo, COL_INFO)) {
col_add_str(pinfo->cinfo, COL_INFO,
val_to_str(type, op_vals, "Unknown DDP protocol (%02x)"));
val_to_str_ext(type, &op_vals_ext, "Unknown DDP protocol (%02x)"));
}
if (tree) {
hidden_item = proto_tree_add_string(ddp_tree, hf_ddp_src, tvb,
@ -1755,7 +1761,7 @@ dissect_ddp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (check_col(pinfo->cinfo, COL_INFO))
col_add_str(pinfo->cinfo, COL_INFO,
val_to_str(ddp.type, op_vals, "Unknown DDP protocol (%02x)"));
val_to_str_ext(ddp.type, &op_vals_ext, "Unknown DDP protocol (%02x)"));
if (tree) {
ti = proto_tree_add_item(tree, proto_ddp, tvb, 0, DDP_HEADER_SIZE,
@ -1807,6 +1813,7 @@ static const value_string llap_type_vals[] = {
{0x85, "CTS"},
{0, NULL}
};
static value_string_ext llap_type_vals_ext = VALUE_STRING_EXT_INIT(llap_type_vals);
void
capture_llap(packet_counts *ld)
@ -1841,7 +1848,7 @@ dissect_llap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
type = tvb_get_guint8(tvb, 2);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_add_str(pinfo->cinfo, COL_INFO,
val_to_str(type, llap_type_vals, "Unknown LLAP type (%02x)"));
val_to_str_ext(type, &llap_type_vals_ext, "Unknown LLAP type (%02x)"));
}
if (tree)
proto_tree_add_uint(llap_tree, hf_llap_type, tvb, 2, 1, type);
@ -1902,7 +1909,7 @@ proto_register_atalk(void)
NULL, HFILL }},
{ &hf_llap_type,
{ "Type", "llap.type", FT_UINT8, BASE_HEX, VALS(llap_type_vals), 0x0,
{ "Type", "llap.type", FT_UINT8, BASE_HEX|BASE_EXT_STRING, &llap_type_vals_ext, 0x0,
NULL, HFILL }},
};
@ -1952,7 +1959,7 @@ proto_register_atalk(void)
NULL, HFILL }},
{ &hf_ddp_type,
{ "Protocol type", "ddp.type", FT_UINT8, BASE_DEC, VALS(op_vals), 0x0,
{ "Protocol type", "ddp.type", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &op_vals_ext, 0x0,
NULL, HFILL }},
};
@ -2097,12 +2104,12 @@ proto_register_atalk(void)
static hf_register_info hf_asp[] = {
{ &hf_asp_func,
{ "asp function", "asp.function", FT_UINT8, BASE_DEC,
VALS(asp_func_vals), 0, NULL, HFILL }},
{ "asp function", "asp.function", FT_UINT8, BASE_DEC|BASE_EXT_STRING,
&asp_func_vals_ext, 0, NULL, HFILL }},
{ &hf_asp_error,
{ "asp error", "asp.error", FT_INT32, BASE_DEC,
VALS(asp_error_vals), 0, "return error code", HFILL }},
{ "asp error", "asp.error", FT_INT32, BASE_DEC|BASE_EXT_STRING,
&asp_error_vals_ext, 0, "return error code", HFILL }},
{ &hf_asp_version,
{ "Version", "asp.version", FT_UINT16, BASE_HEX,
@ -2229,7 +2236,7 @@ proto_register_atalk(void)
{ &hf_asp_server_addr_type,
{ "Type", "asp.server_addr.type",
FT_UINT8, BASE_DEC, VALS(afp_server_addr_type_vals), 0x0,
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &afp_server_addr_type_vals_ext, 0x0,
"Address type.", HFILL }},
{ &hf_asp_server_addr_value,
@ -2250,7 +2257,7 @@ proto_register_atalk(void)
static hf_register_info hf_zip[] = {
{ &hf_zip_function,
{ "Function", "zip.function", FT_UINT8, BASE_DEC, VALS(zip_function_vals), 0x0,
{ "Function", "zip.function", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &zip_function_vals_ext, 0x0,
"ZIP function", HFILL }},
{ &hf_zip_zero_value,
@ -2326,7 +2333,7 @@ proto_register_atalk(void)
"PAP connection ID", HFILL }},
{ &hf_pap_function,
{ "Function", "pap.function", FT_UINT8, BASE_DEC, VALS(pap_function_vals), 0x0,
{ "Function", "pap.function", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &pap_function_vals_ext, 0x0,
"PAP function", HFILL }},
{ &hf_pap_socket,

View File

@ -32,11 +32,9 @@
# include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <glib.h>
#include <time.h>
#include <epan/packet.h>
#include <epan/prefs.h>
@ -95,9 +93,9 @@
#define DNP3_CTL_DFC 0x10
#define DNP3_CTL_FUNC 0x0f
#define DNP3_TR_FIR 0x40
#define DNP3_TR_FIN 0x80
#define DNP3_TR_SEQ 0x3f
#define DNP3_TR_FIR 0x40
#define DNP3_TR_FIN 0x80
#define DNP3_TR_SEQ 0x3f
#define AL_MAX_CHUNK_SIZE 16
@ -198,18 +196,18 @@
/* Application Layer Data Object Qualifier */
/***************************************************************************/
/* Bit-Masks */
#define AL_OBJQ_INDEX 0x70 /* x111xxxx Masks Index from Qualifier */
#define AL_OBJQ_CODE 0x0F /* xxxx1111 Masks Code from Qualifier */
#define AL_OBJQ_INDEX 0x70 /* x111xxxx Masks Index from Qualifier */
#define AL_OBJQ_CODE 0x0F /* xxxx1111 Masks Code from Qualifier */
/* Index Size (3-bits x111xxxx) */
/* When Qualifier Code != 11 */
#define AL_OBJQL_IDX_NI 0x00 /* Objects are Packed with no index */
#define AL_OBJQL_IDX_1O 0x01 /* Objects are prefixed w/ 1-octet index */
#define AL_OBJQL_IDX_2O 0x02 /* Objects are prefixed w/ 2-octet index */
#define AL_OBJQL_IDX_4O 0x03 /* Objects are prefixed w/ 4-octet index */
#define AL_OBJQL_IDX_1OS 0x04 /* Objects are prefixed w/ 1-octet object size */
#define AL_OBJQL_IDX_2OS 0x05 /* Objects are prefixed w/ 2-octet object size */
#define AL_OBJQL_IDX_4OS 0x06 /* Objects are prefixed w/ 4-octet object size */
#define AL_OBJQL_IDX_NI 0x00 /* Objects are Packed with no index */
#define AL_OBJQL_IDX_1O 0x01 /* Objects are prefixed w/ 1-octet index */
#define AL_OBJQL_IDX_2O 0x02 /* Objects are prefixed w/ 2-octet index */
#define AL_OBJQL_IDX_4O 0x03 /* Objects are prefixed w/ 4-octet index */
#define AL_OBJQL_IDX_1OS 0x04 /* Objects are prefixed w/ 1-octet object size */
#define AL_OBJQL_IDX_2OS 0x05 /* Objects are prefixed w/ 2-octet object size */
#define AL_OBJQL_IDX_4OS 0x06 /* Objects are prefixed w/ 4-octet object size */
/* When Qualifier Code == 11 */
#define AL_OBJQL_IDX11_1OIS 0x01 /* 1 octet identifier size */
@ -677,6 +675,7 @@ static const value_string dnp3_al_func_vals[] = {
{ AL_FUNC_AUTHRESP, "Authentication Response" },
{ 0, NULL }
};
static value_string_ext dnp3_al_func_vals_ext = VALUE_STRING_EXT_INIT(dnp3_al_func_vals);
/* Application Layer Internal Indication (IIN) bit Values */
static const value_string dnp3_al_iin_vals[] _U_ = {
@ -707,6 +706,7 @@ static const value_string dnp3_al_objq_index_vals[] = {
{ AL_OBJQL_IDX_4OS, "4-Octet Object Size" },
{ 0, NULL }
};
static value_string_ext dnp3_al_objq_index_vals_ext = VALUE_STRING_EXT_INIT(dnp3_al_objq_index_vals);
/* Application Layer Object Qualifier Code Values */
static const value_string dnp3_al_objq_code_vals[] = {
@ -723,6 +723,7 @@ static const value_string dnp3_al_objq_code_vals[] = {
{ AL_OBJQL_CODE_FF, "Free-format Qualifier" },
{ 0, NULL }
};
static value_string_ext dnp3_al_objq_code_vals_ext = VALUE_STRING_EXT_INIT(dnp3_al_objq_code_vals);
/* Application Layer Data Object Values */
static const value_string dnp3_al_obj_vals[] = {
@ -828,6 +829,7 @@ static const value_string dnp3_al_obj_vals[] = {
{ AL_OBJ_OCT, "Octet String (Obj:110)" },
{ 0, NULL }
};
static value_string_ext dnp3_al_obj_vals_ext = VALUE_STRING_EXT_INIT(dnp3_al_obj_vals);
/* Application Layer Control Code 'Code' Values */
static const value_string dnp3_al_ctlc_code_vals[] = {
@ -869,6 +871,7 @@ static const value_string dnp3_al_ctl_status_vals[] = {
{ AL_OBJCTL_STAT10, "Req. Not Accepted; Local automation proc active" },
{ 0, NULL }
};
static value_string_ext dnp3_al_ctl_status_vals_ext = VALUE_STRING_EXT_INIT(dnp3_al_ctl_status_vals);
/* Application Layer Binary Input Quality Flag Values */
static const value_string dnp3_al_biflag_vals[] _U_ = {
@ -1326,7 +1329,9 @@ dnp3_al_process_object(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree
/* Create Data Objects Detail Tree */
object_item = proto_tree_add_uint_format(robj_tree, hf_dnp3_al_obj, tvb, offset, 2, al_obj,
"Object(s): %s (0x%04x)", val_to_str(al_obj, dnp3_al_obj_vals, "Unknown Object - Abort Decoding..."), al_obj);
"Object(s): %s (0x%04x)",
val_to_str_ext_const(al_obj, &dnp3_al_obj_vals_ext, "Unknown Object - Abort Decoding..."),
al_obj);
object_tree = proto_item_add_subtree(object_item, ett_dnp3_al_obj);
offset += 2;
@ -1338,8 +1343,8 @@ dnp3_al_process_object(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree
al_objq_code = al_objq & AL_OBJQ_CODE;
qualifier_item = proto_tree_add_text(object_tree, tvb, offset, 1, "Qualifier Field, Prefix: %s, Code: %s",
val_to_str(al_objq_index, dnp3_al_objq_index_vals, "Unknown Index Type"),
val_to_str(al_objq_code, dnp3_al_objq_code_vals, "Unknown Code Type"));
val_to_str_ext_const(al_objq_index, &dnp3_al_objq_index_vals_ext, "Unknown Index Type"),
val_to_str_ext_const(al_objq_code, &dnp3_al_objq_code_vals_ext, "Unknown Code Type"));
qualifier_tree = proto_item_add_subtree(qualifier_item, ett_dnp3_al_obj_qualifier);
proto_tree_add_item(qualifier_tree, hf_dnp3_al_objq_index, tvb, offset, 1, FALSE);
proto_tree_add_item(qualifier_tree, hf_dnp3_al_objq_code, tvb, offset, 1, FALSE);
@ -1628,11 +1633,11 @@ dnp3_al_process_object(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree
/* Bit-Mask xx11xxxx for Control Code Misc Values */
al_ctlobj_code_m = al_ctlobj_code & AL_OBJCTLC_MISC;
ctl_misc_str = val_to_str(al_ctlobj_code_m, dnp3_al_ctlc_misc_vals, "");
ctl_misc_str = val_to_str_const(al_ctlobj_code_m, dnp3_al_ctlc_misc_vals, "");
/* Bit-Mask 11xxxxxx for Control Code 'Trip/Close' */
al_ctlobj_code_tc = al_ctlobj_code & AL_OBJCTLC_TC;
ctl_tc_str = val_to_str(al_ctlobj_code_tc, dnp3_al_ctlc_tc_vals, "");
ctl_tc_str = val_to_str_const(al_ctlobj_code_tc, dnp3_al_ctlc_tc_vals, "");
/* Get "Count" Field */
al_ctlobj_count = tvb_get_guint8(tvb, data_pos);
@ -1648,7 +1653,7 @@ dnp3_al_process_object(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree
al_ctlobj_stat = tvb_get_guint8(tvb, data_pos);
proto_tree_add_item(point_item, hf_dnp3_al_ctrlstatus, tvb, data_pos, 1, TRUE);
ctl_status_str = val_to_str(al_ctlobj_stat, dnp3_al_ctl_status_vals, "Invalid Status (0x%02x)");
ctl_status_str = val_to_str_ext(al_ctlobj_stat, &dnp3_al_ctl_status_vals_ext, "Invalid Status (0x%02x)");
data_pos += 1;
proto_item_append_text(point_item, ", Control Code: [%s,%s,%s (0x%02x)]",
@ -1698,7 +1703,7 @@ dnp3_al_process_object(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree
/* Get control status */
al_ctlobj_stat = tvb_get_guint8(tvb, data_pos);
ctl_status_str = val_to_str(al_ctlobj_stat, dnp3_al_ctl_status_vals, "Invalid Status (0x%02x)");
ctl_status_str = val_to_str_ext(al_ctlobj_stat, &dnp3_al_ctl_status_vals_ext, "Invalid Status (0x%02x)");
proto_item_append_text(point_item, " [Status: %s (0x%02x)]", ctl_status_str, al_ctlobj_stat);
proto_tree_add_item(point_tree, hf_dnp3_al_ctrlstatus, tvb, data_pos, 1, TRUE);
data_pos += 1;
@ -2103,7 +2108,7 @@ dissect_dnp3_al(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
al_con = al_ctl & DNP3_AL_CON;
al_uns = al_ctl & DNP3_AL_UNS;
al_func = tvb_get_guint8(tvb, (offset+1));
func_code_str = val_to_str(al_func, dnp3_al_func_vals, "Unknown function (0x%02x)");
func_code_str = val_to_str_ext(al_func, &dnp3_al_func_vals_ext, "Unknown function (0x%02x)");
if (check_col(pinfo->cinfo, COL_INFO))
col_append_sep_fstr(pinfo->cinfo, COL_INFO, NULL, "%s", func_code_str);
@ -2733,8 +2738,8 @@ proto_register_dnp3(void)
{ "Sequence", "dnp3.al.seq", FT_UINT8, BASE_DEC, NULL, DNP3_AL_SEQ, "Frame Sequence Number", HFILL }},
{ &hf_dnp3_al_func,
{ "Application Layer Function Code", "dnp3.al.func", FT_UINT8, BASE_DEC,
VALS(dnp3_al_func_vals), DNP3_AL_FUNC, "Application Function Code", HFILL }},
{ "Application Layer Function Code", "dnp3.al.func", FT_UINT8, BASE_DEC|BASE_EXT_STRING,
&dnp3_al_func_vals_ext, DNP3_AL_FUNC, "Application Function Code", HFILL }},
{ &hf_dnp3_al_iin,
{ "Application Layer IIN bits", "dnp3.al.iin", FT_UINT16, BASE_DEC, NULL, 0x0, "Application Layer IIN", HFILL }},
@ -2779,13 +2784,13 @@ proto_register_dnp3(void)
{ "Configuration Corrupt", "dnp3.al.iin.cc", FT_BOOLEAN, 16, TFS(&tfs_set_notset), AL_IIN_CC, NULL, HFILL }},
{ &hf_dnp3_al_obj,
{ "Object", "dnp3.al.obj", FT_UINT16, BASE_HEX, VALS(dnp3_al_obj_vals), 0x0, "Application Layer Object", HFILL }},
{ "Object", "dnp3.al.obj", FT_UINT16, BASE_HEX|BASE_EXT_STRING, &dnp3_al_obj_vals_ext, 0x0, "Application Layer Object", HFILL }},
{ &hf_dnp3_al_objq_index,
{ "Index Prefix", "dnp3.al.objq.index", FT_UINT8, BASE_DEC, VALS(dnp3_al_objq_index_vals), AL_OBJQ_INDEX, "Object Index Prefixing", HFILL }},
{ "Index Prefix", "dnp3.al.objq.index", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &dnp3_al_objq_index_vals_ext, AL_OBJQ_INDEX, "Object Index Prefixing", HFILL }},
{ &hf_dnp3_al_objq_code,
{ "Qualifier Code", "dnp3.al.objq.code", FT_UINT8, BASE_DEC, VALS(dnp3_al_objq_code_vals), AL_OBJQ_CODE, "Object Qualifier Code", HFILL }},
{ "Qualifier Code", "dnp3.al.objq.code", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &dnp3_al_objq_code_vals_ext, AL_OBJQ_CODE, "Object Qualifier Code", HFILL }},
{ &hf_dnp3_al_range_start8,
{ "Start (8 bit)", "dnp3.al.range.start", FT_UINT8, BASE_DEC, NULL, 0x0, "Object Start Index", HFILL }},
@ -2872,7 +2877,7 @@ proto_register_dnp3(void)
{ "Counter (32 bit)", "dnp3.al.cnt", FT_UINT32, BASE_DEC, NULL, 0x0, "Counter Value (32 bit)", HFILL }},
{ &hf_dnp3_al_ctrlstatus,
{ "Control Status", "dnp3.al.ctrlstatus", FT_UINT8, BASE_DEC, dnp3_al_ctl_status_vals, 0xff, NULL, HFILL }},
{ "Control Status", "dnp3.al.ctrlstatus", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &dnp3_al_ctl_status_vals_ext, 0xff, NULL, HFILL }},
{ &hf_dnp3_al_biq_b0,
{ "Online", "dnp3.al.biq.b0", FT_BOOLEAN, 8, TFS(&tfs_set_notset), AL_OBJ_BI_FLAG0, NULL, HFILL }},
@ -3075,10 +3080,6 @@ proto_register_dnp3(void)
}
/* If this dissector uses sub-dissector registration add a registration routine.
This format is required because a script is used to find these routines and
create the code that calls these routines.
*/
void
proto_reg_handoff_dnp3(void)
{

View File

@ -48,8 +48,8 @@ http://developer.apple.com/DOCUMENTATION/macos8/pdf/ASAppleTalkFiling2.1_2.2.pdf
http://developer.apple.com/documentation/Networking/Conceptual/AFPClient/AFPClient-6.html
(no longer available, apparently)
Also, AFP 3.3 documents parts of DSI at:
Also, AFP 3.3 documents parts of DSI at:
http://developer.apple.com/mac/library/documentation/Networking/Conceptual/AFP/Introduction/Introduction.html
* What a Data Stream Interface packet looks like:
@ -64,7 +64,7 @@ http://developer.apple.com/DOCUMENTATION/macos8/pdf/ASAppleTalkFiling2.1_2.2.pdf
* |reserved field |
* |-------------------------------|
*/
#define INET6_ADDRLEN 16
#define INET6_ADDRLEN 16
static int proto_dsi = -1;
static int hf_dsi_flags = -1;
@ -77,41 +77,42 @@ static int hf_dsi_reserved = -1;
static gint ett_dsi = -1;
static int hf_dsi_open_type = -1;
static int hf_dsi_open_len = -1;
static int hf_dsi_open_quantum = -1;
static int hf_dsi_open_type = -1;
static int hf_dsi_open_len = -1;
static int hf_dsi_open_quantum = -1;
static int hf_dsi_replay_cache_size = -1;
static int hf_dsi_open_option = -1;
static int hf_dsi_open_option = -1;
static int hf_dsi_attn_flag = -1;
static int hf_dsi_attn_flag_shutdown = -1;
static int hf_dsi_attn_flag_crash = -1;
static int hf_dsi_attn_flag_msg = -1;
static int hf_dsi_attn_flag_reconnect = -1;
static int hf_dsi_attn_flag_time = -1;
static int hf_dsi_attn_flag_bitmap = -1;
static int hf_dsi_attn_flag = -1;
static int hf_dsi_attn_flag_shutdown = -1;
static int hf_dsi_attn_flag_crash = -1;
static int hf_dsi_attn_flag_msg = -1;
static int hf_dsi_attn_flag_reconnect = -1;
static int hf_dsi_attn_flag_time = -1;
static int hf_dsi_attn_flag_bitmap = -1;
static gint ett_dsi_open = -1;
static gint ett_dsi_attn = -1;
static gint ett_dsi_attn_flag = -1;
static gint ett_dsi_open = -1;
static gint ett_dsi_attn = -1;
static gint ett_dsi_attn_flag = -1;
static const value_string dsi_attn_flag_vals[] = {
{0x0, "Reserved" }, /* 0000 */
{0x1, "Reserved" }, /* 0001 */
{0x2, "Server message" }, /* 0010 */
{0x3, "Server notification, cf. extended bitmap" }, /* 0011 */
{0x4, "Server is shutting down, internal error" }, /* 0100 */
{0x8, "Server is shutting down" }, /* 1000 */
{0x9, "Server disconnects user" }, /* 1001 */
{0x10,"Server is shutting down, message" }, /* 1010 */
{0x11,"Server is shutting down, message,no reconnect"}, /* 1011 */
{0, NULL } };
{0x0, "Reserved" }, /* 0000 */
{0x1, "Reserved" }, /* 0001 */
{0x2, "Server message" }, /* 0010 */
{0x3, "Server notification, cf. extended bitmap" }, /* 0011 */
{0x4, "Server is shutting down, internal error" }, /* 0100 */
{0x8, "Server is shutting down" }, /* 1000 */
{0x9, "Server disconnects user" }, /* 1001 */
{0x10,"Server is shutting down, message" }, /* 1010 */
{0x11,"Server is shutting down, message,no reconnect"}, /* 1011 */
{0, NULL } };
static value_string_ext dsi_attn_flag_vals_ext = VALUE_STRING_EXT_INIT(dsi_attn_flag_vals);
static const value_string dsi_open_type_vals[] = {
{0, "Server quantum" },
{1, "Attention quantum" },
{2, "Replay cache size" },
{0, NULL } };
{0, "Server quantum" },
{1, "Attention quantum" },
{2, "Replay cache size" },
{0, NULL } };
/* status stuff same for asp and afp */
static int hf_dsi_server_name = -1;
@ -127,21 +128,21 @@ static int hf_dsi_server_flag = -1;
static int hf_dsi_server_flag_copyfile = -1;
static int hf_dsi_server_flag_passwd = -1;
static int hf_dsi_server_flag_no_save_passwd = -1;
static int hf_dsi_server_flag_srv_msg = -1;
static int hf_dsi_server_flag_srv_sig = -1;
static int hf_dsi_server_flag_tcpip = -1;
static int hf_dsi_server_flag_notify = -1;
static int hf_dsi_server_flag_reconnect = -1;
static int hf_dsi_server_flag_directory = -1;
static int hf_dsi_server_flag_srv_msg = -1;
static int hf_dsi_server_flag_srv_sig = -1;
static int hf_dsi_server_flag_tcpip = -1;
static int hf_dsi_server_flag_notify = -1;
static int hf_dsi_server_flag_reconnect = -1;
static int hf_dsi_server_flag_directory = -1;
static int hf_dsi_server_flag_utf8_name = -1;
static int hf_dsi_server_flag_uuid = -1;
static int hf_dsi_server_flag_ext_sleep = -1;
static int hf_dsi_server_flag_fast_copy = -1;
static int hf_dsi_server_signature = -1;
static int hf_dsi_server_signature = -1;
static int hf_dsi_server_addr_len = -1;
static int hf_dsi_server_addr_type = -1;
static int hf_dsi_server_addr_value = -1;
static int hf_dsi_server_addr_len = -1;
static int hf_dsi_server_addr_type = -1;
static int hf_dsi_server_addr_value = -1;
static gint ett_dsi_status = -1;
static gint ett_dsi_uams = -1;
@ -152,15 +153,16 @@ static gint ett_dsi_directory = -1;
static gint ett_dsi_utf8_name = -1;
static gint ett_dsi_status_server_flag = -1;
const value_string afp_server_addr_type_vals[] = {
{1, "IP address" },
{2, "IP+port address" },
{3, "DDP address" },
{4, "DNS name" },
{5, "IP+port ssh tunnel" },
{6, "IP6 address" },
{7, "IP6+port address" },
{0, NULL } };
static const value_string afp_server_addr_type_vals[] = {
{1, "IP address" },
{2, "IP+port address" },
{3, "DDP address" },
{4, "DNS name" },
{5, "IP+port ssh tunnel" },
{6, "IP6 address" },
{7, "IP6+port address" },
{0, NULL } };
value_string_ext afp_server_addr_type_vals_ext = VALUE_STRING_EXT_INIT(afp_server_addr_type_vals);
/* end status stuff */
@ -170,9 +172,9 @@ static gboolean dsi_desegment = TRUE;
static dissector_handle_t data_handle;
static dissector_handle_t afp_handle;
#define TCP_PORT_DSI 548
#define TCP_PORT_DSI 548
#define DSI_BLOCKSIZ 16
#define DSI_BLOCKSIZ 16
/* DSI flags */
#define DSIFL_REQUEST 0x00
@ -190,33 +192,34 @@ static dissector_handle_t afp_handle;
#define DSIFUNC_MAX 8 /* largest command */
static const value_string flag_vals[] = {
{DSIFL_REQUEST, "Request" },
{DSIFL_REPLY, "Reply" },
{0, NULL } };
{DSIFL_REQUEST, "Request" },
{DSIFL_REPLY, "Reply" },
{0, NULL } };
static const value_string func_vals[] = {
{DSIFUNC_CLOSE, "CloseSession" },
{DSIFUNC_CMD, "Command" },
{DSIFUNC_STAT, "GetStatus" },
{DSIFUNC_OPEN, "OpenSession" },
{DSIFUNC_TICKLE, "Tickle" },
{DSIFUNC_WRITE, "Write" },
{DSIFUNC_ATTN, "Attention" },
{0, NULL } };
{DSIFUNC_CLOSE, "CloseSession" },
{DSIFUNC_CMD, "Command" },
{DSIFUNC_STAT, "GetStatus" },
{DSIFUNC_OPEN, "OpenSession" },
{DSIFUNC_TICKLE, "Tickle" },
{DSIFUNC_WRITE, "Write" },
{DSIFUNC_ATTN, "Attention" },
{0, NULL } };
static value_string_ext func_vals_ext = VALUE_STRING_EXT_INIT(func_vals);
static gint
dissect_dsi_open_session(tvbuff_t *tvb, proto_tree *dsi_tree, gint offset, gint dsi_length)
{
proto_tree *tree;
proto_tree *tree;
proto_item *ti;
guint8 type;
guint8 len;
ti = proto_tree_add_text(dsi_tree, tvb, offset, -1, "Open Session");
tree = proto_item_add_subtree(ti, ett_dsi_open);
while( dsi_length >2 ) {
type = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_dsi_open_type, tvb, offset, 1, FALSE);
offset++;
@ -226,19 +229,19 @@ dissect_dsi_open_session(tvbuff_t *tvb, proto_tree *dsi_tree, gint offset, gint
switch (type) {
case 0:
proto_tree_add_item(tree, hf_dsi_open_quantum, tvb, offset, 4, FALSE);
break;
break;
case 1:
proto_tree_add_item(tree, hf_dsi_open_quantum, tvb, offset, 4, FALSE);
break;
break;
case 2:
proto_tree_add_item(tree, hf_dsi_replay_cache_size, tvb, offset, 4, FALSE);
break;
default:
proto_tree_add_item(tree, hf_dsi_open_option, tvb, offset, len, FALSE);
}
dsi_length -= len + 2;
offset += len;
}
return offset;
@ -247,7 +250,7 @@ dissect_dsi_open_session(tvbuff_t *tvb, proto_tree *dsi_tree, gint offset, gint
static gint
dissect_dsi_attention(tvbuff_t *tvb, proto_tree *dsi_tree, gint offset)
{
proto_tree *tree;
proto_tree *tree;
proto_item *ti;
guint16 flag;
@ -279,7 +282,7 @@ dissect_dsi_attention(tvbuff_t *tvb, proto_tree *dsi_tree, gint offset)
static gint
dissect_dsi_reply_get_status(tvbuff_t *tvb, proto_tree *tree, gint offset)
{
proto_tree *sub_tree;
proto_tree *sub_tree;
proto_item *ti;
guint16 ofs;
@ -399,12 +402,12 @@ dissect_dsi_reply_get_status(tvbuff_t *tvb, proto_tree *tree, gint offset)
}
if (adr_ofs) {
proto_tree *adr_tree;
proto_tree *adr_tree;
unsigned char *tmp;
const guint8 *ip;
const guint8 *ip;
guint16 net;
guint8 node;
guint16 port;
guint16 port;
ofs = adr_ofs;
nbe = tvb_get_guint8(tvb, ofs);
@ -437,7 +440,7 @@ dissect_dsi_reply_get_status(tvbuff_t *tvb, proto_tree *tree, gint offset)
case 5: /* SSH tunnel */
if (len > 2) {
tmp = tvb_get_ephemeral_string(tvb, ofs +2, len -2);
ti = proto_tree_add_text(adr_tree, tvb, ofs, len, "%s: %s",
ti = proto_tree_add_text(adr_tree, tvb, ofs, len, "%s: %s",
(type==4)?"dns":"ssh tunnel", tmp);
break;
}
@ -447,7 +450,7 @@ dissect_dsi_reply_get_status(tvbuff_t *tvb, proto_tree *tree, gint offset)
break;
case 6: /* IP6 */
ip = tvb_get_ptr(tvb, ofs+2, INET6_ADDRLEN);
ti = proto_tree_add_text(adr_tree, tvb, ofs, len, "ip6: %s",
ti = proto_tree_add_text(adr_tree, tvb, ofs, len, "ip6: %s",
ip6_to_str((const struct e_in6_addr *)ip));
break;
case 7: /* IP6 + 2bytes port */
@ -504,7 +507,7 @@ dissect_dsi_reply_get_status(tvbuff_t *tvb, proto_tree *tree, gint offset)
static void
dissect_dsi_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_tree *dsi_tree;
proto_tree *dsi_tree;
proto_item *ti;
guint8 dsi_flags,dsi_command;
guint16 dsi_requestid;
@ -513,7 +516,7 @@ dissect_dsi_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint32 dsi_reserved;
struct aspinfo aspinfo;
gint col_info;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "DSI");
col_info = check_col(pinfo->cinfo, COL_INFO);
@ -531,7 +534,7 @@ dissect_dsi_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s (%u)",
val_to_str(dsi_flags, flag_vals,
"Unknown flag (0x%02x)"),
val_to_str(dsi_command, func_vals,
val_to_str_ext(dsi_command, &func_vals_ext,
"Unknown function (0x%02x)"),
dsi_requestid);
}
@ -586,7 +589,7 @@ dissect_dsi_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
case DSIFUNC_CMD:
case DSIFUNC_WRITE:
{
tvbuff_t *new_tvb;
tvbuff_t *new_tvb;
void* pd_save;
int len = tvb_reported_length_remaining(tvb,DSI_BLOCKSIZ);
@ -603,11 +606,11 @@ dissect_dsi_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
pinfo->private_data = pd_save;
}
break;
default:
default:
if (tree) {
call_dissector(data_handle,
tvb_new_subset_remaining(tvb, DSI_BLOCKSIZ),
pinfo, dsi_tree);
call_dissector(data_handle,
tvb_new_subset_remaining(tvb, DSI_BLOCKSIZ),
pinfo, dsi_tree);
}
break;
}
@ -621,7 +624,7 @@ get_dsi_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
dsi_flags = tvb_get_guint8(tvb, offset);
dsi_command = tvb_get_guint8(tvb, offset+ 1);
if ( dsi_flags > DSIFL_MAX || !dsi_command || dsi_command > DSIFUNC_MAX)
if ( dsi_flags > DSIFL_MAX || !dsi_command || dsi_command > DSIFUNC_MAX)
{
/* it's not a known dsi pdu start sequence */
return tvb_length_remaining(tvb, offset);
@ -650,252 +653,252 @@ void
proto_register_dsi(void)
{
static hf_register_info hf[] = {
{ &hf_dsi_flags,
{ "Flags", "dsi.flags",
FT_UINT8, BASE_HEX, VALS(flag_vals), 0x0,
"Indicates request or reply.", HFILL }},
static hf_register_info hf[] = {
{ &hf_dsi_flags,
{ "Flags", "dsi.flags",
FT_UINT8, BASE_HEX, VALS(flag_vals), 0x0,
"Indicates request or reply.", HFILL }},
{ &hf_dsi_command,
{ "Command", "dsi.command",
FT_UINT8, BASE_DEC, VALS(func_vals), 0x0,
"Represents a DSI command.", HFILL }},
{ &hf_dsi_command,
{ "Command", "dsi.command",
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &func_vals_ext, 0x0,
"Represents a DSI command.", HFILL }},
{ &hf_dsi_requestid,
{ "Request ID", "dsi.requestid",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Keeps track of which request this is. Replies must match a Request. IDs must be generated in sequential order.", HFILL }},
{ &hf_dsi_requestid,
{ "Request ID", "dsi.requestid",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Keeps track of which request this is. Replies must match a Request. IDs must be generated in sequential order.", HFILL }},
{ &hf_dsi_offset,
{ "Data offset", "dsi.data_offset",
FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_offset,
{ "Data offset", "dsi.data_offset",
FT_INT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_error,
{ "Error code", "dsi.error_code",
FT_INT32, BASE_DEC, VALS(asp_error_vals), 0x0,
NULL, HFILL }},
{ &hf_dsi_error,
{ "Error code", "dsi.error_code",
FT_INT32, BASE_DEC|BASE_EXT_STRING, &asp_error_vals_ext, 0x0,
NULL, HFILL }},
{ &hf_dsi_length,
{ "Length", "dsi.length",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Total length of the data that follows the DSI header.", HFILL }},
{ &hf_dsi_length,
{ "Length", "dsi.length",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Total length of the data that follows the DSI header.", HFILL }},
{ &hf_dsi_reserved,
{ "Reserved", "dsi.reserved",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Reserved for future use. Should be set to zero.", HFILL }},
/* asp , afp */
{ &hf_dsi_utf8_server_name_len,
{ "Length", "dsi.utf8_server_name_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
"UTF8 server name length.", HFILL }},
{ &hf_dsi_utf8_server_name,
{ "UTF8 Server name", "dsi.utf8_server_name",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_reserved,
{ "Reserved", "dsi.reserved",
FT_UINT32, BASE_HEX, NULL, 0x0,
"Reserved for future use. Should be set to zero.", HFILL }},
/* asp , afp */
{ &hf_dsi_utf8_server_name_len,
{ "Length", "dsi.utf8_server_name_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
"UTF8 server name length.", HFILL }},
{ &hf_dsi_utf8_server_name,
{ "UTF8 Server name", "dsi.utf8_server_name",
FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_name,
{ "Server name", "dsi.server_name",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_name,
{ "Server name", "dsi.server_name",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_type,
{ "Server type", "dsi.server_type",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_type,
{ "Server type", "dsi.server_type",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_vers,
{ "AFP version", "dsi.server_vers",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_vers,
{ "AFP version", "dsi.server_vers",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_uams,
{ "UAM", "dsi.server_uams",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_uams,
{ "UAM", "dsi.server_uams",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_icon,
{ "Icon bitmap", "dsi.server_icon",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Server icon bitmap", HFILL }},
{ &hf_dsi_server_icon,
{ "Icon bitmap", "dsi.server_icon",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Server icon bitmap", HFILL }},
{ &hf_dsi_server_directory,
{ "Directory service", "dsi.server_directory",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
"Server directory service", HFILL }},
{ &hf_dsi_server_directory,
{ "Directory service", "dsi.server_directory",
FT_UINT_STRING, BASE_NONE, NULL, 0x0,
"Server directory service", HFILL }},
{ &hf_dsi_server_signature,
{ "Server signature", "dsi.server_signature",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_signature,
{ "Server signature", "dsi.server_signature",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_dsi_server_flag,
{ "Flag", "dsi.server_flag",
FT_UINT16, BASE_HEX, NULL, 0x0,
"Server capabilities flag", HFILL }},
{ &hf_dsi_server_flag_copyfile,
{ "Support copyfile", "dsi.server_flag.copyfile",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_COPY,
"Server support copyfile", HFILL }},
{ &hf_dsi_server_flag_passwd,
{ "Support change password", "dsi.server_flag.passwd",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_PASSWD,
"Server support change password", HFILL }},
{ &hf_dsi_server_flag_no_save_passwd,
{ "Don't allow save password", "dsi.server_flag.no_save_passwd",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_NOSAVEPASSWD,
NULL, HFILL }},
{ &hf_dsi_server_flag_srv_msg,
{ "Support server message", "dsi.server_flag.srv_msg",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVMSGS,
NULL, HFILL }},
{ &hf_dsi_server_flag_srv_sig,
{ "Support server signature", "dsi.server_flag.srv_sig",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVSIGNATURE,
NULL, HFILL }},
{ &hf_dsi_server_flag_tcpip,
{ "Support TCP/IP", "dsi.server_flag.tcpip",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_TCPIP,
"Server support TCP/IP", HFILL }},
{ &hf_dsi_server_flag_notify,
{ "Support server notifications", "dsi.server_flag.notify",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVNOTIFY,
"Server support notifications", HFILL }},
{ &hf_dsi_server_flag_reconnect,
{ "Support server reconnect", "dsi.server_flag.reconnect",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVRECONNECT,
"Server support reconnect", HFILL }},
{ &hf_dsi_server_flag_directory,
{ "Support directory services", "dsi.server_flag.directory",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVDIRECTORY,
"Server support directory services", HFILL }},
{ &hf_dsi_server_flag_utf8_name,
{ "Support UTF8 server name", "dsi.server_flag.utf8_name",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVUTF8,
"Server support UTF8 server name", HFILL }},
{ &hf_dsi_server_flag_uuid,
{ "Support UUIDs", "dsi.server_flag.uuids",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_UUID,
"Server supports UUIDs", HFILL }},
{ &hf_dsi_server_flag_ext_sleep,
{ "Support extended sleep", "dsi.server_flag.ext_sleep",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_EXT_SLEEP,
"Server supports extended sleep", HFILL }},
{ &hf_dsi_server_flag_fast_copy,
{ "Support fast copy", "dsi.server_flag.fast_copy",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_FASTBOZO,
"Server support fast copy", HFILL }},
{ &hf_dsi_server_flag,
{ "Flag", "dsi.server_flag",
FT_UINT16, BASE_HEX, NULL, 0x0,
"Server capabilities flag", HFILL }},
{ &hf_dsi_server_flag_copyfile,
{ "Support copyfile", "dsi.server_flag.copyfile",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_COPY,
"Server support copyfile", HFILL }},
{ &hf_dsi_server_flag_passwd,
{ "Support change password", "dsi.server_flag.passwd",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_PASSWD,
"Server support change password", HFILL }},
{ &hf_dsi_server_flag_no_save_passwd,
{ "Don't allow save password", "dsi.server_flag.no_save_passwd",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_NOSAVEPASSWD,
NULL, HFILL }},
{ &hf_dsi_server_flag_srv_msg,
{ "Support server message", "dsi.server_flag.srv_msg",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVMSGS,
NULL, HFILL }},
{ &hf_dsi_server_flag_srv_sig,
{ "Support server signature", "dsi.server_flag.srv_sig",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVSIGNATURE,
NULL, HFILL }},
{ &hf_dsi_server_flag_tcpip,
{ "Support TCP/IP", "dsi.server_flag.tcpip",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_TCPIP,
"Server support TCP/IP", HFILL }},
{ &hf_dsi_server_flag_notify,
{ "Support server notifications", "dsi.server_flag.notify",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVNOTIFY,
"Server support notifications", HFILL }},
{ &hf_dsi_server_flag_reconnect,
{ "Support server reconnect", "dsi.server_flag.reconnect",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVRECONNECT,
"Server support reconnect", HFILL }},
{ &hf_dsi_server_flag_directory,
{ "Support directory services", "dsi.server_flag.directory",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVDIRECTORY,
"Server support directory services", HFILL }},
{ &hf_dsi_server_flag_utf8_name,
{ "Support UTF8 server name", "dsi.server_flag.utf8_name",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVUTF8,
"Server support UTF8 server name", HFILL }},
{ &hf_dsi_server_flag_uuid,
{ "Support UUIDs", "dsi.server_flag.uuids",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_UUID,
"Server supports UUIDs", HFILL }},
{ &hf_dsi_server_flag_ext_sleep,
{ "Support extended sleep", "dsi.server_flag.ext_sleep",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_EXT_SLEEP,
"Server supports extended sleep", HFILL }},
{ &hf_dsi_server_flag_fast_copy,
{ "Support fast copy", "dsi.server_flag.fast_copy",
FT_BOOLEAN, 16, NULL, AFPSRVRINFO_FASTBOZO,
"Server support fast copy", HFILL }},
{ &hf_dsi_server_addr_len,
{ "Length", "dsi.server_addr.len",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Address length.", HFILL }},
{ &hf_dsi_server_addr_len,
{ "Length", "dsi.server_addr.len",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Address length.", HFILL }},
{ &hf_dsi_server_addr_type,
{ "Type", "dsi.server_addr.type",
FT_UINT8, BASE_DEC, VALS(afp_server_addr_type_vals), 0x0,
"Address type.", HFILL }},
{ &hf_dsi_server_addr_type,
{ "Type", "dsi.server_addr.type",
FT_UINT8, BASE_DEC|BASE_EXT_STRING, &afp_server_addr_type_vals_ext, 0x0,
"Address type.", HFILL }},
{ &hf_dsi_server_addr_value,
{ "Value", "dsi.server_addr.value",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Address value", HFILL }},
{ &hf_dsi_server_addr_value,
{ "Value", "dsi.server_addr.value",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Address value", HFILL }},
{ &hf_dsi_open_type,
{ "Option", "dsi.open_type",
FT_UINT8, BASE_DEC, VALS(dsi_open_type_vals), 0x0,
"Open session option type.", HFILL }},
{ &hf_dsi_open_type,
{ "Option", "dsi.open_type",
FT_UINT8, BASE_DEC, VALS(dsi_open_type_vals), 0x0,
"Open session option type.", HFILL }},
{ &hf_dsi_open_len,
{ "Length", "dsi.open_len",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Open session option len", HFILL }},
{ &hf_dsi_open_len,
{ "Length", "dsi.open_len",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Open session option len", HFILL }},
{ &hf_dsi_open_quantum,
{ "Quantum", "dsi.open_quantum",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Server/Attention quantum", HFILL }},
{ &hf_dsi_open_quantum,
{ "Quantum", "dsi.open_quantum",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Server/Attention quantum", HFILL }},
{ &hf_dsi_replay_cache_size,
{ "Replay", "dsi.replay_cache",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Replay cache size", HFILL }},
{ &hf_dsi_open_option,
{ "Option", "dsi.open_option",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Open session options (undecoded)", HFILL }},
{ &hf_dsi_replay_cache_size,
{ "Replay", "dsi.replay_cache",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Replay cache size", HFILL }},
{ &hf_dsi_attn_flag,
{ "Flags", "dsi.attn_flag",
FT_UINT16, BASE_HEX, VALS(dsi_attn_flag_vals), 0xf000,
"Server attention flag", HFILL }},
{ &hf_dsi_attn_flag_shutdown,
{ "Shutdown", "dsi.attn_flag.shutdown",
FT_BOOLEAN, 16, NULL, 1<<15,
"Attention flag, server is shutting down", HFILL }},
{ &hf_dsi_attn_flag_crash,
{ "Crash", "dsi.attn_flag.crash",
FT_BOOLEAN, 16, NULL, 1<<14,
"Attention flag, server crash bit", HFILL }},
{ &hf_dsi_attn_flag_msg,
{ "Message", "dsi.attn_flag.msg",
FT_BOOLEAN, 16, NULL, 1<<13,
"Attention flag, server message bit", HFILL }},
{ &hf_dsi_attn_flag_reconnect,
{ "Don't reconnect", "dsi.attn_flag.reconnect",
FT_BOOLEAN, 16, NULL, 1<<12,
"Attention flag, don't reconnect bit", HFILL }},
{ &hf_dsi_attn_flag_time,
{ "Minutes", "dsi.attn_flag.time",
FT_UINT16, BASE_DEC, NULL, 0xfff,
"Number of minutes", HFILL }},
{ &hf_dsi_attn_flag_bitmap,
{ "Bitmap", "dsi.attn_flag.time",
FT_UINT16, BASE_HEX, NULL, 0xfff,
"Attention extended bitmap", HFILL }},
{ &hf_dsi_open_option,
{ "Option", "dsi.open_option",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Open session options (undecoded)", HFILL }},
};
{ &hf_dsi_attn_flag,
{ "Flags", "dsi.attn_flag",
FT_UINT16, BASE_HEX|BASE_EXT_STRING, &dsi_attn_flag_vals_ext, 0xf000,
"Server attention flag", HFILL }},
{ &hf_dsi_attn_flag_shutdown,
{ "Shutdown", "dsi.attn_flag.shutdown",
FT_BOOLEAN, 16, NULL, 1<<15,
"Attention flag, server is shutting down", HFILL }},
{ &hf_dsi_attn_flag_crash,
{ "Crash", "dsi.attn_flag.crash",
FT_BOOLEAN, 16, NULL, 1<<14,
"Attention flag, server crash bit", HFILL }},
{ &hf_dsi_attn_flag_msg,
{ "Message", "dsi.attn_flag.msg",
FT_BOOLEAN, 16, NULL, 1<<13,
"Attention flag, server message bit", HFILL }},
{ &hf_dsi_attn_flag_reconnect,
{ "Don't reconnect", "dsi.attn_flag.reconnect",
FT_BOOLEAN, 16, NULL, 1<<12,
"Attention flag, don't reconnect bit", HFILL }},
{ &hf_dsi_attn_flag_time,
{ "Minutes", "dsi.attn_flag.time",
FT_UINT16, BASE_DEC, NULL, 0xfff,
"Number of minutes", HFILL }},
{ &hf_dsi_attn_flag_bitmap,
{ "Bitmap", "dsi.attn_flag.time",
FT_UINT16, BASE_HEX, NULL, 0xfff,
"Attention extended bitmap", HFILL }},
static gint *ett[] = {
&ett_dsi,
&ett_dsi_open,
&ett_dsi_attn,
&ett_dsi_attn_flag,
/* asp afp */
&ett_dsi_status,
&ett_dsi_status_server_flag,
&ett_dsi_vers,
&ett_dsi_uams,
&ett_dsi_addr,
&ett_dsi_addr_line,
&ett_dsi_directory,
&ett_dsi_utf8_name,
};
module_t *dsi_module;
};
proto_dsi = proto_register_protocol("Data Stream Interface", "DSI", "dsi");
proto_register_field_array(proto_dsi, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
static gint *ett[] = {
&ett_dsi,
&ett_dsi_open,
&ett_dsi_attn,
&ett_dsi_attn_flag,
/* asp afp */
&ett_dsi_status,
&ett_dsi_status_server_flag,
&ett_dsi_vers,
&ett_dsi_uams,
&ett_dsi_addr,
&ett_dsi_addr_line,
&ett_dsi_directory,
&ett_dsi_utf8_name,
};
module_t *dsi_module;
dsi_module = prefs_register_protocol(proto_dsi, NULL);
prefs_register_bool_preference(dsi_module, "desegment",
"Reassemble DSI messages spanning multiple TCP segments",
"Whether the DSI dissector should reassemble messages spanning multiple TCP segments."
" To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
&dsi_desegment);
proto_dsi = proto_register_protocol("Data Stream Interface", "DSI", "dsi");
proto_register_field_array(proto_dsi, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
dsi_module = prefs_register_protocol(proto_dsi, NULL);
prefs_register_bool_preference(dsi_module, "desegment",
"Reassemble DSI messages spanning multiple TCP segments",
"Whether the DSI dissector should reassemble messages spanning multiple TCP segments."
" To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
&dsi_desegment);
}
void
proto_reg_handoff_dsi(void)
{
dissector_handle_t dsi_handle;
dissector_handle_t dsi_handle;
dsi_handle = create_dissector_handle(dissect_dsi, proto_dsi);
dissector_add("tcp.port", TCP_PORT_DSI, dsi_handle);
dsi_handle = create_dissector_handle(dissect_dsi, proto_dsi);
dissector_add("tcp.port", TCP_PORT_DSI, dsi_handle);
data_handle = find_dissector("data");
afp_handle = find_dissector("afp");
data_handle = find_dissector("data");
afp_handle = find_dissector("afp");
}

View File

@ -98,7 +98,7 @@ col_set_str
col_set_time
col_set_writable
col_setup
CommandCode_vals DATA
CommandCode_vals_ext DATA
conversation_add_proto_data
conversation_delete_proto_data
conversation_get_proto_data

View File

@ -168,7 +168,7 @@ gtk_afpstat_init(const char *optarg, void *userdata _U_)
init_srt_table(&ss->afp_srt_table, 256, vbox, "afp.command");
for(i=0;i<256;i++){
init_srt_table_row(&ss->afp_srt_table, i, val_to_str(i, CommandCode_vals, "Unknown(%u)"));
init_srt_table_row(&ss->afp_srt_table, i, val_to_str_ext(i, &CommandCode_vals_ext, "Unknown(%u)"));
}

View File

@ -100,7 +100,7 @@ afpstat_draw(void *pss)
}
printf("%-25s %6d %3d.%05d %3d.%05d %3" G_GINT64_MODIFIER "u.%05" G_GINT64_MODIFIER "u\n",
val_to_str(i, CommandCode_vals, "Unknown (%u)"),
val_to_str_ext(i, &CommandCode_vals_ext, "Unknown (%u)"),
ss->proc[i].num,
(int)ss->proc[i].min.secs,ss->proc[i].min.nsecs/10000,
(int)ss->proc[i].max.secs,ss->proc[i].max.nsecs/10000,