aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-afp.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2014-04-06 12:12:59 -0700
committerGuy Harris <guy@alum.mit.edu>2014-04-06 19:13:48 +0000
commit70ad7d8fd3a40bd9a5e30860c6bbbd0ab801ebe2 (patch)
tree3b26e116058d52777baf812490065f52df5b93bf /epan/dissectors/packet-afp.c
parent5a67479bff973df068301e5d07ec8918a58f3ce8 (diff)
Move the status dissecting code to the AFP dissector.
The ASP and DSI dissectors had almost-identical dissection of the ASP and DSI "status" responses. What's being dissected is defined by the AFP specification (and might be different for protocols *other* than AFP running atop AFP or DSI), so move that dissection to the AFP dissector. Note that, at least for AFP-over-DSI, the spec isn't being followed in at least one capture. Change-Id: Idb1013483f3a3bdf2b7eb0618e48fc178a338642 Reviewed-on: https://code.wireshark.org/review/987 Reviewed-by: Guy Harris <guy@alum.mit.edu>
Diffstat (limited to 'epan/dissectors/packet-afp.c')
-rw-r--r--epan/dissectors/packet-afp.c506
1 files changed, 502 insertions, 4 deletions
diff --git a/epan/dissectors/packet-afp.c b/epan/dissectors/packet-afp.c
index 84397584fc..ded8c5a4d3 100644
--- a/epan/dissectors/packet-afp.c
+++ b/epan/dissectors/packet-afp.c
@@ -31,7 +31,7 @@
#include <glib.h>
#include <epan/packet.h>
#include <epan/exceptions.h>
-/* #include <epan/strutil.h> */
+#include <epan/to_str.h>
#include <epan/conversation.h>
#include <epan/wmem/wmem.h>
#include <epan/tap.h>
@@ -685,6 +685,7 @@ static int hf_afp_request_bitmap_UTF8Name = -1;
static int hf_afp_request_bitmap_ExtRsrcForkLen = -1;
static int hf_afp_request_bitmap_PartialNames = -1;
+/* Spotlight stuff */
static int ett_afp_spotlight_queries = -1;
static int ett_afp_spotlight_query_line = -1;
static int ett_afp_spotlight_query = -1;
@@ -703,6 +704,16 @@ static int hf_afp_spotlight_reqlen = -1;
static int hf_afp_spotlight_uuid = -1;
static int hf_afp_spotlight_date = -1;
+/* Status stuff from ASP or DSI */
+static int ett_afp_status = -1;
+static int ett_afp_uams = -1;
+static int ett_afp_vers = -1;
+static int ett_afp_server_addr = -1;
+static int ett_afp_server_addr_line = -1;
+static int ett_afp_directory = -1;
+static int ett_afp_utf8_name = -1;
+static int ett_afp_status_server_flag = -1;
+
static const value_string flag_vals[] = {
{0, "Start" },
{1, "End" },
@@ -1017,6 +1028,46 @@ static int hf_afp_acl_access_bitmap_generic_execute = -1;
static int hf_afp_acl_access_bitmap_generic_write = -1;
static int hf_afp_acl_access_bitmap_generic_read = -1;
+/* Status stuff from ASP or DSI */
+static int hf_afp_server_name = -1;
+static int hf_afp_utf8_server_name_len = -1;
+static int hf_afp_utf8_server_name = -1;
+static int hf_afp_server_type = -1;
+static int hf_afp_server_vers = -1;
+static int hf_afp_server_uams = -1;
+static int hf_afp_server_icon = -1;
+static int hf_afp_server_directory = -1;
+
+static int hf_afp_server_flag = -1;
+static int hf_afp_server_flag_copyfile = -1;
+static int hf_afp_server_flag_passwd = -1;
+static int hf_afp_server_flag_no_save_passwd = -1;
+static int hf_afp_server_flag_srv_msg = -1;
+static int hf_afp_server_flag_srv_sig = -1;
+static int hf_afp_server_flag_tcpip = -1;
+static int hf_afp_server_flag_notify = -1;
+static int hf_afp_server_flag_reconnect = -1;
+static int hf_afp_server_flag_directory = -1;
+static int hf_afp_server_flag_utf8_name = -1;
+static int hf_afp_server_flag_uuid = -1;
+static int hf_afp_server_flag_ext_sleep = -1;
+static int hf_afp_server_flag_fast_copy = -1;
+static int hf_afp_server_signature = -1;
+
+static int hf_afp_server_addr_len = -1;
+static int hf_afp_server_addr_type = -1;
+static int hf_afp_server_addr_value = -1;
+
+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);
#define hash_init_count 20
@@ -3426,7 +3477,10 @@ dissect_reply_afp_map_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree
if (!len) {
len = tvb_get_guint8(tvb, offset +1);
if (!len) {
- /* assume it's undocumented type 5 or 6 reply */
+ /*
+ * Assume it's kUserUUIDToUTF8Name or
+ * kGroupUUIDToUTF8Name.
+ */
proto_tree_add_item(tree, hf_afp_map_id_reply_type, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
@@ -3471,12 +3525,19 @@ dissect_query_afp_map_name(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
proto_tree_add_item(tree, hf_afp_map_name_type, tvb, offset, 1, ENC_BIG_ENDIAN);
offset++;
switch (type) {
- case 5: /* use 16 bits length */
+ case 5:
case 6:
+ /*
+ * Maps to UUID, UTF-8 string
+ *
+ * XXX - the spec doesn't say the string length is 2 bytes
+ * for this case.
+ */
size = 2;
len = tvb_get_ntohs(tvb, offset);
break;
default:
+ /* Maps to UID/GID */
size = 1;
len = tvb_get_guint8(tvb, offset);
break;
@@ -4825,6 +4886,312 @@ dissect_reply_afp_spotlight(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
return offset;
}
+/* -----------------------------
+ from netatalk/etc/afpd/status.c
+*/
+
+/* server flags */
+#define AFPSRVRINFO_COPY (1<<0) /* supports copyfile */
+#define AFPSRVRINFO_PASSWD (1<<1) /* supports change password */
+#define AFPSRVRINFO_NOSAVEPASSWD (1<<2) /* don't allow save password */
+#define AFPSRVRINFO_SRVMSGS (1<<3) /* supports server messages */
+#define AFPSRVRINFO_SRVSIGNATURE (1<<4) /* supports server signature */
+#define AFPSRVRINFO_TCPIP (1<<5) /* supports tcpip */
+#define AFPSRVRINFO_SRVNOTIFY (1<<6) /* supports server notifications */
+#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_FASTBOZO (1<<15) /* fast copying */
+
+#define AFPSTATUS_MACHOFF 0
+#define AFPSTATUS_VERSOFF 2
+#define AFPSTATUS_UAMSOFF 4
+#define AFPSTATUS_ICONOFF 6
+#define AFPSTATUS_FLAGOFF 8
+#define AFPSTATUS_PRELEN 10
+#define AFPSTATUS_POSTLEN 4
+#define AFPSTATUS_LEN (AFPSTATUS_PRELEN + AFPSTATUS_POSTLEN)
+
+#define INET6_ADDRLEN 16
+
+static gint
+dissect_afp_server_status(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_)
+{
+ int offset = 0;
+ proto_tree *sub_tree;
+ proto_item *ti;
+
+ guint16 ofs;
+ guint16 flag;
+ guint8 server_name_len;
+ guint16 sign_ofs = 0;
+ guint16 adr_ofs = 0;
+ guint16 dir_ofs = 0;
+ guint16 utf_ofs = 0;
+ gint variable_data_offset;
+ guint8 nbe;
+ guint len;
+ guint i;
+
+ ti = proto_tree_add_text(tree, tvb, offset, -1, "Get Status");
+ tree = proto_item_add_subtree(ti, ett_afp_status);
+
+ ofs = tvb_get_ntohs(tvb, AFPSTATUS_MACHOFF);
+ proto_tree_add_text(tree, tvb, AFPSTATUS_MACHOFF, 2, "Machine offset: %u", ofs);
+
+ ofs = tvb_get_ntohs(tvb, AFPSTATUS_VERSOFF);
+ proto_tree_add_text(tree, tvb, AFPSTATUS_VERSOFF, 2, "Version offset: %u", ofs);
+
+ ofs = tvb_get_ntohs(tvb, AFPSTATUS_UAMSOFF);
+ proto_tree_add_text(tree, tvb, AFPSTATUS_UAMSOFF, 2, "UAMS offset: %u", ofs);
+
+ ofs = tvb_get_ntohs(tvb, AFPSTATUS_ICONOFF);
+ proto_tree_add_text(tree, tvb, AFPSTATUS_ICONOFF, 2, "Icon offset: %u", ofs);
+
+ ofs = AFPSTATUS_FLAGOFF;
+ flag = tvb_get_ntohs(tvb, ofs);
+ ti = proto_tree_add_item(tree, hf_afp_server_flag, tvb, ofs, 2, ENC_BIG_ENDIAN);
+ sub_tree = proto_item_add_subtree(ti, ett_afp_status_server_flag);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_copyfile , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_passwd , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_no_save_passwd, tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_srv_msg , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_srv_sig , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_tcpip , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_notify , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_reconnect , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_directory , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_utf8_name , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_uuid , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_ext_sleep , tvb, ofs, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(sub_tree, hf_afp_server_flag_fast_copy , tvb, ofs, 2, ENC_BIG_ENDIAN);
+
+ offset = AFPSTATUS_PRELEN;
+ server_name_len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_afp_server_name, tvb, offset, 1, ENC_ASCII|ENC_NA);
+ offset += 1 + server_name_len; /* 1 for the length byte */
+
+ if ((flag & AFPSRVRINFO_SRVSIGNATURE)) {
+ if ((offset & 1))
+ offset++;
+ sign_ofs = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 2, "Signature offset: %u", sign_ofs);
+ offset += 2;
+ }
+
+ if ((flag & AFPSRVRINFO_TCPIP)) {
+ if ((offset & 1))
+ offset++;
+ adr_ofs = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 2, "Network address offset: %u", adr_ofs);
+ offset += 2;
+ }
+
+ if ((flag & AFPSRVRINFO_SRVDIRECTORY)) {
+ if ((offset & 1))
+ offset++;
+ dir_ofs = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 2, "Directory services offset: %u", dir_ofs);
+ offset += 2;
+ }
+
+ if ((flag & AFPSRVRINFO_SRVUTF8)) {
+ if ((offset & 1))
+ offset++;
+ utf_ofs = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 2, "UTF-8 server name offset: %u", utf_ofs);
+ offset += 2;
+ }
+
+ /*
+ * XXX - should also check for overlap between "variable data" fields;
+ * that requires keeping all the offsets and lengths and checking
+ * against all the ones we've dissected so far.
+ *
+ * XXX - should report an error if there's overlap, rather than
+ * just ignoring the field.
+ */
+ variable_data_offset = offset;
+ offset = tvb_get_ntohs(tvb, AFPSTATUS_MACHOFF);
+ if (offset) {
+ if (offset >= variable_data_offset) {
+ proto_tree_add_item(tree, hf_afp_server_type, tvb, offset, 1, ENC_ASCII|ENC_NA);
+ }
+ }
+
+ offset = tvb_get_ntohs(tvb, AFPSTATUS_VERSOFF);
+ if (offset) {
+ if (offset >= variable_data_offset) {
+ nbe = tvb_get_guint8(tvb, offset);
+ ti = proto_tree_add_text(tree, tvb, offset, 1, "Version list: %u", nbe);
+ offset++;
+ sub_tree = proto_item_add_subtree(ti, ett_afp_vers);
+ for (i = 0; i < nbe; i++) {
+ len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(sub_tree, hf_afp_server_vers, tvb, offset, 1, ENC_ASCII|ENC_NA);
+ offset += len + 1;
+ }
+ }
+ }
+
+ offset = tvb_get_ntohs(tvb, AFPSTATUS_UAMSOFF);
+ if (offset) {
+ if (offset >= variable_data_offset) {
+ nbe = tvb_get_guint8(tvb, offset);
+ ti = proto_tree_add_text(tree, tvb, offset, 1, "UAMS list: %u", nbe);
+ offset++;
+ sub_tree = proto_item_add_subtree(ti, ett_afp_uams);
+ for (i = 0; i < nbe; i++) {
+ len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(sub_tree, hf_afp_server_uams, tvb, offset, 1, ENC_ASCII|ENC_NA);
+ offset += len + 1;
+ }
+ }
+ }
+
+ offset = tvb_get_ntohs(tvb, AFPSTATUS_ICONOFF);
+ if (offset) {
+ if (offset >= variable_data_offset)
+ proto_tree_add_item(tree, hf_afp_server_icon, tvb, offset, 256, ENC_NA);
+ }
+
+ if ((flag & AFPSRVRINFO_SRVSIGNATURE)) {
+ if (sign_ofs >= variable_data_offset)
+ proto_tree_add_item(tree, hf_afp_server_signature, tvb, sign_ofs, 16, ENC_NA);
+ }
+
+ if ((flag & AFPSRVRINFO_TCPIP)) {
+ if (adr_ofs >= variable_data_offset) {
+ proto_tree *adr_tree;
+ unsigned char *tmp;
+ guint16 net;
+ guint8 node;
+ guint16 port;
+
+ offset = adr_ofs;
+ nbe = tvb_get_guint8(tvb, offset);
+ ti = proto_tree_add_text(tree, tvb, offset, 1, "Address list: %d", nbe);
+ offset++;
+ adr_tree = proto_item_add_subtree(ti, ett_afp_server_addr);
+ for (i = 0; i < nbe; i++) {
+ guint8 type;
+
+ len = tvb_get_guint8(tvb, offset);
+ type = tvb_get_guint8(tvb, offset +1);
+ switch (type) {
+ case 1: /* IP */
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "IP: %s", tvb_ip_to_str(tvb, offset+2));
+ break;
+ case 2: /* IP + port */
+ port = tvb_get_ntohs(tvb, offset+6);
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "IP: %s:%d", tvb_ip_to_str(tvb, offset+2), port);
+ break;
+ case 3: /* DDP, atalk_addr_to_str want host order not network */
+ net = tvb_get_ntohs(tvb, offset+2);
+ node = tvb_get_guint8(tvb, offset +4);
+ port = tvb_get_guint8(tvb, offset +5);
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "DDP: %u.%u:%u",
+ net, node, port);
+ break;
+ case 4: /* DNS */
+ case 5: /* SSH tunnel */
+ /*
+ * The AFP specifcation says of
+ * the SSH tunnel type:
+ *
+ * IP address (four bytes) with port
+ * number (2 bytes). If this tag is
+ * present and the client is so
+ * configured, the client attempts
+ * to build a Secure Shell (SSH)
+ * tunnel between itself and the
+ * server and tries to connect
+ * through it. This functionality
+ * is deprecated.
+ *
+ * and, in the only place I've seen
+ * it, it was like DNS.
+ *
+ * So we treat it as DNS.
+ *
+ * XXX - should we treat it as
+ * IP+port if this is transported
+ * over ASP rather DSI? The old
+ * ASP code to dissect this
+ * dissected it as IP+port.
+ */
+ if (len > 2) {
+ /* XXX - internationalized DNS? */
+ tmp = tvb_get_string_enc(wmem_packet_scope(), tvb, offset +2, len -2, ENC_ASCII|ENC_NA);
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "%s: %s",
+ (type==4)?"DNS":"IP (SSH tunnel)", tmp);
+ break;
+ }
+ else {
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "Malformed DNS address");
+ }
+ break;
+ case 6: /* IP6 */
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "IPv6: %s",
+ tvb_ip6_to_str(tvb, offset+2));
+ break;
+ case 7: /* IP6 + 2bytes port */
+ port = tvb_get_ntohs(tvb, offset+ 2+INET6_ADDRLEN);
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len, "IPv6: %s:%d",
+ tvb_ip6_to_str(tvb, offset+2), port);
+ break;
+ default:
+ ti = proto_tree_add_text(adr_tree, tvb, offset, len,"Unknown type: %u", type);
+ break;
+ }
+ len -= 2;
+ sub_tree = proto_item_add_subtree(ti,ett_afp_server_addr_line);
+ proto_tree_add_item(sub_tree, hf_afp_server_addr_len, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ proto_tree_add_item(sub_tree, hf_afp_server_addr_type, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ proto_tree_add_item(sub_tree, hf_afp_server_addr_value,tvb, offset, len, ENC_NA);
+ offset += len;
+ }
+ }
+ }
+
+ if ((flag & AFPSRVRINFO_SRVDIRECTORY)) {
+ if (dir_ofs >= variable_data_offset) {
+ offset = dir_ofs;
+ nbe = tvb_get_guint8(tvb, offset);
+ ti = proto_tree_add_text(tree, tvb, offset, 1, "Directory services list: %d", nbe);
+ offset++;
+ sub_tree = proto_item_add_subtree(ti, ett_afp_directory);
+ for (i = 0; i < nbe; i++) {
+ len = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(sub_tree, hf_afp_server_directory, tvb, offset, 1, ENC_ASCII|ENC_NA);
+ offset += len + 1;
+ }
+ }
+ }
+
+ if ((flag & AFPSRVRINFO_SRVUTF8)) {
+ if (utf_ofs >= variable_data_offset) {
+ guint16 ulen;
+ char *tmp;
+
+ offset = utf_ofs;
+ ulen = tvb_get_ntohs(tvb, offset);
+ tmp = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 2, ulen, ENC_UTF_8|ENC_NA);
+ ti = proto_tree_add_text(tree, tvb, offset, ulen + 2, "UTF-8 server name: %s", tmp);
+ sub_tree = proto_item_add_subtree(ti, ett_afp_utf8_name);
+ proto_tree_add_uint(sub_tree, hf_afp_utf8_server_name_len, tvb, offset, 2, ulen);
+ offset += 2;
+ proto_tree_add_string(sub_tree, hf_afp_utf8_server_name, tvb, offset, ulen, tmp);
+ offset += ulen;
+ }
+ }
+
+ return offset;
+}
/* ************************** */
static int
@@ -6768,6 +7135,125 @@ proto_register_afp(void)
{ "Unknown parameter", "afp.unknown",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
+
+ /* Status stuff from ASP or DSI */
+ { &hf_afp_utf8_server_name_len,
+ { "UTF-8 server name length", "afp.utf8_server_name_len",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_utf8_server_name,
+ { "UTF-8 server name", "afp.utf8_server_name",
+ FT_STRING, STR_UNICODE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_server_name,
+ { "Server name", "afp.server_name",
+ FT_UINT_STRING, STR_UNICODE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_server_type,
+ { "Server type", "afp.server_type",
+ FT_UINT_STRING, STR_UNICODE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_server_vers,
+ { "AFP version", "afp.server_vers",
+ FT_UINT_STRING, STR_UNICODE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_server_uams,
+ { "UAM", "afp.server_uams",
+ FT_UINT_STRING, STR_UNICODE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_server_icon,
+ { "Icon bitmap", "afp.server_icon",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Server icon bitmap", HFILL }},
+
+ { &hf_afp_server_directory,
+ { "Directory service", "afp.server_directory",
+ FT_UINT_STRING, STR_UNICODE, NULL, 0x0,
+ "Server directory service", HFILL }},
+
+ { &hf_afp_server_signature,
+ { "Server signature", "afp.server_signature",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_afp_server_flag,
+ { "Flag", "afp.server_flag",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ "Server capabilities flag", HFILL }},
+ { &hf_afp_server_flag_copyfile,
+ { "Support copyfile", "afp.server_flag.copyfile",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_COPY,
+ "Server support copyfile", HFILL }},
+ { &hf_afp_server_flag_passwd,
+ { "Support change password", "afp.server_flag.passwd",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_PASSWD,
+ "Server support change password", HFILL }},
+ { &hf_afp_server_flag_no_save_passwd,
+ { "Don't allow save password", "afp.server_flag.no_save_passwd",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_NOSAVEPASSWD,
+ NULL, HFILL }},
+ { &hf_afp_server_flag_srv_msg,
+ { "Support server message", "afp.server_flag.srv_msg",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVMSGS,
+ NULL, HFILL }},
+ { &hf_afp_server_flag_srv_sig,
+ { "Support server signature", "afp.server_flag.srv_sig",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVSIGNATURE,
+ NULL, HFILL }},
+ { &hf_afp_server_flag_tcpip,
+ { "Support TCP/IP", "afp.server_flag.tcpip",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_TCPIP,
+ "Server support TCP/IP", HFILL }},
+ { &hf_afp_server_flag_notify,
+ { "Support server notifications", "afp.server_flag.notify",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVNOTIFY,
+ "Server support notifications", HFILL }},
+ { &hf_afp_server_flag_reconnect,
+ { "Support server reconnect", "afp.server_flag.reconnect",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVRECONNECT,
+ "Server support reconnect", HFILL }},
+ { &hf_afp_server_flag_directory,
+ { "Support directory services", "afp.server_flag.directory",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVDIRECTORY,
+ "Server support directory services", HFILL }},
+ { &hf_afp_server_flag_utf8_name,
+ { "Support UTF-8 server name", "afp.server_flag.utf8_name",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_SRVUTF8,
+ "Server support UTF-8 server name", HFILL }},
+ { &hf_afp_server_flag_uuid,
+ { "Support UUIDs", "afp.server_flag.uuids",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_UUID,
+ "Server supports UUIDs", HFILL }},
+ { &hf_afp_server_flag_ext_sleep,
+ { "Support extended sleep", "afp.server_flag.ext_sleep",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_EXT_SLEEP,
+ "Server supports extended sleep", HFILL }},
+ { &hf_afp_server_flag_fast_copy,
+ { "Support fast copy", "afp.server_flag.fast_copy",
+ FT_BOOLEAN, 16, NULL, AFPSRVRINFO_FASTBOZO,
+ "Server support fast copy", HFILL }},
+
+
+ { &hf_afp_server_addr_len,
+ { "Length", "afp.server_addr.len",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Address length.", HFILL }},
+
+ { &hf_afp_server_addr_type,
+ { "Type", "afp.server_addr.type",
+ FT_UINT8, BASE_DEC|BASE_EXT_STRING, &afp_server_addr_type_vals_ext, 0x0,
+ "Address type.", HFILL }},
+
+ { &hf_afp_server_addr_value,
+ { "Value", "afp.server_addr.value",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ "Address value", HFILL }},
};
static gint *ett[] = {
@@ -6805,7 +7291,17 @@ proto_register_afp(void)
&ett_afp_spotlight_query_line,
&ett_afp_spotlight_query,
&ett_afp_spotlight_data,
- &ett_afp_spotlight_toc
+ &ett_afp_spotlight_toc,
+
+ /* Status stuff from ASP or DSI */
+ &ett_afp_status,
+ &ett_afp_status_server_flag,
+ &ett_afp_vers,
+ &ett_afp_uams,
+ &ett_afp_server_addr,
+ &ett_afp_server_addr_line,
+ &ett_afp_directory,
+ &ett_afp_utf8_name
};
static ei_register_info ei[] = {
@@ -6826,6 +7322,8 @@ proto_register_afp(void)
register_init_routine(afp_reinit);
new_register_dissector("afp", dissect_afp, proto_afp);
+ new_register_dissector("afp_server_status", dissect_afp_server_status,
+ proto_afp);
new_register_dissector("afp_spotlight", dissect_spotlight, proto_afp);
afp_tap = register_tap("afp");