diff options
author | Jeff Morriss <jeff.morriss@ulticom.com> | 2009-10-07 19:46:28 +0000 |
---|---|---|
committer | Jeff Morriss <jeff.morriss@ulticom.com> | 2009-10-07 19:46:28 +0000 |
commit | 1bb31483502e433711a2a4faaaf500194012ba36 (patch) | |
tree | d7db3426c9f594569ce5e404c4579e200f214ed5 /epan/dissectors/packet-aim.c | |
parent | 1060fd1edeebee87ebce7356e4b01ca4c3afb534 (diff) | |
download | wireshark-1bb31483502e433711a2a4faaaf500194012ba36.tar.gz wireshark-1bb31483502e433711a2a4faaaf500194012ba36.tar.bz2 wireshark-1bb31483502e433711a2a4faaaf500194012ba36.zip |
From Gregor Jasny via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4073 :
This patch adds the functionality to decode short capabilies.
svn path=/trunk/; revision=30391
Diffstat (limited to 'epan/dissectors/packet-aim.c')
-rw-r--r-- | epan/dissectors/packet-aim.c | 92 |
1 files changed, 72 insertions, 20 deletions
diff --git a/epan/dissectors/packet-aim.c b/epan/dissectors/packet-aim.c index 88752fb695..4a29da53af 100644 --- a/epan/dissectors/packet-aim.c +++ b/epan/dissectors/packet-aim.c @@ -231,6 +231,7 @@ const aim_tlv client_tlvs[] = { static int dissect_aim_tlv_value_userstatus(proto_item *ti, guint16 valueid _U_, tvbuff_t *tvb, packet_info *pinfo _U_); static int dissect_aim_tlv_value_dcinfo(proto_item *ti, guint16 valueid _U_, tvbuff_t *tvb, packet_info *pinfo _U_); +static int dissect_aim_tlv_value_client_short_capabilities(proto_item *ti, guint16, tvbuff_t *, packet_info *); #define AIM_ONLINEBUDDY_USERCLASS 0x0001 #define AIM_ONLINEBUDDY_ONSINCE 0x0003 @@ -265,7 +266,7 @@ const aim_tlv onlinebuddy_tlvs[] = { { AIM_ONLINEBUDDY_SESSIONLEN, "Session Length (sec)", dissect_aim_tlv_value_uint32 }, { AIM_ONLINEBUDDY_ICQSESSIONLEN, "ICQ Session Length (sec)", dissect_aim_tlv_value_uint32 }, { AIM_ONLINEBUDDY_MYINSTANCENUM, "Client instance number", dissect_aim_tlv_value_uint8 }, - { AIM_ONLINEBUDDY_SHORTCAPS, "Short Capabilities", dissect_aim_tlv_value_bytes }, + { AIM_ONLINEBUDDY_SHORTCAPS, "Short Capabilities", dissect_aim_tlv_value_client_short_capabilities }, { AIM_ONLINEBUDDY_BARTINFO, "BART Info", dissect_aim_tlv_value_bytes }, { AIM_ONLINEBUDDY_NICKFLAGS2, "Upper bytes of Nick Flags", dissect_aim_tlv_value_bytes }, { AIM_ONLINEBUDDY_BUDDYFEEDTIME, "Last Buddy Feed update", dissect_aim_tlv_value_time }, @@ -425,6 +426,8 @@ static int hf_aim_userclass_unknown10000 = -1; static int hf_aim_userclass_unknown20000 = -1; static int hf_aim_userclass_no_knock_knock = -1; static int hf_aim_userclass_forward_mobile = -1; +static int hf_aim_nickinfo_caps = -1; +static int hf_aim_nickinfo_short_caps = -1; static int hf_aim_messageblock_featuresdes = -1; static int hf_aim_messageblock_featureslen = -1; static int hf_aim_messageblock_features = -1; @@ -455,7 +458,8 @@ static gint ett_aim_fnac_flags = -1; static gint ett_aim_tlv = -1; static gint ett_aim_userclass = -1; static gint ett_aim_messageblock = -1; -static gint ett_aim_client_capabilities = -1; +static gint ett_aim_nickinfo_caps = -1; +static gint ett_aim_nickinfo_short_caps = -1; static gint ett_aim_string08_array = -1; /* desegmentation of AIM over TCP */ @@ -855,7 +859,7 @@ dissect_aim_buddyname(tvbuff_t *tvb, packet_info *pinfo _U_, int offset, typedef struct _aim_client_capability { const char *name; - e_uuid_t clsid; + e_guid_t clsid; } aim_client_capability; static const aim_client_capability known_client_caps[] = { @@ -994,8 +998,8 @@ static const aim_client_capability known_client_caps[] = { { NULL, {0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } } } }; -static const -aim_client_capability *aim_find_capability (e_uuid_t clsid) +static const aim_client_capability * +aim_find_capability (e_guid_t clsid) { int i; @@ -1003,37 +1007,61 @@ aim_client_capability *aim_find_capability (e_uuid_t clsid) { const aim_client_capability *caps = &(known_client_caps[i]); - if(memcmp(&(caps->clsid), &clsid, sizeof(e_uuid_t)) == 0) + if(memcmp(&(caps->clsid), &clsid, sizeof(e_guid_t)) == 0) return caps; } return NULL; } +static const aim_client_capability * +aim_find_short_capability(guint16 shortid) +{ + e_guid_t clsid = {0x09460000, 0x4c7f, 0x11d1, {0x82, 0x22, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; + clsid.data1 |= shortid; + + return aim_find_capability(clsid); +} + int dissect_aim_capability(proto_tree *entry, tvbuff_t *tvb, int offset) { - const aim_client_capability *caps = NULL; - e_uuid_t clsid; - - clsid.Data1 = tvb_get_ntohl(tvb, offset); - clsid.Data2 = tvb_get_ntohs(tvb, offset+4); - clsid.Data3 = tvb_get_ntohs(tvb, offset+6); - tvb_memcpy(tvb, clsid.Data4, offset+8, 8); + const aim_client_capability *caps; + e_guid_t clsid; + tvb_get_ntohguid(tvb, offset, &clsid); caps = aim_find_capability(clsid); - proto_tree_add_text(entry, tvb, offset, 16, + proto_tree_add_guid_format(entry, hf_aim_nickinfo_caps, tvb, offset, 16, + &clsid, "%s {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", - caps?caps->name:"Unknown", clsid.Data1, clsid.Data2, - clsid.Data3, clsid.Data4[0], clsid.Data4[1], clsid.Data4[2], - clsid.Data4[3], clsid.Data4[4], clsid.Data4[5], clsid.Data4[6], - clsid.Data4[7] + caps?caps->name:"Unknown", clsid.data1, clsid.data2, + clsid.data3, clsid.data4[0], clsid.data4[1], clsid.data4[2], + clsid.data4[3], clsid.data4[4], clsid.data4[5], clsid.data4[6], + clsid.data4[7] ); return offset+16; } +static int +dissect_aim_short_capability(proto_tree *entry, tvbuff_t *tvb, int offset) +{ + const aim_client_capability *caps; + guint16 shortid; + + shortid = tvb_get_ntohs(tvb, offset); + caps = aim_find_short_capability(shortid); + + proto_tree_add_uint_format(entry, hf_aim_nickinfo_short_caps, tvb, offset, 2, + shortid, + "%s (0x%04x)", + caps?caps->name:"Unknown", shortid + ); + + return offset+2; +} + int dissect_aim_tlv_value_client_capabilities(proto_item *ti _U_, guint16 valueid _U_, tvbuff_t *tvb, packet_info *pinfo _U_) { @@ -1042,7 +1070,7 @@ dissect_aim_tlv_value_client_capabilities(proto_item *ti _U_, guint16 valueid _U proto_item_set_text(ti, "Client Capabilities List"); - entry = proto_item_add_subtree(ti, ett_aim_client_capabilities); + entry = proto_item_add_subtree(ti, ett_aim_nickinfo_caps); while (tvb_length_remaining(tvb, offset) > 0) { offset = dissect_aim_capability(entry, tvb, offset); @@ -1051,6 +1079,23 @@ dissect_aim_tlv_value_client_capabilities(proto_item *ti _U_, guint16 valueid _U return tvb_length(tvb); } +static int +dissect_aim_tlv_value_client_short_capabilities(proto_item *ti _U_, guint16 valueid _U_, tvbuff_t *tvb, packet_info *pinfo _U_) +{ + int offset = 0; + proto_tree *entry; + + proto_item_set_text(ti, "Short Client Capabilities List"); + + entry = proto_item_add_subtree(ti, ett_aim_nickinfo_short_caps); + + while (tvb_length_remaining(tvb, offset) > 0) { + offset = dissect_aim_short_capability(entry, tvb, offset); + } + + return tvb_length(tvb); +} + int dissect_aim_tlv_value_time(proto_item *ti _U_, guint16 valueid _U_, tvbuff_t *tvb, packet_info *pinfo _U_) { @@ -1588,6 +1633,12 @@ proto_register_aim(void) { &hf_aim_userclass_forward_mobile, { "Forward to mobile if not active", "aim.userclass.forward_mobile", FT_BOOLEAN, 32, TFS(&tfs_set_notset), CLASS_FORWARD_MOBILE, NULL, HFILL }, }, + { &hf_aim_nickinfo_caps, + { "Client capabilities", "aim.nickinfo.caps", FT_GUID, BASE_NONE, NULL, 0x0, NULL, HFILL }, + }, + { &hf_aim_nickinfo_short_caps, + { "Short client capabilities", "aim.nickinfo.short_caps", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }, + }, { &hf_aim_fnac_flag_next_is_related, { "Followed By SNAC with related information", "aim.fnac.flags.next_is_related", FT_BOOLEAN, 16, TFS(&tfs_set_notset), FNAC_FLAG_NEXT_IS_RELATED, NULL, HFILL }, }, @@ -1669,7 +1720,8 @@ proto_register_aim(void) &ett_aim_buddyname, &ett_aim_userclass, &ett_aim_messageblock, - &ett_aim_client_capabilities, + &ett_aim_nickinfo_caps, + &ett_aim_nickinfo_short_caps, &ett_aim_string08_array }; module_t *aim_module; |