convert to proto_tree_add_subtree[_format]
authorMichael Mann <mmann78@netscape.net>
Tue, 8 Jul 2014 18:47:17 +0000 (14:47 -0400)
committerMichael Mann <mmann78@netscape.net>
Wed, 9 Jul 2014 00:25:04 +0000 (00:25 +0000)
Change-Id: I8d66b1bc7dbdfee3d4bf6fd3b3c21c6323b66f44
Reviewed-on: https://code.wireshark.org/review/2946
Reviewed-by: Michael Mann <mmann78@netscape.net>
41 files changed:
epan/dissectors/packet-s5066dts.c
epan/dissectors/packet-s5066sis.c
epan/dissectors/packet-sasp.c
epan/dissectors/packet-sbc.c
epan/dissectors/packet-sbus.c
epan/dissectors/packet-sccp.c
epan/dissectors/packet-scriptingservice.c
epan/dissectors/packet-scsi-mmc.c
epan/dissectors/packet-scsi-osd.c
epan/dissectors/packet-scsi-sbc.c
epan/dissectors/packet-scsi.c
epan/dissectors/packet-sctp.c
epan/dissectors/packet-sdp.c
epan/dissectors/packet-selfm.c
epan/dissectors/packet-sercosiii.c
epan/dissectors/packet-ses.c
epan/dissectors/packet-sflow.c
epan/dissectors/packet-sip.c
epan/dissectors/packet-sita.c
epan/dissectors/packet-skinny.c
epan/dissectors/packet-smb-logon.c
epan/dissectors/packet-smb-pipe.c
epan/dissectors/packet-smb.c
epan/dissectors/packet-smb2.c
epan/dissectors/packet-sml.c
epan/dissectors/packet-smpp.c
epan/dissectors/packet-sna.c
epan/dissectors/packet-sndcp-xid.c
epan/dissectors/packet-sndcp.c
epan/dissectors/packet-socks.c
epan/dissectors/packet-spdy.c
epan/dissectors/packet-spice.c
epan/dissectors/packet-srvloc.c
epan/dissectors/packet-sscop.c
epan/dissectors/packet-ssh.c
epan/dissectors/packet-ssl-utils.c
epan/dissectors/packet-ssl.c
epan/dissectors/packet-starteam.c
epan/dissectors/packet-stat.c
epan/dissectors/packet-sua.c
epan/dissectors/packet-synphasor.c

index 188adfb6c52d169258d82ed025746097eb422101..d9151dd605cbae2eef456e2dfd559c1321665ed3 100644 (file)
@@ -423,13 +423,11 @@ static void dissect_s5066dts_eow_hftrp(tvbuff_t *tvb,  packet_info * pinfo, guin
 static guint dissect_s5066dts_eow(tvbuff_t *tvb,  packet_info * pinfo, guint offset, proto_tree *tree,
         guint pdu_type)
 {
-    proto_item *ti = NULL;
-    proto_tree *eow_tree = NULL;
+    proto_tree *eow_tree;
     guint eow_type;
 
     eow_type = tvb_get_guint8(tvb, offset) & 0x0F;
-    ti = proto_tree_add_text(tree, tvb, offset, 2, "EOW Field");
-    eow_tree = proto_item_add_subtree(ti, ett_s5066dts_eow);
+    eow_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_s5066dts_eow, NULL, "EOW Field");
     proto_tree_add_item(eow_tree, hf_s5066dts_eow_type, tvb, offset, 1, ENC_BIG_ENDIAN); offset++;
 
     switch (eow_type)
@@ -460,8 +458,7 @@ static guint dissect_s5066dts_address(tvbuff_t *tvb, guint offset, proto_tree *t
         guint addr_size)
 {
     guint32 source_address = 0, destination_address = 0;
-    proto_item *ti;
-    proto_tree *address_tree = NULL;
+    proto_tree *address_tree;
     unsigned int i;
 
     for ( i = 0; i < addr_size; i++)
@@ -474,8 +471,7 @@ static guint dissect_s5066dts_address(tvbuff_t *tvb, guint offset, proto_tree *t
                 : (tvb_get_guint8(tvb, offset + (i + addr_size) / 2))) & 0x0F);
     }
 
-    ti = proto_tree_add_text(tree, tvb, offset, addr_size, "Destination & Source Addresses");
-    address_tree = proto_item_add_subtree(ti, ett_s5066dts_address);
+    address_tree = proto_tree_add_subtree(tree, tvb, offset, addr_size, ett_s5066dts_address, NULL, "Destination & Source Addresses");
 
     proto_tree_add_text(address_tree,
             tvb,
@@ -644,7 +640,6 @@ static guint dissect_s5066dts_exp_ack_only(tvbuff_t *tvb, guint offset, proto_tr
 static guint dissect_s5066dts_management(tvbuff_t *tvb, guint offset, proto_tree *tree, guint header_size)
 {
     guint8 eow_content;
-    proto_item *hftrp_proto_item = NULL;
     proto_tree *hftrp_token_tree = NULL;
     guint eow_type;
     guint extended_message_size;
@@ -674,9 +669,9 @@ static guint dissect_s5066dts_management(tvbuff_t *tvb, guint offset, proto_tree
         if (eow_type == S5066_EOW_HFTRP_TOKEN)
         {
             /* Add a new subtree for HFTRP token details */
-            hftrp_proto_item = proto_tree_add_text(tree, tvb, offset, extended_message_size, "HFTRP Token (%s)",
+            hftrp_token_tree = proto_tree_add_subtree_format(tree, tvb, offset, extended_message_size,
+                    ett_s5066dts_hftrp_token, NULL, "HFTRP Token (%s)",
                     val_to_str_const(eow_content, s5066dts_eow_hftrp_frame_control, "UNKNOWN_HFTRP_TOKEN"));
-            hftrp_token_tree = proto_item_add_subtree(hftrp_proto_item, ett_s5066dts_hftrp_token);
             proto_tree_add_item(hftrp_token_tree,
                     hf_s5066dts_management_extended_message_hftrp_payload_size, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2;
             proto_tree_add_item(hftrp_token_tree,
@@ -869,8 +864,7 @@ static int dissect_s5066dts(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
         proto_tree_add_item(s5066dts_tree, hf_s5066dts_header_size, tvb, offset, 1, ENC_BIG_ENDIAN); offset++;
         offset = dissect_s5066dts_address(tvb, offset, s5066dts_tree, pinfo, address_size);
         header_size = tvb_get_guint8(tvb, S5066_DPDU_SIZE_OF_HEADER_INDEX) & 0x1F;
-        ti = proto_tree_add_text(s5066dts_tree, tvb, offset, header_size - 6, "D_PDU Type Specific Header");
-        pdu_tree = proto_item_add_subtree(ti, ett_s5066dts_pdu);
+        pdu_tree = proto_tree_add_subtree(s5066dts_tree, tvb, offset, header_size - 6, ett_s5066dts_pdu, NULL, "D_PDU Type Specific Header");
 
         switch (pdu_type)
         {
index 832a027a75f9f4bc47a2a1eea63a44c0e2f9129f..6b95708b301cd15e8de287873dd5f614e9c06ac0 100644 (file)
@@ -823,18 +823,17 @@ proto_reg_handoff_s5066(void)
 static guint
 dissect_s5066_address(tvbuff_t *tvb, guint offset, proto_tree *tree, gint source)
 {
-        proto_item *ti = NULL;
-        proto_tree *s5066_tree_address = NULL;
+    proto_tree *s5066_tree_address;
        guint32 addr;
 
-        if (source) {
-               ti = proto_tree_add_text(tree, tvb, offset, 4, "Source Address");
+    if (source) {
+               s5066_tree_address = proto_tree_add_subtree(tree, tvb, offset, 4, ett_s5066_address, NULL, "Source Address");
        }
        else {
-               ti = proto_tree_add_text(tree, tvb, offset, 4, "Destination Address");
+               s5066_tree_address = proto_tree_add_subtree(tree, tvb, offset, 4, ett_s5066_address, NULL, "Destination Address");
        }
-        s5066_tree_address = proto_item_add_subtree(ti, ett_s5066_address);
-       proto_tree_add_item(s5066_tree_address, hf_s5066_ad_size, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+    proto_tree_add_item(s5066_tree_address, hf_s5066_ad_size, tvb, offset, 1, ENC_BIG_ENDIAN);
        proto_tree_add_item(s5066_tree_address, hf_s5066_ad_group, tvb, offset, 1, ENC_BIG_ENDIAN);
        addr = tvb_get_ntohl(tvb, offset);
        addr = addr & 0x1FFFFFFF;
@@ -846,11 +845,9 @@ dissect_s5066_address(tvbuff_t *tvb, guint offset, proto_tree *tree, gint source
 static guint
 dissect_s5066_servicetype(tvbuff_t *tvb, guint offset, proto_tree *tree)
 {
-        proto_item *ti = NULL;
-        proto_tree *s5066_tree_servicetype = NULL;
+       proto_tree *s5066_tree_servicetype;
 
-        ti = proto_tree_add_text(tree, tvb, offset, 2, "Service type");
-        s5066_tree_servicetype = proto_item_add_subtree(ti, ett_s5066_servicetype);
+       s5066_tree_servicetype = proto_tree_add_subtree(tree, tvb, offset, 2, ett_s5066_servicetype, NULL, "Service type");
 
        proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_txmode, tvb, offset, 1, ENC_BIG_ENDIAN);
        proto_tree_add_item(s5066_tree_servicetype, hf_s5066_st_delivery_confirmation, tvb, offset, 1, ENC_BIG_ENDIAN);
index 6ac2eaf07befc34601918bddb991c48efb707c1b..77266a46702e1deb8aad280929f1328e14c2113c 100644 (file)
@@ -478,12 +478,10 @@ dissect_sasp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
 
 static void dissect_reg_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *reg_tree;
     proto_tree *reg_req_data;
     guint16     gmd_cnt, i;
 
-    reg_tree = proto_tree_add_text(pay_load, tvb, offset, -1, "Reg Request");
-    reg_req_data = proto_item_add_subtree(reg_tree, ett_sasp_reg_req_sz);
+    reg_req_data = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_reg_req_sz, NULL, "Reg Request");
 
     /* Reg Req Size */
     proto_tree_add_item(reg_req_data, hf_sasp_reg_req_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -506,11 +504,9 @@ static void dissect_reg_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 
 static void dissect_reg_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *reg_rep;
     proto_tree *reg_rep_tree;
 
-    reg_rep = proto_tree_add_text(pay_load, tvb, offset, -1 , "Reg Reply");
-    reg_rep_tree = proto_item_add_subtree(reg_rep, ett_sasp_reg_rep);
+    reg_rep_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1 , ett_sasp_reg_rep, NULL, "Reg Reply");
 
     /* Size */
     proto_tree_add_item(reg_rep_tree, hf_sasp_reg_rep_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -526,15 +522,13 @@ static void dissect_dereg_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offse
     /*proto_item *dereg_req_reason_flag;*/
     /*proto_tree *dereg_req_reason_flag_tree;*/
     guint16          gmd_cnt, i;
-    proto_item      *dereg_tree;
     proto_tree      *dereg_req_data;
     guint8           reason_flag;
     static gboolean  first_flag         = TRUE;
     wmem_strbuf_t   *reasonflags_strbuf = wmem_strbuf_new_label(wmem_packet_scope());
     static const gchar *fstr[] = {"No Reason", "Learned & Purposeful" };
 
-    dereg_tree = proto_tree_add_text(pay_load, tvb, offset, -1 , "DeReg Request");
-    dereg_req_data = proto_item_add_subtree(dereg_tree, ett_sasp_dereg_req_sz);
+    dereg_req_data = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_dereg_req_sz, NULL, "DeReg Request");
 
     /* Size */
     proto_tree_add_item(dereg_req_data, hf_sasp_dereg_req_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -577,11 +571,9 @@ static void dissect_dereg_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offse
 
 static void dissect_dereg_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *dereg_rep;
     proto_tree *dereg_rep_tree;
 
-    dereg_rep = proto_tree_add_text(pay_load, tvb, offset, -1 , "Dereg Reply");
-    dereg_rep_tree = proto_item_add_subtree(dereg_rep, ett_sasp_dereg_rep);
+    dereg_rep_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_dereg_rep, NULL, "Dereg Reply");
 
     /* Size */
     proto_tree_add_item(dereg_rep_tree, hf_sasp_dereg_rep_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -594,12 +586,10 @@ static void dissect_dereg_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32 offse
 
 static void dissect_sendwt(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *sendwt;
     proto_tree *sendwt_tree;
     guint16     gwed_cnt, i;
 
-    sendwt = proto_tree_add_text(pay_load, tvb, offset, -1 , "Send Weight");
-    sendwt_tree = proto_item_add_subtree(sendwt, ett_sasp_sendwt);
+    sendwt_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_sendwt, NULL, "Send Weight");
 
     /* Size */
     proto_tree_add_item(sendwt_tree, hf_sasp_sendwt_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -618,12 +608,10 @@ static void dissect_sendwt(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 
 static void dissect_setmemstate_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *setmemstate;
     proto_tree *setmemstate_req_data;
     guint16     gmsd_cnt, i;
 
-    setmemstate = proto_tree_add_text(pay_load, tvb, offset, -1 , "Set Mem State Request");
-    setmemstate_req_data = proto_item_add_subtree(setmemstate, ett_sasp_setmemstate_req);
+    setmemstate_req_data = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_setmemstate_req, NULL, "Set Mem State Request");
 
     /* Size */
     proto_tree_add_item(setmemstate_req_data, hf_sasp_setmemstate_req_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -644,11 +632,9 @@ static void dissect_setmemstate_req(tvbuff_t *tvb, proto_tree *pay_load, guint32
 
 static void dissect_setmemstate_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *setmemstate_rep;
     proto_tree *setmemstate_rep_tree;
 
-    setmemstate_rep = proto_tree_add_text(pay_load, tvb, offset, -1 , "Set Mem State Reply");
-    setmemstate_rep_tree = proto_item_add_subtree(setmemstate_rep, ett_sasp_setmemstate_rep);
+    setmemstate_rep_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_setmemstate_rep, NULL, "Set Mem State Reply");
 
     /* Size */
     proto_tree_add_item(setmemstate_rep_tree, hf_sasp_setmemstate_rep_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -715,13 +701,11 @@ static guint32 dissect_memdatacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32
 
 static guint32 dissect_grpdatacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *grpdatacomp;
     proto_tree *grpdatacomp_tree;
     guint8      LB_uid_len;
     guint8      grp_name_len;
 
-    grpdatacomp = proto_tree_add_text(pay_load, tvb, offset, -1 , "Group Data Component");
-    grpdatacomp_tree = proto_item_add_subtree(grpdatacomp, ett_sasp_grpdatacomp);
+    grpdatacomp_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_grpdatacomp, NULL, "Group Data Component");
 
     /*Type*/
     proto_tree_add_item(grpdatacomp_tree, hf_sasp_grpdatacomp, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -760,13 +744,11 @@ static guint32 dissect_grpdatacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32
 
 static guint32 dissect_grp_memdatacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *grp_memdatacomp;
     proto_tree *grp_memdatacomp_tree;
     guint16     mem_cnt;
     guint16     i;
 
-    grp_memdatacomp = proto_tree_add_text(pay_load, tvb, offset, -1 , "Group Of Member Data");
-    grp_memdatacomp_tree = proto_item_add_subtree(grp_memdatacomp, ett_sasp_grp_memdatacomp);
+    grp_memdatacomp_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_grp_memdatacomp, NULL, "Group Of Member Data");
 
     /* Group MEM Data */
     proto_tree_add_item(grp_memdatacomp_tree, hf_sasp_grp_memdatacomp, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -794,12 +776,10 @@ static guint32 dissect_grp_memdatacomp(tvbuff_t *tvb, proto_tree *pay_load, guin
 
 static void dissect_wt_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *get_wt_data;
     proto_tree *get_wt_tree;
     guint16     gd_cnt, i;
 
-    get_wt_data = proto_tree_add_text(pay_load, tvb, offset, -1 , "Get Wt Req");
-    get_wt_tree = proto_item_add_subtree(get_wt_data, ett_sasp_getwt);
+    get_wt_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_getwt, NULL, "Get Wt Req");
 
     /* Size */
     proto_tree_add_item(get_wt_tree, hf_sasp_wt_req_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -818,12 +798,10 @@ static void dissect_wt_req(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 
 static void dissect_wt_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *wt_rep;
     proto_tree *wt_rep_tree;
     guint16     gwed_cnt, i;
 
-    wt_rep = proto_tree_add_text(pay_load, tvb, offset, -1 , "Get Weights Reply");
-    wt_rep_tree = proto_item_add_subtree(wt_rep, ett_sasp_wt_rep);
+    wt_rep_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_wt_rep, NULL, "Get Weights Reply");
 
     /* Size */
     proto_tree_add_item(wt_rep_tree, hf_sasp_wt_rep_sz, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -859,11 +837,9 @@ static void dissect_setlbstate_req(tvbuff_t *tvb, proto_tree *pay_load, guint32
         NULL
     };
 
-    proto_item *setlbstate_req;
     proto_tree *setlbstate_req_tree;
 
-    setlbstate_req = proto_tree_add_text(pay_load, tvb, offset, -1 , "Set LB State Req");
-    setlbstate_req_tree = proto_item_add_subtree(setlbstate_req, ett_sasp_setlbstate_req);
+    setlbstate_req_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_setlbstate_req, NULL, "Set LB State Req");
 
     /* Size*/
     proto_tree_add_item(setlbstate_req_tree, hf_sasp_setlbstate_req_sz,
@@ -894,11 +870,9 @@ static void dissect_setlbstate_req(tvbuff_t *tvb, proto_tree *pay_load, guint32
 
 static void dissect_setlbstate_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *setlbstate_rep;
     proto_tree *setlbstate_rep_tree;
 
-    setlbstate_rep = proto_tree_add_text(pay_load, tvb, offset, -1 , "Set LB State Rep");
-    setlbstate_rep_tree = proto_item_add_subtree(setlbstate_rep, ett_sasp_setlbstate_rep);
+    setlbstate_rep_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_setlbstate_rep, NULL, "Set LB State Rep");
 
     /* Size */
     proto_tree_add_item(setlbstate_rep_tree, hf_sasp_setlbstate_rep_sz,
@@ -913,14 +887,12 @@ static void dissect_setlbstate_rep(tvbuff_t *tvb, proto_tree *pay_load, guint32
 
 static guint32 dissect_grp_memstatedatacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *grp_memstatedatacomp;
     proto_tree *grp_memstatedatacomp_tree;
     guint16     mem_cnt;
     guint16     i;
 
-    grp_memstatedatacomp = proto_tree_add_text(pay_load, tvb, offset, -1 , "Group Mem State Comp");
-    grp_memstatedatacomp_tree = proto_item_add_subtree(grp_memstatedatacomp,
-        ett_sasp_grp_memstatedatacomp);
+    grp_memstatedatacomp_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1,
+                        ett_sasp_grp_memstatedatacomp, NULL, "Group Mem State Comp");
 
     /* Type */
     proto_tree_add_item(grp_memstatedatacomp_tree, hf_sasp_grp_memstatedatacomp,
@@ -953,14 +925,12 @@ static guint32 dissect_grp_memstatedatacomp(tvbuff_t *tvb, proto_tree *pay_load,
 static guint32 dissect_memstatedatacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
     proto_tree *memstatedatacomp_tree;
-    proto_item *memstatedatacomp;
     proto_tree *memdatacomp_tree;
     guint8      memstate_flag;
 
     offset = dissect_memdatacomp(tvb, pay_load, offset, &memdatacomp_tree);
 
-    memstatedatacomp = proto_tree_add_text(memdatacomp_tree, tvb, offset, -1 , "Member State Data");
-    memstatedatacomp_tree = proto_item_add_subtree(memstatedatacomp, ett_sasp_memstatedatacomp);
+    memstatedatacomp_tree = proto_tree_add_subtree(memdatacomp_tree, tvb, offset, -1, ett_sasp_memstatedatacomp, NULL, "Member State Data");
 
     /* Type */
     proto_tree_add_item(memstatedatacomp_tree, hf_sasp_memstatedatacomp_instance,
@@ -990,7 +960,6 @@ static guint32 dissect_memstatedatacomp(tvbuff_t *tvb, proto_tree *pay_load, gui
 static guint32 dissect_weight_entry_data_comp(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
     proto_tree *weight_entry_data_comp_tree;
-    proto_item *weight_entry_data_comp;
 
     static const int *wtflags[] = {
         &hf_sasp_wed_contactsuccess_flag,
@@ -1002,9 +971,8 @@ static guint32 dissect_weight_entry_data_comp(tvbuff_t *tvb, proto_tree *pay_loa
 
     offset = dissect_memdatacomp(tvb, pay_load, offset, NULL);
 
-    weight_entry_data_comp = proto_tree_add_text(pay_load, tvb, offset, -1 , "Weight Entry Data");
-    weight_entry_data_comp_tree = proto_item_add_subtree(weight_entry_data_comp,
-        ett_sasp_weight_entry_data_comp);
+    weight_entry_data_comp_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1,
+                            ett_sasp_weight_entry_data_comp, NULL, "Weight Entry Data");
 
     /* Type */
     proto_tree_add_item(weight_entry_data_comp_tree, hf_sasp_weight_entry_data_comp_type,
@@ -1035,14 +1003,11 @@ static guint32 dissect_weight_entry_data_comp(tvbuff_t *tvb, proto_tree *pay_loa
 
 static guint32 dissect_grp_wt_entry_datacomp(tvbuff_t *tvb, proto_tree *pay_load, guint32 offset)
 {
-    proto_item *grp_wt_entry_datacomp;
     proto_tree *grp_wt_entry_datacomp_tree;
     guint16     wt_entry_cnt;
     guint16     i;
 
-    grp_wt_entry_datacomp = proto_tree_add_text(pay_load, tvb, offset, -1 , "Group of Wt Entry Data");
-    grp_wt_entry_datacomp_tree = proto_item_add_subtree(grp_wt_entry_datacomp,
-        ett_sasp_grp_wt_entry_datacomp);
+    grp_wt_entry_datacomp_tree = proto_tree_add_subtree(pay_load, tvb, offset, -1, ett_sasp_grp_wt_entry_datacomp, NULL, "Group of Wt Entry Data");
 
     /* Type */
     proto_tree_add_item(grp_wt_entry_datacomp_tree, hf_sasp_grp_wt_entry_datacomp_type,
index e23765094fbf16a8aac48a0ebfed2d59cc6dc7e9..8e57f58942cc60b49651dab6dc0b03a80fc01930 100644 (file)
@@ -116,7 +116,6 @@ dissect_sbc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
     proto_item  *ti;
     proto_tree  *sbc_tree;
     proto_item  *pitem;
-    proto_item  *ritem;
     proto_tree  *rtree;
     gint        offset = 0;
     guint8      number_of_frames;
@@ -199,9 +198,8 @@ dissect_sbc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
 
         expected_speed_data = (frame_length * frequency) / (sbc_subbands * sbc_blocks);
 
-        ritem = proto_tree_add_text(sbc_tree, tvb, offset, 4 + frame_length,
-                "Frame: %3u/%3u", counter, number_of_frames);
-        rtree = proto_item_add_subtree(ritem, ett_sbc_list);
+        rtree = proto_tree_add_subtree_format(sbc_tree, tvb, offset, 4 + frame_length,
+                ett_sbc_list, NULL, "Frame: %3u/%3u", counter, number_of_frames);
 
         pitem = proto_tree_add_item(rtree, hf_sbc_syncword, tvb, offset, 1, ENC_BIG_ENDIAN);
         syncword = tvb_get_guint8(tvb, offset);
@@ -210,32 +208,32 @@ dissect_sbc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
         }
         offset += 1;
 
-        proto_tree_add_item(ritem, hf_sbc_sampling_frequency, tvb, offset, 1, ENC_BIG_ENDIAN);
-        proto_tree_add_item(ritem, hf_sbc_blocks,             tvb, offset, 1, ENC_BIG_ENDIAN);
-        proto_tree_add_item(ritem, hf_sbc_channel_mode,       tvb, offset, 1, ENC_BIG_ENDIAN);
-        proto_tree_add_item(ritem, hf_sbc_allocation_method,  tvb, offset, 1, ENC_BIG_ENDIAN);
-        proto_tree_add_item(ritem, hf_sbc_subbands,           tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_sampling_frequency, tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_blocks,             tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_channel_mode,       tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_allocation_method,  tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_subbands,           tvb, offset, 1, ENC_BIG_ENDIAN);
         offset += 1;
 
-        proto_tree_add_item(ritem, hf_sbc_bitpool,            tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_bitpool,            tvb, offset, 1, ENC_BIG_ENDIAN);
         offset += 1;
 
-        proto_tree_add_item(ritem, hf_sbc_crc_check,          tvb, offset, 1, ENC_BIG_ENDIAN);
+        proto_tree_add_item(rtree, hf_sbc_crc_check,          tvb, offset, 1, ENC_BIG_ENDIAN);
         offset += 1;
 
-        proto_tree_add_item(ritem, hf_sbc_data,  tvb, offset, frame_length, ENC_NA);
+        proto_tree_add_item(rtree, hf_sbc_data,  tvb, offset, frame_length, ENC_NA);
         offset += frame_length;
 
 /* TODO: expert_info for invalid CRC */
 
-        pitem = proto_tree_add_uint(ritem, hf_sbc_expected_data_speed, tvb, offset, 0, expected_speed_data / 1024);
+        pitem = proto_tree_add_uint(rtree, hf_sbc_expected_data_speed, tvb, offset, 0, expected_speed_data / 1024);
         proto_item_append_text(pitem, " KiB/s");
         PROTO_ITEM_SET_GENERATED(pitem);
 
         frame_duration = (((double) frame_length / (double) expected_speed_data) * 1000.0);
         cummulative_frame_duration += frame_duration;
 
-        pitem = proto_tree_add_double(ritem, hf_sbc_frame_duration, tvb, offset, 0, frame_duration);
+        pitem = proto_tree_add_double(rtree, hf_sbc_frame_duration, tvb, offset, 0, frame_duration);
         proto_item_append_text(pitem, " ms");
         PROTO_ITEM_SET_GENERATED(pitem);
 
index 6ffa97f0c3def0dc7cad7f76dc36e2642257b4fe..f70cc2330e3267a59794c58675eadc2cefde04a9 100644 (file)
@@ -649,7 +649,7 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
 {
 
 /* Set up structures needed to add the protocol subtree and manage it */
-       proto_item *ti, *et, *dt, *hi, *cs;
+       proto_item *ti, *hi, *cs;
        proto_tree *sbus_tree, *ethsbus_tree, *sbusdata_tree;
 
        gint i;        /*for CRC calculation*/
@@ -903,8 +903,7 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
               sbus_tree = proto_item_add_subtree(ti, ett_sbus);
 
 /*Add subtree for Ether-S-Bus header*/
-              et = proto_tree_add_text(sbus_tree, tvb, offset, 8, "Ether-S-Bus header");
-              ethsbus_tree = proto_item_add_subtree(et, ett_sbus_ether);
+              ethsbus_tree = proto_tree_add_subtree(sbus_tree, tvb, offset, 8, ett_sbus_ether, NULL, "Ether-S-Bus header");
 
 /* add an item to the subtree*/
               sbus_eth_len = tvb_get_ntohl(tvb,offset);
@@ -993,10 +992,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                                        hf_sbus_addr_rtc, tvb, offset, 2, ENC_BIG_ENDIAN);
                                    offset += 2;
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            ((sbus_media_cnt) * 4),"Data");
-
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            ((sbus_media_cnt) * 4), ett_sbus_data, NULL, "Data");
                                    for (i=((sbus_media_cnt)); i>0; i--) {
                                           proto_tree_add_item(sbusdata_tree,
                                                               hf_sbus_data_rtc, tvb, offset,
@@ -1025,10 +1022,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                                        hf_sbus_fio_count, tvb, offset, 1, sbus_fio_cnt);
                                    offset += 1;
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            sbus_media_cnt,"Data");
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            sbus_media_cnt, ett_sbus_data, NULL, "Data");
 
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                    for (i=sbus_media_cnt; i>0; i--) {
                                           sbus_helper = 1;
                                           sbus_show_bin = 0;
@@ -1066,9 +1062,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    proto_tree_add_text(sbus_tree, tvb, offset, 2,
                                                        "Calendar week: %x, Week day: %x", sbus_helper, sbus_helper1);
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            8, "Clock data");
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            8, ett_sbus_data, NULL, "Clock data");
 
                                    proto_tree_add_item(sbusdata_tree,
                                                        hf_sbus_week_day, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -1107,10 +1102,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                                        hf_sbus_addr_68k, tvb, offset, 3, ENC_BIG_ENDIAN);
                                    offset += 3;
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            ((sbus_media_cnt) * 4),"Program lines");
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            ((sbus_media_cnt) * 4), ett_sbus_data, NULL, "Program lines");
 
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                    for (i=((sbus_media_cnt)); i>0; i--) {
                                           proto_tree_add_item(sbusdata_tree,
                                                               hf_sbus_data_rtc, tvb, offset,
@@ -1145,10 +1139,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                                        hf_sbus_addr_68k, tvb, offset, 3, ENC_BIG_ENDIAN);
                                    offset += 3;
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            ((sbus_media_cnt) * 4),"Data (bytes)");
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            ((sbus_media_cnt) * 4), ett_sbus_data, NULL, "Data (bytes)");
 
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                    for (i=sbus_media_cnt; i>0; i--) {
                                           proto_tree_add_item(sbusdata_tree,
                                                               hf_sbus_data_byte, tvb, offset,
@@ -1203,10 +1196,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    offset += 1;
 
                                    if (sbus_web_size > 1) {
-                                          dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                                   (sbus_web_size - 1),"Data (bytes)");
+                                          sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                                   (sbus_web_size - 1), ett_sbus_data, NULL, "Data (bytes)");
 
-                                          sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                           for (i=sbus_web_size -1 ; i>0; i--) {
                                                  proto_tree_add_item(sbusdata_tree,
                                                                      hf_sbus_data_byte, tvb, offset,
@@ -1507,9 +1499,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                             case SBUS_RD_PROGRAM_LINE:
                             case SBUS_RD_USER_EEPROM_REGISTER:
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            ((request_val->count) * 4),"Data");
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            ((request_val->count) * 4), ett_sbus_data, NULL, "Data");
                                    for (i=(request_val->count); i>0; i--) {
                                           proto_tree_add_item(sbusdata_tree,
                                                               hf_sbus_data_rtc, tvb, offset,
@@ -1530,9 +1521,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                             case SBUS_RD_INPUT:
                             case SBUS_RD_OUTPUT:
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            (((request_val->count) + 7) / 8), "Data");
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            (((request_val->count) + 7) / 8), ett_sbus_data, NULL, "Data");
 
                                    for (i=(((request_val->count) + 7) / 8); i>0; i--) {
                                           sbus_helper = 1;
@@ -1571,9 +1561,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    proto_tree_add_text(sbus_tree, tvb, offset, 2,
                                                        "Calendar week: %x, Week day: %x", sbus_helper, sbus_helper1);
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            8, "Clock data");
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            8, ett_sbus_data, NULL, "Clock data");
 
                                    proto_tree_add_item(sbusdata_tree,
                                                        hf_sbus_week_day, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -1624,9 +1613,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    /* Response for Status Flags*/
                             case SBUS_RD_STATUSFLAG_ACCU:
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            1,"ACCU and arithmetic status");
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            1, ett_sbus_data, NULL, "ACCU and arithmetic status");
 
                                    proto_tree_add_item(sbusdata_tree, hf_sbus_flags_accu,
                                                        tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1642,10 +1630,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    /* Response for Read byte */
                             case SBUS_RD_BYTE:
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            (request_val->count),"Data (bytes)");
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            (request_val->count), ett_sbus_data, NULL, "Data (bytes)");
 
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                    for (i=(request_val->count); i>0; i--) {
                                           proto_tree_add_item(sbusdata_tree,
                                                               hf_sbus_data_byte, tvb, offset,
@@ -1657,10 +1644,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    /* Response for Read Index register */
                             case SBUS_RD_INDEX_REGISTER:
                                    /*Add subtree for Data*/
-                                   dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                            2,"Data (hex bytes)");
+                                   sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                            2, ett_sbus_data, NULL, "Data (hex bytes)");
 
-                                   sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                    for (i=0; i<2; i++) { /*2 bytes*/
                                           proto_tree_add_item(sbusdata_tree,
                                                               hf_sbus_data_byte_hex, tvb, offset,
@@ -1701,9 +1687,8 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                    if (request_val->sysinfo == 0x00){ /*sysinfo 0*/
                                           offset += 1; /* this byte is always 0x01*/
                                           /*Add subtree for Data*/
-                                          dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                                   1,"System info");
-                                          sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
+                                          sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                                   1, ett_sbus_data, NULL, "System info");
 
                                           proto_tree_add_item(sbusdata_tree, hf_sbus_sysinfo0_1,
                                                               tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1743,10 +1728,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_
                                                               1, sbus_web_seq);
                                           offset += 1;
 
-                                          dt = proto_tree_add_text(sbus_tree, tvb, offset,
-                                                                   (sbus_web_size - 2),"Data (bytes)");
+                                          sbusdata_tree = proto_tree_add_subtree(sbus_tree, tvb, offset,
+                                                                   (sbus_web_size - 2), ett_sbus_data, NULL, "Data (bytes)");
 
-                                          sbusdata_tree = proto_item_add_subtree(dt, ett_sbus_data);
                                           for (i=sbus_web_size - 2; i>0; i--) {
                                                  proto_tree_add_item(sbusdata_tree,
                                                                      hf_sbus_data_byte, tvb, offset,
index ce912feb998133ad3834fe88f26ca662b11f6a35..34b27b76ecd80107924fc7cb33d66f9172a568fc 100644 (file)
@@ -1697,11 +1697,10 @@ dissect_sccp_global_title(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
   /* Shift GTI to where we can work with it */
   gti >>= GTI_SHIFT;
 
-  gt_item = proto_tree_add_text(tree, tvb, offset, length,
+  gt_tree = proto_tree_add_subtree_format(tree, tvb, offset, length,
+                                called ? ett_sccp_called_gt : ett_sccp_calling_gt, &gt_item,
                                 "Global Title 0x%x (%u byte%s)",
                                 gti, length, plurality(length,"", "s"));
-  gt_tree = proto_item_add_subtree(gt_item, called ? ett_sccp_called_gt
-                                   : ett_sccp_calling_gt);
 
   /* Decode Transation Type (if present) */
   if ((gti == AI_GTI_TT) ||
@@ -1841,8 +1840,8 @@ static void
 dissect_sccp_called_calling_param(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo,
                                   guint length, gboolean called)
 {
-  proto_item *call_item = 0, *call_ai_item = 0, *item, *hidden_item, *expert_item;
-  proto_tree *call_tree = 0, *call_ai_tree = 0;
+  proto_item *call_ai_item, *item, *hidden_item, *expert_item;
+  proto_tree *call_tree, *call_ai_tree;
   guint offset;
   guint8 national = 0xFFU, routing_ind, gti, pci, ssni, ssn;
   tvbuff_t *gt_tvb;
@@ -1850,16 +1849,15 @@ dissect_sccp_called_calling_param(tvbuff_t *tvb, proto_tree *tree, packet_info *
   const char *ssn_dissector_short_name = NULL;
   const char *tcap_ssn_dissector_short_name = NULL;
 
-  call_item = proto_tree_add_text(tree, tvb, 0, length,
+  call_tree = proto_tree_add_subtree_format(tree, tvb, 0, length,
+                                  called ? ett_sccp_called : ett_sccp_calling, NULL,
                                   "%s Party address (%u byte%s)",
                                   called ? "Called" : "Calling", length,
                                   plurality(length, "", "s"));
-  call_tree = proto_item_add_subtree(call_item, called ? ett_sccp_called : ett_sccp_calling);
 
-  call_ai_item = proto_tree_add_text(call_tree, tvb, 0,
+  call_ai_tree = proto_tree_add_subtree(call_tree, tvb, 0,
                                      ADDRESS_INDICATOR_LENGTH,
-                                     "Address Indicator");
-  call_ai_tree = proto_item_add_subtree(call_ai_item, called ? ett_sccp_called_ai : ett_sccp_calling_ai);
+                                     called ? ett_sccp_called_ai : ett_sccp_calling_ai, &call_ai_item, "Address Indicator");
 
   if (decode_mtp3_standard == ANSI_STANDARD) {
     national = tvb_get_guint8(tvb, 0) & ANSI_NATIONAL_MASK;
@@ -2187,17 +2185,14 @@ static void
 dissect_sccp_sequencing_segmenting_param(tvbuff_t *tvb, proto_tree *tree, guint length)
 {
   guint8      rsn, ssn;
-  proto_item *param_item;
   proto_tree *param_tree;
 
   ssn = tvb_get_guint8(tvb, 0) >> 1;
   rsn = tvb_get_guint8(tvb, SEQUENCING_SEGMENTING_SSN_LENGTH) >> 1;
 
-  param_item = proto_tree_add_text(tree, tvb, 0, length, "%s",
+  param_tree = proto_tree_add_subtree(tree, tvb, 0, length, ett_sccp_sequencing_segmenting, NULL,
                                    val_to_str(PARAMETER_SEQUENCING_SEGMENTING,
                                               sccp_parameter_values, "Unknown: %d"));
-  param_tree = proto_item_add_subtree(param_item,
-                                      ett_sccp_sequencing_segmenting);
 
   proto_tree_add_uint(param_tree, hf_sccp_sequencing_segmenting_ssn, tvb, 0,
                       SEQUENCING_SEGMENTING_SSN_LENGTH, ssn);
@@ -2396,13 +2391,11 @@ dissect_sccp_data_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 static void
 dissect_sccp_segmentation_param(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint length)
 {
-  proto_item *param_item;
   proto_tree *param_tree;
 
-  param_item = proto_tree_add_text(tree, tvb, 0, length, "%s",
+  param_tree = proto_tree_add_subtree(tree, tvb, 0, length, ett_sccp_segmentation, NULL,
                                    val_to_str(PARAMETER_SEGMENTATION,
                                               sccp_parameter_values, "Unknown: %d"));
-  param_tree = proto_item_add_subtree(param_item, ett_sccp_segmentation);
 
   proto_tree_add_item(param_tree, hf_sccp_segmentation_first, tvb, 0, 1, ENC_NA);
   proto_tree_add_item(param_tree, hf_sccp_segmentation_class, tvb, 0, 1, ENC_NA);
@@ -2443,14 +2436,11 @@ dissect_sccp_isni_param(tvbuff_t *tvb, proto_tree *tree, guint length)
 {
   guint8 ti;
   guint offset = 0;
-  proto_item *param_item;
   proto_tree *param_tree;
 
   /* Create a subtree for ISNI Routing Control */
-  param_item = proto_tree_add_text(tree, tvb, offset, ANSI_ISNI_ROUTING_CONTROL_LENGTH,
-                                   "ISNI Routing Control");
-  param_tree = proto_item_add_subtree(param_item,
-                                      ett_sccp_ansi_isni_routing_control);
+  param_tree = proto_tree_add_subtree(tree, tvb, offset, ANSI_ISNI_ROUTING_CONTROL_LENGTH,
+                                   ett_sccp_ansi_isni_routing_control, NULL, "ISNI Routing Control");
 
   proto_tree_add_item(param_tree, hf_sccp_ansi_isni_mi, tvb, offset,
                       ANSI_ISNI_ROUTING_CONTROL_LENGTH, ENC_NA);
index a241a00efa5dc9662df1c5316b7f31bfa05f674a..c630ce556593aa31e39c26974faf39e1036d9d44 100644 (file)
@@ -177,15 +177,10 @@ dissect_ssprotocol(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree,
 
   col_set_str(pinfo->cinfo, COL_PROTOCOL, "SSP");
 
-  /* In the interest of speed, if "tree" is NULL, don't do any work not
-     necessary to generate protocol tree items. */
-  if (tree) {
-    /* create the ssprotocol protocol tree */
-    ssprotocol_item = proto_tree_add_item(tree, proto_ssprotocol, message_tvb, 0, -1, ENC_NA);
-    ssprotocol_tree = proto_item_add_subtree(ssprotocol_item, ett_ssprotocol);
-  } else {
-    ssprotocol_tree = NULL;
-  };
+  /* create the ssprotocol protocol tree */
+  ssprotocol_item = proto_tree_add_item(tree, proto_ssprotocol, message_tvb, 0, -1, ENC_NA);
+  ssprotocol_tree = proto_item_add_subtree(ssprotocol_item, ett_ssprotocol);
+
   /* dissect the message */
   return dissect_ssprotocol_message(message_tvb, pinfo, ssprotocol_tree);
 }
index ccf86dff079f4b4219f1a267bf5bf242e70822c4..3c3f334660217b1c3961f1b9196c4d3608cf8033 100644 (file)
@@ -429,15 +429,12 @@ dissect_mmc4_getconfiguration (tvbuff_t *tvb_a, packet_info *pinfo,
             switch(feature){
             case 0x0000: /* profile list */
                 while(try_offset<(old_offset+additional_length)){
-                    proto_item *it=NULL;
-                    proto_tree *tr=NULL;
+                    proto_item *it;
+                    proto_tree *tr;
                     guint16 profile;
                     guint8  cur_profile;
 
-                    if(tree){
-                        it=proto_tree_add_text(tree, try_tvb, try_offset, 4, "Profile:");
-                        tr=proto_item_add_subtree(it, ett_scsi_mmc_profile);
-                    }
+                    tr=proto_tree_add_subtree(tree, try_tvb, try_offset, 4, ett_scsi_mmc_profile, &it, "Profile:");
 
                     profile=tvb_get_ntohs(try_tvb, try_offset);
                     proto_tree_add_item (tr, hf_scsi_mmc_feature_profile, try_tvb, try_offset, 2, ENC_BIG_ENDIAN);
index 73a71fd2aa564a429ab8448b949975b8752c481b..052ea1fcb78d7cd0e30eac1450cfebbc324166b0 100644 (file)
@@ -544,8 +544,7 @@ dissect_osd_attributes_list(packet_info *pinfo, tvbuff_t *tvb, int offset,
         }
 
         if ((guint32)(offset-start_offset)+attribute_entry_length>length) break;
-        ti = proto_tree_add_text(tree, tvb, offset, attribute_entry_length, "Attribute:");
-        tt = proto_item_add_subtree(ti, ett_osd_attribute);
+        tt = proto_tree_add_subtree(tree, tvb, offset, attribute_entry_length, ett_osd_attribute, &ti, "Attribute:");
 
         switch (type) {
         case 0x01: /* retrieving attributes 7.1.3.2 */
@@ -589,16 +588,14 @@ dissect_osd_attributes_list(packet_info *pinfo, tvbuff_t *tvb, int offset,
 static void
 dissect_osd_option(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
 {
-    proto_tree *tree = NULL;
-    proto_item *it   = NULL;
+    proto_tree *tree;
+    proto_item *it;
     guint8      option;
 
     option = tvb_get_guint8(tvb, offset);
 
-    if (parent_tree) {
-        it = proto_tree_add_item(parent_tree, hf_scsi_osd_option, tvb, offset, 1, ENC_BIG_ENDIAN);
-        tree = proto_item_add_subtree(it, ett_osd_option);
-    }
+    it = proto_tree_add_item(parent_tree, hf_scsi_osd_option, tvb, offset, 1, ENC_BIG_ENDIAN);
+    tree = proto_item_add_subtree(it, ett_osd_option);
 
     proto_tree_add_item(tree, hf_scsi_osd_option_dpo, tvb, offset, 1, ENC_BIG_ENDIAN);
     if (option&0x10) {
@@ -689,16 +686,12 @@ static int
 dissect_osd_attribute_parameters(packet_info *pinfo, tvbuff_t *tvb, int offset, proto_tree *parent_tree, scsi_task_data_t *cdata)
 {
     guint8      gsatype = 0;
-    proto_item *item    = NULL;
-    proto_tree *tree    = NULL;
+    proto_tree *tree;
     scsi_osd_extra_data_t *extra_data = NULL;
     gboolean osd2;
 
-    if (parent_tree) {
-        item = proto_tree_add_text(parent_tree, tvb, offset, 28,
-            "Attribute Parameters");
-        tree = proto_item_add_subtree(item, ett_osd_attribute_parameters);
-    }
+    tree = proto_tree_add_subtree(parent_tree, tvb, offset, 28,
+        ett_osd_attribute_parameters, NULL, "Attribute Parameters");
 
     if (cdata && cdata->itlq && cdata->itlq->extra_data) {
         extra_data = (scsi_osd_extra_data_t *)cdata->itlq->extra_data;
@@ -792,7 +785,6 @@ dissect_osd_attribute_data_out(packet_info *pinfo, tvbuff_t *tvb, int offset _U_
 {
     guint8      gsatype = 0;
     proto_tree *subtree;
-    proto_item *item;
     scsi_osd_extra_data_t *extra_data = NULL;
 
     if (cdata && cdata->itlq && cdata->itlq->extra_data) {
@@ -808,13 +800,13 @@ dissect_osd_attribute_data_out(packet_info *pinfo, tvbuff_t *tvb, int offset _U_
         break;
     case 3: /* 5.2.2.3  attribute list */
         if (extra_data->u.al.get_list_length) {
-            item = proto_tree_add_text(tree, tvb, extra_data->u.al.get_list_offset, extra_data->u.al.get_list_length, "Get Attributes Segment");
-            subtree= proto_item_add_subtree(item, ett_osd_get_attributes);
+            subtree = proto_tree_add_subtree(tree, tvb, extra_data->u.al.get_list_offset, extra_data->u.al.get_list_length,
+                                                ett_osd_get_attributes, NULL, "Get Attributes Segment");
             dissect_osd_attributes_list(pinfo, tvb, extra_data->u.al.get_list_offset, subtree, lun_info, extra_data->osd2);
         }
         if (extra_data->u.al.set_list_length) {
-            item = proto_tree_add_text(tree, tvb, extra_data->u.al.set_list_offset, extra_data->u.al.set_list_length, "Set Attributes Segment");
-            subtree= proto_item_add_subtree(item, ett_osd_set_attributes);
+            subtree = proto_tree_add_subtree(tree, tvb, extra_data->u.al.set_list_offset, extra_data->u.al.set_list_length,
+                                                ett_osd_get_attributes, NULL, "Set Attributes Segment");
             dissect_osd_attributes_list(pinfo, tvb, extra_data->u.al.set_list_offset, subtree, lun_info, extra_data->osd2);
         }
         break;
@@ -1113,15 +1105,11 @@ dissect_osd_permissions(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
 static void
 dissect_osd_capability(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
 {
-    proto_item *item = NULL;
-    proto_tree *tree = NULL;
+    proto_tree *tree;
     guint8 format;
 
-    if (parent_tree) {
-        item = proto_tree_add_text(parent_tree, tvb, offset, 80,
-            "Capability");
-        tree = proto_item_add_subtree(item, ett_osd_capability);
-    }
+    tree = proto_tree_add_subtree(parent_tree, tvb, offset, 80,
+            ett_osd_capability, NULL, "Capability");
 
     /* capability format */
     proto_tree_add_item(tree, hf_scsi_osd_capability_format, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1186,14 +1174,10 @@ dissect_osd_capability(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
 static int
 dissect_osd_security_parameters(tvbuff_t *tvb, int offset, proto_tree *parent_tree)
 {
-    proto_item *item = NULL;
-    proto_tree *tree = NULL;
+    proto_tree *tree;
 
-    if (parent_tree) {
-        item = proto_tree_add_text(parent_tree, tvb, offset, 40,
-            "Security Parameters");
-        tree = proto_item_add_subtree(item, ett_osd_security_parameters);
-    }
+    tree = proto_tree_add_subtree(parent_tree, tvb, offset, 40,
+        ett_osd_security_parameters, NULL, "Security Parameters");
 
     /* request integrity check value */
     proto_tree_add_item(tree, hf_scsi_osd_ricv, tvb, offset, 20, ENC_NA);
@@ -1695,8 +1679,8 @@ dissect_osd_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
                 if (attr_list_end>additional_length+8) break;
                 while (offset+16<attr_list_end) {
                     guint32 attribute_length = tvb_get_ntohs(tvb, offset+14);
-                    proto_item *att_item = proto_tree_add_text(subtree, tvb, offset, 16+attribute_length, "Attribute:");
-                    proto_tree *att_tree = proto_item_add_subtree(att_item, ett_osd_attribute);
+                    proto_item *att_item;
+                    proto_tree *att_tree = proto_tree_add_subtree(subtree, tvb, offset, 16+attribute_length, ett_osd_attribute, &att_item, "Attribute:");
                     offset = dissect_osd_attribute_list_entry(pinfo, tvb, att_tree, att_item, offset, lun_info, TRUE);
                 }
                 offset = attr_list_end;
index 87c309532a468dcfc836aef729a4ff66fe281b35..ff30e6ba018c9a14ccb9393ef301ba8c4ef0b35f 100644 (file)
@@ -1166,8 +1166,7 @@ dissect_sbc_unmap (tvbuff_t *tvb, packet_info *pinfo _U_,
             gint64 lba;
             gint32 num_blocks;
 
-            it = proto_tree_add_text(tree, tvb, offset, 16, "UNMAP Block Descriptor: LBA ");
-            tr = proto_item_add_subtree(it, ett_scsi_unmap_block_descriptor);
+            tr = proto_tree_add_subtree(tree, tvb, offset, 16, ett_scsi_unmap_block_descriptor, &it, "UNMAP Block Descriptor: LBA ");
 
             proto_tree_add_item (tr, hf_scsi_sbc_unmap_lba, tvb, offset, 8, ENC_BIG_ENDIAN);
             lba = tvb_get_ntoh64 (tvb, offset);
@@ -1489,8 +1488,7 @@ dissect_sbc_serviceactionin16 (tvbuff_t *tvb, packet_info *pinfo _U_,
                         guint32 num_blocks;
                         guint8  type;
 
-                        it = proto_tree_add_text(tree, tvb, offset, 16, "LBA Status Descriptor:  ");
-                        tr = proto_item_add_subtree(it, ett_scsi_lba_status_descriptor);
+                        tr = proto_tree_add_subtree(tree, tvb, offset, 16, ett_scsi_lba_status_descriptor, &it, "LBA Status Descriptor:  ");
 
                         proto_tree_add_item (tr, hf_scsi_sbc_get_lba_status_lba, tvb, offset, 8, ENC_BIG_ENDIAN);
                         lba = tvb_get_ntoh64(tvb, offset);
index 1b1cc514b9d90627f4751596e7111074b6f8e3d8..f2d545843298d9990db9ae8e92e487f5899b8e69 100644 (file)
@@ -2676,10 +2676,10 @@ dissect_scsi_evpd(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
     if (tree) {
         pcode = tvb_get_guint8(tvb, offset+1);
         plen = tvb_get_guint8(tvb, offset+3);
-        ti = proto_tree_add_text(tree, tvb, offset, plen+4, "Page Code: %s",
+        evpd_tree = proto_tree_add_subtree_format(tree, tvb, offset, plen+4,
+                                 ett_scsi_page, NULL, "Page Code: %s",
                                  val_to_str(pcode, scsi_evpd_pagecode_val,
                                             "Unknown (0x%08x)"));
-        evpd_tree = proto_item_add_subtree(ti, ett_scsi_page);
 
         proto_tree_add_item(evpd_tree, hf_scsi_inq_qualifier, tvb, offset,
                             1, ENC_BIG_ENDIAN);
@@ -2848,13 +2848,11 @@ dissect_scsi_cmddt(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
                    guint offset, guint tot_len _U_)
 {
     proto_tree *cmdt_tree;
-    proto_item *ti;
     guint       plen;
 
     if (tree) {
         plen = tvb_get_guint8(tvb, offset+5);
-        ti = proto_tree_add_text(tree, tvb, offset, plen, "Command Data");
-        cmdt_tree = proto_item_add_subtree(ti, ett_scsi_page);
+        cmdt_tree = proto_tree_add_subtree_format(tree, tvb, offset, plen, ett_scsi_page, NULL, "Command Data");
 
         proto_tree_add_item(cmdt_tree, hf_scsi_inq_qualifier, tvb, offset,
                             1, ENC_BIG_ENDIAN);
@@ -3317,7 +3315,6 @@ dissect_spc_extcopy(tvbuff_t *tvb, packet_info *pinfo _U_,
         guint16 cscd_desc_list_len, seg_desc_len;
         guint32 /*param_list_len,*/ seg_desc_list_len, inline_data_len, i;
         proto_tree *cscds_tree = NULL, *dev_tree = NULL, *cscd_tree = NULL, *segs_tree = NULL, *seg_tree = NULL, *seg_param_tree = NULL;
-        proto_item *ti;
 
         if (isreq && iscdb) {
                proto_tree_add_item(tree, hf_scsi_spc_xcopy_service, tvb, offset, 1, ENC_NA);
@@ -3363,18 +3360,17 @@ dissect_spc_extcopy(tvbuff_t *tvb, packet_info *pinfo _U_,
                         inline_data_len = tvb_get_ntohl(tvb, offset);
                         offset += 4;
                         if (cscd_desc_list_len > 0) {
-                                ti = proto_tree_add_text(tree, tvb, offset, cscd_desc_list_len, "CSCD (Copy Source and Copy Destination) descriptors (%u bytes)", cscd_desc_list_len);
-                                cscds_tree = proto_item_add_subtree(ti, ett_scsi_xcopy_cscds);
+                                cscds_tree = proto_tree_add_subtree_format(tree, tvb, offset, cscd_desc_list_len, ett_scsi_xcopy_cscds, NULL,
+                                                        "CSCD (Copy Source and Copy Destination) descriptors (%u bytes)", cscd_desc_list_len);
                                 i = 1;
                                 while(cscd_desc_list_len > 0) {
                                         cscd_desc_type = tvb_get_guint8(tvb, offset);
                                         if (cscd_desc_type == 0xEA || cscd_desc_type == 0xEB) { /* both types occupy 64 bytes overall, everything else is 32 bytes */
-                                                ti = proto_tree_add_text(cscds_tree, tvb, offset, 64, "CSCD descriptor #%u", i);
+                                                cscd_tree = proto_tree_add_subtree_format(cscds_tree, tvb, offset, 64, ett_scsi_xcopy_cscd, NULL, "CSCD descriptor #%u", i);
                                         } else {
-                                                ti = proto_tree_add_text(cscds_tree, tvb, offset, 32, "CSCD descriptor #%u", i);
+                                                cscd_tree = proto_tree_add_subtree_format(cscds_tree, tvb, offset, 32, ett_scsi_xcopy_cscd, NULL, "CSCD descriptor #%u", i);
                                         }
                                         i++;
-                                        cscd_tree = proto_item_add_subtree(ti, ett_scsi_xcopy_cscd);
                                         proto_tree_add_item(cscd_tree, hf_scsi_spc_xcopy_cscd_desc_type_code, tvb, offset, 1, ENC_NA);
                                         offset += 1;
                                         proto_tree_add_bitmask(cscd_tree, tvb, offset, hf_scsi_spc_xcopy_per_dev_type_byte, ett_xcopy_per_dev_type,  per_dev_type_bitmask_fields, ENC_NA);
@@ -3400,8 +3396,7 @@ dissect_spc_extcopy(tvbuff_t *tvb, packet_info *pinfo _U_,
                                                 proto_tree_add_text(cscd_tree, tvb, offset, des_len, "WWN: %s", tvb_fcwwn_to_str(tvb, offset));
                                         }
                                         offset += 20;
-                                        ti = proto_tree_add_text(cscd_tree, tvb, offset, 4, "Device type specific parameters");
-                                        dev_tree = proto_item_add_subtree(ti, ett_scsi_xcopy_dev_params);
+                                        dev_tree = proto_tree_add_subtree(cscd_tree, tvb, offset, 4, ett_scsi_xcopy_dev_params, NULL, "Device type specific parameters");
                                         if (dev_type == BLOCK_DEV_0 || dev_type == BLOCK_DEV_4 || dev_type == BLOCK_DEV_5 || dev_type == BLOCK_DEV_7 || dev_type == BLOCK_DEV_E) {
                                                 proto_tree_add_text(dev_tree, tvb, offset, 1, "Reserved|PAD|Reserved");
                                                 offset += 1; /*TODO: dissect this byte */
@@ -3418,14 +3413,14 @@ dissect_spc_extcopy(tvbuff_t *tvb, packet_info *pinfo _U_,
                                 }
                         }
                         if (seg_desc_list_len > 0) {
-                                ti = proto_tree_add_text(tree, tvb, offset, seg_desc_list_len, "Segment descriptor list (%u bytes)", seg_desc_list_len);
-                                segs_tree = proto_item_add_subtree(ti, ett_scsi_xcopy_segs);
+                                segs_tree = proto_tree_add_subtree_format(tree, tvb, offset, seg_desc_list_len,
+                                        ett_scsi_xcopy_segs, NULL, "Segment descriptor list (%u bytes)", seg_desc_list_len);
                                 i = 1;
                                 while(seg_desc_list_len > 0) {
                                         seg_desc_len = tvb_get_ntohs(tvb, offset + 2);
-                                        ti = proto_tree_add_text(segs_tree, tvb, offset, seg_desc_len + 4, "Segment descriptor #%u", i);
+                                        seg_tree = proto_tree_add_subtree_format(segs_tree, tvb, offset, seg_desc_len + 4,
+                                                            ett_scsi_xcopy_seg, NULL, "Segment descriptor #%u", i);
                                         i++;
-                                        seg_tree  = proto_item_add_subtree(ti, ett_scsi_xcopy_seg);
                                         proto_tree_add_item(seg_tree, hf_scsi_spc_xcopy_seg_desc_type, tvb, offset, 1, ENC_NA);
                                         seg_type = tvb_get_guint8(tvb, offset);
                                         offset += 1;
@@ -3438,8 +3433,8 @@ dissect_spc_extcopy(tvbuff_t *tvb, packet_info *pinfo _U_,
                                         offset += 2;
                                         proto_tree_add_item(seg_tree, hf_scsi_spc_xcopy_seg_des_dest_desc_id, tvb, offset, 2, ENC_NA);
                                         offset += 2;
-                                        ti = proto_tree_add_text(seg_tree, tvb, offset, seg_desc_len - 4, "Segment descriptor parameters");
-                                        seg_param_tree = proto_item_add_subtree(ti, ett_scsi_xcopy_seg_param);
+                                        seg_param_tree = proto_tree_add_subtree(seg_tree, tvb, offset, seg_desc_len - 4,
+                                                            ett_scsi_xcopy_seg_param, NULL, "Segment descriptor parameters");
                                         seg_desc_list_len -= (seg_desc_len + 4);
                                         if (seg_type == BLOCK_TO_BLOCK) {
                                                 proto_tree_add_item(seg_param_tree, hf_scsi_reserved_16, tvb, offset, 2, ENC_NA);
@@ -3575,18 +3570,15 @@ dissect_scsi_log_page(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
     };
     guint16 pagelen, pagecode;
     guint8 paramlen;
-    proto_tree *log_tree = NULL;
-    proto_item *ti = NULL;
+    proto_tree *log_tree;
+    proto_item *ti;
     guint old_offset = offset;
     const log_pages_t *log_page;
 
     pagecode = tvb_get_guint8(tvb, offset) & 0x3f;
 
-    if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, -1,
-                                 "Log Page: %s", val_to_str(pagecode, scsi_log_page_val, "Unknown (0x%04x)"));
-        log_tree = proto_item_add_subtree(ti, ett_scsi_log);
-    }
+    log_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_scsi_log, &ti,
+                                "Log Page: %s", val_to_str(pagecode, scsi_log_page_val, "Unknown (0x%04x)"));
 
     /* page code */
     proto_tree_add_bitmask(log_tree, tvb, offset, hf_scsi_log_pc_flags, ett_scsi_log_pc, pcflags_fields, ENC_BIG_ENDIAN);
@@ -4287,7 +4279,6 @@ dissect_scsi_modepage(tvbuff_t *tvb, packet_info *pinfo,
     guint16             plen;
     guint8              pcode, spf, subpcode = 0;
     proto_tree         *tree;
-    proto_item         *ti;
     const value_string *modepage_val;
     int                 hf_pagecode;
     gboolean (*dissect_modepage)(tvbuff_t *, packet_info *, proto_tree *,
@@ -4351,11 +4342,10 @@ dissect_scsi_modepage(tvbuff_t *tvb, packet_info *pinfo,
         dissect_modepage = dissect_scsi_spc_modepage;
     }
 
-    ti = proto_tree_add_text(scsi_tree, tvb, offset, plen + (spf ? 4 : 2),
-                             "%s Mode Page",
+    tree = proto_tree_add_subtree_format(scsi_tree, tvb, offset, plen + (spf ? 4 : 2),
+                             ett_scsi_page, NULL, "%s Mode Page",
                              val_to_str(pcode & SCSI_MS_PCODE_BITS,
                                         modepage_val, "Unknown (0x%08x)"));
-    tree = proto_item_add_subtree(ti, ett_scsi_page);
     proto_tree_add_item(tree, hf_scsi_modepage_ps, tvb, offset, 1, ENC_BIG_ENDIAN);
     proto_tree_add_item(tree, hf_scsi_modepage_spf, tvb, offset, 1, ENC_BIG_ENDIAN);
     proto_tree_add_item(tree, hf_pagecode, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -4979,8 +4969,8 @@ dissect_spc_reportdeviceidentifier(tvbuff_t *tvb _U_, packet_info *pinfo _U_,
 
 void
 dissect_scsi_lun(proto_tree *tree, tvbuff_t *tvb, guint offset) {
-    proto_item *ti = proto_tree_add_text(tree, tvb, offset, 8, "LUN: ");
-    proto_tree *tt = proto_item_add_subtree(ti, ett_scsi_lun);
+    proto_item *ti;
+    proto_tree *tt = proto_tree_add_subtree(tree, tvb, offset, 8, ett_scsi_lun, &ti, "LUN: ");
     guint8 address_mode;
     guint16 lun = 0;
 
@@ -5142,11 +5132,8 @@ dissect_spc_mgmt_protocol_in(tvbuff_t *tvb_a, packet_info *pinfo _U_,
                     if (ctdp) {
                         proto_tree *tr;
 
-                        it = proto_tree_add_text(tree, try_tvb, try_offset,
-                                12, "Timeout Descriptor");
-
-                        tr = proto_item_add_subtree(it,
-                                ett_timeout_descriptor);
+                        tr = proto_tree_add_subtree(tree, try_tvb, try_offset,
+                                12, ett_timeout_descriptor, NULL, "Timeout Descriptor");
 
                         proto_tree_add_item(tr, hf_scsi_report_opcodes_tdl,
                                 try_tvb, try_offset, 2, ENC_BIG_ENDIAN);
@@ -5167,11 +5154,9 @@ dissect_spc_mgmt_protocol_in(tvbuff_t *tvb_a, packet_info *pinfo _U_,
                     while (length >= 20) {
                         proto_tree *tr;
 
-                        it = proto_tree_add_text(tree, try_tvb, try_offset,
-                                20, "Command Descriptor: %s",
+                        tr = proto_tree_add_subtree_format(tree, try_tvb, try_offset,
+                                20, ett_command_descriptor, NULL, "Command Descriptor: %s",
                                 val_to_str_ext_const(tvb_get_guint8(try_tvb, try_offset+0), csdata->cdb_vals_ext, "Unknown"));
-                        tr = proto_item_add_subtree(it,
-                                ett_command_descriptor);
 
                         proto_tree_add_item(tr, csdata->hf_opcode,
                                 try_tvb, try_offset+0, 1, ENC_BIG_ENDIAN);
@@ -5196,11 +5181,8 @@ dissect_spc_mgmt_protocol_in(tvbuff_t *tvb_a, packet_info *pinfo _U_,
                             continue;
                         }
 
-                        it = proto_tree_add_text(tree, try_tvb, try_offset,
-                                12, "Timeout Descriptor");
-
-                        tr = proto_item_add_subtree(it,
-                                ett_timeout_descriptor);
+                        tr = proto_tree_add_subtree(tree, try_tvb, try_offset,
+                                12, ett_timeout_descriptor, NULL, "Timeout Descriptor");
 
                         proto_tree_add_item(tr, hf_scsi_report_opcodes_tdl,
                                 try_tvb, try_offset, 2, ENC_BIG_ENDIAN);
@@ -5285,9 +5267,8 @@ dissect_scsi_descriptor_snsinfo(tvbuff_t *tvb, proto_tree *sns_tree, guint offse
        desc_type   = tvb_get_guint8(tvb, offset);
        desc_length = tvb_get_guint8(tvb, offset+1);
        desc_end    = offset+desc_length+2;
-       item = proto_tree_add_text(sns_tree, tvb, offset, desc_length+2, "%s",
+       desc_tree = proto_tree_add_subtree(sns_tree, tvb, offset, desc_length+2, ett_sense_descriptor, NULL,
                   val_to_str(desc_type, scsi_sense_desc_type_val, "Unknown (0x%02x)"));
-       desc_tree = proto_item_add_subtree(item, ett_sense_descriptor);
        proto_tree_add_item(desc_tree, hf_scsi_sns_desc_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        proto_tree_add_item(desc_tree, hf_scsi_sns_desc_length, tvb, offset+1, 1, ENC_BIG_ENDIAN);
        switch (desc_type) {
index 90376861b31c27c65786618c7a2b936fd9a3a0f9..baccc47b23028768405c4909e4af7db3c6cc58b8 100644 (file)
@@ -1807,8 +1807,9 @@ dissect_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo,
   reported_length = tvb_reported_length(parameter_tvb);
   padding_length  = reported_length - length;
 
-  parameter_item = proto_tree_add_text(chunk_tree, parameter_tvb, PARAMETER_HEADER_OFFSET, tvb_reported_length(parameter_tvb), "%s parameter", val_to_str_const(type, parameter_identifier_values, "Unknown"));
-  parameter_tree = proto_item_add_subtree(parameter_item, ett_sctp_chunk_parameter);
+  parameter_tree = proto_tree_add_subtree_format(chunk_tree, parameter_tvb, PARAMETER_HEADER_OFFSET, -1,
+            ett_sctp_chunk_parameter, &parameter_item, "%s parameter",
+            val_to_str_const(type, parameter_identifier_values, "Unknown"));
   if (final_parameter) {
     if (padding_length > 0) {
       expert_add_info(pinfo, parameter_item, &ei_sctp_parameter_padding);
@@ -2257,8 +2258,8 @@ dissect_error_cause(tvbuff_t *cause_tvb, packet_info *pinfo, proto_tree *chunk_t
   length         = tvb_get_ntohs(cause_tvb, CAUSE_LENGTH_OFFSET);
   padding_length = tvb_reported_length(cause_tvb) - length;
 
-  cause_item = proto_tree_add_text(chunk_tree, cause_tvb, CAUSE_HEADER_OFFSET, tvb_reported_length(cause_tvb), "%s cause", val_to_str_const(code, cause_code_values, "Unknown"));
-  cause_tree = proto_item_add_subtree(cause_item, ett_sctp_chunk_cause);
+  cause_tree = proto_tree_add_subtree_format(chunk_tree, cause_tvb, CAUSE_HEADER_OFFSET, -1,
+            ett_sctp_chunk_cause, &cause_item, "%s cause", val_to_str_const(code, cause_code_values, "Unknown"));
 
   proto_tree_add_item(cause_tree, hf_cause_code, cause_tvb,   CAUSE_CODE_OFFSET,   CAUSE_CODE_LENGTH,   ENC_BIG_ENDIAN);
   proto_tree_add_item(cause_tree, hf_cause_length, cause_tvb, CAUSE_LENGTH_OFFSET, CAUSE_LENGTH_LENGTH, ENC_BIG_ENDIAN);
@@ -3421,7 +3422,6 @@ dissect_sack_chunk(packet_info *pinfo, tvbuff_t *chunk_tvb, proto_tree *chunk_tr
   guint16 gap_block_number, dup_tsn_number, start, end;
   gint gap_block_offset, dup_tsn_offset;
   guint32 cum_tsn_ack;
-  proto_item *block_item;
   proto_tree *block_tree;
   proto_tree *flags_tree;
   proto_item *ctsa_item;
@@ -3461,8 +3461,8 @@ dissect_sack_chunk(packet_info *pinfo, tvbuff_t *chunk_tvb, proto_tree *chunk_tr
     end   = tvb_get_ntohs(chunk_tvb, gap_block_offset + SACK_CHUNK_GAP_BLOCK_START_LENGTH);
     tsn_start = cum_tsn_ack + start;
 
-    block_item = proto_tree_add_text(chunk_tree, chunk_tvb, gap_block_offset, SACK_CHUNK_GAP_BLOCK_LENGTH, "Gap Acknowledgement for TSN %u to %u", cum_tsn_ack + start, cum_tsn_ack + end);
-    block_tree = proto_item_add_subtree(block_item, ett_sctp_sack_chunk_gap_block);
+    block_tree = proto_tree_add_subtree_format(chunk_tree, chunk_tvb, gap_block_offset, SACK_CHUNK_GAP_BLOCK_LENGTH,
+                        ett_sctp_sack_chunk_gap_block, NULL, "Gap Acknowledgement for TSN %u to %u", cum_tsn_ack + start, cum_tsn_ack + end);
 
     pi = proto_tree_add_item(block_tree, hf_sack_chunk_gap_block_start, chunk_tvb, gap_block_offset, SACK_CHUNK_GAP_BLOCK_START_LENGTH, ENC_BIG_ENDIAN);
     pt = proto_item_add_subtree(pi, ett_sctp_sack_chunk_gap_block_start);
@@ -3558,7 +3558,6 @@ dissect_nr_sack_chunk(packet_info *pinfo, tvbuff_t *chunk_tvb, proto_tree *chunk
   guint16 gap_block_number, nr_gap_block_number, dup_tsn_number, start, end;
   gint gap_block_offset, nr_gap_block_offset, dup_tsn_offset;
   guint32 cum_tsn_ack;
-  proto_item *block_item;
   proto_tree *block_tree;
   proto_tree *flags_tree;
   proto_item *ctsa_item;
@@ -3597,8 +3596,8 @@ dissect_nr_sack_chunk(packet_info *pinfo, tvbuff_t *chunk_tvb, proto_tree *chunk
     end   = tvb_get_ntohs(chunk_tvb, gap_block_offset + NR_SACK_CHUNK_GAP_BLOCK_START_LENGTH);
     tsn_start = cum_tsn_ack + start;
 
-    block_item = proto_tree_add_text(chunk_tree, chunk_tvb, gap_block_offset, NR_SACK_CHUNK_GAP_BLOCK_LENGTH, "Gap Acknowledgement for TSN %u to %u", cum_tsn_ack + start, cum_tsn_ack + end);
-    block_tree = proto_item_add_subtree(block_item, ett_sctp_nr_sack_chunk_gap_block);
+    block_tree = proto_tree_add_subtree_format(chunk_tree, chunk_tvb, gap_block_offset, NR_SACK_CHUNK_GAP_BLOCK_LENGTH,
+                        ett_sctp_nr_sack_chunk_gap_block, NULL, "Gap Acknowledgement for TSN %u to %u", cum_tsn_ack + start, cum_tsn_ack + end);
 
     pi = proto_tree_add_item(block_tree, hf_nr_sack_chunk_gap_block_start, chunk_tvb, gap_block_offset, NR_SACK_CHUNK_GAP_BLOCK_START_LENGTH, ENC_BIG_ENDIAN);
     pt = proto_item_add_subtree(pi, ett_sctp_nr_sack_chunk_gap_block_start);
@@ -3654,8 +3653,8 @@ dissect_nr_sack_chunk(packet_info *pinfo, tvbuff_t *chunk_tvb, proto_tree *chunk
     end   = tvb_get_ntohs(chunk_tvb, nr_gap_block_offset + NR_SACK_CHUNK_NR_GAP_BLOCK_START_LENGTH);
     /*tsn_start = cum_tsn_ack + start;*/
 
-    block_item = proto_tree_add_text(chunk_tree, chunk_tvb, nr_gap_block_offset, NR_SACK_CHUNK_NR_GAP_BLOCK_LENGTH, "NR-Gap Acknowledgement for TSN %u to %u", cum_tsn_ack + start, cum_tsn_ack + end);
-    block_tree = proto_item_add_subtree(block_item, ett_sctp_nr_sack_chunk_nr_gap_block);
+    block_tree = proto_tree_add_subtree_format(chunk_tree, chunk_tvb, nr_gap_block_offset, NR_SACK_CHUNK_NR_GAP_BLOCK_LENGTH,
+            ett_sctp_nr_sack_chunk_nr_gap_block, NULL, "NR-Gap Acknowledgement for TSN %u to %u", cum_tsn_ack + start, cum_tsn_ack + end);
 
     pi = proto_tree_add_item(block_tree, hf_nr_sack_chunk_nr_gap_block_start, chunk_tvb, nr_gap_block_offset, NR_SACK_CHUNK_NR_GAP_BLOCK_START_LENGTH, ENC_BIG_ENDIAN);
     pt = proto_item_add_subtree(pi, ett_sctp_nr_sack_chunk_nr_gap_block_start);
@@ -4104,8 +4103,9 @@ dissect_sctp_chunk(tvbuff_t *chunk_tvb,
     col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", val_to_str_const(type, chunk_type_values, "RESERVED"));
 
   /* create proto_tree stuff */
-  chunk_item   = proto_tree_add_text(sctp_tree, chunk_tvb, CHUNK_HEADER_OFFSET, reported_length, "%s chunk", val_to_str_const(type, chunk_type_values, "RESERVED"));
-  chunk_tree   = proto_item_add_subtree(chunk_item, ett_sctp_chunk);
+  chunk_tree   = proto_tree_add_subtree_format(sctp_tree, chunk_tvb, CHUNK_HEADER_OFFSET, reported_length,
+                    ett_sctp_chunk, &chunk_item, "%s chunk",
+                    val_to_str_const(type, chunk_type_values, "RESERVED"));
   if (reported_length % 4)
     expert_add_info_format(pinfo, chunk_item, &ei_sctp_chunk_length_bad, "Chunk length is not padded to a multiple of 4 bytes (length=%d).", reported_length);
 
index c5555d8b577f46d05c58195d021487e6461360e9..66ee7a866fbf7f9bd3350841f0a777329ae65614 100644 (file)
@@ -1647,9 +1647,8 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto
                 }
 
                 if (tvb_strncaseeql(tvb, offset, "inline", next_offset-offset) == 0) {
-                    parameter_item = proto_tree_add_text(sdp_media_attribute_tree,
-                        tvb, offset, param_end_offset-offset, "Key parameters");
-                    parameter_tree = proto_item_add_subtree(parameter_item, ett_sdp_crypto_key_parameters);
+                    parameter_tree = proto_tree_add_subtree(sdp_media_attribute_tree, tvb, offset,
+                        param_end_offset-offset, ett_sdp_crypto_key_parameters, NULL, "Key parameters");
                     /* XXX only for SRTP? */
                     /* srtp-key-info       = key-salt ["|" lifetime] ["|" mki] */
                     offset      = next_offset +1;
index 5512034b9e041d71b391c1c0e511c95f673cfb35..c39c92ad36e51017fec29234ab053b7e89a8dc07 100644 (file)
@@ -963,7 +963,7 @@ static int
 dissect_relaydef_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *relaydef_item, *relaydef_fm_item, *relaydef_flags_item, *relaydef_proto_item;
+    proto_item    *relaydef_fm_item, *relaydef_flags_item, *relaydef_proto_item;
     proto_tree    *relaydef_tree, *relaydef_fm_tree, *relaydef_flags_tree, *relaydef_proto_tree;
     guint8        len, num_proto, num_fm, num_flags;
     int           count;
@@ -974,8 +974,7 @@ dissect_relaydef_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
     num_flags = tvb_get_guint8(tvb, offset+3);
 
     /* Add items to protocol tree specific to Relay Definition Block */
-    relaydef_item = proto_tree_add_text(tree, tvb, offset, len-2, "Relay Definition Block Details");
-    relaydef_tree = proto_item_add_subtree(relaydef_item, ett_selfm_relaydef);
+    relaydef_tree = proto_tree_add_subtree(tree, tvb, offset, len-2, ett_selfm_relaydef, NULL, "Relay Definition Block Details");
 
     /* Reported length */
     proto_tree_add_item(relaydef_tree, hf_selfm_relaydef_len, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1034,7 +1033,6 @@ static int
 dissect_fmconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
 {
     /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *fmconfig_item, *fmconfig_ai_item=NULL, *fmconfig_calc_item=NULL;
     proto_tree    *fmconfig_tree, *fmconfig_ai_tree=NULL, *fmconfig_calc_tree=NULL;
     guint         count;
     guint8        len, sf_loc, num_sf, num_ai, num_calc;
@@ -1049,8 +1047,7 @@ dissect_fmconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
     /* skip num_dig,   position offset+6 */
     num_calc = tvb_get_guint8(tvb, offset+7);
 
-    fmconfig_item = proto_tree_add_text(tree, tvb, offset, len, "Fast Meter Configuration Details");
-    fmconfig_tree = proto_item_add_subtree(fmconfig_item, ett_selfm_fmconfig);
+    fmconfig_tree = proto_tree_add_subtree(tree, tvb, offset, len, ett_selfm_fmconfig, NULL, "Fast Meter Configuration Details");
 
     /* Add items to protocol tree specific to Fast Meter Configuration Block */
 
@@ -1078,8 +1075,8 @@ dissect_fmconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
         tvb_memcpy(tvb, &ai_name, offset, 6);
         ai_name[FM_CONFIG_ANA_CHNAME_LEN] = '\0'; /* Put a terminating null onto the end of the AI name, in case none exists */
 
-        fmconfig_ai_item = proto_tree_add_text(fmconfig_tree, tvb, offset, 10, "Analog Channel: %s", ai_name);
-        fmconfig_ai_tree = proto_item_add_subtree(fmconfig_ai_item, ett_selfm_fmconfig_ai);
+        fmconfig_ai_tree = proto_tree_add_subtree_format(fmconfig_tree, tvb, offset, 10,
+                    ett_selfm_fmconfig_ai, NULL, "Analog Channel: %s", ai_name);
 
         /* Add Channel Name, Channel Data Type, Scale Factor Type and Scale Factor Offset to tree */
         proto_tree_add_text(fmconfig_ai_tree, tvb, offset, 6, "Analog Channel Name: %s", ai_name);
@@ -1093,8 +1090,8 @@ dissect_fmconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
 
     /* 14-byte Calculation block instances based on num_calc */
     for (count = 0; count < num_calc; count++) {
-        fmconfig_calc_item = proto_tree_add_text(fmconfig_tree, tvb, offset, 14, "Calculation Block: %d", count+1);
-        fmconfig_calc_tree = proto_item_add_subtree(fmconfig_calc_item, ett_selfm_fmconfig_calc);
+        fmconfig_calc_tree = proto_tree_add_subtree_format(fmconfig_tree, tvb, offset, 14,
+                            ett_selfm_fmconfig_calc, NULL, "Calculation Block: %d", count+1);
 
         /* Rotation, Voltage Connection and Current Connection are all bit-masked on the same byte */
         proto_tree_add_item(fmconfig_calc_tree, hf_selfm_fmconfig_cblk_rot, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1143,8 +1140,8 @@ static int
 dissect_fmdata_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int offset, guint16 config_cmd_match)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item       *fmdata_item, *fmdata_ai_item=NULL, *fmdata_dig_item=NULL, *fmdata_ai_ch_item=NULL, *fmdata_dig_ch_item=NULL;
-    proto_item       *fmdata_ai_sf_item=NULL;
+    proto_item       *fmdata_item, *fmdata_dig_ch_item;
+    proto_item       *fmdata_ai_sf_item;
     proto_tree       *fmdata_tree, *fmdata_ai_tree=NULL, *fmdata_dig_tree=NULL, *fmdata_ai_ch_tree=NULL, *fmdata_dig_ch_tree=NULL;
     guint8           len, idx=0, j=0, ts_mon, ts_day, ts_year, ts_hour, ts_min, ts_sec;
     guint16          config_cmd, ts_msec;
@@ -1158,8 +1155,7 @@ dissect_fmdata_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of
 
     len = tvb_get_guint8(tvb, offset);
 
-    fmdata_item = proto_tree_add_text(tree, tvb, offset, len-2, "Fast Meter Data Details");
-    fmdata_tree = proto_item_add_subtree(fmdata_item, ett_selfm_fmdata);
+    fmdata_tree = proto_tree_add_subtree_format(tree, tvb, offset, len-2, ett_selfm_fmdata, &fmdata_item, "Fast Meter Data Details");
 
     /* Reported length */
     proto_tree_add_item(fmdata_tree, hf_selfm_fmdata_len, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1207,22 +1203,19 @@ dissect_fmdata_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of
 
                         /* Use different lookup strings, depending on how many samples are available per Analog Channel */
                         if (cfg_data->num_ai_samples == 1) {
-                            fmdata_ai_item = proto_tree_add_text(fmdata_tree, tvb, offset, ((cfg_data->offset_ts - cfg_data->offset_ai)/cfg_data->num_ai_samples),
-                                "Analog Channels (%d), Sample: %d (%s)",
+                            fmdata_ai_tree = proto_tree_add_subtree_format(fmdata_tree, tvb, offset, ((cfg_data->offset_ts - cfg_data->offset_ai)/cfg_data->num_ai_samples),
+                                ett_selfm_fmdata_ai, NULL, "Analog Channels (%d), Sample: %d (%s)",
                                 cfg_data->num_ai, j+1, val_to_str_const(j+1, selfm_fmconfig_numsamples1_vals, "Unknown"));
-                            fmdata_ai_tree = proto_item_add_subtree(fmdata_ai_item, ett_selfm_fmdata_ai);
                         }
                         else if (cfg_data->num_ai_samples == 2) {
-                            fmdata_ai_item = proto_tree_add_text(fmdata_tree, tvb, offset, ((cfg_data->offset_ts - cfg_data->offset_ai)/cfg_data->num_ai_samples),
-                                "Analog Channels (%d), Sample: %d (%s)",
+                            fmdata_ai_tree = proto_tree_add_subtree_format(fmdata_tree, tvb, offset, ((cfg_data->offset_ts - cfg_data->offset_ai)/cfg_data->num_ai_samples),
+                                ett_selfm_fmdata_ai, NULL, "Analog Channels (%d), Sample: %d (%s)",
                                 cfg_data->num_ai, j+1, val_to_str_const(j+1, selfm_fmconfig_numsamples2_vals, "Unknown"));
-                            fmdata_ai_tree = proto_item_add_subtree(fmdata_ai_item, ett_selfm_fmdata_ai);
                         }
                         else if (cfg_data->num_ai_samples == 4) {
-                            fmdata_ai_item = proto_tree_add_text(fmdata_tree, tvb, offset, ((cfg_data->offset_ts - cfg_data->offset_ai)/cfg_data->num_ai_samples),
-                                "Analog Channels (%d), Sample: %d (%s)",
+                            fmdata_ai_tree = proto_tree_add_subtree_format(fmdata_tree, tvb, offset, ((cfg_data->offset_ts - cfg_data->offset_ai)/cfg_data->num_ai_samples),
+                                ett_selfm_fmdata_ai, NULL, "Analog Channels (%d), Sample: %d (%s)",
                                 cfg_data->num_ai, j+1, val_to_str_const(j+1, selfm_fmconfig_numsamples4_vals, "Unknown"));
-                            fmdata_ai_tree = proto_item_add_subtree(fmdata_ai_item, ett_selfm_fmdata_ai);
                         }
 
                         /* For each analog channel we encounter... */
@@ -1246,8 +1239,8 @@ dissect_fmdata_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of
                             }
 
                             /* Build sub-tree for each Analog Channel */
-                            fmdata_ai_ch_item = proto_tree_add_text(fmdata_ai_tree, tvb, offset, ch_size, "Analog Channel %d: %s", idx+1, ai->name);
-                            fmdata_ai_ch_tree = proto_item_add_subtree(fmdata_ai_ch_item, ett_selfm_fmdata_ai_ch);
+                            fmdata_ai_ch_tree = proto_tree_add_subtree_format(fmdata_ai_tree, tvb, offset, ch_size,
+                                            ett_selfm_fmdata_ai_ch, NULL, "Analog Channel %d: %s", idx+1, ai->name);
 
                             /* XXX - Need more decoding options here for different data types, but I need packet capture examples first */
                             /* Decode analog value appropriately, according to data type */
@@ -1317,13 +1310,12 @@ dissect_fmdata_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of
                 /* Check that we actually have digital data */
                 if (cfg_data->num_dig > 0) {
 
-                    fmdata_dig_item = proto_tree_add_text(fmdata_tree, tvb, offset, cfg_data->num_dig, "Digital Channels (%d)", cfg_data->num_dig);
-                    fmdata_dig_tree = proto_item_add_subtree(fmdata_dig_item, ett_selfm_fmdata_dig);
+                    fmdata_dig_tree = proto_tree_add_subtree_format(fmdata_tree, tvb, offset, cfg_data->num_dig,
+                                        ett_selfm_fmdata_dig, NULL, "Digital Channels (%d)", cfg_data->num_dig);
 
                     for (idx=0; idx < cfg_data->num_dig; idx++) {
 
-                        fmdata_dig_ch_item = proto_tree_add_text(fmdata_dig_tree, tvb, offset, 1, "Digital Word Bit Row: %2d", idx+1);
-                        fmdata_dig_ch_tree = proto_item_add_subtree(fmdata_dig_ch_item, ett_selfm_fmdata_dig_ch);
+                        fmdata_dig_ch_tree = proto_tree_add_subtree_format(fmdata_dig_tree, tvb, offset, 1, ett_selfm_fmdata_dig_ch, &fmdata_dig_ch_item, "Digital Word Bit Row: %2d", idx+1);
 
                         /* Display the bit pattern on the digital channel proto_item */
                         proto_item_append_text(fmdata_dig_ch_item, " [  %d %d %d %d %d %d %d %d  ]",
@@ -1375,7 +1367,7 @@ static int
 dissect_foconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *foconfig_item, *foconfig_brkr_item, *foconfig_rb_item;
+    proto_item    *foconfig_brkr_item, *foconfig_rb_item;
     proto_tree    *foconfig_tree, *foconfig_brkr_tree=NULL, *foconfig_rb_tree=NULL;
     guint         count;
     guint8        len, num_brkr, prb_supp;
@@ -1386,8 +1378,7 @@ dissect_foconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
     num_rb = tvb_get_ntohs(tvb, offset+2);
     prb_supp = tvb_get_guint8(tvb, offset+4);
 
-    foconfig_item = proto_tree_add_text(tree, tvb, offset, len-2, "Fast Operate Configuration Details");
-    foconfig_tree = proto_item_add_subtree(foconfig_item, ett_selfm_foconfig);
+    foconfig_tree = proto_tree_add_subtree(tree, tvb, offset, len-2, ett_selfm_foconfig, NULL, "Fast Operate Configuration Details");
 
     /* Add items to protocol tree specific to Fast Operate Configuration Block */
 
@@ -1460,14 +1451,13 @@ static int
 dissect_alt_fastop_config_frame(tvbuff_t *tvb, proto_tree *tree, int offset)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *foconfig_item=NULL;
-    proto_tree    *foconfig_tree=NULL;
+    proto_tree    *foconfig_tree;
     guint8        len;
 
     len = tvb_get_guint8(tvb, offset);
 
-    foconfig_item = proto_tree_add_text(tree, tvb, offset, len-2, "Alternate Fast Operate Configuration Details");
-    foconfig_tree = proto_item_add_subtree(foconfig_item, ett_selfm_foconfig);
+    foconfig_tree = proto_tree_add_subtree(tree, tvb, offset, len-2,
+            ett_selfm_foconfig, NULL, "Alternate Fast Operate Configuration Details");
 
     /* Add items to protocol tree specific to Fast Operate Configuration Block */
 
@@ -1501,7 +1491,6 @@ static int
 dissect_fastop_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int offset)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *fastop_item;
     proto_tree    *fastop_tree;
     guint8        len, opcode;
     guint16       msg_type;
@@ -1509,8 +1498,7 @@ dissect_fastop_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of
     msg_type = tvb_get_ntohs(tvb, offset-2);
     len = tvb_get_guint8(tvb, offset);
 
-    fastop_item = proto_tree_add_text(tree, tvb, offset, len-2, "Fast Operate Details");
-    fastop_tree = proto_item_add_subtree(fastop_item, ett_selfm_fastop);
+    fastop_tree = proto_tree_add_subtree(tree, tvb, offset, len-2, ett_selfm_fastop, NULL, "Fast Operate Details");
 
     /* Add Reported length to tree*/
     proto_tree_add_item(fastop_tree, hf_selfm_fastop_len, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1552,15 +1540,13 @@ static int
 dissect_alt_fastop_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int offset)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *fastop_item;
     proto_tree    *fastop_tree;
     guint8        len;
     guint16       opcode;
 
     len = tvb_get_guint8(tvb, offset);
 
-    fastop_item = proto_tree_add_text(tree, tvb, offset, len-2, "Alternate Fast Operate Details");
-    fastop_tree = proto_item_add_subtree(fastop_item, ett_selfm_fastop);
+    fastop_tree = proto_tree_add_subtree(tree, tvb, offset, len-2, ett_selfm_fastop, NULL, "Alternate Fast Operate Details");
 
     /* Add Reported length to tree */
     proto_tree_add_item(fastop_tree, hf_selfm_alt_fastop_len, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -1595,7 +1581,7 @@ dissect_alt_fastop_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, in
 static int
 dissect_fastser_readresp_frame(tvbuff_t *tvb, proto_tree *fastser_tree, packet_info *pinfo, int offset, guint8 seq_byte)
 {
-    proto_item        *fastser_tag_item=NULL, *fastser_tag_value_item=NULL, *fmdata_dig_item=NULL;
+    proto_item        *fastser_tag_value_item=NULL, *fmdata_dig_item=NULL;
     proto_item        *pi_baseaddr=NULL, *pi_fnum=NULL, *pi_type=NULL, *pi_qty=NULL;
     proto_tree        *fastser_tag_tree=NULL, *fmdata_dig_tree=NULL;
     guint32           base_addr;
@@ -1709,8 +1695,8 @@ dissect_fastser_readresp_frame(tvbuff_t *tvb, proto_tree *fastser_tree, packet_i
                             break;
                     }
 
-                    fastser_tag_item = proto_tree_add_text(fastser_tree, payload_tvb, payload_offset, data_size, "Data Item Name: %s", dataitem->name);
-                    fastser_tag_tree = proto_item_add_subtree(fastser_tag_item, ett_selfm_fastser_tag);
+                    fastser_tag_tree = proto_tree_add_subtree_format(fastser_tree, payload_tvb, payload_offset, data_size,
+                                    ett_selfm_fastser_tag, NULL, "Data Item Name: %s", dataitem->name);
 
                     /* Load some information from the stored Data Format Response message into the tree for reference */
                     pi_fnum = proto_tree_add_text(fastser_tag_tree, payload_tvb, payload_offset, data_size, "Using frame number %d (Index Pos: %d) as Data Format Reference",dataitem->fnum, dataitem->index_pos );
@@ -1730,8 +1716,8 @@ dissect_fastser_readresp_frame(tvbuff_t *tvb, proto_tree *fastser_tree, packet_i
 
                             for (cnt=1; cnt <= dataitem->quantity; cnt++) {
 
-                                fmdata_dig_item = proto_tree_add_text(fastser_tag_tree, payload_tvb, payload_offset, 1, "8-bit Binary Items (Row: %2d)", cnt);
-                                fmdata_dig_tree = proto_item_add_subtree(fmdata_dig_item, ett_selfm_fmdata_dig);
+                                fmdata_dig_tree = proto_tree_add_subtree_format(fastser_tag_tree, payload_tvb, payload_offset, 1,
+                                                    ett_selfm_fmdata_dig, &fmdata_dig_item, "8-bit Binary Items (Row: %2d)", cnt);
 
                                 /* Display the bit pattern on the digital channel proto_item */
                                 proto_item_append_text(fmdata_dig_item, " [  %d %d %d %d %d %d %d %d  ]",
@@ -1832,9 +1818,9 @@ static int
 dissect_fastser_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int offset)
 {
 /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item    *fastser_item, *fastser_def_fc_item=NULL, *fastser_seq_item=NULL, *fastser_elementlist_item=NULL;
-    proto_item    *fastser_element_item=NULL, *fastser_datareg_item=NULL, *fastser_tag_item=NULL;
-    proto_item    *pi_baseaddr=NULL, *fastser_crc16_item=NULL;
+    proto_item    *fastser_def_fc_item, *fastser_seq_item, *fastser_elementlist_item;
+    proto_item    *fastser_tag_item;
+    proto_item    *pi_baseaddr, *fastser_crc16_item;
     proto_tree    *fastser_tree, *fastser_def_fc_tree=NULL, *fastser_seq_tree=NULL, *fastser_elementlist_tree=NULL;
     proto_tree    *fastser_element_tree=NULL, *fastser_datareg_tree=NULL, *fastser_tag_tree=NULL;
     gint          cnt, num_elements, elmt_status32_ofs=0, elmt_status, null_offset;
@@ -1847,8 +1833,7 @@ dissect_fastser_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int o
 
     len = tvb_get_guint8(tvb, offset);
 
-    fastser_item = proto_tree_add_text(tree, tvb, offset, len-2, "Fast SER Message Details");
-    fastser_tree = proto_item_add_subtree(fastser_item, ett_selfm_fastser);
+    fastser_tree = proto_tree_add_subtree(tree, tvb, offset, len-2, ett_selfm_fastser, NULL, "Fast SER Message Details");
 
     /* Reported length */
     proto_tree_add_item(fastser_tree, hf_selfm_fastser_len, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -2008,9 +1993,8 @@ dissect_fastser_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int o
                 elmt_status = ((elmt_status32 >> cnt) & 0x01);
 
                 /* Build the tree */
-                fastser_element_item = proto_tree_add_text(fastser_elementlist_tree, tvb, offset, 4,
+                fastser_element_tree = proto_tree_add_subtree_format(fastser_elementlist_tree, tvb, offset, 4, ett_selfm_fastser_element, NULL,
                     "Reported Event %d (Index: %d, New State: %s)", cnt+1, elmt_idx, val_to_str_const(elmt_status, selfm_ser_status_vals, "Unknown"));
-                fastser_element_tree = proto_item_add_subtree(fastser_element_item, ett_selfm_fastser_element);
 
                 /* Add Index Number and Timestamp offset to tree */
                 proto_tree_add_item(fastser_element_tree, hf_selfm_fastser_unsresp_elmt_idx, tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -2186,8 +2170,8 @@ dissect_fastser_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int o
             /* 16-bit message word count and 16-bit flag field */
             for (cnt=0; cnt<num_reg; cnt++) {
 
-                fastser_datareg_item = proto_tree_add_text(fastser_tree, tvb, offset, 18, "Fast SER Data Region #%d", cnt+1);
-                fastser_datareg_tree = proto_item_add_subtree(fastser_datareg_item, ett_selfm_fastser_datareg);
+                fastser_datareg_tree = proto_tree_add_subtree_format(fastser_tree, tvb, offset, 18,
+                                ett_selfm_fastser_datareg, NULL, "Fast SER Data Region #%d", cnt+1);
 
                 /* 10-Byte Region description */
                 region_name_ptr = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, 10, ENC_ASCII);
index 8b80b519a74d57a4e471457d0c8d34af9273722b..8019f46b553be21b2977ca74bfa42a7176c0b7a8 100644 (file)
@@ -777,23 +777,19 @@ static const value_string siii_at_hotplug_status_error_text[]=
 
 static void dissect_siii_mst(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
 {
-  proto_item *ti;
   proto_tree *subtree;
   proto_tree *subtree2;
 
-  ti = proto_tree_add_text(tree, tvb, 0, 6, "MST");
-  subtree = proto_item_add_subtree(ti, ett_siii_mst);
+  subtree = proto_tree_add_subtree(tree, tvb, 0, 6, ett_siii_mst, NULL, "MST");
 
-  ti = proto_tree_add_text(subtree, tvb, 0, 1, "Telegram Type");
-  subtree2 = proto_item_add_subtree(ti, ett_siii_mst_teltype);
+  subtree2 = proto_tree_add_subtree(subtree, tvb, 0, 1, ett_siii_mst_teltype, NULL, "Telegram Type");
 
   proto_tree_add_item(subtree2, hf_siii_mst_channel,       tvb, 0, 1, ENC_LITTLE_ENDIAN);
   proto_tree_add_item(subtree2, hf_siii_mst_type,          tvb, 0, 1, ENC_LITTLE_ENDIAN);
   proto_tree_add_item(subtree2, hf_siii_mst_cyclecntvalid, tvb, 0, 1, ENC_LITTLE_ENDIAN);
   proto_tree_add_item(subtree2, hf_siii_mst_telno,         tvb, 0, 1, ENC_LITTLE_ENDIAN);
 
-  ti = proto_tree_add_text(subtree, tvb, 1, 1, "Phase Field");
-  subtree2 = proto_item_add_subtree(ti, ett_siii_mst_phase);
+  subtree2 = proto_tree_add_subtree(subtree, tvb, 1, 1, ett_siii_mst_phase, NULL, "Phase Field");
 
   proto_tree_add_item(subtree2, hf_siii_mst_phase,    tvb, 1, 1, ENC_LITTLE_ENDIAN);
   proto_tree_add_item(subtree2, hf_siii_mst_cyclecnt, tvb, 1, 1, ENC_LITTLE_ENDIAN);
@@ -807,8 +803,7 @@ static void dissect_siii_mdt_hp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
   proto_tree *subtree2;
   proto_item *ti;
 
-  ti = proto_tree_add_text(tree, tvb, 0, 8, "Hot-Plug");
-  subtree = proto_item_add_subtree(ti, ett_siii_mdt_hp);
+  subtree = proto_tree_add_subtree(tree, tvb, 0, 8, ett_siii_mdt_hp, NULL, "Hot-Plug");
 
   proto_tree_add_item(subtree, hf_siii_mdt_hotplug_address, tvb, 2, 2, ENC_LITTLE_ENDIAN);
 
@@ -886,30 +881,24 @@ static void dissect_siii_mdt_cp1_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree
   tvbuff_t *tvb_n;
 
   guint idx;
-
-  proto_item *ti;
   proto_tree *subtree;
   proto_tree *subtree_svc;
   proto_tree *subtree_devctrl;
 
-  ti = proto_tree_add_text(tree, tvb, 0, SERCOS_SLAVE_GROUP_SIZE * 6, "Service Channels");
-  subtree_svc = proto_item_add_subtree(ti, ett_siii_mdt_svc);
+  subtree_svc = proto_tree_add_subtree(tree, tvb, 0, SERCOS_SLAVE_GROUP_SIZE * 6, ett_siii_mdt_svc, NULL, "Service Channels");
 
-  ti = proto_tree_add_text(tree, tvb, SERCOS_SLAVE_GROUP_SIZE * 6, 512, "Device Control");
-  subtree_devctrl = proto_item_add_subtree(ti, ett_siii_mdt_svc);
+  subtree_devctrl = proto_tree_add_subtree(tree, tvb, SERCOS_SLAVE_GROUP_SIZE * 6, 512, ett_siii_mdt_svc, NULL, "Device Control");
 
   for (idx = 0; idx < SERCOS_SLAVE_GROUP_SIZE; ++idx) /* each MDT of CP1/2 has data for 128 different slaves */
   {
     tvb_n = tvb_new_subset_length(tvb, 6 * idx, 6); /* subset for service channel data */
 
-    ti = proto_tree_add_text(subtree_svc, tvb_n, 0, 6, "Device %u", idx + devstart);
-    subtree = proto_item_add_subtree(ti, ett_siii_mdt_svc_channel);
+    subtree = proto_tree_add_subtree_format(subtree_svc, tvb_n, 0, 6, ett_siii_mdt_svc_channel, NULL, "Device %u", idx + devstart);
     dissect_siii_mdt_svc(tvb_n, pinfo, subtree, idx + devstart);
 
     tvb_n = tvb_new_subset_length(tvb, SERCOS_SLAVE_GROUP_SIZE * 6 + 4 * idx, 2); /* subset for device control information */
 
-    ti = proto_tree_add_text(subtree_devctrl, tvb_n, 0, 2, "Device %u", idx + devstart);
-    subtree = proto_item_add_subtree(ti, ett_siii_mdt_dev_control);
+    subtree = proto_tree_add_subtree_format(subtree_devctrl, tvb_n, 0, 2, ett_siii_mdt_dev_control, NULL, "Device %u", idx + devstart);
 
     dissect_siii_mdt_devctrl(tvb_n, pinfo, subtree);
   }
@@ -932,7 +921,6 @@ static void dissect_siii_mdt_cp3_4(tvbuff_t *tvb, packet_info *pinfo, proto_tree
 
 static void dissect_siii_mdt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
-  proto_item *ti;
   proto_tree *subtree;
   tvbuff_t   *tvb_n;
 
@@ -955,8 +943,7 @@ static void dissect_siii_mdt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
           (t_phase&0x0f));
   }
 
-  ti = proto_tree_add_text(tree, tvb, 0, -1, "MDT%u", telno);
-  subtree = proto_item_add_subtree(ti, ett_siii_mdt);
+  subtree = proto_tree_add_subtree_format(tree, tvb, 0, -1, ett_siii_mdt, NULL, "MDT%u", telno);
 
   dissect_siii_mst(tvb, pinfo, subtree); /* dissect SERCOS III header */
 
@@ -1024,8 +1011,7 @@ static void dissect_siii_at_hp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
   proto_tree *subtree2;
   proto_item *ti;
 
-  ti = proto_tree_add_text(tree, tvb, 0, 8, "Hot-Plug");
-  subtree = proto_item_add_subtree(ti, ett_siii_at_hp);
+  subtree = proto_tree_add_subtree(tree, tvb, 0, 8, ett_siii_at_hp, NULL, "Hot-Plug");
 
   proto_tree_add_item(subtree, hf_siii_at_hotplug_address,              tvb, 2, 2, ENC_LITTLE_ENDIAN);
 
@@ -1082,29 +1068,24 @@ static void dissect_siii_at_cp1_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree
 
   guint idx;
 
-  proto_item *ti;
   proto_tree *subtree;
   proto_tree *subtree_svc;
   proto_tree *subtree_devstat;
 
-  ti = proto_tree_add_text(tree, tvb, 0, SERCOS_SLAVE_GROUP_SIZE * 6, "Service Channel");
-  subtree_svc = proto_item_add_subtree(ti, ett_siii_at_svc);
+  subtree_svc = proto_tree_add_subtree(tree, tvb, 0, SERCOS_SLAVE_GROUP_SIZE * 6, ett_siii_at_svc, NULL, "Service Channel");
 
-  ti = proto_tree_add_text(tree, tvb, SERCOS_SLAVE_GROUP_SIZE * 6, 512, "Device Status");
-  subtree_devstat = proto_item_add_subtree(ti, ett_siii_at_devstats);
+  subtree_devstat = proto_tree_add_subtree(tree, tvb, SERCOS_SLAVE_GROUP_SIZE * 6, 512, ett_siii_at_devstats, NULL, "Device Status");
 
   for (idx = 0; idx < SERCOS_SLAVE_GROUP_SIZE; ++idx) /* each AT of CP1/2 has data of 128 different slaves */
   {
     tvb_n = tvb_new_subset_length(tvb, 6 * idx, 6); /* subset for service channel data */
 
-    ti = proto_tree_add_text(subtree_svc, tvb_n, 0, 6, "Device %u", idx + devstart);
-    subtree = proto_item_add_subtree(ti, ett_siii_at_svc_channel);
+    subtree = proto_tree_add_subtree_format(subtree_svc, tvb_n, 0, 6, ett_siii_at_svc_channel, NULL, "Device %u", idx + devstart);
     dissect_siii_at_svc(tvb_n, pinfo, subtree, idx + devstart);
 
     tvb_n = tvb_new_subset_length(tvb, SERCOS_SLAVE_GROUP_SIZE * 6 + 4 * idx, 2); /* subset for device status information */
 
-    ti = proto_tree_add_text(subtree_devstat, tvb_n, 0, 2, "Device %u", idx + devstart);
-    subtree = proto_item_add_subtree(ti, ett_siii_at_dev_status);
+    subtree = proto_tree_add_subtree_format(subtree_devstat, tvb_n, 0, 2, ett_siii_at_dev_status, NULL, "Device %u", idx + devstart);
     dissect_siii_at_devstat(tvb_n, pinfo, subtree);
   }
 }
@@ -1124,7 +1105,6 @@ static void dissect_siii_at_cp3_4(tvbuff_t *tvb, packet_info *pinfo, proto_tree
 
 static void dissect_siii_at(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
-  proto_item *ti;
   proto_tree *subtree;
   tvbuff_t   *tvb_n;
 
@@ -1147,8 +1127,7 @@ static void dissect_siii_at(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
           (phase&0x0f));
   }
 
-  ti = proto_tree_add_text(tree, tvb, 0, -1, "AT%u", telno);
-  subtree = proto_item_add_subtree(ti, ett_siii_at);
+  subtree = proto_tree_add_subtree_format(tree, tvb, 0, -1, ett_siii_at, NULL, "AT%u", telno);
 
   dissect_siii_mst(tvb, pinfo, subtree); /* dissect SERCOS III header */
 
index 2a0814dbe057f90f1f14dd92b2c4ea7a78ef2fec..7dc574b75e33256012779f0e75efe17c984100ad 100644 (file)
@@ -859,10 +859,9 @@ dissect_parameter_group(tvbuff_t *tvb, int offset, proto_tree *tree,
        while(pg_len != 0)
        {
                param_type = tvb_get_guint8(tvb, offset);
-               ti = proto_tree_add_text(pg_tree, tvb, offset, -1, "%s",
-                   val_to_str(param_type, param_vals,
-                     "Unknown parameter type (0x%02x)"));
-               param_tree = proto_item_add_subtree(ti, ett_ses_param);
+               param_tree = proto_tree_add_subtree(pg_tree, tvb, offset, -1,
+                       ett_ses_param, &ti,
+                       val_to_str(param_type, param_vals, "Unknown parameter type (0x%02x)"));
                param_str = val_to_str_const(param_type, param_vals, "Unknown");
                proto_tree_add_text(param_tree, tvb, offset, 1,
                    "Parameter type: %s", param_str);
@@ -937,10 +936,9 @@ dissect_parameters(tvbuff_t *tvb, int offset, guint16 len, proto_tree *tree,
        while (len != 0)
        {
                param_type = tvb_get_guint8(tvb, offset);
-               ti = proto_tree_add_text(ses_tree, tvb, offset, -1, "%s",
+               param_tree = proto_tree_add_subtree(ses_tree, tvb, offset, -1, ett_ses_param, &ti,
                    val_to_str(param_type, param_vals,
                      "Unknown parameter type (0x%02x)"));
-               param_tree = proto_item_add_subtree(ti, ett_ses_param);
                param_str = val_to_str_const(param_type, param_vals, "Unknown");
                proto_tree_add_text(param_tree, tvb, offset, 1,
                    "Parameter type: %s", param_str);
index 4b14b30182f0d0083995a143501328a6e254bef2..f8c6f063485f23c89e362f2690922457d1a58508 100644 (file)
@@ -896,9 +896,7 @@ static gint
 dissect_sflow_5_extended_mpls_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset) {
     guint32     in_label_count, out_label_count, label, i, j;
     proto_tree *in_stack;
-    proto_item *ti_in;
     proto_tree *out_stack;
-    proto_item *ti_out;
     struct sflow_address_type addr_type;
 
     addr_type.hf_addr_v4 = hf_sflow_245_nexthop_v4;
@@ -910,8 +908,7 @@ dissect_sflow_5_extended_mpls_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree
     proto_tree_add_item(tree, hf_sflow_245_extended_mpls_in_label_stack_entries, tvb, offset, 4, ENC_BIG_ENDIAN);
     offset += 4;
 
-    ti_in = proto_tree_add_text(tree, tvb, offset, -1, "In Label Stack");
-    in_stack = proto_item_add_subtree(ti_in, ett_sflow_5_mpls_in_label_stack);
+    in_stack = proto_tree_add_subtree(tree, tvb, offset, -1, ett_sflow_5_mpls_in_label_stack, NULL, "In Label Stack");
 
     /* by applying the mask, we avoid possible corrupted data that causes huge number of loops
      * 255 is a sensible limit of label count */
@@ -926,8 +923,7 @@ dissect_sflow_5_extended_mpls_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree
     proto_tree_add_item(tree, hf_sflow_245_extended_mpls_out_label_stack_entries, tvb, offset, 4, ENC_BIG_ENDIAN);
     offset += 4;
 
-    ti_out = proto_tree_add_text(tree, tvb, offset, -1, "Out Label Stack");
-    out_stack = proto_item_add_subtree(ti_out, ett_sflow_5_mpls_in_label_stack);
+    out_stack = proto_tree_add_subtree(tree, tvb, offset, -1, ett_sflow_5_mpls_in_label_stack, NULL, "Out Label Stack");
 
     /* by applying the mask, we avoid possible corrupted data that causes huge number of loops
      * 255 is a sensible limit of label count */
@@ -1612,9 +1608,8 @@ dissect_sflow_5_flow_record(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
 
     /* only accept default enterprise 0 (InMon sFlow) */
     if (enterprise == ENTERPRISE_DEFAULT) {
-        ti = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+        flow_data_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_sflow_5_flow_record, &ti,
                 val_to_str_ext_const(format, &sflow_5_flow_record_type_ext, "Unknown sample format"));
-        flow_data_tree = proto_item_add_subtree(ti, ett_sflow_5_flow_record);
 
         proto_tree_add_uint_format_value(flow_data_tree, hf_sflow_enterprise, tvb, offset, 4,
                             enterprise, "standard sFlow (%u)", enterprise);
@@ -1690,8 +1685,8 @@ dissect_sflow_5_flow_record(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
         }
     } else {
         /* unknown enterprise format, what to do?? */
-        ti = proto_tree_add_text(tree, tvb, offset, -1, "Unknown enterprise format");
-        flow_data_tree = proto_item_add_subtree(ti, ett_sflow_5_flow_record);
+        flow_data_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
+            ett_sflow_5_flow_record, &ti, "Unknown enterprise format");
         proto_tree_add_uint_format_value(flow_data_tree, hf_sflow_enterprise, tvb, offset, -1,
                                     enterprise, "Non-standard sFlow (%u)", enterprise);
     }
@@ -1974,9 +1969,8 @@ dissect_sflow_5_counters_record(tvbuff_t *tvb, proto_tree *tree, gint offset) {
     format = enterprise_format & 0x00000fff;
 
     if (enterprise == ENTERPRISE_DEFAULT) { /* only accept default enterprise 0 (InMon sFlow) */
-        ti = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+        counter_data_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_sflow_5_counters_record, &ti,
                 val_to_str_const(format, sflow_5_counters_record_type, "Unknown sample format"));
-        counter_data_tree = proto_item_add_subtree(ti, ett_sflow_5_counters_record);
 
         proto_tree_add_uint_format_value(counter_data_tree, hf_sflow_enterprise, tvb, offset, 4,
                                 enterprise, "standard sFlow (%u)", enterprise);
@@ -2016,8 +2010,8 @@ dissect_sflow_5_counters_record(tvbuff_t *tvb, proto_tree *tree, gint offset) {
                 break;
         }
     } else { /* unknown enterprise format, what to do?? */
-        ti = proto_tree_add_text(tree, tvb, offset, -1, "Unknown enterprise format");
-        counter_data_tree = proto_item_add_subtree(ti, ett_sflow_5_counters_record);
+        counter_data_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
+            ett_sflow_5_counters_record, &ti, "Unknown enterprise format");
         proto_tree_add_uint_format_value(counter_data_tree, hf_sflow_enterprise, tvb, offset, -1,
                         enterprise, "Non-standard sFlow (%u)", enterprise);
     }
@@ -2274,9 +2268,8 @@ dissect_sflow_245_samples(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
         format = sample_type & 0x00000fff;
 
         if (enterprise == ENTERPRISE_DEFAULT) { /* only accept default enterprise 0 (InMon sFlow) */
-            ti = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+            sflow_245_sample_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_sflow_245_sample, &ti,
                     val_to_str_const(format, sflow_245_sampletype, "Unknown sample format"));
-            sflow_245_sample_tree = proto_item_add_subtree(ti, ett_sflow_245_sample);
 
             proto_tree_add_uint_format_value(sflow_245_sample_tree, hf_sflow_enterprise, tvb, offset, 4, enterprise, "standard sFlow (%u)", enterprise);
             proto_tree_add_item(sflow_245_sample_tree, hf_sflow_245_sampletype12, tvb, offset, 4, ENC_BIG_ENDIAN);
@@ -2307,16 +2300,15 @@ dissect_sflow_245_samples(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, g
             /* current offset points to sample length field, which is 4 bytes from the beginning of the packet*/
             offset += length;
         } else { /* unknown enterprise format, what to do?? */
-            ti = proto_tree_add_text(tree, tvb, offset, -1, "Unknown enterprise format");
-            sflow_245_sample_tree = proto_item_add_subtree(ti, ett_sflow_245_sample);
+            sflow_245_sample_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
+                        ett_sflow_245_sample, &ti, "Unknown enterprise format");
             proto_tree_add_uint_format_value(sflow_245_sample_tree, hf_sflow_enterprise, tvb, offset, -1,
                             enterprise, "Non-standard sFlow (%u)", enterprise);
         }
 
     } else { /* version 2 or 4 */
-        ti = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+        sflow_245_sample_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_sflow_245_sample, &ti,
                 val_to_str_const(sample_type, sflow_245_sampletype, "Unknown sample type"));
-        sflow_245_sample_tree = proto_item_add_subtree(ti, ett_sflow_245_sample);
 
         proto_tree_add_item(sflow_245_sample_tree, hf_sflow_245_sampletype, tvb, offset, 4, ENC_BIG_ENDIAN);
         offset += 4;
index c5cc5f95b690bb6d511cbbfe3ef76ad7d81321be..659f4d73abb8d871201c4c5b3d19a0a0a35da10f 100644 (file)
@@ -2617,10 +2617,9 @@ dissect_sip_common(tvbuff_t *tvb, int offset, int remaining_length, packet_info
 
     case OTHER_LINE:
         if (sip_tree) {
-            ti_a = proto_tree_add_text(sip_tree, tvb, offset, next_offset,
-                                     "%s line: %s", descr,
+            reqresp_tree = proto_tree_add_subtree_format(sip_tree, tvb, offset, next_offset,
+                                     ett_sip_reqresp, NULL, "%s line: %s", descr,
                                      tvb_format_text(tvb, offset, linelen));
-            reqresp_tree = proto_item_add_subtree(ti_a, ett_sip_reqresp);
             /* XXX: Is adding to 'reqresp_tree as intended ? Changed from original 'sip_tree' */
             proto_tree_add_text(reqresp_tree, tvb, offset, -1, "Continuation data");
         }
index d35424b88e4051127a83f9bcd1f869600dc3c5f8..2007993ea7ca7857fa1f86dddf5f24b5b3d37415 100644 (file)
@@ -143,12 +143,12 @@ dissect_sita(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
         proto_tree_add_uint(sita_tree, hf_proto, tvb, 0, 0, proto);
 
         flags_string = format_flags_string(flags, flags_str);
-        ti = proto_tree_add_text(sita_tree, tvb, 0, 0, "Flags: 0x%02x (From %s)%s%s",
+        sita_flags_tree = proto_tree_add_subtree_format(sita_tree, tvb, 0, 0,
+                ett_sita_flags, NULL, "Flags: 0x%02x (From %s)%s%s",
                 flags,
                 ((flags & SITA_FRAME_DIR) == SITA_FRAME_DIR_TXED) ? IOP : REMOTE,
                 strlen(flags_string) ? ", " : "",
                 flags_string);
-        sita_flags_tree = proto_item_add_subtree(ti, ett_sita_flags);
         proto_tree_add_boolean(sita_flags_tree, hf_droppedframe,    tvb, 0, 0, flags);
         proto_tree_add_boolean(sita_flags_tree, hf_dir,             tvb, 0, 0, flags);
 
index 47d09825cf00a6807709e92e3819f6e389dddcf2..aa6ab687df88fb45e192ecddf7507bbc43f6d9de 100644 (file)
@@ -1449,7 +1449,6 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
   /* Set up structures we will need to add the protocol subtree and manage it */
   proto_item *ti;
   proto_tree *skinny_tree = NULL;
-  proto_item *ti_sub;
   proto_tree *skinny_sub_tree;
   proto_tree *skinny_sub_tree_sav;
   proto_tree *skinny_sub_tree_sav_sav;
@@ -1795,8 +1794,8 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+28);
       for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) {
         if (i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "customPictureFormat[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL,
+                                    "customPictureFormat[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1811,8 +1810,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
           count+=20;
         }
       }
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "confResources");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "confResources");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count+= 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1821,14 +1819,13 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       count+= 4;
       skinny_sub_tree_sav = skinny_sub_tree;
       for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) {
-        ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "serviceResource[%d]", i);
-        skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+        skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL,
+                                                        "serviceResource[%d]", i);
         proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
         count+= 4;
         skinny_sub_tree_sav_sav = skinny_sub_tree_sav;
         for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) {
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "layouts[%d]", t);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "layouts[%d]", t);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
         }
@@ -1845,8 +1842,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+12);
       for ( i = 0; i < StationMaxCapabilities; i++ ) {
         if (i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "audiocaps[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "audiocaps[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, ENC_LITTLE_ENDIAN);
@@ -1862,8 +1858,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+16);
       for ( i = 0; i < StationMaxVideoCapabilities; i++ ) {
         if (i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "vidCaps[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "vidCaps[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1872,8 +1867,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
           count+= 4;
           skinny_sub_tree_sav = skinny_sub_tree;
           for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) {
-            ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "levelPreference[%d]", t);
-            skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+            skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "levelPreference[%d]", t);
             proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, ENC_LITTLE_ENDIAN);
             count+= 4;
             proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1890,8 +1884,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
           val = count;
 
           /* H.261 */
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability");
           proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1899,8 +1892,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
 
           /* H.263 */
           count = val;
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability");
           proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1908,8 +1900,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
 
           /* Video */
           count = val;
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability");
           proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -1921,8 +1912,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+20);
       for ( i = 0; i < StationMaxDataCapabilities; i++ ) {
         if ( i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "dataCaps[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "dataCaps[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2065,8 +2055,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+28);
       for ( i = 0; i < MAX_CUSTOM_PICTURES; i++ ) {
         if (i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "customPictureFormat[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "customPictureFormat[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureWidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureHeight, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2081,8 +2070,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
           count+=20;
         }
       }
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "confResources");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "confResources");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_activeStreamsOnRegistration, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count+= 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBW, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2091,14 +2079,12 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       count+= 4;
       skinny_sub_tree_sav = skinny_sub_tree;
       for ( i = 0; i < MAX_SERVICE_TYPE; i++ ) {
-        ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "serviceResource[%d]", i);
-        skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+        skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "serviceResource[%d]", i);
         proto_tree_add_item(skinny_sub_tree, hf_skinny_layoutCount, tvb, count, 4, ENC_LITTLE_ENDIAN);
         count+= 4;
         skinny_sub_tree_sav_sav = skinny_sub_tree_sav;
         for ( t = 0; t < MAX_LAYOUT_WITH_SAME_SERVICE; t++ ) {
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "layouts[%d]", t);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "layouts[%d]", t);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_layout, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
         }
@@ -2115,8 +2101,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+12);
       for ( i = 0; i < StationMaxCapabilities; i++ ) {
         if (i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "audiocaps[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "audiocaps[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_maxFramesPerPacket, tvb, count, 2, ENC_LITTLE_ENDIAN);
@@ -2132,8 +2117,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+16);
       for ( i = 0; i < StationMaxVideoCapabilities; i++ ) {
         if (i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "vidCaps[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "vidCaps[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2142,8 +2126,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
           count+= 4;
           skinny_sub_tree_sav = skinny_sub_tree;
           for ( t = 0; t < MAX_LEVEL_PREFERENCE; t++ ) {
-            ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 20, "levelPreference[%d]", t);
-            skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+            skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 20, ett_skinny_tree, NULL, "levelPreference[%d]", t);
             proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitPreference, tvb, count, 4, ENC_LITTLE_ENDIAN);
             count+= 4;
             proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2160,8 +2143,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
           val = count;
 
           /* H.261 */
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability");
           proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2169,8 +2151,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
 
           /* H.263 */
           count = val;
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability");
           proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2178,8 +2159,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
 
           /* Video */
           count = val;
-          ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability");
           proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2191,8 +2171,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       capCount=tvb_get_letohl(tvb, offset+20);
       for ( i = 0; i < StationMaxDataCapabilities; i++ ) {
         if ( i < capCount) {
-          ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 20, "dataCaps[%d]", i);
-          skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+          skinny_sub_tree = proto_tree_add_subtree_format(skinny_tree, tvb, offset, 20, ett_skinny_tree, NULL, "dataCaps[%d]", i);
           proto_tree_add_item(skinny_sub_tree, hf_skinny_payloadCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
           count+= 4;
           proto_tree_add_item(skinny_sub_tree, hf_skinny_transmitOrReceive, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2416,8 +2395,7 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       i += 4;
       proto_tree_add_item(skinny_tree, hf_skinny_callSecurityStatus, tvb, i, 4, ENC_LITTLE_ENDIAN);
       i += 4;
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, i, 8, "partyPIRestrictionBits");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, i, 8, ett_skinny_tree, NULL, "partyPIRestrictionBits");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CallingPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CallingPartyNumber, tvb, i, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_partyPIRestrictionBits_CalledPartyName, tvb, i, 4, ENC_LITTLE_ENDIAN);
@@ -2910,22 +2888,20 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       si->callId = tvb_get_letohl(tvb, offset+28);
 
       /* add audio part of union */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 12, "audioParameters");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 12, ett_skinny_tree, NULL, "audioParameters");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
 
       /* add video part of union */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 30, "vidParameters");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 30, ett_skinny_tree, NULL, "vidParameters");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
       skinny_sub_tree_sav = skinny_sub_tree;
       count = offset+52;
       for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) {
-        ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, "pictureFormat[%d]", i);
-        skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+        skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT,
+                                            ett_skinny_tree, NULL, "pictureFormat[%d]", i);
         proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
         count += 4;
         proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -2937,31 +2913,27 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
 
       val = count;
       /* add H261 part of union */
-      ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count += 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
 
       /* add H263 part of union */
       count = val;
-      ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count += 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
 
       /* add Vieo part of union */
       count = val;
-      ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count += 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
 
       /* add data part of union */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "dataParameters");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "dataParameters");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+44, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
       break;
@@ -2980,22 +2952,20 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       si->callId = tvb_get_letohl(tvb, offset+32);
 
       /* add audio part of union */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 12, "audioParameters");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 12, ett_skinny_tree, NULL, "audioParameters");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_millisecondPacketSize, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_echoCancelType, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_g723BitRate, tvb, offset+56, 4, ENC_LITTLE_ENDIAN);
 
       /* add video part of union */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 30, "vidParameters");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 30, ett_skinny_tree, NULL, "vidParameters");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_bitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureFormatCount, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
       skinny_sub_tree_sav = skinny_sub_tree;
       count = offset+56;
       for ( i = 0; i < MAX_PICTURE_FORMAT; i++ ) {
-        ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT, "pictureFormat[%d]", i);
-        skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+        skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 8 * MAX_PICTURE_FORMAT,
+                                            ett_skinny_tree, NULL, "pictureFormat[%d]", i);
         proto_tree_add_item(skinny_sub_tree, hf_skinny_format, tvb, count, 4, ENC_LITTLE_ENDIAN);
         count += 4;
         proto_tree_add_item(skinny_sub_tree, hf_skinny_MPI, tvb, count, 4, ENC_LITTLE_ENDIAN);
@@ -3007,31 +2977,27 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
 
       val = count;
       /* add H261 part of union */
-      ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h261VideoCapability");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h261VideoCapability");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOffCapability, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count += 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_stillImageTransmission, tvb, count, 4, ENC_LITTLE_ENDIAN);
 
       /* add H263 part of union */
       count = val;
-      ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "h263VideoCapability");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "h263VideoCapability");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_h263_capability_bitfield, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count += 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_annexNandWFutureUse, tvb, count, 4, ENC_LITTLE_ENDIAN);
 
       /* add Vieo part of union */
       count = val;
-      ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "vieoVideoCapability");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "vieoVideoCapability");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_modelNumber, tvb, count, 4, ENC_LITTLE_ENDIAN);
       count += 4;
       proto_tree_add_item(skinny_sub_tree, hf_skinny_bandwidth, tvb, count, 4, ENC_LITTLE_ENDIAN);
 
       /* add data part of union */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "dataParameters");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "dataParameters");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_protocolDependentData, tvb, offset+48, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_maxBitRate, tvb, offset+52, 4, ENC_LITTLE_ENDIAN);
       break;
@@ -3059,47 +3025,40 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da
       /* not sure of format */
 
       /* show videoFastUpdateGOB */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "videoFastUpdateGOB");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "videoFastUpdateGOB");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfGOBs, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
 
       /* show videoFastUpdateMB */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "videoFastUpdateGOB");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "videoFastUpdateGOB");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstGOB, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
 
       /* show lostPicture */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "lostPicture");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "lostPicture");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
 
       /* show lostPartialPicture */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "lostPartialPicture");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "lostPartialPicture");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+32, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_firstMB, tvb, offset+36, 4, ENC_LITTLE_ENDIAN);
       proto_tree_add_item(skinny_sub_tree, hf_skinny_numberOfMBs, tvb, offset+40, 4, ENC_LITTLE_ENDIAN);
 
       /* show recoveryReferencePicture */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 8, "recoveryReferencePicture");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 8, ett_skinny_tree, NULL, "recoveryReferencePicture");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_recoveryReferencePictureCount, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
       skinny_sub_tree_sav = skinny_sub_tree;
       for ( i = 0; i < MAX_REFERENCE_PICTURE; i++ ) {
-        ti_sub = proto_tree_add_text(skinny_sub_tree_sav, tvb, offset, 8, "recoveryReferencePicture[%d]", i);
-        skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+        skinny_sub_tree = proto_tree_add_subtree_format(skinny_sub_tree_sav, tvb, offset, 8, ett_skinny_tree, NULL, "recoveryReferencePicture[%d]", i);
         proto_tree_add_item(skinny_sub_tree, hf_skinny_pictureNumber, tvb, offset+32+(i*8), 4, ENC_LITTLE_ENDIAN);
         proto_tree_add_item(skinny_sub_tree, hf_skinny_longTermPictureIndex, tvb, offset+36+(i*8), 4, ENC_LITTLE_ENDIAN);
       }
 
       /* show temporalSpatialTradeOff */
-      ti_sub = proto_tree_add_text(skinny_tree, tvb, offset, 4, "temporalSpatialTradeOff");
-      skinny_sub_tree = proto_item_add_subtree(ti_sub, ett_skinny_tree);
+      skinny_sub_tree = proto_tree_add_subtree(skinny_tree, tvb, offset, 4, ett_skinny_tree, NULL, "temporalSpatialTradeOff");
       proto_tree_add_item(skinny_sub_tree, hf_skinny_temporalSpatialTradeOff, tvb, offset+28, 4, ENC_LITTLE_ENDIAN);
       break;
 
index 37800312c33e983d4db731abd91b243f593431d9..3cf9e9d7622e0d52ede03d001759c3e9425c1a88 100644 (file)
@@ -442,8 +442,7 @@ dissect_announce_change(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
 {
        /*** 0x0A ( Announce change to UAS or SAM ) ***/
        guint32 info_count;
-       proto_item *ti = NULL;
-       proto_tree *info_tree = NULL;
+       proto_tree *info_tree;
        guint32 db_index;
        guint32 domain_sid_size;
 
@@ -490,11 +489,8 @@ dissect_announce_change(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
 
                while (info_count != 0) {
                        db_index = tvb_get_letohl(tvb, offset);
-                       if (tree) {
-                               ti = proto_tree_add_text(tree, tvb, offset, 20,
-                                   "DBChange Info Structure: index %u", db_index);
-                               info_tree = proto_item_add_subtree(ti, ett_smb_db_info);
-                       }
+                       info_tree = proto_tree_add_subtree_format(tree, tvb, offset, 20,
+                                   ett_smb_db_info, NULL, "DBChange Info Structure: index %u", db_index);
 
                        proto_tree_add_uint(info_tree, hf_db_index, tvb, offset, 4,
                            db_index);
index aabb34fc45b3888947dac0e6820a527853c1e6c8..d255fe98a426caaa862740ac65e604b2355ebb16 100644 (file)
@@ -2456,8 +2456,8 @@ dissect_response_data(tvbuff_t *tvb, packet_info *pinfo, int convert,
        const char *label;
        gint ett;
        const item_t *resp_data;
-       proto_item *data_item;
-       proto_tree *data_tree;
+       proto_item *data_item = NULL;
+       proto_tree *data_tree = NULL;
        proto_item *entry_item;
        proto_tree *entry_tree;
        guint i, j;
@@ -2489,18 +2489,9 @@ dissect_response_data(tvbuff_t *tvb, packet_info *pinfo, int convert,
                                ett = *lanman->ett_data_entry_list;
                        else
                                ett = ett_lanman_unknown_entries;
-                       data_item = proto_tree_add_text(tree, tvb, offset, -1, "%s", label);
-                       data_tree = proto_item_add_subtree(data_item, ett);
-               } else {
-                       data_item = NULL;
-                       data_tree = NULL;
+
+                       data_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett, &data_item, label);
                }
-       } else {
-               /*
-                * Just leave it at the top level.
-                */
-               data_item = NULL;
-               data_tree = tree;
        }
 
        if (trp->data_descrip == NULL) {
index 18169cfa2273d2f3158054364180fd8765df44e0..951ba8009a0460b605bf728653163398ab5035b8 100644 (file)
@@ -2297,7 +2297,6 @@ struct negprot_dialects {
 static int
 dissect_negprot_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, proto_tree *smb_tree _U_, smb_info_t *si)
 {
-       proto_item *it = NULL;
        proto_tree *tr = NULL;
        guint16     bc;
        guint8      wc;
@@ -2311,8 +2310,7 @@ dissect_negprot_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int
 
        if (tree) {
                tvb_ensure_bytes_exist(tvb, offset, bc);
-               it = proto_tree_add_text(tree, tvb, offset, bc, "Requested Dialects");
-               tr = proto_item_add_subtree(it, ett_smb_dialects);
+               tr = proto_tree_add_subtree(tree, tvb, offset, bc, ett_smb_dialects, NULL, "Requested Dialects");
        }
 
        if (!pinfo->fd->flags.visited && si->sip) {
@@ -5396,19 +5394,15 @@ dissect_search_resume_key(tvbuff_t *tvb, packet_info *pinfo _U_,
     proto_tree *parent_tree, int offset, guint16 *bcp, gboolean *trunc,
     gboolean has_find_id, smb_info_t *si)
 {
-       proto_item *item = NULL;
-       proto_tree *tree = NULL;
+       proto_tree *tree;
        int         fn_len;
        const char *fn;
        char        fname[11+1];
 
        DISSECTOR_ASSERT(si);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, 21,
-                       "Resume Key");
-               tree = proto_item_add_subtree(item, ett_smb_search_resume_key);
-       }
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, 21,
+                       ett_smb_search_resume_key, NULL, "Resume Key");
 
        /* reserved byte */
        CHECK_BYTE_COUNT_SUBR(1);
@@ -5456,19 +5450,15 @@ dissect_search_dir_info(tvbuff_t *tvb, packet_info *pinfo,
     proto_tree *parent_tree, int offset, guint16 *bcp, gboolean *trunc,
     gboolean has_find_id, smb_info_t *si)
 {
-       proto_item *item = NULL;
-       proto_tree *tree = NULL;
+       proto_tree *tree;
        int         fn_len;
        const char *fn;
        char        fname[13+1];
 
        DISSECTOR_ASSERT(si);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, 46,
-                       "Directory Information");
-               tree = proto_item_add_subtree(item, ett_smb_search_dir_info);
-       }
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, 46,
+                       ett_smb_search_dir_info, NULL, "Directory Information");
 
        /* resume key */
        offset = dissect_search_resume_key(tvb, pinfo, tree, offset, bcp,
@@ -5821,11 +5811,9 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
        if (un) {
                old_offset = offset;
 
-               it = proto_tree_add_text(tree, tvb, offset, -1, "Unlocks");
-               tr = proto_item_add_subtree(it, ett_smb_unlocks);
+               tr = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb_unlocks, &it, "Unlocks");
                while (un--) {
-                       proto_item *litem_2 = NULL;
-                       proto_tree *ltree_2 = NULL;
+                       proto_tree *ltree_2;
                        if (lt&0x10) {
                                guint64 val;
                                guint16 lock_pid;
@@ -5833,8 +5821,7 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
                                guint64 lock_length;
 
                                /* large lock format */
-                               litem_2 = proto_tree_add_text(tr, tvb, offset, 20, "Unlock");
-                               ltree_2 = proto_item_add_subtree(litem_2, ett_smb_unlock);
+                               ltree_2 = proto_tree_add_subtree(tr, tvb, offset, 20, ett_smb_unlock, NULL, "Unlock");
 
                                /* PID */
                                CHECK_BYTE_COUNT(2);
@@ -5875,8 +5862,7 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
                                }
                        } else {
                                /* normal lock format */
-                               litem_2 = proto_tree_add_text(tr, tvb, offset, 10, "Unlock");
-                               ltree_2 = proto_item_add_subtree(litem_2, ett_smb_unlock);
+                               ltree_2 = proto_tree_add_subtree(tr, tvb, offset, 10, ett_smb_unlock, NULL, "Unlock");
 
                                /* PID */
                                CHECK_BYTE_COUNT(2);
@@ -5902,11 +5888,9 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
        if (ln) {
                old_offset = offset;
 
-               it = proto_tree_add_text(tree, tvb, offset, -1, "Locks");
-               tr = proto_item_add_subtree(it, ett_smb_locks);
+               tr = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb_locks, &it, "Locks");
                while (ln--) {
-                       proto_item *litem_2 = NULL;
-                       proto_tree *ltree_2 = NULL;
+                       proto_tree *ltree_2;
                        if (lt&0x10) {
                                guint64 val;
                                guint16 lock_pid;
@@ -5914,8 +5898,7 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
                                guint64 lock_length;
 
                                /* large lock format */
-                               litem_2 = proto_tree_add_text(tr, tvb, offset, 20, "Lock");
-                               ltree_2 = proto_item_add_subtree(litem_2, ett_smb_lock);
+                               ltree_2 = proto_tree_add_subtree(tr, tvb, offset, 20, ett_smb_lock, NULL, "Lock");
 
                                /* PID */
                                CHECK_BYTE_COUNT(2);
@@ -5956,8 +5939,7 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
                                }
                        } else {
                                /* normal lock format */
-                               litem_2 = proto_tree_add_text(tr, tvb, offset, 10, "Lock");
-                               ltree_2 = proto_item_add_subtree(litem_2, ett_smb_lock);
+                               ltree_2 = proto_tree_add_subtree(tr, tvb, offset, 10, ett_smb_lock, NULL, "Lock");
 
                                /* PID */
                                CHECK_BYTE_COUNT(2);
@@ -6017,7 +5999,6 @@ dissect_locking_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
 
                ld = (smb_locking_saved_info_t *)si->sip->extra_info;
                if (ld != NULL) {
-                       proto_item *lit;
                        proto_tree *ltr;
                        smb_lock_info_t *li;
                        if (tree) {
@@ -6034,8 +6015,7 @@ dissect_locking_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
                                proto_tree_add_uint(ltree, hf_smb_number_of_unlocks, tvb, 0, 0, ld->num_unlock);
                                proto_tree_add_uint(ltree, hf_smb_number_of_locks, tvb, 0, 0, ld->num_lock);
 
-                               lit = proto_tree_add_text(ltree, tvb, 0, 0, "Locks");
-                               ltr = proto_item_add_subtree(lit, ett_smb_lock);
+                               ltr = proto_tree_add_subtree(ltree, tvb, 0, 0, ett_smb_lock, NULL, "Locks");
                                li = ld->locks;
                                while (li) {
                                        proto_tree_add_uint(ltr, hf_smb_pid, tvb, 0, 0, li->pid);
@@ -6043,8 +6023,7 @@ dissect_locking_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre
                                        proto_tree_add_uint64(ltr, hf_smb_lock_long_length, tvb, 0, 0, li->length);
                                        li = li->next;
                                }
-                               lit = proto_tree_add_text(ltree, tvb, 0, 0, "Unlocks");
-                               ltr = proto_item_add_subtree(lit, ett_smb_unlock);
+                               ltr = proto_tree_add_subtree(ltree, tvb, 0, 0, ett_smb_unlock, NULL, "Unlocks");
                                li = ld->unlocks;
                                while (li) {
                                        proto_tree_add_uint(ltr, hf_smb_pid, tvb, 0, 0, li->pid);
@@ -7793,7 +7772,6 @@ dissect_tree_connect_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree
        guint16     bc;
        int         an_len;
        int         count          = 0;
-       proto_item *it             = NULL;
        proto_tree *tr             = NULL;
        const char *an;
 
@@ -7847,13 +7825,12 @@ dissect_tree_connect_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree
                 * has added.
                 */
                if (count == 0) {
-                       it = proto_tree_add_text(tree, tvb, offset, 4,
-                               "Maximal Share Access Rights");
+                       tr = proto_tree_add_subtree(tree, tvb, offset, 4,
+                               ett_smb_nt_access_mask, NULL, "Maximal Share Access Rights");
                } else {
-                       it = proto_tree_add_text(tree, tvb, offset, 4,
-                               "Guest Maximal Share Access Rights");
+                       tr = proto_tree_add_subtree(tree, tvb, offset, 4,
+                               ett_smb_nt_access_mask, NULL, "Guest Maximal Share Access Rights");
                }
-               tr = proto_item_add_subtree(it, ett_smb_nt_access_mask);
 
                offset = dissect_smb_access_mask(tvb, tr, offset);
                wleft -= 2;
@@ -8571,8 +8548,7 @@ dissect_nt_user_quota(tvbuff_t *tvb, proto_tree *tree, int offset, guint16 *bcp)
 static int
 dissect_nt_trans_data_request(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, int bc, nt_trans_data *ntd, smb_nt_transact_info_t *nti, smb_info_t *si)
 {
-       proto_item              *item       = NULL;
-       proto_tree              *tree       = NULL;
+       proto_tree              *tree;
        int                      old_offset = offset;
        guint16                  bcp        = bc; /* XXX fixme */
        struct access_mask_info *ami        = NULL;
@@ -8580,15 +8556,9 @@ dissect_nt_trans_data_request(tvbuff_t *tvb, packet_info *pinfo, int offset, pro
 
        DISSECTOR_ASSERT(si);
 
-       if (parent_tree) {
-               guint32 bytes = 0;
-               bytes = tvb_length_remaining(tvb, offset);
-               /*tvb_ensure_bytes_exist(tvb, offset, bc);*/
-               item = proto_tree_add_text(parent_tree, tvb, offset, bytes,
-                               "%s Data",
+       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, -1,
+                               ett_smb_nt_trans_data, NULL, "%s Data",
                                val_to_str_ext(ntd->subcmd, &nt_cmd_vals_ext, "Unknown NT transaction (%u)"));
-               tree = proto_item_add_subtree(item, ett_smb_nt_trans_data);
-       }
 
        switch(ntd->subcmd) {
        case NT_TRANS_CREATE:
@@ -8673,19 +8643,15 @@ dissect_nt_trans_data_request(tvbuff_t *tvb, packet_info *pinfo, int offset, pro
 static int
 dissect_nt_trans_param_request(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, int len, nt_trans_data *ntd, guint16 bc, smb_nt_transact_info_t *nti, smb_info_t *si)
 {
-       proto_item *item = NULL;
-       proto_tree *tree = NULL;
+       proto_tree *tree;
        guint32     fn_len, create_flags, access_mask, share_access, create_options;
        const char *fn;
 
        DISSECTOR_ASSERT(si);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, len,
-                               "%s Parameters",
+       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, len,
+                               ett_smb_nt_trans_param, NULL, "%s Parameters",
                                val_to_str_ext(ntd->subcmd, &nt_cmd_vals_ext, "Unknown NT transaction (%u)"));
-               tree = proto_item_add_subtree(item, ett_smb_nt_trans_param);
-       }
 
        switch(ntd->subcmd) {
        case NT_TRANS_CREATE:
@@ -8826,8 +8792,7 @@ dissect_nt_trans_param_request(tvbuff_t *tvb, packet_info *pinfo, int offset, pr
 static int
 dissect_nt_trans_setup_request(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *parent_tree, int len, nt_trans_data *ntd, smb_info_t *si)
 {
-       proto_item             *item = NULL;
-       proto_tree             *tree = NULL;
+       proto_tree             *tree;
        smb_nt_transact_info_t *nti  = NULL;
        smb_saved_info_t       *sip;
 
@@ -8837,13 +8802,9 @@ dissect_nt_trans_setup_request(tvbuff_t *tvb, packet_info *pinfo, int offset, pr
                nti = (smb_nt_transact_info_t *)sip->extra_info;
        }
 
-       if (parent_tree) {
-               tvb_ensure_bytes_exist(tvb, offset, len);
-               item = proto_tree_add_text(parent_tree, tvb, offset, len,
-                               "%s Setup",
+       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, len,
+                               ett_smb_nt_trans_setup, NULL, "%s Setup",
                                val_to_str_ext(ntd->subcmd, &nt_cmd_vals_ext, "Unknown NT transaction (%u)"));
-               tree = proto_item_add_subtree(item, ett_smb_nt_trans_setup);
-       }
 
        switch(ntd->subcmd) {
        case NT_TRANS_CREATE:
@@ -9168,7 +9129,6 @@ dissect_nt_trans_data_response(tvbuff_t *tvb, packet_info *pinfo,
                               nt_trans_data *ntd _U_,
                               smb_nt_transact_info_t *nti, smb_info_t *si)
 {
-       proto_item              *item = NULL;
        proto_tree              *tree = NULL;
        guint16                  bcp;
        struct access_mask_info *ami  = NULL;
@@ -9179,18 +9139,17 @@ dissect_nt_trans_data_response(tvbuff_t *tvb, packet_info *pinfo,
        if (parent_tree) {
                tvb_ensure_bytes_exist(tvb, offset, len);
                if (nti != NULL) {
-                       item = proto_tree_add_text(parent_tree, tvb, offset, len,
-                               "%s Data",
+                       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, len,
+                               ett_smb_nt_trans_data, NULL, "%s Data",
                                val_to_str_ext(nti->subcmd, &nt_cmd_vals_ext, "Unknown NT Transaction (%u)"));
                } else {
                        /*
                         * We never saw the request to which this is a
                         * response.
                         */
-                       item = proto_tree_add_text(parent_tree, tvb, offset, len,
-                               "Unknown NT Transaction Data (matching request not seen)");
+                       tree = proto_tree_add_subtree(parent_tree, tvb, offset, len,
+                               ett_smb_nt_trans_data, NULL, "Unknown NT Transaction Data (matching request not seen)");
                }
-               tree = proto_item_add_subtree(item, ett_smb_nt_trans_data);
        }
 
        if (nti == NULL) {
@@ -9246,7 +9205,6 @@ dissect_nt_trans_param_response(tvbuff_t *tvb, packet_info *pinfo,
                                int offset, proto_tree *parent_tree,
                                int len, nt_trans_data *ntd _U_, guint16 bc, smb_info_t *si)
 {
-       proto_item             *item     = NULL;
        proto_tree             *tree     = NULL;
        guint32                 fn_len;
        const char             *fn;
@@ -9269,18 +9227,17 @@ dissect_nt_trans_param_response(tvbuff_t *tvb, packet_info *pinfo,
        if (parent_tree) {
                tvb_ensure_bytes_exist(tvb, offset, len);
                if (nti != NULL) {
-                       item = proto_tree_add_text(parent_tree, tvb, offset, len,
-                               "%s Parameters",
+                       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, len,
+                               ett_smb_nt_trans_param, NULL, "%s Parameters",
                                val_to_str_ext(nti->subcmd, &nt_cmd_vals_ext, "Unknown NT Transaction (%u)"));
                } else {
                        /*
                         * We never saw the request to which this is a
                         * response.
                         */
-                       item = proto_tree_add_text(parent_tree, tvb, offset, len,
-                               "Unknown NT Transaction Parameters (matching request not seen)");
+                       tree = proto_tree_add_subtree(parent_tree, tvb, offset, len,
+                               ett_smb_nt_trans_param, NULL, "Unknown NT Transaction Parameters (matching request not seen)");
                }
-               tree = proto_item_add_subtree(item, ett_smb_nt_trans_param);
        }
 
        if (nti == NULL) {
@@ -9825,18 +9782,14 @@ static int
 dissect_print_queue_element(tvbuff_t *tvb, packet_info *pinfo _U_,
     proto_tree *parent_tree, int offset, guint16 *bcp, gboolean *trunc, smb_info_t *si)
 {
-       proto_item *item = NULL;
-       proto_tree *tree = NULL;
+       proto_tree *tree;
        int         fn_len;
        const char *fn;
 
        DISSECTOR_ASSERT(si);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, 28,
-                       "Queue entry");
-               tree = proto_item_add_subtree(item, ett_smb_print_queue_entry);
-       }
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, 28,
+                       ett_smb_print_queue_entry, NULL, "Queue entry");
 
        /* queued time */
        CHECK_BYTE_COUNT_SUBR(4);
@@ -10357,8 +10310,6 @@ dissect_nt_create_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
           if ExtendedResponses requested. */
        if ((si->sip != NULL) && (si->sip->extra_info_type == SMB_EI_FILEDATA) &&
            (((smb_fid_saved_info_t *)(si->sip->extra_info))->create_flags & 0x10)) {
-               proto_item *mar = NULL;
-               proto_item *gmar = NULL;
                proto_tree *tr = NULL;
 
                /* The first field is a Volume GUID ... */
@@ -10372,17 +10323,13 @@ dissect_nt_create_andx_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
                                    tvb, offset, 8, ENC_LITTLE_ENDIAN);
                offset += 8;
 
-               mar = proto_tree_add_text(tree, tvb, offset, 4,
-                                         "Maximal Access Rights");
-
-               tr = proto_item_add_subtree(mar, ett_smb_nt_access_mask);
+               tr = proto_tree_add_subtree(tree, tvb, offset, 4,
+                                         ett_smb_nt_access_mask, NULL, "Maximal Access Rights");
 
                offset = dissect_smb_access_mask(tvb, tr, offset);
 
-               gmar = proto_tree_add_text(tree, tvb, offset, 4,
-                                          "Guest Maximal Access Rights");
-
-               tr = proto_item_add_subtree(gmar, ett_smb_nt_access_mask);
+               tr = proto_tree_add_subtree(tree, tvb, offset, 4,
+                                          ett_smb_nt_access_mask, NULL, "Guest Maximal Access Rights");
 
                offset = dissect_smb_access_mask(tvb, tr, offset);
        }
@@ -10902,8 +10849,7 @@ static int
 dissect_transaction2_request_parameters(tvbuff_t *tvb, packet_info *pinfo,
     proto_tree *parent_tree, int offset, int subcmd, guint16 bc, smb_info_t *si)
 {
-       proto_item           *item = NULL;
-       proto_tree           *tree = NULL;
+       proto_tree           *tree;
        smb_transact2_info_t *t2i;
        int                   fn_len;
        const char           *fn;
@@ -10915,14 +10861,10 @@ dissect_transaction2_request_parameters(tvbuff_t *tvb, packet_info *pinfo,
        else
                t2i = NULL;
 
-       if (parent_tree) {
-               tvb_ensure_bytes_exist(tvb, offset, bc);
-               item = proto_tree_add_text(parent_tree, tvb, offset, bc,
-                               "%s Parameters",
+       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, bc,
+                               ett_smb_transaction_params, NULL, "%s Parameters",
                                val_to_str_ext(subcmd, &trans2_cmd_vals_ext,
                                               "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_transaction_params);
-       }
 
        switch(subcmd) {
        case 0x0000:    /*TRANS2_OPEN2*/
@@ -11597,11 +11539,9 @@ dissect_dfs_referral_entry_v3(tvbuff_t *tvb, proto_tree *tree, int oldoffset, in
                }
                /* expanded names */
                if (expoffset) {
-                       proto_item *expitem = NULL;
-                       proto_tree *exptree = NULL;
+                       proto_tree *exptree;
 
-                       expitem = proto_tree_add_text(tree, tvb, offset, *bcp, "Expanded Names");
-                       exptree = proto_item_add_subtree(expitem, ett_smb_dfs_referral_expnames);
+                       exptree = proto_tree_add_subtree(tree, tvb, offset, *bcp, ett_smb_dfs_referral_expnames, NULL, "Expanded Names");
 
                        dissect_dfs_referral_strings(tvb, exptree, hf_smb_dfs_referral_expname,
                                                     nexpnames, expoffset+oldoffset, oldoffset, offset,
@@ -11697,32 +11637,22 @@ dissect_get_dfs_referral_data(tvbuff_t *tvb, packet_info *pinfo _U_,
 
        /* if there are any referrals */
        if (numref) {
-               proto_item *ref_item = NULL;
-               proto_tree *ref_tree = NULL;
+               proto_item *ref_item;
+               proto_tree *ref_tree;
                int old_offset = offset;
 
-               if (tree) {
-                       tvb_ensure_bytes_exist(tvb, offset, *bcp);
-                       ref_item = proto_tree_add_text(tree,
-                               tvb, offset, *bcp, "Referrals");
-                       ref_tree = proto_item_add_subtree(ref_item,
-                               ett_smb_dfs_referrals);
-               }
+               ref_tree = proto_tree_add_subtree(tree,
+                               tvb, offset, *bcp, ett_smb_dfs_referrals, &ref_item, "Referrals");
                ucstring_end = -1;
 
                while (numref--) {
-                       proto_item *ri = NULL;
-                       proto_tree *rt = NULL;
+                       proto_item *ri;
+                       proto_tree *rt;
                        int old_offset_2 = offset;
                        guint16 version;
 
-                       if (tree) {
-                               tvb_ensure_bytes_exist(tvb, offset, *bcp);
-                               ri = proto_tree_add_text(ref_tree,
-                                       tvb, offset, *bcp, "Referral");
-                               rt = proto_item_add_subtree(ri,
-                                       ett_smb_dfs_referral);
-                       }
+                       rt = proto_tree_add_subtree(ref_tree,
+                                       tvb, offset, *bcp, ett_smb_dfs_referral, &ri, "Referral");
 
                        /* referral version */
                        CHECK_BYTE_COUNT_TRANS_SUBR(2);
@@ -12002,9 +11932,8 @@ dissect_4_2_16_2(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
                int start_offset = offset;
                guint8 *name;
 
-               item = proto_tree_add_text(
-                       tree, tvb, offset, 0, "Extended Attribute");
-               subtree = proto_item_add_subtree(item, ett_smb_ea);
+               subtree = proto_tree_add_subtree(
+                       tree, tvb, offset, 0, ett_smb_ea, &item, "Extended Attribute");
 
                /* EA flags */
 
@@ -12391,14 +12320,7 @@ dissect_qfi_SMB_FILE_STREAM_INFO(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr
 
                /* next entry offset */
                CHECK_BYTE_COUNT_SUBR(4);
-               if (parent_tree) {
-                       tvb_ensure_bytes_exist(tvb, offset, *bcp);
-                       item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "Stream Info");
-                       tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-               } else {
-                       item = NULL;
-                       tree = NULL;
-               }
+               tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item, "Stream Info");
 
                neo = tvb_get_letohl(tvb, offset);
                proto_tree_add_uint(tree, hf_smb_next_entry_offset, tvb, offset, 4, neo);
@@ -12644,8 +12566,7 @@ dissect_qspi_unix_acl(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
                int old_offset = offset;
                guint8 ace_type;
 
-               it = proto_tree_add_text(tree, tvb, offset, 0, "ACE");
-               tr = proto_item_add_subtree(it, ett_smb_posix_ace);
+               tr = proto_tree_add_subtree(tree, tvb, offset, 0, ett_smb_posix_ace, &it, "ACE");
 
                /* ace type */
                CHECK_BYTE_COUNT_SUBR(1);
@@ -13580,19 +13501,15 @@ static int
 dissect_transaction2_request_data(tvbuff_t *tvb, packet_info *pinfo,
     proto_tree *parent_tree, int offset, int subcmd, guint16 dc, smb_info_t *si)
 {
-       proto_item *item = NULL;
-       proto_tree *tree = NULL;
+       proto_item *item;
+       proto_tree *tree;
 
        DISSECTOR_ASSERT(si);
 
-       if (parent_tree) {
-               tvb_ensure_bytes_exist(tvb, offset, dc);
-               item = proto_tree_add_text(parent_tree, tvb, offset, dc,
-                               "%s Data",
+       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, dc,
+                               ett_smb_transaction_data, &item, "%s Data",
                                val_to_str_ext(subcmd, &trans2_cmd_vals_ext,
                                               "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_transaction_data);
-       }
 
        switch(subcmd) {
        case 0x0000:    /*TRANS2_OPEN2*/
@@ -14181,8 +14098,8 @@ dissect_4_3_4_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int                   fn_len;
        const char           *fn;
        int                   old_offset  = offset;
-       proto_item           *item        = NULL;
-       proto_tree           *tree        = NULL;
+       proto_item           *item;
+       proto_tree           *tree;
        smb_transact2_info_t *t2i;
        gboolean              resume_keys = FALSE;
        guint32               bytes_needed = 0;
@@ -14195,11 +14112,8 @@ dissect_4_3_4_1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
                        resume_keys = t2i->resume_keys;
        }
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * Figure out of there are enough bytes to display the whole entry.
@@ -14290,8 +14204,8 @@ dissect_4_3_4_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int                   fn_len;
        const char           *fn;
        int                   old_offset  = offset;
-       proto_item           *item        = NULL;
-       proto_tree           *tree        = NULL;
+       proto_item           *item;
+       proto_tree           *tree;
        smb_transact2_info_t *t2i;
        gboolean              resume_keys = FALSE;
        guint32               bytes_needed = 0;
@@ -14304,11 +14218,8 @@ dissect_4_3_4_2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
                        resume_keys = t2i->resume_keys;
        }
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * Figure out of there are enough bytes to display the whole entry.
@@ -14412,8 +14323,8 @@ dissect_4_3_4_3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        const char           *fn;
        int                   old_offset  = offset;
        int                  ea_size = 0;
-       proto_item           *item        = NULL;
-       proto_tree           *tree        = NULL;
+       proto_item           *item;
+       proto_tree           *tree;
        smb_transact2_info_t *t2i;
        gboolean              resume_keys = FALSE;
 
@@ -14426,12 +14337,8 @@ dissect_4_3_4_3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
                        resume_keys = t2i->resume_keys;
        }
 
-       if (parent_tree) {
-               tvb_ensure_bytes_exist(tvb, offset, *bcp);
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        if (resume_keys) {
                /* resume key */
@@ -14520,8 +14427,8 @@ dissect_4_3_4_4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int         fn_len;
        const char *fn;
        int         old_offset = offset;
-       proto_item *item       = NULL;
-       proto_tree *tree       = NULL;
+       proto_item *item;
+       proto_tree *tree;
        guint32     neo;
        int         padcnt;
 
@@ -14539,11 +14446,8 @@ dissect_4_3_4_4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        /* Ensure we have the bytes we need, which is up to neo */
        tvb_ensure_bytes_exist(tvb, offset, neo ? neo : *bcp);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * We assume that the presence of a next entry offset implies the
@@ -14624,8 +14528,8 @@ dissect_4_3_4_5(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int         fn_len;
        const char *fn;
        int         old_offset = offset;
-       proto_item *item       = NULL;
-       proto_tree *tree       = NULL;
+       proto_item *item;
+       proto_tree *tree;
        guint32     neo;
        int         padcnt;
 
@@ -14643,11 +14547,8 @@ dissect_4_3_4_5(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        /* Ensure we have the bytes we need, which is up to neo */
        tvb_ensure_bytes_exist(tvb, offset, neo ? neo : *bcp);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * We assume that the presence of a next entry offset implies the
@@ -14734,8 +14635,8 @@ dissect_4_3_4_6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int         fn_len, sfn_len;
        const char *fn, *sfn;
        int         old_offset = offset;
-       proto_item *item       = NULL;
-       proto_tree *tree       = NULL;
+       proto_item *item;
+       proto_tree *tree;
        guint32     neo;
        int         padcnt;
 
@@ -14753,11 +14654,8 @@ dissect_4_3_4_6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        /* Ensure we have the bytes we need, which is up to neo */
        tvb_ensure_bytes_exist(tvb, offset, neo ? neo : *bcp);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * XXX - I have not seen any of these that contain a resume
@@ -14870,8 +14768,8 @@ dissect_4_3_4_6full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int         fn_len;
        const char *fn;
        int         old_offset = offset;
-       proto_item *item       = NULL;
-       proto_tree *tree       = NULL;
+       proto_item *item;
+       proto_tree *tree;
        guint32     neo;
        int         padcnt;
 
@@ -14889,11 +14787,8 @@ dissect_4_3_4_6full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        /* Ensure we have the bytes we need, which is up to neo */
        tvb_ensure_bytes_exist(tvb, offset, neo ? neo : *bcp);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * XXX - I have not seen any of these that contain a resume
@@ -14995,8 +14890,8 @@ dissect_4_3_4_6_id_both(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tr
        int         fn_len, sfn_len;
        const char *fn, *sfn;
        int         old_offset = offset;
-       proto_item *item       = NULL;
-       proto_tree *tree       = NULL;
+       proto_item *item;
+       proto_tree *tree;
        guint32     neo;
        int         padcnt;
 
@@ -15014,11 +14909,8 @@ dissect_4_3_4_6_id_both(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tr
        /* Ensure we have the bytes we need, which is up to neo */
        tvb_ensure_bytes_exist(tvb, offset, neo ? neo : *bcp);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * XXX - I have not seen any of these that contain a resume
@@ -15141,8 +15033,8 @@ dissect_4_3_4_7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        int         fn_len;
        const char *fn;
        int         old_offset = offset;
-       proto_item *item       = NULL;
-       proto_tree *tree       = NULL;
+       proto_item *item;
+       proto_tree *tree;
        guint32     neo;
        int         padcnt;
 
@@ -15160,11 +15052,8 @@ dissect_4_3_4_7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
        /* Ensure we have the bytes we need, which is up to neo */
        tvb_ensure_bytes_exist(tvb, offset, neo ? neo : *bcp);
 
-       if (parent_tree) {
-               item = proto_tree_add_text(parent_tree, tvb, offset, *bcp, "%s",
+       tree = proto_tree_add_subtree(parent_tree, tvb, offset, *bcp, ett_smb_ff2_data, &item,
                    val_to_str(si->info_level, ff2_il_vals, "Unknown (0x%02x)"));
-               tree = proto_item_add_subtree(item, ett_smb_ff2_data);
-       }
 
        /*
         * We assume that the presence of a next entry offset implies the
@@ -15848,12 +15737,10 @@ dissect_qfsi_vals(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
        }
 
        case 0x202: {   /* SMB_QUERY_POSIX_WHOAMI */
-               proto_item *it_gids = NULL;
-               proto_tree *st_gids = NULL;
+               proto_tree *st_gids;
                guint32     num_gids;
                guint       i;
-               proto_item *it_sids = NULL;
-               proto_tree *st_sids = NULL;
+               proto_tree *st_sids;
                int         old_sid_offset;
                guint32     num_sids;
                guint32     sids_buflen;
@@ -15910,9 +15797,8 @@ dissect_qfsi_vals(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
 
 
                /* GIDs */
-               it_gids = proto_tree_add_text(tree, tvb, offset, num_gids * 8,
-                               "Supplementary UNIX GIDs");
-               st_gids = proto_item_add_subtree(it_gids, ett_smb_unix_whoami_gids);
+               st_gids = proto_tree_add_subtree(tree, tvb, offset, num_gids * 8,
+                               ett_smb_unix_whoami_gids, NULL, "Supplementary UNIX GIDs");
 
                for (i = 0; i < num_gids; i++) {
                        CHECK_BYTE_COUNT_TRANS_SUBR(8);
@@ -15922,9 +15808,8 @@ dissect_qfsi_vals(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
                }
 
                /* SIDs */
-               it_sids = proto_tree_add_text(tree, tvb, offset, sids_buflen,
-                               "List of SIDs");
-               st_sids = proto_item_add_subtree(it_sids, ett_smb_unix_whoami_sids);
+               st_sids = proto_tree_add_subtree(tree, tvb, offset, sids_buflen,
+                               ett_smb_unix_whoami_sids, NULL, "List of SIDs");
 
                for (i = 0; i < num_sids; i++) {
                        old_sid_offset = offset;
@@ -16047,11 +15932,10 @@ dissect_transaction2_response_data(tvbuff_t *tvb, packet_info *pinfo,
 
        if (parent_tree) {
                if ((t2i != NULL) && (t2i->subcmd != -1)) {
-                       item = proto_tree_add_text(parent_tree, tvb, offset, dc,
-                               "%s Data",
+                       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, dc,
+                               ett_smb_transaction_data, &item, "%s Data",
                                val_to_str_ext(t2i->subcmd, &trans2_cmd_vals_ext,
                                               "Unknown (0x%02x)"));
-                       tree = proto_item_add_subtree(item, ett_smb_transaction_data);
                } else {
                        proto_tree_add_text(parent_tree, tvb, offset, dc,
                                            "Unknown Transaction2 Data");
@@ -16224,11 +16108,10 @@ dissect_transaction2_response_parameters(tvbuff_t *tvb, packet_info *pinfo, prot
 
        if (parent_tree) {
                if ((t2i != NULL) && (t2i->subcmd != -1)) {
-                       item = proto_tree_add_text(parent_tree, tvb, offset, pc,
-                               "%s Parameters",
+                       tree = proto_tree_add_subtree_format(parent_tree, tvb, offset, pc,
+                               ett_smb_transaction_params, &item, "%s Parameters",
                                val_to_str_ext(t2i->subcmd, &trans2_cmd_vals_ext,
                                               "Unknown (0x%02x)"));
-                       tree = proto_item_add_subtree(item, ett_smb_transaction_params);
                } else {
                        proto_tree_add_text(parent_tree, tvb, offset, pc,
                                            "Unknown Transaction2 Parameters");
@@ -17183,14 +17066,12 @@ dissect_smb_command(tvbuff_t *tvb, packet_info *pinfo, int offset, proto_tree *s
                                val_to_str_ext(cmd, &smb_cmd_vals_ext, "Unknown (0x%02x)"));
                }
 
-               cmd_item = proto_tree_add_text(smb_tree, tvb, offset, -1,
-                       "%s %s (0x%02x)",
+               cmd_tree = proto_tree_add_subtree_format(smb_tree, tvb, offset, -1,
+                       ett_smb_command, &cmd_item, "%s %s (0x%02x)",
                        val_to_str_ext_const(cmd, &smb_cmd_vals_ext, "Unknown"),
                        (si->request)?"Request":"Response",
                        cmd);
 
-               cmd_tree = proto_item_add_subtree(cmd_item, ett_smb_command);
-
                /* we track FIDs on a per transaction basis.
                   if this was a request and the fid was seen in a reply
                   we add a "generated" fid tree for this pdu and v.v.
@@ -17646,8 +17527,8 @@ static void
 dissect_smb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
 {
        int                   offset   = 0;
-       proto_item           *item     = NULL, *hitem = NULL;
-       proto_tree           *tree     = NULL, *htree = NULL;
+       proto_item           *item;
+       proto_tree           *tree, *htree;
        proto_item           *tmp_item = NULL;
        guint8                flags;
        guint16               flags2;
@@ -17694,16 +17575,13 @@ dissect_smb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
        si->info_level = -1;
        si->info_count = -1;
 
-       if (parent_tree) {
-               item = proto_tree_add_item(parent_tree, proto_smb, tvb, offset,
+       item = proto_tree_add_item(parent_tree, proto_smb, tvb, offset,
                        -1, ENC_NA);
-               tree = proto_item_add_subtree(item, ett_smb);
+       tree = proto_item_add_subtree(item, ett_smb);
 
-               hitem = proto_tree_add_text(tree, tvb, offset, 32,
-                       "SMB Header");
+       htree = proto_tree_add_subtree(tree, tvb, offset, 32,
+                       ett_smb_hdr, NULL, "SMB Header");
 
-               htree = proto_item_add_subtree(hitem, ett_smb_hdr);
-       }
 
        proto_tree_add_text(htree, tvb, offset, 4, "Server Component: SMB");
        offset += 4;  /* Skip the marker */
index aa4e3dc32493cc528d8b79494beae607ab9a24b6..f8ef9126f7b4bc7bced7e046ae7d9bb450bc63a2 100644 (file)
@@ -1919,13 +1919,10 @@ dissect_smb2_file_full_ea_info(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree
                const char *data = "";
                guint16 bc;
                int start_offset = offset;
-               proto_item *ea_item = NULL;
-               proto_tree *ea_tree = NULL;
+               proto_item *ea_item;
+               proto_tree *ea_tree;
 
-               if (tree) {
-                       ea_item = proto_tree_add_text(tree, tvb, offset, -1, "EA:");
-                       ea_tree = proto_item_add_subtree(ea_item, ett_smb2_ea);
-               }
+               ea_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_ea, &ea_item, "EA:");
 
                /* next offset */
                next_offset = tvb_get_letohl(tvb, offset);
@@ -4094,13 +4091,10 @@ dissect_smb2_rdma_v1_blob(tvbuff_t *tvb, packet_info *pinfo _U_,
        int         len;
        int         i;
        int         num;
-       proto_item *sub_item    = NULL;
-       proto_tree *sub_tree    = NULL;
-       proto_item *parent_item = NULL;
+       proto_tree *sub_tree;
+       proto_item *parent_item;
 
-       if (parent_tree) {
-               parent_item = proto_tree_get_parent(parent_tree);
-       }
+       parent_item = proto_tree_get_parent(parent_tree);
 
        len = tvb_reported_length(tvb);
 
@@ -4111,10 +4105,7 @@ dissect_smb2_rdma_v1_blob(tvbuff_t *tvb, packet_info *pinfo _U_,
        }
 
        for (i = 0; i < num; i++) {
-               if (parent_tree) {
-                       sub_item = proto_tree_add_text(parent_tree, tvb, offset, 8, "RDMA V1");
-                       sub_tree = proto_item_add_subtree(sub_item, ett_smb2_rdma_v1);
-               }
+               sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, 8, ett_smb2_rdma_v1, NULL, "RDMA V1");
 
                proto_tree_add_item(sub_tree, hf_smb2_rdma_v1_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN);
                offset += 8;
@@ -4279,20 +4270,16 @@ dissect_smb2_FSCTL_LMR_REQUEST_RESILIENCY(tvbuff_t *tvb, packet_info *pinfo _U_,
 static void
 dissect_windows_sockaddr_in(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *parent_tree, int offset, int len)
 {
-       proto_item *sub_item    = NULL;
-       proto_tree *sub_tree    = NULL;
-       proto_item *parent_item = NULL;
-       guint32     addr;
+       proto_item *sub_item;
+       proto_tree *sub_tree;
+       proto_item *parent_item;
 
        if (len == -1) {
                len = 16;
        }
 
-       if (parent_tree) {
-               sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "Socket Address");
-               sub_tree = proto_item_add_subtree(sub_item, ett_windows_sockaddr);
-               parent_item = proto_tree_get_parent(parent_tree);
-       }
+       sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_windows_sockaddr, &sub_item, "Socket Address");
+       parent_item = proto_tree_get_parent(parent_tree);
 
        /* family */
        proto_tree_add_item(sub_tree, hf_windows_sockaddr_family, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -4303,33 +4290,25 @@ dissect_windows_sockaddr_in(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *p
        offset += 2;
 
        /* IPv4 address */
-       addr = tvb_get_ipv4(tvb, offset);
-       proto_tree_add_ipv4(sub_tree, hf_windows_sockaddr_in_addr, tvb, offset, 4, addr);
-       if (sub_item) {
-               proto_item_append_text(sub_item, ", IPv4: %s", tvb_ip_to_str(tvb, offset));
-       }
-       if (parent_item) {
-               proto_item_append_text(parent_item, ", IPv4: %s", tvb_ip_to_str(tvb, offset));
-       }
+       proto_tree_add_item(sub_tree, hf_windows_sockaddr_in_addr, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+
+       proto_item_append_text(sub_item, ", IPv4: %s", tvb_ip_to_str(tvb, offset));
+       proto_item_append_text(parent_item, ", IPv4: %s", tvb_ip_to_str(tvb, offset));
 }
 
 static void
 dissect_windows_sockaddr_in6(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *parent_tree, int offset, int len)
 {
-       struct e_in6_addr  addr;
-       proto_item        *sub_item    = NULL;
-       proto_tree        *sub_tree    = NULL;
-       proto_item        *parent_item = NULL;
+       proto_item        *sub_item;
+       proto_tree        *sub_tree;
+       proto_item        *parent_item;
 
        if (len == -1) {
                len = 16;
        }
 
-       if (parent_tree) {
-               sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "Socket Address");
-               sub_tree = proto_item_add_subtree(sub_item, ett_windows_sockaddr);
-               parent_item = proto_tree_get_parent(parent_tree);
-       }
+       sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_windows_sockaddr, &sub_item, "Socket Address");
+       parent_item = proto_tree_get_parent(parent_tree);
 
        /* family */
        proto_tree_add_item(sub_tree, hf_windows_sockaddr_family, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -4344,14 +4323,9 @@ dissect_windows_sockaddr_in6(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *
        offset += 4;
 
        /* IPv4 address */
-       tvb_get_ipv6(tvb, offset, &addr);
-       proto_tree_add_ipv6(sub_tree, hf_windows_sockaddr_in6_addr, tvb, offset, 16, (guint8 *)&addr);
-       if (sub_item) {
-               proto_item_append_text(sub_item, ", IPv6: %s", tvb_ip6_to_str(tvb, offset));
-       }
-       if (parent_item) {
-               proto_item_append_text(parent_item, ", IPv6: %s", tvb_ip6_to_str(tvb, offset));
-       }
+       proto_tree_add_item(sub_tree, hf_windows_sockaddr_in6_addr, tvb, offset, 16, ENC_NA);
+       proto_item_append_text(sub_item, ", IPv6: %s", tvb_ip6_to_str(tvb, offset));
+       proto_item_append_text(parent_item, ", IPv6: %s", tvb_ip6_to_str(tvb, offset));
        offset += 16;
 
        /* sin6_scope_id */
@@ -4362,9 +4336,9 @@ static void
 dissect_windows_sockaddr_storage(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, int offset)
 {
        int         len         = 128;
-       proto_item *sub_item    = NULL;
-       proto_tree *sub_tree    = NULL;
-       proto_item *parent_item = NULL;
+       proto_item *sub_item;
+       proto_tree *sub_tree;
+       proto_item *parent_item;
        guint16     family;
 
        family = tvb_get_letohs(tvb, offset);
@@ -4377,20 +4351,13 @@ dissect_windows_sockaddr_storage(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
                return;
        }
 
-       if (parent_tree) {
-               sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "Socket Address");
-               sub_tree = proto_item_add_subtree(sub_item, ett_windows_sockaddr);
-               parent_item = proto_tree_get_parent(parent_tree);
-       }
+       sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_windows_sockaddr, &sub_item, "Socket Address");
+       parent_item = proto_tree_get_parent(parent_tree);
 
        /* ss_family */
        proto_tree_add_item(sub_tree, hf_windows_sockaddr_family, tvb, offset, 2, ENC_LITTLE_ENDIAN);
-       if (sub_item) {
-               proto_item_append_text(sub_item, ", Family: %d (0x%04x)", family, family);
-       }
-       if (parent_item) {
-               proto_item_append_text(sub_item, ", Family: %d (0x%04x)", family, family);
-       }
+       proto_item_append_text(sub_item, ", Family: %d (0x%04x)", family, family);
+       proto_item_append_text(parent_item, ", Family: %d (0x%04x)", family, family);
        /*offset += 2;*/
 
        /* unknown */
@@ -4406,9 +4373,9 @@ dissect_smb2_NETWORK_INTERFACE_INFO(tvbuff_t *tvb, packet_info *pinfo, proto_tre
        guint32     next_offset;
        int         offset   = 0;
        int         len      = -1;
-       proto_item *sub_item = NULL;
-       proto_tree *sub_tree = NULL;
-       proto_item *item     = NULL;
+       proto_item *sub_item;
+       proto_tree *sub_tree;
+       proto_item *item;
        guint32     capabilities;
        guint64     link_speed;
        gfloat      val      = 0;
@@ -4419,10 +4386,8 @@ dissect_smb2_NETWORK_INTERFACE_INFO(tvbuff_t *tvb, packet_info *pinfo, proto_tre
                len = next_offset;
        }
 
-       if (parent_tree) {
-               sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "Network Interface");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_ioctl_network_interface);
-       }
+       sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_smb2_ioctl_network_interface, &sub_item, "Network Interface");
+       item = proto_tree_get_parent(parent_tree);
 
        /* next offset */
        proto_tree_add_item(sub_tree, hf_smb2_ioctl_network_interface_next_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -4441,11 +4406,9 @@ dissect_smb2_NETWORK_INTERFACE_INFO(tvbuff_t *tvb, packet_info *pinfo, proto_tre
                proto_item_append_text(item, "%s%s",
                                       (capabilities & NETWORK_INTERFACE_CAP_RDMA)?", RDMA":"",
                                       (capabilities & NETWORK_INTERFACE_CAP_RSS)?", RSS":"");
-               if (sub_item) {
-                       proto_item_append_text(sub_item, "%s%s",
+               proto_item_append_text(sub_item, "%s%s",
                                       (capabilities & NETWORK_INTERFACE_CAP_RDMA)?", RDMA":"",
                                       (capabilities & NETWORK_INTERFACE_CAP_RSS)?", RSS":"");
-               }
        }
        offset += 4;
 
@@ -4470,9 +4433,7 @@ dissect_smb2_NETWORK_INTERFACE_INFO(tvbuff_t *tvb, packet_info *pinfo, proto_tre
                unit = "";
        }
        proto_item_append_text(item, ", %.1f %sBits/s", val, unit);
-       if (sub_item) {
-               proto_item_append_text(sub_item, ", %.1f %sBits/s", val, unit);
-       }
+       proto_item_append_text(sub_item, ", %.1f %sBits/s", val, unit);
 
        offset += 8;
 
@@ -5138,19 +5099,13 @@ static void
 dissect_smb2_QFid_buffer_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, smb2_info_t *si _U_)
 {
        int         offset   = 0;
-       proto_item *item     = NULL;
-       proto_item *sub_item = NULL;
-       proto_item *sub_tree = NULL;
+       proto_item *item;
+       proto_item *sub_tree;
 
-       if (tree) {
-               item = proto_tree_get_parent(tree);
-       }
+       item = proto_tree_get_parent(tree);
 
-       if (item) {
-               proto_item_append_text(item, ": QFid INFO");
-               sub_item = proto_tree_add_text(tree, tvb, offset, -1, "QFid INFO");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_QFid_buffer);
-       }
+       proto_item_append_text(item, ": QFid INFO");
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_QFid_buffer, NULL, "QFid INFO");
 
        proto_tree_add_item(sub_tree, hf_smb2_qfid_fid, tvb, offset, 32, ENC_NA);
 }
@@ -5220,19 +5175,13 @@ dissect_smb2_DH2Q_buffer_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr
                NULL
        };
        int         offset   = 0;
-       proto_item *item     = NULL;
-       proto_item *sub_item = NULL;
-       proto_item *sub_tree = NULL;
+       proto_item *item;
+       proto_item *sub_tree;
 
-       if (tree) {
-               item = proto_tree_get_parent(tree);
-       }
+       item = proto_tree_get_parent(tree);
 
-       if (item) {
-               proto_item_append_text(item, ": DH2Q Request");
-               sub_item = proto_tree_add_text(tree, tvb, offset, -1, "DH2Q Request");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_DH2Q_buffer);
-       }
+       proto_item_append_text(item, ": DH2Q Request");
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_DH2Q_buffer, NULL, "DH2Q Request");
 
        /* timeout */
        proto_tree_add_item(sub_tree, hf_smb2_dh2x_buffer_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -5255,19 +5204,13 @@ static void
 dissect_smb2_DH2Q_buffer_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, smb2_info_t *si _U_)
 {
        int         offset   = 0;
-       proto_item *item     = NULL;
-       proto_item *sub_item = NULL;
-       proto_item *sub_tree = NULL;
+       proto_item *item;
+       proto_item *sub_tree;
 
-       if (tree) {
-               item = proto_tree_get_parent(tree);
-       }
+       item = proto_tree_get_parent(tree);
 
-       if (item) {
-               proto_item_append_text(item, ": DH2Q Response");
-               sub_item = proto_tree_add_text(tree, tvb, offset, -1, "DH2Q Response");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_DH2Q_buffer);
-       }
+       proto_item_append_text(item, ": DH2Q Response");
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_DH2Q_buffer, NULL, "DH2Q Response");
 
        /* timeout */
        proto_tree_add_item(sub_tree, hf_smb2_dh2x_buffer_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -5281,19 +5224,13 @@ static void
 dissect_smb2_DH2C_buffer_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, smb2_info_t *si)
 {
        int         offset   = 0;
-       proto_item *item     = NULL;
-       proto_item *sub_item = NULL;
-       proto_item *sub_tree = NULL;
+       proto_item *item;
+       proto_item *sub_tree;
 
-       if (tree) {
-               item = proto_tree_get_parent(tree);
-       }
+       item = proto_tree_get_parent(tree);
 
-       if (item) {
-               proto_item_append_text(item, ": DH2C Request");
-               sub_item = proto_tree_add_text(tree, tvb, offset, -1, "DH2C Request");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_DH2C_buffer);
-       }
+       proto_item_append_text(item, ": DH2C Request");
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_DH2C_buffer, NULL, "DH2C Request");
 
        /* file id */
        dissect_smb2_fid(tvb, pinfo, sub_tree, offset, si, FID_MODE_DHNC);
@@ -5341,26 +5278,18 @@ static void
 dissect_smb2_MxAc_buffer_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, smb2_info_t *si _U_)
 {
        int         offset   = 0;
-       proto_item *item     = NULL;
-       proto_item *sub_item = NULL;
-       proto_tree *sub_tree = NULL;
+       proto_item *item;
+       proto_tree *sub_tree;
 
-       if (tree) {
-               item = proto_tree_get_parent(tree);
-       }
+       item = proto_tree_get_parent(tree);
 
        if (tvb_length(tvb) == 0) {
-               if (item) {
-                       proto_item_append_text(item, ": NO DATA");
-               }
+               proto_item_append_text(item, ": NO DATA");
                return;
        }
 
-       if (item) {
-               proto_item_append_text(item, ": MxAc INFO");
-               sub_item = proto_tree_add_text(tree, tvb, offset, -1, "MxAc INFO");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_MxAc_buffer);
-       }
+       proto_item_append_text(item, ": MxAc INFO");
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_MxAc_buffer, NULL, "MxAc INFO");
 
        proto_tree_add_item(sub_tree, hf_smb2_mxac_status, tvb, offset, 4, ENC_BIG_ENDIAN);
        offset += 4;
@@ -5410,32 +5339,21 @@ dissect_SMB2_CREATE_LEASE_VX(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *
 {
        int         offset      = 0;
        int         len;
-       proto_item *sub_item    = NULL;
        proto_tree *sub_tree    = NULL;
-       proto_item *parent_item = NULL;
+       proto_item *parent_item;
 
-       if (parent_tree) {
-               parent_item = proto_tree_get_parent(parent_tree);
-       }
+       parent_item = proto_tree_get_parent(parent_tree);
 
        len = tvb_length(tvb);
 
        switch (len) {
        case 32: /* SMB2_CREATE_REQUEST/RESPONSE_LEASE */
-               if (parent_item) {
-                       proto_item_append_text(parent_item, ": LEASE_V1");
-                       sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "LEASE_V1");
-                       sub_tree = proto_item_add_subtree(sub_item, ett_smb2_RqLs_buffer);
-               }
-
+               proto_item_append_text(parent_item, ": LEASE_V1");
+               sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_smb2_RqLs_buffer, NULL, "LEASE_V1");
                break;
        case 52: /* SMB2_CREATE_REQUEST/RESPONSE_LEASE_V2 */
-               if (parent_item) {
-                       proto_item_append_text(parent_item, ": LEASE_V2");
-                       sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "LEASE_V2");
-                       sub_tree = proto_item_add_subtree(sub_item, ett_smb2_RqLs_buffer);
-               }
-
+               proto_item_append_text(parent_item, ": LEASE_V2");
+               sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_smb2_RqLs_buffer, NULL, "LEASE_V2");
                break;
        default:
                report_create_context_malformed_buffer(tvb, pinfo, parent_tree, "RqLs");
@@ -5492,19 +5410,13 @@ static void
 dissect_smb2_APP_INSTANCE_buffer_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, smb2_info_t *si _U_)
 {
        int         offset   = 0;
-       proto_item *item     = NULL;
-       proto_item *sub_item = NULL;
-       proto_item *sub_tree = NULL;
+       proto_item *item;
+       proto_item *sub_tree;
 
-       if (tree) {
-               item = proto_tree_get_parent(tree);
-       }
+       item = proto_tree_get_parent(tree);
 
-       if (item) {
-               proto_item_append_text(item, ": APP INSTANCE ID");
-               sub_item = proto_tree_add_text(tree, tvb, offset, -1, "APP INSTANCE ID");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_APP_INSTANCE_buffer);
-       }
+       proto_item_append_text(item, ": APP INSTANCE ID");
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_APP_INSTANCE_buffer, NULL, "APP INSTANCE ID");
 
        /* struct size */
        proto_tree_add_item(sub_tree, hf_smb2_APP_INSTANCE_buffer_struct_size,
@@ -5591,8 +5503,8 @@ dissect_smb2_create_extra_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pa
        guint16     chain_offset;
        int         offset      = 0;
        int         len         = -1;
-       proto_item *sub_item    = NULL;
-       proto_tree *sub_tree    = NULL;
+       proto_item *sub_item;
+       proto_tree *sub_tree;
        proto_item *parent_item = NULL;
        create_context_data_dissectors_t *dissectors = NULL;
        create_context_data_dissector_t   dissector  = NULL;
@@ -5603,11 +5515,8 @@ dissect_smb2_create_extra_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *pa
                len = chain_offset;
        }
 
-       if (parent_tree) {
-               sub_item = proto_tree_add_text(parent_tree, tvb, offset, len, "Chain Element");
-               sub_tree = proto_item_add_subtree(sub_item, ett_smb2_create_chain_element);
-               parent_item = proto_tree_get_parent(parent_tree);
-       }
+       sub_tree = proto_tree_add_subtree(parent_tree, tvb, offset, len, ett_smb2_create_chain_element, &sub_item, "Chain Element");
+       parent_item = proto_tree_get_parent(parent_tree);
 
        /* chain offset */
        proto_tree_add_item(sub_tree, hf_smb2_create_chain_offset, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -6662,9 +6571,7 @@ dissect_smb2_transform_header(packet_info *pinfo _U_, proto_tree *tree,
        sesid_offset = offset;
        sti->sesid = tvb_get_letoh64(tvb, offset);
        sesid_item = proto_tree_add_item(tree, hf_smb2_sesid, tvb, offset, 8, ENC_LITTLE_ENDIAN);
-       if (tree) {
-               sesid_tree = proto_item_add_subtree(sesid_item, ett_smb2_sesid_tree);
-       }
+       sesid_tree = proto_item_add_subtree(sesid_item, ett_smb2_sesid_tree);
        offset += 8;
 
        /* now we need to first lookup the uid session */
@@ -6765,13 +6672,11 @@ dissect_smb2_command(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int of
        proto_tree *cmd_tree;
        int         old_offset = offset;
 
-       cmd_item = proto_tree_add_text(tree, tvb, offset, -1,
-                       "%s %s (0x%02x)",
+       cmd_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1,
+                       ett_smb2_command, &cmd_item, "%s %s (0x%02x)",
                        decode_smb2_name(si->opcode),
                        (si->flags & SMB2_FLAGS_RESPONSE)?"Response":"Request",
                        si->opcode);
-       cmd_tree = proto_item_add_subtree(cmd_item, ett_smb2_command);
-
 
        cmd_dissector = (si->flags & SMB2_FLAGS_RESPONSE)?
                smb2_dissector[si->opcode&0xff].response:
@@ -6814,9 +6719,7 @@ dissect_smb2_tid_sesid(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb,
                tid_offset = offset;
                si->tid = tvb_get_letohl(tvb, offset);
                tid_item = proto_tree_add_item(tree, hf_smb2_tid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
-               if (tree) {
-                       tid_tree = proto_item_add_subtree(tid_item, ett_smb2_tid_tree);
-               }
+               tid_tree = proto_item_add_subtree(tid_item, ett_smb2_tid_tree);
                offset += 4;
        }
 
@@ -6824,9 +6727,7 @@ dissect_smb2_tid_sesid(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb,
        sesid_offset = offset;
        si->sesid = tvb_get_letoh64(tvb, offset);
        sesid_item = proto_tree_add_item(tree, hf_smb2_sesid, tvb, offset, 8, ENC_LITTLE_ENDIAN);
-       if (tree) {
-               sesid_tree = proto_item_add_subtree(sesid_item, ett_smb2_sesid_tree);
-       }
+       sesid_tree = proto_item_add_subtree(sesid_item, ett_smb2_sesid_tree);
        offset += 8;
 
        /* now we need to first lookup the uid session */
@@ -6958,17 +6859,10 @@ dissect_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolea
                col_append_str(pinfo->cinfo, COL_INFO, ";");
        }
 
-       if (parent_tree) {
-               item = proto_tree_add_item(parent_tree, proto_smb2, tvb, offset,
-                       -1, ENC_NA);
-               tree = proto_item_add_subtree(item, ett_smb2);
-       }
-
+       item = proto_tree_add_item(parent_tree, proto_smb2, tvb, offset, -1, ENC_NA);
+       tree = proto_item_add_subtree(item, ett_smb2);
 
-       if (tree) {
-               header_item = proto_tree_add_text(tree, tvb, offset, -1, "%s", label);
-               header_tree = proto_item_add_subtree(header_item, ett_smb2_header);
-       }
+       header_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_smb2_header, &header_item, label);
 
        /* Decode the header */
 
@@ -7160,7 +7054,6 @@ dissect_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolea
                /* Decode the payload */
                offset                = dissect_smb2_command(pinfo, tree, tvb, offset, si);
        } else {
-               proto_item *enc_item;
                proto_tree *enc_tree;
                tvbuff_t   *enc_tvb   = NULL;
                tvbuff_t   *plain_tvb = NULL;
@@ -7172,8 +7065,7 @@ dissect_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolea
                offset = dissect_smb2_transform_header(pinfo, header_tree, tvb, offset, sti,
                                                       &enc_tvb, &plain_tvb);
 
-               enc_item = proto_tree_add_text(tree, enc_tvb, 0, sti->size, "Encrypted SMB3 data");
-               enc_tree = proto_item_add_subtree(enc_item, ett_smb2_encrypted);
+               enc_tree = proto_tree_add_subtree(tree, enc_tvb, 0, sti->size, ett_smb2_encrypted, NULL, "Encrypted SMB3 data");
                if (plain_tvb != NULL) {
                        col_append_str(pinfo->cinfo, COL_INFO, "Decrypted SMB3");
                        dissect_smb2(plain_tvb, pinfo, enc_tree, FALSE);
index 52e225bda711a0ee55e25b999762eb201dbdb757..8b2852fd1e59a319870e843cc5313cfdac700e27 100644 (file)
@@ -1,4 +1,4 @@
-/* packet-SML.c
+/* packet-sml.c
  * Routines for SML dissection
  * Copyright 2013, Alexander Gaertner <gaertner.alex@gmx.de>
  *
@@ -421,11 +421,9 @@ static void sml_value(tvbuff_t *tvb,proto_tree *insert_tree,guint *offset, guint
 }
 
 static void sml_time_type(tvbuff_t *tvb, proto_tree *SML_time_tree, guint *offset){
-       proto_item *timetype = NULL;
-       proto_tree *timetype_tree = NULL;
+       proto_tree *timetype_tree;
 
-       timetype = proto_tree_add_text (SML_time_tree, tvb, *offset, 2, "SML-Time Type");
-       timetype_tree = proto_item_add_subtree (timetype, ett_sml_timetype);
+       timetype_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, 2, ett_sml_timetype, NULL, "SML-Time Type");
 
        proto_tree_add_item (timetype_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
@@ -471,13 +469,11 @@ static void field_clientId(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset
 }
 
 static void field_reqFileId(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *reqFileId = NULL;
-       proto_tree *reqFileId_tree = NULL;
+       proto_tree *reqFileId_tree;
 
        get_length(tvb, offset, data, length);
-       reqFileId = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data, "reqFileId");
+       reqFileId_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, *length + *data, ett_sml_reqFileId, NULL, "reqFileId");
 
-       reqFileId_tree = proto_item_add_subtree (reqFileId, ett_sml_reqFileId);
        proto_tree_add_text (reqFileId_tree, tvb, *offset, *length, "Length: %d %s", *data, plurality(*data, "octet", "octets"));
        *offset+=*length;
        proto_tree_add_item (reqFileId_tree, hf_sml_reqFileId, tvb, *offset, *data, ENC_NA);
@@ -601,14 +597,12 @@ static void field_listName(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset
 }
 
 static void field_objName(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *objName = NULL;
-       proto_tree *objName_tree = NULL;
+       proto_tree *objName_tree;
 
        /*Objectname*/
        get_length(tvb, offset, data, length);
-       objName = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data ,"Objectname");
+       objName_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, *length + *data, ett_sml_objName, NULL, "Objectname");
 
-       objName_tree = proto_item_add_subtree (objName, ett_sml_objName);
        proto_tree_add_text (objName_tree, tvb, *offset, *length, "Length: %d %s", *data ,plurality(*data, "octet", "octets"));
        *offset+=*length;
        proto_tree_add_item (objName_tree, hf_sml_objName, tvb, *offset, *data, ENC_NA);
@@ -616,14 +610,13 @@ static void field_objName(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset,
 }
 
 static void field_status(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *status = NULL;
        proto_tree *status_tree = NULL;
 
        get_length(tvb, offset, data, length);
-       status = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data ,"status %s", (*data == 0)? ": NOT SET" : "");
+       status_tree = proto_tree_add_subtree_format(insert_tree, tvb, *offset, *length + *data,
+                                               ett_sml_status, NULL, "status %s", (*data == 0)? ": NOT SET" : "");
 
        if (*data > 0){
-               status_tree = proto_item_add_subtree (status, ett_sml_status);
                proto_tree_add_item (status_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                proto_tree_add_item (status_tree, hf_sml_status, tvb, *offset, *data, ENC_BIG_ENDIAN);
@@ -705,13 +698,11 @@ static void field_parameterTreePath(tvbuff_t *tvb, proto_tree *insert_tree, guin
 }
 
 static void field_ObjReqEntry(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *object_list_Entry = NULL;
-       proto_tree *object_list_Entry_tree = NULL;
+       proto_tree *object_list_Entry_tree;
 
        /*parameterTreePath*/
        get_length(tvb, offset, data, length);
-       object_list_Entry = proto_tree_add_text (insert_tree, tvb ,*offset, *length + *data, "object_list_Entry");
-       object_list_Entry_tree = proto_item_add_subtree (object_list_Entry, ett_sml_object_list_Entry);
+       object_list_Entry_tree = proto_tree_add_subtree(insert_tree, tvb ,*offset, *length + *data, ett_sml_object_list_Entry, NULL, "object_list_Entry");
        proto_tree_add_text (object_list_Entry_tree, tvb, *offset, *length, "Length: %d %s", *data ,plurality(*data, "octet", "octets"));
        *offset+=*length;
        proto_tree_add_item (object_list_Entry_tree, hf_sml_object_list_Entry, tvb, *offset, *data, ENC_NA);
@@ -719,13 +710,11 @@ static void field_ObjReqEntry(tvbuff_t *tvb, proto_tree *insert_tree, guint *off
 }
 
 static void field_regPeriod(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *regPeriod = NULL;
-       proto_tree *regPeriod_tree = NULL;
+       proto_tree *regPeriod_tree;
 
        get_length(tvb, offset, data, length);
-       regPeriod = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data, "regPeriod");
+       regPeriod_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, *length + *data, ett_sml_regPeriod, NULL, "regPeriod");
 
-       regPeriod_tree = proto_item_add_subtree (regPeriod, ett_sml_regPeriod);
        proto_tree_add_item (regPeriod_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (regPeriod_tree, hf_sml_regPeriod, tvb, *offset, *data, ENC_BIG_ENDIAN);
@@ -771,12 +760,10 @@ static void field_periodSignature(tvbuff_t *tvb, proto_tree *insert_tree, guint
 }
 
 static void field_actTime(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *actTime = NULL;
-       proto_tree *actTime_tree = NULL;
+       proto_tree *actTime_tree;
 
        get_length(tvb, offset, data, length);
-       actTime = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data, "actTime");
-       actTime_tree = proto_item_add_subtree (actTime, ett_sml_actTime);
+       actTime_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, *length + *data, ett_sml_actTime, NULL, "actTime");
        proto_tree_add_item (actTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item(actTime_tree, hf_sml_actTime, tvb, *offset, *data, ENC_BIG_ENDIAN);
@@ -784,12 +771,10 @@ static void field_actTime(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset,
 }
 
 static void field_valTime(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *valTime = NULL;
-       proto_tree *valTime_tree = NULL;
+       proto_tree *valTime_tree;
 
        get_length(tvb, offset, data, length);
-       valTime = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data, "valTime");
-       valTime_tree = proto_item_add_subtree (valTime, ett_sml_valTime);
+       valTime_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, *length + *data, ett_sml_valTime, NULL, "valTime");
        proto_tree_add_item (valTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item(valTime_tree, hf_sml_valTime, tvb, *offset, *data, ENC_BIG_ENDIAN);
@@ -797,29 +782,8 @@ static void field_valTime(tvbuff_t *tvb, proto_tree *insert_tree, guint *offset,
 }
 
 static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *offset){
-       proto_item *TupelEntry = NULL;
-       proto_item *SML_time = NULL;
-       proto_item *secIndex = NULL;
-       proto_item *unit_pA = NULL;
-       proto_item *scaler_pA = NULL;
-       proto_item *value_pA = NULL;
-       proto_item *unit_mA = NULL;
-       proto_item *scaler_mA = NULL;
-       proto_item *value_mA = NULL;
-       proto_item *unit_R1 = NULL;
-       proto_item *scaler_R1 = NULL;
-       proto_item *value_R1 = NULL;
-       proto_item *unit_R2 = NULL;
-       proto_item *scaler_R2 = NULL;
-       proto_item *value_R2 = NULL;
-       proto_item *unit_R3 = NULL;
-       proto_item *scaler_R3 = NULL;
-       proto_item *value_R3 = NULL;
-       proto_item *unit_R4 = NULL;
-       proto_item *scaler_R4 = NULL;
-       proto_item *value_R4 = NULL;
-       proto_item *signature_pA_R1_R4 = NULL;
-       proto_item *signature_mA_R2_R3 = NULL;
+    proto_item *SML_time;
+    proto_item *TupelEntry;
 
        proto_tree *TupelEntry_list = NULL;
        proto_tree *SML_time_tree = NULL;
@@ -849,8 +813,7 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
        guint length = 0;
 
        /*Tupel_List*/
-       TupelEntry = proto_tree_add_text (procParValue_tree, tvb, *offset, -1, "TupelEntry");
-       TupelEntry_list = proto_item_add_subtree (TupelEntry, ett_sml_tupel);
+       TupelEntry_list = proto_tree_add_subtree(procParValue_tree, tvb, *offset, -1, ett_sml_tupel, &TupelEntry, "TupelEntry");
        get_length(tvb, offset, &data, &length);
        *offset+=length;
 
@@ -858,13 +821,11 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
        field_serverId(tvb, TupelEntry_list, offset, &data, &length);
 
        /*secindex*/
-       SML_time = proto_tree_add_text (procParValue_tree, tvb, *offset, -1, "secIndex");
-       SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+       SML_time_tree = proto_tree_add_subtree(procParValue_tree, tvb, *offset, -1, ett_sml_time, &SML_time, "secIndex");
        *offset+=1;
        sml_time_type(tvb, SML_time_tree, offset);
        get_length(tvb, offset, &data, &length);
-       secIndex = proto_tree_add_text (SML_time_tree, tvb, *offset, length + data, "secIndex");
-       secIndex_tree = proto_item_add_subtree (secIndex, ett_sml_secIndex);
+       secIndex_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, length + data, ett_sml_secIndex, NULL, "secIndex");
        proto_tree_add_item (secIndex_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item(secIndex_tree, hf_sml_secIndex, tvb, *offset, data, ENC_BIG_ENDIAN);
@@ -875,16 +836,14 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
        field_status(tvb, TupelEntry_list, offset, &data, &length);
 
        /*unit_pA*/
-       unit_pA= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "unit_pA");
-       unit_pA_tree = proto_item_add_subtree(unit_pA, ett_sml_unit_pA);
+       unit_pA_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_unit_pA, NULL, "unit_pA");
        proto_tree_add_item (unit_pA_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (unit_pA_tree, hf_sml_unit_pA, tvb, *offset, 1, ENC_NA);
        *offset+=1;
 
        /*scaler_pA*/
-       scaler_pA= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "scaler_pA");
-       scaler_pA_tree = proto_item_add_subtree(scaler_pA, ett_sml_scaler_pA);
+       scaler_pA_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_scaler_pA, NULL, "scaler_pA");
        proto_tree_add_item (scaler_pA_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (scaler_pA_tree, hf_sml_scaler_pA, tvb, *offset, 1, ENC_NA);
@@ -892,24 +851,21 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*value_pA*/
        get_length(tvb, offset, &data, &length);
-       value_pA= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "value_pA");
-       value_pA_tree = proto_item_add_subtree(value_pA, ett_sml_value_pA);
+       value_pA_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_value_pA, NULL, "value_pA");
        proto_tree_add_item (value_pA_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (value_pA_tree, hf_sml_value_pA, tvb, *offset, data, ENC_NA);
        *offset+=data;
 
        /*unit_R1*/
-       unit_R1= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "unit_R1");
-       unit_R1_tree = proto_item_add_subtree(unit_R1, ett_sml_unit_R1);
+       unit_R1_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_unit_R1, NULL, "unit_R1");
        proto_tree_add_item (unit_R1_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (unit_R1_tree, hf_sml_unit_R1, tvb, *offset, 1, ENC_NA);
        *offset+=1;
 
        /*scaler_R1*/
-       scaler_R1= proto_tree_add_text (TupelEntry_list, tvb, *offset, 1, "scaler_R1");
-       scaler_R1_tree = proto_item_add_subtree(scaler_R1, ett_sml_scaler_R1);
+       scaler_R1_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 1, ett_sml_scaler_R1, NULL, "scaler_R1");
        proto_tree_add_item (scaler_R1_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (scaler_R1_tree, hf_sml_scaler_R1, tvb, *offset, 1, ENC_NA);
@@ -917,24 +873,21 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*value_R1*/
        get_length(tvb, offset, &data, &length);
-       value_R1= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "value_R1");
-       value_R1_tree = proto_item_add_subtree(value_R1, ett_sml_value_R1);
+       value_R1_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_value_R1, NULL, "value_R1");
        proto_tree_add_item (value_R1_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (value_R1_tree, hf_sml_value_R1, tvb, *offset, data, ENC_NA);
        *offset+=data;
 
        /*unit_R4*/
-       unit_R4= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "unit_R4");
-       unit_R4_tree = proto_item_add_subtree(unit_R4, ett_sml_unit_R4);
+       unit_R4_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_unit_R4, NULL, "unit_R4");
        proto_tree_add_item (unit_R4_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (unit_R4_tree, hf_sml_unit_R4, tvb, *offset, 1, ENC_NA);
        *offset+=1;
 
        /*scaler_R4*/
-       scaler_R4= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "scaler_R4");
-       scaler_R4_tree = proto_item_add_subtree(scaler_R4, ett_sml_scaler_R4);
+       scaler_R4_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_scaler_R4, NULL, "scaler_R4");
        proto_tree_add_item (scaler_R4_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (scaler_R4_tree, hf_sml_scaler_R4, tvb, *offset, 1, ENC_NA);
@@ -942,8 +895,7 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*value_R4*/
        get_length(tvb, offset, &data, &length);
-       value_R4= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "value_R4");
-       value_R4_tree = proto_item_add_subtree(value_R4, ett_sml_value_R4);
+       value_R4_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_value_R4, NULL, "value_R4");
        proto_tree_add_item (value_R4_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (value_R4_tree, hf_sml_value_R4, tvb, *offset, data, ENC_NA);
@@ -951,24 +903,21 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*signature_pA_R1_R4*/
        get_length(tvb, offset, &data, &length);
-       signature_pA_R1_R4= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "signature_pa_R1_R4");
-       signature_pA_R1_R4_tree = proto_item_add_subtree(signature_pA_R1_R4, ett_sml_signature_pA_R1_R4);
+       signature_pA_R1_R4_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_signature_pA_R1_R4, NULL, "signature_pa_R1_R4");
        proto_tree_add_text (signature_pA_R1_R4_tree, tvb, *offset, length, "Length: %d %s", data ,plurality(data, "octet", "octets"));
        *offset+=length;
        proto_tree_add_item (signature_pA_R1_R4_tree, hf_sml_signature_pA_R1_R4, tvb, *offset, data, ENC_NA);
        *offset+=data;
 
        /*unit_mA*/
-       unit_mA= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "unit_mA");
-       unit_mA_tree = proto_item_add_subtree(unit_mA, ett_sml_unit_mA);
+       unit_mA_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_unit_mA, NULL, "unit_mA");
        proto_tree_add_item (unit_mA_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (unit_mA_tree, hf_sml_unit_mA, tvb, *offset, 1, ENC_NA);
        *offset+=1;
 
        /*scaler_mA*/
-       scaler_mA= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "scaler_mA");
-       scaler_mA_tree = proto_item_add_subtree(scaler_mA, ett_sml_scaler_mA);
+       scaler_mA_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_scaler_mA, NULL, "scaler_mA");
        proto_tree_add_item (scaler_mA_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (scaler_mA_tree, hf_sml_scaler_mA, tvb, *offset, 1, ENC_NA);
@@ -976,24 +925,21 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*value_mA*/
        get_length(tvb, offset, &data, &length);
-       value_mA= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "value_mA");
-       value_mA_tree = proto_item_add_subtree(value_mA, ett_sml_value_mA);
+       value_mA_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_value_mA, NULL, "value_mA");
        proto_tree_add_item (value_mA_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (value_mA_tree, hf_sml_value_mA, tvb, *offset, data, ENC_NA);
        *offset+=data;
 
        /*unit_R2*/
-       unit_R2= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "unit_R2");
-       unit_R2_tree = proto_item_add_subtree(unit_R2, ett_sml_unit_R2);
+       unit_R2_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_unit_R2, NULL, "unit_R2");
        proto_tree_add_item (unit_R2_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (unit_R2_tree, hf_sml_unit_R2, tvb, *offset, 1, ENC_NA);
        *offset+=1;
 
        /*scaler_R2*/
-       scaler_R2= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "scaler_R2");
-       scaler_R2_tree = proto_item_add_subtree(scaler_R2, ett_sml_scaler_R2);
+       scaler_R2_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_scaler_R2, NULL, "scaler_R2");
        proto_tree_add_item (scaler_R2_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (scaler_R2_tree, hf_sml_scaler_R2, tvb, *offset, 1, ENC_NA);
@@ -1001,24 +947,21 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*value_R2*/
        get_length(tvb, offset, &data, &length);
-       value_R2= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "value_R2");
-       value_R2_tree = proto_item_add_subtree(value_R2, ett_sml_value_R2);
+       value_R2_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_value_R2, NULL, "value_R2");
        proto_tree_add_item (value_R2_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (value_R2_tree, hf_sml_value_R2, tvb, *offset, data, ENC_NA);
        *offset+=data;
 
        /*unit_R3*/
-       unit_R3= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "unit_R3");
-       unit_R3_tree = proto_item_add_subtree(unit_R3, ett_sml_unit_R3);
+       unit_R3_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_unit_R3, NULL, "unit_R3");
        proto_tree_add_item (unit_R3_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (unit_R3_tree, hf_sml_unit_R3, tvb, *offset, 1, ENC_NA);
        *offset+=1;
 
        /*scaler_R3*/
-       scaler_R3= proto_tree_add_text (TupelEntry_list, tvb, *offset, 2, "scaler_R3");
-       scaler_R3_tree = proto_item_add_subtree(scaler_R3, ett_sml_scaler_R3);
+       scaler_R3_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, 2, ett_sml_scaler_R3, NULL, "scaler_R3");
        proto_tree_add_item (scaler_R3_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (scaler_R3_tree, hf_sml_scaler_R3, tvb, *offset, 1, ENC_NA);
@@ -1026,8 +969,7 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*value_R3*/
        get_length(tvb, offset, &data, &length);
-       value_R3= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "value_R3");
-       value_R3_tree = proto_item_add_subtree(value_R3, ett_sml_value_R3);
+       value_R3_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_value_R3, NULL, "value_R3");
        proto_tree_add_item (value_R3_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
        *offset+=1;
        proto_tree_add_item (value_R3_tree, hf_sml_value_R3, tvb, *offset, data, ENC_NA);
@@ -1035,9 +977,8 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 
        /*signature_mA_R2_R3*/
        get_length(tvb, offset, &data, &length);
-       signature_mA_R2_R3= proto_tree_add_text (TupelEntry_list, tvb, *offset, length+data, "signature_mA_R2_R3");
-       signature_mA_R2_R3_tree = proto_item_add_subtree(signature_mA_R2_R3, ett_sml_signature_mA_R2_R3);
-       proto_tree_add_text (signature_mA_R2_R3_tree, tvb, *offset, length, "Length: %d %s", data ,plurality(data, "octet", "octets"));
+       signature_mA_R2_R3_tree = proto_tree_add_subtree(TupelEntry_list, tvb, *offset, length+data, ett_sml_signature_mA_R2_R3, NULL, "signature_mA_R2_R3");
+       proto_tree_add_text (signature_mA_R2_R3_tree, tvb, *offset, length, "Length: %d %s", data, plurality(data, "octet", "octets"));
        *offset+=length;
        proto_tree_add_item (signature_mA_R2_R3_tree, hf_sml_signature_mA_R2_R3, tvb, *offset, data, ENC_NA);
        *offset+=data;
@@ -1046,14 +987,12 @@ static void TupelEntryTree(tvbuff_t *tvb, proto_tree *procParValue_tree, guint *
 }
 
 static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tree, guint *offset, guint *data, guint *length){
-       proto_item *parameterName = NULL;
-       proto_item *procParValue = NULL;
-       proto_item *child = NULL;
-       proto_item *procParValuetype = NULL;
-       proto_item *periodEntry = NULL;
-       proto_item *SML_time = NULL;
-       proto_item *procParValueTime = NULL;
-       proto_item *tree_Entry = NULL;
+       proto_item *parameterName;
+       proto_item *procParValue;
+       proto_item *child;
+       proto_item *periodEntry;
+       proto_item *SML_time;
+       proto_item *tree_Entry;
 
        proto_tree *parameterName_tree = NULL;
        proto_tree *procParValue_tree = NULL;
@@ -1070,8 +1009,7 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
 
        /*parameterName*/
        get_length(tvb, offset, data, length);
-       parameterName = proto_tree_add_text (insert_tree, tvb, *offset, *length + *data ,"parameterName");
-       parameterName_tree = proto_item_add_subtree (parameterName, ett_sml_parameterName);
+       parameterName_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, *length + *data, ett_sml_parameterName, &parameterName, "parameterName");
        proto_tree_add_text (parameterName_tree, tvb, *offset, *length, "Length: %d %s", *data ,plurality(*data, "octet", "octets"));
        *offset+=*length;
        proto_tree_add_item (parameterName_tree, hf_sml_parameterName, tvb, *offset, *data, ENC_NA);
@@ -1087,13 +1025,11 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
        }
        else if (check == 0x72){
                get_length(tvb, offset, data, length);
-               procParValue = proto_tree_add_text(insert_tree, tvb, *offset, -1, "ProcParValue");
-               procParValue_tree = proto_item_add_subtree (procParValue, ett_sml_procParValue);
+               procParValue_tree = proto_tree_add_subtree(insert_tree, tvb, *offset, -1, ett_sml_procParValue, &procParValue, "ProcParValue");
                *offset+=1;
 
                /*procParValue CHOOSE*/
-               procParValuetype = proto_tree_add_text (procParValue_tree, tvb, *offset, 2, "ProcParValueType");
-               procParValuetype_tree = proto_item_add_subtree (procParValuetype, ett_sml_procParValuetype);
+               procParValuetype_tree = proto_tree_add_subtree(procParValue_tree, tvb, *offset, 2, ett_sml_procParValuetype, NULL, "ProcParValueType");
                proto_tree_add_item (procParValuetype_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                check = tvb_get_guint8(tvb, *offset);
@@ -1109,8 +1045,8 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
                        case PROC_PERIOD:
                                /*period*/
                                get_length(tvb, offset, data, length);
-                               periodEntry = proto_tree_add_text(procParValue_tree, tvb, *offset, -1, "PeriodEntry List with %d %s", *length + *data, plurality(*length + *data, "element", "elements"));
-                               periodEntry_tree = proto_item_add_subtree(periodEntry, ett_sml_periodEntry);
+                               periodEntry_tree = proto_tree_add_subtree_format(procParValue_tree, tvb, *offset, -1, ett_sml_periodEntry, &periodEntry,
+                                                                               "PeriodEntry List with %d %s", *length + *data, plurality(*length + *data, "element", "elements"));
                                *offset+=*length;
 
                                /*objName*/
@@ -1143,16 +1079,14 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
                                break;
 
                        case PROC_TIME:
-                               SML_time = proto_tree_add_text (procParValue_tree, tvb, *offset, -1, "Time");
-                               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+                               SML_time_tree = proto_tree_add_subtree(procParValue_tree, tvb, *offset, -1, ett_sml_time, &SML_time, "Time");
                                *offset+=1;
 
                                sml_time_type(tvb, SML_time_tree, offset);
 
                                /*Time*/
                                get_length(tvb, offset, data, length);
-                               procParValueTime = proto_tree_add_text (SML_time_tree, tvb, *offset, *length + *data, "procParValueTime");
-                               procParValueTime_tree = proto_item_add_subtree (procParValueTime, ett_sml_procParValueTime);
+                               procParValueTime_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, *length + *data, ett_sml_procParValueTime, NULL, "procParValueTime");
                                proto_tree_add_item (procParValueTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                                *offset+=1;
                                proto_tree_add_item(procParValueTime_tree, hf_sml_procParValueTime, tvb, *offset, *data, ENC_BIG_ENDIAN);
@@ -1182,12 +1116,11 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
        else if ((check & 0x0F) != 0){
                if (check == 0x71){
                        get_length(tvb, offset, data, length);
-                       child = proto_tree_add_text(insert_tree, tvb, *offset, -1, "Child List with %d %s", *length + *data, plurality(*length + *data, "element", "elements"));
-                       child_list = proto_item_add_subtree(child, ett_sml_child);
+                       child_list = proto_tree_add_subtree_format(insert_tree, tvb, *offset, -1, ett_sml_child, &child,
+                                       "Child List with %d %s", *length + *data, plurality(*length + *data, "element", "elements"));
                        *offset+=1;
 
-                       tree_Entry = proto_tree_add_text (child_list, tvb, *offset, -1, "tree_Entry");
-                       tree_Entry_list = proto_item_add_subtree(tree_Entry, ett_sml_tree_Entry);
+                       tree_Entry_list = proto_tree_add_subtree(child_list, tvb, *offset, -1, ett_sml_tree_Entry, &tree_Entry, "tree_Entry");
                        *offset+=1;
 
                        child_tree(tvb, pinfo,tree_Entry_list, offset, data, length);
@@ -1198,8 +1131,8 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
                else if ((check & 0xF0) == SHORT_LIST || (check & 0xF0) == LONG_LIST){
                        get_length(tvb, offset, data, length);
                        repeat = *length + *data;
-                       child = proto_tree_add_text(insert_tree, tvb, *offset, -1, "Child List with %d %s", *length + *data, plurality(*length + *data, "element", "elements"));
-                       child_list = proto_item_add_subtree(child, ett_sml_child);
+                       child_list = proto_tree_add_subtree_format(insert_tree, tvb, *offset, -1, ett_sml_child, &child,
+                                       "Child List with %d %s", *length + *data, plurality(*length + *data, "element", "elements"));
                        if (repeat <= 0){
                                expert_add_info_format(pinfo, child, &ei_sml_invalid_count, "invalid loop count");
                                return;
@@ -1207,8 +1140,7 @@ static void child_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *insert_tre
                        *offset+=*length;
 
                        for(i =0 ; i < repeat; i++){
-                               tree_Entry = proto_tree_add_text (child_list, tvb, *offset, -1, "tree_Entry");
-                               tree_Entry_list = proto_item_add_subtree(tree_Entry, ett_sml_tree_Entry);
+                               tree_Entry_list = proto_tree_add_subtree(child_list, tvb, *offset, -1, ett_sml_tree_Entry, &tree_Entry, "tree_Entry");
 
                                if (tvb_get_guint8(tvb, *offset) != 0x73){
                                        expert_add_info_format(pinfo, tree_Entry, &ei_sml_invalid_count, "invalid count of elements in tree_Entry");
@@ -1255,7 +1187,6 @@ static void decode_PublicOpenReq (tvbuff_t *tvb, proto_tree *messagebodytree_lis
 }
 
 static void decode_PublicOpenRes (tvbuff_t *tvb, proto_tree *messagebodytree_list, guint *offset){
-       proto_item *refTime = NULL;
        proto_item *SML_time = NULL;
 
        proto_tree *refTime_tree = NULL;
@@ -1285,16 +1216,14 @@ static void decode_PublicOpenRes (tvbuff_t *tvb, proto_tree *messagebodytree_lis
        }
        else{
                /*SML TIME*/
-               SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "refTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "refTime");
                *offset+=1;
 
                sml_time_type(tvb, SML_time_tree, offset);
 
                /*refTime*/
                get_length(tvb, offset, &data, &length);
-               refTime = proto_tree_add_text (SML_time_tree, tvb, *offset, length+data, "refTime");
-               refTime_tree = proto_item_add_subtree (refTime, ett_sml_refTime);
+               refTime_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, length+data, ett_sml_refTime, NULL, "refTime");
                proto_tree_add_item (refTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                proto_tree_add_item(refTime_tree, hf_sml_refTime, tvb, *offset, data, ENC_BIG_ENDIAN);
@@ -1308,10 +1237,8 @@ static void decode_PublicOpenRes (tvbuff_t *tvb, proto_tree *messagebodytree_lis
 static gboolean decode_GetProfile_List_Pack_Req (tvbuff_t *tvb, packet_info *pinfo, proto_tree *messagebodytree_list, guint *offset){
        proto_item *withRawdata = NULL;
        proto_item *SML_time = NULL;
-       proto_item *beginTime = NULL;
        proto_item *treepath = NULL;
        proto_item *object_list = NULL;
-       proto_item *endTime = NULL;
        proto_item *dasDetails = NULL;
 
        proto_tree *withRawdata_tree = NULL;
@@ -1360,16 +1287,14 @@ static gboolean decode_GetProfile_List_Pack_Req (tvbuff_t *tvb, packet_info *pin
        }
        else {
                /*SML TIME*/
-               SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "beginTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "beginTime");
                *offset+=1;
 
                sml_time_type(tvb, SML_time_tree, offset);
 
                /*beginTime*/
                get_length(tvb, offset, &data, &length);
-               beginTime = proto_tree_add_text (SML_time_tree, tvb, *offset, length + data, "beginTime");
-               beginTime_tree = proto_item_add_subtree (beginTime, ett_sml_beginTime);
+               beginTime_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, length + data, ett_sml_beginTime, NULL, "beginTime");
                proto_tree_add_item (beginTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                proto_tree_add_item(beginTime_tree, hf_sml_beginTime, tvb, *offset, data, ENC_BIG_ENDIAN);
@@ -1386,16 +1311,14 @@ static gboolean decode_GetProfile_List_Pack_Req (tvbuff_t *tvb, packet_info *pin
        }
        else {
                /*SML TIME*/
-               SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "endTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "endTime");
                *offset+=1;
 
                sml_time_type(tvb, SML_time_tree, offset);
 
                /*endTime*/
                get_length(tvb, offset, &data, &length);
-               endTime = proto_tree_add_text (SML_time_tree, tvb, *offset, length + data, "endTime");
-               endTime_tree = proto_item_add_subtree (endTime, ett_sml_beginTime);
+               endTime_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, length + data, ett_sml_beginTime, NULL, "endTime");
                proto_tree_add_item (endTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                proto_tree_add_item(endTime_tree, hf_sml_endTime, tvb, *offset, data, ENC_BIG_ENDIAN);
@@ -1406,8 +1329,8 @@ static gboolean decode_GetProfile_List_Pack_Req (tvbuff_t *tvb, packet_info *pin
        /*Treepath List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       treepath = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
-       treepath_list = proto_item_add_subtree(treepath, ett_sml_treepath);
+       treepath_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_treepath, &treepath,
+                                       "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, treepath, &ei_sml_invalid_count, "invalid count of elements in Treepath");
@@ -1432,8 +1355,8 @@ static gboolean decode_GetProfile_List_Pack_Req (tvbuff_t *tvb, packet_info *pin
        else{
                get_length(tvb, offset, &data, &length);
                repeat = (data+length);
-               object_list = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "object_List with %d %s", length+data, plurality(length+data, "element", "elements"));
-               object_list_list = proto_item_add_subtree(object_list, ett_sml_object_list);
+               object_list_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_object_list, &object_list,
+                                                               "object_List with %d %s", length+data, plurality(length+data, "element", "elements"));
 
                if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                        expert_add_info_format(pinfo, object_list, &ei_sml_invalid_count, "invalid count of elements in object_List");
@@ -1461,8 +1384,8 @@ static gboolean decode_GetProfile_List_Pack_Req (tvbuff_t *tvb, packet_info *pin
        }
        else if ((check & 0xF0) == LONG_LIST || (check & 0xF0) == SHORT_LIST){
                get_length(tvb, offset, &data, &length);
-               dasDetails = proto_tree_add_text(messagebodytree_list, tvb, *offset, -1, "dasDetails with %d %s", length+data, plurality(length+data, "element", "elements"));
-               dasDetails_list = proto_item_add_subtree(dasDetails, ett_sml_dasDetails);
+               dasDetails_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_dasDetails, &dasDetails,
+                                                                       "dasDetails with %d %s", length+data, plurality(length+data, "element", "elements"));
                *offset+=length;
 
                child_tree(tvb, pinfo, dasDetails_list, offset, &data, &length);
@@ -1508,8 +1431,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
 
        /*actTime*/
        get_length(tvb, offset, &data, &length);
-       SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "actTime List with %d %s", length+data, plurality(length+data, "element", "elements"));
-       SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+       SML_time_tree = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time,
+                               "actTime List with %d %s", length+data, plurality(length+data, "element", "elements"));
        *offset+=1;
        sml_time_type(tvb, SML_time_tree, offset);
        field_actTime(tvb, SML_time_tree, offset, &data, &length);
@@ -1521,8 +1444,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
        /*Treepath List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       treepath = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
-       treepath_list = proto_item_add_subtree(treepath, ett_sml_treepath);
+       treepath_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_treepath, &treepath,
+                                       "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, treepath, &ei_sml_invalid_count, "invalid count of elements in Treepath");
@@ -1543,8 +1466,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
        /*headerList*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       headerList = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "header_List with %d %s", length+data, plurality(length+data, "element", "elements"));
-       headerList_subtree = proto_item_add_subtree(headerList, ett_sml_headerList);
+       headerList_subtree = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_headerList, &headerList,
+                                                       "header_List with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, headerList, &ei_sml_invalid_count, "invalid count of elements in headerlist");
@@ -1559,8 +1482,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
 
        for (i=0; i< repeat; i++) {
                get_length(tvb, offset, &data, &length);
-               header_List_Entry = proto_tree_add_text (headerList_subtree, tvb, *offset, -1, "header_List_Entry with %d %s", length+data, plurality(length+data, "element", "elements"));
-               header_List_Entry_list = proto_item_add_subtree(header_List_Entry, ett_sml_header_List_Entry);
+               header_List_Entry_list = proto_tree_add_subtree_format(headerList_subtree, tvb, *offset, -1, ett_sml_header_List_Entry, &header_List_Entry,
+                                                               "header_List_Entry with %d %s", length+data, plurality(length+data, "element", "elements"));
                *offset+=1;
 
                /*objname*/
@@ -1579,8 +1502,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
        /*period List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       periodList = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "period_List with %d %s", length+data, plurality(length+data, "element", "elements"));
-       periodList_list = proto_item_add_subtree(periodList, ett_sml_periodList);
+       periodList_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_periodList, &periodList,
+                               "period_List with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, periodList, &ei_sml_invalid_count, "invalid count of elements in periodList");
@@ -1595,14 +1518,13 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
 
        for (i=0; i< repeat; i++) {
                get_length(tvb, offset, &data, &length);
-               period_List_Entry = proto_tree_add_text (periodList_list, tvb, *offset, -1, "period_List_Entry with %d %s", length+data, plurality(length+data, "element", "elements"));
-               period_List_Entry_list = proto_item_add_subtree(period_List_Entry, ett_sml_period_List_Entry);
+               period_List_Entry_list = proto_tree_add_subtree_format(periodList_list, tvb, *offset, -1, ett_sml_period_List_Entry, &period_List_Entry,
+                                               "period_List_Entry with %d %s", length+data, plurality(length+data, "element", "elements"));
                *offset+=1;
 
                /*valTime*/
                get_length(tvb, offset, &data, &length);
-               SML_time = proto_tree_add_text (period_List_Entry, tvb, *offset, -1, "valTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(period_List_Entry, tvb, *offset, -1, ett_sml_time, &SML_time, "valTime");
                *offset+=1;
                sml_time_type(tvb, SML_time_tree, offset);
                field_valTime(tvb, SML_time_tree, offset, &data, &length);
@@ -1614,8 +1536,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
                /*value List*/
                get_length(tvb, offset, &data, &length);
                repeat2 = data + length;
-               valuelist = proto_tree_add_text (period_List_Entry_list, tvb, *offset, -1, "period_List with %d %s", length+data, plurality(length+data, "element", "elements"));
-               valuelist_list = proto_item_add_subtree(valuelist, ett_sml_valuelist);
+               valuelist_list = proto_tree_add_subtree_format(period_List_Entry_list, tvb, *offset, -1, ett_sml_valuelist, &valuelist,
+                                            "period_List with %d %s", length+data, plurality(length+data, "element", "elements"));
 
                if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                        expert_add_info_format(pinfo, valuelist, &ei_sml_invalid_count, "invalid count of elements in valueList");
@@ -1630,8 +1552,8 @@ static gboolean decode_GetProfilePackRes(tvbuff_t *tvb, packet_info *pinfo, prot
 
                for (d=0; d< repeat2; d++) {
                        get_length(tvb, offset, &data, &length);
-                       value_List_Entry = proto_tree_add_text (valuelist_list, tvb, *offset, -1, "value_List_Entry with %d %s", length+data, plurality(length+data, "element", "elements"));
-                       value_List_Entry_list = proto_item_add_subtree(value_List_Entry, ett_sml_value_List_Entry);
+                       value_List_Entry_list = proto_tree_add_subtree_format(valuelist_list, tvb, *offset, -1, ett_sml_value_List_Entry, NULL,
+                                                                       "value_List_Entry with %d %s", length+data, plurality(length+data, "element", "elements"));
                        *offset+=1;
 
                        /*value*/
@@ -1692,8 +1614,7 @@ static gboolean decode_GetProfileListRes(tvbuff_t *tvb, packet_info *pinfo, prot
 
        /*actTime*/
        get_length(tvb, offset, &data, &length);
-       SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "actTime");
-       SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+       SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "actTime");
        *offset+=1;
        sml_time_type(tvb, SML_time_tree, offset);
        field_actTime(tvb, SML_time_tree, offset, &data, &length);
@@ -1705,8 +1626,8 @@ static gboolean decode_GetProfileListRes(tvbuff_t *tvb, packet_info *pinfo, prot
        /*Treepath List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       treepath = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
-       treepath_list = proto_item_add_subtree(treepath, ett_sml_treepath);
+       treepath_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_treepath, &treepath,
+                               "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, treepath, &ei_sml_invalid_count, "invalid count of elements in parameterTreePath");
@@ -1733,8 +1654,7 @@ static gboolean decode_GetProfileListRes(tvbuff_t *tvb, packet_info *pinfo, prot
        }
        else {
                /*SML TIME*/
-               SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "valTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "valTime");
                *offset+=1;
 
                sml_time_type(tvb, SML_time_tree, offset);
@@ -1748,8 +1668,8 @@ static gboolean decode_GetProfileListRes(tvbuff_t *tvb, packet_info *pinfo, prot
        /*period-List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       periodList = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "period-List with %d %s", length+data, plurality(length+data, "element", "elements"));
-       periodList_list = proto_item_add_subtree(periodList, ett_sml_periodList);
+       periodList_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_periodList, &periodList,
+                                       "period-List with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, periodList, &ei_sml_invalid_count, "invalid count of elements in periodList");
@@ -1764,8 +1684,7 @@ static gboolean decode_GetProfileListRes(tvbuff_t *tvb, packet_info *pinfo, prot
 
        for (i=0; i< repeat; i++) {
                get_length(tvb, offset, &data, &length);
-               periodList_Entry = proto_tree_add_text (periodList_list, tvb, *offset, -1, "PeriodEntry");
-               periodList_Entry_list = proto_item_add_subtree(periodList_Entry, ett_sml_period_List_Entry);
+               periodList_Entry_list = proto_tree_add_subtree(periodList_list, tvb, *offset, -1, ett_sml_period_List_Entry, &periodList_Entry, "PeriodEntry");
                *offset+=1;
 
                /*ObjName*/
@@ -1817,11 +1736,9 @@ static void decode_GetListReq (tvbuff_t *tvb, proto_tree *messagebodytree_list,
 }
 
 static gboolean decode_GetListRes (tvbuff_t *tvb, packet_info *pinfo, proto_tree *messagebodytree_list, guint *offset){
-       proto_item *actSensorTime = NULL;
        proto_item *valList = NULL;
        proto_item *listSignature = NULL;
        proto_item *valtree = NULL;
-       proto_item *actGatewayTime = NULL;
        proto_item *SML_time;
 
        proto_tree *actSensorTime_tree = NULL;
@@ -1854,16 +1771,14 @@ static gboolean decode_GetListRes (tvbuff_t *tvb, packet_info *pinfo, proto_tree
        }
        else {
                /*SML TIME*/
-               SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "actSensorTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "actSensorTime");
                *offset+=1;
 
                sml_time_type(tvb, SML_time_tree, offset);
 
                /*actSensorTime*/
                get_length(tvb, offset, &data, &length);
-               actSensorTime = proto_tree_add_text (SML_time_tree, tvb, *offset, length + data, "actSensorTime");
-               actSensorTime_tree = proto_item_add_subtree (actSensorTime, ett_sml_actSensorTime);
+               actSensorTime_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, length + data, ett_sml_actSensorTime, NULL, "actSensorTime");
                proto_tree_add_item (actSensorTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                proto_tree_add_item(actSensorTime_tree, hf_sml_actSensorTime, tvb, *offset, data, ENC_BIG_ENDIAN);
@@ -1874,8 +1789,8 @@ static gboolean decode_GetListRes (tvbuff_t *tvb, packet_info *pinfo, proto_tree
        /*valList*/
        get_length(tvb, offset, &data, &length);
        repeat = (length + data);
-       valtree = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "valList with %d %s", length+data, plurality(length+data, "element", "elements"));
-       valtree_list = proto_item_add_subtree (valtree, ett_sml_valtree);
+       valtree_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_valtree, &valtree,
+                                               "valList with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, valtree, &ei_sml_invalid_count, "invalid count of elements in valList");
@@ -1890,8 +1805,7 @@ static gboolean decode_GetListRes (tvbuff_t *tvb, packet_info *pinfo, proto_tree
 
        for (i=0; i < repeat; i++){
                get_length(tvb, offset, &data, &length);
-               valList = proto_tree_add_text (valtree_list, tvb, *offset, -1, "valListEntry");
-               valList_list = proto_item_add_subtree (valList, ett_sml_valList);
+               valList_list = proto_tree_add_subtree(valtree_list, tvb, *offset, -1, ett_sml_valList, &valList, "valListEntry");
                *offset+=length;
 
                /*objName*/
@@ -1909,8 +1823,7 @@ static gboolean decode_GetListRes (tvbuff_t *tvb, packet_info *pinfo, proto_tree
                }
                else {
                        /*SML TIME*/
-                       SML_time = proto_tree_add_text (valList_list, tvb, *offset, -1, "valTime");
-                       SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+                       SML_time_tree = proto_tree_add_subtree(valList_list, tvb, *offset, -1, ett_sml_time, &SML_time, "valTime");
                        *offset+=1;
 
                        sml_time_type(tvb, SML_time_tree, offset);
@@ -1957,15 +1870,13 @@ static gboolean decode_GetListRes (tvbuff_t *tvb, packet_info *pinfo, proto_tree
        }
        else{
                /*SML TIME*/
-               SML_time = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "actGatewayTime");
-               SML_time_tree = proto_item_add_subtree (SML_time, ett_sml_time);
+               SML_time_tree = proto_tree_add_subtree(messagebodytree_list, tvb, *offset, -1, ett_sml_time, &SML_time, "actGatewayTime");
                *offset+=1;
 
                sml_time_type(tvb, SML_time_tree, offset);
 
                get_length(tvb, offset, &data, &length);
-               actGatewayTime = proto_tree_add_text (SML_time_tree, tvb, *offset, length + data, "actGatewayTime");
-               actGatewayTime_tree = proto_item_add_subtree (actGatewayTime, ett_sml_actSensorTime);
+               actGatewayTime_tree = proto_tree_add_subtree(SML_time_tree, tvb, *offset, length + data, ett_sml_actSensorTime, NULL, "actGatewayTime");
                proto_tree_add_item (actGatewayTime_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                *offset+=1;
                proto_tree_add_item(actGatewayTime_tree, hf_sml_actGatewayTime, tvb, *offset, data, ENC_BIG_ENDIAN);
@@ -1999,8 +1910,8 @@ static gboolean decode_GetProcParameterReq(tvbuff_t *tvb, packet_info *pinfo, pr
        /*Treepath List*/
        get_length(tvb, offset, &data, &length);
        repeat = data+length;
-       treepath = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "ParameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
-       treepath_list = proto_item_add_subtree(treepath, ett_sml_treepath);
+       treepath_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_treepath, &treepath,
+                                       "ParameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, treepath, &ei_sml_invalid_count, "invalid count of elements in ParameterTreePath");
@@ -2053,8 +1964,8 @@ static gboolean decode_GetProcParameterRes(tvbuff_t *tvb, packet_info *pinfo, pr
        /*Treepath List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       treepath = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
-       treepath_list = proto_item_add_subtree(treepath, ett_sml_treepath);
+       treepath_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_treepath, &treepath,
+                                       "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, treepath, &ei_sml_invalid_count, "invalid count of elements in ParameterTreePath");
@@ -2074,8 +1985,8 @@ static gboolean decode_GetProcParameterRes(tvbuff_t *tvb, packet_info *pinfo, pr
 
        /*parameterTree*/
        get_length(tvb, offset, &data, &length);
-       parameterTree = proto_tree_add_text(messagebodytree_list, tvb, *offset, -1, "parameterTree with %d %s", length+data, plurality(length+data, "element", "elements"));
-       parameterTree_list = proto_item_add_subtree(parameterTree, ett_sml_parameterTree);
+       parameterTree_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_parameterTree, &parameterTree,
+                               "parameterTree with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, parameterTree, &ei_sml_invalid_count, "invalid count of elements in parameterTree");
@@ -2114,8 +2025,8 @@ static gboolean decode_SetProcParameterReq(tvbuff_t *tvb, packet_info *pinfo,pro
        /*Treepath List*/
        get_length(tvb, offset, &data, &length);
        repeat = (data+length);
-       treepath = proto_tree_add_text (messagebodytree_list, tvb, *offset, -1, "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
-       treepath_list = proto_item_add_subtree(treepath, ett_sml_treepath);
+       treepath_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_treepath, &treepath,
+                                       "parameterTreePath with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, treepath, &ei_sml_invalid_count, "invalid count of elements in ParameterTreePath");
@@ -2135,8 +2046,8 @@ static gboolean decode_SetProcParameterReq(tvbuff_t *tvb, packet_info *pinfo,pro
 
        /*parameterTree*/
        get_length(tvb, offset, &data, &length);
-       parameterTree = proto_tree_add_text(messagebodytree_list, tvb, *offset, -1, "parameterTree with %d %s", length+data, plurality(length+data, "element", "elements"));
-       parameterTree_list = proto_item_add_subtree(parameterTree, ett_sml_parameterTree);
+       parameterTree_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_parameterTree, &parameterTree,
+                               "parameterTree with %d %s", length+data, plurality(length+data, "element", "elements"));
 
        if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                expert_add_info_format(pinfo, parameterTree, &ei_sml_invalid_count, "invalid count of elements in parameterTree");
@@ -2152,7 +2063,6 @@ static gboolean decode_SetProcParameterReq(tvbuff_t *tvb, packet_info *pinfo,pro
 }
 
 static gboolean decode_AttentionRes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *messagebodytree_list, guint *offset){
-       proto_item *attentionNo = NULL;
        proto_item *attentionMsg = NULL;
        proto_item *attentionDetails = NULL;
 
@@ -2168,8 +2078,7 @@ static gboolean decode_AttentionRes(tvbuff_t *tvb, packet_info *pinfo, proto_tre
 
        /*attention NO*/
        get_length(tvb, offset, &data, &length);
-       attentionNo = proto_tree_add_text (messagebodytree_list, tvb ,*offset, length+data, "attentionNo");
-       attentionNo_tree = proto_item_add_subtree (attentionNo, ett_sml_attentionNo);
+       attentionNo_tree = proto_tree_add_subtree(messagebodytree_list, tvb ,*offset, length+data, ett_sml_attentionNo, NULL, "attentionNo");
        proto_tree_add_text (attentionNo_tree, tvb, *offset, length, "Length: %d %s", data ,plurality(data, "octet", "octets"));
        *offset+=length;
 
@@ -2204,8 +2113,8 @@ static gboolean decode_AttentionRes(tvbuff_t *tvb, packet_info *pinfo, proto_tre
        }
        else{
                get_length(tvb, offset, &data, &length);
-               attentionDetails = proto_tree_add_text(messagebodytree_list, tvb, *offset, -1, "attentionDetails with %d %s", length+data, plurality(length+data, "element", "elements"));
-               attentionDetails_list = proto_item_add_subtree(attentionDetails, ett_sml_attentionDetails);
+               attentionDetails_list = proto_tree_add_subtree_format(messagebodytree_list, tvb, *offset, -1, ett_sml_attentionDetails, &attentionDetails,
+                                                               "attentionDetails with %d %s", length+data, plurality(length+data, "element", "elements"));
 
                if ((tvb_get_guint8(tvb,*offset) & 0xF0) != LONG_LIST && (tvb_get_guint8(tvb,*offset) & 0xF0) != SHORT_LIST){
                        expert_add_info_format(pinfo, attentionDetails, &ei_sml_invalid_count, "invalid count of elements in attentionDetails");
@@ -2224,15 +2133,12 @@ static gboolean decode_AttentionRes(tvbuff_t *tvb, packet_info *pinfo, proto_tre
 /*dissect SML-File*/
 static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, proto_tree *sml_tree){
        proto_item *file = NULL;
-       proto_item *mainlist = NULL;
-       proto_item *trans = NULL;
-       proto_item *groupNo = NULL;
-       proto_item *abortOnError = NULL;
-       proto_item *sublist = NULL;
-       proto_item *messagebody = NULL;
-       proto_item *crc16 = NULL;
-       proto_item *messagebodytree = NULL;
-       proto_item *msgend = NULL;
+       proto_item *mainlist;
+       proto_item *sublist;
+       proto_item *messagebody;
+       proto_item *crc16;
+       proto_item *messagebodytree;
+       proto_item *msgend;
 
        proto_tree *mainlist_list = NULL;
        proto_tree *trans_tree = NULL;
@@ -2312,9 +2218,9 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
 
                        /*List*/
                        get_length(tvb, offset, &data, &length);
-                       mainlist = proto_tree_add_text (sml_tree, tvb, *offset, -1, "List with %d %s", length+data, plurality(length+data, "element", "elements"));
+                       mainlist_list = proto_tree_add_subtree_format(sml_tree, tvb, *offset, -1, ett_sml_mainlist, &mainlist, "List with %d %s",
+                length+data, plurality(length+data, "element", "elements"));
 
-                       mainlist_list = proto_item_add_subtree (mainlist, ett_sml_mainlist);
                        if (tvb_get_guint8(tvb, *offset) != LIST_6_ELEMENTS) {
                                expert_add_info_format(pinfo, mainlist, &ei_sml_invalid_count, "invalid count of elements");
                                return;
@@ -2323,38 +2229,33 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
 
                        /*Transaction ID*/
                        get_length(tvb, offset, &data, &length);
-                       trans = proto_tree_add_text (mainlist_list, tvb, *offset, length + data ,"Transaction ID");
-                       trans_tree = proto_item_add_subtree (trans, ett_sml_trans);
+                       trans_tree = proto_tree_add_subtree_format(mainlist_list, tvb, *offset, length + data, ett_sml_trans, NULL, "Transaction ID");
                        proto_tree_add_text (trans_tree, tvb, *offset, length, "Length: %d %s", data, plurality(data, "octet", "octets"));
                        *offset+=length;
                        proto_tree_add_item (trans_tree, hf_sml_transactionId, tvb, *offset, data, ENC_NA);
                        *offset+=data;
 
                        /*Group No*/
-                       groupNo = proto_tree_add_text (mainlist_list, tvb, *offset, 2, "Group No");
-                       groupNo_tree = proto_item_add_subtree (groupNo, ett_sml_group);
+                       groupNo_tree = proto_tree_add_subtree(mainlist_list, tvb, *offset, 2, ett_sml_group, NULL, "Group No");
                        proto_tree_add_item (groupNo_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                        *offset+=1;
                        proto_tree_add_item (groupNo_tree, hf_sml_groupNo, tvb, *offset, 1, ENC_NA);
                        *offset+=1;
 
                        /*abort on Error*/
-                       abortOnError = proto_tree_add_text (mainlist_list, tvb, *offset, 2, "Abort on Error");
-                       abortOnError_tree = proto_item_add_subtree (abortOnError ,ett_sml_abort);
+                       abortOnError_tree = proto_tree_add_subtree(mainlist_list, tvb, *offset, 2, ett_sml_abort, NULL, "Abort on Error");
                        proto_tree_add_item(abortOnError_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                        *offset+=1;
                        proto_tree_add_item(abortOnError_tree, hf_sml_abortOnError, tvb, *offset, 1, ENC_NA);
                        *offset+=1;
 
                        /*Sub List*/
-                       sublist = proto_tree_add_text (mainlist_list, tvb, *offset, -1, "MessageBody");
-                       sublist_list = proto_item_add_subtree (sublist, ett_sml_sublist);
+                       sublist_list = proto_tree_add_subtree(mainlist_list, tvb, *offset, -1, ett_sml_sublist, &sublist, "MessageBody");
                        *offset+=1;
 
                        /*Zero Cutting Check*/
                        get_length(tvb, offset, &data, &length);
-                       messagebody = proto_tree_add_text (sublist_list, tvb, *offset, length + data, "Messagetype");
-                       messagebody_tree = proto_item_add_subtree (messagebody , ett_sml_mttree);
+                       messagebody_tree = proto_tree_add_subtree(sublist_list, tvb, *offset, length + data, ett_sml_mttree, &messagebody, "Messagetype");
                        proto_tree_add_item (messagebody_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                        *offset+=1;
 
@@ -2372,8 +2273,8 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
 
                        /*MessageBody List*/
                        get_length(tvb, offset, &data, &length);
-                       messagebodytree = proto_tree_add_text (sublist_list, tvb, *offset, -1, "List with %d %s", length+data, plurality(length+data, "element", "elements"));
-                       messagebodytree_list = proto_item_add_subtree (messagebodytree, ett_sml_mblist);
+                       messagebodytree_list = proto_tree_add_subtree_format(sublist_list, tvb, *offset, -1, ett_sml_mblist, &messagebodytree,
+                                                                                               "List with %d %s", length+data, plurality(length+data, "element", "elements"));
                        *offset+=length;
 
                        switch (messagebody_switch){
@@ -2462,8 +2363,7 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
 
                        /* CRC 16*/
                        get_length(tvb, offset, &data, &length);
-                       crc16 = proto_tree_add_text (mainlist_list, tvb, *offset, data + length, "CRC");
-                       crc16_tree = proto_item_add_subtree (crc16, ett_sml_crc16);
+                       crc16_tree = proto_tree_add_subtree(mainlist_list, tvb, *offset, data + length, ett_sml_crc16, &crc16, "CRC");
 
                        if(tvb_get_guint8(tvb, *offset) != UNSIGNED8 && tvb_get_guint8(tvb, *offset) != UNSIGNED16){
                                expert_add_info(pinfo, crc16, &ei_sml_crc_error_length);
@@ -2473,7 +2373,7 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
                        proto_tree_add_item (crc16_tree, hf_sml_datatype, tvb, *offset, 1, ENC_NA);
                        *offset+=1;
 
-                       proto_tree_add_item (crc16_tree, hf_sml_crc16, tvb, *offset, data, ENC_BIG_ENDIAN);
+                       crc16 = proto_tree_add_item (crc16_tree, hf_sml_crc16, tvb, *offset, data, ENC_BIG_ENDIAN);
                        *offset+=data;
 
                        if (sml_crc_enabled) {
@@ -2486,17 +2386,17 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
                                }
 
                                if (crc_check == crc_ref) {
-                                       proto_tree_add_text (crc16_tree, tvb, *offset, 0, "[CRC Okay]");
+                                       proto_item_append_text(crc16, " [CRC Okay]");
                                }
                                else {
                                        /*(little to big endian convert) to display in correct order*/
                                        crc_check = ((crc_check >> 8) & 0xFF) + ((crc_check << 8 & 0xFF00));
-                                       proto_tree_add_text (crc16_tree, tvb, *offset, 0, "[CRC Bad 0x%X]", crc_check);
+                                       proto_item_append_text(crc16, " [CRC Bad 0x%X]", crc_check);
                                        expert_add_info(pinfo, crc16, &ei_sml_crc_error);
                                }
                        }
                        else {
-                               proto_tree_add_text (crc16_tree, tvb, *offset, 0, "[CRC validation disabled]");
+                               proto_item_append_text(crc16, " [CRC validation disabled]");
                        }
 
                        /*Message END*/
@@ -2559,7 +2459,7 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
                *offset+=1;
                proto_tree_add_item (msgend_tree, hf_sml_padding, tvb, *offset, 1, ENC_NA);
                *offset+=1;
-               proto_tree_add_item (msgend_tree, hf_sml_crc16, tvb, *offset, 2, ENC_BIG_ENDIAN);
+               crc16 = proto_tree_add_item (msgend_tree, hf_sml_crc16, tvb, *offset, 2, ENC_BIG_ENDIAN);
                *offset+=2;
 
                if (sml_crc_enabled && sml_reassemble){
@@ -2568,17 +2468,17 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr
                        crc_ref = tvb_get_letohs(tvb, *offset-2);
 
                        if (crc_check == crc_ref){
-                               proto_tree_add_text (msgend_tree, tvb, *offset, 0, "[CRC Okay]");
+                               proto_item_append_text(crc16, " [CRC Okay]");
                        }
                        else{
                                /*(little to big endian convert) to display in correct order*/
                                crc_check = ((crc_check >> 8) & 0xFF) + ((crc_check << 8) & 0xFF00);
-                               proto_tree_add_text (msgend_tree, tvb, *offset, 0, "[CRC Bad 0x%X]", crc_check);
+                               proto_item_append_text(crc16, " [CRC Bad 0x%X]", crc_check);
                                expert_add_info_format(pinfo, msgend, &ei_sml_crc_error, "CRC error (messages not reassembled ?)");
                        }
                }
                else {
-                       proto_tree_add_text (msgend_tree, tvb, *offset, 0, "[CRC validation disabled]");
+                       proto_item_append_text(crc16, " [CRC validation disabled]");
                }
 
                available = tvb_reported_length_remaining(tvb, *offset);
index de5642cc783320567507dae31f8ce0023844443c..fe4cfce571adb20c793aa7a2fdf45e9c1f23496d 100644 (file)
@@ -2445,8 +2445,8 @@ dissect_smpp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
     const gchar    *command_str;
     const gchar    *command_status_str = NULL;
     /* Set up structures needed to add the protocol subtree and manage it */
-    proto_item     *ti                 = NULL;
-    proto_tree     *smpp_tree          = NULL;
+    proto_item     *ti;
+    proto_tree     *smpp_tree;
 
     /*
      * Safety: don't even try to dissect the PDU
@@ -2485,10 +2485,8 @@ dissect_smpp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
     /*
      * Create display subtree for the protocol
      */
-    if (tree) {
-        ti = proto_tree_add_item (tree, proto_smpp, tvb, 0, tvb_length(tvb), ENC_NA);
-        smpp_tree = proto_item_add_subtree (ti, ett_smpp);
-    }
+    ti = proto_tree_add_item (tree, proto_smpp, tvb, 0, tvb_length(tvb), ENC_NA);
+    smpp_tree = proto_item_add_subtree (ti, ett_smpp);
 
     /*
      * Cycle over the encapsulated PDUs
index fa460ca1735462755cf687a697c43a8ae1373ee4..d453322283fd1b310b800edf72e55c6decd21dc4 100644 (file)
@@ -938,7 +938,7 @@ static void
 dissect_optional_14(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
        proto_tree      *sub_tree, *bf_tree;
-       proto_item      *sub_item, *bf_item;
+       proto_item      *bf_item;
        int             len, pad, type, bits, offset, num, sublen;
 
        if (!tree)
@@ -957,9 +957,8 @@ dissect_optional_14(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    tvb_new_subset_remaining(tvb, offset), pinfo, tree);
                return;
        }
-       sub_item = proto_tree_add_text(tree, tvb, offset, len,
-           "Switching Information Control Vector");
-       sub_tree = proto_item_add_subtree(sub_item, ett_sna_nlp_opti_14_si);
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, len,
+           ett_sna_nlp_opti_14_si, NULL, "Switching Information Control Vector");
 
        proto_tree_add_uint(sub_tree, hf_sna_nlp_opti_14_si_len,
            tvb, offset, 1, len);
@@ -1009,9 +1008,8 @@ dissect_optional_14(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                    tvb_new_subset_remaining(tvb, offset), pinfo, tree);
                return;
        }
-       sub_item = proto_tree_add_text(tree, tvb, offset, len,
-           "Return Route TG Descriptor Control Vector");
-       sub_tree = proto_item_add_subtree(sub_item, ett_sna_nlp_opti_14_rr);
+       sub_tree = proto_tree_add_subtree(tree, tvb, offset, len,
+           ett_sna_nlp_opti_14_rr, NULL, "Return Route TG Descriptor Control Vector");
 
        proto_tree_add_uint(sub_tree, hf_sna_nlp_opti_14_rr_len,
            tvb, offset, 1, len);
@@ -1111,7 +1109,6 @@ static void
 dissect_optional(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
        proto_tree      *sub_tree;
-       proto_item      *sub_item;
        int             offset, type, len;
        gint            ett;
 
@@ -1140,11 +1137,10 @@ dissect_optional(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                if(type == 0x14) ett = ett_sna_nlp_opti_14;
                if(type == 0x22) ett = ett_sna_nlp_opti_22;
                if (tree) {
-                       sub_item = proto_tree_add_text(tree, tvb,
-                           offset, len << 2, "%s",
+                       sub_tree = proto_tree_add_subtree(tree, tvb,
+                           offset, len << 2, ett, NULL,
                            val_to_str(type, sna_nlp_opti_vals,
                            "Unknown Segment Type"));
-                       sub_tree = proto_item_add_subtree(sub_item, ett);
                        proto_tree_add_uint(sub_tree, hf_sna_nlp_opti_len,
                            tvb, offset, 1, len);
                        proto_tree_add_uint(sub_tree, hf_sna_nlp_opti_type,
@@ -2402,7 +2398,6 @@ dissect_control(tvbuff_t *parent_tvb, int offset, int control_len,
        tvbuff_t        *tvb;
        gint            length, reported_length;
        proto_tree      *sub_tree;
-       proto_item      *sub_item;
        int             len, key;
        gint            ett;
 
@@ -2433,14 +2428,13 @@ dissect_control(tvbuff_t *parent_tvb, int offset, int control_len,
                if (key == 0x0e) ett = ett_sna_control_0e;
 
                if (((key == 0) || (key == 3) || (key == 5)) && hpr)
-                       sub_item = proto_tree_add_text(tree, tvb, 0, -1, "%s",
+                       sub_tree = proto_tree_add_subtree(tree, tvb, 0, -1, ett, NULL,
                            val_to_str_const(key, sna_control_hpr_vals,
                            "Unknown Control Vector"));
                else
-                       sub_item = proto_tree_add_text(tree, tvb, 0, -1, "%s",
+                       sub_tree = proto_tree_add_subtree(tree, tvb, 0, -1, ett, NULL,
                            val_to_str_const(key, sna_control_vals,
                            "Unknown Control Vector"));
-               sub_tree = proto_item_add_subtree(sub_item, ett);
                if (parse == LT) {
                        proto_tree_add_uint(sub_tree, hf_sna_control_len,
                            tvb, 0, 1, len);
index 6053fe091c2db07bf3d4be9254dded529656078a..42dde20917e93ba6487ae5e9823651d14670deac 100644 (file)
@@ -475,7 +475,7 @@ dissect_sndcp_xid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
 {
        /* Set up structures needed to add the protocol subtree and manage it
        */
-       proto_item *ti, *version_item, *dcomp_item, *pcomp_item;
+       proto_item *ti, *dcomp_item;
        proto_tree *sndcp_tree, *version_tree, *dcomp_tree, *pcomp_tree;
        guint16 offset = 0, l3_param_len;
        guint8 parameter_type, parameter_len;
@@ -494,10 +494,9 @@ dissect_sndcp_xid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
                if (parameter_type == SNDCP_VERSION_PAR_TYPE)
                {
                        guint8 value = tvb_get_guint8(tvb, offset+2);
-                       version_item = proto_tree_add_text(sndcp_tree, tvb, offset, parameter_len+2,
-                                       "Version (SNDCP version number) - Value %d", value);
+                       version_tree = proto_tree_add_subtree_format(sndcp_tree, tvb, offset, parameter_len+2,
+                                       ett_sndcp_xid_version_field, NULL, "Version (SNDCP version number) - Value %d", value);
 
-                       version_tree = proto_item_add_subtree(version_item, ett_sndcp_xid_version_field);
                        proto_tree_add_uint(version_tree, hf_sndcp_xid_type, tvb, offset,
                        1, parameter_type);
                        proto_tree_add_uint(version_tree, hf_sndcp_xid_len, tvb, offset+1,
@@ -511,9 +510,8 @@ dissect_sndcp_xid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
                {
                        tvbuff_t * dcomp_tvb;
 
-                       dcomp_item = proto_tree_add_text(sndcp_tree, tvb, offset, parameter_len+2,
-                               "Data Compression");
-                       dcomp_tree = proto_item_add_subtree(dcomp_item, ett_sndcp_comp_field);
+                       dcomp_tree = proto_tree_add_subtree(sndcp_tree, tvb, offset, parameter_len+2,
+                               ett_sndcp_comp_field, &dcomp_item, "Data Compression");
                        proto_tree_add_uint(dcomp_tree, hf_sndcp_xid_type, tvb, offset,
                        1, parameter_type);
                        proto_tree_add_uint(dcomp_tree, hf_sndcp_xid_len, tvb, offset+1,
@@ -530,9 +528,8 @@ dissect_sndcp_xid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
                {
                        tvbuff_t * pcomp_tvb;
 
-                       pcomp_item = proto_tree_add_text(sndcp_tree, tvb, offset, parameter_len+2,
-                               "Protocol Control Information Compression");
-                       pcomp_tree = proto_item_add_subtree(pcomp_item, ett_sndcp_comp_field);
+                       pcomp_tree = proto_tree_add_subtree(sndcp_tree, tvb, offset, parameter_len+2,
+                               ett_sndcp_comp_field, NULL, "Protocol Control Information Compression");
                        proto_tree_add_uint(pcomp_tree, hf_sndcp_xid_type, tvb, offset,
                        1, parameter_type);
                        proto_tree_add_uint(pcomp_tree, hf_sndcp_xid_len, tvb, offset+1,
@@ -559,7 +556,6 @@ static void parse_compression_parameters(tvbuff_t *tvb, proto_tree *tree, gboole
        gboolean p_bit_set;
        algo_parameters_t * algo_pars;
        guint8 function_index;
-       proto_item *comp_entity_field = NULL;
        proto_tree *comp_entity_tree = NULL;
        guint16 tvb_len, offset=0 , new_offset, entity_offset;
        value_string const * comp_algo_str;
@@ -606,10 +602,9 @@ static void parse_compression_parameters(tvbuff_t *tvb, proto_tree *tree, gboole
                        /* Read the length */
                        len = tvb_get_guint8(tvb, offset+2);
 
-                       comp_entity_field = proto_tree_add_text(tree, tvb, offset, len + 3,
-                               "Entity %d, Algorithm %s",
+                       comp_entity_tree = proto_tree_add_subtree_format(tree, tvb, offset, len + 3,
+                               ett_sndcp_comp_field, NULL, "Entity %d, Algorithm %s",
                                entity & 0x1F, val_to_str(algo_id & 0x1F, comp_algo_str,"Undefined Algorithm Identifier:%X"));
-                       comp_entity_tree = proto_item_add_subtree(comp_entity_field, ett_sndcp_comp_field);
 
                        proto_tree_add_uint(comp_entity_tree, hf_sndcp_xid_comp_pbit, tvb, offset, 1, p_bit_set << 7);
                        proto_tree_add_uint(comp_entity_tree, hf_sndcp_xid_comp_spare_byte1, tvb, offset, 1, entity);
@@ -671,12 +666,10 @@ static void parse_compression_parameters(tvbuff_t *tvb, proto_tree *tree, gboole
                                algo_id = pcomp_entity_algo_id[entity];
                                comp_algo_str = sndcp_xid_pcomp_algo_str;
                        }
-                       comp_entity_field = proto_tree_add_text(tree, tvb, offset, len + 2,
-                               "Entity %d decoded as Algorithm %s",
+                       comp_entity_tree = proto_tree_add_subtree_format(tree, tvb, offset, len + 2,
+                               ett_sndcp_comp_field, NULL, "Entity %d decoded as Algorithm %s",
                                entity & 0x1F, val_to_str(algo_id & 0x1F, comp_algo_str,"Undefined Algorithm Identifier:%X"));
 
-                       comp_entity_tree = proto_item_add_subtree(comp_entity_field, ett_sndcp_comp_field);
-
                        proto_tree_add_uint(comp_entity_tree, hf_sndcp_xid_comp_pbit, tvb, offset, 1, p_bit_set << 7);
                        proto_tree_add_uint(comp_entity_tree, hf_sndcp_xid_comp_spare_byte1, tvb, offset, 1, entity);
                        proto_tree_add_uint(comp_entity_tree, hf_sndcp_xid_comp_entity, tvb, offset, 1, entity);
index caf8a2a3751bbf3b5a164d9109d20caf09d44062..ac8c9b0b8556922e4336b6f64861a1fad065ea98 100644 (file)
@@ -202,8 +202,8 @@ dissect_sndcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
   /* Set up structures needed to add the protocol subtree and manage it
    */
-  proto_item *ti, *address_field_item, *compression_field_item, *npdu_field_item;
-  proto_tree *sndcp_tree = NULL, *address_field_tree, *compression_field_tree, *npdu_field_tree;
+  proto_item *ti, *address_field_item;
+  proto_tree *sndcp_tree, *address_field_tree, *compression_field_tree, *npdu_field_tree;
 
   /* Make entries in Protocol column and clear Info column on summary display
    */
@@ -212,10 +212,8 @@ dissect_sndcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
   /* create display subtree for the protocol
    */
-  if (tree) {
-    ti         = proto_tree_add_item(tree, proto_sndcp, tvb, 0, -1, ENC_NA);
-    sndcp_tree = proto_item_add_subtree(ti, ett_sndcp);
-  }
+  ti         = proto_tree_add_item(tree, proto_sndcp, tvb, 0, -1, ENC_NA);
+  sndcp_tree = proto_item_add_subtree(ti, ett_sndcp);
 
   /* get address field from next byte
    */
@@ -252,21 +250,20 @@ dissect_sndcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     if (tree) {
       if (!pcomp) {
         if (!dcomp) {
-          compression_field_item = proto_tree_add_text(sndcp_tree, tvb, offset,1, "No compression");
+          compression_field_tree = proto_tree_add_subtree(sndcp_tree, tvb, offset, 1, ett_sndcp_compression_field, NULL, "No compression");
         }
         else {
-          compression_field_item = proto_tree_add_text(sndcp_tree, tvb, offset,1, "Data compression");
+          compression_field_tree = proto_tree_add_subtree(sndcp_tree, tvb, offset, 1, ett_sndcp_compression_field, NULL, "Data compression");
         }
       }
       else {
         if (!dcomp) {
-          compression_field_item = proto_tree_add_text(sndcp_tree, tvb, offset,1, "Protocol compression");
+          compression_field_tree = proto_tree_add_subtree(sndcp_tree, tvb, offset, 1, ett_sndcp_compression_field, NULL, "Protocol compression");
         }
         else {
-          compression_field_item = proto_tree_add_text(sndcp_tree, tvb, offset,1, "Data and Protocol compression");
+          compression_field_tree = proto_tree_add_subtree(sndcp_tree, tvb, offset, 1, ett_sndcp_compression_field, NULL, "Data and Protocol compression");
         }
       }
-      compression_field_tree = proto_item_add_subtree(compression_field_item, ett_sndcp_compression_field);
       proto_tree_add_uint(compression_field_tree, hf_sndcp_dcomp, tvb, offset, 1, comp_field );
       proto_tree_add_uint(compression_field_tree, hf_sndcp_pcomp, tvb, offset, 1, comp_field );
     }
@@ -278,8 +275,7 @@ dissect_sndcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
       npdu = npdu_field1 = tvb_get_guint8(tvb,offset);
       col_add_fstr(pinfo->cinfo, COL_INFO, "SN-DATA N-PDU %d", npdu_field1);
       if (tree) {
-        npdu_field_item = proto_tree_add_text(sndcp_tree, tvb, offset,1, "Acknowledged mode, N-PDU %d", npdu_field1 );
-        npdu_field_tree = proto_item_add_subtree(npdu_field_item, ett_sndcp_npdu_field);
+        npdu_field_tree = proto_tree_add_subtree_format(sndcp_tree, tvb, offset, 1, ett_sndcp_npdu_field, NULL, "Acknowledged mode, N-PDU %d", npdu_field1 );
         proto_tree_add_uint(npdu_field_tree, hf_sndcp_npdu1, tvb, offset, 1, npdu_field1 );
       }
       offset++;
@@ -294,8 +290,8 @@ dissect_sndcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
     npdu            = (npdu_field2 & 0x0FFF);
     col_add_fstr(pinfo->cinfo, COL_INFO, "SN-UNITDATA N-PDU %d (segment %d)", npdu, segment);
     if (tree) {
-      npdu_field_item = proto_tree_add_text(sndcp_tree, tvb, offset,2, "Unacknowledged mode, N-PDU %d (segment %d)", npdu, segment );
-      npdu_field_tree = proto_item_add_subtree(npdu_field_item, ett_sndcp_npdu_field);
+      npdu_field_tree = proto_tree_add_subtree_format(sndcp_tree, tvb, offset, 2, ett_sndcp_npdu_field, NULL,
+            "Unacknowledged mode, N-PDU %d (segment %d)", npdu, segment );
       proto_tree_add_uint(npdu_field_tree, hf_sndcp_segment, tvb, offset, 2, npdu_field2 );
       proto_tree_add_uint(npdu_field_tree, hf_sndcp_npdu2, tvb, offset, 2, npdu_field2 );
     }
index e6925586049aee535f6a01a644754d4d93be8fb3..0226f6e7d1a8d352bb84c399101d7bc9352a53e0 100644 (file)
@@ -519,8 +519,7 @@ client_display_socks_v5(tvbuff_t *tvb, int offset, packet_info *pinfo,
         proto_item      *ti;
         guint8 num_auth_methods, auth;
 
-        ti = proto_tree_add_text( tree, tvb, offset, -1, "Client Authentication Methods");
-        AuthTree = proto_item_add_subtree(ti, ett_socks_auth);
+        AuthTree = proto_tree_add_subtree( tree, tvb, offset, -1, ett_socks_auth, &ti, "Client Authentication Methods");
 
         num_auth_methods = tvb_get_guint8(tvb, offset);
         proto_item_set_len(ti, num_auth_methods+1);
index 07c94c7243c716bff2355d59020bb29587fc1f93..eea6f22c111cd776f3d7ba71c2ad78555947f657 100644 (file)
@@ -829,12 +829,11 @@ static int dissect_spdy_data_payload(tvbuff_t *tvb,
       /*
        * Add the encoded entity to the protocol tree
        */
-      e_ti = proto_tree_add_text(spdy_tree, data_tvb,
-                                 0, tvb_reported_length(data_tvb),
+      e_tree = proto_tree_add_subtree_format(spdy_tree, data_tvb,
+                                 0, tvb_reported_length(data_tvb), ett_spdy_encoded_entity, &e_ti,
                                  "Content-encoded entity body (%s): %u bytes",
                                  si->content_encoding,
                                  tvb_reported_length(data_tvb));
-      e_tree = proto_item_add_subtree(e_ti, ett_spdy_encoded_entity);
       if (si->num_data_frames > 1) {
         wmem_list_t *dflist = si->data_frames;
         wmem_list_frame_t *frame_item;
index c2fa8588821d215ec740d0e9c75ebe6752ad8638..3ae4f54abb31443c681571efdd19018b6a1b0bdd 100644 (file)
@@ -690,11 +690,10 @@ static dissector_handle_t jpeg_handle;
 static guint32
 dissect_SpiceHead(tvbuff_t *tvb, proto_tree *tree, guint32 offset, const guint16 num)
 {
-    proto_item *ti;
     proto_tree *SpiceHead_tree;
 
-    ti = proto_tree_add_text(tree, tvb, offset, sizeof_SpiceHead, "Display Head #%u", num);
-    SpiceHead_tree = proto_item_add_subtree(ti, ett_SpiceHead);
+    SpiceHead_tree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof_SpiceHead,
+                                    ett_SpiceHead, NULL, "Display Head #%u", num);
     proto_tree_add_item(SpiceHead_tree, hf_display_head_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
     offset += 4;
     proto_tree_add_item(SpiceHead_tree, hf_display_head_surface_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -717,11 +716,10 @@ dissect_SpiceHead(tvbuff_t *tvb, proto_tree *tree, guint32 offset, const guint16
 static guint32
 dissect_AgentMonitorConfig(tvbuff_t *tvb, proto_tree *tree, guint32 offset, const guint16 num)
 {
-    proto_item *ti;
     proto_tree *subtree;
 
-    ti = proto_tree_add_text(tree, tvb, offset, sizeof_AgentMonitorConfig, "Monitor Config #%u", num);
-    subtree = proto_item_add_subtree(ti, ett_SpiceHead);
+    subtree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof_AgentMonitorConfig,
+                            ett_SpiceHead, NULL, "Monitor Config #%u", num);
     proto_tree_add_item(subtree, hf_agent_monitor_height, tvb, offset, 4, ENC_LITTLE_ENDIAN);
     offset += 4;
     proto_tree_add_item(subtree, hf_agent_monitor_width, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -745,8 +743,7 @@ dissect_Pixmap(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
     guint32     PixmapSize;
     guint32     strides, height, pallete_ptr;
 
-    ti = proto_tree_add_text(tree, tvb, offset, 0, "Pixmap"); /* size is fixed later */
-    Pixmap_tree = proto_item_add_subtree(ti, ett_Pixmap);
+    Pixmap_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_Pixmap, &ti, "Pixmap"); /* size is fixed later */
     proto_tree_add_item(Pixmap_tree, hf_pixmap_format, tvb, offset, 1, ENC_LITTLE_ENDIAN);
     offset += 1;
     proto_tree_add_item(Pixmap_tree, hf_pixmap_flags, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -783,11 +780,9 @@ dissect_CursorHeader(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint16 *w
     *height = tvb_get_letohs(tvb, offset + 8 + 1 + 2);
 
     if (tree) {
-        proto_item *ti;
         proto_tree *CursorHeader_tree;
 
-        ti = proto_tree_add_text(tree, tvb, offset, sizeof_CursorHeader, "Cursor Header");
-        CursorHeader_tree = proto_item_add_subtree(ti, ett_cursor_header);
+        CursorHeader_tree = proto_tree_add_subtree(tree, tvb, offset, sizeof_CursorHeader, ett_cursor_header, NULL, "Cursor Header");
         proto_tree_add_item(CursorHeader_tree, hf_cursor_unique,    tvb, offset, 8, ENC_LITTLE_ENDIAN);
         offset += 8;
         proto_tree_add_item(CursorHeader_tree, hf_cursor_type,      tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -808,7 +803,7 @@ dissect_CursorHeader(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint16 *w
 static guint32
 dissect_RedCursor(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item    *ti;
+    proto_item *ti;
     proto_tree    *RedCursor_tree;
     guint8         type;
     guint16        height, width;
@@ -816,8 +811,7 @@ dissect_RedCursor(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
     const guint16  flags       = tvb_get_letohs(tvb, offset);
     guint32        data_size   = 0;
 
-    ti = proto_tree_add_text(tree, tvb, offset, 2, "RedCursor"); /* FIXME - fix size if flag is not NONE */
-    RedCursor_tree = proto_item_add_subtree(ti, ett_RedCursor);
+    RedCursor_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_RedCursor, &ti, "RedCursor"); /* FIXME - fix size if flag is not NONE */
 
     proto_tree_add_item(RedCursor_tree, hf_cursor_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN);
     if (flags == SPICE_CURSOR_FLAGS_NONE) {
@@ -871,11 +865,9 @@ dissect_ImageDescriptor(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
     const guint8  type = tvb_get_guint8(tvb, offset + 8);
 
     if (tree) {
-        proto_item *ti;
         proto_tree *ImageDescriptor_tree;
 
-        ti = proto_tree_add_text(tree, tvb, offset, sizeof_ImageDescriptor, "Image Descriptor");
-        ImageDescriptor_tree = proto_item_add_subtree(ti, ett_imagedesc);
+        ImageDescriptor_tree = proto_tree_add_subtree(tree, tvb, offset, sizeof_ImageDescriptor, ett_imagedesc, NULL, "Image Descriptor");
 
         proto_tree_add_item(ImageDescriptor_tree, hf_image_desc_id,     tvb, offset, 8, ENC_LITTLE_ENDIAN);
         offset += 8;
@@ -897,11 +889,9 @@ dissect_ImageQuic(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
     const guint32  QuicSize = tvb_get_letohl(tvb, offset);
 
     if (tree) {
-        proto_item *ti;
         proto_tree *ImageQuic_tree;
 
-        ti = proto_tree_add_text(tree, tvb, offset, QuicSize + 4, "QUIC Image");
-        ImageQuic_tree = proto_item_add_subtree(ti, ett_imageQuic);
+        ImageQuic_tree = proto_tree_add_subtree(tree, tvb, offset, QuicSize + 4, ett_imageQuic, NULL, "QUIC Image");
 
         proto_tree_add_text(ImageQuic_tree, tvb, offset, 4, "QUIC image size: %u bytes", QuicSize);
         offset += 4;
@@ -997,12 +987,10 @@ dissect_ImageLZ_common(tvbuff_t *tvb, proto_tree *tree, guint32 offset, const gb
 static guint32
 dissect_ImageLZ_JPEG(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item    *ti;
     proto_tree    *LZ_JPEG_tree;
     const guint32  LZ_JPEGSize = tvb_get_letohl(tvb, offset);
 
-    ti = proto_tree_add_text(tree, tvb, offset, LZ_JPEGSize + 4, "LZ_JPEG Image");
-    LZ_JPEG_tree = proto_item_add_subtree(ti, ett_LZ_JPEG);
+    LZ_JPEG_tree = proto_tree_add_subtree(tree, tvb, offset, LZ_JPEGSize + 4, ett_LZ_JPEG, NULL, "LZ_JPEG Image");
     proto_tree_add_text(LZ_JPEG_tree, tvb, offset, 4, "LZ JPEG image size: %u bytes", LZ_JPEGSize);
     offset += 4;
     offset += dissect_ImageLZ_common_header(tvb, LZ_JPEG_tree, offset);
@@ -1014,20 +1002,17 @@ dissect_ImageLZ_JPEG(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint32
 dissect_ImageGLZ_RGB(tvbuff_t *tvb, proto_tree *tree, guint32 offset, const guint32 size)
 {
-    proto_item *ti = NULL;
     proto_tree *GLZ_RGB_tree;
     guint32     GLZ_RGBSize;
 
     if (size == 0) { /* if no size was passed to us, need to fetch it. Otherwise, we already have it from the callee */
         GLZ_RGBSize = tvb_get_letohl(tvb, offset);
-        ti = proto_tree_add_text(tree, tvb, offset, GLZ_RGBSize + 4, "GLZ_RGB Image");
-        GLZ_RGB_tree = proto_item_add_subtree(ti, ett_GLZ_RGB);
+        GLZ_RGB_tree = proto_tree_add_subtree(tree, tvb, offset, GLZ_RGBSize + 4, ett_GLZ_RGB, NULL, "GLZ_RGB Image");
         proto_tree_add_text(GLZ_RGB_tree, tvb, offset, 4, "GLZ RGB image size: %u bytes", GLZ_RGBSize);
         offset += 4;
     } else {
         GLZ_RGBSize = size;
-        ti = proto_tree_add_text(tree, tvb, offset, GLZ_RGBSize, "GLZ_RGB Image");
-        GLZ_RGB_tree = proto_item_add_subtree(ti, ett_GLZ_RGB);
+        GLZ_RGB_tree = proto_tree_add_subtree(tree, tvb, offset, GLZ_RGBSize, ett_GLZ_RGB, NULL, "GLZ_RGB Image");
     }
 
     dissect_ImageLZ_common(tvb, GLZ_RGB_tree, offset, FALSE, GLZ_RGBSize);
@@ -1038,12 +1023,10 @@ dissect_ImageGLZ_RGB(tvbuff_t *tvb, proto_tree *tree, guint32 offset, const guin
 static guint32
 dissect_ImageLZ_RGB(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item    *ti;
     proto_tree    *LZ_RGB_tree;
     const guint32  LZ_RGBSize = tvb_get_letohl(tvb, offset);
 
-    ti = proto_tree_add_text(tree, tvb, offset, LZ_RGBSize + 4, "LZ_RGB Image");
-    LZ_RGB_tree = proto_item_add_subtree(ti, ett_LZ_RGB);
+    LZ_RGB_tree = proto_tree_add_subtree(tree, tvb, offset, LZ_RGBSize + 4, ett_LZ_RGB, NULL, "LZ_RGB Image");
     proto_tree_add_text(LZ_RGB_tree, tvb, offset, 4, "LZ RGB image size: %u bytes", LZ_RGBSize);
     offset += 4;
 
@@ -1055,15 +1038,13 @@ dissect_ImageLZ_RGB(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint32
 dissect_ImageLZ_PLT(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item *ti;
     proto_tree *LZ_PLT_tree;
     guint32     LZ_PLTSize, pal_size;
 
     const guint32 current_offset = offset;
 
     LZ_PLTSize = tvb_get_letohl(tvb, offset + 1); /* for some reason, it reports two extra bytes */
-    ti = proto_tree_add_text(tree, tvb, offset, (LZ_PLTSize - 2)+ 1 + 4 + 4 + 8 + 4 + 4 + 4 + 4 + 4, "LZ_PLT Image");
-    LZ_PLT_tree = proto_item_add_subtree(ti, ett_LZ_PLT);
+    LZ_PLT_tree = proto_tree_add_subtree(tree, tvb, offset, (LZ_PLTSize - 2)+ 1 + 4 + 4 + 8 + 4 + 4 + 4 + 4 + 4, ett_LZ_PLT, NULL, "LZ_PLT Image");
 
     proto_tree_add_text(LZ_PLT_tree, tvb, offset, 1, "LZ_PLT Flag"); /* TODO: dissect */
     offset += 1;
@@ -1101,7 +1082,6 @@ dissect_ImageLZ_PLT(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint32
 dissect_ImageJPEG_Alpha(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset)
 {
-    proto_item *ti;
     proto_tree *JPEG_tree;
     tvbuff_t   *jpeg_tvb;
     guint32     JPEG_Size, Data_Size;
@@ -1115,8 +1095,8 @@ dissect_ImageJPEG_Alpha(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui
     Data_Size = tvb_get_letohl(tvb, offset);
     offset += 4;
 
-    ti = proto_tree_add_text(tree, tvb, offset - 9, Data_Size + 9, "RGB JPEG Image, Alpha channel (%u bytes)", Data_Size);
-    JPEG_tree = proto_item_add_subtree(ti, ett_JPEG);
+    JPEG_tree = proto_tree_add_subtree_format(tree, tvb, offset - 9, Data_Size + 9,
+            ett_JPEG, NULL, "RGB JPEG Image, Alpha channel (%u bytes)", Data_Size);
 
     jpeg_tvb = tvb_new_subset_length(tvb, offset, JPEG_Size);
     call_dissector(jpeg_handle, jpeg_tvb, pinfo, JPEG_tree);
@@ -1130,13 +1110,11 @@ dissect_ImageJPEG_Alpha(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui
 static guint32
 dissect_ImageJPEG(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, const guint32 offset)
 {
-    proto_item *ti = NULL;
     proto_tree *JPEG_tree;
     tvbuff_t   *jpeg_tvb;
 
     const guint32 JPEG_Size = tvb_get_letohl(tvb, offset);
-    ti = proto_tree_add_text(tree, tvb, offset, JPEG_Size + 4, "JPEG Image (%u bytes)", JPEG_Size);
-    JPEG_tree = proto_item_add_subtree(ti, ett_JPEG);
+    JPEG_tree = proto_tree_add_subtree_format(tree, tvb, offset, JPEG_Size + 4, ett_JPEG, NULL, "JPEG Image (%u bytes)", JPEG_Size);
 
     jpeg_tvb = tvb_new_subset_length(tvb, offset + 4, JPEG_Size);
     call_dissector(jpeg_handle, jpeg_tvb, pinfo, JPEG_tree);
@@ -1153,11 +1131,10 @@ dissect_ImageZLIB_GLZ_stream(tvbuff_t *tvb, proto_tree *ZLIB_GLZ_tree, packet_in
     proto_tree *Uncomp_tree;
     tvbuff_t   *uncompressed_tvb;
 
-    ti = proto_tree_add_text(ZLIB_GLZ_tree, tvb, offset, ZLIB_GLZSize, "ZLIB stream (%u bytes)", ZLIB_GLZSize);
+    Uncomp_tree = proto_tree_add_subtree_format(ZLIB_GLZ_tree, tvb, offset, ZLIB_GLZSize, ett_Uncomp_tree, &ti, "ZLIB stream (%u bytes)", ZLIB_GLZSize);
     uncompressed_tvb = tvb_child_uncompress(tvb, tvb, offset, ZLIB_GLZSize);
     if (uncompressed_tvb != NULL) {
         add_new_data_source(pinfo, uncompressed_tvb, "Uncompressed GLZ stream");
-        Uncomp_tree = proto_item_add_subtree(ti, ett_Uncomp_tree);
         dissect_ImageGLZ_RGB(uncompressed_tvb, Uncomp_tree, 0, ZLIB_uncompSize);
     } else {
         expert_add_info(pinfo, ti, &ei_spice_decompress_error);
@@ -1175,15 +1152,14 @@ dissect_ImageZLIB_GLZ_stream(tvbuff_t *tvb, proto_tree *ZLIB_GLZ_tree, packet_in
 static guint32
 dissect_ImageZLIB_GLZ(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset)
 {
-    proto_item *ti = NULL;
+    proto_item *ti;
     proto_tree *ZLIB_GLZ_tree;
     guint32     ZLIB_GLZSize, ZLIB_uncompSize;
 
     ZLIB_uncompSize = tvb_get_letohl(tvb, offset);
     ZLIB_GLZSize    = tvb_get_letohl(tvb, offset + 4); /* compressed size */
     if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, ZLIB_GLZSize + 8, "ZLIB over GLZ Image");
-        ZLIB_GLZ_tree = proto_item_add_subtree(ti, ett_ZLIB_GLZ);
+        ZLIB_GLZ_tree = proto_tree_add_subtree(tree, tvb, offset, ZLIB_GLZSize + 8, ett_ZLIB_GLZ, NULL, "ZLIB over GLZ Image");
 
         ti = proto_tree_add_item(ZLIB_GLZ_tree, hf_zlib_uncompress_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
         proto_item_append_text(ti, " bytes");
@@ -1251,7 +1227,6 @@ dissect_Image(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offse
 static SpiceRect
 dissect_SpiceRect(tvbuff_t *tvb, proto_tree *tree, const guint32 offset, const gint32 id)
 {
-    proto_item *ti = NULL;
     proto_tree *rect_tree;
     SpiceRect   rect;
 
@@ -1262,13 +1237,12 @@ dissect_SpiceRect(tvbuff_t *tvb, proto_tree *tree, const guint32 offset, const g
 
     if (tree) {
         if (id != -1) {
-            ti = proto_tree_add_text(tree, tvb, offset, sizeof_SpiceRect,
+            rect_tree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof_SpiceRect, ett_rect, NULL,
                                      "RECT %u: (%u-%u, %u-%u)", id, rect.left, rect.top, rect.right, rect.bottom);
         } else { /* single rectangle */
-            ti = proto_tree_add_text(tree, tvb, offset, sizeof_SpiceRect,
+            rect_tree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof_SpiceRect, ett_rect, NULL,
                                      "RECT: (%u-%u, %u-%u)", rect.left, rect.top, rect.right, rect.bottom);
         }
-        rect_tree = proto_item_add_subtree(ti, ett_rect);
 
         proto_tree_add_item(rect_tree, hf_rect_left, tvb, offset, 4, ENC_LITTLE_ENDIAN);
         proto_tree_add_item(rect_tree, hf_rect_top, tvb, offset + 4, 4, ENC_LITTLE_ENDIAN);
@@ -1288,15 +1262,13 @@ rect_is_empty(const SpiceRect r)
 static guint32
 dissect_RectList(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item    *ti            = NULL;
     proto_tree    *rectlist_tree;
     guint32        i;
     const guint32  rectlist_size = tvb_get_letohl(tvb, offset);
 
     if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, 4 + (rectlist_size * sizeof_SpiceRect),
-                                 "RectList (%d rects)", rectlist_size);
-        rectlist_tree = proto_item_add_subtree(ti, ett_rectlist);
+        rectlist_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + (rectlist_size * sizeof_SpiceRect),
+                                 ett_rectlist, NULL, "RectList (%d rects)", rectlist_size);
 
         proto_tree_add_item(rectlist_tree, hf_rectlist_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
         offset += 4;
@@ -1313,13 +1285,11 @@ dissect_RectList(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint8
 dissect_Clip(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
 {
-    proto_item   *ti   = NULL;
     proto_tree   *Clip_tree;
     const guint8  type = tvb_get_guint8(tvb, offset);
 
     if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, 1, "SpiceClip");
-        Clip_tree = proto_item_add_subtree(ti, ett_Clip);
+        Clip_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_Clip, NULL, "SpiceClip");
         proto_tree_add_item(Clip_tree, hf_Clip_type, tvb, offset, sizeof_Clip, ENC_LITTLE_ENDIAN);
     }
 
@@ -1329,7 +1299,6 @@ dissect_Clip(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
 static point32_t
 dissect_POINT32(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
 {
-    proto_item *ti = NULL;
     proto_tree *point_tree;
     point32_t   point;
 
@@ -1337,8 +1306,7 @@ dissect_POINT32(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
     point.y = tvb_get_letohl(tvb, offset + 4);
 
     if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, sizeof(point32_t), "POINT (%u, %u)", point.x, point.y);
-        point_tree = proto_item_add_subtree(ti, ett_point);
+        point_tree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof(point32_t), ett_point, NULL, "POINT (%u, %u)", point.x, point.y);
 
         proto_tree_add_item(point_tree, hf_point32_x, tvb, offset, 4, ENC_LITTLE_ENDIAN);
         proto_tree_add_item(point_tree, hf_point32_y, tvb, offset + 4, 4, ENC_LITTLE_ENDIAN);
@@ -1350,7 +1318,6 @@ dissect_POINT32(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
 static point16_t
 dissect_POINT16(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
 {
-    proto_item *ti = NULL;
     proto_tree *point16_tree;
     point16_t   point16;
 
@@ -1358,8 +1325,7 @@ dissect_POINT16(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
     point16.y = tvb_get_letohs(tvb, offset + 2);
 
     if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, sizeof(point16_t), "POINT16 (%u, %u)", point16.x, point16.y);
-        point16_tree = proto_item_add_subtree(ti, ett_point16);
+        point16_tree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof(point16_t), ett_point16, NULL, "POINT16 (%u, %u)", point16.x, point16.y);
 
         proto_tree_add_item(point16_tree, hf_point16_x, tvb, offset, 2, ENC_LITTLE_ENDIAN);
         proto_tree_add_item(point16_tree, hf_point16_y, tvb, offset + 2, 2, ENC_LITTLE_ENDIAN);
@@ -1371,12 +1337,11 @@ dissect_POINT16(tvbuff_t *tvb, proto_tree *tree, const guint32 offset)
 static guint32
 dissect_Mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item *ti = NULL;
+    proto_item *ti;
     proto_tree *Mask_tree;
     guint32     bitmap;
 
-    ti = proto_tree_add_text(tree, tvb, offset, sizeof_Mask, "Mask");
-    Mask_tree = proto_item_add_subtree(ti, ett_Mask);
+    Mask_tree = proto_tree_add_subtree(tree, tvb, offset, sizeof_Mask, ett_Mask, &ti, "Mask");
 
     bitmap = tvb_get_letohl(tvb, offset + (int)sizeof(point32_t) + 1);
     if (bitmap != 0) {
@@ -1403,22 +1368,19 @@ dissect_Mask(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint32
 dissect_Brush(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item   *ti   = NULL;
     proto_tree   *brush_tree;
     const guint8  type = tvb_get_guint8(tvb, offset);
 
     switch (type) {
         case SPICE_BRUSH_TYPE_SOLID:
-            ti = proto_tree_add_text(tree, tvb, offset, 5, "Brush - SOLID");
-            brush_tree = proto_item_add_subtree(ti, ett_brush);
+            brush_tree = proto_tree_add_subtree(tree, tvb, offset, 5, ett_brush, NULL, "Brush - SOLID");
             proto_tree_add_item(brush_tree, hf_brush_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
             offset += 1;
             proto_tree_add_item(brush_tree, hf_brush_rgb, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             return 5;
             break;
         case SPICE_BRUSH_TYPE_PATTERN:
-            ti = proto_tree_add_text(tree, tvb, offset, 17, "Brush - PATTERN");
-            brush_tree = proto_item_add_subtree(ti, ett_brush);
+            brush_tree = proto_tree_add_subtree(tree, tvb, offset, 17, ett_brush, NULL, "Brush - PATTERN");
             proto_tree_add_item(brush_tree, hf_brush_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
             offset += 1;
             /* FIXME: this is supposed to be the offset to the image to be used as the pattern.        */
@@ -1445,14 +1407,13 @@ dissect_Brush(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint32
 dissect_DisplayBase(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item *ti        = NULL;
+    proto_item *ti;
     proto_tree *DisplayBase_tree;
     SpiceRect   rect;
     guint8      clip_type;
     guint32     clip_size = 0;
 
-    ti = proto_tree_add_text(tree, tvb, offset, sizeof_DisplayBase, "SpiceMsgDisplayBase");
-    DisplayBase_tree = proto_item_add_subtree(ti, ett_DisplayBase);
+    DisplayBase_tree = proto_tree_add_subtree(tree, tvb, offset, sizeof_DisplayBase, ett_DisplayBase, &ti, "SpiceMsgDisplayBase");
     proto_tree_add_item(DisplayBase_tree, hf_display_surface_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
     offset += 4;
     rect = dissect_SpiceRect(tvb, DisplayBase_tree, offset, -1);
@@ -1473,11 +1434,10 @@ dissect_DisplayBase(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 static guint32
 dissect_SpiceResourceId(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint16 count)
 {
-    proto_item *ti;
     proto_tree *resource_tree;
 
-    ti = proto_tree_add_text(tree, tvb, offset, sizeof_ResourceId, "Resource #%d", count);
-    resource_tree = proto_item_add_subtree(ti, ett_cursor_header);
+    resource_tree = proto_tree_add_subtree_format(tree, tvb, offset, sizeof_ResourceId,
+                            ett_cursor_header, NULL, "Resource #%d", count);
     proto_tree_add_item(resource_tree, hf_resource_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
     proto_tree_add_item(resource_tree, hf_resource_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
 
@@ -1572,12 +1532,11 @@ static void
 dissect_spice_mini_data_header(tvbuff_t *tvb, proto_tree *tree, const spice_conversation_t *spice_info,
                                const gboolean client_message, const guint16 message_type, guint32 offset)
 {
-    proto_item* ti;
     proto_tree* subtree;
 
     if (tree) {
-        ti = proto_tree_add_text(tree, tvb, offset, 2, "Message type: %s (%d)", get_message_type_string(message_type, spice_info, client_message), message_type);
-        subtree = proto_item_add_subtree(ti, ett_common_client_message);
+        subtree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_common_client_message, NULL,
+                    "Message type: %s (%d)", get_message_type_string(message_type, spice_info, client_message), message_type);
         proto_tree_add_item(subtree, hf_message_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
         offset += 2;
         proto_tree_add_item(tree, hf_data_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -1588,15 +1547,14 @@ static void
 dissect_spice_data_header(tvbuff_t *tvb, proto_tree *tree, const spice_conversation_t *spice_info,
                           const gboolean client_message, const guint16 message_type, guint32 *sublist_size, guint32 offset)
 {
-    proto_item* ti;
     proto_tree* subtree;
     *sublist_size = tvb_get_letohl(tvb, offset + 14);
 
     if (tree) {
         proto_tree_add_item(tree, hf_serial, tvb, offset, 8, ENC_LITTLE_ENDIAN);
         offset += 8;
-        ti = proto_tree_add_text(tree, tvb, offset, 2, "Message type: %s (%d)", get_message_type_string(message_type, spice_info, client_message), message_type);
-        subtree = proto_item_add_subtree(ti, ett_common_client_message);
+        subtree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_common_client_message, NULL,
+            "Message type: %s (%d)", get_message_type_string(message_type, spice_info, client_message), message_type);
         proto_tree_add_item(subtree, hf_message_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
         offset += 2;
         offset += 2;
@@ -1691,13 +1649,11 @@ dissect_spice_common_server_messages(tvbuff_t *tvb, proto_tree *tree, const guin
 static guint32
 dissect_spice_record_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset)
 {
-    proto_item *ti;
     proto_tree *record_tree;
 
     switch (message_type) {
         case SPICE_MSGC_RECORD_MODE:
-            ti = proto_tree_add_text(tree, tvb, offset, 8, "Client RECORD_MODE message"); /* size is incorrect, fixed later */
-            record_tree = proto_item_add_subtree(ti, ett_record_client);
+            record_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_record_client, NULL, "Client RECORD_MODE message"); /* size is incorrect, fixed later */
             proto_tree_add_item(record_tree, hf_audio_timestamp, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             offset += 4;
             proto_tree_add_item(record_tree, hf_audio_mode, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2024,7 +1980,6 @@ static guint32
 dissect_spice_playback_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 message_size, spice_conversation_t *spice_info, guint32 offset)
 {
     guint8 num_channels, i;
-    proto_item* ti;
     proto_tree* subtree;
 
     switch (message_type) {
@@ -2058,8 +2013,7 @@ dissect_spice_playback_server(tvbuff_t *tvb, proto_tree *tree, const guint16 mes
             num_channels = tvb_get_guint8(tvb, offset);
             proto_tree_add_item(tree, hf_audio_channels, tvb, offset, 1, ENC_LITTLE_ENDIAN);
             offset += 1;
-            ti = proto_tree_add_text(tree, tvb, offset, 2 * num_channels, "Channel volume array");
-            subtree = proto_item_add_subtree(ti, ett_record_server);
+            subtree = proto_tree_add_subtree(tree, tvb, offset, 2 * num_channels, ett_record_server, NULL, "Channel volume array");
             for (i = 0; i < num_channels; i++) {
                 proto_tree_add_item(subtree, hf_audio_volume, tvb, offset, 2, ENC_LITTLE_ENDIAN);
                 offset += 2;
@@ -2136,7 +2090,6 @@ static guint32
 dissect_spice_record_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset)
 {
     guint8 num_channels, i;
-    proto_item* ti;
     proto_tree* subtree;
 
     switch (message_type) {
@@ -2146,8 +2099,7 @@ dissect_spice_record_server(tvbuff_t *tvb, proto_tree *tree, const guint16 messa
             num_channels = tvb_get_guint8(tvb, offset);
             proto_tree_add_item(tree, hf_audio_channels, tvb, offset, 1, ENC_LITTLE_ENDIAN);
             offset += 1;
-            ti = proto_tree_add_text(tree, tvb, offset, 2 * num_channels, "Volume Array");
-            subtree = proto_item_add_subtree(ti, ett_record_server);
+            subtree = proto_tree_add_subtree(tree, tvb, offset, 2 * num_channels, ett_record_server, NULL, "Volume Array");
             for (i = 0; i < num_channels; i++) {
                 proto_tree_add_item(subtree, hf_audio_volume, tvb, offset, 2, ENC_LITTLE_ENDIAN);
                 offset += 2;
@@ -2167,7 +2119,6 @@ dissect_spice_record_server(tvbuff_t *tvb, proto_tree *tree, const guint16 messa
 static guint32
 dissect_spice_agent_message(tvbuff_t *tvb, proto_tree *tree, const guint32 message_type, guint32 message_len, guint32 offset)
 {
-    proto_item *ti=NULL;
     proto_tree *agent_tree;
     guint32 n_monitors = 0, i;
 
@@ -2223,16 +2174,14 @@ dissect_spice_agent_message(tvbuff_t *tvb, proto_tree *tree, const guint32 messa
             offset += 4;
             break;
         case VD_AGENT_CLIPBOARD_GRAB:
-            ti = proto_tree_add_text(tree, tvb, offset, 4, "VD_AGENT_CLIPBOARD_GRAB message");
-            agent_tree = proto_item_add_subtree(ti, ett_spice_agent);
+            agent_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_spice_agent, NULL, "VD_AGENT_CLIPBOARD_GRAB message");
             proto_tree_add_item(agent_tree, hf_agent_clipboard_selection, tvb, offset, 1, ENC_LITTLE_ENDIAN);
             offset += 1;
             proto_tree_add_text(agent_tree, tvb, offset, 3, "reserved");
             offset += 3;
             break;
         case VD_AGENT_CLIPBOARD_REQUEST:
-            ti = proto_tree_add_text(tree, tvb, offset, 8, "VD_AGENT_CLIPBOARD_REQUEST message");
-            agent_tree = proto_item_add_subtree(ti, ett_spice_agent);
+            agent_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_spice_agent, NULL, "VD_AGENT_CLIPBOARD_REQUEST message");
             proto_tree_add_item(agent_tree, hf_agent_clipboard_selection, tvb, offset, 1, ENC_LITTLE_ENDIAN);
             offset += 1;
             proto_tree_add_text(agent_tree, tvb, offset, 3, "reserved");
@@ -2277,7 +2226,6 @@ dissect_spice_main_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message
 {
     guint32 num_channels, i, agent_msg_type, agent_msg_len, name_len, data_size;
     proto_tree *subtree = NULL;
-    proto_item *ti = NULL;
 
     switch (message_type) {
         case SPICE_MSG_MAIN_MIGRATE_BEGIN:
@@ -2324,13 +2272,11 @@ dissect_spice_main_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message
             num_channels = tvb_get_letohl(tvb, offset);
             proto_tree_add_item(tree, hf_main_num_channels, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             offset += 4;
-            ti = proto_tree_add_text(tree, tvb, offset, 2 * num_channels, "Channel Array");
-            subtree = proto_item_add_subtree(ti, ett_main_client);
+            subtree = proto_tree_add_subtree(tree, tvb, offset, 2 * num_channels, ett_main_client, NULL, "Channel Array");
             for (i = 0; i < num_channels; i++ ) {
-                proto_tree *subsubtree = NULL;
+                proto_tree *subsubtree;
 
-                ti = proto_tree_add_text(subtree, tvb, offset, 2, "channels[%u]", i);
-                subsubtree = proto_item_add_subtree(ti, ett_main_client);
+                subsubtree = proto_tree_add_subtree_format(subtree, tvb, offset, 2, ett_main_client, NULL, "channels[%u]", i);
 
                 proto_tree_add_item(subsubtree, hf_channel_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
                 offset += 1;
@@ -2397,7 +2343,6 @@ dissect_spice_main_server(tvbuff_t *tvb, proto_tree *tree, const guint16 message
 static guint32
 dissect_spice_main_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset)
 {
-    proto_item *ti = NULL;
     proto_tree *main_tree;
     guint32     agent_msg_type, agent_msg_len;
 
@@ -2409,14 +2354,12 @@ dissect_spice_main_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message
         case SPICE_MSGC_MAIN_ATTACH_CHANNELS:
             break;
         case SPICE_MSGC_MAIN_AGENT_START:
-            ti = proto_tree_add_text(tree, tvb, offset, 4, "Client AGENT_START message");
-            main_tree = proto_item_add_subtree(ti, ett_main_client);
+            main_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_main_client, NULL, "Client AGENT_START message");
             proto_tree_add_item(main_tree, hf_main_client_agent_tokens, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             offset += 4;
             break;
         case SPICE_MSGC_MAIN_AGENT_DATA:
-            ti = proto_tree_add_text(tree, tvb, offset, 24, "Client AGENT_DATA message");
-            main_tree = proto_item_add_subtree(ti, ett_main_client);
+            main_tree = proto_tree_add_subtree(tree, tvb, offset, 24, ett_main_client, NULL, "Client AGENT_DATA message");
             proto_tree_add_item(main_tree, hf_agent_protocol, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             offset += 4;
             proto_tree_add_item(main_tree, hf_agent_type, tvb, offset, 4, ENC_LITTLE_ENDIAN);
@@ -2439,8 +2382,8 @@ dissect_spice_main_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message
 static int
 dissect_spice_keyboard_modifiers(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-    proto_item *ti = NULL;
-    proto_tree *subtree = NULL;
+    proto_item *ti;
+    proto_tree *subtree;
 
     ti = proto_tree_add_item(tree, hf_keyboard_modifiers, tvb, offset, 2, ENC_LITTLE_ENDIAN);
     subtree = proto_item_add_subtree(ti, ett_link_caps);
@@ -2454,19 +2397,16 @@ dissect_spice_keyboard_modifiers(tvbuff_t *tvb, proto_tree *tree, guint32 offset
 static guint32
 dissect_spice_inputs_client(tvbuff_t *tvb, proto_tree *tree, const guint16 message_type, guint32 offset)
 {
-    proto_item *ti=NULL;
     proto_tree *inputs_tree;
 
     switch (message_type) {
         case SPICE_MSGC_INPUTS_KEY_DOWN:
-            ti = proto_tree_add_text(tree, tvb, offset, 4, "Client KEY_DOWN message");
-            inputs_tree = proto_item_add_subtree(ti, ett_inputs_client);
+            inputs_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_inputs_client, NULL, "Client KEY_DOWN message");
             proto_tree_add_item(inputs_tree, hf_keyboard_code, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             offset += 4;
             break;
         case SPICE_MSGC_INPUTS_KEY_UP:
-            ti = proto_tree_add_text(tree, tvb, offset, 4, "Client KEY_UP message");
-            inputs_tree = proto_item_add_subtree(ti, ett_inputs_client);
+            inputs_tree = proto_tree_add_subtree(tree, tvb, offset, 4, ett_inputs_client, NULL, "Client KEY_UP message");
             proto_tree_add_item(inputs_tree, hf_keyboard_code, tvb, offset, 4, ENC_LITTLE_ENDIAN);
             offset += 4;
             break;
@@ -2474,8 +2414,7 @@ dissect_spice_inputs_client(tvbuff_t *tvb, proto_tree *tree, const guint16 messa
             offset += dissect_spice_keyboard_modifiers(tvb, tree, offset);
             break;
         case SPICE_MSGC_INPUTS_MOUSE_POSITION:
-            ti = proto_tree_add_text(tree, tvb, offset, sizeof(point32_t) + 3, "Client MOUSE_POSITION message");
-            inputs_tree = proto_item_add_subtree(ti, ett_inputs_client);
+            inputs_tree = proto_tree_add_subtree(tree, tvb, offset, sizeof(point32_t) + 3, ett_inputs_client, NULL, "Client MOUSE_POSITION message");
             dissect_POINT32(tvb, inputs_tree, offset);
             offset += (int)sizeof(point32_t);
             proto_tree_add_item(inputs_tree, hf_button_state, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -2484,24 +2423,21 @@ dissect_spice_inputs_client(tvbuff_t *tvb, proto_tree *tree, const guint16 messa
             offset += 1;
             break;
         case SPICE_MSGC_INPUTS_MOUSE_MOTION:
-            ti = proto_tree_add_text(tree, tvb, offset, sizeof(point32_t) + 4, "Client MOUSE_MOTION message");
-            inputs_tree = proto_item_add_subtree(ti, ett_inputs_client);
+            inputs_tree = proto_tree_add_subtree(tree, tvb, offset, sizeof(point32_t) + 4, ett_inputs_client, NULL, "Client MOUSE_MOTION message");
             dissect_POINT32(tvb, inputs_tree, offset);
             offset += (int)sizeof(point32_t);
             proto_tree_add_item(inputs_tree, hf_button_state, tvb, offset, 2, ENC_LITTLE_ENDIAN);
             offset += 2;
             break;
         case SPICE_MSGC_INPUTS_MOUSE_PRESS:
-            ti = proto_tree_add_text(tree, tvb, offset, 3, "Client MOUSE_PRESS message");
-            inputs_tree = proto_item_add_subtree(ti, ett_inputs_client);
+            inputs_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_inputs_client, NULL, "Client MOUSE_PRESS message");
             proto_tree_add_item(inputs_tree, hf_button_state, tvb, offset, 2, ENC_LITTLE_ENDIAN);
             offset += 2;
             proto_tree_add_item(inputs_tree, hf_mouse_display_id, tvb, offset, 1, ENC_NA);
             offset += 1;
             break;
         case SPICE_MSGC_INPUTS_MOUSE_RELEASE:
-            ti = proto_tree_add_text(tree, tvb, offset, 3, "Client MOUSE_RELEASE message");
-            inputs_tree = proto_item_add_subtree(ti, ett_inputs_client);
+            inputs_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_inputs_client, NULL, "Client MOUSE_RELEASE message");
             proto_tree_add_item(inputs_tree, hf_button_state, tvb, offset, 2, ENC_LITTLE_ENDIAN);
             offset += 2;
             proto_tree_add_item(inputs_tree, hf_mouse_display_id, tvb, offset, 1, ENC_NA);
@@ -2675,11 +2611,10 @@ dissect_spice_data_server_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf
         header_size  = sizeof_SpiceMiniDataHeader;
         message_type = tvb_get_letohs(tvb, offset);
         message_size = tvb_get_letohl(tvb, offset +2);
-        msg_ti = proto_tree_add_text(tree, tvb, offset, 0,
-                                     "%s (%d bytes)",
+        message_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0,
+                                     ett_message, &msg_ti, "%s (%d bytes)",
                                      get_message_type_string(message_type, spice_info, FALSE),
                                      message_size + header_size);
-        message_tree = proto_item_add_subtree(msg_ti, ett_message);
         ti = proto_tree_add_item(message_tree, hf_data, tvb, offset, header_size, ENC_NA);
         data_header_tree = proto_item_add_subtree(ti, ett_data);
         dissect_spice_mini_data_header(tvb, data_header_tree, spice_info, FALSE, message_type, offset);
@@ -2688,11 +2623,10 @@ dissect_spice_data_server_pdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinf
         header_size  = sizeof_SpiceDataHeader;
         message_type = tvb_get_letohs(tvb, offset + 8);
         message_size = tvb_get_letohl(tvb, offset + 10);
-        msg_ti = proto_tree_add_text(tree, tvb, offset, 0,
-                                     "%s (%d bytes)",
+        message_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0,
+                                     ett_message, &msg_ti, "%s (%d bytes)",
                                      get_message_type_string(message_type, spice_info, FALSE),
                                      message_size + header_size);
-        message_tree = proto_item_add_subtree(msg_ti, ett_message);
         ti = proto_tree_add_item(message_tree, hf_data, tvb, offset, header_size, ENC_NA);
         data_header_tree = proto_item_add_subtree(ti, ett_data);
         dissect_spice_data_header(tvb, data_header_tree, spice_info, FALSE, message_type, &sublist_size, offset);
@@ -2975,18 +2909,16 @@ dissect_spice_link_client_pdu(tvbuff_t *tvb, proto_tree *tree, spice_conversatio
     offset += 4;
 
     if (common_caps_len > 0) {
-        ti = proto_tree_add_text(tree, tvb, offset, common_caps_len * 4,
-                                 "Client Common Capabilities (%d bytes)",
+        caps_tree = proto_tree_add_subtree_format(tree, tvb, offset, common_caps_len * 4,
+                                 ett_link_caps, NULL, "Client Common Capabilities (%d bytes)",
                                  common_caps_len * 4); /* caps_len multiplied by 4 as length is in UINT32 units   */
-        caps_tree = proto_item_add_subtree(ti, ett_link_caps);
         dissect_spice_common_capabilities(tvb, caps_tree, offset, common_caps_len, spice_info, TRUE);
         offset += (common_caps_len * 4);
     }
     if (channel_caps_len > 0) {
-        ti = proto_tree_add_text(tree, tvb, offset, channel_caps_len * 4,
-                                 "Client Channel-specific Capabilities (%d bytes)",
+        caps_tree = proto_tree_add_subtree_format(tree, tvb, offset, channel_caps_len * 4,
+                                 ett_link_caps, NULL, "Client Channel-specific Capabilities (%d bytes)",
                                  channel_caps_len * 4); /* caps_len multiplied by 4 as length is in UINT32 units    */
-        caps_tree = proto_item_add_subtree(ti, ett_link_caps);
         dissect_spice_link_capabilities(tvb, caps_tree, offset, channel_caps_len, spice_info);
     }
 }
@@ -3023,18 +2955,16 @@ dissect_spice_link_server_pdu(tvbuff_t *tvb, proto_tree *tree, spice_conversatio
     offset += (int)sizeof_SpiceLinkHeader + SPICE_TICKET_PUBKEY_BYTES;
 
     if (common_caps_len > 0) {
-        ti = proto_tree_add_text(tree, tvb, offset, common_caps_len * 4,
-                                 "Common Capabilities (%d bytes)",
+        caps_tree = proto_tree_add_subtree_format(tree, tvb, offset, common_caps_len * 4,
+                                 ett_link_caps, NULL, "Common Capabilities (%d bytes)",
                                  common_caps_len * 4); /* caps_len multiplied by 4 as length is in UINT32 units */
-        caps_tree = proto_item_add_subtree(ti, ett_link_caps);
         dissect_spice_common_capabilities(tvb, caps_tree, offset, common_caps_len, spice_info, FALSE);
         offset += (common_caps_len * 4);
     }
     if (channel_caps_len > 0) {
-        ti = proto_tree_add_text(tree, tvb, offset, channel_caps_len * 4,
-                                 "Channel Capabilities (%d bytes)",
+        caps_tree = proto_tree_add_subtree_format(tree, tvb, offset, channel_caps_len * 4,
+                                 ett_link_caps, NULL, "Channel Capabilities (%d bytes)",
                                  channel_caps_len * 4); /* caps_len multiplied by 4 as length is in UINT32 units */
-        caps_tree = proto_item_add_subtree(ti, ett_link_caps);
         dissect_spice_link_capabilities(tvb, caps_tree, offset, channel_caps_len, spice_info);
     }
 }
index d3d73697b2d122c6b3258214784afe8c0b1f6a41..944f1bb08fd216c92778fe3fb0fbccb4613e9d70 100644 (file)
@@ -509,7 +509,6 @@ attr_list(proto_tree *tree, int hf, tvbuff_t *tvb, int offset, int length,
     int     i, svc, ss, type_len, foffset=offset;
     guint32 prot;
     const guint8  *byte_value;
-    proto_item         *ti;
     proto_tree         *srvloc_tree;
     char *tmp;
 
@@ -561,8 +560,7 @@ attr_list(proto_tree *tree, int hf, tvbuff_t *tvb, int offset, int length,
                 i=1;
                 for (foffset = offset; foffset<length; foffset += 2) {
 
-                    ti = proto_tree_add_text(tree, tvb, foffset, -1, "Item %d", i);
-                    srvloc_tree = proto_item_add_subtree(ti, ett_srvloc_attr);
+                    srvloc_tree = proto_tree_add_subtree_format(tree, tvb, foffset, -1, ett_srvloc_attr, NULL, "Item %d", i);
 
                     svc = tvb_get_guint8(tvb, foffset+1);
                                proto_tree_add_text(srvloc_tree, tvb, foffset+1, 1,
@@ -635,8 +633,7 @@ attr_list(proto_tree *tree, int hf, tvbuff_t *tvb, int offset, int length,
         i=1;
         for (foffset = offset + (type_len); foffset<length; foffset++) {
 
-            ti = proto_tree_add_text(tree, tvb, foffset, -1, "Item %d", i);
-            srvloc_tree = proto_item_add_subtree(ti, ett_srvloc_attr);
+            srvloc_tree = proto_tree_add_subtree_format(tree, tvb, foffset, -1, ett_srvloc_attr, NULL, "Item %d", i);
 
             svc = tvb_get_guint8(tvb, foffset+1);
                        proto_tree_add_text(srvloc_tree, tvb, foffset+1, 1,
index c598c080acb52f73fcc6d219cf4198c5d766cf75..88ef48d759d48c55efd71f6d4634b8f80cc49235 100644 (file)
@@ -164,11 +164,9 @@ static const value_string sscop_type_vals[] = {
 
 static void dissect_stat_list(proto_tree *tree, tvbuff_t *tvb,guint h) {
        gint n,i;
-       proto_item* pi;
 
        if ((n = (tvb_reported_length(tvb))/4 - h)) {
-               pi = proto_tree_add_text(tree,tvb,0,n*4,"SD List");
-               tree = proto_item_add_subtree(pi,ett_stat);
+               tree = proto_tree_add_subtree(tree,tvb,0,n*4,ett_stat,NULL,"SD List");
 
                for (i = 0; i < n; i++) {
                        proto_tree_add_item(tree, hf_sscop_stat_s, tvb, i*4 + 1,3,ENC_BIG_ENDIAN);
index 6a81252b3b633cde77c20c712a7d2f69efcce7e9..0bf294953aa01aee47298d6fb78170062a9866e0 100644 (file)
@@ -438,7 +438,6 @@ ssh_dissect_ssh2(tvbuff_t *tvb, packet_info *pinfo,
                int offset, proto_tree *tree, int is_response,
                gboolean *need_desegmentation)
 {
-       proto_item *ti;
        proto_item *ssh2_tree=NULL;
 
        struct ssh_peer_data *peer_data = &global_data->peer_data[is_response];
@@ -463,8 +462,7 @@ ssh_dissect_ssh2(tvbuff_t *tvb, packet_info *pinfo,
                        wmem_strbuf_append_printf(title, ")");
                }
 
-               ti=proto_tree_add_text(tree, tvb, offset, -1, "%s", wmem_strbuf_get_str(title));
-               ssh2_tree = proto_item_add_subtree(ti, ett_ssh2);
+               ssh2_tree=proto_tree_add_subtree(tree, tvb, offset, -1, ett_ssh2, NULL, wmem_strbuf_get_str(title));
        }
 
        if ((peer_data->frame_key_start == 0) ||
@@ -490,15 +488,11 @@ ssh_dissect_ssh1(tvbuff_t *tvb, packet_info *pinfo,
        guint8  msg_code;
        guint   remain_length;
 
-       proto_item *ti;
-       proto_item *ssh1_tree =NULL;
+       proto_item *ssh1_tree;
 
        struct ssh_peer_data *peer_data = &global_data->peer_data[is_response];
 
-       if (tree) {
-               ti=proto_tree_add_text(tree, tvb, offset, -1, "SSH Version 1");
-               ssh1_tree = proto_item_add_subtree(ti, ett_ssh1);
-       }
+       ssh1_tree=proto_tree_add_subtree(tree, tvb, offset, -1, ett_ssh1, NULL, "SSH Version 1");
 
        /*
         * We use "tvb_ensure_length_remaining()" to make sure there
@@ -639,7 +633,7 @@ ssh_dissect_key_exchange(tvbuff_t *tvb, packet_info *pinfo,
        int     last_offset=offset;
        guint   msg_code;
 
-       proto_item *tf, *ti;
+       proto_item *ti;
        proto_item *key_ex_tree =NULL;
 
        struct ssh_peer_data *peer_data = &global_data->peer_data[is_response];
@@ -701,8 +695,7 @@ ssh_dissect_key_exchange(tvbuff_t *tvb, packet_info *pinfo,
        proto_tree_add_uint(tree, hf_ssh_padding_length, tvb, offset, 1, padding_length);
        offset += 1;
 
-       tf=proto_tree_add_text(tree, tvb, offset, -1, "Key Exchange");
-       key_ex_tree = proto_item_add_subtree(tf, ett_key_exchange);
+       key_ex_tree=proto_tree_add_subtree(tree, tvb, offset, -1, ett_key_exchange, NULL, "Key Exchange");
 
        /* msg_code */
        msg_code = tvb_get_guint8(tvb, offset);
@@ -1049,17 +1042,14 @@ ssh_dissect_key_init(tvbuff_t *tvb, int offset, proto_tree *tree,
 {
        int start_offset = offset;
 
-       proto_item *tf = NULL;
-       proto_item *key_init_tree=NULL;
+       proto_item *tf;
+    proto_tree *key_init_tree;
 
        struct ssh_peer_data *peer_data = &global_data->peer_data[is_response];
 
-       if (tree) {
-               tf=proto_tree_add_text(tree, tvb, offset, -1, "Algorithms");
-               key_init_tree = proto_item_add_subtree(tf, ett_key_init);
-               proto_tree_add_item(key_init_tree, hf_ssh_cookie,
+       key_init_tree=proto_tree_add_subtree(tree, tvb, offset, -1, ett_key_init, &tf, "Algorithms");
+       proto_tree_add_item(key_init_tree, hf_ssh_cookie,
                                    tvb, offset, 16, ENC_NA);
-       }
        offset += 16;
 
        offset = ssh_dissect_proposal(tvb, offset, key_init_tree,
index 210a64a48e7c94e51eb90acf006dcd759bb363ae..d225de81cf3e952f940250835ed95de47abd4330 100644 (file)
@@ -4890,14 +4890,12 @@ ssl_dissect_hnd_hello_ext_npn(ssl_common_dissect_t *hf, tvbuff_t *tvb,
 {
     guint8      npn_length;
     proto_tree *npn_tree;
-    proto_item *ti;
 
     if (ext_len == 0) {
         return offset;
     }
 
-    ti = proto_tree_add_text(tree, tvb, offset, ext_len, "Next Protocol Negotiation");
-    npn_tree = proto_item_add_subtree(ti, hf->ett.hs_ext_npn);
+    npn_tree = proto_tree_add_subtree(tree, tvb, offset, ext_len, hf->ett.hs_ext_npn, NULL, "Next Protocol Negotiation");
 
     while (ext_len > 0) {
         npn_length = tvb_get_guint8(tvb, offset);
@@ -4924,14 +4922,12 @@ ssl_dissect_hnd_hello_ext_reneg_info(ssl_common_dissect_t *hf, tvbuff_t *tvb,
 {
     guint8      reneg_info_length;
     proto_tree *reneg_info_tree;
-    proto_item *ti;
 
     if (ext_len == 0) {
         return offset;
     }
 
-    ti = proto_tree_add_text(tree, tvb, offset, ext_len, "Renegotiation Info extension");
-    reneg_info_tree = proto_item_add_subtree(ti, hf->ett.hs_ext_reneg_info);
+    reneg_info_tree = proto_tree_add_subtree(tree, tvb, offset, ext_len, hf->ett.hs_ext_reneg_info, NULL, "Renegotiation Info extension");
 
     reneg_info_length = tvb_get_guint8(tvb, offset);
     proto_tree_add_item(reneg_info_tree, hf->hf.hs_ext_reneg_info_len,
@@ -4953,15 +4949,13 @@ ssl_dissect_hnd_hello_ext_server_name(ssl_common_dissect_t *hf, tvbuff_t *tvb,
 {
     guint16     server_name_length;
     proto_tree *server_name_tree;
-    proto_item *ti;
 
 
    if (ext_len == 0) {
        return offset;
    }
 
-   ti = proto_tree_add_text(tree, tvb, offset, ext_len, "Server Name Indication extension");
-   server_name_tree = proto_item_add_subtree(ti, hf->ett.hs_ext_server_name);
+   server_name_tree = proto_tree_add_subtree(tree, tvb, offset, ext_len, hf->ett.hs_ext_server_name, NULL, "Server Name Indication extension");
 
    proto_tree_add_item(server_name_tree, hf->hf.hs_ext_server_name_list_len,
                        tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -5292,7 +5286,6 @@ ssl_dissect_hnd_hello_ext(ssl_common_dissect_t *hf, tvbuff_t *tvb, proto_tree *t
     guint16     extension_length;
     guint16     ext_type;
     guint16     ext_len;
-    proto_item *pi;
     proto_tree *ext_tree;
 
     if (left < 2)
@@ -5309,13 +5302,10 @@ ssl_dissect_hnd_hello_ext(ssl_common_dissect_t *hf, tvbuff_t *tvb, proto_tree *t
         ext_type = tvb_get_ntohs(tvb, offset);
         ext_len  = tvb_get_ntohs(tvb, offset + 2);
 
-        pi = proto_tree_add_text(tree, tvb, offset, 4 + ext_len,  "Extension: %s",
-                                 val_to_str(ext_type,
+        ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + ext_len, hf->ett.hs_ext, NULL,
+                                  "Extension: %s", val_to_str(ext_type,
                                             tls_hello_extension_types,
                                             "Unknown %u"));
-        ext_tree = proto_item_add_subtree(pi, hf->ett.hs_ext);
-        if (!ext_tree)
-            ext_tree = tree;
 
         proto_tree_add_uint(ext_tree, hf->hf.hs_ext_type,
                             tvb, offset, 2, ext_type);
@@ -5399,12 +5389,10 @@ dissect_ssl3_hnd_cli_keyex_ecdh(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                 guint32 length)
 {
     gint        point_len;
-    proto_item *ti_ecdh;
     proto_tree *ssl_ecdh_tree;
 
-    ti_ecdh = proto_tree_add_text(tree, tvb, offset, length,
-                                  "EC Diffie-Hellman Client Params");
-    ssl_ecdh_tree = proto_item_add_subtree(ti_ecdh, hf->ett.keyex_params);
+    ssl_ecdh_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                  hf->ett.keyex_params, NULL, "EC Diffie-Hellman Client Params");
 
     /* point */
     point_len = tvb_get_guint8(tvb, offset);
@@ -5419,12 +5407,10 @@ dissect_ssl3_hnd_cli_keyex_dh(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                               proto_tree *tree, guint32 offset, guint32 length)
 {
     gint        yc_len;
-    proto_item *ti_dh;
     proto_tree *ssl_dh_tree;
 
-    ti_dh = proto_tree_add_text(tree, tvb, offset, length,
-                                "Diffie-Hellman Client Params");
-    ssl_dh_tree = proto_item_add_subtree(ti_dh, hf->ett.keyex_params);
+    ssl_dh_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                hf->ett.keyex_params, NULL, "Diffie-Hellman Client Params");
 
     /* ClientDiffieHellmanPublic.dh_public (explicit) */
     yc_len  = tvb_get_ntohs(tvb, offset);
@@ -5440,12 +5426,10 @@ dissect_ssl3_hnd_cli_keyex_rsa(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                guint32 length, const SslSession *session)
 {
     gint        epms_len;
-    proto_item *ti_rsa;
     proto_tree *ssl_rsa_tree;
 
-    ti_rsa = proto_tree_add_text(tree, tvb, offset, length,
-                                 "RSA Encrypted PreMaster Secret");
-    ssl_rsa_tree = proto_item_add_subtree(ti_rsa, hf->ett.keyex_params);
+    ssl_rsa_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                 hf->ett.keyex_params, NULL, "RSA Encrypted PreMaster Secret");
 
     /* EncryptedPreMasterSecret.pre_master_secret */
     switch (session->version) {
@@ -5476,13 +5460,10 @@ dissect_ssl3_hnd_cli_keyex_psk(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                proto_tree *tree, guint32 offset, guint32 length)
 {
     guint        identity_len;
-    proto_item *ti_psk;
     proto_tree *ssl_psk_tree;
 
-    ti_psk = proto_tree_add_text(tree, tvb, offset, length,
-                                 "PSK Client Params");
-    ssl_psk_tree = proto_item_add_subtree(ti_psk, hf->ett.keyex_params);
-
+    ssl_psk_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                 hf->ett.keyex_params, NULL, "PSK Client Params");
     /* identity */
     identity_len = tvb_get_ntohs(tvb, offset);
     proto_tree_add_item(ssl_psk_tree, hf->hf.hs_client_keyex_identity_len, tvb,
@@ -5498,12 +5479,10 @@ dissect_ssl3_hnd_cli_keyex_rsa_psk(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                    guint32 length)
 {
     gint        identity_len, epms_len;
-    proto_item *ti_psk;
     proto_tree *ssl_psk_tree;
 
-    ti_psk = proto_tree_add_text(tree, tvb, offset, length,
-                                 "RSA PSK Client Params");
-    ssl_psk_tree = proto_item_add_subtree(ti_psk, hf->ett.keyex_params);
+    ssl_psk_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                 hf->ett.keyex_params, NULL, "RSA PSK Client Params");
 
     /* identity */
     identity_len = tvb_get_ntohs(tvb, offset);
@@ -5599,12 +5578,10 @@ dissect_ssl3_hnd_srv_keyex_ecdh(ssl_common_dissect_t *hf, tvbuff_t *tvb,
 
     gint        curve_type;
     gint        point_len;
-    proto_item *ti_ecdh;
     proto_tree *ssl_ecdh_tree;
 
-    ti_ecdh = proto_tree_add_text(tree, tvb, offset, length,
-                                  "EC Diffie-Hellman Server Params");
-    ssl_ecdh_tree = proto_item_add_subtree(ti_ecdh, hf->ett.keyex_params);
+    ssl_ecdh_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                  hf->ett.keyex_params, NULL, "EC Diffie-Hellman Server Params");
 
     /* ECParameters.curve_type */
     curve_type = tvb_get_guint8(tvb, offset);
@@ -5637,12 +5614,10 @@ dissect_ssl3_hnd_srv_keyex_dhe(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                const SslSession *session)
 {
     gint        p_len, g_len, ys_len;
-    proto_item *ti_dh;
     proto_tree *ssl_dh_tree;
 
-    ti_dh = proto_tree_add_text(tree, tvb, offset, length,
-                                "Diffie-Hellman Server Params");
-    ssl_dh_tree = proto_item_add_subtree(ti_dh, hf->ett.keyex_params);
+    ssl_dh_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                hf->ett.keyex_params, NULL, "Diffie-Hellman Server Params");
 
     /* p */
     p_len = tvb_get_ntohs(tvb, offset);
@@ -5679,12 +5654,10 @@ dissect_ssl3_hnd_srv_keyex_rsa(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                const SslSession *session)
 {
     gint        modulus_len, exponent_len;
-    proto_item *ti_rsa;
     proto_tree *ssl_rsa_tree;
 
-    ti_rsa = proto_tree_add_text(tree, tvb, offset, length,
-                                 "RSA-EXPORT Server Params");
-    ssl_rsa_tree = proto_item_add_subtree(ti_rsa, hf->ett.keyex_params);
+    ssl_rsa_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                 hf->ett.keyex_params, NULL, "RSA-EXPORT Server Params");
 
     /* modulus */
     modulus_len = tvb_get_ntohs(tvb, offset);
@@ -5712,7 +5685,6 @@ dissect_ssl3_hnd_srv_keyex_psk(ssl_common_dissect_t *hf, tvbuff_t *tvb,
                                proto_tree *tree, guint32 offset, guint32 length)
 {
     guint        hint_len;
-    proto_item *ti_psk;
     proto_tree *ssl_psk_tree;
 
     hint_len = tvb_get_ntohs(tvb, offset);
@@ -5721,9 +5693,8 @@ dissect_ssl3_hnd_srv_keyex_psk(ssl_common_dissect_t *hf, tvbuff_t *tvb,
         return;
     }
 
-    ti_psk = proto_tree_add_text(tree, tvb, offset, length,
-                                 "PSK Server Params");
-    ssl_psk_tree = proto_item_add_subtree(ti_psk, hf->ett.keyex_params);
+    ssl_psk_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+                                 hf->ett.keyex_params, NULL, "PSK Server Params");
 
     /* hint */
     proto_tree_add_item(ssl_psk_tree, hf->hf.hs_server_keyex_hint_len, tvb,
index ce0105667aa6434d0243dec18cb965f6ba3d1bfa..c69cfa55487392342c09bb4a1127bdf62e093a5b 100644 (file)
@@ -2161,7 +2161,6 @@ dissect_ssl3_hnd_hello_common(tvbuff_t *tvb, proto_tree *tree,
     /* show the client's random challenge */
     nstime_t    gmt_unix_time;
     guint8      session_id_length;
-    proto_item *ti_rnd;
     proto_tree *ssl_rnd_tree;
 
     session_id_length = 0;
@@ -2213,8 +2212,7 @@ dissect_ssl3_hnd_hello_common(tvbuff_t *tvb, proto_tree *tree,
 
     if (tree)
     {
-        ti_rnd = proto_tree_add_text(tree, tvb, offset, 32, "Random");
-        ssl_rnd_tree = proto_item_add_subtree(ti_rnd, ett_ssl_random);
+        ssl_rnd_tree = proto_tree_add_subtree(tree, tvb, offset, 32, ett_ssl_random, NULL, "Random");
 
         /* show the time */
         gmt_unix_time.secs = tvb_get_ntohl(tvb, offset);
@@ -2456,7 +2454,6 @@ dissect_ssl3_hnd_new_ses_ticket(tvbuff_t *tvb, proto_tree *tree,
                               guint32 offset, guint32 length, SslDecryptSession *ssl)
 {
     guint       nst_len;
-    proto_item *ti;
     proto_tree *subtree;
     guint16 session_ticket_length = 0;
 
@@ -2465,8 +2462,7 @@ dissect_ssl3_hnd_new_ses_ticket(tvbuff_t *tvb, proto_tree *tree,
         return;
     }
 
-    ti = proto_tree_add_text(tree, tvb, offset, 6+nst_len, "TLS Session Ticket");
-    subtree = proto_item_add_subtree(ti, ett_ssl_new_ses_ticket);
+    subtree = proto_tree_add_subtree(tree, tvb, offset, 6+nst_len, ett_ssl_new_ses_ticket, NULL, "TLS Session Ticket");
 
     proto_tree_add_item(subtree, hf_ssl_handshake_session_ticket_lifetime_hint,
                         tvb, offset, 4, ENC_BIG_ENDIAN);
@@ -2709,7 +2705,6 @@ static void
 dissect_ssl3_hnd_cli_cert_verify(tvbuff_t *tvb, proto_tree *tree,
                                 guint32 offset, guint32 length)
 {
-    proto_item *ti_sig;
     proto_tree *ssl_sig_tree;
 
     /*
@@ -2730,9 +2725,8 @@ dissect_ssl3_hnd_cli_cert_verify(tvbuff_t *tvb, proto_tree *tree,
      */
 
 
-    ti_sig = proto_tree_add_text(tree, tvb, offset, length,
-            "Signature with client's private key");
-    ssl_sig_tree = proto_item_add_subtree(ti_sig, ett_ssl_cli_sig);
+    ssl_sig_tree = proto_tree_add_subtree(tree, tvb, offset, length,
+            ett_ssl_cli_sig, NULL, "Signature with client's private key");
 
     proto_tree_add_item(ssl_sig_tree, hf_ssl_handshake_client_cert_vrfy_sig_len,
                         tvb, offset, 2, ENC_BIG_ENDIAN);
index 16fb5cca95fba01e6d02f2efa48371f337556e01..fdd133ad740b749c85240af49f5f8e2df57c32dc 100644 (file)
@@ -529,8 +529,7 @@ dissect_starteam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
 
       if(bRequest){
         if(tvb_length_remaining(tvb, offset) >= 20){
-          ti = proto_tree_add_text(starteamroot_tree, tvb, offset, 20, STARTEAM_TEXT_MDH);
-          starteam_tree = proto_item_add_subtree(ti, ett_starteam_mdh);
+          starteam_tree = proto_tree_add_subtree(starteamroot_tree, tvb, offset, 20, ett_starteam_mdh, NULL, STARTEAM_TEXT_MDH);
 
           proto_tree_add_item(starteam_tree, hf_starteam_mdh_session_tag, tvb, offset + 0,  4, ENC_LITTLE_ENDIAN);
           proto_tree_add_item(starteam_tree, hf_starteam_mdh_ctimestamp,  tvb, offset + 4,  4, ENC_LITTLE_ENDIAN);
@@ -542,8 +541,7 @@ dissect_starteam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
       }
 
       if(tvb_length_remaining(tvb, offset) >= 16){
-        ti = proto_tree_add_text(starteamroot_tree, tvb, offset, 16, STARTEAM_TEXT_PH);
-        starteam_tree = proto_item_add_subtree(ti, ett_starteam_ph);
+        starteam_tree = proto_tree_add_subtree(starteamroot_tree, tvb, offset, 16, ett_starteam_ph, NULL, STARTEAM_TEXT_PH);
 
         proto_tree_add_item(starteam_tree, hf_starteam_ph_signature,   tvb, offset + 0,  4,  ENC_ASCII|ENC_NA);
         proto_tree_add_item(starteam_tree, hf_starteam_ph_packet_size, tvb, offset + 4,  4,  ENC_LITTLE_ENDIAN);
@@ -553,8 +551,7 @@ dissect_starteam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
 
         if(bRequest){
           if(tvb_length_remaining(tvb, offset) >= 38){
-            ti = proto_tree_add_text(starteamroot_tree, tvb, offset, 38, STARTEAM_TEXT_ID);
-            starteam_tree = proto_item_add_subtree(ti, ett_starteam_id);
+            starteam_tree = proto_tree_add_subtree(starteamroot_tree, tvb, offset, 38, ett_starteam_id, NULL, STARTEAM_TEXT_ID);
 
             proto_tree_add_item(starteam_tree, hf_starteam_id_revision_level, tvb, offset + 0,  2, ENC_LITTLE_ENDIAN);
             proto_tree_add_item(starteam_tree, hf_starteam_id_client,         tvb, offset + 2, 16, ENC_ASCII|ENC_NA);
@@ -567,9 +564,8 @@ dissect_starteam(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
           }
         }
         if(tvb_length_remaining(tvb, offset) > 0){
-          ti = proto_tree_add_text(starteamroot_tree, tvb, offset, -1, STARTEAM_TEXT_DATA);
-          starteam_tree = proto_item_add_subtree(ti, ett_starteam_data);
-          proto_tree_add_item(starteam_tree, hf_starteam_data_data, tvb, offset, tvb_length_remaining(tvb, offset), ENC_ASCII|ENC_NA);
+          starteam_tree = proto_tree_add_subtree(starteamroot_tree, tvb, offset, -1, ett_starteam_data, NULL, STARTEAM_TEXT_DATA);
+          proto_tree_add_item(starteam_tree, hf_starteam_data_data, tvb, offset, -1, ENC_ASCII|ENC_NA);
         }
       }
     }
index 29c9199213d168d4c3b2566106096f1f96a4ca53..8db649f26a1b995c3b2d175416bad09ef6503f42 100644 (file)
@@ -178,16 +178,13 @@ dissect_stat_stat(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree
 static int
 dissect_stat_stat_res(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
 {
-       proto_item* sub_item = NULL;
-       proto_tree* sub_tree = NULL;
+       proto_item* sub_item;
+       proto_tree* sub_tree;
        gint32 res;
 
-       if (tree) {
-               sub_item = proto_tree_add_item(tree, &hfi_stat_stat_res, tvb,
+       sub_item = proto_tree_add_item(tree, &hfi_stat_stat_res, tvb,
                                offset, -1, ENC_NA);
-               if (sub_item)
-                       sub_tree = proto_item_add_subtree(sub_item, ett_stat_stat_res);
-       }
+       sub_tree = proto_item_add_subtree(sub_item, ett_stat_stat_res);
 
        res = tvb_get_ntohl(tvb, offset);
        offset = dissect_rpc_uint32(tvb,sub_tree,hfi_stat_stat_res_res.id,offset);
@@ -204,15 +201,12 @@ dissect_stat_stat_res(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_t
 static int
 dissect_stat_my_id(tvbuff_t *tvb, int offset, proto_tree *tree)
 {
-       proto_item* sub_item = NULL;
-       proto_tree* sub_tree = NULL;
+       proto_item* sub_item;
+       proto_tree* sub_tree;
 
-       if (tree) {
-               sub_item = proto_tree_add_item(tree, &hfi_stat_my_id, tvb,
+       sub_item = proto_tree_add_item(tree, &hfi_stat_my_id, tvb,
                                offset, my_id_len(tvb,offset), ENC_NA);
-               if (sub_item)
-                       sub_tree = proto_item_add_subtree(sub_item, ett_stat_my_id);
-       }
+       sub_tree = proto_item_add_subtree(sub_item, ett_stat_my_id);
 
        offset = dissect_rpc_string(tvb,sub_tree,hfi_stat_my_id_hostname.id,offset,NULL);
        offset = dissect_rpc_uint32(tvb,sub_tree,hfi_stat_my_id_prog.id,offset);
@@ -225,16 +219,12 @@ dissect_stat_my_id(tvbuff_t *tvb, int offset, proto_tree *tree)
 static int
 dissect_stat_mon_id(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
 {
-       proto_item* sub_item = NULL;
-       proto_tree* sub_tree = NULL;
+       proto_item* sub_item;
+       proto_tree* sub_tree;
 
-       if (tree) {
-               sub_item = proto_tree_add_item(tree, &hfi_stat_mon, tvb,
+       sub_item = proto_tree_add_item(tree, &hfi_stat_mon, tvb,
                                offset, mon_id_len(tvb,offset), ENC_NA);
-               if (sub_item)
-                       sub_tree = proto_item_add_subtree(sub_item, ett_stat_mon);
-       }
-
+       sub_tree = proto_item_add_subtree(sub_item, ett_stat_mon);
 
        offset = dissect_rpc_string(tvb,sub_tree,hfi_stat_mon_id_name.id,offset,NULL);
 
@@ -273,16 +263,13 @@ dissect_stat_state(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree
 static int
 dissect_stat_notify(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
 {
-       proto_item* sub_item = NULL;
-       proto_tree* sub_tree = NULL;
+       proto_item* sub_item;
+       proto_tree* sub_tree;
        int start_offset = offset;
 
-       if (tree) {
-               sub_item = proto_tree_add_item(tree, &hfi_stat_stat_chge, tvb,
+       sub_item = proto_tree_add_item(tree, &hfi_stat_stat_chge, tvb,
                                offset, -1, ENC_NA);
-               if (sub_item)
-                       sub_tree = proto_item_add_subtree(sub_item, ett_stat_stat_chge);
-       }
+       sub_tree = proto_item_add_subtree(sub_item, ett_stat_stat_chge);
 
        offset = dissect_rpc_string(tvb,sub_tree,hfi_stat_mon_id_name.id,offset,NULL);
 
index 01b55e489edbced0b37d6fb6a92bef44415e2ba9..ea9642002d8662155325dc49ab26a3aa4ed72815 100644 (file)
@@ -926,7 +926,6 @@ static const value_string routing_indicator_values[] = {
 static void
 dissect_source_address_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, guint8 *ssn)
 {
-  proto_item *address_indicator_item;
   proto_tree *address_indicator_tree;
   tvbuff_t *parameters_tvb;
 
@@ -934,8 +933,7 @@ dissect_source_address_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, pr
 
   if(parameter_tree) {
     proto_tree_add_item(parameter_tree, hf_sua_source_address_routing_indicator, parameter_tvb, ROUTING_INDICATOR_OFFSET, ROUTING_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
-    address_indicator_item = proto_tree_add_text(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, "Address Indicator");
-    address_indicator_tree = proto_item_add_subtree(address_indicator_item, ett_sua_source_address_indicator);
+    address_indicator_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ett_sua_source_address_indicator, NULL, "Address Indicator");
     proto_tree_add_item(address_indicator_tree, hf_sua_source_address_reserved_bits, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
     proto_tree_add_item(address_indicator_tree, hf_sua_source_address_gt_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
     proto_tree_add_item(address_indicator_tree, hf_sua_source_address_pc_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
@@ -949,7 +947,6 @@ dissect_source_address_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, pr
 static void
 dissect_destination_address_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *parameter_tree, guint8 *ssn)
 {
-  proto_item *address_indicator_item;
   proto_tree *address_indicator_tree;
   tvbuff_t *parameters_tvb;
 
@@ -957,8 +954,7 @@ dissect_destination_address_parameter(tvbuff_t *parameter_tvb, packet_info *pinf
 
   if(parameter_tree) {
     proto_tree_add_item(parameter_tree, hf_sua_destination_address_routing_indicator, parameter_tvb, ROUTING_INDICATOR_OFFSET, ROUTING_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
-    address_indicator_item = proto_tree_add_text(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, "Address Indicator");
-    address_indicator_tree = proto_item_add_subtree(address_indicator_item, ett_sua_destination_address_indicator);
+    address_indicator_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ett_sua_destination_address_indicator, NULL, "Address Indicator");
     proto_tree_add_item(address_indicator_tree, hf_sua_destination_address_reserved_bits, parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
     proto_tree_add_item(address_indicator_tree, hf_sua_destination_address_gt_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
     proto_tree_add_item(address_indicator_tree, hf_sua_destination_address_pc_bit,        parameter_tvb, ADDRESS_INDICATOR_OFFSET, ADDRESS_INDICATOR_LENGTH, ENC_BIG_ENDIAN);
@@ -1064,20 +1060,18 @@ static const true_false_string more_data_bit_value = {
 static void
 dissect_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  proto_item *sent_sequence_number_item;
   proto_tree *sent_sequence_number_tree;
-  proto_item *receive_sequence_number_item;
   proto_tree *receive_sequence_number_tree;
 
   proto_tree_add_item(parameter_tree, hf_sua_sequence_number_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_2_LENGTH, ENC_NA);
 
-  receive_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH, "Receive Sequence Number");
-  receive_sequence_number_tree = proto_item_add_subtree(receive_sequence_number_item, ett_sua_sequence_number_rec_number);
+  receive_sequence_number_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH,
+                                            ett_sua_sequence_number_rec_number, NULL, "Receive Sequence Number");
   proto_tree_add_item(receive_sequence_number_tree, hf_sua_sequence_number_rec_number,    parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH, ENC_BIG_ENDIAN);
   proto_tree_add_item(receive_sequence_number_tree, hf_sua_sequence_number_more_data_bit, parameter_tvb, SEQUENCE_NUMBER_REC_SEQ_OFFSET, SEQUENCE_NUMBER_REC_SEQ_LENGTH, ENC_BIG_ENDIAN);
 
-  sent_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH, "Sent Sequence Number");
-  sent_sequence_number_tree = proto_item_add_subtree(sent_sequence_number_item, ett_sua_sequence_number_sent_number);
+  sent_sequence_number_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH,
+                                            ett_sua_sequence_number_sent_number, NULL, "Sent Sequence Number");
   proto_tree_add_item(sent_sequence_number_tree, hf_sua_sequence_number_sent_number, parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH, ENC_BIG_ENDIAN);
   proto_tree_add_item(sent_sequence_number_tree, hf_sua_sequence_number_spare_bit,   parameter_tvb, SEQUENCE_NUMBER_SENT_SEQ_OFFSET, SEQUENCE_NUMBER_SENT_SEQ_LENGTH, ENC_BIG_ENDIAN);
 }
@@ -1088,12 +1082,11 @@ dissect_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter
 static void
 dissect_receive_sequence_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree)
 {
-  proto_item *receive_sequence_number_item;
   proto_tree *receive_sequence_number_tree;
 
   proto_tree_add_item(parameter_tree, hf_sua_receive_sequence_number_reserved, parameter_tvb, PARAMETER_VALUE_OFFSET, RESERVED_3_LENGTH, ENC_NA);
-  receive_sequence_number_item = proto_tree_add_text(parameter_tree, parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, "Receive Sequence Number");
-  receive_sequence_number_tree = proto_item_add_subtree(receive_sequence_number_item, ett_sua_receive_sequence_number_number);
+  receive_sequence_number_tree = proto_tree_add_subtree(parameter_tree, parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH,
+                            ett_sua_receive_sequence_number_number, NULL, "Receive Sequence Number");
   proto_tree_add_item(receive_sequence_number_tree, hf_sua_receive_sequence_number_number,    parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, ENC_BIG_ENDIAN);
   proto_tree_add_item(receive_sequence_number_tree, hf_sua_receive_sequence_number_spare_bit, parameter_tvb, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_OFFSET, RECEIVE_SEQUENCE_NUMBER_REC_SEQ_LENGTH, ENC_BIG_ENDIAN);
 }
@@ -1638,18 +1631,12 @@ dissect_v8_parameter(tvbuff_t *parameter_tvb, packet_info *pinfo, proto_tree *tr
   length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
   padding_length = tvb_length(parameter_tvb) - length;
 
-  if (tree) {
-    /* create proto_tree stuff */
-    parameter_item   = proto_tree_add_text(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, tvb_length(parameter_tvb), "%s", val_to_str_const(tag, v8_parameter_tag_values, "Unknown parameter"));
-    parameter_tree   = proto_item_add_subtree(parameter_item, ett_sua_parameter);
+  /* create proto_tree stuff */
+  parameter_tree = proto_tree_add_subtree(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, -1, ett_sua_parameter, &parameter_item, val_to_str_const(tag, v8_parameter_tag_values, "Unknown parameter"));
 
-    /* add tag and length to the sua tree */
-    proto_tree_add_item(parameter_tree, hf_sua_v8_parameter_tag,    parameter_tvb, PARAMETER_TAG_OFFSET,    PARAMETER_TAG_LENGTH,    ENC_BIG_ENDIAN);
-    proto_tree_add_item(parameter_tree, hf_sua_parameter_length, parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH, ENC_BIG_ENDIAN);
-  } else {
-    parameter_tree = NULL;
-    parameter_item = NULL;
-  }
+  /* add tag and length to the sua tree */
+  proto_tree_add_item(parameter_tree, hf_sua_v8_parameter_tag,    parameter_tvb, PARAMETER_TAG_OFFSET,    PARAMETER_TAG_LENGTH,    ENC_BIG_ENDIAN);
+  proto_tree_add_item(parameter_tree, hf_sua_parameter_length, parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH, ENC_BIG_ENDIAN);
 
   /*
   ** If no tree, only the data and ssn parameters in the source and destination
@@ -1923,32 +1910,26 @@ dissect_parameter(tvbuff_t *parameter_tvb,  packet_info *pinfo, proto_tree *tree
   length         = tvb_get_ntohs(parameter_tvb, PARAMETER_LENGTH_OFFSET);
   padding_length = tvb_length(parameter_tvb) - length;
 
-  if (tree) {
-    /* Create proto_tree stuff */
-    /* If it's a known parameter it's present in the value_string.
-     * If param_tag_str = NULL then this is an unknown parameter
-     */
-        param_tag_str    = try_val_to_str(tag, parameter_tag_values);
-        if(param_tag_str) {
-            /* The parameter exists */
-            parameter_item   = proto_tree_add_text(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, tvb_length(parameter_tvb), "%s", param_tag_str);
-        } else {
-            if(dissector_try_uint(sua_parameter_table, tag, parameter_tvb, pinfo,tree)) {
-                return;
-            } else {
-                parameter_item   = proto_tree_add_text(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, tvb_length(parameter_tvb), "Unknown parameter");
-            }
-        }
-        parameter_tree   = proto_item_add_subtree(parameter_item, ett_sua_parameter);
-
-        /* Add tag and length to the sua tree */
-        proto_tree_add_item(parameter_tree, hf_sua_parameter_tag,    parameter_tvb, PARAMETER_TAG_OFFSET,    PARAMETER_TAG_LENGTH,    ENC_BIG_ENDIAN);
-        proto_tree_add_item(parameter_tree, hf_sua_parameter_length, parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH, ENC_BIG_ENDIAN);
+  /* Create proto_tree stuff */
+  /* If it's a known parameter it's present in the value_string.
+   * If param_tag_str = NULL then this is an unknown parameter
+   */
+  param_tag_str    = try_val_to_str(tag, parameter_tag_values);
+  if(param_tag_str) {
+    /* The parameter exists */
+    parameter_tree = proto_tree_add_subtree(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, -1, ett_sua_parameter, &parameter_item, param_tag_str);
   } else {
-        parameter_tree = NULL;
-        parameter_item = NULL;
+    if(dissector_try_uint(sua_parameter_table, tag, parameter_tvb, pinfo,tree)) {
+       return;
+    }
+
+    parameter_tree = proto_tree_add_subtree(tree, parameter_tvb, PARAMETER_HEADER_OFFSET, -1, ett_sua_parameter, &parameter_item, "Unknown parameter");
   }
 
+  /* Add tag and length to the sua tree */
+  proto_tree_add_item(parameter_tree, hf_sua_parameter_tag,    parameter_tvb, PARAMETER_TAG_OFFSET,    PARAMETER_TAG_LENGTH,    ENC_BIG_ENDIAN);
+  proto_tree_add_item(parameter_tree, hf_sua_parameter_length, parameter_tvb, PARAMETER_LENGTH_OFFSET, PARAMETER_LENGTH_LENGTH, ENC_BIG_ENDIAN);
+
   /*
   ** If no tree, only the data, ssn, PC, and GT parameters in the source and destination
   ** addresses need to be dissected. This in order to make dissection of the data
index a6fd003aa4bcd8b8f73369f82b523a631d6c9096..f7f95fa556ef45a06aff8bb402ae5a242a65f097 100644 (file)
@@ -670,8 +670,8 @@ static int dissect_config_frame(tvbuff_t *tvb, proto_item *config_item)
 
                /* STN with new tree to add the rest of the PMU block */
                str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, CHNAM_LEN, ENC_ASCII);
-               station_item = proto_tree_add_text(config_tree, tvb, offset, CHNAM_LEN, "Station #%i: \"%s\"", j + 1, str);
-               station_tree = proto_item_add_subtree(station_item, ett_conf_station);
+               station_tree = proto_tree_add_subtree_format(config_tree, tvb, offset, CHNAM_LEN,
+                                               ett_conf_station, &station_item, "Station #%i: \"%s\"", j + 1, str);
                offset += CHNAM_LEN;
 
                /* IDCODE */
@@ -782,9 +782,9 @@ static int dissect_data_frame(tvbuff_t        *tvb,
        for (i = 0; i < wmem_array_get_count(conf->config_blocks); i++) {
                config_block *block = (config_block*)wmem_array_index(conf->config_blocks, i);
 
-               proto_item *block_item = proto_tree_add_text(data_tree, tvb, offset, BLOCKSIZE(*block),
-                                                "Station: \"%s\"", block->name);
-               proto_tree *block_tree = proto_item_add_subtree(block_item, ett_data_block);
+               proto_item *block_item;
+               proto_tree *block_tree = proto_tree_add_subtree_format(data_tree, tvb, offset, BLOCKSIZE(*block),
+                                                ett_data_block, &block_item, "Station: \"%s\"", block->name);
 
                /* STAT */
                proto_item *temp_item = proto_tree_add_text(block_tree, tvb, offset, 2, "Flags");
@@ -905,8 +905,7 @@ static gint dissect_PHASORS(tvbuff_t *tvb, proto_tree *tree, config_block *block
                return offset;
 
        length      = wmem_array_get_count(block->phasors) * (floating_point == block->format_ph ? 8 : 4);
-       temp_item   = proto_tree_add_text(tree, tvb, offset, length, "Phasors (%u)", cnt);
-       phasor_tree = proto_item_add_subtree(temp_item, ett_data_phasors);
+       phasor_tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_data_phasors, NULL, "Phasors (%u)", cnt);
 
        /* dissect a phasor for every phasor_info saved in the config_block */
        for (j = 0; j < cnt; j++) {
@@ -984,9 +983,7 @@ static gint dissect_ANALOG(tvbuff_t *tvb, proto_tree *tree, config_block *block,
                return offset;
 
        length      = wmem_array_get_count(block->analogs) * (floating_point == block->format_an ? 4 : 2);
-       temp_item   = proto_tree_add_text(tree, tvb, offset, length, "Analog values (%u)", cnt);
-
-       analog_tree = proto_item_add_subtree(temp_item, ett_data_analog);
+       analog_tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_data_analog, NULL, "Analog values (%u)", cnt);
 
        for (j = 0; j < cnt; j++) {
                analog_info *ai = (analog_info *)wmem_array_index(block->analogs, j);
@@ -1014,15 +1011,13 @@ static gint dissect_ANALOG(tvbuff_t *tvb, proto_tree *tree, config_block *block,
 /* used by 'dissect_data_frame()' to dissect the DIGITAL field */
 static gint dissect_DIGITAL(tvbuff_t *tvb, proto_tree *tree, config_block *block, gint offset)
 {
-       proto_item *digital_item = NULL;
        gint        j,
                    cnt = block->num_dg; /* number of digital status words to dissect */
 
        if (0 == cnt)
                return offset;
 
-       digital_item = proto_tree_add_text(tree, tvb, offset, cnt * 2, "Digital status words (%u)", cnt);
-       tree         = proto_item_add_subtree(digital_item, ett_data_digital);
+       tree = proto_tree_add_subtree_format(tree, tvb, offset, cnt * 2, ett_data_digital, NULL, "Digital status words (%u)", cnt);
 
        for (j = 0; j < cnt; j++) {
                guint16 tmp = tvb_get_ntohs(tvb, offset);
@@ -1039,15 +1034,13 @@ static gint dissect_DIGITAL(tvbuff_t *tvb, proto_tree *tree, config_block *block
 /* used by 'dissect_config_frame()' to dissect the PHUNIT field */
 static gint dissect_PHUNIT(tvbuff_t *tvb, proto_tree *tree, gint offset, gint cnt)
 {
-       proto_item *temp_item = NULL;
-       proto_tree *temp_tree = NULL;
+       proto_tree *temp_tree;
        int i;
 
        if (0 == cnt)
                return offset;
 
-       temp_item = proto_tree_add_text(tree, tvb, offset, 4 * cnt, "Phasor conversation factors (%u)", cnt);
-       temp_tree = proto_item_add_subtree(temp_item, ett_conf_phconv);
+       temp_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * cnt, ett_conf_phconv, NULL, "Phasor conversation factors (%u)", cnt);
 
        /* Conversion factor for phasor channels. Four bytes for each phasor.
         * MSB:           0 = voltage, 1 = current
@@ -1069,15 +1062,14 @@ static gint dissect_PHUNIT(tvbuff_t *tvb, proto_tree *tree, gint offset, gint cn
 /* used by 'dissect_config_frame()' to dissect the ANUNIT field */
 static gint dissect_ANUNIT(tvbuff_t *tvb, proto_tree *tree, gint offset, gint cnt)
 {
-       proto_item *temp_item = NULL;
-       proto_tree *temp_tree = NULL;
+       proto_item *temp_item;
+       proto_tree *temp_tree;
        int i;
 
        if (0 == cnt)
                return offset;
 
-       temp_item = proto_tree_add_text(tree, tvb, offset, 4 * cnt, "Analog values conversation factors (%u)", cnt);
-       temp_tree = proto_item_add_subtree(temp_item, ett_conf_anconv);
+       temp_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * cnt, ett_conf_anconv, NULL, "Analog values conversation factors (%u)", cnt);
 
        /* Conversation factor for analog channels. Four bytes for each analog value.
         * MSB: see 'synphasor_conf_anconvnames' in 'synphasor_strings.c'
@@ -1105,15 +1097,14 @@ static gint dissect_ANUNIT(tvbuff_t *tvb, proto_tree *tree, gint offset, gint cn
 /* used by 'dissect_config_frame()' to dissect the DIGUNIT field */
 static gint dissect_DIGUNIT(tvbuff_t *tvb, proto_tree *tree, gint offset, gint cnt)
 {
-       proto_item *temp_item = NULL;
-       proto_tree *temp_tree = NULL;
+       proto_item *temp_item;
+       proto_tree *temp_tree;
        int i;
 
        if (0 == cnt)
                return offset;
 
-       temp_item = proto_tree_add_text(tree, tvb, offset, 4 * cnt, "Masks for digital status words (%u)", cnt);
-       temp_tree = proto_item_add_subtree(temp_item, ett_conf_dgmask);
+       temp_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * cnt, ett_conf_dgmask, NULL, "Masks for digital status words (%u)", cnt);
 
        /* Mask words for digital status words. Two 16-bit words for each digital word. The first
         * inidcates the normal status of the inputs, the second indicated the valid bits in
@@ -1135,15 +1126,13 @@ static gint dissect_DIGUNIT(tvbuff_t *tvb, proto_tree *tree, gint offset, gint c
 /* used by 'dissect_config_frame()' to dissect the "channel name"-fields */
 static gint dissect_CHNAM(tvbuff_t *tvb, proto_tree *tree, gint offset, gint cnt, const char *prefix)
 {
-       proto_item *temp_item = NULL;
-       proto_tree *temp_tree = NULL;
+       proto_tree *temp_tree;
        int i;
 
        if (0 == cnt)
                return offset;
 
-       temp_item = proto_tree_add_text(tree, tvb, offset, CHNAM_LEN * cnt, "%ss (%u)", prefix, cnt);
-       temp_tree = proto_item_add_subtree(temp_item, ett_conf_phnam);
+       temp_tree = proto_tree_add_subtree_format(tree, tvb, offset, CHNAM_LEN * cnt, ett_conf_phnam, NULL, "%ss (%u)", prefix, cnt);
 
        /* dissect the 'cnt' channel names */
        for (i = 0; i < cnt; i++) {