Ethereal-dev: [Ethereal-dev] [PATCH] More AIM updates
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Jelmer Vernooij <jelmer@xxxxxxxxxxx>
Date: Mon, 19 Apr 2004 23:02:07 +0200
Hi, Here's another update to the AIM dissector. This patch adds support for a couple more SNAC's. TLV's are now handled in a somewhat more extendible manner It also fixes a bug in the buddylist dissector that caused pango warnings. I hope to get another set of updates (perhaps the ICQ SNAC) ready in one to two weeks. Cheers, Jelmer -- Jelmer Vernooij <jelmer@xxxxxxxxxxx> - http://jelmer.vernstok.nl/
? TODO-aim ? current.diff ? ethereal-aim-5.diff ? ethereal-aim-6.diff ? ethereal-aim-6.diff.info ? gtk/.main.c.swp Index: packet-aim-admin.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-admin.c,v retrieving revision 1.1 diff -u -3 -p -d -u -r1.1 packet-aim-admin.c --- packet-aim-admin.c 23 Mar 2004 06:21:16 -0000 1.1 +++ packet-aim-admin.c 19 Apr 2004 20:59:20 -0000 @@ -39,8 +39,6 @@ #include "packet-aim.h" -#define MAX_BUDDYNAME_LENGTH 30 - #define FAMILY_ADMIN 0x0007 /* Family Admin */ @@ -65,11 +63,23 @@ static const value_string aim_fnac_famil { 0, NULL } }; +#define CONFIRM_STATUS_EMAIL_SENT 0x00 +#define CONFIRM_STATUS_ALREADY_CONFIRMED 0x1E +#define CONFIRM_STATUS_SERVER_ERROR 0x23 + +static const value_string confirm_statusses[] = { + { CONFIRM_STATUS_EMAIL_SENT, "A confirmation email has been sent" }, + { CONFIRM_STATUS_ALREADY_CONFIRMED, "Account was already confirmed" }, + { CONFIRM_STATUS_SERVER_ERROR, "Server couldn't start confirmation process" }, + { 0, NULL } +}; + /* Initialize the protocol and registered fields */ static int proto_aim_admin = -1; static int hf_admin_acctinfo_code = -1; static int hf_admin_acctinfo_permissions = -1; static int hf_admin_acctinfo_tlvcount = -1; +static int hf_admin_confirm_status = -1; /* Initialize the subtree pointers */ static gint ett_aim_admin = -1; @@ -86,11 +96,14 @@ static int dissect_aim_admin(tvbuff_t *t } switch(aiminfo->subtype) { + case FAMILY_ADMIN_ERROR: + return dissect_aim_snac_error(tvb, pinfo, 0, admin_tree); case FAMILY_ADMIN_ACCNT_INFO_REQ: proto_tree_add_item(admin_tree, hf_admin_acctinfo_code, tvb, 0, 2, tvb_get_ntohs(tvb, 0)); proto_tree_add_text(admin_tree, tvb, 2, 2, "Unknown"); return 4; + case FAMILY_ADMIN_INFOCHANGEREPLY: case FAMILY_ADMIN_ACCNT_INFO_REPL: { guint16 numtlvs, i; @@ -103,11 +116,19 @@ static int dissect_aim_admin(tvbuff_t *t } return offset; case FAMILY_ADMIN_INFOCHANGEREQ: - case FAMILY_ADMIN_INFOCHANGEREPLY: + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_tlv(tvb, pinfo, offset, admin_tree); + } + return offset; case FAMILY_ADMIN_ACCT_CFRM_REQ: - case FAMILY_ADMIN_ACCT_CFRM_REPL: - /* FIXME */ + /* No data */ return 0; + case FAMILY_ADMIN_ACCT_CFRM_REPL: + proto_tree_add_uint(admin_tree, hf_admin_confirm_status, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_tlv(tvb, pinfo, offset, admin_tree); + } + return offset; default: return 0; } @@ -130,6 +151,9 @@ proto_register_aim_admin(void) { &hf_admin_acctinfo_tlvcount, { "TLV Count", "aim.acctinfo.tlvcount", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, }, + { &hf_admin_confirm_status, + { "Confirmation status", "admin.confirm_status", FT_UINT16, BASE_HEX, VALS(confirm_statusses), 0x0, "", HFILL }, + }, }; /* Setup protocol subtree array */ Index: packet-aim-adverts.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-adverts.c,v retrieving revision 1.2 diff -u -3 -p -d -u -r1.2 packet-aim-adverts.c --- packet-aim-adverts.c 23 Mar 2004 18:36:05 -0000 1.2 +++ packet-aim-adverts.c 19 Apr 2004 20:59:20 -0000 @@ -75,7 +75,7 @@ static int dissect_aim_adverts(tvbuff_t break; case FAMILY_ADVERTS_REQUEST: case FAMILY_ADVERTS_DATA: - /* FIXME */ + /* FIXME: */ return 0; } Index: packet-aim-bos.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-bos.c,v retrieving revision 1.1 diff -u -3 -p -d -u -r1.1 packet-aim-bos.c --- packet-aim-bos.c 23 Mar 2004 06:21:16 -0000 1.1 +++ packet-aim-bos.c 19 Apr 2004 20:59:20 -0000 @@ -78,6 +78,9 @@ static const value_string aim_fnac_famil #define CLASS_UNKNOWN400 0x0400 #define CLASS_UNKNOWN800 0x0800 +static const aim_tlv bos_tlvs[] = { + { 0, "Unknown", 0 }, +}; /* Initialize the protocol and registered fields */ static int proto_aim_bos = -1; @@ -138,12 +141,18 @@ proto_tree_add_boolean(entry, hf_aim_bos } return 4; case FAMILY_BOS_RIGHTS: + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_tlv_specific(tvb, pinfo, offset, bos_tree, bos_tlvs); + } + return offset; case FAMILY_BOS_ADD_TO_VISIBLE: case FAMILY_BOS_DEL_FROM_VISIBLE: case FAMILY_BOS_ADD_TO_INVISIBLE: case FAMILY_BOS_DEL_FROM_INVISIBLE: - /* FIXME */ - return 0; + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_buddyname(tvb, pinfo, offset, bos_tree); + } + return offset; default: return 0; Index: packet-aim-buddylist.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-buddylist.c,v retrieving revision 1.1 diff -u -3 -p -d -u -r1.1 packet-aim-buddylist.c --- packet-aim-buddylist.c 23 Mar 2004 06:21:16 -0000 1.1 +++ packet-aim-buddylist.c 19 Apr 2004 20:59:20 -0000 @@ -86,6 +86,14 @@ static int dissect_aim_snac_buddylist(tv guint16 tlv_count = 0; struct aiminfo *aiminfo = pinfo->private_data; int offset = 0; + proto_item *ti; + proto_tree *buddy_tree = NULL; + + if(tree) { + ti = proto_tree_add_text(tree, tvb, 0, -1, "Buddy List Service"); + buddy_tree = proto_item_add_subtree(ti, ett_aim_buddylist); + } + switch(aiminfo->subtype) { @@ -93,15 +101,22 @@ static int dissect_aim_snac_buddylist(tv case FAMILY_BUDDYLIST_WATCHERS_REQ: /* No data */ return 0; - case FAMILY_BUDDYLIST_ERROR: - return dissect_aim_snac_error(tvb, pinfo, offset, tree); - case FAMILY_BUDDYLIST_RIGHTSINFO: - case FAMILY_BUDDYLIST_ADDBUDDY: case FAMILY_BUDDYLIST_REMBUDDY: + case FAMILY_BUDDYLIST_ADDBUDDY: case FAMILY_BUDDYLIST_WATCHERS_REP: + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_buddyname( tvb, pinfo, offset, buddy_tree); + } + return offset; + case FAMILY_BUDDYLIST_ERROR: + return dissect_aim_snac_error(tvb, pinfo, offset, buddy_tree); + case FAMILY_BUDDYLIST_RIGHTSINFO: + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_tlv_buddylist( tvb, pinfo, offset, buddy_tree); + } + return offset; case FAMILY_BUDDYLIST_REJECT: - /* FIXME */ - return 0; + return dissect_aim_buddyname(tvb, pinfo, offset, buddy_tree); case FAMILY_BUDDYLIST_ONCOMING: buddyname_length = aim_get_buddyname( buddyname, tvb, offset, offset + 1 ); @@ -110,25 +125,25 @@ static int dissect_aim_snac_buddylist(tv col_append_fstr(pinfo->cinfo, COL_INFO, ": %s", buddyname); } - if (tree) { - proto_tree_add_text(tree, tvb, offset + 1, buddyname_length, + if (buddy_tree) { + proto_tree_add_text(buddy_tree, tvb, offset + 1, buddyname_length, "Screen Name: %s", buddyname); } offset += buddyname_length + 1; /* Warning level */ - proto_tree_add_item(tree, hf_aim_userinfo_warninglevel, tvb, offset, + proto_tree_add_item(buddy_tree, hf_aim_userinfo_warninglevel, tvb, offset, 2, FALSE); offset += 2; /* TLV Count */ tlv_count = tvb_get_ntohs(tvb, offset); - proto_tree_add_item(tree, hf_aim_userinfo_tlvcount, tvb, offset, + proto_tree_add_item(buddy_tree, hf_aim_userinfo_tlvcount, tvb, offset, 2, FALSE); offset += 2; while (tvb_length_remaining(tvb, offset) > 0) { - offset = dissect_aim_tlv_buddylist(tvb, pinfo, offset, tree); + offset = dissect_aim_tlv_buddylist(tvb, pinfo, offset, buddy_tree); } return offset; @@ -141,20 +156,20 @@ static int dissect_aim_snac_buddylist(tv col_append_fstr(pinfo->cinfo, COL_INFO, ": %s", buddyname); } - if (tree) { - proto_tree_add_text(tree, tvb, offset + 1, buddyname_length, + if (buddy_tree) { + proto_tree_add_text(buddy_tree, tvb, offset + 1, buddyname_length, "Screen Name: %s", buddyname); } offset += buddyname_length + 1; /* Warning level */ - proto_tree_add_item(tree, hf_aim_userinfo_warninglevel, tvb, offset, + proto_tree_add_item(buddy_tree, hf_aim_userinfo_warninglevel, tvb, offset, 2, FALSE); offset += 2; /* TLV Count */ tlv_count = tvb_get_ntohs(tvb, offset); - proto_tree_add_item(tree, hf_aim_userinfo_tlvcount, tvb, offset, + proto_tree_add_item(buddy_tree, hf_aim_userinfo_tlvcount, tvb, offset, 2, FALSE); offset += 2; Index: packet-aim-chat.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-chat.c,v retrieving revision 1.2 diff -u -3 -p -d -u -r1.2 packet-aim-chat.c --- packet-aim-chat.c 23 Mar 2004 18:36:05 -0000 1.2 +++ packet-aim-chat.c 19 Apr 2004 20:59:20 -0000 @@ -82,13 +82,27 @@ static int dissect_aim_snac_chat(tvbuff_ struct aiminfo *aiminfo = pinfo->private_data; char buddyname[MAX_BUDDYNAME_LENGTH + 1]; guchar msg[1000]; + proto_item *ti; + proto_tree *chat_tree = NULL; + + if(tree) { + ti = proto_tree_add_text(tree, tvb, 0, -1, "Chat Service"); + chat_tree = proto_item_add_subtree(ti, ett_aim_chat); + } switch(aiminfo->subtype) { case FAMILY_CHAT_ERROR: - return dissect_aim_snac_error(tvb, pinfo, offset, tree); + return dissect_aim_snac_error(tvb, pinfo, offset, chat_tree); case FAMILY_CHAT_ROOMINFOUPDATE: + /* FIXME */ + return 0; case FAMILY_CHAT_USERJOIN: + while(tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_buddyname(tvb, pinfo, offset, chat_tree); + /* FIXME */ + } + return offset; case FAMILY_CHAT_USERLEAVE: case FAMILY_CHAT_EVIL_REQ: case FAMILY_CHAT_EVIL_REPLY: @@ -114,8 +128,8 @@ static int dissect_aim_snac_chat(tvbuff_ col_append_fstr(pinfo->cinfo, COL_INFO, " -> %s", msg); } - if(tree) { - proto_tree_add_text(tree, tvb, 31, buddyname_length, + if(chat_tree) { + proto_tree_add_text(chat_tree, tvb, 31, buddyname_length, "Screen Name: %s", buddyname); } return tvb_length(tvb); Index: packet-aim-chatnav.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-chatnav.c,v retrieving revision 1.3 diff -u -3 -p -d -u -r1.3 packet-aim-chatnav.c --- packet-aim-chatnav.c 24 Mar 2004 06:36:32 -0000 1.3 +++ packet-aim-chatnav.c 19 Apr 2004 20:59:20 -0000 @@ -72,6 +72,38 @@ static int proto_aim_chatnav = -1; int ett_aim_chatnav = -1; +static int dissect_aim_chatnav(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + struct aiminfo *aiminfo = pinfo->private_data; + + proto_item *ti; + proto_tree *chatnav_tree = NULL; + + if(tree) { + ti = proto_tree_add_text(tree, tvb, 0, -1, "Chat Navigation Service"); + chatnav_tree = proto_item_add_subtree(ti, ett_aim_chatnav); + } + + switch(aiminfo->subtype) { + case FAMILY_CHATNAV_ERROR: + return dissect_aim_snac_error(tvb, pinfo, 0, chatnav_tree); + case FAMILY_CHATNAV_LIMITS_REQ: + /* No data */ + return 0; + case FAMILY_CHATNAV_EXCHANGE_REQ: + case FAMILY_CHATNAV_ROOM_INFO_REQ: + case FAMILY_CHATNAV_ROOMIF_EXT_REQ: + case FAMILY_CHATNAV_MEMBERLIST_REQ: + case FAMILY_CHATNAV_SEARCH_ROOM: + case FAMILY_CHATNAV_CREATE_ROOM: + case FAMILY_CHATNAV_INFO_REPLY: + case FAMILY_CHATNAV_DEFAULT: + /* FIXME */ + return 0; + default: return 0; + } +} + /* Register the protocol with Ethereal */ void proto_register_aim_chatnav(void) @@ -98,11 +130,10 @@ proto_register_aim_chatnav(void) void proto_reg_handoff_aim_chatnav(void) { - /*dissector_handle_t aim_handle;*/ + dissector_handle_t aim_handle; - /* FIXME: dissect - * aim_handle = new_create_dissector_handle(dissect_aim_chatnav, proto_aim_chatnav); - * dissector_add("aim.family", FAMILY_CHAT_NAV, aim_handle); - */ + aim_handle = new_create_dissector_handle(dissect_aim_chatnav, proto_aim_chatnav); + dissector_add("aim.family", FAMILY_CHAT_NAV, aim_handle); + aim_init_family(FAMILY_CHAT_NAV, "Chat Navigation", aim_fnac_family_chatnav); } Index: packet-aim-directory.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-directory.c,v retrieving revision 1.2 diff -u -3 -p -d -u -r1.2 packet-aim-directory.c --- packet-aim-directory.c 23 Mar 2004 18:36:05 -0000 1.2 +++ packet-aim-directory.c 19 Apr 2004 20:59:20 -0000 @@ -57,6 +57,32 @@ static const value_string aim_fnac_famil }; static int proto_aim_directory = -1; +static int ett_aim_directory = -1; + +static int dissect_aim_directory(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + struct aiminfo *aiminfo = pinfo->private_data; + proto_item *ti; + proto_tree *directory_tree = NULL; + + if(tree) { + ti = proto_tree_add_text(tree, tvb, 0, -1, "Directory Service"); + directory_tree = proto_item_add_subtree(ti, ett_aim_directory); + } + + switch(aiminfo->subtype) { + case FAMILY_DIRECTORY_ERROR: + return dissect_aim_snac_error(tvb, pinfo, 0, directory_tree); + case FAMILY_DIRECTORY_INTERESTS_LIST_REQ: + return 0; + case FAMILY_DIRECTORY_SEARCH_USER_REQ: + case FAMILY_DIRECTORY_SEARCH_USER_REPL: + case FAMILY_DIRECTORY_INTERESTS_LIST_REP: + /* FIXME */ + return 0; + } + return 0; +} /* Register the protocol with Ethereal */ void @@ -69,24 +95,23 @@ proto_register_aim_directory(void) };*/ /* Setup protocol subtree array */ -/*FIXME static gint *ett[] = { - };*/ + &ett_aim_directory + }; /* Register the protocol name and description */ proto_aim_directory = proto_register_protocol("AIM Directory Search", "AIM Directory", "aim_dir"); /* Required function calls to register the header fields and subtrees used */ /*FIXME proto_register_field_array(proto_aim_directory, hf, array_length(hf));*/ -/*FIXME - proto_register_subtree_array(ett, array_length(ett));*/ + proto_register_subtree_array(ett, array_length(ett)); } void proto_reg_handoff_aim_directory(void) { -/*FIXME: dissector_handle_t aim_handle; + dissector_handle_t aim_handle; aim_handle = new_create_dissector_handle(dissect_aim_directory, proto_aim_directory); - dissector_add("aim.family", FAMILY_DIRECTORY, aim_handle); */ + dissector_add("aim.family", FAMILY_DIRECTORY, aim_handle); aim_init_family(FAMILY_DIRECTORY, "Directory", aim_fnac_family_directory); } Index: packet-aim-generic.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-generic.c,v retrieving revision 1.1 diff -u -3 -p -d -u -r1.1 packet-aim-generic.c --- packet-aim-generic.c 23 Mar 2004 06:21:16 -0000 1.1 +++ packet-aim-generic.c 19 Apr 2004 20:59:20 -0000 @@ -205,12 +205,14 @@ static int dissect_generic_rateinfo(tvbu guint16 i; proto_item *ti; guint16 numclasses = tvb_get_ntohs(tvb, 0); - proto_tree *classes_tree, *groups_tree, *group_tree; + proto_tree *classes_tree = NULL, *groups_tree, *group_tree; proto_tree_add_uint(tree, hf_generic_rateinfo_numclasses, tvb, 0, 2, numclasses ); offset+=2; - ti = proto_tree_add_text(tree, tvb, offset, 33*numclasses, "Available Rate Classes"); - classes_tree = proto_item_add_subtree(ti, ett_generic_rateinfo_classes); + if(tree) { + ti = proto_tree_add_text(tree, tvb, offset, 33*numclasses, "Available Rate Classes"); + classes_tree = proto_item_add_subtree(ti, ett_generic_rateinfo_classes); + } for(i = 0; i < numclasses; i++) { guint16 myid = tvb_get_ntohs(tvb, offset); @@ -252,35 +254,33 @@ static int dissect_generic_rateinfo(tvbu static int dissect_aim_snac_generic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - int offset = 0; - const char *name; - struct aiminfo *aiminfo = pinfo->private_data; - guint16 n, i; - proto_item *ti = NULL; - proto_tree *gen_tree = NULL; - proto_tree *entry = NULL; + int offset = 0; + const char *name; + struct aiminfo *aiminfo = pinfo->private_data; + guint16 n, i; + proto_item *ti = NULL; + proto_tree *gen_tree = NULL; + proto_tree *entry = NULL; - if(tree) { - ti = proto_tree_add_text(tree, tvb, 0, -1,"AIM Generic Service"); - gen_tree = proto_item_add_subtree(ti, ett_generic); - } + if(tree) { + ti = proto_tree_add_text(tree, tvb, 0, -1,"AIM Generic Service"); + gen_tree = proto_item_add_subtree(ti, ett_generic); + } - if ((name = match_strval(aiminfo->subtype, aim_fnac_family_generic)) != NULL) { - if (ti) - proto_item_append_text(ti, ", %s", name); + if ((name = match_strval(aiminfo->subtype, aim_fnac_family_generic)) != NULL) { + if (ti) proto_item_append_text(ti, ", %s", name); - if (check_col(pinfo->cinfo, COL_INFO)) - col_add_fstr(pinfo->cinfo, COL_INFO, name); - } + if (check_col(pinfo->cinfo, COL_INFO)) col_add_fstr(pinfo->cinfo, COL_INFO, name); + } switch(aiminfo->subtype) { case FAMILY_GENERIC_ERROR: - return dissect_aim_snac_error(tvb, pinfo, 0, gen_tree); + return dissect_aim_snac_error(tvb, pinfo, 0, gen_tree); case FAMILY_GENERIC_CLIENTREADY: - ti = proto_tree_add_text(gen_tree, tvb, 0, -1, "Supported services"); + ti = proto_tree_add_text(gen_tree, tvb, 0, tvb_length_remaining(tvb, 0), "Supported services"); entry = proto_item_add_subtree(ti, ett_generic_clientready); - while(tvb_reported_length_remaining(tvb, offset) > 0) { + while(tvb_length_remaining(tvb, offset) > 0) { guint16 famnum = tvb_get_ntohs(tvb, offset); const char *famname = aim_get_familyname(famnum); proto_tree *subentry; @@ -289,8 +289,8 @@ static int dissect_aim_snac_generic(tvbu subentry = proto_item_add_subtree(ti, ett_generic_clientready_item); - proto_tree_add_text(subentry, tvb, offset, 2, "Version: %u", tvb_get_ntohs(tvb, offset) ); offset += 2; - proto_tree_add_text(subentry, tvb, offset, 4, "DLL Version: %u", tvb_get_ntoh24(tvb, offset) ); offset += 4; + proto_tree_add_text(subentry, tvb, offset, 2, "Version: %d", tvb_get_ntohs(tvb, offset) ); offset += 2; + proto_tree_add_text(subentry, tvb, offset, 4, "DLL Version: %lu", tvb_get_ntoh24(tvb, offset) ); offset += 4; } return offset; case FAMILY_GENERIC_SERVERREADY: @@ -305,7 +305,7 @@ static int dissect_aim_snac_generic(tvbu return offset; case FAMILY_GENERIC_SERVICEREQ: name = aim_get_familyname( tvb_get_ntohs(tvb, offset) ); - proto_tree_add_uint_format(gen_tree, hf_generic_servicereq_service, tvb, offset, 2, tvb_get_ntohs(tvb, offset), "%s (0x%04x)", name?name:"Unknown", tvb_get_ntohs(tvb, offset) ); + proto_tree_add_uint_format(gen_tree, hf_generic_servicereq_service, tvb, offset, 2, tvb_get_ntohs(tvb, offset), "%s (0x%04x)", name?name:"Unknown", tvb_get_ntohs(tvb, offset) ); offset+=2; return offset; case FAMILY_GENERIC_REDIRECT: @@ -336,7 +336,7 @@ static int dissect_aim_snac_generic(tvbu case FAMILY_GENERIC_MOTD: - proto_tree_add_item(gen_tree, hf_generic_motd_motdtype, tvb, offset, + proto_tree_add_item(gen_tree, hf_generic_motd_motdtype, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; while(tvb_length_remaining(tvb, offset) > 0) { @@ -363,7 +363,7 @@ static int dissect_aim_snac_generic(tvbu case FAMILY_GENERIC_CLIENTPAUSEACK: - while(tvb_length_remaining(tvb, offset) > 0) { + while(tvb_length_remaining(tvb, offset) > 0) { guint16 famnum = tvb_get_ntohs(tvb, offset); const char *famname = aim_get_familyname(famnum); proto_tree_add_text(gen_tree, tvb, offset, 4, "Family: %s (0x%x)", famname?famname:"Unknown Family", famnum); @@ -404,8 +404,10 @@ static int dissect_aim_snac_generic(tvbu offset+=4; } return offset; - case FAMILY_GENERIC_SELFINFO: case FAMILY_GENERIC_EVIL: + /* FIXME */ + return offset; + case FAMILY_GENERIC_SELFINFO: case FAMILY_GENERIC_SETIDLE: case FAMILY_GENERIC_SETSTATUS: case FAMILY_GENERIC_WELLKNOWNURL: Index: packet-aim-icq.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-icq.c,v retrieving revision 1.2 diff -u -3 -p -d -u -r1.2 packet-aim-icq.c --- packet-aim-icq.c 23 Mar 2004 18:36:05 -0000 1.2 +++ packet-aim-icq.c 19 Apr 2004 20:59:20 -0000 @@ -57,6 +57,13 @@ static const value_string aim_fnac_famil { 0, NULL } }; +#define TLV_ICQ_META_DATA 0x0001 + +static const aim_tlv icq_tlv[] = { + { TLV_ICQ_META_DATA, "Encapsulated ICQ Meta Data", dissect_aim_tlv_value_bytes }, + { 0, "Unknown", NULL }, +}; + /* Initialize the protocol and registered fields */ static int proto_aim_icq = -1; @@ -72,6 +79,7 @@ static int dissect_aim_icq(tvbuff_t *tvb case FAMILY_ICQ_ERROR: return dissect_aim_snac_error(tvb, pinfo, offset, tree); case FAMILY_ICQ_LOGINREQUEST: + return dissect_aim_tlv_specific(tvb, pinfo, offset, tree, icq_tlv); case FAMILY_ICQ_LOGINRESPONSE: case FAMILY_ICQ_AUTHREQUEST: case FAMILY_ICQ_AUTHRESPONSE: @@ -87,9 +95,8 @@ proto_register_aim_icq(void) { /* Setup list of header fields */ -/*FIXME static hf_register_info hf[] = { - };*/ + }; /* Setup protocol subtree array */ static gint *ett[] = { @@ -100,8 +107,7 @@ proto_register_aim_icq(void) proto_aim_icq = proto_register_protocol("AIM ICQ", "AIM ICQ", "aim_icq"); /* Required function calls to register the header fields and subtrees used */ -/*FIXME - proto_register_field_array(proto_aim_icq, hf, array_length(hf));*/ + proto_register_field_array(proto_aim_icq, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } Index: packet-aim-location.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-location.c,v retrieving revision 1.2 diff -u -3 -p -d -u -r1.2 packet-aim-location.c --- packet-aim-location.c 30 Mar 2004 17:38:45 -0000 1.2 +++ packet-aim-location.c 19 Apr 2004 20:59:20 -0000 @@ -74,11 +74,11 @@ static const value_string aim_fnac_famil #define FAMILY_LOCATION_USERINFO_CAPS 0x0005 static const aim_tlv aim_fnac_family_location_userinfo_tlv[] = { - { FAMILY_LOCATION_USERINFO_INFOENCODING, "Info Msg Encoding", FT_STRING }, - { FAMILY_LOCATION_USERINFO_INFOMSG, "Info Message", FT_STRING }, - { FAMILY_LOCATION_USERINFO_AWAYENCODING, "Away Msg Encoding", FT_STRING }, - { FAMILY_LOCATION_USERINFO_AWAYMSG, "Away Message", FT_STRING }, - { FAMILY_LOCATION_USERINFO_CAPS, "Capabilities", FT_BYTES }, + { FAMILY_LOCATION_USERINFO_INFOENCODING, "Info Msg Encoding", dissect_aim_tlv_value_string}, + { FAMILY_LOCATION_USERINFO_INFOMSG, "Info Message", dissect_aim_tlv_value_string }, + { FAMILY_LOCATION_USERINFO_AWAYENCODING, "Away Msg Encoding", dissect_aim_tlv_value_string }, + { FAMILY_LOCATION_USERINFO_AWAYMSG, "Away Message", dissect_aim_tlv_value_string }, + { FAMILY_LOCATION_USERINFO_CAPS, "Capabilities", dissect_aim_tlv_value_bytes }, { 0, "Unknown", 0 } }; Index: packet-aim-messaging.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-messaging.c,v retrieving revision 1.3 diff -u -3 -p -d -u -r1.3 packet-aim-messaging.c --- packet-aim-messaging.c 2 Apr 2004 07:59:22 -0000 1.3 +++ packet-aim-messaging.c 19 Apr 2004 20:59:20 -0000 @@ -85,19 +85,26 @@ static const value_string aim_fnac_famil #define INCOMING_CH1_TYPING 0x000b static const aim_tlv messaging_incoming_ch1_tlvs[] = { - { INCOMING_CH1_MESSAGE_BLOCK, "Message Block", FT_BYTES }, - { INCOMING_CH1_SERVER_ACK_REQ, "Server Ack Requested", FT_BYTES }, - { INCOMING_CH1_MESSAGE_AUTH_RESP, "Message is Auto Response", FT_BYTES }, - { INCOMING_CH1_MESSAGE_OFFLINE, "Message was received offline", FT_BYTES }, - { INCOMING_CH1_ICON_PRESENT, "Icon present", FT_BYTES }, - { INCOMING_CH1_BUDDY_REQ, "Buddy Req", FT_BYTES }, - { INCOMING_CH1_TYPING, "Non-direct connect typing notification", FT_BYTES }, - { 0, "Unknown", 0 } + { INCOMING_CH1_MESSAGE_BLOCK, "Message Block", dissect_aim_tlv_value_bytes }, + { INCOMING_CH1_SERVER_ACK_REQ, "Server Ack Requested", dissect_aim_tlv_value_bytes }, + { INCOMING_CH1_MESSAGE_AUTH_RESP, "Message is Auto Response", dissect_aim_tlv_value_bytes }, + { INCOMING_CH1_MESSAGE_OFFLINE, "Message was received offline", dissect_aim_tlv_value_bytes }, + { INCOMING_CH1_ICON_PRESENT, "Icon present", dissect_aim_tlv_value_bytes }, + { INCOMING_CH1_BUDDY_REQ, "Buddy Req", dissect_aim_tlv_value_bytes }, + { INCOMING_CH1_TYPING, "Non-direct connect typing notification", dissect_aim_tlv_value_bytes }, + { 0, "Unknown", 0, NULL } }; /* Initialize the protocol and registered fields */ static int proto_aim_messaging = -1; +static int hf_aim_icbm_channel = -1; static int hf_aim_icbm_cookie = -1; +static int hf_aim_icbm_msg_flags = -1; +static int hf_aim_icbm_max_sender_warnlevel = -1; +static int hf_aim_icbm_max_receiver_warnlevel = -1; +static int hf_aim_icbm_max_snac_size = -1; +static int hf_aim_icbm_min_msg_interval = -1; +static int hf_aim_icbm_unknown = -1; static int hf_aim_message_channel_id = -1; static int hf_aim_userinfo_warninglevel = -1; static int hf_aim_userinfo_tlvcount = -1; @@ -110,15 +117,26 @@ static int dissect_aim_messaging(tvbuff_ { guint8 buddyname_length = 0; char buddyname[MAX_BUDDYNAME_LENGTH + 1]; + guint16 tlv_count = 0; guchar msg[1000]; int offset = 0; struct aiminfo *aiminfo = pinfo->private_data; - guint16 tlv_count = 0; + proto_item *ti = NULL; + proto_tree *msg_tree = NULL; + + if(tree) { + ti = proto_tree_add_text(tree, tvb, 0, -1,"AIM Messaging Service"); + msg_tree = proto_item_add_subtree(ti, ett_aim_messaging); + } switch(aiminfo->subtype) { case FAMILY_MESSAGING_ERROR: - return dissect_aim_snac_error(tvb, pinfo, offset, tree); + return dissect_aim_snac_error(tvb, pinfo, offset, msg_tree); + case FAMILY_MESSAGING_RESETICBMPARAM: + case FAMILY_MESSAGING_REQPARAMINFO: + /* No data */ + return 0; case FAMILY_MESSAGING_OUTGOING: /* Unknown */ @@ -139,8 +157,8 @@ static int dissect_aim_messaging(tvbuff_ col_append_fstr(pinfo->cinfo, COL_INFO, " -> %s", msg); } - if(tree) { - proto_tree_add_text(tree, tvb, offset, buddyname_length, + if(msg_tree) { + proto_tree_add_text(msg_tree, tvb, 27, buddyname_length, "Screen Name: %s", buddyname); } @@ -167,9 +185,9 @@ static int dissect_aim_messaging(tvbuff_ col_append_fstr(pinfo->cinfo, COL_INFO, " -> %s", msg); } - - if(tree) { - proto_tree_add_text(tree, tvb, offset, buddyname_length, + + if(msg_tree) { + proto_tree_add_text(msg_tree, tvb, 27, buddyname_length, "Screen Name: %s", buddyname); } @@ -193,9 +211,15 @@ static int dissect_aim_messaging(tvbuff_ return offset; case FAMILY_MESSAGING_SETICBMPARAM: - case FAMILY_MESSAGING_RESETICBMPARAM: - case FAMILY_MESSAGING_REQPARAMINFO: case FAMILY_MESSAGING_PARAMINFO: + proto_tree_add_item(msg_tree, hf_aim_icbm_channel, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + proto_tree_add_item(msg_tree, hf_aim_icbm_msg_flags, tvb, offset, 4, tvb_get_ntoh24(tvb, offset)); offset+=4; + proto_tree_add_item(msg_tree, hf_aim_icbm_max_snac_size, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + proto_tree_add_item(msg_tree, hf_aim_icbm_max_sender_warnlevel, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + proto_tree_add_item(msg_tree, hf_aim_icbm_max_receiver_warnlevel, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + proto_tree_add_item(msg_tree, hf_aim_icbm_min_msg_interval, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + proto_tree_add_item(msg_tree, hf_aim_icbm_unknown, tvb, offset, 2, tvb_get_ntohs(tvb, offset)); offset+=2; + return offset; case FAMILY_MESSAGING_EVIL: case FAMILY_MESSAGING_MISSEDCALL: case FAMILY_MESSAGING_CLIENTAUTORESP: @@ -216,6 +240,27 @@ proto_register_aim_messaging(void) /* Setup list of header fields */ static hf_register_info hf[] = { + { &hf_aim_icbm_channel, + { "Channel to setup", "aim.icbm.channel", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, + }, + { &hf_aim_icbm_msg_flags, + { "Message Flags", "aim.icbm.flags", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }, + }, + { &hf_aim_icbm_max_snac_size, + { "Max SNAC Size", "aim.icbm.max_snac", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, + }, + { &hf_aim_icbm_max_sender_warnlevel, + { "Max sender warn level", "aim.icbm.max_sender_warn-level", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, + }, + { &hf_aim_icbm_max_receiver_warnlevel, + { "max receiver warn level", "aim.icbm.max_receiver_warnlevel", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, + }, + { &hf_aim_icbm_min_msg_interval, + { "Minimum message interval (seconds)", "aim.icbm.min_msg_interval", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, + }, + { &hf_aim_icbm_unknown, + { "Uknown parameter", "aim.icbm.unknown", FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }, + }, { &hf_aim_icbm_cookie, { "ICBM Cookie", "aim.messaging.icbmcookie", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL } }, @@ -238,7 +283,7 @@ proto_register_aim_messaging(void) /* Register the protocol name and description */ proto_aim_messaging = proto_register_protocol("AIM Messaging", "AIM Messaging", "aim_messaging"); - /* Required function calls to register the header fields and subtrees used */ +/* Required function calls to register the header fields and subtrees used */ proto_register_field_array(proto_aim_messaging, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } Index: packet-aim-oft.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-oft.c,v retrieving revision 1.3 diff -u -3 -p -d -u -r1.3 packet-aim-oft.c --- packet-aim-oft.c 24 Mar 2004 06:36:32 -0000 1.3 +++ packet-aim-oft.c 19 Apr 2004 20:59:20 -0000 @@ -51,29 +51,25 @@ proto_register_aim_oft(void) { /* Setup list of header fields */ -/*FIXME - static hf_register_info hf[] = { +/* static hf_register_info hf[] = { };*/ /* Setup protocol subtree array */ -/*FIXME - static gint *ett[] = { +/* static gint *ett[] = { };*/ /* Register the protocol name and description */ proto_aim_oft = proto_register_protocol("AIM OFT", "AIM OFT", "aim_oft"); /* Required function calls to register the header fields and subtrees used */ -/*FIXME - proto_register_field_array(proto_aim_oft, hf, array_length(hf));*/ -/*FIXME +/* proto_register_field_array(proto_aim_oft, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett));*/ } void proto_reg_handoff_aim_oft(void) { - /*dissector_handle_t aim_handle;*/ + dissector_handle_t aim_handle; /* FIXME aim_handle = new_create_dissector_handle(dissect_aim, proto_aim); Index: packet-aim-ssi.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-ssi.c,v retrieving revision 1.1 diff -u -3 -p -d -u -r1.1 packet-aim-ssi.c --- packet-aim-ssi.c 23 Mar 2004 06:21:17 -0000 1.1 +++ packet-aim-ssi.c 19 Apr 2004 20:59:20 -0000 @@ -147,7 +147,29 @@ static int dissect_aim_snac_ssi(tvbuff_t return dissect_aim_snac_error(tvb, pinfo, offset, ssi_tree); case FAMILY_SSI_LIST: return dissect_aim_snac_ssi_list(tvb, pinfo, offset, ssi_tree, aiminfo->subtype); + case FAMILY_SSI_REQRIGHTS: + case FAMILY_SSI_RIGHTSINFO: + case FAMILY_SSI_REQLIST_FIRSTTIME: + case FAMILY_SSI_REQLIST: + case FAMILY_SSI_ACTIVATE: + case FAMILY_SSI_ADD: + case FAMILY_SSI_MOD: + case FAMILY_SSI_DEL: + case FAMILY_SSI_SRVACK: + case FAMILY_SSI_NOLIST: + case FAMILY_SSI_EDITSTART: + case FAMILY_SSI_EDITSTOP: + case FAMILY_SSI_GRANT_FUTURE_AUTH: + case FAMILY_SSI_FUTUR_AUTH_GRANTED: + case FAMILY_SSI_SEND_AUTH_REQ: + case FAMILY_SSI_AUTH_REQ: + case FAMILY_SSI_SEND_AUTH_REPLY: + case FAMILY_SSI_AUTH_REPLY: + case FAMILY_SSI_WAS_ADDED: + /* FIXME */ + return 0; + default: return 0; } Index: packet-aim-translate.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim-translate.c,v retrieving revision 1.3 diff -u -3 -p -d -u -r1.3 packet-aim-translate.c --- packet-aim-translate.c 24 Mar 2004 06:36:32 -0000 1.3 +++ packet-aim-translate.c 19 Apr 2004 20:59:20 -0000 @@ -60,6 +60,12 @@ static int proto_aim_translate = -1; /* Initialize the subtree pointers */ static gint ett_aim_translate = -1; +static int dissect_aim_translate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { + + /* FIXME */ + return 0; +} + /* Register the protocol with Ethereal */ void proto_register_aim_translate(void) @@ -86,8 +92,8 @@ proto_register_aim_translate(void) void proto_reg_handoff_aim_translate(void) { - /*dissector_handle_t aim_handle;*/ -/*FIXME aim_handle = new_create_dissector_handle(dissect_aim, proto_aim); - dissector_add("tcp.port", TCP_PORT_AIM, aim_handle);*/ + dissector_handle_t aim_handle; + aim_handle = new_create_dissector_handle(dissect_aim_translate, proto_aim_translate); + dissector_add("aim.family", FAMILY_TRANSLATE, aim_handle); aim_init_family(FAMILY_TRANSLATE, "Translate", aim_fnac_family_translate); } Index: packet-aim.c =================================================================== RCS file: /cvsroot/ethereal/packet-aim.c,v retrieving revision 1.37 diff -u -3 -p -d -u -r1.37 packet-aim.c --- packet-aim.c 11 Apr 2004 20:57:10 -0000 1.37 +++ packet-aim.c 19 Apr 2004 20:59:20 -0000 @@ -147,35 +147,34 @@ static const value_string aim_snac_error #define AIM_TLV_CLIENTUSESSI 0x004a const aim_tlv global_tlvs[] = { - { AIM_TLV_SCREEN_NAME, "Screen name", FT_STRING }, - { AIM_TLV_ROASTED_PASSWORD, "Roasted password array", FT_BYTES }, - { AIM_TLV_CLIENT_ID_STRING, "Client id string (name, version)", FT_STRING }, - { AIM_TLV_CLIENT_ID, "Client id number", FT_UINT16 }, - { AIM_TLV_CLIENT_MAJOR_VERSION, "Client major version", FT_UINT16 }, - { AIM_TLV_CLIENT_MINOR_VERSION, "Client minor version", FT_UINT16 }, - { AIM_TLV_CLIENT_LESSER_VERSION, "Client lesser version", FT_UINT16 }, - { AIM_TLV_CLIENT_BUILD_NUMBER, "Client build number", FT_UINT16 }, - { AIM_TLV_CLIENT_DISTRIBUTION_NUM, "Client distribution number", FT_UINT16 }, - { AIM_TLV_CLIENT_LANGUAGE, "Client language", FT_STRING }, - { AIM_TLV_CLIENT_COUNTRY, "Client country", FT_STRING }, - { AIM_TLV_BOS_SERVER_STRING, "BOS server string", FT_STRING }, - { AIM_TLV_AUTH_COOKIE, "Authorization cookie", FT_BYTES }, - { AIM_TLV_ERRORURL, "Error URL", FT_STRING }, - { AIM_TLV_ERRORCODE, "Error Code", FT_UINT16 }, - { AIM_TLV_EMAILADDR, "Account Email address", FT_STRING }, - { AIM_TLV_REGSTATUS, "Registration Status", FT_UINT16 }, - { AIM_TLV_PASSWORD, "Password Hash", FT_BYTES }, - { AIM_TLV_LATESTBETABUILD, "Latest Beta Build", FT_UINT32 }, - { AIM_TLV_LATESTBETAURL, "Latest Beta URL", FT_STRING }, - { AIM_TLV_LATESTBETAINFO, "Latest Beta Info", FT_STRING }, - { AIM_TLV_LATESTBETANAME, "Latest Beta Name", FT_STRING }, - { AIM_TLV_LATESTRELEASEBUILD, "Latest Release Build", FT_UINT32 }, - { AIM_TLV_LATESTRELEASEURL, "Latest Release URL", FT_STRING }, - { AIM_TLV_LATESTRELEASEINFO, "Latest Release Info", FT_STRING }, - { AIM_TLV_LATESTRELEASENAME, "Latest Release Name", FT_STRING }, - { AIM_TLV_CLIENTUSESSI, "Use SSI", FT_UINT8 }, - { AIM_TLV_GENERIC_SERVICE_ID, "Service (Family) ID", FT_UINT16 }, - { 0, "Unknown", 0 }, + { AIM_TLV_SCREEN_NAME, "Screen name", dissect_aim_tlv_value_string }, + { AIM_TLV_ROASTED_PASSWORD, "Roasted password array", dissect_aim_tlv_value_bytes }, + { AIM_TLV_CLIENT_ID_STRING, "Client id string (name, version)", dissect_aim_tlv_value_string }, + { AIM_TLV_CLIENT_ID, "Client id number", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_CLIENT_MAJOR_VERSION, "Client major version", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_CLIENT_MINOR_VERSION, "Client minor version", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_CLIENT_LESSER_VERSION, "Client lesser version", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_CLIENT_BUILD_NUMBER, "Client build number", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_CLIENT_DISTRIBUTION_NUM, "Client distribution number", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_CLIENT_LANGUAGE, "Client language", dissect_aim_tlv_value_string }, + { AIM_TLV_CLIENT_COUNTRY, "Client country", dissect_aim_tlv_value_string }, + { AIM_TLV_BOS_SERVER_STRING, "BOS server string", dissect_aim_tlv_value_string }, + { AIM_TLV_AUTH_COOKIE, "Authorization cookie", dissect_aim_tlv_value_bytes }, + { AIM_TLV_ERRORURL, "Error URL", dissect_aim_tlv_value_string }, + { AIM_TLV_ERRORCODE, "Error Code", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_EMAILADDR, "Account Email address", dissect_aim_tlv_value_string }, + { AIM_TLV_REGSTATUS, "Registration Status", dissect_aim_tlv_value_uint16 }, + { AIM_TLV_LATESTBETABUILD, "Latest Beta Build", dissect_aim_tlv_value_uint32 }, + { AIM_TLV_LATESTBETAURL, "Latest Beta URL", dissect_aim_tlv_value_string }, + { AIM_TLV_LATESTBETAINFO, "Latest Beta Info", dissect_aim_tlv_value_string }, + { AIM_TLV_LATESTBETANAME, "Latest Beta Name", dissect_aim_tlv_value_string }, + { AIM_TLV_LATESTRELEASEBUILD, "Latest Release Build", dissect_aim_tlv_value_uint32 }, + { AIM_TLV_LATESTRELEASEURL, "Latest Release URL", dissect_aim_tlv_value_string }, + { AIM_TLV_LATESTRELEASEINFO, "Latest Release Info", dissect_aim_tlv_value_string }, + { AIM_TLV_LATESTRELEASENAME, "Latest Release Name", dissect_aim_tlv_value_string }, + { AIM_TLV_CLIENTUSESSI, "Use SSI", dissect_aim_tlv_value_uint8 }, + { AIM_TLV_GENERIC_SERVICE_ID, "Service (Family) ID", dissect_aim_tlv_value_uint16 }, + { 0, "Unknown", NULL }, }; @@ -192,18 +191,18 @@ const aim_tlv global_tlvs[] = { #define FAMILY_BUDDYLIST_ICQSESSIONLEN 0x0010 static const aim_tlv buddylist_tlvs[] = { - { FAMILY_BUDDYLIST_USERFLAGS, "User flags", FT_UINT16 }, - { FAMILY_BUDDYLIST_MEMBERSINCE, "Member since date", FT_UINT32 }, - { FAMILY_BUDDYLIST_ONSINCE, "Online since", FT_UINT32 }, - { FAMILY_BUDDYLIST_IDLETIME, "Idle time (sec)", FT_UINT16 }, - { FAMILY_BUDDYLIST_ICQSTATUS, "ICQ Online status", FT_UINT16 }, - { FAMILY_BUDDYLIST_ICQIPADDR, "ICQ User IP Address", FT_IPv4 }, - { FAMILY_BUDDYLIST_ICQSTUFF, "ICQ Info", FT_BYTES }, - { FAMILY_BUDDYLIST_CAPINFO, "Capability Info", FT_BYTES }, - { FAMILY_BUDDYLIST_UNKNOWN, "Unknown", FT_UINT16 }, - { FAMILY_BUDDYLIST_SESSIONLEN, "Session Length (sec)", FT_UINT32 }, - { FAMILY_BUDDYLIST_SESSIONLEN, "ICQ Session Length (sec)", FT_UINT32 }, - { 0, "Unknown", 0 } + { FAMILY_BUDDYLIST_USERFLAGS, "User flags", dissect_aim_tlv_value_uint16 }, + { FAMILY_BUDDYLIST_MEMBERSINCE, "Member since date", dissect_aim_tlv_value_uint32 }, + { FAMILY_BUDDYLIST_ONSINCE, "Online since", dissect_aim_tlv_value_uint32 }, + { FAMILY_BUDDYLIST_IDLETIME, "Idle time (sec)", dissect_aim_tlv_value_uint16 }, + { FAMILY_BUDDYLIST_ICQSTATUS, "ICQ Online status", dissect_aim_tlv_value_uint16 }, + { FAMILY_BUDDYLIST_ICQIPADDR, "ICQ User IP Address", dissect_aim_tlv_value_ipv4 }, + { FAMILY_BUDDYLIST_ICQSTUFF, "ICQ Info", dissect_aim_tlv_value_bytes }, + { FAMILY_BUDDYLIST_CAPINFO, "Capability Info", dissect_aim_tlv_value_bytes }, + { FAMILY_BUDDYLIST_UNKNOWN, "Unknown", dissect_aim_tlv_value_uint16 }, + { FAMILY_BUDDYLIST_SESSIONLEN, "Session Length (sec)", dissect_aim_tlv_value_uint32 }, + { FAMILY_BUDDYLIST_SESSIONLEN, "ICQ Session Length (sec)", dissect_aim_tlv_value_uint32 }, + { 0, "Unknown", NULL } }; struct aim_family { @@ -217,8 +216,8 @@ static GList *families = NULL; #define FAMILY_GENERIC_MOTD_MOTD 0x000B static const aim_tlv aim_fnac_family_generic_motd_tlv[] = { - { FAMILY_GENERIC_MOTD_MOTD, "Message of the day message", FT_STRING }, - { 0, "Unknown", 0 } + { FAMILY_GENERIC_MOTD_MOTD, "Message of the day message", dissect_aim_tlv_value_string }, + { 0, "Unknown", NULL } }; #define FAMILY_GENERIC_REDIRECT_SERVER_ADDRESS 0x0005 @@ -226,10 +225,10 @@ static const aim_tlv aim_fnac_family_gen #define FAMILY_GENERIC_REDIRECT_FAMILY_ID 0x000D static const aim_tlv aim_fnac_family_generic_redirect_tlv[] = { - { FAMILY_GENERIC_REDIRECT_SERVER_ADDRESS, "Server address and (optional) port", FT_STRING }, - { FAMILY_GENERIC_REDIRECT_AUTH_COOKIE, "Authorization cookie", FT_STRING }, - { FAMILY_GENERIC_REDIRECT_FAMILY_ID, "Family ID", FT_UINT16 }, - { 0, "Unknown", 0 } + { FAMILY_GENERIC_REDIRECT_SERVER_ADDRESS, "Server address and (optional) port", dissect_aim_tlv_value_string }, + { FAMILY_GENERIC_REDIRECT_AUTH_COOKIE, "Authorization cookie", dissect_aim_tlv_value_string }, + { FAMILY_GENERIC_REDIRECT_FAMILY_ID, "Family ID", dissect_aim_tlv_value_uint16 }, + { 0, "Unknown", NULL } }; #define FAMILY_GENERIC_MOTD_MOTDTYPE_MDT_UPGRADE 0x0001 @@ -253,7 +252,7 @@ static void dissect_aim_pdu(tvbuff_t *tv static void dissect_aim_newconn(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree); static void dissect_aim_snac(tvbuff_t *tvb, packet_info *pinfo, - int offset, proto_tree *tree); + int offset, proto_tree *tree, proto_tree *root_tree); static void dissect_aim_flap_err(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree); static void dissect_aim_keep_alive(tvbuff_t *tvb, packet_info *pinfo, @@ -288,6 +287,7 @@ static int hf_aim_authcookie = -1; /* Initialize the subtree pointers */ static gint ett_aim = -1; +static gint ett_aim_buddyname= -1; static gint ett_aim_fnac = -1; static gint ett_aim_tlv = -1; @@ -374,7 +374,7 @@ static void dissect_aim_pdu(tvbuff_t *tv dissect_aim_newconn(tvb, pinfo, offset, aim_tree); break; case CHANNEL_SNAC_DATA: - dissect_aim_snac(tvb, pinfo, offset, aim_tree); + dissect_aim_snac(tvb, pinfo, offset, aim_tree, tree); break; case CHANNEL_FLAP_ERR: dissect_aim_flap_err(tvb, pinfo, offset, aim_tree); @@ -550,7 +550,7 @@ int dissect_aim_snac_error(tvbuff_t *tvb } static void dissect_aim_snac(tvbuff_t *tvb, packet_info *pinfo, - int offset, proto_tree *aim_tree) + int offset, proto_tree *aim_tree, proto_tree *root_tree) { guint16 family; guint16 subtype; @@ -614,7 +614,7 @@ static void dissect_aim_snac(tvbuff_t *t else col_append_fstr(pinfo->cinfo, COL_INFO, ", Subtype: 0x%04x", subtype); } - if(tvb_length_remaining(tvb,offset) == 0 || !dissector_try_port(subdissector_table, family, subtvb, pinfo, aim_tree)) { + if(tvb_length_remaining(tvb,offset) == 0 || !dissector_try_port(subdissector_table, family, subtvb, pinfo, root_tree)) { /* Show the undissected payload */ if (tvb_length_remaining(tvb, offset) > 0) proto_tree_add_item(aim_tree, hf_aim_data, tvb, offset, -1, FALSE); @@ -669,6 +669,29 @@ static void dissect_aim_unknown_channel( proto_tree_add_item(tree, hf_aim_data, tvb, offset, -1, FALSE); } +int dissect_aim_buddyname(tvbuff_t *tvb, packet_info *pinfo _U_, int offset, + proto_tree *tree) +{ + guint8 buddyname_length = 0; + char *buddyname; + proto_item *ti = NULL; + proto_tree *buddy_tree = NULL; + + buddyname_length = tvb_get_guint8(tvb, offset); + offset++; + buddyname = tvb_get_string(tvb, offset, buddyname_length); + + if(tree) { + ti = proto_tree_add_text(tree, tvb, offset-1, 1+buddyname_length,"Buddy: %s", buddyname); + buddy_tree = proto_item_add_subtree(ti, ett_aim_buddyname); + } + + proto_tree_add_item(buddy_tree, hf_aim_buddyname_len, tvb, offset-1, 1, FALSE); + proto_tree_add_item(buddy_tree, hf_aim_buddyname, tvb, offset, buddyname_length, FALSE); + return offset+buddyname_length; +} + + int dissect_aim_tlv(tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree) @@ -684,6 +707,45 @@ int dissect_aim_tlv_buddylist(tvbuff_t * return dissect_aim_tlv_specific(tvb, pinfo, offset, tree, buddylist_tlvs); } +int dissect_aim_tlv_value_string (proto_item *ti, guint16 valueid _U_, tvbuff_t *tvb) +{ + guint8 *buf; + buf = tvb_get_string(tvb, 0, tvb_length(tvb)); + proto_item_set_text(ti, "Value: %s", buf); + g_free(buf); + return tvb_length(tvb); +} + +int dissect_aim_tlv_value_bytes (proto_item *ti, guint16 valueid, tvbuff_t *tvb) +{ + return tvb_length(tvb); +} + +int dissect_aim_tlv_value_uint8 (proto_item *ti, guint16 valueid _U_, tvbuff_t *tvb){ + guint8 value8 = tvb_get_guint8(tvb, 0); + proto_item_set_text(ti, "Value: %d", value8); + return 1; +} + +int dissect_aim_tlv_value_uint16 (proto_item *ti, guint16 valueid _U_, tvbuff_t *tvb){ + guint16 value16 = tvb_get_ntohs(tvb, 0); + proto_item_set_text(ti, "Value: %d", value16); + return 2; +} + +int dissect_aim_tlv_value_ipv4 (proto_item *ti, guint16 valueid, tvbuff_t *tvb){ + /* FIXME: Somewhat more readable format ? */ + guint32 value32 = tvb_get_ntoh24(tvb, 0); + proto_item_set_text(ti, "Value: %d", value32); + return 4; +} + +int dissect_aim_tlv_value_uint32 (proto_item *ti, guint16 valueid _U_, tvbuff_t *tvb){ + guint32 value32 = tvb_get_ntoh24(tvb, 0); + proto_item_set_text(ti, "Value: %d", value32); + return 4; +} + /* Dissect a TLV value */ int dissect_aim_tlv_specific(tvbuff_t *tvb, packet_info *pinfo _U_, int offset, proto_tree *tree, const aim_tlv *tlv) @@ -695,8 +757,6 @@ int dissect_aim_tlv_specific(tvbuff_t *t proto_item *ti1; proto_tree *tlv_tree; int orig_offset; - guint16 value16; - guint32 value32; /* Record the starting offset so we can reuse it at the second pass */ orig_offset = offset; @@ -726,29 +786,7 @@ int dissect_aim_tlv_specific(tvbuff_t *t if (tree) { offset = orig_offset; - /* Show the info in the top of the tree if it's one of the standard - data types */ - if (tmp[i].datatype == FT_STRING && length > 0) { - guint8 *buf; - buf = tvb_get_string(tvb, offset + 4, length); - ti1 = proto_tree_add_text(tree, tvb, offset, length + 4, - "%s: %s", tmp[i].desc, buf); - g_free(buf); - } - else if (tmp[i].datatype == FT_UINT16) { - value16 = tvb_get_ntohs(tvb, offset + 4); - ti1 = proto_tree_add_text(tree, tvb, offset, length + 4, - "%s: %d", tmp[i].desc, value16); - } - else if (tmp[i].datatype == FT_UINT32) { - value32 = tvb_get_ntohl(tvb, offset + 4); - ti1 = proto_tree_add_text(tree, tvb, offset, length + 4, - "%s: %d", tmp[i].desc, value32); - } - else { - ti1 = proto_tree_add_text(tree, tvb, offset, length + 4, - "%s", tmp[i].desc); - } + ti1 = proto_tree_add_text(tree, tvb, offset, length, "TLV: %s", tmp[i].desc); tlv_tree = proto_item_add_subtree(ti1, ett_aim_tlv); @@ -762,6 +800,11 @@ int dissect_aim_tlv_specific(tvbuff_t *t ti1 = proto_tree_add_text(tlv_tree, tvb, offset, length, "Value"); + + if (tmp[i].dissector) { + tmp[i].dissector(ti1, valueid, tvb_new_subset(tvb, offset, length, length)); + } + offset += length; } @@ -839,6 +882,7 @@ proto_register_aim(void) &ett_aim, &ett_aim_fnac, &ett_aim_tlv, + &ett_aim_buddyname }; module_t *aim_module; Index: packet-aim.h =================================================================== RCS file: /cvsroot/ethereal/packet-aim.h,v retrieving revision 1.1 diff -u -3 -p -d -u -r1.1 packet-aim.h --- packet-aim.h 23 Mar 2004 06:21:17 -0000 1.1 +++ packet-aim.h 19 Apr 2004 20:59:20 -0000 @@ -1,7 +1,7 @@ -/* packet-aim.h +/* packet-tcp.h * Copyright 2004, Jelmer Vernooij <jelmer@xxxxxxxxx> * - * $Id: packet-aim.h,v 1.1 2004/03/23 06:21:17 guy Exp $ + * $Id: packet-tcp.h,v 1.21 2003/12/30 00:03:48 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@xxxxxxxxxxxx> @@ -30,7 +30,7 @@ typedef struct _aim_tlv { guint16 valueid; char *desc; - int datatype; + int (*dissector) (proto_item *ti, guint16 value_id, tvbuff_t *tvb); } aim_tlv; struct aiminfo { @@ -41,6 +41,7 @@ struct aiminfo { void aim_init_family(guint16 family, const char *name, const value_string *subtypes); +int dissect_aim_buddyname(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *tree); void aim_get_message( guchar *msg, tvbuff_t *tvb, int msg_offset, int msg_length); int aim_get_buddyname( char *name, tvbuff_t *tvb, int len_offset, int name_offset); @@ -59,5 +60,11 @@ int dissect_aim_tlv_specific(tvbuff_t *t const char *aim_get_familyname( guint16 family ); const char *aim_get_subtypename( guint16 family, guint16 subtype); +int dissect_aim_tlv_value_string(proto_item *ti, guint16, tvbuff_t *); +int dissect_aim_tlv_value_uint8(proto_item *ti, guint16, tvbuff_t *); +int dissect_aim_tlv_value_uint16(proto_item *ti, guint16, tvbuff_t *); +int dissect_aim_tlv_value_uint32(proto_item *ti, guint16, tvbuff_t *); +int dissect_aim_tlv_value_bytes(proto_item *ti, guint16, tvbuff_t *); +int dissect_aim_tlv_value_ipv4(proto_item *ti, guint16, tvbuff_t *); #endif
- Prev by Date: [Ethereal-dev] Microsoft Protocols
- Next by Date: Re: [Ethereal-dev] help: new dissector debugging questions
- Previous by thread: Re: [Ethereal-dev] Microsoft Protocols
- Next by thread: [Ethereal-dev] [PATCH] More AIM updates
- Index(es):