diff options
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-edonkey.c | 162 | ||||
-rw-r--r-- | epan/dissectors/packet-edonkey.h | 14 |
2 files changed, 149 insertions, 27 deletions
diff --git a/epan/dissectors/packet-edonkey.c b/epan/dissectors/packet-edonkey.c index 02718c4dd7..b18b9f9785 100644 --- a/epan/dissectors/packet-edonkey.c +++ b/epan/dissectors/packet-edonkey.c @@ -213,6 +213,7 @@ static const value_string edonkey_special_tags[] = { { EDONKEY_STAG_AVAILABILITY, "Availability" }, { EDONKEY_STAG_QTIME, "Queue Time" }, { EDONKEY_STAG_PARTS, "Parts" }, + { EDONKEY_STAG_MOD_VERSION, "Mod Version" }, { EMULE_STAG_COMPRESSION, "Compression" }, { EMULE_STAG_UDP_CLIENT_PORT, "UDP Client Port" }, { EMULE_STAG_UDP_VERSION, "UDP Version" }, @@ -220,6 +221,13 @@ static const value_string edonkey_special_tags[] = { { EMULE_STAG_COMMENTS, "Comments" }, { EMULE_STAG_EXTENDED_REQUEST, "Extended Request" }, { EMULE_STAG_COMPATIBLE_CLIENT, "Compatible Client" }, + { EMULE_STAG_COMPAT_OPTIONS1, "Compatible Options" }, + { EMULE_STAG_UDPPORTS, "UDP Ports" }, + { EMULE_STAG_MISCOPTIONS1, "Misc Options 1" }, + { EMULE_STAG_VERSION, "eMule Version" }, + { EMULE_STAG_BUDDYIP, "Buddy IP" }, + { EMULE_STAG_BUDDYUDP, "Buddy UDP" }, + { EMULE_STAG_MISCOPTIONS2, "Misc Options 2" }, { 0, NULL } }; @@ -324,21 +332,29 @@ static int dissect_edonkey_metatag(tvbuff_t *tvb, packet_info *pinfo _U_, { /* <Meta Tag> ::= <Tag Type (guint8)> <Tag Name> <Tag> */ /* <Tag Name> ::= <Tag Name Size (guint16)> <Special Tag> || <String> */ + /* <Tag Name> ::= <Special Tag> iff Tag Type had the top bit set */ proto_item *ti; proto_tree *metatag_tree; - guint8 tag_type, special_tagtype; - guint16 tag_name_size, string_length; - guint32 tag_length, tag_value_guint32; + guint8 real_tag_type, tag_type, special_tagtype, tag_value_guint8; + guint16 tag_name_size, string_length, array_length, tag_value_guint16; + guint32 tag_length, blob_length, tag_value_guint32; int tag_offset; - tag_type = tvb_get_guint8(tvb, offset); - tag_name_size = tvb_get_letohs(tvb, offset+1); - special_tagtype = tvb_get_guint8(tvb, offset+3); - - tag_length = 3 + tag_name_size; + real_tag_type = tag_type = tvb_get_guint8(tvb, offset); + if (tag_type & EDONKEY_MTAG_SHORTNAME) { + real_tag_type &= ~EDONKEY_MTAG_SHORTNAME; + tag_name_size = 1; + special_tagtype = tvb_get_guint8(tvb, offset+1); + tag_length = 2; + } else { + tag_name_size = tvb_get_letohs(tvb, offset+1); + special_tagtype = tvb_get_guint8(tvb, offset+3); + tag_length = 3 + tag_name_size; + } + tag_offset = offset + tag_length; - switch (tag_type) + switch (real_tag_type) { case EDONKEY_MTAG_HASH: /* <Tag> ::= HASH */ @@ -346,20 +362,22 @@ static int dissect_edonkey_metatag(tvbuff_t *tvb, packet_info *pinfo _U_, ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); - proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); - edonkey_tree_add_metatag_name(metatag_tree, tvb, offset+3, tag_name_size, special_tagtype); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); proto_tree_add_item(metatag_tree, hf_edonkey_hash, tvb, tag_offset, 16, FALSE); break; case EDONKEY_MTAG_STRING: - /* <Tag> ::= <String> */ + /* <Tag> ::= <Length (guint16)> <String> */ string_length = tvb_get_letohs(tvb, tag_offset); tag_length += 2+string_length; ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); - proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); - edonkey_tree_add_metatag_name(metatag_tree, tvb, offset+3, tag_name_size, special_tagtype); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); proto_tree_add_uint(metatag_tree, hf_edonkey_string_length, tvb, tag_offset, 2, string_length); proto_tree_add_item(metatag_tree, hf_edonkey_string, tvb, tag_offset+2, string_length, FALSE); break; @@ -370,8 +388,9 @@ static int dissect_edonkey_metatag(tvbuff_t *tvb, packet_info *pinfo _U_, ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); - proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); - edonkey_tree_add_metatag_name(metatag_tree, tvb, offset+3, tag_name_size, special_tagtype); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); if (edonkey_metatag_name_get_type(tvb, offset+3, tag_name_size, special_tagtype) == EDONKEY_STAG_IP) { proto_tree_add_item(metatag_tree, hf_edonkey_ip, tvb, tag_offset, 4, FALSE); } @@ -387,21 +406,110 @@ static int dissect_edonkey_metatag(tvbuff_t *tvb, packet_info *pinfo _U_, ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); - proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); - edonkey_tree_add_metatag_name(metatag_tree, tvb, offset+3, tag_name_size, special_tagtype); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); break; - case EDONKEY_MTAG_BOOL: /* <Tag> ::= Boolean ?? bytes*/ - case EDONKEY_MTAG_BOOL_ARRAY: /* <Tag> ::= ?? */ - case EDONKEY_MTAG_BLOB: /* <Tag> ::= ?? */ - case EDONKEY_MTAG_UNKNOWN: - default: - /* Unknown tag type - actual tag length is also unknown */ + case EDONKEY_MTAG_WORD: + /* <Tag> ::= guint16 */ + tag_length += 2; + ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); + metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + { + tag_value_guint16 = tvb_get_letohs(tvb, tag_offset); + proto_tree_add_text(metatag_tree, tvb, tag_offset, 2, "Meta Tag Value: %u", tag_value_guint16); + } + break; + + case EDONKEY_MTAG_BYTE: + /* <Tag> ::= guint8 */ + tag_length += 1; + ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); + metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + { + tag_value_guint8 = tvb_get_guint8(tvb, tag_offset); + proto_tree_add_text(metatag_tree, tvb, tag_offset, 1, "Meta Tag Value: %u", tag_value_guint8); + } + break; + + case EDONKEY_MTAG_BOOL: + /* <Tag> ::= <Bool (guint8)> */ + tag_length += 1; ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); - proto_tree_add_text(metatag_tree, tvb, offset, 1, "Unknown Meta Tag Type (0x%02x)", tag_type); - proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); - edonkey_tree_add_metatag_name(metatag_tree, tvb, offset+3, tag_name_size, special_tagtype); + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + { + tag_value_guint8 = tvb_get_guint8(tvb, tag_offset); + proto_tree_add_text(metatag_tree, tvb, tag_offset, 1, "Meta Tag Value: %u", tag_value_guint8); + } + break; + + case EDONKEY_MTAG_BOOL_ARRAY: + /* <Tag> ::= <Length (guint16)> <BoolArray> */ + array_length = tvb_get_letohs(tvb, tag_offset); + // This is allegedly what the protocol uses, rather than the correct value of (array_length+7)/8 + // Therefore an extra unused byte is transmitted is the array is a multiple of 8 long + tag_length += 2+(array_length/8)+1; + ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); + metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + proto_tree_add_text(metatag_tree, tvb, tag_offset, 2, "Booleann Array Length: %u", array_length); + break; + + case EDONKEY_MTAG_BLOB: + /* <Tag> ::= <Length (guint32)> <BLOB> */ + blob_length = tvb_get_letohl(tvb, tag_offset); + tag_length += 4+blob_length; + ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); + metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); + if (tag_type==real_tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + proto_tree_add_text(metatag_tree, tvb, tag_offset, 2, "BLOB Length: %u", blob_length); + break; + + case EDONKEY_MTAG_BSOB: + /* This is possibly a Binary Small OBject, like a BLOB but with an 8 or 16-bit length field */ + /* That's a complete guess though, so don't handle it yet. */ + case EDONKEY_MTAG_UNKNOWN: + default: + if (real_tag_type>=EDONKEY_MTAG_STR1 && real_tag_type<=EDONKEY_MTAG_STR16) { + /* <Tag> ::= <String> */ + string_length = real_tag_type-EDONKEY_MTAG_STR1+1; + tag_length += string_length; + ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); + metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_type, tvb, offset, 1, tag_type); + if (real_tag_type==tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + proto_tree_add_item(metatag_tree, hf_edonkey_string, tvb, tag_offset, string_length, FALSE); + + } else { + /* Unknown tag type - actual tag length is also unknown */ + ti = proto_tree_add_item(tree, hf_edonkey_metatag, tvb, offset, tag_length, FALSE); + metatag_tree = proto_item_add_subtree(ti, ett_edonkey_metatag); + proto_tree_add_text(metatag_tree, tvb, offset, 1, "Unknown Meta Tag Type (0x%02x)", tag_type); + if (real_tag_type==tag_type) + proto_tree_add_uint(metatag_tree, hf_edonkey_metatag_namesize, tvb, offset+1, 2, tag_name_size); + edonkey_tree_add_metatag_name(metatag_tree, tvb, tag_offset-tag_name_size, tag_name_size, special_tagtype); + } break; } diff --git a/epan/dissectors/packet-edonkey.h b/epan/dissectors/packet-edonkey.h index 21bb2e6c60..55cc022aad 100644 --- a/epan/dissectors/packet-edonkey.h +++ b/epan/dissectors/packet-edonkey.h @@ -157,6 +157,12 @@ void proto_register_edonkey(void); #define EDONKEY_MTAG_BOOL 0x05 #define EDONKEY_MTAG_BOOL_ARRAY 0x06 #define EDONKEY_MTAG_BLOB 0x07 +#define EDONKEY_MTAG_WORD 0x08 +#define EDONKEY_MTAG_BYTE 0x09 +#define EDONKEY_MTAG_BSOB 0x0a +#define EDONKEY_MTAG_STR1 0x11 +#define EDONKEY_MTAG_STR16 0x20 +#define EDONKEY_MTAG_SHORTNAME 0x80 /* EDONKEY SPECIAL TAGS */ #define EDONKEY_STAG_UNKNOWN 0x00 @@ -183,6 +189,7 @@ void proto_register_edonkey(void); #define EDONKEY_STAG_AVAILABILITY 0x15 #define EDONKEY_STAG_QTIME 0x16 #define EDONKEY_STAG_PARTS 0x17 +#define EDONKEY_STAG_MOD_VERSION 0x55 /* EMULE SPECIAL TAGS */ #define EMULE_STAG_COMPRESSION 0x20 @@ -192,6 +199,13 @@ void proto_register_edonkey(void); #define EMULE_STAG_COMMENTS 0x24 #define EMULE_STAG_EXTENDED_REQUEST 0x25 #define EMULE_STAG_COMPATIBLE_CLIENT 0x26 +#define EMULE_STAG_COMPAT_OPTIONS1 0xef +#define EMULE_STAG_UDPPORTS 0xf9 +#define EMULE_STAG_MISCOPTIONS1 0xfa +#define EMULE_STAG_VERSION 0xfb +#define EMULE_STAG_BUDDYIP 0xfc +#define EMULE_STAG_BUDDYUDP 0xfd +#define EMULE_STAG_MISCOPTIONS2 0xfe /* EDONKEY SEARCH TYPES */ #define EDONKEY_SEARCH_BOOL 0x00 |