From 980893a15afba3d4ed654734a386009c27c18358 Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Wed, 2 Jul 2014 09:32:20 -0400 Subject: [PATCH] NDPS dissector is the poster child for proto_tree_add_subtree[_format]. NDPS dissector is also the poster child for not being considered "that naughty" by checkAPIs because most of its proto_tree_add_text calls don't have printf-style arguments (which is what checkAPIs really keys off of) Fixed both cases and removed about 370 proto_tree_add_text calls from the dissector. Change-Id: I721678c39d4a0544e5e7212e622c0c2eebfd04f7 Reviewed-on: https://code.wireshark.org/review/2775 Reviewed-by: Evan Huus --- epan/dissectors/packet-ndps.c | 1389 +++++++++++++-------------------- 1 file changed, 558 insertions(+), 831 deletions(-) diff --git a/epan/dissectors/packet-ndps.c b/epan/dissectors/packet-ndps.c index 6d26881607..d25456a510 100644 --- a/epan/dissectors/packet-ndps.c +++ b/epan/dissectors/packet-ndps.c @@ -361,6 +361,8 @@ static gint ett_ndps = -1; static expert_field ei_ndps_problem_type = EI_INIT; static expert_field ei_ndps_return_code = EI_INIT; static expert_field ei_ndps_rpc_acc_stat = EI_INIT; +static expert_field ei_ndps_truncated = EI_INIT; + /* desegmentation of NDPS over TCP */ static gboolean ndps_desegment = TRUE; @@ -2446,14 +2448,14 @@ address_item(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) } static int -credentials(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) +credentials(tvbuff_t* tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset) { guint32 cred_type=0; guint32 length=0; guint32 number_of_items; guint32 ii; proto_tree *atree; - proto_item *aitem; + proto_item *aitem, *expert_item; cred_type = tvb_get_ntohl(tvb, foffset); proto_tree_add_item(ndps_tree, hf_ndps_cred_type, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -2463,16 +2465,15 @@ credentials(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 0: foffset = ndps_string(tvb, hf_ndps_user_name, ndps_tree, foffset, NULL); number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_passwords, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_passwords, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Password %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Password %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length!=0) @@ -2539,33 +2540,27 @@ credentials(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) static int -event_object_set(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) +event_object_set(tvbuff_t* tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset) { guint32 number_of_items; guint32 number_of_items2; guint32 ii; guint32 jj; guint32 object_identifier; - proto_tree *atree; - proto_item *aitem; - proto_tree *btree; - proto_item *bitem; - proto_tree *ctree; - proto_item *citem; + proto_tree *atree, *btree, *ctree; + proto_item *aitem, *bitem, *citem, *expert_item; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Event"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &bitem, "Event %u", ii+1); proto_tree_add_item(btree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; foffset = objectidentifier(tvb, btree, foffset); @@ -2586,16 +2581,15 @@ event_object_set(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 2: number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_item_count, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(btree, hf_ndps_item_count, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Item %u", jj+1); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Item %u", jj+1); foffset = objectidentifier(tvb, ctree, foffset); foffset += align_4(tvb, foffset); proto_item_set_end(citem, tvb, foffset); @@ -2610,25 +2604,24 @@ event_object_set(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) static int -cardinal_seq(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) +cardinal_seq(tvbuff_t* tvb, packet_info* pinfo, proto_tree *ndps_tree, int foffset) { guint32 number_of_items; guint32 length; guint32 ii; proto_tree *atree; - proto_item *aitem; + proto_item *aitem, *expert_item; number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Cardinal %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Cardinal %u", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -2647,35 +2640,31 @@ cardinal_seq(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) static int -server_entry(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) +server_entry(tvbuff_t* tvb, packet_info* pinfo, proto_tree *ndps_tree, int foffset) { char *server_name; guint32 number_of_items; guint32 ii; guint32 data_type; - proto_tree *atree; - proto_item *aitem; - proto_tree *btree; - proto_item *bitem; + proto_tree *atree, *btree; + proto_item *aitem, *bitem, *expert_item; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Server Info"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Server Info"); foffset = ndps_string(tvb, hf_ndps_server_name, ndps_tree, foffset, &server_name); proto_item_append_text(aitem, ": %s", format_text(server_name, strlen(server_name))); proto_tree_add_item(atree, hf_ndps_server_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; foffset = print_address(tvb, atree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_servers, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_servers, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Info %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Info %u", ii+1); data_type = tvb_get_ntohl(tvb, foffset); proto_tree_add_item(btree, hf_ndps_data_item_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -2712,7 +2701,7 @@ server_entry(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) static int -attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) +attribute_value(tvbuff_t* tvb, packet_info* pinfo, proto_tree *ndps_tree, int foffset) { guint32 ii; guint32 jj; @@ -2738,10 +2727,8 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) guint32 cardinal; const char *label; guint32 label_value; - proto_tree *atree; - proto_item *aitem; - proto_tree *btree; - proto_item *bitem; + proto_tree *atree, *btree; + proto_item *aitem, *bitem, *expert_item; if (global_attribute_name==NULL) { @@ -2779,16 +2766,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 39: /* Name or OID Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %d", ii+1); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } @@ -2800,16 +2786,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 8: /* Distinguished Name String Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Name %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Name %u", ii+1); foffset = ndps_string(tvb, hf_object_name, atree, foffset, NULL); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); @@ -2868,16 +2853,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 23: /* Cardinal 64 Seq */ case 30: /* Real Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %u", ii+1); proto_tree_add_item(atree, hf_ndps_n64, tvb, foffset, 8, ENC_NA); foffset += 8; proto_item_set_end(aitem, tvb, foffset); @@ -2909,32 +2893,30 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 37: /* Object Identifier Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object %d", ii+1); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } break; case 41: /* Relative Distinguished Name Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_names, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_names, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Name %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Name %u", ii+1); foffset = ndps_string(tvb, hf_object_name, atree, foffset, NULL); proto_item_set_end(aitem, tvb, foffset); } @@ -2991,16 +2973,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) foffset += 4; if (location == 0) { number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_locations, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_locations, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Location %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Location %u", ii+1); proto_tree_add_item(atree, hf_ndps_n64, tvb, foffset, 8, ENC_NA); foffset += 8; proto_item_set_end(aitem, tvb, foffset); @@ -3027,16 +3008,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 48: /* Area Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_areas, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_areas, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Area %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Area %u", ii+1); proto_tree_add_item(atree, hf_ndps_xmin_n64, tvb, foffset, 8, ENC_NA); foffset += 8; proto_tree_add_item(atree, hf_ndps_xmax_n64, tvb, foffset, 8, ENC_NA); @@ -3114,30 +3094,28 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) foffset = name_or_id(tvb, ndps_tree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_address_items, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_address_items, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Address Item %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Address Item %u", ii+1); foffset = address_item(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Event %u", ii+1); proto_tree_add_item(atree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; foffset = objectidentifier(tvb, atree, foffset); @@ -3153,12 +3131,12 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 2: /* Number of Objects */ number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } foffset = objectidentifier(tvb, atree, foffset); @@ -3172,16 +3150,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 0: number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object %u", jj+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object %u", jj+1); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } @@ -3250,16 +3227,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 65: /* Job Categories */ foffset = objectidentifier(tvb, ndps_tree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_job_categories, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_job_categories, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job %u", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -3278,16 +3254,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) foffset += 4; foffset = objectidentifier(tvb, ndps_tree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_ignored_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_ignored_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Ignored Attribute %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Ignored Attribute %u", ii+1); ignored_type = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_ignored_type, tvb, foffset, 4, ignored_type); foffset += 4; @@ -3325,16 +3300,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 71: /* Resource Context Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_resources, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_resources, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Resource %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Resource %u", ii+1); resource_type = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_resource_type, tvb, foffset, 4, resource_type); foffset += 4; @@ -3351,16 +3325,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 73: /* Page Select Seq */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_page_selects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_page_selects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Page Select %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Page Select %u", ii+1); proto_tree_add_item(atree, hf_ndps_page_flag, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; identifier_type = tvb_get_ntohl(tvb, foffset); @@ -3412,16 +3385,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) { foffset = ndps_string(tvb, hf_ndps_tree, ndps_tree, foffset, NULL); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %u", ii+1); proto_tree_add_item(atree, hf_ndps_page_flag, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; identifier_type = tvb_get_ntohl(tvb, foffset); @@ -3555,16 +3527,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 82: /* Output Bins Characteristics */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_page_informations, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_page_informations, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Page Information %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Page Information %u", ii+1); proto_tree_add_item(atree, hf_ndps_page_order, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_tree_add_item(atree, hf_ndps_page_orientation, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -3586,16 +3557,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) case 85: /* Category Set */ foffset = objectidentifier(tvb, ndps_tree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_categories, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_categories, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Category %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Category %u", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -3608,16 +3578,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) THROW(ReportedBoundsError); } number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_values, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_values, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Value %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Value %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -3737,16 +3706,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 97: /* Qualified Name Set */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_names, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_names, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Name %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Name %u", ii+1); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } @@ -3764,16 +3732,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) foffset = objectidentifier(tvb, ndps_tree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_colorants, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_colorants, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Colorant %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Colorant %u", ii+1); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } @@ -3781,16 +3748,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 99: /* Resource Printer ID */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Printer %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Printer %u", ii+1); foffset = ndps_string(tvb, hf_ndps_printer_type, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_printer_manuf, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_inf_file_name, atree, foffset, NULL); @@ -3833,16 +3799,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; case 105: /* Print Contained Object ID Set */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object %u", ii+1); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -3940,16 +3905,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) break; } number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Event %u", ii+1); foffset = ndps_string(tvb, hf_object_name, atree, foffset, NULL); foffset = objectidentifier(tvb, atree, foffset); proto_tree_add_item(atree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -3959,16 +3923,15 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) foffset = objectidentifier(tvb, ndps_tree, foffset); foffset = qualifiedname(tvb, ndps_tree, foffset); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object %u", ii+1); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } @@ -3988,29 +3951,25 @@ attribute_value(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) static int -commonarguments(tvbuff_t* tvb, proto_tree *ndps_tree, int foffset) +commonarguments(tvbuff_t* tvb, packet_info* pinfo, proto_tree *ndps_tree, int foffset) { guint32 number_of_items; guint32 ii; - proto_tree *atree; - proto_item *aitem; - proto_tree *btree; - proto_item *bitem; + proto_tree *atree, *btree; + proto_item *aitem, *bitem, *expert_item; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Common Arguments"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Common Arguments"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_args, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_args, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Argument %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Argument %u", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -4560,14 +4519,8 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g guint32 integer_type_flag; guint32 local_servers_type; gint length_remaining; - proto_tree *atree; - proto_item *aitem; - proto_tree *btree; - proto_item *bitem; - proto_tree *ctree; - proto_item *citem; - proto_tree *dtree; - proto_item *ditem; + proto_tree *atree, *btree, *ctree, *dtree; + proto_item *aitem, *bitem, *citem, *ditem, *expert_item; if (!pinfo->fd->flags.visited) { @@ -4601,23 +4554,22 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g switch(ndps_func) { case 0x00000001: /* Bind PSM */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); break; case 0x00000002: /* Bind PA */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); proto_tree_add_item(ndps_tree, hf_ndps_retrieve_restrictions, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Security %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Security %u", ii+1); length = tvb_get_ntohl(tvb, foffset); if (length==4) { @@ -4644,32 +4596,29 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = ndps_string(tvb, hf_ndps_pa_name, ndps_tree, foffset, NULL); proto_tree_add_item(ndps_tree, hf_sub_complete, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Transfer Method"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Transfer Method"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Value %u", jj+1); - ctree = proto_item_add_subtree(citem, ett_ndps); - foffset = attribute_value(tvb, ctree, foffset); + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Value %u", jj+1); + foffset = attribute_value(tvb, pinfo, ctree, foffset); proto_item_set_end(citem, tvb, foffset); } proto_tree_add_item(btree, hf_ndps_qualifier, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -4677,19 +4626,17 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Document Content"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Document Content"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Type %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Type %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } @@ -4698,16 +4645,15 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; doc_content = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_doc_content, tvb, foffset, 4, doc_content); + expert_item = proto_tree_add_uint(atree, hf_doc_content, tvb, foffset, 4, doc_content); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Value %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Value %u", ii+1); if (doc_content==0) { length = tvb_get_ntohl(tvb, foffset); @@ -4740,32 +4686,29 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g if (align_4(tvb, foffset)>0) { foffset += align_4(tvb, foffset); } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Document Type"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Document Type"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Value %u", jj+1); - ctree = proto_item_add_subtree(citem, ett_ndps); - foffset = attribute_value(tvb, ctree, foffset); + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Value %u", jj+1); + foffset = attribute_value(tvb, pinfo, ctree, foffset); proto_item_set_end(citem, tvb, foffset); } proto_tree_add_item(btree, hf_ndps_qualifier, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -4773,20 +4716,18 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Document Attributes"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Document Attributes"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Document Attributes */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Document Attributes */ proto_item_set_end(bitem, tvb, foffset); } break; @@ -4796,57 +4737,51 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; proto_tree_add_item(ndps_tree, hf_sub_complete, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Transfer Method"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Transfer Method"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_transfer_methods, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_transfer_methods, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Method %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Method %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); /* Transfer Method */ proto_item_set_end(bitem, tvb, foffset); } proto_tree_add_item(ndps_tree, hf_doc_content, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Document Type"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Document Type"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_doc_types, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_doc_types, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Type %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Type %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); /* Document Type */ proto_item_set_end(bitem, tvb, foffset); } foffset += align_4(tvb, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Document Attributes"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Document Attributes"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Document Attributes */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Document Attributes */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -4868,37 +4803,33 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; proto_tree_add_item(ndps_tree, hf_ndps_document_number, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job Modifications"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job Modifications"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Modification %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Job Modifications */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Modification %u", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Job Modifications */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Document Modifications"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Document Modifications"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Modification %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Document Modifications */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Modification %u", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Document Modifications */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -4916,13 +4847,11 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; /* Start of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Cancel Message"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Cancel Message"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Retention Period"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Retention Period"); proto_tree_add_item(atree, hf_ndps_status_flags, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_tree_add_item(atree, hf_ndps_attribute_value, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -4950,24 +4879,22 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_abort_flag, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Attribute %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); - foffset = attribute_value(tvb, atree, foffset); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Attribute %u", ii+1); + foffset = attribute_value(tvb, pinfo, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } } else /* Specification */ { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); foffset += 4; @@ -4977,19 +4904,17 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (scope!=0) /* Scope Does not equal 0 */ { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Selector Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Selector Option"); number_of_items = tvb_get_ntohl(tvb, foffset); /* Start of NWDPSelector */ - proto_tree_add_uint(atree, hf_ndps_num_options, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_options, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Option %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Option %u", ii+1); foffset = objectidentification(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } @@ -5005,15 +4930,14 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g } else { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Filter Items"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Filter Items"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } foffset = filteritem(tvb, ndps_tree, foffset); @@ -5027,19 +4951,17 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; /* End of NWDPSelector */ } foffset += 4; /* Don't know what this is */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Requested Attributes"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Requested Attributes"); number_of_items = tvb_get_ntohl(tvb, foffset); /* Start of NWDPObjectIdentifierSet */ - proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } @@ -5050,27 +4972,25 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g } proto_tree_add_item(ndps_tree, hf_ndps_operator, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); } break; case 0x00000008: /* Promote Job */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* End of NWDPPrtContainedObjectId */ /* Start of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of nameorid */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000009: /* Interrupt */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5081,8 +5001,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g if (job_type==0) { /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -5094,20 +5013,18 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = ndps_string(tvb, hf_ndps_pa_name, ndps_tree, foffset, NULL); } /* Start of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Interrupt Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Interrupt Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of nameorid */ /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Interrupting Job"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Interrupting Job"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* End of NWDPPrtContainedObjectId */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000a: /* Pause */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5118,8 +5035,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g if (job_type==0) { /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -5131,115 +5047,102 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = ndps_string(tvb, hf_ndps_pa_name, ndps_tree, foffset, NULL); } /* Start of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Pause Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Pause Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of nameorid */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000b: /* Resume */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* End of NWDPPrtContainedObjectId */ /* Start of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Resume Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Resume Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of nameorid */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000c: /* Clean */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of nameorid */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Clean Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Clean Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of nameorid */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000d: /* Create */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object ID"); foffset = objectidentification(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); proto_tree_add_item(ndps_tree, hf_ndps_force, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Reference Object Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Reference Object Option"); foffset = objectidentification(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of AttributeSet */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Attribute"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Attribute"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Object Attribute Set */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Object Attribute Set */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); /* End of AttributeSet */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000e: /* Delete */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object ID"); foffset = objectidentification(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000f: /* Disable PA */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Disable PA Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Disable PA Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000010: /* Enable PA */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Enable PA Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Enable PA Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000011: /* Resubmit Jobs */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5248,20 +5151,18 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = address_item(tvb, ndps_tree, foffset); proto_tree_add_item(ndps_tree, hf_resubmit_op_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Resubmit Job"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Resubmit Job"); number_of_items = tvb_get_ntohl(tvb, foffset); /* Start of ResubmitJob Set */ - proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } /* Start of NWDPPrtContainedObjectId */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Job ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, btree, foffset, NULL); proto_tree_add_item(btree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -5270,39 +5171,35 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(atree, hf_ndps_document_number, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of AttributeSet */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Job Attributes"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Job Attributes"); number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Attribute %u", jj+1); - ctree = proto_item_add_subtree(citem, ett_ndps); - foffset = attribute_value(tvb, ctree, foffset); /* Object Attribute Set */ + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Attribute %u", jj+1); + foffset = attribute_value(tvb, pinfo, ctree, foffset); /* Object Attribute Set */ proto_item_set_end(citem, tvb, foffset); } proto_item_set_end(bitem, tvb, foffset); /* End of AttributeSet */ /* Start of AttributeSet */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Document Attributes"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Document Attributes"); number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Attribute %u", jj+1); - ctree = proto_item_add_subtree(citem, ett_ndps); - foffset = attribute_value(tvb, ctree, foffset); /* Object Attribute Set */ + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Attribute %u", jj+1); + foffset = attribute_value(tvb, pinfo, ctree, foffset); /* Object Attribute Set */ proto_item_set_end(citem, tvb, foffset); } proto_item_set_end(bitem, tvb, foffset); @@ -5310,43 +5207,38 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g } proto_item_set_end(aitem, tvb, foffset); /* End of ResubmitJob Set */ /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Resubmit Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Resubmit Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000012: /* Set */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object ID"); foffset = objectidentification(tvb, atree, foffset); /* Start of AttributeSet */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Attribute Modifications"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Attribute Modifications"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Modification %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Object Attribute Set */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Modification `%d", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Object Attribute Set */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); /* End of AttributeSet */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000013: /* Shutdown PA */ case 0x0000001e: /* Shutdown PSM */ @@ -5356,66 +5248,60 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; foffset = ndps_string(tvb, hf_ndps_pa_name, ndps_tree, foffset, NULL); /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Shutdown Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Shutdown Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); case 0x00000014: /* Startup PA */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; foffset = ndps_string(tvb, hf_ndps_pa_name, ndps_tree, foffset, NULL); /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Startup Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Startup Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000015: /* Reorder Job */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job Identification"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job Identification"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* End of NWDPPrtContainedObjectId */ /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Reference Job ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Reference Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* End of NWDPPrtContainedObjectId */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000016: /* Pause PA */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Pause Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Pause Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000017: /* Resume PA */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Resume Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Resume Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000018: /* Transfer Data */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5428,12 +5314,11 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of Object Identifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Operation ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Operation ID"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of Object Identifier */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x0000001a: /* Add Event Profile */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5448,30 +5333,27 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); foffset += align_4(tvb, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Address"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Address"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Address %u", ii+1); foffset = address_item(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); foffset = qualifiedname(tvb, ndps_tree, foffset); break; case 0x0000001b: /* Remove Event Profile */ @@ -5490,8 +5372,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (supplier_flag) { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Supplier ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Supplier ID"); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -5516,8 +5397,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g if (method_flag) { /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -5527,12 +5407,11 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (delivery_address_flag) { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Address"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Address"); foffset = print_address(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); break; case 0x0000001d: /* List Event Profiles */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5548,17 +5427,15 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (profiles_choice_type==0) /* Choice */ { - foffset = cardinal_seq(tvb, ndps_tree, foffset); + foffset = cardinal_seq(tvb, pinfo, ndps_tree, foffset); } else { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); /* End of NameorID */ proto_tree_add_item(atree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5598,12 +5475,11 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Cancel Shutdown Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Cancel Shutdown Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000020: /* Set Printer DS Information */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -5611,8 +5487,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_ds_info_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; foffset = ndps_string(tvb, hf_ndps_printer_name, ndps_tree, foffset, NULL); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "DS Object Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "DS Object Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); break; @@ -5620,12 +5495,11 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Clean Message Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Clean Message Option"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - foffset = commonarguments(tvb, ndps_tree, foffset); + foffset = commonarguments(tvb, pinfo, ndps_tree, foffset); break; case 0x00000022: /* Map GUID to NDS Name */ length = tvb_get_ntohl(tvb, foffset); @@ -5645,56 +5519,49 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; proto_tree_add_item(ndps_tree, hf_ndps_persistence, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); foffset = ndps_string(tvb, hf_ndps_supplier_name, ndps_tree, foffset, NULL); proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); foffset += align_4(tvb, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Address"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Address"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Address %u", ii+1); foffset = address_item(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - foffset = event_object_set(tvb, ndps_tree, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Account"); - atree = proto_item_add_subtree(aitem, ett_ndps); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Account"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of object identifier set */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Notify Attributes"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Notify Attributes"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %u", ii+1); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } @@ -5717,8 +5584,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (profiles_type==0) /* Spec */ { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Supplier Alias"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Supplier Alias"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); profiles_choice_type = tvb_get_ntohl(tvb, foffset); @@ -5726,17 +5592,15 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (profiles_choice_type==0) /* Choice */ { - foffset = cardinal_seq(tvb, ndps_tree, foffset); + foffset = cardinal_seq(tvb, pinfo, ndps_tree, foffset); } else { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -5780,20 +5644,19 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g switch(ndps_func) { case 0x00000001: /* Bind */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); proto_tree_add_item(ndps_tree, hf_ndps_retrieve_restrictions, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Security %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Security %u", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -5812,15 +5675,14 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g case 0x00000004: /* Enable Service */ proto_tree_add_item(ndps_tree, hf_ndps_service_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Parameters"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Parameters"); number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } length = tvb_get_ntohl(tvb, foffset); @@ -5849,20 +5711,19 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g switch(ndps_func) { case 0x00000001: /* Bind */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); proto_tree_add_item(ndps_tree, hf_ndps_retrieve_restrictions, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Security %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Security %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -5875,7 +5736,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g case 0x00000002: /* Unbind */ break; case 0x00000003: /* Register Server */ - foffset = server_entry(tvb, ndps_tree, foffset); + foffset = server_entry(tvb, pinfo, ndps_tree, foffset); break; case 0x00000004: /* Deregister Server */ case 0x00000006: /* Deregister Registry */ @@ -5888,37 +5749,33 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = print_address(tvb, ndps_tree, foffset); break; case 0x00000007: /* Registry Update */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Add"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Add"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Entry %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = server_entry(tvb, btree, foffset); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Entry %u", ii+1); + foffset = server_entry(tvb, pinfo, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Remove"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Remove"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Entry %u", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = server_entry(tvb, btree, foffset); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Entry %u", ii+1); + foffset = server_entry(tvb, pinfo, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -5966,19 +5823,19 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g switch(ndps_func) { case 0x00000001: /* Notify Bind */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); proto_tree_add_item(ndps_tree, hf_ndps_retrieve_restrictions, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items=tvb_get_ntohl(tvb, foffset); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Security %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Security %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -5998,16 +5855,15 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = ndps_string(tvb, hf_ndps_supplier_name, ndps_tree, foffset, NULL); /* Start of QualifiedName Set*/ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Supplier Alias %u", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Supplier Alias %u", ii+1); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } @@ -6020,8 +5876,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g case 0x00000005: /* Add Profile */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Supplier Alias"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Supplier Alias"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of Eventhandling */ @@ -6029,8 +5884,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; proto_tree_add_item(ndps_tree, hf_ndps_persistence, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); length = tvb_get_ntohl(tvb, foffset); @@ -6043,29 +5897,26 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Addresses"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Addresses"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Address %d", ii+1); foffset = address_item(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); /* End of Eventhandling */ break; case 0x00000006: /* Remove Profile */ @@ -6084,8 +5935,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (supplier_flag) { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Supplier ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Supplier ID"); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -6110,8 +5960,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g if (method_flag) { /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -6123,7 +5972,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g { foffset = print_address(tvb, ndps_tree, foffset); } - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); break; case 0x00000008: /* List Profiles */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -6133,8 +5982,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; if (profiles_type==0) /* Spec */ { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Supplier Alias"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Supplier Alias"); foffset = qualifiedname(tvb, atree, foffset); profiles_choice_type = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_list_profiles_choice_type, tvb, foffset, 4, profiles_choice_type); @@ -6142,17 +5990,15 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_item_set_end(aitem, tvb, foffset); if (profiles_choice_type==0) /* Choice */ { - foffset = cardinal_seq(tvb, ndps_tree, foffset); + foffset = cardinal_seq(tvb, pinfo, ndps_tree, foffset); } else { - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); /* End of NameorID */ proto_tree_add_item(atree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -6195,57 +6041,47 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event Items"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Event Items"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Item %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Item %d", ii+1); /* Start of ReportEventItem */ proto_tree_add_item(btree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Containing Class"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Containing Class"); foffset = objectidentifier(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Containing Object"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Containing Object"); foffset = objectidentification(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Filter Class"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Filter Class"); foffset = objectidentifier(tvb, ctree, foffset); - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Object Class"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Object Class"); foffset = objectidentifier(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Object ID"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Object ID"); foffset = objectidentification(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Event Object ID"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Event Object ID"); foffset = objectidentifier(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); /* Start of AttributeSet */ number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Attribute Modifications"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Attribute Modifications"); for (jj = 0; jj < number_of_items; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ctree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, citem, &ei_ndps_truncated); break; } - ditem = proto_tree_add_text(ctree, tvb, foffset, -1, "Modification %d", jj+1); - dtree = proto_item_add_subtree(ditem, ett_ndps); - foffset = attribute_value(tvb, dtree, foffset); /* Object Attribute Set */ + dtree = proto_tree_add_subtree_format(ctree, tvb, foffset, -1, ett_ndps, &ditem, "Modification %d", jj+1); + foffset = attribute_value(tvb, pinfo, dtree, foffset); /* Object Attribute Set */ proto_item_set_end(ditem, tvb, foffset); } proto_item_set_end(citem, tvb, foffset); @@ -6262,20 +6098,18 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g case 0x0000000b: /* Report Notification */ /* Start of DestinationSet */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_destinations, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_destinations, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Destination %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Destination %d", ii+1); /* Start of Destination */ /* Start of NameorID */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Method ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Method ID"); foffset = name_or_id(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); /* End of NameorID */ @@ -6291,45 +6125,37 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = ndps_string(tvb, hf_ndps_supplier_name, ndps_tree, foffset, NULL); proto_tree_add_item(ndps_tree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Containing Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Containing Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Containing Object"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Containing Object"); foffset = objectidentification(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Filter Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Filter Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Class"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Class"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object ID"); foffset = objectidentification(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event Object ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Event Object ID"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* Start of AttributeSet */ number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Attributes"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Attributes"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %d", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -6337,8 +6163,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset = ndps_string(tvb, hf_ndps_message, ndps_tree, foffset, NULL); proto_tree_add_item(ndps_tree, hf_time, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Account"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Account"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); break; @@ -6347,8 +6172,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g break; case 0x0000000d: /* Remove Delivery Method */ /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -6393,8 +6217,7 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g break; case 0x0000000f: /* Get Delivery Method Information */ /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -6409,20 +6232,19 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g switch(ndps_func) { case 0x00000001: /* Bind */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); proto_tree_add_item(ndps_tree, hf_ndps_retrieve_restrictions, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_bind_security_option_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Security %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Security %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -6446,16 +6268,15 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g foffset += 4; foffset = res_add_input_data(tvb, ndps_tree, foffset); number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %d", ii+1); length=tvb_get_ntohl(tvb, foffset); length_remaining = tvb_length_remaining(tvb, foffset); if(length_remaining == -1 || (guint32) length_remaining < length) @@ -6598,27 +6419,25 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g switch(ndps_func) { case 0x00000001: /* Delivery Bind */ - foffset = credentials(tvb, ndps_tree, foffset); + foffset = credentials(tvb, pinfo, ndps_tree, foffset); break; case 0x00000002: /* Delivery Unbind */ /* NoOp */ break; case 0x00000003: /* Delivery Send */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %d", ii+1); proto_tree_add_item(atree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Supplier ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Supplier ID"); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -6629,36 +6448,29 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(btree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Containing Class"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Containing Class"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Containing Object"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Containing Object"); foffset = objectidentification(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Filter Class"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Filter Class"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object Class"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object Class"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object ID"); foffset = objectidentification(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Event Object ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Event Object ID"); foffset = objectidentifier(tvb, btree, foffset); - foffset = attribute_value(tvb, atree, foffset); + foffset = attribute_value(tvb, pinfo, atree, foffset); foffset = ndps_string(tvb, hf_ndps_message, atree, foffset, NULL); proto_tree_add_item(atree, hf_time, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Account"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Account"); foffset = qualifiedname(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); proto_item_set_end(aitem, tvb, foffset); @@ -6666,20 +6478,18 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g break; case 0x00000004: /* Delivery Send2 */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object %d", ii+1); proto_tree_add_item(atree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Supplier ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Supplier ID"); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length==4) @@ -6690,51 +6500,43 @@ dissect_ndps_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, g proto_tree_add_item(atree, hf_ndps_event_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Containing Class"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Containing Class"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Containing Object"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Containing Object"); foffset = objectidentification(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Filter Class"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Filter Class"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object Class"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object Class"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object ID"); foffset = objectidentification(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Event Object ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Event Object ID"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); /* Start of AttributeSet */ number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, bitem, &ei_ndps_truncated); break; } - foffset = attribute_value(tvb, btree, foffset); + foffset = attribute_value(tvb, pinfo, btree, foffset); } proto_item_set_end(bitem, tvb, foffset); /* End of AttributeSet */ foffset = ndps_string(tvb, hf_ndps_message, atree, foffset, NULL); proto_tree_add_item(atree, hf_time, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Account"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Account"); foffset = qualifiedname(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); proto_item_set_end(aitem, tvb, foffset); @@ -6782,15 +6584,13 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ } /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Message"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Message"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -6806,14 +6606,13 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ } foffset = objectidentification(tvb, ndps_tree, foffset); - foffset = attribute_value(tvb, ndps_tree, foffset); /* Object Attribute Set */ + foffset = attribute_value(tvb, pinfo, ndps_tree, foffset); /* Object Attribute Set */ proto_tree_add_item(ndps_tree, hf_ndps_lib_error, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_tree_add_item(ndps_tree, hf_ndps_other_error, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -6835,8 +6634,7 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ @@ -6854,8 +6652,7 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ @@ -6873,14 +6670,13 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ } foffset = objectidentification(tvb, ndps_tree, foffset); - foffset = attribute_value(tvb, ndps_tree, foffset); /* Object Attribute Set */ + foffset = attribute_value(tvb, pinfo, ndps_tree, foffset); /* Object Attribute Set */ break; case 5: /* Document Access Error */ proto_tree_add_item(ndps_tree, hf_problem_type, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -6893,8 +6689,7 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ @@ -6903,16 +6698,15 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset break; case 6: /* Attribute Error */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %d", ii+1); proto_tree_add_item(atree, hf_problem_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; if (tvb_get_ntohl(tvb, foffset-4)==0) /* Standard Error */ @@ -6923,13 +6717,12 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Extended Error"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Extended Error"); foffset = objectidentifier(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); /* End of objectidentifier */ } - foffset = attribute_value(tvb, atree, foffset); /* Object Attribute Set */ + foffset = attribute_value(tvb, pinfo, atree, foffset); /* Object Attribute Set */ proto_item_set_end(aitem, tvb, foffset); } break; @@ -6944,8 +6737,7 @@ ndps_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset else /* Extended Error */ { /* Start of objectidentifier */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Extended Error"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Extended Error"); foffset = objectidentifier(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of objectidentifier */ @@ -7090,8 +6882,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "PSM Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "PSM Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); break; @@ -7130,17 +6921,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Attribute Set"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Attribute Set"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Object Attribute Set */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %d", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Object Attribute Set */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -7154,19 +6943,17 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int proto_tree_add_item(ndps_tree, hf_answer_time, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Continuation Option */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Continuation Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Continuation Option"); number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_options, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_options, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Option %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Option %d", ii+1); length=tvb_get_ntohl(tvb, foffset); length_remaining = tvb_length_remaining(tvb, foffset); if(length_remaining == -1 || (guint32) length_remaining < length) @@ -7179,56 +6966,51 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int } proto_item_set_end(aitem, tvb, foffset); /* Limit Encountered Option */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Limit Encountered Option"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Limit Encountered Option"); proto_tree_add_item(atree, hf_ndps_len, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_tree_add_item(atree, hf_ndps_limit_enc, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* Object Results Set */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Results Set"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Results Set"); number_of_items=tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_results, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_results, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated Result]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Results: (%d)", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Results: (%d)", ii+1); if (ii>0) { foffset += 2; } foffset = objectidentification(tvb, btree, foffset); number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(btree, hf_ndps_num_objects, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated Object]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Object: (%d)", jj+1); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Object: (%d)", jj+1); foffset = objectidentifier(tvb, ctree, foffset); foffset += align_4(tvb, foffset); number_of_items3 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ctree, hf_ndps_num_values, tvb, foffset, 4, number_of_items3); + expert_item = proto_tree_add_uint(ctree, hf_ndps_num_values, tvb, foffset, 4, number_of_items3); foffset += 4; for (kk = 0; kk < number_of_items3; kk++ ) { if (kk >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ctree, tvb, foffset, -1, "[Truncated Value]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - ditem = proto_tree_add_text(ctree, tvb, foffset, -1, "Value: (%d)", kk+1); - dtree = proto_item_add_subtree(ditem, ett_ndps); - foffset = attribute_value(tvb, dtree, foffset); + dtree = proto_tree_add_subtree_format(ctree, tvb, foffset, -1, ett_ndps, &ditem, "Value: (%d)", kk+1); + foffset = attribute_value(tvb, pinfo, dtree, foffset); proto_item_set_end(ditem, tvb, foffset); } proto_tree_add_item(ctree, hf_ndps_qualifier, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -7251,8 +7033,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x00000009: /* Interrupt */ case 0x0000000a: /* Pause */ /* Start of NWDPPrtContainedObjectId */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job ID"); foffset = ndps_string(tvb, hf_ndps_pa_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -7262,17 +7043,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Object Attribute Set"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Object Attribute Set"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Attribute %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Object Attribute Set */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Attribute %d", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Object Attribute Set */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -7306,27 +7085,23 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items = tvb_get_ntohl(tvb, foffset); /* Start of ResubmitJob Set */ proto_tree_add_uint(ndps_tree, hf_ndps_num_jobs, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Resubmit Job"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Resubmit Job"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Job %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Job %d", ii+1); /* Start of NWDPPrtContainedObjectId */ - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Old Job"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Old Job"); foffset = ndps_string(tvb, hf_ndps_pa_name, ctree, foffset, NULL); proto_tree_add_item(ctree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(citem, tvb, foffset); /* End of NWDPPrtContainedObjectId */ /* Start of NWDPPrtContainedObjectId */ - citem = proto_tree_add_text(btree, tvb, foffset, -1, "New Job"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "New Job"); foffset = ndps_string(tvb, hf_ndps_pa_name, ctree, foffset, NULL); proto_tree_add_item(ctree, hf_local_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; @@ -7336,17 +7111,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items2 = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ctree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items2); foffset += 4; - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Job Status"); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree(btree, tvb, foffset, -1, ett_ndps, &citem, "Job Status"); for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ctree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, citem, &ei_ndps_truncated); break; } - ditem = proto_tree_add_text(ctree, tvb, foffset, -1, "Object %d", jj+1); - dtree = proto_item_add_subtree(ditem, ett_ndps); - foffset = attribute_value(tvb, dtree, foffset); /* Object Attribute Set */ + dtree = proto_tree_add_subtree_format(ctree, tvb, foffset, -1, ett_ndps, &ditem, "Object %d", jj+1); + foffset = attribute_value(tvb, pinfo, dtree, foffset); /* Object Attribute Set */ proto_item_set_end(ditem, tvb, foffset); } proto_item_set_end(citem, tvb, foffset); @@ -7362,20 +7135,18 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 0x00000015: /* Reorder Job */ /* Start of AttributeSet */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Job Status"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Job Status"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Object Attribute Set */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object %d", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Object Attribute Set */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -7388,20 +7159,18 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x00000016: /* Pause PA */ case 0x00000017: /* Resume PA */ /* Start of AttributeSet */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Printer Status"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Printer Status"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Object %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); - foffset = attribute_value(tvb, btree, foffset); /* Object Attribute Set */ + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Object %d", ii+1); + foffset = attribute_value(tvb, pinfo, btree, foffset); /* Object Attribute Set */ proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); @@ -7432,8 +7201,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset += 4; proto_tree_add_item(ndps_tree, hf_ndps_persistence, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer Name"); foffset = qualifiedname(tvb, atree, foffset); length = tvb_get_ntohl(tvb, foffset); foffset += 4; @@ -7446,29 +7214,26 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset += 4; proto_item_set_end(aitem, tvb, foffset); /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Addresses"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Addresses"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Address %d", ii+1); foffset = address_item(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); /* End of Eventhandling */ length = tvb_get_ntohl(tvb, foffset); foffset += 4; @@ -7484,8 +7249,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int } break; case 0x00000022: /* Map GUID to NDS Name */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "NDS Printer Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "NDS Printer Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); if(error_val != 0) @@ -7505,31 +7269,28 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 0x00000024: /* ListEventProfiles2 */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_events, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Event %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Event %d", ii+1); /* Start of Eventhandling2 */ proto_tree_add_item(atree, hf_ndps_profile_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_tree_add_item(atree, hf_ndps_persistence, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Consumer Name"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Consumer Name"); foffset = qualifiedname(tvb, btree, foffset); foffset = ndps_string(tvb, hf_ndps_supplier_name, atree, foffset, NULL); proto_tree_add_item(atree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(bitem, tvb, foffset); /* Start of NameorID */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Method ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Method ID"); foffset = name_or_id(tvb, btree, foffset); foffset += align_4(tvb, foffset); proto_item_set_end(bitem, tvb, foffset); @@ -7537,39 +7298,34 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Delivery Addresses"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Delivery Addresses"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, bitem, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Address %d", ii+1); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Address %d", ii+1); foffset = address_item(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); } proto_item_set_end(bitem, tvb, foffset); - foffset = event_object_set(tvb, atree, foffset); - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Account"); - btree = proto_item_add_subtree(bitem, ett_ndps); + foffset = event_object_set(tvb, pinfo, atree, foffset); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Account"); foffset = qualifiedname(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); /* Start of object identifier set */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Notify Attributes"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, -1, ett_ndps, &bitem, "Notify Attributes"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(btree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - citem = proto_tree_add_text(btree, tvb, foffset, -1, "Attribute %d", ii+1); - ctree = proto_item_add_subtree(citem, ett_ndps); + ctree = proto_tree_add_subtree_format(btree, tvb, foffset, -1, ett_ndps, &citem, "Attribute %d", ii+1); foffset = objectidentifier(tvb, ctree, foffset); proto_item_set_end(citem, tvb, foffset); } @@ -7614,16 +7370,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 0x00000003: /* List Services */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_services, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_services, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Service %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Service %d", ii+1); proto_tree_add_item(atree, hf_ndps_service_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_tree_add_item(atree, hf_ndps_service_enabled, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -7650,16 +7405,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int { case 0x00000001: /* Bind */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Attribute %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Attribute %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length!=0) @@ -7683,17 +7437,16 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x00000008: /* List Local Servers */ case 0x00000009: /* List Servers */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); - foffset = server_entry(tvb, atree, foffset); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %d", ii+1); + foffset = server_entry(tvb, pinfo, atree, foffset); proto_item_set_end(aitem, tvb, foffset); } length = tvb_get_ntohl(tvb, foffset); @@ -7708,12 +7461,12 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 0x0000000a: /* List Known Registries */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_item(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, ENC_BIG_ENDIAN); + expert_item = proto_tree_add_item(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } aitem = proto_tree_add_item(ndps_tree, hf_ndps_client_server_type, tvb, foffset, 4, ENC_BIG_ENDIAN); @@ -7733,8 +7486,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset = return_code(tvb, pinfo, ndps_tree, foffset); break; case 0x0000000b: /* Get Registry NDS Object Name */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "NDS Printer Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "NDS Printer Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); foffset = return_code(tvb, pinfo, ndps_tree, foffset); @@ -7755,16 +7507,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int { case 0x00000001: /* Notify Bind */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_num_attributes, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Attribute %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Attribute %d", ii+1); length = tvb_get_ntohl(tvb, foffset); foffset += 4; if (length!=0) @@ -7781,7 +7532,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x00000003: /* Register Supplier */ proto_tree_add_item(ndps_tree, hf_ndps_session, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); foffset = return_code(tvb, pinfo, ndps_tree, foffset); break; case 0x00000004: /* Deregister Supplier */ @@ -7792,13 +7543,13 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x00000005: /* Add Profile */ proto_tree_add_item(ndps_tree, hf_ndps_profile_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); foffset = return_code(tvb, pinfo, ndps_tree, foffset); break; case 0x00000006: /* Remove Profile */ case 0x00000007: /* Modify Profile */ case 0x00000009: /* Report Event */ - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); foffset = return_code(tvb, pinfo, ndps_tree, foffset); break; case 0x00000008: /* List Profiles */ @@ -7810,8 +7561,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int foffset += 4; proto_tree_add_item(ndps_tree, hf_ndps_persistence, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Consumer Name"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Consumer Name"); foffset = qualifiedname(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); length = tvb_get_ntohl(tvb, foffset); @@ -7824,29 +7574,26 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int proto_tree_add_item(ndps_tree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Addresses"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Addresses"); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Address %d", ii+1); foffset = address_item(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } proto_item_set_end(aitem, tvb, foffset); - foffset = event_object_set(tvb, ndps_tree, foffset); + foffset = event_object_set(tvb, pinfo, ndps_tree, foffset); /* End of Eventhandling */ /* End of ProfileResultSet */ length = tvb_get_ntohl(tvb, foffset); @@ -7873,8 +7620,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 0x0000000c: /* Add Delivery Method */ /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); proto_item_set_end(aitem, tvb, foffset); /* End of NameorID */ @@ -7883,20 +7629,18 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x0000000e: /* List Delivery Methods */ /* Start of DeliveryMethodSet */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_delivery_method_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_delivery_method_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } /* Start of DeliveryMethod */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method %d", ii+1); /* Start of NameorID */ - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Method ID"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Method ID"); foffset = name_or_id(tvb, btree, foffset); foffset += align_4(tvb, foffset); proto_item_set_end(bitem, tvb, foffset); @@ -7915,8 +7659,7 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 0x0000000f: /* Get Delivery Method Information */ /* Start of DeliveryMethod */ /* Start of NameorID */ - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Method ID"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Method ID"); foffset = name_or_id(tvb, atree, foffset); /* End of NameorID */ foffset = ndps_string(tvb, hf_ndps_method_name, atree, foffset, NULL); @@ -7929,16 +7672,14 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_delivery_add_count, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Delivery Addresses"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Delivery Addresses"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Address %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Address %d", ii+1); foffset = address_item(tvb, btree, foffset); proto_item_set_end(bitem, tvb, foffset); } @@ -8003,16 +7744,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 1: /* Printer Definitions */ case 2: /* Printer Definitions Short */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Definition %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Definition %d", ii+1); if (tvb_get_ntohl(tvb, foffset)==0) { /* Offset for old type support */ foffset += 2; } @@ -8033,48 +7773,45 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 3: /* Banner Page Files */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Banner %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Banner %d", ii+1); foffset = ndps_string(tvb, hf_ndps_banner_name, atree, foffset, NULL); proto_item_set_end(aitem, tvb, foffset); } break; case 4: /* Font Types */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_font_type_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_font_type_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Font %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Font %d", ii+1); foffset = ndps_string(tvb, hf_font_type_name, atree, foffset, NULL); proto_item_set_end(aitem, tvb, foffset); } break; case 7: /* Font Files */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_font_file_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_font_file_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Font File %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Font File %d", ii+1); foffset = ndps_string(tvb, hf_font_file_name, atree, foffset, NULL); proto_item_set_end(aitem, tvb, foffset); } @@ -8083,16 +7820,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 12: /* Printer Driver Files 2 */ case 9: /* Generic Files */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "File %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "File %d", ii+1); foffset = ndps_string(tvb, hf_ndps_prn_file_name, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_prn_dir_name, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_inf_file_name, atree, foffset, NULL); @@ -8101,42 +7837,39 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 6: /* Printer Definition File */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_printer_def_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Definition %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Definition %d", ii+1); foffset = ndps_string(tvb, hf_ndps_prn_file_name, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_prn_dir_name, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_inf_file_name, atree, foffset, NULL); proto_item_set_end(aitem, tvb, foffset); } number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Item %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Item %d", ii+1); foffset = ndps_string(tvb, hf_ndps_def_file_name, atree, foffset, NULL); number_of_items2 = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_num_win31_keys, tvb, foffset, 4, number_of_items2); - bitem = proto_tree_add_text(atree, tvb, foffset, 4, "Windows 3.1 Keys"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, 4, ett_ndps, &bitem, "Windows 3.1 Keys"); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, bitem, &ei_ndps_truncated); break; } foffset = ndps_string(tvb, hf_ndps_windows_key, btree, foffset, NULL); @@ -8144,13 +7877,12 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int proto_item_set_end(bitem, tvb, foffset); number_of_items2 = tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(atree, hf_ndps_num_win95_keys, tvb, foffset, 4, number_of_items2); - bitem = proto_tree_add_text(atree, tvb, foffset, 4, "Windows 95 Keys"); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree(atree, tvb, foffset, 4, ett_ndps, &bitem, "Windows 95 Keys"); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(btree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, bitem, &ei_ndps_truncated); break; } foffset = ndps_string(tvb, hf_ndps_windows_key, btree, foffset, NULL); @@ -8162,29 +7894,27 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 10: /* Printer Definition File 2 */ foffset = ndps_string(tvb, hf_ndps_def_file_name, ndps_tree, foffset, NULL); number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_os_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_os_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "OS %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "OS %d", ii+1); proto_tree_add_item(atree, hf_os_type, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; number_of_items2 = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(atree, hf_ndps_num_windows_keys, tvb, foffset, 4, number_of_items2); + expert_item = proto_tree_add_uint(atree, hf_ndps_num_windows_keys, tvb, foffset, 4, number_of_items2); foffset += 4; for (jj = 0; jj < number_of_items2; jj++ ) { if (jj >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Key %d", jj+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Key %d", jj+1); foffset = ndps_string(tvb, hf_ndps_windows_key, btree, foffset, NULL); proto_item_set_end(bitem, tvb, foffset); } @@ -8195,16 +7925,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int case 11: /* Printer Driver Types 2 */ case 13: /* Printer Driver Types Archive */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_printer_type_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_printer_type_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Type %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Type %d", ii+1); foffset = ndps_string(tvb, hf_ndps_printer_manuf, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_printer_type, atree, foffset, NULL); foffset = ndps_string(tvb, hf_ndps_prn_file_name, atree, foffset, NULL); @@ -8218,16 +7947,15 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int break; case 14: /* Languages Available */ number_of_items = tvb_get_ntohl(tvb, foffset); - proto_tree_add_uint(ndps_tree, hf_ndps_language_count, tvb, foffset, 4, number_of_items); + expert_item = proto_tree_add_uint(ndps_tree, hf_ndps_language_count, tvb, foffset, 4, number_of_items); foffset += 4; for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(ndps_tree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, expert_item, &ei_ndps_truncated); break; } - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Language %d", ii+1); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree_format(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Language %d", ii+1); proto_tree_add_item(atree, hf_ndps_language_id, tvb, foffset, 4, ENC_BIG_ENDIAN); foffset += 4; proto_item_set_end(aitem, tvb, foffset); @@ -8317,16 +8045,14 @@ dissect_ndps_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ndps_tree, int number_of_items=tvb_get_ntohl(tvb, foffset); proto_tree_add_uint(ndps_tree, hf_ndps_item_count, tvb, foffset, 4, number_of_items); foffset += 4; - aitem = proto_tree_add_text(ndps_tree, tvb, foffset, -1, "Failed Items"); - atree = proto_item_add_subtree(aitem, ett_ndps); + atree = proto_tree_add_subtree(ndps_tree, tvb, foffset, -1, ett_ndps, &aitem, "Failed Items"); for (ii = 0; ii < number_of_items; ii++ ) { if (ii >= NDPS_MAX_ITEMS) { - proto_tree_add_text(atree, tvb, foffset, -1, "[Truncated]"); + expert_add_info(pinfo, aitem, &ei_ndps_truncated); break; } - bitem = proto_tree_add_text(atree, tvb, foffset, -1, "Item %d", ii+1); - btree = proto_item_add_subtree(bitem, ett_ndps); + btree = proto_tree_add_subtree_format(atree, tvb, foffset, -1, ett_ndps, &bitem, "Item %d", ii+1); length=tvb_get_ntohl(tvb, foffset); length_remaining = tvb_length_remaining(tvb, foffset); if(length_remaining == -1 || (guint32) length_remaining < length) @@ -9804,6 +9530,7 @@ proto_register_ndps(void) { &ei_ndps_problem_type, { "ndps.problem_type.expert", PI_RESPONSE_CODE, PI_NOTE, "Fault", EXPFILL }}, { &ei_ndps_return_code, { "ndps.return_code.expert", PI_RESPONSE_CODE, PI_NOTE, "Fault", EXPFILL }}, { &ei_ndps_rpc_acc_stat, { "ndps.rpc_acc_stat.expert", PI_RESPONSE_CODE, PI_NOTE, "Fault", EXPFILL }}, + { &ei_ndps_truncated, { "ndps.truncated", PI_PROTOCOL, PI_WARN, "Truncated", EXPFILL }}, }; module_t *ndps_module;