dapp: cleanup, make elements filterable

don't squeeze all info into the subtree title
remove an unnecessary THROW()

Change-Id: I542f220d9d786d0fa879a0b2fe4549ffa1ca87af
Reviewed-on: https://code.wireshark.org/review/9544
Reviewed-by: Martin Kaiser <wireshark@kaiser.cx>
This commit is contained in:
Martin Kaiser 2015-06-27 10:13:00 -07:00
parent f96a5923c3
commit 6a35ee33ef
1 changed files with 300 additions and 258 deletions

View File

@ -378,6 +378,16 @@ static value_string_ext vals_tag_code_ext = VALUE_STRING_EXT_INIT(vals_tag_code)
static int proto_daap = -1;
static int hf_daap_name = -1;
static int hf_daap_size = -1;
static int hf_daap_data_string = -1;
static int hf_daap_persistent_id = -1;
static int hf_daap_status = -1;
static int hf_daap_rev = -1;
static int hf_daap_id = -1;
static int hf_daap_cnt = -1;
static int hf_daap_timeout = -1;
static int hf_daap_data = -1;
static int hf_daap_playlist_id = -1;
static int hf_daap_track_id = -1;
/* Initialize the subtree pointers */
static gint ett_daap = -1;
@ -391,7 +401,7 @@ dissect_daap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_tree *daap_tree;
guint first_tag = 0;
guint first_tag;
first_tag = tvb_get_ntohl(tvb, 0);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "DAAP");
@ -423,277 +433,267 @@ dissect_daap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
static void
dissect_daap_one_tag(proto_tree *tree, tvbuff_t *tvb)
{
gint offset = 0;
gint reported_length;
guint32 tagname;
guint32 tagsize;
gint len;
proto_item *ti;
proto_item *ti2;
proto_tree *new_tree;
guint offset = 0;
guint32 tagname, tagsize;
proto_item *tag_ti;
proto_tree *tag_tree;
tvbuff_t *new_tvb;
reported_length = tvb_reported_length(tvb);
while ((offset >= 0) && (offset < reported_length)) {
while (offset < tvb_reported_length(tvb)) {
tagname = tvb_get_ntohl(tvb, offset);
tagsize = tvb_get_ntohl(tvb, offset+4);
new_tree = proto_tree_add_subtree_format(tree, tvb, offset, 8, ett_daap_sub, &ti,
"Tag: %-40s %3u byte%c",
val_to_str_ext(tagname, &vals_tag_code_ext, "Unknown tag (0x%0x)"),
tagsize,
plurality(tagsize, ' ', 's'));
ti2 = proto_tree_add_item(new_tree, hf_daap_name, tvb, offset, 4, ENC_ASCII|ENC_NA);
PROTO_ITEM_SET_HIDDEN(ti2);
ti2 = proto_tree_add_item(new_tree, hf_daap_size, tvb, offset+4, 4, ENC_BIG_ENDIAN);
PROTO_ITEM_SET_HIDDEN(ti2);
tag_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
ett_daap_sub, &tag_ti, "Tag: ");
offset += 8;
proto_tree_add_item_ret_uint(tag_tree, hf_daap_name,
tvb, offset, 4, ENC_ASCII|ENC_NA, &tagname);
offset += 4;
proto_tree_add_item_ret_uint(tag_tree, hf_daap_size,
tvb, offset, 4, ENC_BIG_ENDIAN, &tagsize);
offset += 4;
proto_item_append_text(tag_ti, "%s, %u byte%c",
val_to_str_ext(tagname, &vals_tag_code_ext, "Unknown tag (0x%0x)"),
tagsize, plurality(tagsize, ' ', 's'));
proto_item_set_len(tag_ti, 8+tagsize);
if (tagsize > G_MAXINT)
break;
len = reported_length - offset; /* should be >= 0 since no exception above */
DISSECTOR_ASSERT(len >= 0);
if (tagsize <= (unsigned)len) {
len = tagsize;
}
proto_item_set_len(ti, 8+len); /* *Now* it's Ok to set the length. */
/* (Done here so that the proto_tree_add_subtree */
/* above will show tag and tagsize even if */
/* tagsize is very large). */
switch (tagname) {
case daap_mcon:
case daap_msrv:
case daap_mccr:
case daap_mdcl:
case daap_mlog:
case daap_mupd:
case daap_avdb:
case daap_mlcl:
case daap_mlit:
case daap_mbcl:
case daap_adbs:
case daap_aply:
case daap_apso:
case daap_mudl:
case daap_abro:
case daap_abar:
case daap_arsv:
case daap_abal:
case daap_abcp:
case daap_abgn:
case daap_prsv:
case daap_arif:
case dacp_casp:
case dacp_cmgt:
case dacp_cmst:
/* Container tags */
new_tvb = tvb_new_subset_length(tvb, offset, len); /* Use a new tvb so bounds checking */
/* works Ok when dissecting container. */
/* Note: len is within tvb; checked above. */
/* len (see above) is used so that we'll */
/* at least try to dissect what we have */
/* before throwing an exception. */
dissect_daap_one_tag(new_tree, new_tvb);
break;
case daap_minm:
case daap_msts:
case daap_mcnm:
case daap_mcna:
case daap_asal:
case daap_asar:
case daap_ascm:
case daap_asfm:
case daap_aseq:
case daap_asgn:
case daap_asdt:
case daap_asul:
case daap_ascp:
case daap_asct:
case daap_ascn:
case daap_aslc:
case daap_asky:
case daap_aeSN:
case daap_aeNN:
case daap_aeEN:
case daap_assn:
case daap_assa:
case daap_assl:
case daap_assc:
case daap_asss:
case daap_asaa:
case daap_aspu:
case daap_aeCR:
case dacp_cana:
case dacp_cang:
case dacp_canl:
case dacp_cann:
/* Tags contain strings */
proto_item_append_text(ti, "; Data: %s",
tvb_format_text(tvb, offset, tagsize));
break;
case daap_mper:
case daap_aeGR:
case daap_aeGU:
case daap_asai:
case daap_asls:
/* Tags conain uint64 */
proto_item_append_text(ti, "; Persistent Id: %" G_GINT64_MODIFIER "u",
tvb_get_ntoh64(tvb, offset));
break;
case daap_mstt:
proto_item_append_text(ti, "; Status: %d",
tvb_get_ntohl(tvb, offset));
break;
case daap_musr:
case daap_msur:
proto_item_append_text(ti, "; Revision: %d",
tvb_get_ntohl(tvb, offset));
break;
case daap_miid:
case daap_mcti:
case daap_mpco:
case daap_mlid:
proto_item_append_text(ti, "; Id: %d",
tvb_get_ntohl(tvb, offset));
break;
case daap_mrco:
case daap_mtco:
case daap_mimc:
case daap_msdc:
case daap_mctc:
proto_item_append_text(ti, "; Count: %d",
tvb_get_ntohl(tvb, offset));
break;
case daap_mstm:
proto_item_append_text(ti, "; Timeout: %d seconds",
tvb_get_ntohl(tvb, offset));
break;
case daap_asda:
case daap_asdm:
case daap_assr:
case daap_assz:
case daap_asst:
case daap_assp:
case daap_astm:
case daap_aeNV:
case daap_ascd:
case daap_ascs:
case daap_aeSV:
case daap_aePI:
case daap_aeCI:
case daap_aeGI:
case daap_aeAI:
case daap_aeSI:
case daap_aeES:
case daap_asbo:
case daap_aeGH:
case daap_aeGD:
case daap_aeGE:
case dacp_cant:
case dacp_cast:
case dacp_cmsr:
case dacp_cmvo:
case daap_meds:
/* Tags conain uint32 */
proto_item_append_text(ti, "; Data: %d",
tvb_get_ntohl(tvb, offset));
break;
case daap_mcon:
case daap_msrv:
case daap_mccr:
case daap_mdcl:
case daap_mlog:
case daap_mupd:
case daap_avdb:
case daap_mlcl:
case daap_mlit:
case daap_mbcl:
case daap_adbs:
case daap_aply:
case daap_apso:
case daap_mudl:
case daap_abro:
case daap_abar:
case daap_arsv:
case daap_abal:
case daap_abcp:
case daap_abgn:
case daap_prsv:
case daap_arif:
case dacp_casp:
case dacp_cmgt:
case dacp_cmst:
/* Container tags */
new_tvb = tvb_new_subset_length(tvb, offset, (gint)tagsize);
dissect_daap_one_tag(tag_tree, new_tvb);
break;
case daap_mcty:
case daap_asbt:
case daap_asbr:
case daap_asdc:
case daap_asdn:
case daap_astc:
case daap_astn:
case daap_asyr:
case daap_ased:
/* Tags conain uint16 */
proto_item_append_text(ti, "; Data: %d",
tvb_get_ntohs(tvb, offset));
break;
case daap_minm:
case daap_msts:
case daap_mcnm:
case daap_mcna:
case daap_asal:
case daap_asar:
case daap_ascm:
case daap_asfm:
case daap_aseq:
case daap_asgn:
case daap_asdt:
case daap_asul:
case daap_ascp:
case daap_asct:
case daap_ascn:
case daap_aslc:
case daap_asky:
case daap_aeSN:
case daap_aeNN:
case daap_aeEN:
case daap_assn:
case daap_assa:
case daap_assl:
case daap_assc:
case daap_asss:
case daap_asaa:
case daap_aspu:
case daap_aeCR:
case dacp_cana:
case dacp_cang:
case dacp_canl:
case dacp_cann:
/* Tags contain strings
XXX - verify that they're really 7bit ASCII */
proto_tree_add_item(tag_tree, hf_daap_data_string,
tvb, offset, tagsize, ENC_ASCII|ENC_NA);
break;
case daap_mikd:
case daap_msau:
case daap_msty:
case daap_asrv:
case daap_asur:
case daap_asdk:
case daap_muty:
case daap_msas:
case daap_aeHV:
case daap_aeHD:
case daap_aePC:
case daap_aePP:
case daap_aeMK:
case daap_aeSG:
case daap_apsm:
case daap_aprm:
case daap_asgp:
case daap_aePS:
case dacp_cafs:
case dacp_caps:
case dacp_carp:
case dacp_cash:
case dacp_cavs:
/* Tags conain uint8 */
proto_item_append_text(ti, "; Data: %d",
tvb_get_guint8(tvb, offset));
case daap_mper:
case daap_aeGR:
case daap_aeGU:
case daap_asai:
case daap_asls:
proto_tree_add_item(tag_tree, hf_daap_persistent_id,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
break;
case daap_mstt:
proto_tree_add_item(tag_tree, hf_daap_status,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case daap_mslr:
case daap_msal:
case daap_msup:
case daap_mspi:
case daap_msex:
case daap_msbr:
case daap_msqy:
case daap_msix:
case daap_msrs:
case daap_asco:
case daap_asdb:
case daap_abpl:
case daap_aeSP:
case daap_asbk:
/* Tags ARE boolean. Data is (uint8), but it seems
* the value is always zero. So, if the tag is present
* the "bool" is true.
*/
proto_item_append_text(ti, "; Data: True");
break;
case daap_musr:
case daap_msur:
proto_tree_add_item(tag_tree, hf_daap_rev,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case daap_mpro:
case daap_apro:
/* Tags conain version (uint32) */
proto_item_append_text(ti, "; Version: %d.%d.%d.%d",
tvb_get_guint8(tvb, offset),
tvb_get_guint8(tvb, offset+1),
tvb_get_guint8(tvb, offset+2),
tvb_get_guint8(tvb, offset+3));
break;
case daap_miid:
case daap_mcti:
case daap_mpco:
case daap_mlid:
proto_tree_add_item(tag_tree, hf_daap_id,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case dacp_canp:
/* now playing */
/* bytes 4-7 contain uint32 playlist id */
/* bytes 12-15 contain uint32 track id */
proto_item_append_text(ti,
"; unknown: %d, playlist id: %d, unknown: %d, track id: %d",
tvb_get_ntohl(tvb, offset),
tvb_get_ntohl(tvb, offset+4),
tvb_get_ntohl(tvb, offset+8),
tvb_get_ntohl(tvb, offset+12));
case daap_mrco:
case daap_mtco:
case daap_mimc:
case daap_msdc:
case daap_mctc:
proto_tree_add_item(tag_tree, hf_daap_cnt,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
default:
break;
case daap_mstm:
proto_tree_add_item(tag_tree, hf_daap_timeout,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case daap_asda:
case daap_asdm:
case daap_assr:
case daap_assz:
case daap_asst:
case daap_assp:
case daap_astm:
case daap_aeNV:
case daap_ascd:
case daap_ascs:
case daap_aeSV:
case daap_aePI:
case daap_aeCI:
case daap_aeGI:
case daap_aeAI:
case daap_aeSI:
case daap_aeES:
case daap_asbo:
case daap_aeGH:
case daap_aeGD:
case daap_aeGE:
case dacp_cant:
case dacp_cast:
case dacp_cmsr:
case dacp_cmvo:
case daap_meds:
/* Tags contain uint32
XXX - check tagsize here and below */
proto_tree_add_item(tag_tree, hf_daap_data,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case daap_mcty:
case daap_asbt:
case daap_asbr:
case daap_asdc:
case daap_asdn:
case daap_astc:
case daap_astn:
case daap_asyr:
case daap_ased:
/* Tags contain uint16 */
proto_tree_add_item(tag_tree, hf_daap_data,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case daap_mikd:
case daap_msau:
case daap_msty:
case daap_asrv:
case daap_asur:
case daap_asdk:
case daap_muty:
case daap_msas:
case daap_aeHV:
case daap_aeHD:
case daap_aePC:
case daap_aePP:
case daap_aeMK:
case daap_aeSG:
case daap_apsm:
case daap_aprm:
case daap_asgp:
case daap_aePS:
case dacp_cafs:
case dacp_caps:
case dacp_carp:
case dacp_cash:
case dacp_cavs:
/* Tags contain uint8 */
proto_tree_add_item(tag_tree, hf_daap_data,
tvb, offset, tagsize, ENC_BIG_ENDIAN);
break;
case daap_mslr:
case daap_msal:
case daap_msup:
case daap_mspi:
case daap_msex:
case daap_msbr:
case daap_msqy:
case daap_msix:
case daap_msrs:
case daap_asco:
case daap_asdb:
case daap_abpl:
case daap_aeSP:
case daap_asbk:
/* Tags ARE boolean. Data is (uint8), but it seems
* the value is always zero. So, if the tag is present
* the "bool" is true.
*/
proto_item_append_text(tag_ti, "; Data: True");
break;
case daap_mpro:
case daap_apro:
/* Tags contain version (uint32) */
proto_item_append_text(tag_ti, "; Version: %d.%d.%d.%d",
tvb_get_guint8(tvb, offset),
tvb_get_guint8(tvb, offset+1),
tvb_get_guint8(tvb, offset+2),
tvb_get_guint8(tvb, offset+3));
break;
case dacp_canp:
/* now playing */
/* bytes 4-7 contain uint32 playlist id */
/* bytes 12-15 contain uint32 track id */
proto_tree_add_item(tag_tree, hf_daap_playlist_id,
tvb, offset+4, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(tag_tree, hf_daap_track_id,
tvb, offset+12, 4, ENC_BIG_ENDIAN);
break;
default:
break;
}
if ((signed)tagsize < 0) /* we'll consider a tagsize >= 0x80000000 invalid */
break;
offset += tagsize;
}
if ((offset < 0) || ((reported_length - offset) != 0)) {
THROW(ReportedBoundsError);
}
}
@ -704,12 +704,54 @@ proto_register_daap(void)
static hf_register_info hf[] = {
{ &hf_daap_name,
{ "Name", "daap.name", FT_STRING, BASE_NONE, NULL, 0x0,
"Tag Name", HFILL}
{ "Tag name", "daap.name", FT_UINT32,
BASE_HEX|BASE_EXT_STRING, &vals_tag_code_ext, 0, NULL, HFILL }
},
{ &hf_daap_size,
{ "Size", "daap.size", FT_UINT32, BASE_DEC, NULL, 0x0,
"Tag Size", HFILL }
{ "Tag size", "daap.size",
FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
},
{ &hf_daap_data_string,
{ "Data string", "daap.data_string",
FT_STRING, STR_ASCII, NULL, 0, NULL, HFILL }
},
{ &hf_daap_persistent_id,
{ "Persistent Id", "daap.persistent_id",
FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL }
},
{ &hf_daap_status,
{ "Staus", "daap.status",
FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }
},
{ &hf_daap_rev,
{ "Revision", "daap.revision",
FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
},
{ &hf_daap_id,
{ "Id", "daap.id",
FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }
},
{ &hf_daap_cnt,
{ "Count", "daap.count",
FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
},
{ &hf_daap_timeout,
{ "Timeout (seconds)", "daap.timeout",
FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL }
},
/* this will hold data for the tags that contain
32, 16 or 8 bits of payload */
{ &hf_daap_data,
{ "Data", "daap.data",
FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }
},
{ &hf_daap_playlist_id,
{ "Playlist Id", "daap.playlist_id",
FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }
},
{ &hf_daap_track_id,
{ "Track Id", "daap.track_id",
FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL }
}
};