diff options
author | Michael Mann <mmann78@netscape.net> | 2014-06-26 20:33:02 -0400 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2014-06-29 13:10:02 +0000 |
commit | fe4b7ee625c046bc09a7d8ae55afb0e16cb17fc3 (patch) | |
tree | c4311cf830bd0ccc100f7a59808f39609ba02b24 /epan | |
parent | e1a8c9599fadc787253115316c549e849f377fd2 (diff) |
convert to proto_tree_add_subtree[_format]
Change-Id: If110de1e0555637264f86f1508858d569871a9c7
Reviewed-on: https://code.wireshark.org/review/2675
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan')
23 files changed, 812 insertions, 1130 deletions
diff --git a/epan/dissectors/packet-gadu-gadu.c b/epan/dissectors/packet-gadu-gadu.c index 4c9c4ae265..2e52e67e6c 100644 --- a/epan/dissectors/packet-gadu-gadu.c +++ b/epan/dissectors/packet-gadu-gadu.c @@ -1352,13 +1352,12 @@ static int dissect_gadu_gadu_notify_common(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset) { proto_tree *contact_tree; - proto_item *ti; while (tvb_reported_length_remaining(tvb, offset) >= 4+1) { guint32 uin = tvb_get_letohl(tvb, offset); - ti = proto_tree_add_text(tree, tvb, offset, 5, "Contact: %u", uin); - contact_tree = proto_item_add_subtree(ti, ett_gadu_gadu_contact); + contact_tree = proto_tree_add_subtree_format(tree, tvb, offset, 5, + ett_gadu_gadu_contact, NULL, "Contact: %u", uin); proto_tree_add_item(contact_tree, &hfi_gadu_gadu_contact_uin, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; @@ -1399,8 +1398,7 @@ dissect_gadu_gadu_notify105(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, char *uin; - ti = proto_tree_add_text(tree, tvb, offset, 0, "Contact: "); - contact_tree = proto_item_add_subtree(ti, ett_gadu_gadu_contact); + contact_tree = proto_tree_add_subtree(tree, tvb, offset, 0, ett_gadu_gadu_contact, &ti, "Contact: "); offset = dissect_gadu_gadu_notify105_common(tvb, contact_tree, offset, &uin); proto_item_append_text(ti, "%s", uin); diff --git a/epan/dissectors/packet-gearman.c b/epan/dissectors/packet-gearman.c index cb7004e470..93d1dfe5ac 100644 --- a/epan/dissectors/packet-gearman.c +++ b/epan/dissectors/packet-gearman.c @@ -206,9 +206,8 @@ dissect_binary_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* ti = proto_tree_add_item(tree, proto_gearman, tvb, 0, -1, ENC_NA); gearman_tree = proto_item_add_subtree(ti, ett_gearman); - ti = proto_tree_add_text(gearman_tree, tvb, 0, GEARMAN_COMMAND_HEADER_SIZE+size, + command_tree = proto_tree_add_subtree_format(gearman_tree, tvb, 0, GEARMAN_COMMAND_HEADER_SIZE+size, ett_gearman_command, NULL, "[%s] %s(%d) LEN=%d", magic_code, val_to_str(type, gearman_command_names, "Unknown (0x%08x)"), type, size); - command_tree = proto_item_add_subtree(ti, ett_gearman_command); proto_tree_add_string(command_tree, hf_gearman_magic_code, tvb, 0, 4, magic_code); proto_tree_add_item(command_tree, hf_gearman_pkt_type, tvb, 4, 4, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-ged125.c b/epan/dissectors/packet-ged125.c index aeb8de407a..e75936de90 100644 --- a/epan/dissectors/packet-ged125.c +++ b/epan/dissectors/packet-ged125.c @@ -633,8 +633,7 @@ floating_fields(tvbuff_t* tvb, packet_info *pinfo, proto_tree* tree, gint offset if (size - offset > 0) length = size - offset; - ti = proto_tree_add_text(tree, tvb, offset, length, "Float Message"); - ged125_tree = proto_item_add_subtree(ti, ett_ged125_floating); + ged125_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ged125_floating, NULL, "Float Message"); /*The Universal Floating-Fields Loop of Fun*/ while (offset < size-2) @@ -730,8 +729,8 @@ service_control_dissect(tvbuff_t* tvb,proto_tree* msg_tree, proto_tree* ged125_t proto_tree *service_tree, *data_tree; guint32 mess_type, DialogueID, SendSeqNo; - ti = proto_tree_add_text(msg_tree, tvb, *offset, 12, "Service-Control Header"); - service_tree = proto_item_add_subtree(ti, ett_ged125_service_control_header); + service_tree = proto_tree_add_subtree(msg_tree, tvb, *offset, 12, + ett_ged125_service_control_header, NULL, "Service-Control Header"); /* get message sub type, don't want to output that just yet */ mess_type = tvb_get_ntohl(tvb, *offset); @@ -1006,14 +1005,12 @@ dissect_ged125_base_messages(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree ged125_tree = proto_item_add_subtree( ti, ett_ged125); /* Message header */ - ti = proto_tree_add_text(ged125_tree, tvb, 0, 8, "GED125 Header"); - ged125_header_tree = proto_item_add_subtree(ti, ett_ged125_header); + ged125_header_tree = proto_tree_add_subtree(ged125_tree, tvb, 0, 8, ett_ged125_header, NULL, "GED125 Header"); proto_tree_add_item(ged125_header_tree, hf_ged125_length, tvb, 0, 4, ENC_BIG_ENDIAN); proto_tree_add_item(ged125_header_tree, hf_ged125_value, tvb, 4, 4, ENC_BIG_ENDIAN); - message_item = proto_tree_add_text(ged125_tree, tvb, offset, -1, "GED125 Message"); - ged125_message_tree = proto_item_add_subtree(message_item, ett_ged125_message); + ged125_message_tree = proto_tree_add_subtree(ged125_tree, tvb, offset, -1, ett_ged125_message, &message_item, "GED125 Message"); switch (message_type) { diff --git a/epan/dissectors/packet-giop.c b/epan/dissectors/packet-giop.c index cf24e08237..b6a723a5b8 100644 --- a/epan/dissectors/packet-giop.c +++ b/epan/dissectors/packet-giop.c @@ -3875,8 +3875,7 @@ static void decode_ServiceContextList(tvbuff_t *tvb, packet_info *pinfo _U_, pro /* set length to -1 (to the end) now and correct with proto_item_set_len() * later */ - tf = proto_tree_add_text (ptree, tvb, *offset, -1, "ServiceContextList"); - tree = proto_item_add_subtree (tf, ett_giop_scl); + tree = proto_tree_add_subtree(ptree, tvb, *offset, -1, ett_giop_scl, &tf, "ServiceContextList"); /* Get sequence length (number of elements) */ seqlen = get_CDR_ulong(tvb, offset, stream_is_be, boundary); @@ -4150,11 +4149,9 @@ static void dissect_giop_reply (tvbuff_t * tvb, packet_info * pinfo, proto_tree guint32 request_id; guint32 reply_status; proto_tree *reply_tree; - proto_item *tf; guint32 mfn; /* matching frame number */ - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Protocol Reply"); - reply_tree = proto_item_add_subtree (tf, ett_giop_reply); + reply_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_giop_reply, NULL, "General Inter-ORB Protocol Reply"); /* * Decode IOP::ServiceContextList @@ -4214,11 +4211,9 @@ static void dissect_giop_reply_1_2 (tvbuff_t * tvb, packet_info * pinfo, guint32 request_id; guint32 reply_status; proto_tree *reply_tree; - proto_item *tf; guint32 mfn; /* matching frame number */ - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Protocol Reply"); - reply_tree = proto_item_add_subtree (tf, ett_giop_reply); + reply_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_giop_reply, NULL, "General Inter-ORB Protocol Reply"); request_id = get_CDR_ulong(tvb, &offset, stream_is_big_endian, GIOP_HEADER_SIZE); col_append_fstr(pinfo->cinfo, COL_INFO, " id=%u", request_id); @@ -4271,10 +4266,9 @@ static void dissect_giop_cancel_request (tvbuff_t * tvb, packet_info * pinfo, guint offset = 0; guint32 request_id; proto_tree *cancel_request_tree; - proto_item *tf; - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Protocol CancelRequest"); - cancel_request_tree = proto_item_add_subtree (tf, ett_giop_cancel_request); + cancel_request_tree = proto_tree_add_subtree(tree, tvb, offset, -1, + ett_giop_cancel_request, NULL, "General Inter-ORB Protocol CancelRequest"); request_id = get_CDR_ulong(tvb, &offset, stream_is_big_endian, GIOP_HEADER_SIZE); col_append_fstr(pinfo->cinfo, COL_INFO, " id=%u", request_id); @@ -4317,8 +4311,7 @@ dissect_giop_request_1_1 (tvbuff_t * tvb, packet_info * pinfo, gchar *repoid; /* from object key lookup in objkey hash */ - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Protocol Request"); - request_tree = proto_item_add_subtree (tf, ett_giop_request); + request_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_giop_request, &tf, "General Inter-ORB Protocol Request"); /* * Decode IOP::ServiceContextList @@ -4477,15 +4470,13 @@ dissect_giop_request_1_2 (tvbuff_t * tvb, packet_info * pinfo, const gchar *reserved; const gchar *operation = NULL; proto_tree *request_tree; - proto_item *tf; gboolean exres = FALSE; /* result of trying explicit dissectors */ guint32 objkey_len = 0; /* object key length */ const gchar *objkey = NULL; /* object key sequence */ gchar *repoid = NULL; /* from object key lookup in objkey hash */ - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Protocol Request"); - request_tree = proto_item_add_subtree (tf, ett_giop_request); + request_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_giop_request, NULL, "General Inter-ORB Protocol Request"); request_id = get_CDR_ulong(tvb, &offset, stream_is_big_endian, GIOP_HEADER_SIZE); header->req_id = request_id; @@ -4583,8 +4574,8 @@ dissect_giop_locate_request( tvbuff_t * tvb, packet_info * pinfo, proto_tree *locate_request_tree; proto_item *tf; - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Locate Request"); - locate_request_tree = proto_item_add_subtree (tf, ett_giop_locate_request); + locate_request_tree = proto_tree_add_subtree(tree, tvb, offset, -1, + ett_giop_locate_request, &tf, "General Inter-ORB Locate Request"); request_id = get_CDR_ulong(tvb, &offset, stream_is_big_endian, GIOP_HEADER_SIZE); col_append_fstr(pinfo->cinfo, COL_INFO, " id=%u op=LocateRequest", request_id); @@ -4622,10 +4613,8 @@ dissect_giop_locate_reply( tvbuff_t * tvb, packet_info * pinfo, guint16 addr_disp; proto_tree *locate_reply_tree; - proto_item *tf; - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Locate Reply"); - locate_reply_tree = proto_item_add_subtree (tf, ett_giop_locate_reply); + locate_reply_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_giop_locate_reply, NULL, "General Inter-ORB Locate Reply"); request_id = get_CDR_ulong(tvb, &offset, stream_is_big_endian, GIOP_HEADER_SIZE); col_append_fstr(pinfo->cinfo, COL_INFO, " id=%u", request_id); @@ -4671,10 +4660,8 @@ dissect_giop_fragment( tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, guint32 offset = 0; guint32 request_id; proto_tree *fragment_tree; - proto_item *tf; - tf = proto_tree_add_text (tree, tvb, offset, -1, "General Inter-ORB Fragment"); - fragment_tree = proto_item_add_subtree (tf, ett_giop_fragment); + fragment_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_giop_fragment, NULL, "General Inter-ORB Fragment"); request_id = get_CDR_ulong(tvb, &offset, stream_is_big_endian, GIOP_HEADER_SIZE); col_append_fstr(pinfo->cinfo, COL_INFO, " id=%u", request_id); @@ -4717,13 +4704,11 @@ static int dissect_giop_common (tvbuff_t * tvb, packet_info * pinfo, proto_tree stream_is_big_endian = is_big_endian (&header); /* Dissect GIOP header */ - ti = proto_tree_add_text (giop_tree, tvb, offset, GIOP_HEADER_SIZE, "GIOP Header"); - header_tree = proto_item_add_subtree (ti, ett_giop_header); + header_tree = proto_tree_add_subtree(giop_tree, tvb, offset, GIOP_HEADER_SIZE, ett_giop_header, NULL, "GIOP Header"); proto_tree_add_item(header_tree, hf_giop_message_magic, tvb, 0, 4, ENC_NA|ENC_ASCII); - version_item = proto_tree_add_text (header_tree, tvb, 4, 2, + header_version_tree = proto_tree_add_subtree_format(header_tree, tvb, 4, 2, ett_giop_header_version, &version_item, "Version: %u.%u", header.GIOP_version.major, header.GIOP_version.minor); - header_version_tree = proto_item_add_subtree (version_item, ett_giop_header_version); proto_tree_add_item(header_version_tree, hf_giop_message_major_version, tvb, 4, 1, ENC_NA); proto_tree_add_item(header_version_tree, hf_giop_message_minor_version, tvb, 5, 1, ENC_NA); @@ -5515,15 +5500,13 @@ static void decode_IOR(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int guint32 u_octet4; proto_tree *tree; /* IOR tree */ - proto_item *tf; const gchar *repobuf; /* for repository ID */ guint32 i; /* create a subtree */ - tf = proto_tree_add_text (ptree, tvb, *offset, -1, "IOR"); - tree = proto_item_add_subtree (tf, ett_giop_ior); + tree = proto_tree_add_subtree(ptree, tvb, *offset, -1, ett_giop_ior, NULL, "IOR"); /* Get type_id == Repository ID */ diff --git a/epan/dissectors/packet-gluster_pmap.c b/epan/dissectors/packet-gluster_pmap.c index 1db553f360..648f276fdb 100644 --- a/epan/dissectors/packet-gluster_pmap.c +++ b/epan/dissectors/packet-gluster_pmap.c @@ -100,16 +100,13 @@ gluster_dump_reply_detail(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *detail_tree; const gchar *progname = NULL; - detail_item = proto_tree_add_text(tree, tvb, offset, -1, - "Available Progam: "); - detail_tree = proto_item_add_subtree(detail_item, - ett_gluster_dump_detail); + detail_tree = proto_tree_add_subtree(tree, tvb, offset, -1, + ett_gluster_dump_detail, &detail_item, "Available Progam: "); /* progname */ offset = dissect_rpc_string(tvb, detail_tree, hf_gluster_progname, offset, &progname); - if (tree) - proto_item_append_text(detail_item, "%s", progname); + proto_item_append_text(detail_item, "%s", progname); /* prognumber (marked as uint64) */ offset = dissect_rpc_uint64(tvb, detail_tree, hf_gluster_prognum, diff --git a/epan/dissectors/packet-glusterfs.c b/epan/dissectors/packet-glusterfs.c index 23a2d45f97..580834db42 100644 --- a/epan/dissectors/packet-glusterfs.c +++ b/epan/dissectors/packet-glusterfs.c @@ -342,8 +342,7 @@ glusterfs_rpc_dissect_gf_2_flock(proto_tree *tree, tvbuff_t *tvb, int offset) int len; int start_offset = offset; - flock_item = proto_tree_add_text(tree, tvb, offset, -1, "Flock"); - flock_tree = proto_item_add_subtree(flock_item, ett_glusterfs_flock); + flock_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_glusterfs_flock, &flock_item, "Flock"); offset = dissect_rpc_uint32(tvb, flock_tree, hf_glusterfs_flock_type, offset); @@ -500,9 +499,7 @@ gluster_rpc_dissect_dict(proto_tree *tree, tvbuff_t *tvb, int hfindex, int offse name = "<NAMELESS DICT STRUCTURE>"; start_offset = offset; - subtree_item = proto_tree_add_text(tree, tvb, offset, -1, "%s", name); - - subtree = proto_item_add_subtree(subtree_item, ett_gluster_dict); + subtree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_gluster_dict, &subtree_item, name); len = tvb_get_ntohl(tvb, offset); roundup = rpc_roundup(len) - len; @@ -779,8 +776,7 @@ glusterfs_gfs3_op_inodelk_call(tvbuff_t *tvb, int offset, offset = dissect_rpc_uint32(tvb, tree, hf_glusterfs_type, offset); start_offset = offset; - flock_item = proto_tree_add_text(tree, tvb, offset, -1, "Flock"); - flock_tree = proto_item_add_subtree(flock_item, ett_glusterfs_flock); + flock_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_glusterfs_flock, &flock_item, "Flock"); offset = glusterfs_rpc_dissect_gf_flock(flock_tree, tvb, offset); proto_item_set_len (flock_item, offset - start_offset); @@ -798,8 +794,7 @@ _glusterfs_gfs_op_readdir_entry(tvbuff_t *tvb, int offset, proto_tree *tree, const gchar* path = NULL; int start_offset = offset; - entry_item = proto_tree_add_text(tree, tvb, offset, -1, "Entry"); - entry_tree = proto_item_add_subtree(entry_item, ett_glusterfs_entry); + entry_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_glusterfs_entry, &entry_item, "Entry"); offset = dissect_rpc_uint64(tvb, entry_tree, hf_glusterfs_entry_ino, offset); offset = dissect_rpc_uint64(tvb, entry_tree, hf_glusterfs_entry_off, offset); @@ -1100,8 +1095,8 @@ glusterfs_gfs3_3_op_rename_reply(tvbuff_t *tvb, int offset, packet_info *pinfo, offset); start_offset = offset; - old_item = proto_tree_add_text(tree, tvb, offset, -1, "Old parent"); - old_tree = proto_item_add_subtree(old_item, ett_glusterfs_parent_iatt); + old_tree = proto_tree_add_subtree(tree, tvb, offset, -1, + ett_glusterfs_parent_iatt, &old_item, "Old parent"); offset = glusterfs_rpc_dissect_gf_iatt(old_tree, tvb, hf_glusterfs_preparent_iatt, offset); offset = glusterfs_rpc_dissect_gf_iatt(old_tree, tvb, @@ -1109,8 +1104,7 @@ glusterfs_gfs3_3_op_rename_reply(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_item_set_len (old_item, offset - start_offset); start_offset = offset; - new_item = proto_tree_add_text(tree, tvb, offset, -1, "New parent"); - new_tree = proto_item_add_subtree(new_item, ett_glusterfs_parent_iatt); + new_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_glusterfs_parent_iatt, &new_item, "New parent"); offset = glusterfs_rpc_dissect_gf_iatt(new_tree, tvb, hf_glusterfs_preparent_iatt, offset); offset = glusterfs_rpc_dissect_gf_iatt(new_tree, tvb, diff --git a/epan/dissectors/packet-gmr1_rach.c b/epan/dissectors/packet-gmr1_rach.c index 390d5013d0..c53a2db214 100644 --- a/epan/dissectors/packet-gmr1_rach.c +++ b/epan/dissectors/packet-gmr1_rach.c @@ -409,7 +409,7 @@ static void dissect_gmr1_rach_kls2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int is_moc) { - proto_item *dialed_num_item = NULL, *gps_pos_item = NULL; + proto_item *dialed_num_item = NULL; proto_tree *dialed_num_tree = NULL, *gps_pos_tree = NULL; /* MES Power Class */ @@ -492,10 +492,9 @@ dissect_gmr1_rach_kls2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree tvb, offset + 9, 1, ENC_BIG_ENDIAN); /* GPS Position */ - gps_pos_item = proto_tree_add_text( + gps_pos_tree = proto_tree_add_subtree( tree, tvb, offset + 10, 5, - "GPS Position"); - gps_pos_tree = proto_item_add_subtree(gps_pos_item, ett_rach_gps_pos); + ett_rach_gps_pos, NULL, "GPS Position"); dissect_gmr1_rach_gps_pos(tvb, offset + 10, pinfo, gps_pos_tree); @@ -508,8 +507,8 @@ dissect_gmr1_rach_kls2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree static void dissect_gmr1_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *rach_item = NULL, *kls1_item = NULL, *kls2_item = NULL; - proto_tree *rach_tree = NULL, *kls1_tree = NULL, *kls2_tree = NULL; + proto_item *rach_item; + proto_tree *rach_tree, *kls1_tree, *kls2_tree; int len, is_moc; len = tvb_length(tvb); @@ -527,17 +526,15 @@ dissect_gmr1_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) col_append_str(pinfo->cinfo, COL_INFO, "(RACH) "); - kls1_item = proto_tree_add_text( + kls1_tree = proto_tree_add_subtree( rach_tree, tvb, 0, 2, - "Class-1 informations"); - kls1_tree = proto_item_add_subtree(kls1_item, ett_rach_kls1); + ett_rach_kls1, NULL, "Class-1 informations"); dissect_gmr1_rach_kls1(tvb, 0, pinfo, kls1_tree, &is_moc); - kls2_item = proto_tree_add_text( + kls2_tree = proto_tree_add_subtree( rach_tree, tvb, 2, 16, - "Class-2 informations"); - kls2_tree = proto_item_add_subtree(kls2_item, ett_rach_kls2); + ett_rach_kls2, NULL, "Class-2 informations"); dissect_gmr1_rach_kls2(tvb, 2, pinfo, kls2_tree, is_moc); } diff --git a/epan/dissectors/packet-gmr1_rr.c b/epan/dissectors/packet-gmr1_rr.c index 53376af02a..96c5eed9f3 100644 --- a/epan/dissectors/packet-gmr1_rr.c +++ b/epan/dissectors/packet-gmr1_rr.c @@ -1008,14 +1008,13 @@ static const crumb_spec_t rr_pkt_imm_ass_2_prm_ac_rlc_dblk_gnt_crumbs[] = { GMR1_IE_FUNC(gmr1_ie_rr_pkt_imm_ass_2_prm) { proto_tree *subtree_ac, *subtree_d; - proto_item *item_ac, *item_d; /* Terminal AC */ /* ----------- */ - item_ac = proto_tree_add_text(tree, tvb, offset, 5, "GMPRS Terminal type A or C"); - subtree_ac = proto_item_add_subtree(item_ac, ett_gmr1_ie_rr[GMR1_IE_RR_PKT_IMM_ASS_2_PRM]); + subtree_ac = proto_tree_add_subtree(tree, tvb, offset, 5, + ett_gmr1_ie_rr[GMR1_IE_RR_PKT_IMM_ASS_2_PRM], NULL, "GMPRS Terminal type A or C"); /* Spare */ proto_tree_add_item(subtree_ac, hf_rr_pkt_imm_ass_2_prm_ac_spare1, @@ -1067,8 +1066,8 @@ GMR1_IE_FUNC(gmr1_ie_rr_pkt_imm_ass_2_prm) /* Terminal D */ /* ---------- */ - item_d = proto_tree_add_text(tree, tvb, offset, 5, "GMPRS Terminal type D"); - subtree_d = proto_item_add_subtree(item_d, ett_gmr1_ie_rr[GMR1_IE_RR_PKT_IMM_ASS_2_PRM]); + subtree_d = proto_tree_add_subtree(tree, tvb, offset, 5, + ett_gmr1_ie_rr[GMR1_IE_RR_PKT_IMM_ASS_2_PRM], NULL, "GMPRS Terminal type D"); /* Channel MCS command */ proto_tree_add_item(subtree_d, hf_rr_pkt_imm_ass_2_prm_d_chan_mcs_cmd, diff --git a/epan/dissectors/packet-gpef.c b/epan/dissectors/packet-gpef.c index a492de46b9..9fbfb34d24 100644 --- a/epan/dissectors/packet-gpef.c +++ b/epan/dissectors/packet-gpef.c @@ -114,14 +114,12 @@ static int dissect_gpef_efsblob(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *parent_tree, void *data _U_) { int offset = 0; - proto_tree *tree = NULL; - proto_item *item = NULL; + proto_tree *tree; + proto_item *item; guint32 count; - if (parent_tree) { - item = proto_tree_add_item(parent_tree, proto_gpef, tvb, 0, -1, ENC_NA); - tree = proto_item_add_subtree(item, ett_gpef); - } + item = proto_tree_add_item(parent_tree, proto_gpef, tvb, 0, -1, ENC_NA); + tree = proto_item_add_subtree(item, ett_gpef); /* reserved, must be 0x01 0x00 0x01 0x00 */ offset += 4; diff --git a/epan/dissectors/packet-gprs-llc.c b/epan/dissectors/packet-gprs-llc.c index a6ce57bc31..ce855f2d96 100644 --- a/epan/dissectors/packet-gprs-llc.c +++ b/epan/dissectors/packet-gprs-llc.c @@ -326,7 +326,6 @@ static void llc_gprs_dissect_xid(tvbuff_t *tvb, guint8 xid_param_len = 0, byte1 = 0, byte2 = 0, item_len = 0, tmp = 0; guint16 location = 0; guint16 loop_counter = 0; - proto_item *u_ti = NULL; proto_item *uinfo_field = NULL; proto_tree *uinfo_tree = NULL; proto_tree *xid_tree = NULL; @@ -334,9 +333,8 @@ static void llc_gprs_dissect_xid(tvbuff_t *tvb, info_len = tvb_reported_length(tvb); - u_ti = proto_tree_add_text(llcgprs_tree, tvb, 0, info_len, - "Information Field: Length = %u", info_len); - xid_tree = proto_item_add_subtree(u_ti, ett_ui); + xid_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, 0, info_len, + ett_ui, NULL, "Information Field: Length = %u", info_len); while (location < info_len) { @@ -379,9 +377,8 @@ static void llc_gprs_dissect_xid(tvbuff_t *tvb, tvbuff_t *sndcp_xid_tvb; guint8 sndcp_xid_offset; - uinfo_field = proto_tree_add_text(xid_tree, tvb, location, item_len, - "XID parameter Type: L3 parameters"); - uinfo_tree = proto_item_add_subtree(uinfo_field, ett_ui); + uinfo_tree = proto_tree_add_subtree(xid_tree, tvb, location, item_len, + ett_ui, NULL, "XID parameter Type: L3 parameters"); proto_tree_add_uint(uinfo_tree, hf_llcgprs_xid_xl, tvb, location, 1, byte1); proto_tree_add_uint(uinfo_tree, hf_llcgprs_xid_type, tvb, location, 1, byte1); proto_tree_add_uint(uinfo_tree, hf_llcgprs_xid_len1, tvb, location, 1, byte1); @@ -468,7 +465,7 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint8 addr_fld=0, sapi=0, ctrl_fld_fb=0, frame_format, tmp=0; guint16 offset=0 , epm = 0, nu=0, ctrl_fld_ui_s=0; guint16 crc_length=0, llc_data_reported_length=0, llc_data_length = 0; - proto_item *ti, *addres_field_item, *ctrl_field_item, *ui_ti; + proto_item *ti, *addres_field_item, *ui_ti; proto_tree *llcgprs_tree=NULL , *ad_f_tree =NULL, *ctrl_f_tree=NULL, *ui_tree=NULL; tvbuff_t *next_tvb; guint length; @@ -482,7 +479,6 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint8 k = 0; guint8 m_bits = 0; guint8 info_len = 0; - proto_item *uinfo_field = NULL; proto_tree *uinfo_tree = NULL; /* END MLT CHANGES */ proto_item* fcs_item = NULL; @@ -655,10 +651,9 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint32 tmpx; - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, (offset-3), - 3, "Information format: %s: N(S) = %u, N(R) = %u", + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, (offset-3), + 3, ett_llcgprs_sframe, NULL, "Information format: %s: N(S) = %u, N(R) = %u", val_to_str(epm, cr_formats_ipluss, "Unknown (%d)"), ns, nr); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); /* retrieve the second octet */ tmpx = tvb_get_ntohs(tvb, (offset-3)) << 16; @@ -697,10 +692,9 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint8 r_byte = 0; guint16 location = offset; - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, (offset-1), - (k+1), "SACK FRAME: k = %u", k); + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, (offset-1), + (k+1), ett_llcgprs_sframe, NULL, "SACK FRAME: k = %u", k); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_kmask, tvb, offset-1, 1, kmask); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_k, tvb, offset-1, 1, k); @@ -731,12 +725,11 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) remaining_length = (tom_byte >> 4) & 0x0F; tom_pd = tom_byte & 0x0F; - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, offset, - (llc_data_reported_length-offset), "TOM Envelope - Protocol: %s", + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset, + (llc_data_reported_length-offset), ett_llcgprs_sframe, NULL, + "TOM Envelope - Protocol: %s", val_to_str(tom_pd, tompd_formats, "Unknown (%d)")); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); - proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_tom_rl, tvb, offset, 1, tom_byte); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_tom_pd, tvb, offset, 1, tom_byte); @@ -799,11 +792,10 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (tree) { - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, offset-2, 2, - "Supervisory format: %s: N(R) = %u", + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset-2, 2, + ett_llcgprs_sframe, NULL, "Supervisory format: %s: N(R) = %u", val_to_str(epm, cr_formats_ipluss, "Unknown (%d)"), nu); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_S_fmt, tvb, offset-2, 2, ctrl_fld_ui_s); proto_tree_add_boolean(ctrl_f_tree, hf_llcgprs_As, tvb, offset-2, @@ -830,9 +822,8 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint loop_count; guint8 r_byte; guint16 location = offset; - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, offset, - sack_length, "SACK FRAME: length = %u", sack_length); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset, sack_length, + ett_llcgprs_sframe, NULL, "SACK FRAME: length = %u", sack_length); /* display the R Bitmap */ for (loop_count = 0; loop_count < sack_length; loop_count++) { @@ -862,11 +853,9 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) remaining_length = (tom_byte >> 4) & 0x0F; tom_pd = tom_byte & 0x0F; - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, offset, - (llc_data_reported_length-offset), "TOM Envelope - Protocol: %s", - val_to_str(tom_pd, tompd_formats, "Unknown (%d)")); - - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset, + (llc_data_reported_length-offset), ett_llcgprs_sframe, NULL, + "TOM Envelope - Protocol: %s", val_to_str(tom_pd, tompd_formats, "Unknown (%d)")); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_tom_rl, tvb, offset, 1, tom_byte); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_tom_pd, tvb, offset, 1, tom_byte); @@ -924,9 +913,9 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (tree) { - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, offset-2, - 2, "Unconfirmed Information format - UI, N(U) = %u", nu); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_ctrlf); + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset-2, + 2, ett_llcgprs_ctrlf, NULL, + "Unconfirmed Information format - UI, N(U) = %u", nu); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_U_fmt, tvb, offset-2, 2, ctrl_fld_ui_s); @@ -967,12 +956,11 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) remaining_length = (tom_byte >> 4) & 0x0F; tom_pd = tom_byte & 0x0F; - ctrl_field_item = proto_tree_add_text(llcgprs_tree, tvb, offset, - (llc_data_reported_length-offset), "TOM Envelope - Protocol: %s", + ctrl_f_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset, + (llc_data_reported_length-offset), ett_llcgprs_sframe, NULL, + "TOM Envelope - Protocol: %s", val_to_str(tom_pd, tompd_formats, "Unknown (%d)")); - ctrl_f_tree = proto_item_add_subtree(ctrl_field_item, ett_llcgprs_sframe); - proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_tom_rl, tvb, offset, 1, tom_byte); proto_tree_add_uint(ctrl_f_tree, hf_llcgprs_tom_pd, tvb, offset, 1, tom_byte); @@ -1097,13 +1085,11 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) int loop_counter = 0; int location = 0; - ui_ti = proto_tree_add_text(llcgprs_tree, tvb, offset, (llc_data_reported_length-2), - "Information Field: Length = %u", info_len); - ui_tree = proto_item_add_subtree(ui_ti, ett_ui); + ui_tree = proto_tree_add_subtree_format(llcgprs_tree, tvb, offset, (llc_data_reported_length-2), + ett_ui, NULL, "Information Field: Length = %u", info_len); - uinfo_field = proto_tree_add_text(ui_tree, tvb, offset, 6, - "Rejected Frame Control Field"); - uinfo_tree = proto_item_add_subtree(uinfo_field, ett_ui); + uinfo_tree = proto_tree_add_subtree(ui_tree, tvb, offset, 6, + ett_ui, NULL, "Rejected Frame Control Field"); location = offset; for (loop_counter = 0; loop_counter < 3; loop_counter++) @@ -1116,9 +1102,8 @@ dissect_llcgprs(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) location += 2; } - uinfo_field = proto_tree_add_text(ui_tree, tvb, location, 4, - "Information Field Data"); - uinfo_tree = proto_item_add_subtree(uinfo_field, ett_ui); + uinfo_tree = proto_tree_add_subtree(ui_tree, tvb, location, 4, + ett_ui, NULL, "Information Field Data"); fld_vars = tvb_get_ntohl(tvb, location); proto_tree_add_uint(uinfo_tree, hf_llcgprs_frmr_spare, tvb, location, diff --git a/epan/dissectors/packet-gre.c b/epan/dissectors/packet-gre.c index 44fbcab4f0..2158926fec 100644 --- a/epan/dissectors/packet-gre.c +++ b/epan/dissectors/packet-gre.c @@ -235,9 +235,8 @@ dissect_gre_3gpp2_attribs(tvbuff_t *tvb, int offset, proto_tree *tree) guint8 attrib_id = tvb_get_guint8(tvb, offset); guint8 attrib_length = tvb_get_guint8(tvb, offset + 1); - attr_item = proto_tree_add_text(atree, tvb, offset, attrib_length + 1 + 1, "%s", + attr_tree = proto_tree_add_subtree(atree, tvb, offset, attrib_length + 1 + 1, ett_3gpp2_attr, &attr_item, val_to_str((attrib_id&0x7f), gre_3ggp2_attrib_id_vals, "%u (Unknown)")); - attr_tree = proto_item_add_subtree(attr_item, ett_3gpp2_attr); proto_tree_add_item(attr_tree, hf_gre_3ggp2_attrib_id, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(attr_tree, hf_gre_3ggp2_attrib_length, tvb, offset+1, 1, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-gsm_a_bssmap.c b/epan/dissectors/packet-gsm_a_bssmap.c index 284d7a2e9d..bc015c1f34 100644 --- a/epan/dissectors/packet-gsm_a_bssmap.c +++ b/epan/dissectors/packet-gsm_a_bssmap.c @@ -2059,16 +2059,13 @@ be_dlci(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, { guint8 oct; guint32 curr_offset; - proto_item *item = NULL; - proto_tree *subtree = NULL; + proto_tree *subtree; curr_offset = offset; - item = - proto_tree_add_text(tree, tvb, curr_offset, 1, - "Data Link Connection Identifier"); - - subtree = proto_item_add_subtree(item, ett_dlci); + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, + ett_dlci, NULL, "Data Link Connection Identifier"); oct = tvb_get_guint8(tvb, curr_offset); @@ -2141,14 +2138,12 @@ be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 off num_cells = 0; do { - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, - "Cell %u", + ett_cell_list, &item, "Cell %u", num_cells + 1); - subtree = proto_item_add_subtree(item, ett_cell_list); - if (add_string) add_string[0] = '\0'; @@ -3962,8 +3957,8 @@ be_speech_codec_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui while (curr_offset-offset < len) { number++; consumed = 0; - item = proto_tree_add_text(tree, tvb, curr_offset, 1, "Speech Codec Element %u",number); - subtree = proto_item_add_subtree(item, ett_codec_lst); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1, + ett_codec_lst, &item, "Speech Codec Element %u",number); codec = tvb_get_guint8(tvb,curr_offset)&0x0f; switch (codec) { case 0: @@ -4116,8 +4111,8 @@ be_speech_codec(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 while (curr_offset-offset < len) { number++; consumed = 0; - item = proto_tree_add_text(tree, tvb, curr_offset, 1, "Speech Codec Element %u",number); - subtree = proto_item_add_subtree(item, ett_codec_lst); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1, ett_codec_lst, &item, + "Speech Codec Element %u",number); codec = tvb_get_guint8(tvb,curr_offset)&0x0f; switch (codec) { case 0: diff --git a/epan/dissectors/packet-gsm_a_common.c b/epan/dissectors/packet-gsm_a_common.c index b676e20b30..2a1c7da81b 100644 --- a/epan/dissectors/packet-gsm_a_common.c +++ b/epan/dissectors/packet-gsm_a_common.c @@ -733,6 +733,7 @@ static int hf_gsm_a_geo_loc_offset_angle = -1; static int hf_gsm_a_geo_loc_included_angle = -1; static expert_field ei_gsm_a_extraneous_data = EI_INIT; +static expert_field ei_gsm_a_unknown_element = EI_INIT; static char a_bigbuf[1024]; @@ -1249,17 +1250,16 @@ guint16 elem_tlv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = - proto_tree_add_text(tree, - tvb, curr_offset, parm_len + 1 + lengt_length, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, parm_len + 1 + lengt_length, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, parm_len + 1 + lengt_length, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); proto_tree_add_uint(subtree, get_hf_elem_id(pdu_type), tvb, @@ -1342,17 +1342,16 @@ guint16 elem_telv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 ie elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = - proto_tree_add_text(tree, - tvb, curr_offset, parm_len + 1 + lengt_length, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, parm_len + 1 + lengt_length, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, parm_len + 1 + lengt_length, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); proto_tree_add_uint(subtree, get_hf_elem_id(pdu_type), tvb, @@ -1427,15 +1426,16 @@ guint16 elem_tlv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 i elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = proto_tree_add_text(tree, tvb, curr_offset, parm_len + 1 + 2, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, parm_len + 1 + 2, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, parm_len + 1 + 2, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); proto_tree_add_uint(subtree, get_hf_elem_id(pdu_type), tvb, @@ -1506,16 +1506,16 @@ guint16 elem_tv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint8 iei, { elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = - proto_tree_add_text(tree, tvb, curr_offset, -1, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, -1, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); proto_tree_add_uint(subtree, get_hf_elem_id(pdu_type), tvb, @@ -1584,17 +1584,16 @@ guint16 elem_tv_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint { elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = - proto_tree_add_text(tree, - tvb, curr_offset, -1, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, -1, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); other_decode_bitfield_value(buf, oct, 0xf0, 8); proto_tree_add_text(subtree, @@ -1694,17 +1693,16 @@ elem_lv(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_type, int elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = - proto_tree_add_text(tree, - tvb, curr_offset, parm_len + 1, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, parm_len + 1, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, parm_len + 1, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, curr_offset, 1, parm_len); @@ -1763,15 +1761,16 @@ guint16 elem_lv_e(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_ elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = proto_tree_add_text(tree, tvb, curr_offset, parm_len + 2, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, parm_len + 2, + "Unknown - aborting dissection%s", (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, parm_len + 2, elem_ett[idx], &item, + "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); proto_tree_add_uint(subtree, hf_gsm_a_length, tvb, curr_offset, 2, parm_len); @@ -1843,14 +1842,12 @@ guint16 elem_v(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint pdu_typ { gchar *a_add_string; - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree_format(tree, tvb, curr_offset, 0, - "%s%s", elem_name, + elem_ett[idx], &item, "%s%s", elem_name, (name_add == NULL) || (name_add[0] == '\0') ? "" : name_add); - subtree = proto_item_add_subtree(item, elem_ett[idx]); - a_add_string= (gchar*)wmem_alloc(wmem_packet_scope(), 1024); a_add_string[0] = '\0'; consumed = (*elem_funcs[idx])(tvb, subtree, pinfo, curr_offset, -1, a_add_string, 1024); @@ -1889,16 +1886,14 @@ guint16 elem_v_short(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint p elem_name = try_val_to_str_ext(idx, &elem_names_ext); - item = proto_tree_add_text(tree, - tvb, curr_offset, 0, - "%s%s", elem_name ? elem_name : "Unknown - aborting dissection", - ""); - /* idx is out of range */ - if (elem_name == NULL) + if (elem_name == NULL) { + proto_tree_add_expert(tree, pinfo, &ei_gsm_a_unknown_element, + tvb, curr_offset, 0); return consumed; + } - subtree = proto_item_add_subtree(item, elem_ett[idx]); + subtree = proto_tree_add_subtree(tree, tvb, curr_offset, 0, elem_ett[idx], &item, elem_name); a_add_string= (gchar*)wmem_alloc(wmem_packet_scope(), 1024); a_add_string[0] = '\0'; @@ -2149,12 +2144,10 @@ de_lai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guin curr_offset = offset; - item = proto_tree_add_text(tree, - tvb, curr_offset, 5, "%s", + subtree = proto_tree_add_subtree(tree, + tvb, curr_offset, 5, ett_gsm_common_elem[DE_LAI], &item, val_to_str_ext_const(DE_LAI, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_LAI]); - octs[0] = tvb_get_guint8(tvb, curr_offset); octs[1] = tvb_get_guint8(tvb, curr_offset + 1); octs[2] = tvb_get_guint8(tvb, curr_offset + 2); @@ -2379,17 +2372,14 @@ de_ms_cm_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offs { guint32 curr_offset; proto_tree *subtree; - proto_item *item; curr_offset = offset; - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_MS_CM_1], NULL, val_to_str_ext_const(DE_MS_CM_1, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_MS_CM_1]); - proto_tree_add_item(subtree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(subtree, hf_gsm_a_MSC_rev, tvb, curr_offset, 1, ENC_BIG_ENDIAN); @@ -3320,20 +3310,17 @@ de_pd_sapi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offs guint8 oct; guint32 curr_offset; proto_tree *subtree; - proto_item *item; const gchar *str; curr_offset = offset; oct = tvb_get_guint8(tvb, curr_offset); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_dtap_elem[DE_PD_SAPI], NULL, val_to_str_ext_const(DE_PD_SAPI, &gsm_dtap_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_PD_SAPI]); - proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 2, ENC_BIG_ENDIAN); switch ((oct & 0x30) >> 4) @@ -4475,6 +4462,7 @@ proto_register_gsm_a_common(void) static ei_register_info ei[] = { { &ei_gsm_a_extraneous_data, { "gsm_a.extraneous_data", PI_PROTOCOL, PI_NOTE, "Extraneous Data, dissector bug or later version spec(report to wireshark.org)", EXPFILL }}, + { &ei_gsm_a_unknown_element, { "gsm_a.unknown_element", PI_PROTOCOL, PI_ERROR, "Unknown - aborting dissection", EXPFILL }}, }; expert_module_t* expert_a_common; diff --git a/epan/dissectors/packet-gsm_a_dtap.c b/epan/dissectors/packet-gsm_a_dtap.c index ac9e91e4e5..541f2e8b05 100644 --- a/epan/dissectors/packet-gsm_a_dtap.c +++ b/epan/dissectors/packet-gsm_a_dtap.c @@ -1187,14 +1187,23 @@ de_mm_timer(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 off switch (oct>>5) { - case 0: str = "sec"; val*=2; break; - case 1: str = "min"; break; - case 2: str = "min"; val*=6; break; - case 7: str = ""; + case 0: + str = "sec"; val*=2; + break; + case 1: + str = "min"; + break; + case 2: + str = "min"; val*=6; + break; + case 7: + str = ""; item = proto_tree_add_uint_format_value(tree, hf_gsm_a_dtap_mm_timer, tvb, offset, 1, oct, "timer is deactivated"); break; - default: str = "min"; + default: + str = "min"; + break; } if (item == NULL) { @@ -1521,11 +1530,10 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o * warning, bearer cap uses extended values that * are reversed from other parameters! */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 3"); - subtree = proto_item_add_subtree(item, ett_bc_oct_3); + ett_bc_oct_3, NULL, "Octet 3"); extended = (oct & 0x80) ? FALSE : TRUE; itc = oct & 0x07; @@ -1610,13 +1618,11 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o case DE_BC_ITC_SPEECH: /* octets 3a */ - item = - proto_tree_add_text(tree, - tvb, curr_offset, -1, + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, -1, ett_bc_oct_3a, &item, "Octets 3a - Speech Versions"); - subtree = proto_item_add_subtree(item, ett_bc_oct_3a); - saved_offset = curr_offset; do @@ -1640,12 +1646,10 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o default: /* octet 4 */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 4"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_4); + ett_bc_oct_4, NULL, "Octet 4"); proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(subtree, is_uplink ? hf_gsm_a_dtap_compression_up : hf_gsm_a_dtap_compression, @@ -1662,12 +1666,10 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o /* octet 5 */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 5"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_5); + ett_bc_oct_5, NULL, "Octet 5"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1685,12 +1687,10 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o /* octet 5a */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 5a"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_5a); + ett_bc_oct_5a, NULL, "Octet 5a"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1708,12 +1708,10 @@ de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o /* octet 5b */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 5b"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_5b); + ett_bc_oct_5b, NULL, "Octet 5b"); proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(subtree, hf_gsm_a_dtap_rate_adaption_header, tvb, curr_offset, 1, ENC_NA); @@ -1732,12 +1730,10 @@ bc_octet_6: /* octet 6 */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6); + ett_bc_oct_6, NULL, "Octet 6"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1761,12 +1757,10 @@ bc_octet_6: /* octet 6a */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6a"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6a); + ett_bc_oct_6a, NULL, "Octet 6a"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1788,12 +1782,10 @@ bc_octet_6: /* octet 6b */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6b"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6b); + ett_bc_oct_6b, NULL, "Octet 6b"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1812,12 +1804,10 @@ bc_octet_6: /* octet 6c */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6c"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6c); + ett_bc_oct_6c, NULL, "Octet 6c"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1836,12 +1826,10 @@ bc_octet_6: /* octet 6d */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6d"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6d); + ett_bc_oct_6d, NULL, "Octet 6d"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1859,12 +1847,10 @@ bc_octet_6: /* octet 6e */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6e"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6e); + ett_bc_oct_6e, NULL, "Octet 6e"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1898,12 +1884,10 @@ bc_octet_6: /* octet 6f */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6f"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6f); + ett_bc_oct_6f, NULL, "Octet 6f"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1930,12 +1914,10 @@ bc_octet_6: /* octet 6g */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 6g"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_6g); + ett_bc_oct_6g, NULL, "Octet 6g"); oct = tvb_get_guint8(tvb, curr_offset); @@ -1962,13 +1944,10 @@ bc_octet_6: bc_octet_7: /* octet 7 */ - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree(tree, tvb, curr_offset, 1, - "Octet 7"); - - subtree = proto_item_add_subtree(item, ett_bc_oct_7); - oct = tvb_get_guint8(tvb, curr_offset); + ett_bc_oct_7, NULL, "Octet 7"); proto_tree_add_item(subtree, hf_gsm_a_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN); @@ -2090,14 +2069,12 @@ de_call_state(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 o { guint8 oct, coding_standard, call_state; proto_tree *subtree; - proto_item *item; - item = - proto_tree_add_text(tree, - tvb, offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, offset, 1, ett_gsm_dtap_elem[DE_CALL_STATE], NULL, val_to_str_ext_const(DE_CALL_STATE, &gsm_dtap_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CALL_STATE]); proto_tree_add_item(subtree, hf_gsm_a_dtap_coding_standard, tvb, offset, 1, ENC_BIG_ENDIAN); oct = tvb_get_guint8(tvb, offset); @@ -2420,7 +2397,6 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset guint32 curr_offset; guint32 diag_length; proto_tree *subtree; - proto_item *item; const gchar *str; curr_offset = offset; @@ -2524,8 +2500,8 @@ de_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset NO_MORE_DATA_CHECK(len); - item = proto_tree_add_text(tree, tvb, curr_offset, len - (curr_offset - offset), "Diagnostics"); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CAUSE]); + subtree = proto_tree_add_subtree(tree, tvb, curr_offset, len - (curr_offset - offset), + ett_gsm_dtap_elem[DE_CAUSE], NULL, "Diagnostics"); /* * Diagnostics for supplementary services may be included in the case of @@ -3006,14 +2982,12 @@ de_u2u(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, { guint32 curr_offset; proto_tree *subtree; - proto_item *item; curr_offset = offset; proto_tree_add_item(tree, hf_gsm_a_dtap_u2u_prot_discr, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset++; - item = proto_tree_add_text(tree, tvb, curr_offset, len - 1, "User-user information"); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_USER_USER]); + subtree = proto_tree_add_subtree(tree, tvb, curr_offset, len - 1, ett_gsm_dtap_elem[DE_USER_USER], NULL, "User-user information"); proto_tree_add_item(subtree, hf_gsm_a_dtap_data, tvb, curr_offset, len - 1, ENC_NA); return(len); @@ -3187,7 +3161,6 @@ de_sup_codec_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint guint32 curr_offset; guint8 length; proto_tree *subtree; - proto_item *item; guint8 sysid_counter; curr_offset = offset; @@ -3208,8 +3181,8 @@ de_sup_codec_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint curr_offset++; if (length > 0) { - item = proto_tree_add_text(tree, tvb, curr_offset, length, "Codec Bitmap for SysID %u", sysid_counter); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_SUP_CODEC_LIST]); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, length, ett_gsm_dtap_elem[DE_SUP_CODEC_LIST], NULL, + "Codec Bitmap for SysID %u", sysid_counter); /* 6.2 Codec Bitmap * The Codec Types are coded in the first and second octet of the Codec List * Bitmap as follows: @@ -3744,7 +3717,6 @@ de_tp_epc_ue_tl_a_lb_setup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ guint32 curr_offset; guint32 count, nb_lb; guint8 drb; - proto_item *item = NULL; proto_tree *lb_setup_tree = NULL; curr_offset = offset; @@ -3754,8 +3726,9 @@ de_tp_epc_ue_tl_a_lb_setup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ proto_tree_add_text(tree, tvb, curr_offset, len, "Number of LB entities: %d", nb_lb); while ((count < nb_lb) && (count < 8)){ - item = proto_tree_add_text(tree, tvb, curr_offset, 3, "LB entity %d", count); - lb_setup_tree = proto_item_add_subtree(item, ett_epc_ue_tl_a_lb_setup); + lb_setup_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 3, + ett_epc_ue_tl_a_lb_setup, NULL, "LB entity %d", count); + proto_tree_add_bits_item(lb_setup_tree, hf_gsm_a_dtap_epc_ue_tl_a_ul_sdu_size, tvb, curr_offset<<3, 16, ENC_BIG_ENDIAN); curr_offset += 2; drb = tvb_get_guint8(tvb, curr_offset) & 0x1f; @@ -3994,7 +3967,6 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint3 guint curr_len; guint8 oct; proto_tree *subtree; - proto_item *item; curr_offset = offset; curr_len = len; @@ -4008,13 +3980,11 @@ dtap_mm_auth_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint3 proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); switch (oct & 0x07) @@ -4096,7 +4066,6 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint curr_len; guint8 oct; proto_tree *subtree; - proto_item *item; curr_offset = offset; curr_len = len; @@ -4110,13 +4079,11 @@ dtap_mm_cm_reestab_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); switch (oct & 0x07) @@ -4241,7 +4208,6 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui guint curr_len; guint8 oct; proto_tree *subtree; - proto_item *item; curr_offset = offset; curr_len = len; @@ -4253,13 +4219,11 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui */ oct = tvb_get_guint8(tvb, curr_offset); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 1, ENC_BIG_ENDIAN); switch ((oct & 0x70) >> 4) @@ -4274,13 +4238,11 @@ dtap_mm_cm_srvc_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui break; } - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_dtap_elem[DE_CM_SRVC_TYPE], NULL, val_to_str_ext_const(DE_CM_SRVC_TYPE, &gsm_dtap_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CM_SRVC_TYPE]); - proto_tree_add_item(subtree, hf_gsm_a_dtap_service_type, tvb, curr_offset, 1, ENC_NA); curr_offset++; @@ -4322,7 +4284,6 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 guint32 curr_offset; guint curr_len; proto_tree *subtree; - proto_item *item; curr_offset = offset; curr_len = len; @@ -4334,13 +4295,11 @@ dtap_mm_id_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 */ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_dtap_elem[DE_ID_TYPE], NULL, val_to_str_ext_const(DE_ID_TYPE, &gsm_dtap_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_ID_TYPE]); - proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+4, 1, ENC_BIG_ENDIAN); proto_tree_add_item(subtree, hf_gsm_a_dtap_type_of_identity, tvb, curr_offset, 1, ENC_NA); @@ -4479,7 +4438,7 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui guint curr_len; guint8 oct; proto_tree *subtree; - proto_item *item; + proto_item *item; curr_offset = offset; curr_len = len; @@ -4491,13 +4450,11 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui */ oct = tvb_get_guint8(tvb, curr_offset); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 1, ENC_BIG_ENDIAN); switch ((oct & 0x70) >> 4) @@ -4512,13 +4469,11 @@ dtap_mm_loc_upd_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui break; } - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_dtap_elem[DE_LOC_UPD_TYPE], &item, val_to_str_ext_const(DE_LOC_UPD_TYPE, &gsm_dtap_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_LOC_UPD_TYPE]); - proto_tree_add_item(subtree, hf_gsm_a_dtap_follow_on_request, tvb, curr_offset, 1, ENC_NA); proto_tree_add_bits_item(subtree, hf_gsm_a_spare_bits, tvb, (curr_offset<<3)+5, 1, ENC_BIG_ENDIAN); @@ -4740,7 +4695,6 @@ dtap_cc_congestion_control(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ guint curr_len; guint8 oct; proto_tree *subtree; - proto_item *item; curr_offset = offset; curr_len = len; @@ -4754,13 +4708,11 @@ dtap_cc_congestion_control(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _ proto_tree_add_bits_item(tree, hf_gsm_a_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = + proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_dtap_elem[DE_CONGESTION], NULL, val_to_str_ext_const(DE_CONGESTION, &gsm_dtap_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CONGESTION]); - proto_tree_add_uint_format_value(subtree, hf_gsm_a_dtap_congestion_level, tvb, curr_offset, 1, oct, "%s", val_to_str_const(oct & 0xF, gsm_a_dtap_congestion_level_vals, "Reserved")); diff --git a/epan/dissectors/packet-gsm_a_gm.c b/epan/dissectors/packet-gsm_a_gm.c index 4cc0c4ec56..18ee5b1e1c 100644 --- a/epan/dissectors/packet-gsm_a_gm.c +++ b/epan/dissectors/packet-gsm_a_gm.c @@ -1416,11 +1416,9 @@ de_gmm_ms_radio_acc_cap(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gui } indx++; - tf = proto_tree_add_text(tree, + tf_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1, - "MS RA capability %d", indx); - - tf_tree = proto_item_add_subtree(tf, ett_gmm_radio_cap); + ett_gmm_radio_cap, &tf, "MS RA capability %d", indx); /* * Access Technology @@ -3050,7 +3048,6 @@ guint16 de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { proto_tree *subtree; - proto_item *item; guint32 mcc; guint32 mnc; guint32 lac; @@ -3071,12 +3068,11 @@ de_gmm_rai(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 offset, lac = tvb_get_ntohs(tvb, curr_offset+3); rac = tvb_get_guint8(tvb, curr_offset+5); - item = proto_tree_add_text(tree, - tvb, curr_offset, 6, + subtree = proto_tree_add_subtree_format(tree, + tvb, curr_offset, 6, ett_gmm_rai, NULL, "Routing area identification: %x-%x-%u-%u", mcc, mnc, lac, rac); - subtree = proto_item_add_subtree(item, ett_gmm_rai); dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, TRUE); proto_tree_add_item(subtree, hf_gsm_a_lac, tvb, curr_offset+3, 2, ENC_BIG_ENDIAN); @@ -3572,18 +3568,25 @@ de_gc_timer(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 off guint8 oct; guint16 val; const gchar *str; - proto_tree *subtree; proto_item *item = NULL; + proto_tree *subtree; oct = tvb_get_guint8(tvb, offset); val = oct&0x1f; switch (oct>>5) { - case 0: str = "sec"; val*=2; break; - case 1: str = "min"; break; - case 2: str = "min"; val*=6; break; - case 7: str = ""; + case 0: + str = "sec"; val*=2; + break; + case 1: + str = "min"; + break; + case 2: + str = "min"; val*=6; + break; + case 7: + str = ""; item = proto_tree_add_text(tree, tvb, offset, 1, "GPRS Timer: timer is deactivated"); break; @@ -3624,9 +3627,15 @@ de_gc_timer2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 of switch (oct>>5) { - case 0: str = "sec"; val*=2; break; - case 1: str = "min"; break; - case 2: str = "min"; val*=6; break; + case 0: + str = "sec"; val*=2; + break; + case 1: + str = "min"; + break; + case 2: + str = "min"; val*=6; + break; case 7: item = proto_tree_add_text(tree, tvb, curr_offset, 1, "GPRS Timer: timer is deactivated"); @@ -5255,11 +5264,9 @@ de_sm_tflow_temp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 of if ((e_bit == 1) && curr_len) { count = 0; while (curr_len) { - proto_item *tf; proto_tree *tf_tree; pf_length = tvb_get_guint8(tvb, curr_offset+1); - tf = proto_tree_add_text(tree, tvb, curr_offset, pf_length+2, "Parameter %d", count); - tf_tree = proto_item_add_subtree(tf, ett_sm_tft); + tf_tree = proto_tree_add_subtree_format(tree, tvb, curr_offset, pf_length+2, ett_sm_tft, NULL, "Parameter %d", count); param = tvb_get_guint8(tvb, curr_offset); proto_tree_add_item(tf_tree, hf_gsm_a_sm_tft_param_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset += 2; diff --git a/epan/dissectors/packet-gsm_a_rr.c b/epan/dissectors/packet-gsm_a_rr.c index 16434a4d39..239809a247 100644 --- a/epan/dissectors/packet-gsm_a_rr.c +++ b/epan/dissectors/packet-gsm_a_rr.c @@ -1086,13 +1086,12 @@ static void dissect_channel_list_n_range(tvbuff_t *tvb, proto_tree *tree, packet gint curr_offset = offset, bit_offset, f0, arfcn_orig, w[64], wsize, i; gint octet, nwi = 1, jwi=0, imax, iused, arfcn; guint8 list[1024]; - proto_item *item; proto_tree *subtree; memset((void*)list,0,sizeof(list)); - item = proto_tree_add_text(tree,tvb, curr_offset, len, "Range %d format", range); - subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_NEIGH_CELL_DESC]); + subtree = proto_tree_add_subtree_format(tree,tvb, curr_offset, len, + ett_gsm_rr_elem[DE_RR_NEIGH_CELL_DESC], NULL, "Range %d format", range); octet = tvb_get_guint8(tvb, curr_offset); if (range == 1024) { @@ -1383,7 +1382,7 @@ static guint16 de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_) { proto_tree *subtree, *subtree2; - proto_item *item, *item2; + proto_item *item; guint32 curr_offset; gint bit_offset, bit_offset_sav, idx, xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0; guint8 value; @@ -1396,9 +1395,8 @@ de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, { case 0: /* GSM Description */ bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GSM_DESC], &item, gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GSM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GSM_DESC]); while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeating GSM Description struct", "Present", "Not Present")) { gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Band Indicator", "1900", "1800"); @@ -1411,9 +1409,8 @@ de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, break; case 1: /* UTRAN FDD Description */ bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC], &item, gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]); while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeating UTRAN FDD Description struct", "Present", "Not Present")) { if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Bandwidth FDD", "Present", "Not Present")) @@ -1430,9 +1427,9 @@ de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of FDD Cells : %d", idx); bit_offset += 5; idx = convert_n_to_p[idx]; - item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s", + subtree2 = proto_tree_add_subtree(subtree,tvb, bit_offset>>3, (idx>>3)+1, + ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD], NULL, gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]); proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx); if (xdd_indic0) { @@ -1485,8 +1482,9 @@ de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, break; case 2: /* UTRAN TDD Description */ bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); + while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeating UTRAN TDD Description struct", "Present", "Not Present")) { if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Bandwidth TDD", "Present", "Not Present")) @@ -1502,9 +1500,9 @@ de_rr_cell_select_indic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, proto_tree_add_text(subtree,tvb, bit_offset>>3, 1, "Nr of TDD Cells : %d", idx); bit_offset += 5; idx = convert_n_to_q[idx]; - item2 = proto_tree_add_text(subtree,tvb, bit_offset>>3, (idx>>3)+1, "%s", + subtree2 = proto_tree_add_subtree(subtree,tvb, bit_offset>>3, (idx>>3)+1, + ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD], NULL, gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]); proto_tree_add_text(subtree2,tvb, bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx); if (xdd_indic0) { @@ -2537,8 +2535,9 @@ de_rr_rest_oct_gprs_cell_options(tvbuff_t *tvb, proto_tree *tree, gint bit_offse curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, + ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_nmo, tvb, curr_bit_offset, 2, ENC_BIG_ENDIAN); curr_bit_offset += 2; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t3168, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN); @@ -2565,9 +2564,8 @@ de_rr_rest_oct_gprs_cell_options(tvbuff_t *tvb, proto_tree *tree, gint bit_offse if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Optional Extensions", "Present", "Not Present")) { /* Optional extension information */ curr_bit_offset_sav = curr_bit_offset; - item2 = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, -1, "%s", + subtree2 = proto_tree_add_subtree(subtree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO], &item2, gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_CELL_OPTIONS_EXT_INFO]); value = tvb_get_bits8(tvb,curr_bit_offset,6); proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, 1, "Extension Length: %d", value); curr_bit_offset += 6; @@ -2638,8 +2636,8 @@ de_rr_rest_oct_gprs_power_control_parameters(tvbuff_t *tvb, proto_tree *tree, gi curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_POWER_CONTROL_PARAMS].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_alpha, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN); curr_bit_offset += 4; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_t_avg_w, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN); @@ -2886,8 +2884,8 @@ de_rr_ia_rest_oct_egprs_packet_uplink_assignment(tvbuff_t *tvb, proto_tree *tree curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EGPRS_PACKET_UPLINK_ASSIGNMENT].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_extended_ra, tvb, curr_bit_offset, 5, ENC_BIG_ENDIAN); curr_bit_offset += 5; while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Access Technologies Request", "Present", "Not Present")) @@ -3017,8 +3015,8 @@ de_rr_ia_rest_oct_tmgi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_TMGI].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TMGI]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TMGI], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_TMGI].strptr); if (0 == gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "MCC and MNC Parameters", "Present", "Not Present")) /* without MCC and MNC parameters */ { @@ -3069,8 +3067,8 @@ de_rr_ia_rest_oct_packet_timing_advance(tvbuff_t *tvb, proto_tree *tree, gint bi curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_TIMING_ADVANCE].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Timing Advance Value", "Present", "Not Present")) { @@ -3102,8 +3100,8 @@ de_rr_ia_rest_oct_multiple_blocks_packet_downlink_assignment(tvbuff_t *tvb, prot curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MULTIPLE_BLOCKS_PACKET_DOWNLINK_ASSIGNMENT].strptr); curr_bit_offset += de_tbf_starting_time(tvb, subtree, curr_bit_offset); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_num_of_radio_block_allocated, tvb, curr_bit_offset, 4, ENC_BIG_ENDIAN); @@ -3161,8 +3159,8 @@ de_rr_ia_rest_oct_packet_uplink_assignment(tvbuff_t *tvb, proto_tree *tree, gint curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_UPLINK_ASSIGNMENT].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Packet Uplink Assignment", "Normal", "Single Block")) { @@ -3286,8 +3284,8 @@ de_rr_ia_rest_oct_packet_downlink_assignment(tvbuff_t *tvb, proto_tree *tree, gu curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PACKET_DOWNLINK_ASSIGNMENT].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_tlli, tvb, curr_bit_offset, 32, ENC_BIG_ENDIAN); curr_bit_offset += 32; @@ -3371,8 +3369,8 @@ de_rr_ia_rest_oct_second_part_packet_assignment(tvbuff_t *tvb, proto_tree *tree, curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SECOND_PART_PACKET_ASSIGNMENT].strptr); /* Null breakpoint */ if (curr_bit_offset < bit_len) @@ -4729,8 +4727,8 @@ de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_ if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "UTRAN FDD Description", "Present", "Not Present")) { /* UTRAN FDD Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version"); gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Current version", "Earlier version"); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN); @@ -4745,8 +4743,8 @@ de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_ if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "UTRAN TDD Description", "Present", "Not Present")) { /* UTRAN TDD Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Earlier version", "Current version"); gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Bit reserved for earlier version of protocol", "Current version", "Earlier version"); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_tdd_uarfcn, tvb, bit_offset, 14, ENC_BIG_ENDIAN); @@ -4761,8 +4759,8 @@ de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_ if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Measurement Parameters Description", "Present", "Not Present")) { /* 3G Measurement Parameters Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_i, tvb, bit_offset, 4, ENC_BIG_ENDIAN); bit_offset += 4; if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "FDD Parameters", "Present", "Not Present")) @@ -4788,8 +4786,8 @@ de_rr_si2ter_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_ if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Additional Measurement Parameters Description", "Present", "Not Present")) { /* 3G Additional Measurement Parameters Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN); bit_offset += 3; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rscpmin, tvb, bit_offset, 4, ENC_BIG_ENDIAN); @@ -4985,8 +4983,8 @@ de_rr_si2quater_meas_info_utran_fdd_desc(tvbuff_t *tvb, proto_tree *tree, gint b curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_FDD_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bandwidth FDD", "Present", "Not Present")) { proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_fdd, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN); @@ -5002,8 +5000,8 @@ de_rr_si2quater_meas_info_utran_fdd_desc(tvbuff_t *tvb, proto_tree *tree, gint b proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Nr of FDD Cells : %d", idx); curr_bit_offset += 5; idx = convert_n_to_p[idx]; - item2 = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD]); + subtree2 = proto_tree_add_subtree(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_FDD_CELL_INFORMATION_FIELD], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_FDD_DESC].strptr); proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx); if (xdd_indic0) { @@ -5058,14 +5056,14 @@ static gint de_rr_si2quater_meas_info_utran_tdd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) { proto_tree *subtree, *subtree2; - proto_item *item, *item2; + proto_item *item; gint curr_bit_offset, idx; gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused, xdd_indic0; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_TDD_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Bandwidth TDD", "Present", "Not Present")) { proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bandwidth_tdd, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN); @@ -5081,8 +5079,8 @@ de_rr_si2quater_meas_info_utran_tdd_desc(tvbuff_t *tvb, proto_tree *tree, gint b proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Nr of TDD Cells : %d", idx); curr_bit_offset += 5; idx = convert_n_to_q[idx]; - item2 = proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD]); + subtree2 = proto_tree_add_subtree(subtree,tvb, curr_bit_offset>>3, (idx>>3)+1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_TDD_CELL_INFORMATION_FIELD], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_TDD_DESC].strptr); proto_tree_add_text(subtree2,tvb, curr_bit_offset>>3, (idx>>3)+1, "Field is %d bits long", idx); if (xdd_indic0) { @@ -5145,8 +5143,8 @@ de_rr_rtd_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets_ curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[id], &item, + gsm_rr_rest_octets_elem_strings[id].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RTD6", "Present", "Not Present")) { if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BA Index Start RTD", "Present", "Not Present")) @@ -5223,8 +5221,7 @@ de_rr_bsic_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_octets gint curr_bit_offset, idx; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[id], &item, gsm_rr_rest_octets_elem_strings[id].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "BA Index Start BSIC", "Present", "Not Present")) { proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "BA Index Start BSIC: %d", tvb_get_bits8(tvb,curr_bit_offset,5)); @@ -5257,8 +5254,8 @@ de_rr_report_priority_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_ curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[id], &item, + gsm_rr_rest_octets_elem_strings[id].strptr); idx = tvb_get_bits8(tvb,curr_bit_offset,7); proto_tree_add_text(subtree,tvb, curr_bit_offset>>3, 1, "Number Cells: %d", idx); curr_bit_offset += 7; @@ -5281,8 +5278,7 @@ de_rr_meas_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset, rr_rest_ gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[id].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[id]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[id], &item, gsm_rr_rest_octets_elem_strings[id].strptr); if (id == DE_RR_REST_OCTETS_GPRS_MEAS_PARAM_DESC) { proto_tree_add_bits_item(subtree, hf_gsm_a_rr_report_type, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); @@ -5352,8 +5348,8 @@ de_rr_3g_add_meas_param_desc2(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC2].strptr); if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "FDD Reporting Threshold2", "Present", "Not Present")) { proto_tree_add_bits_item(subtree, hf_gsm_a_rr_fdd_reporting_threshold_2, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN); @@ -5618,8 +5614,8 @@ de_rr_3g_priority_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_PRIORITY_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); curr_bit_offset += 1; @@ -5642,8 +5638,8 @@ de_rr_3g_priority_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) proto_item *item_rep_utran_prio; gint rep_utran_prio_bit_offset = curr_bit_offset; - item_rep_utran_prio = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, 1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM].strptr); - subtree_rep_utran_prio = proto_item_add_subtree(item_rep_utran_prio, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM]); + subtree_rep_utran_prio = proto_tree_add_subtree(subtree, tvb, curr_bit_offset>>3, 1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM], &item_rep_utran_prio, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_PRIO_PARAM].strptr); while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "UTRAN Frequency Index", "Present", "Not Present")) { @@ -5685,8 +5681,8 @@ de_rr_eutran_neighbour_cells(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS].strptr); while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "E-UTRAN Neighbour Cells Struct", "Present", "Not Present")) { @@ -5732,8 +5728,8 @@ de_rr_eutran_neighbour_cells_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NEIGHBOUR_CELLS].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_earfcn, tvb, curr_bit_offset, 16, ENC_BIG_ENDIAN); curr_bit_offset += 16; @@ -5826,8 +5822,8 @@ de_rr_eutran_not_allowed_cells(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_NOT_ALLOWED_CELLS].strptr); /* dissect PCID group */ curr_bit_offset += de_rr_eutran_pcid(tvb, subtree, curr_bit_offset); @@ -5850,8 +5846,8 @@ de_rr_eutran_pcid_to_ta_mapping(tvbuff_t *tvb, proto_tree *tree, gint bit_offset gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PCID_TO_TA_MAPPING].strptr); while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeating PCID group", "Present", "Not Present")) { @@ -6040,8 +6036,8 @@ de_rr_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) guint8 rep_quant = 0; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_ccn_active, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); curr_bit_offset += 1; @@ -6161,8 +6157,8 @@ de_rr_eutran_param_desc_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_eutran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); curr_bit_offset += 1; @@ -6219,9 +6215,8 @@ de_rr_priority_and_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_o gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC]); - + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PRIORITY_AND_EUTRAN_PARAM_DESC].strptr); /* Serving Cell Priority Parameters Description */ if (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Serving Cell Priority Parameters Description", "Present", "Not Present")) @@ -6230,8 +6225,9 @@ de_rr_priority_and_eutran_param_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_o proto_item *item_serv; gint serv_bit_offset = curr_bit_offset; - item_serv = proto_tree_add_text(subtree, tvb, curr_bit_offset>>3, ((curr_bit_offset+15)>>3)-(curr_bit_offset>>3) + 1 , "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC].strptr); - subtree_serv = proto_item_add_subtree(item_serv, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC]); + subtree_serv = proto_tree_add_subtree(subtree, tvb, curr_bit_offset>>3, ((curr_bit_offset+15)>>3)-(curr_bit_offset>>3) + 1, + ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC], &item_serv, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_PRIORITY_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree_serv, hf_gsm_a_rr_serving_cell_priority_param_geran_priority, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN); curr_bit_offset += 3; @@ -6270,8 +6266,8 @@ de_rr_3g_csg_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_CSG_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_CSG_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_CSG_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_CSG_DESC].strptr); while (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Repeated CSG_PSC_SPLIT struct", "Present", "Not Present")) { @@ -6334,8 +6330,8 @@ de_rr_eutran_csg_desc(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC].strptr); while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated PCID group", "Present", "Not Present")) { @@ -6361,8 +6357,8 @@ de_rr_eutran_csg_desc_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_CSG_DESC].strptr); while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated CSG PCI Split", "Present", "Not Present")) { @@ -6382,8 +6378,8 @@ de_rr_utran_measurement_control_param_mi(tvbuff_t *tvb, proto_tree *tree, gint b gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_UTRAN_MEASUREMENT_CONTROL_PARAM_DESC].strptr); while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "Repeated UTRAN Frequency Index", "Present", "Not Present")) { @@ -6406,8 +6402,8 @@ de_rr_3g_supplementary_param_desc_mi(tvbuff_t *tvb, proto_tree *tree, gint bit_o gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_SUPPLEMENTARY_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_priority_param_desc_utran_start, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); curr_bit_offset += 1; @@ -6460,8 +6456,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Measurement Parameters Description", "Present", "Not Present")) { /* Measurement Parameters Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MEAS_PARAM_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MEAS_PARAM_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_MEAS_PARAM_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_gsm_report_type, tvb, bit_offset, 1, ENC_BIG_ENDIAN); bit_offset += 1; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_serving_band_reporting, tvb, bit_offset, 2, ENC_BIG_ENDIAN); @@ -6487,8 +6483,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "NC Measurement Parameters", "Present", "Not Present")) { /* NC Measurement Parameters */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_NC_MEAS_PARAM].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_NC_MEAS_PARAM]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_NC_MEAS_PARAM], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_NC_MEAS_PARAM].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_network_control_order, tvb, bit_offset, 2, ENC_BIG_ENDIAN); bit_offset += 2; if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "NC Periods", "Present", "Not Present")) @@ -6505,8 +6501,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "SI 2quater Extension Information", "Present", "Not Present")) { /* SI 2quater Extension Information */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI2Q_EXT_INFO].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI2Q_EXT_INFO]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI2Q_EXT_INFO], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI2Q_EXT_INFO].strptr); idx = tvb_get_bits8(tvb,bit_offset,8); proto_tree_add_text(subtree2,tvb, bit_offset>>3, 1, "Extension Length: %d", idx); bit_offset += 8; @@ -6514,8 +6510,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "CCN Support Description", "Present", "Not Present")) { /* CCN Support Description */ bit_offset_sav = bit_offset; - item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC].strptr); - subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC]); + subtree3 = proto_tree_add_subtree(subtree2, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC], &item3, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CCN_SUPPORT_DESC].strptr); value = tvb_get_bits8(tvb,bit_offset,7); proto_tree_add_text(subtree3,tvb, bit_offset>>3, 1, "Number Cells: %d", value); bit_offset += 7; @@ -6535,8 +6531,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Neighbour Cell Description", "Present", "Not Present")) { /* 3G Neighbour Cell Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr); if (gsm_rr_csn_flag(tvb, subtree2, bit_offset++, "Index Start 3G", "Present", "Not Present")) { proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_index_start_3g, tvb, bit_offset, 7, ENC_BIG_ENDIAN); @@ -6560,8 +6556,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Measurement Parameters Description", "Present", "Not Present")) { /* 3G Measurement Parameters Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_i, tvb, bit_offset, 4, ENC_BIG_ENDIAN); bit_offset += 4; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_c_initial, tvb, bit_offset, 1, ENC_BIG_ENDIAN); @@ -6590,8 +6586,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo { /* GPRS 3G Measurement Parameters Description */ guint8 reporting_quant = 0; bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_3G_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_qsearch_p, tvb, bit_offset, 4, ENC_BIG_ENDIAN); bit_offset += 4; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_3g_search_prio, tvb, bit_offset, 1, ENC_BIG_ENDIAN); @@ -6647,8 +6643,8 @@ de_rr_si2quater_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Additional Measurement Parameters Description", "Present", "Not Present")) { /* 3G Additional Measurement Parameters Description */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_ADD_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_qmin_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN); bit_offset += 3; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_fdd_rscpmin, tvb, bit_offset, 4, ENC_BIG_ENDIAN); @@ -6849,8 +6845,8 @@ de_rr_rest_oct_opt_sel_param(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) if (gsm_rr_csn_HL_flag(tvb, tree, 0, curr_bit_offset++, "Selection Parameters", "Present", "Not present")) { /* Selection Parameters */ - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_OPTIONAL_SEL_PARAM].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cbq, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); curr_bit_offset += 1; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_cell_reselect_offset, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN); @@ -6875,13 +6871,12 @@ static gint de_rr_rest_oct_gprs_indicator(tvbuff_t *tvb, proto_tree *tree, gint bit_offset) { proto_tree *subtree; - proto_item *item; gint curr_bit_offset; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_INDICATOR].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_INDICATOR]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, 1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_INDICATOR], NULL, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_INDICATOR].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_gprs_ra_colour, tvb, curr_bit_offset, 3, ENC_BIG_ENDIAN); curr_bit_offset += 3; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_si13_position, tvb, curr_bit_offset, 1, ENC_BIG_ENDIAN); @@ -6995,9 +6990,8 @@ de_rr_si4_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, g curr_offset = offset; bit_offset = curr_offset << 3; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O].strptr); - - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_O].strptr); bit_offset += de_rr_rest_oct_opt_sel_param(tvb, subtree2, bit_offset); @@ -7015,13 +7009,13 @@ de_rr_si4_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, g if (gsm_rr_csn_HL_flag(tvb, subtree, bit_len, bit_offset++, "SI4 Rest Octets_S", "Present", "Not present")) { /* SI4 Rest Octets_S */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SI4_REST_OCTETS_S].strptr); if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "LSA Parameters", "Present", "Not present")) { /* LSA Parameters */ - item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_PARAMETERS].strptr); - subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_PARAMETERS]); + subtree3 = proto_tree_add_subtree(subtree2, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_PARAMETERS], &item3, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_PARAMETERS].strptr); proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_prio_thr, tvb, bit_offset, 3, ENC_BIG_ENDIAN); bit_offset += 3; proto_tree_add_bits_item(subtree3, hf_gsm_a_rr_lsa_offset, tvb, bit_offset, 3, ENC_BIG_ENDIAN); @@ -7044,8 +7038,8 @@ de_rr_si4_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, g if (gsm_rr_csn_HL_flag(tvb, subtree2, bit_len, bit_offset++, "LSA ID information", "Present", "Not present")) { /* LSA ID information */ - item3 = proto_tree_add_text(subtree2, tvb, bit_offset>>3, len, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_ID_INFO].strptr); - subtree3 = proto_item_add_subtree(item3, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_ID_INFO]); + subtree3 = proto_tree_add_subtree(subtree2, tvb, bit_offset>>3, len, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_LSA_ID_INFO], &item3, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_LSA_ID_INFO].strptr); do { if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "Type", "Short LSA ID", "LSA ID")) @@ -7139,8 +7133,8 @@ de_rr_si6_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, g if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "PCH and NCH Info", "Present", "Not present")) { /* PCH and NCH Info */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PCH_AND_NCH_INFO].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_paging_channel_restructuring, tvb, bit_offset, 1, ENC_BIG_ENDIAN); bit_offset += 1; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_nln_sacch, tvb, bit_offset, 2, ENC_BIG_ENDIAN); @@ -7157,8 +7151,8 @@ de_rr_si6_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, g if (gsm_rr_csn_HL_flag(tvb, subtree, 0, bit_offset++, "VBS/VGCS options", "Present", "Not present")) { /* VBS/VGCS options */ bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb,bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS]); + subtree2 = proto_tree_add_subtree(subtree, tvb,bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_VBS_VGCS_OPTIONS].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_vbs_vgcs_inband_notifications, tvb, bit_offset, 1, ENC_BIG_ENDIAN); bit_offset += 1; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_vbs_vgcs_inband_pagings, tvb, bit_offset, 1, ENC_BIG_ENDIAN); @@ -7294,8 +7288,8 @@ de_rr_rest_oct_gprs_mobile_allocation(tvbuff_t *tvb, proto_tree *tree, gint bit_ curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_GPRS_MOBILE_ALLOC].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_hsn, tvb, curr_bit_offset, 6, ENC_BIG_ENDIAN); curr_bit_offset += 6; while (gsm_rr_csn_flag(tvb, subtree, curr_bit_offset++, "RFL number list", "Present", "Not Present")) @@ -7627,8 +7621,8 @@ de_rr_si13_rest_oct(tvbuff_t *tvb, proto_tree *subtree, packet_info *pinfo _U_, proto_tree_add_bits_item(subtree, hf_gsm_a_rr_psi1_repeat_period, tvb, bit_offset, 4, ENC_BIG_ENDIAN); bit_offset += 4; bit_offset_sav = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PBCCH_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PBCCH_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_PBCCH_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_PBCCH_DESC].strptr); proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_pb, tvb, bit_offset, 4, ENC_BIG_ENDIAN); bit_offset += 4; proto_tree_add_bits_item(subtree2, hf_gsm_a_rr_pbcch_tsc, tvb, bit_offset, 3, ENC_BIG_ENDIAN); @@ -7839,16 +7833,13 @@ static guint16 de_rr_tmsi_ptmsi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { proto_tree *subtree; - proto_item *item; guint32 curr_offset; curr_offset = offset; - item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s", + subtree = proto_tree_add_subtree(tree, tvb, curr_offset, 3, ett_gsm_rr_elem[DE_RR_TMSI_PTMSI], NULL, val_to_str_ext_const(DE_RR_TMSI_PTMSI, &gsm_rr_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_TMSI_PTMSI]); - proto_tree_add_item(subtree, hf_gsm_a_rr_tmsi_ptmsi, tvb, curr_offset, 4, ENC_BIG_ENDIAN); curr_offset = curr_offset + 4; @@ -8141,16 +8132,13 @@ static guint16 de_rr_carrier_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_) { proto_tree *subtree; - proto_item *item; guint32 curr_offset; curr_offset = offset; - item = proto_tree_add_text(tree, tvb, curr_offset, 3, "%s", + subtree = proto_tree_add_subtree(tree, tvb, curr_offset, 3, ett_gsm_rr_elem[DE_RR_CARRIER_IND], NULL, val_to_str_ext_const(DE_RR_CARRIER_IND, &gsm_rr_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_rr_elem[DE_RR_CARRIER_IND]); - proto_tree_add_item(subtree, hf_gsm_a_rr_carrier_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN); curr_offset += 1; @@ -9461,7 +9449,6 @@ dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui guint curr_len; guint8 oct; proto_tree *subtree; - proto_item *item; curr_offset = offset; curr_len = len; @@ -9477,13 +9464,10 @@ dtap_rr_paging_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, gui "%s : Spare", a_bigbuf); - item = - proto_tree_add_text(tree, - tvb, curr_offset, 1, "%s", + subtree = proto_tree_add_subtree(tree, + tvb, curr_offset, 1, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM], NULL, val_to_str_ext_const(DE_CIPH_KEY_SEQ_NUM, &gsm_common_elem_strings_ext, "")); - subtree = proto_item_add_subtree(item, ett_gsm_common_elem[DE_CIPH_KEY_SEQ_NUM]); - other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8); proto_tree_add_text(subtree, tvb, curr_offset, 1, @@ -9940,8 +9924,8 @@ sacch_rr_meas_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guin if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "3G Neighbour Cell Description", "Present", "Not Present")) { /* 3G Neighbour Cell Description */ bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_NEIGH_CELL_DESC].strptr); if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "3G Wait", "Present", "Not Present")) { proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_wait, tvb, bit_offset, 3, ENC_BIG_ENDIAN); @@ -9968,8 +9952,8 @@ sacch_rr_meas_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guin if (gsm_rr_csn_flag(tvb, subtree, bit_offset++, "CDMA2000 Description", "Present", "Not Present")) { /* CDMA2000 Description */ bit_offset_sav2 = bit_offset; - item2 = proto_tree_add_text(subtree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CDMA2000_DESC].strptr); - subtree2 = proto_item_add_subtree(item2, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CDMA2000_DESC]); + subtree2 = proto_tree_add_subtree(subtree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_CDMA2000_DESC], &item2, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_CDMA2000_DESC].strptr); bit_offset += 16; /* cdma2000 frequency band + cdma2000 frequency */ idx = tvb_get_bits8(tvb,bit_offset,5); /* number_cdma2000_cells */ bit_offset += 5; @@ -10030,8 +10014,8 @@ sacch_rr_meas_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, guin { /* 3G Measurement Parameters Description */ guint8 reporting_quant = 0; bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_3G_MEAS_PARAM_DESC].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_qsearch_c, tvb, bit_offset, 4, ENC_BIG_ENDIAN); bit_offset += 4; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_3g_search_prio, tvb, bit_offset, 1, ENC_BIG_ENDIAN); @@ -10147,14 +10131,13 @@ static guint32 sacch_rr_eutran_meas_report(tvbuff_t *tvb, proto_tree *tree, guint32 bit_offset, guint len_in_bit _U_) { proto_tree *subtree; - proto_item *item; gint curr_bit_offset; gint8 n_eutran; curr_bit_offset = bit_offset; - item = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT]); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT], NULL, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_EUTRAN_MEASUREMENT_REPORT].strptr); n_eutran = tvb_get_bits8(tvb,curr_bit_offset,2); n_eutran += 1; @@ -10261,8 +10244,8 @@ sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Serving cell data", "Present", "Not Present")) { /* Serving cell data */ bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_DATA].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_DATA]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_SERVING_CELL_DATA], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_SERVING_CELL_DATA].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_dtx_used, tvb, bit_offset, 1, ENC_BIG_ENDIAN); bit_offset += 1; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_rxlev_full_serv_cell, tvb, bit_offset, 6, ENC_BIG_ENDIAN); @@ -10280,8 +10263,8 @@ sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ while (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Repeated Invalid BSIC Information", "Present", "Not Present")) { /* Repeated Invalid BSIC Information */ bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPEAT_INV_BSIC_INFO].strptr); proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bcch_freq_ncell, tvb, bit_offset, 5, ENC_BIG_ENDIAN); bit_offset += 5; proto_tree_add_bits_item(subtree, hf_gsm_a_rr_bsic_ncell, tvb, bit_offset, 6, ENC_BIG_ENDIAN); @@ -10292,8 +10275,8 @@ sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ } if (gsm_rr_csn_flag(tvb, tree, bit_offset++, "Bitmap Type Reporting", "Present", "Not Present")) { /* Bitmap Type Reporting */ - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING], NULL, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_BITMAP_TYPE_REPORTING].strptr); idx = 0; while (((guint)(bit_offset>>3) <= (offset + len)) && (idx < 96)) { @@ -10313,8 +10296,8 @@ sacch_rr_enh_meas_report(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_ { gint8 bitmap_length; bit_offset_sav = bit_offset; - item = proto_tree_add_text(tree, tvb, bit_offset>>3, -1, "%s", gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPORTING_QUANTITY].strptr); - subtree = proto_item_add_subtree(item, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPORTING_QUANTITY]); + subtree = proto_tree_add_subtree(tree, tvb, bit_offset>>3, -1, ett_gsm_rr_rest_octets_elem[DE_RR_REST_OCTETS_REPORTING_QUANTITY], &item, + gsm_rr_rest_octets_elem_strings[DE_RR_REST_OCTETS_REPORTING_QUANTITY].strptr); bitmap_length = tvb_get_bits8(tvb,bit_offset,7); bitmap_length += 1; @@ -10576,13 +10559,9 @@ dissect_ccch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* note: dissected out of sequence! */ elem_v(tvb, ccch_tree, pinfo, GSM_A_PDU_TYPE_RR, DE_RR_L2_PSEUDO_LEN, 0, NULL); - oct_1_item = - proto_tree_add_text(ccch_tree, - tvb, 1, 1, - "Protocol Discriminator: %s", - val_to_str(pd, protocol_discriminator_vals, "Unknown (%u)")); - + oct_1_item = proto_tree_add_item(ccch_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 1, 1, ENC_BIG_ENDIAN); pd_tree = proto_item_add_subtree(oct_1_item, ett_ccch_oct_1); + proto_tree_add_item(pd_tree, hf_gsm_a_L3_protocol_discriminator, tvb, 1, 1, ENC_BIG_ENDIAN); if (ti == -1){ diff --git a/epan/dissectors/packet-gsm_bsslap.c b/epan/dissectors/packet-gsm_bsslap.c index 4f4a0ec60c..b062ac1030 100644 --- a/epan/dissectors/packet-gsm_bsslap.c +++ b/epan/dissectors/packet-gsm_bsslap.c @@ -291,8 +291,7 @@ de_cell_id_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, guint32 off while(len>0){ num_cells++; consumed = 0; - item = proto_tree_add_text(tree, tvb, curr_offset, -1, "Cell %u", num_cells); - subtree = proto_item_add_subtree(item, ett_bsslap_cell_list); + subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, -1, ett_bsslap_cell_list, &item, "Cell %u", num_cells); if (add_string) add_string[0] = '\0'; diff --git a/epan/dissectors/packet-gsm_cbch.c b/epan/dissectors/packet-gsm_cbch.c index f610ac7a0f..4a0dac11d2 100644 --- a/epan/dissectors/packet-gsm_cbch.c +++ b/epan/dissectors/packet-gsm_cbch.c @@ -193,8 +193,8 @@ dissect_schedule_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *top_tree } } /* print the array of new messages */ - item = proto_tree_add_text(sched_tree, tvb, offset-6, 6, "This schedule contains %d slots with new messages", k); - sched_subtree = proto_item_add_subtree(item, ett_schedule_new_msg); + sched_subtree = proto_tree_add_subtree_format(sched_tree, tvb, offset-6, 6, ett_schedule_new_msg, &item, + "This schedule contains %d slots with new messages", k); for (i=0; i<k; i++) { DISSECTOR_ASSERT(new_slots[i] <= 48); @@ -261,8 +261,8 @@ dissect_schedule_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *top_tree proto_item_set_end(item, tvb, offset); /* print schedule of other messages */ - item = proto_tree_add_text(sched_tree, tvb, offset, 0, "Other message slots in this schedule"); - sched_subtree = proto_item_add_subtree(item, ett_schedule_new_msg); + sched_subtree = proto_tree_add_subtree(sched_tree, tvb, offset, 0, + ett_schedule_new_msg, &item, "Other message slots in this schedule"); for (k=0; offset < len; j++) { /* XXX I don't know if a message can validly contain more than diff --git a/epan/dissectors/packet-gsm_rlcmac.c b/epan/dissectors/packet-gsm_rlcmac.c index 33be85e148..bc9579669c 100644 --- a/epan/dissectors/packet-gsm_rlcmac.c +++ b/epan/dissectors/packet-gsm_rlcmac.c @@ -3851,7 +3851,6 @@ static CSN_CallBackStatus_t callback_UTRAN_FDD_map_NrOfFrequencies(proto_tree *t static CSN_CallBackStatus_t callback_UTRAN_FDD_compute_FDD_CELL_INFORMATION(proto_tree *tree, tvbuff_t *tvb, void* param1, void* param2 _U_, int bit_offset, int ett_csn1) { - proto_item *ti; proto_tree *subtree; UTRAN_FDD_NeighbourCells_t * pUtranFddNcell = (UTRAN_FDD_NeighbourCells_t*)param1; gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused; @@ -3862,8 +3861,7 @@ static CSN_CallBackStatus_t callback_UTRAN_FDD_compute_FDD_CELL_INFORMATION(prot if ( idx > 0 ) { - ti = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "FDD_CELL_INFORMATION: "); - subtree = proto_item_add_subtree(ti, ett_csn1); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, 1, ett_csn1, NULL, "FDD_CELL_INFORMATION: "); if (pUtranFddNcell->Indic0) { @@ -3953,7 +3951,6 @@ static CSN_CallBackStatus_t callback_UTRAN_TDD_map_NrOfFrequencies(proto_tree *t static CSN_CallBackStatus_t callback_UTRAN_TDD_compute_TDD_CELL_INFORMATION(proto_tree *tree, tvbuff_t *tvb, void* param1, void* param2 _U_, int bit_offset, int ett_csn1) { - proto_item *ti; proto_tree *subtree; UTRAN_TDD_NeighbourCells_t *pUtranTddNcell = (UTRAN_TDD_NeighbourCells_t *)param1; gint xdd_cell_info, wsize, nwi, jwi, w[64], i, iused; @@ -3964,8 +3961,7 @@ static CSN_CallBackStatus_t callback_UTRAN_TDD_compute_TDD_CELL_INFORMATION(prot if ( idx > 0 ) { - ti = proto_tree_add_text(tree, tvb, curr_bit_offset>>3, 1, "TDD_CELL_INFORMATION: "); - subtree = proto_item_add_subtree(ti, ett_csn1); + subtree = proto_tree_add_subtree(tree, tvb, curr_bit_offset>>3, 1, ett_csn1, NULL, "TDD_CELL_INFORMATION: "); if (pUtranTddNcell->Indic0) { diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c index 82da3f05f7..dff221fdad 100644 --- a/epan/dissectors/packet-gsm_sms.c +++ b/epan/dissectors/packet-gsm_sms.c @@ -356,11 +356,8 @@ dis_field_addr(tvbuff_t *tvb, proto_tree *tree, guint32 *offset_p, const gchar * return; } - item = proto_tree_add_text(tree, tvb, - offset, numdigocts + 2, "%s", - title); - - subtree = proto_item_add_subtree(item, ett_addr); + subtree = proto_tree_add_subtree(tree, tvb, + offset, numdigocts + 2, ett_addr, &item, title); proto_tree_add_text(subtree, tvb, offset, 1, @@ -1241,12 +1238,9 @@ dis_field_st(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 oct) const gchar *str2 = NULL; - item = - proto_tree_add_text(tree, tvb, + subtree = proto_tree_add_subtree(tree, tvb, offset, 1, - "TP-Status"); - - subtree = proto_item_add_subtree(item, ett_st); + ett_st, &item, "TP-Status"); other_decode_bitfield_value(bigbuf, oct, 0x80, 8); proto_tree_add_text(subtree, tvb, @@ -1913,8 +1907,6 @@ dis_iei_tf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length, gsm_s { const gchar *str = NULL; guint8 oct; - proto_item *item; - proto_item *item_colour; proto_tree *subtree; proto_tree *subtree_colour; @@ -1934,9 +1926,8 @@ dis_iei_tf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length, gsm_s oct = tvb_get_guint8(tvb, offset); - item = proto_tree_add_text(tree, tvb, offset, 1, "formatting mode"); + subtree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_udh_tfm, NULL, "formatting mode"); - subtree = proto_item_add_subtree(item, ett_udh_tfm); switch(oct & 0x03) { case 0x00: @@ -2008,10 +1999,7 @@ dis_iei_tf(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length, gsm_s if (length > 3) { oct = tvb_get_guint8(tvb, offset); - item_colour = proto_tree_add_text(tree, tvb, offset, 1, "Text Colour"); - - subtree_colour = proto_item_add_subtree(item_colour, ett_udh_tfc); - + subtree_colour = proto_tree_add_subtree(tree, tvb, offset, 1, ett_udh_tfc, NULL, "Text Colour"); str = val_to_str_ext_const(oct & 0x0f, &text_color_values_ext, "Unknown"); proto_tree_add_text(subtree_colour, tvb, offset, 1, @@ -2287,7 +2275,6 @@ dis_field_ud_iei(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length, { void (*iei_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length, gsm_sms_udh_fields_t *p_udh_fields); guint8 oct; - proto_item *item; proto_tree *subtree; const gchar *str = NULL; guint8 iei_len; @@ -2370,14 +2357,12 @@ dis_field_ud_iei(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 length, iei_len = tvb_get_guint8(tvb, offset + 1); - item = - proto_tree_add_text(tree, + subtree = + proto_tree_add_subtree_format(tree, tvb, offset, iei_len + 2, - "IE: %s", + ett_udh_ieis[oct], NULL, "IE: %s", str); - subtree = proto_item_add_subtree(item, ett_udh_ieis[oct]); - proto_tree_add_text(subtree, tvb, offset, 1, "Information Element Identifier: 0x%02X", @@ -2416,7 +2401,6 @@ dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length, guint8 *udl, enum character_set cset, guint8 *fill_bits, gsm_sms_udh_fields_t *p_udh_fields) { guint8 oct; - proto_item *udh_item; proto_tree *udh_subtree; static const guint8 fill_bits_mask_gsm[7] = { 0x0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f }; static const guint8 fill_bits_mask_ascii[7] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc }; @@ -2425,12 +2409,10 @@ dis_field_udh(tvbuff_t *tvb, proto_tree *tree, guint32 *offset, guint32 *length, oct = tvb_get_guint8(tvb, *offset); - udh_item = - proto_tree_add_text(tree, tvb, + udh_subtree = + proto_tree_add_subtree(tree, tvb, *offset, oct + 1, - "User-Data Header"); - - udh_subtree = proto_item_add_subtree(udh_item, ett_udh); + ett_udh, NULL, "User-Data Header"); proto_tree_add_text(udh_subtree, tvb, *offset, 1, @@ -2483,7 +2465,6 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset guint32 length, gboolean udhi, guint8 udl, gboolean seven_bit, gboolean eight_bit, gboolean ucs2, gboolean compressed, gsm_sms_data_t *data) { - proto_item *item; proto_tree *subtree; tvbuff_t *sm_tvb = NULL; fragment_head *fd_sm = NULL; @@ -2504,11 +2485,10 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset memset(&udh_fields, 0, sizeof(udh_fields)); fill_bits = 0; - item = - proto_tree_add_text(tree, tvb, + subtree = + proto_tree_add_subtree(tree, tvb, offset, length, - "TP-User-Data"); - subtree = proto_item_add_subtree(item, ett_ud); + ett_ud, NULL, "TP-User-Data"); if (udhi) { @@ -2713,17 +2693,13 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset static void dis_field_pi(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint8 oct) { - proto_item *item; proto_tree *subtree; - - item = - proto_tree_add_text(tree, tvb, - offset, 1, + subtree = + proto_tree_add_subtree(tree, tvb, + offset, 1, ett_pi, NULL, "TP-Parameter-Indicator"); - subtree = proto_item_add_subtree(item, ett_pi); - other_decode_bitfield_value(bigbuf, oct, 0x80, 8); proto_tree_add_text(subtree, tvb, offset, 1, diff --git a/epan/dissectors/packet-gtp.c b/epan/dissectors/packet-gtp.c index 23e953e379..3bb90d28fd 100644 --- a/epan/dissectors/packet-gtp.c +++ b/epan/dissectors/packet-gtp.c @@ -331,6 +331,7 @@ static gint ett_gtp_uli_rai = -1; static expert_field ei_gtp_ext_hdr_pdcpsn = EI_INIT; static expert_field ei_gtp_ext_length_mal = EI_INIT; static expert_field ei_gtp_ext_length_warn = EI_INIT; +static expert_field ei_gtp_undecoded = EI_INIT; static gboolean g_gtp_etsi_order = FALSE; @@ -3225,10 +3226,9 @@ decode_gtp_rai(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * { proto_tree *ext_tree_rai; - proto_item *te; - te = proto_tree_add_text(tree, tvb, offset, 1, "%s", val_to_str_ext_const(GTP_EXT_RAI, >p_val_ext, "Unknown message")); - ext_tree_rai = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RAI]); + ext_tree_rai = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtp_ies[GTP_EXT_RAI], NULL, + val_to_str_ext_const(GTP_EXT_RAI, >p_val_ext, "Unknown message")); dissect_e212_mcc_mnc(tvb, pinfo, ext_tree_rai, offset+1, TRUE); proto_tree_add_item(ext_tree_rai, hf_gtp_rai_lac, tvb, offset + 4, 2, ENC_BIG_ENDIAN); @@ -3276,7 +3276,6 @@ decode_qos_gprs(tvbuff_t * tvb, int offset, proto_tree * tree, const gchar * qos guint8 spare1, delay, reliability, peak, spare2, precedence, spare3, mean; proto_tree *ext_tree_qos; - proto_item *te; spare1 = tvb_get_guint8(tvb, offset) & GTP_EXT_QOS_SPARE1_MASK; delay = tvb_get_guint8(tvb, offset) & GTP_EXT_QOS_DELAY_MASK; @@ -3287,9 +3286,9 @@ decode_qos_gprs(tvbuff_t * tvb, int offset, proto_tree * tree, const gchar * qos spare3 = tvb_get_guint8(tvb, offset + 2) & GTP_EXT_QOS_SPARE3_MASK; mean = tvb_get_guint8(tvb, offset + 2) & GTP_EXT_QOS_MEAN_MASK; - te = proto_tree_add_text(tree, tvb, offset - adjust, 3 + adjust, "%s: delay: %u, reliability: %u, peak: %u, precedence: %u, mean: %u", + ext_tree_qos = proto_tree_add_subtree_format(tree, tvb, offset - adjust, 3 + adjust, ett_gtp_qos, NULL, + "%s: delay: %u, reliability: %u, peak: %u, precedence: %u, mean: %u", qos_str, (delay >> 3) & 0x07, reliability, (peak >> 4) & 0x0F, precedence, mean); - ext_tree_qos = proto_item_add_subtree(te, ett_gtp_qos); if (adjust != 0) { proto_tree_add_uint(ext_tree_qos, hf_gtp_qos_spare1, tvb, offset, 1, spare1); @@ -3344,10 +3343,9 @@ decode_gtp_auth_tri(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t { proto_tree *ext_tree_auth_tri; - proto_item *te; - te = proto_tree_add_text(tree, tvb, offset, 29, "%s", val_to_str_ext_const(GTP_EXT_AUTH_TRI, >p_val_ext, "Unknown message")); - ext_tree_auth_tri = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_AUTH_TRI]); + ext_tree_auth_tri = proto_tree_add_subtree(tree, tvb, offset, 29, ett_gtp_ies[GTP_EXT_AUTH_TRI], NULL, + val_to_str_ext_const(GTP_EXT_AUTH_TRI, >p_val_ext, "Unknown message")); proto_tree_add_text(ext_tree_auth_tri, tvb, offset + 1, 16, "RAND: %s", tvb_bytes_to_ep_str(tvb, offset + 1, 16)); proto_tree_add_text(ext_tree_auth_tri, tvb, offset + 17, 4, "SRES: %s", tvb_bytes_to_ep_str(tvb, offset + 17, 4)); @@ -3506,12 +3504,11 @@ decode_gtp_18(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * guint16 flow_ii; guint32 teid_ii; proto_tree *ext_tree_flow_ii; - proto_item *te; switch (gtp_version) { case 0: - te = proto_tree_add_text(tree, tvb, offset, 4, "%s", val_to_str_ext_const(GTP_EXT_FLOW_II, >p_val_ext, "Unknown message")); - ext_tree_flow_ii = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_FLOW_II]); + ext_tree_flow_ii = proto_tree_add_subtree(tree, tvb, offset, 4, ett_gtp_ies[GTP_EXT_FLOW_II], NULL, + val_to_str_ext_const(GTP_EXT_FLOW_II, >p_val_ext, "Unknown message")); proto_tree_add_item(ext_tree_flow_ii, hf_gtp_nsapi, tvb, offset + 1, 1, ENC_BIG_ENDIAN); @@ -3520,8 +3517,8 @@ decode_gtp_18(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * return 4; case 1: - te = proto_tree_add_text(tree, tvb, offset, 6, "%s", val_to_str_ext_const(GTP_EXT_TEID_II, >pv1_val_ext, "Unknown message")); - ext_tree_flow_ii = proto_item_add_subtree(te, ett_gtp_flow_ii); + ext_tree_flow_ii = proto_tree_add_subtree(tree, tvb, offset, 6, ett_gtp_flow_ii, NULL, + val_to_str_ext_const(GTP_EXT_TEID_II, >pv1_val_ext, "Unknown message")); proto_tree_add_item(ext_tree_flow_ii, hf_gtp_nsapi, tvb, offset + 1, 1, ENC_BIG_ENDIAN); @@ -3573,8 +3570,8 @@ decode_gtp_nsapi(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree proto_tree *ext_tree; proto_item *te; - te = proto_tree_add_text(tree, tvb, offset, 10, "%s", val_to_str_ext_const(GTP_EXT_NSAPI, >p_val_ext, "Unknown message")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_NSAPI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 10, ett_gtp_ies[GTP_EXT_NSAPI], &te, + val_to_str_ext_const(GTP_EXT_NSAPI, >p_val_ext, "Unknown message")); nsapi = tvb_get_guint8(tvb, offset + 1) & 0x0F; proto_tree_add_item(ext_tree, hf_gtp_nsapi, tvb, offset + 1, 1, ENC_BIG_ENDIAN); @@ -3640,10 +3637,9 @@ static int decode_gtp_rab_cntxt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree) { proto_tree *ext_tree_rab_cntxt; - proto_item *te; - te = proto_tree_add_text(tree, tvb, offset, 10, "%s", val_to_str_ext_const(GTP_EXT_RAB_CNTXT, >p_val_ext, "Unknown message")); - ext_tree_rab_cntxt = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RAB_CNTXT]); + ext_tree_rab_cntxt = proto_tree_add_subtree(tree, tvb, offset, 10, ett_gtp_ies[GTP_EXT_RAB_CNTXT], NULL, + val_to_str_ext_const(GTP_EXT_RAB_CNTXT, >p_val_ext, "Unknown message")); proto_tree_add_item(ext_tree_rab_cntxt, hf_gtp_nsapi, tvb, offset + 1, 1, ENC_BIG_ENDIAN); proto_tree_add_item(ext_tree_rab_cntxt, hf_gtp_rab_gtpu_dn, tvb, offset + 2, 2, ENC_BIG_ENDIAN); @@ -3806,11 +3802,10 @@ decode_gtp_ra_prio_lcs(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_RA_PRIO_LCS, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RA_PRIO_LCS]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RA_PRIO_LCS], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_RA_PRIO_LCS, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -3872,11 +3867,11 @@ decode_gtp_user_addr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ pdp_org = tvb_get_guint8(tvb, offset + 3) & 0x0F; pdp_typ = tvb_get_guint8(tvb, offset + 4); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s (%s/%s)", + ext_tree_user = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, + ett_gtp_ies[GTP_EXT_USER_ADDR], &te, "%s (%s/%s)", val_to_str_ext_const(GTP_EXT_USER_ADDR, >p_val_ext, "Unknown message"), val_to_str_const(pdp_org, pdp_org_type, "Unknown PDP Organization"), val_to_str_const(pdp_typ, pdp_type, "Unknown PDP Type")); - ext_tree_user = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_USER_ADDR]); proto_tree_add_text(ext_tree_user, tvb, offset + 1, 2, "Length : %u", length); proto_tree_add_uint(ext_tree_user, hf_gtp_user_addr_pdp_org, tvb, offset + 3, 1, pdp_org); @@ -3919,12 +3914,10 @@ decode_triplet(tvbuff_t * tvb, int offset, proto_tree * tree, guint16 count) { proto_tree *ext_tree_trip; - proto_item *te_trip; guint16 i; for (i = 0; i < count; i++) { - te_trip = proto_tree_add_text(tree, tvb, offset + i * 28, 28, "Triplet no%x", i); - ext_tree_trip = proto_item_add_subtree(te_trip, ett_gtp_trip); + ext_tree_trip = proto_tree_add_subtree_format(tree, tvb, offset + i * 28, 28, ett_gtp_trip, NULL, "Triplet no%x", i); proto_tree_add_text(ext_tree_trip, tvb, offset + i * 28, 16, "RAND: %s", tvb_bytes_to_ep_str(tvb, offset + i * 28, 16)); proto_tree_add_text(ext_tree_trip, tvb, offset + i * 28 + 16, 4, "SRES: %s", tvb_bytes_to_ep_str(tvb, offset + i * 28 + 16, 4)); @@ -3949,9 +3942,8 @@ decode_quintuplet(tvbuff_t * tvb, int offset, proto_tree * tree, guint16 count) for (i = 0; i < count; i++) { - te_quint = proto_tree_add_text(tree, tvb, offset, -1, "Quintuplet #%x", i + 1); - ext_tree_quint = proto_item_add_subtree(te_quint, ett_gtp_quint); - + ext_tree_quint = proto_tree_add_subtree_format(tree, tvb, offset, -1, + ett_gtp_quint, &te_quint, "Quintuplet #%x", i + 1); proto_tree_add_text(ext_tree_quint, tvb, offset + q_offset, 16, "RAND: %s", tvb_bytes_to_ep_str(tvb, offset + q_offset, 16)); q_offset = q_offset + 16; @@ -3989,12 +3981,10 @@ decode_gtp_mm_cntxt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree guint16 length, quint_len, con_len; guint8 count, sec_mode, len, iei; proto_tree *ext_tree_mm; - proto_item *te; - proto_item *tf = NULL; proto_tree *tf_tree = NULL; - te = proto_tree_add_text(tree, tvb, offset, 1, "%s", val_to_str_ext_const(GTP_EXT_MM_CNTXT, >p_val_ext, "Unknown message")); - ext_tree_mm = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MM_CNTXT]); + ext_tree_mm = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtp_ies[GTP_EXT_MM_CNTXT], NULL, + val_to_str_ext_const(GTP_EXT_MM_CNTXT, >p_val_ext, "Unknown message")); /* Octet 2 - 3 */ length = tvb_get_ntohs(tvb, offset + 1); @@ -4071,15 +4061,12 @@ decode_gtp_mm_cntxt(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree /* * 3GPP TS 24.008 10.5.5.6 ( see packet-gsm_a.c ) */ - tf = proto_tree_add_text(ext_tree_mm, tvb, offset, 2, "DRX Parameter"); - tf_tree = proto_item_add_subtree(tf, ett_gtp_drx); + tf_tree = proto_tree_add_subtree(ext_tree_mm, tvb, offset, 2, ett_gtp_drx, NULL, "DRX Parameter"); de_gmm_drx_param(tvb, tf_tree, pinfo, offset, 2, NULL, 0); offset = offset + 2; len = tvb_get_guint8(tvb, offset); - tf = proto_tree_add_text(ext_tree_mm, tvb, offset, len + 1, "MS Network Capability"); - - tf_tree = proto_item_add_subtree(tf, ett_gtp_net_cap); + tf_tree = proto_tree_add_subtree(ext_tree_mm, tvb, offset, len + 1, ett_gtp_net_cap, NULL, "MS Network Capability"); proto_tree_add_text(tf_tree, tvb, offset, 1, "Length of MS network capability contents: %u", len); @@ -4182,7 +4169,6 @@ decode_qos_umts(tvbuff_t * tvb, int offset, proto_tree * tree, const gchar * qos guint8 guar_ul, guar_dl, guar_ul_ext, guar_dl_ext; guint8 src_stat_desc, sig_ind; proto_tree *ext_tree_qos, *ext_tree_qos_arp; - proto_item *te; int mss, mu, md, gu, gd; guint8 arp, qci; guint32 apn_ambr; @@ -4214,16 +4200,14 @@ decode_qos_umts(tvbuff_t * tvb, int offset, proto_tree * tree, const gchar * qos switch (type) { case 1: length = tvb_get_guint8(tvb, offset); - te = proto_tree_add_text(tree, tvb, offset, length + 1, "%s", qos_str); - ext_tree_qos = proto_item_add_subtree(te, ett_gtp_qos); + ext_tree_qos = proto_tree_add_subtree(tree, tvb, offset, length + 1, ett_gtp_qos, NULL, qos_str); proto_tree_add_text(ext_tree_qos, tvb, offset, 1, "Length: %u", length); offset++; retval = length + 1; break; case 2: length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, length + 3, "%s", qos_str); - ext_tree_qos = proto_item_add_subtree(te, ett_gtp_qos); + ext_tree_qos = proto_tree_add_subtree(tree, tvb, offset, length + 3, ett_gtp_qos, NULL, qos_str); proto_tree_add_text(ext_tree_qos, tvb, offset + 1, 2, "Length: %u", length); offset += 3; /* +1 because of first 0x86 byte for UMTS QoS */ retval = length + 3; @@ -4234,9 +4218,7 @@ decode_qos_umts(tvbuff_t * tvb, int offset, proto_tree * tree, const gchar * qos /* The field in the RADIUS message is the length of the tvb we were given */ length = tvb_reported_length(tvb); - te = proto_tree_add_text(tree, tvb, offset, length, "%s", qos_str); - - ext_tree_qos = proto_item_add_subtree(te, ett_gtp_qos); + ext_tree_qos = proto_tree_add_subtree(tree, tvb, offset, length, ett_gtp_qos, NULL, qos_str); rel_ind = wrapped_tvb_get_guint8(tvb, offset, 2); proto_tree_add_uint(ext_tree_qos, hf_gtp_qos_version, tvb, offset, 2, rel_ind); @@ -4270,8 +4252,7 @@ decode_qos_umts(tvbuff_t * tvb, int offset, proto_tree * tree, const gchar * qos /* Release 8 or higher P-GW QoS profile */ offset++; arp = wrapped_tvb_get_guint8(tvb, offset, 2); - te = proto_tree_add_text(ext_tree_qos, tvb, offset, 2, "Allocation/Retention Priority"); - ext_tree_qos_arp = proto_item_add_subtree(te, ett_gtp_qos_arp); + ext_tree_qos_arp = proto_tree_add_subtree(ext_tree_qos, tvb, offset, 2, ett_gtp_qos_arp, NULL, "Allocation/Retention Priority"); proto_tree_add_boolean(ext_tree_qos_arp, hf_gtp_qos_arp_pci, tvb, offset, 2, arp); proto_tree_add_uint(ext_tree_qos_arp, hf_gtp_qos_arp_pl, tvb, offset, 2, arp); proto_tree_add_boolean(ext_tree_qos_arp, hf_gtp_qos_arp_pvi, tvb, offset, 2, arp); @@ -4672,12 +4653,11 @@ decode_gtp_pdp_cntxt(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ guint32 addr_ipv4; struct e_in6_addr addr_ipv6; proto_tree *ext_tree_pdp; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, length + 3, "%s", val_to_str_ext_const(GTP_EXT_PDP_CNTXT, >p_val_ext, "Unknown message")); - ext_tree_pdp = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_PDP_CNTXT]); + ext_tree_pdp = proto_tree_add_subtree(tree, tvb, offset, length + 3, ett_gtp_ies[GTP_EXT_PDP_CNTXT], NULL, + val_to_str_ext_const(GTP_EXT_PDP_CNTXT, >p_val_ext, "Unknown message")); vaa = (tvb_get_guint8(tvb, offset + 3) >> 6) & 0x01; asi = (tvb_get_guint8(tvb, offset + 3) >> 5) & 0x01; @@ -4831,8 +4811,8 @@ decode_gtp_apn(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, length + 3, "%s", val_to_str_ext_const(GTP_EXT_APN, >p_val_ext, "Unknown field")); - ext_tree_apn = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_APN]); + ext_tree_apn = proto_tree_add_subtree(tree, tvb, offset, length + 3, ett_gtp_ies[GTP_EXT_APN], &te, + val_to_str_ext_const(GTP_EXT_APN, >p_val_ext, "Unknown field")); proto_tree_add_text(ext_tree_apn, tvb, offset + 1, 2, "APN length : %u", length); decode_apn(tvb, offset + 3, length, ext_tree_apn, te); @@ -4852,12 +4832,11 @@ decode_gtp_proto_conf(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tre guint16 length; tvbuff_t *next_tvb; proto_tree *ext_tree_proto; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, length + 3, "%s", val_to_str_ext_const(GTP_EXT_PROTO_CONF, >p_val_ext, "Unknown message")); - ext_tree_proto = proto_item_add_subtree(te, ett_gtp_proto); + ext_tree_proto = proto_tree_add_subtree(tree, tvb, offset, length + 3, + ett_gtp_proto, NULL, val_to_str_ext_const(GTP_EXT_PROTO_CONF, >p_val_ext, "Unknown message")); proto_tree_add_text(ext_tree_proto, tvb, offset + 1, 2, "Length: %u", length); @@ -4890,8 +4869,7 @@ decode_gtp_gsn_addr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "GSN address : "); - ext_tree_gsn_addr = proto_item_add_subtree(te, ett_gtp_gsn_addr); + ext_tree_gsn_addr = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_gsn_addr, &te, "GSN address : "); switch (length) { case 4: @@ -4943,12 +4921,11 @@ decode_gtp_msisdn(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * guint16 length; tvbuff_t *next_tvb; proto_tree *ext_tree_proto; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, length + 3, "%s", val_to_str_ext_const(GTP_EXT_MSISDN, >p_val_ext, "Unknown message")); - ext_tree_proto = proto_item_add_subtree(te, ett_gtp_proto); + ext_tree_proto = proto_tree_add_subtree(tree, tvb, offset, length + 3, ett_gtp_proto, NULL, + val_to_str_ext_const(GTP_EXT_MSISDN, >p_val_ext, "Unknown message")); proto_tree_add_text(ext_tree_proto, tvb, offset + 1, 2, "Length: %u", length); @@ -4982,15 +4959,13 @@ decode_gtp_auth_qui(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t { proto_tree *ext_tree; - proto_item *te_quint; guint16 length; guint8 xres_len, auth_len; length = tvb_get_ntohs(tvb, offset + 1); - te_quint = proto_tree_add_text(tree, tvb, offset, length + 1, "Quintuplet"); - ext_tree = proto_item_add_subtree(te_quint, ett_gtp_quint); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, length + 1, ett_gtp_quint, NULL, "Quintuplet"); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5030,12 +5005,11 @@ decode_gtp_tft(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * guint32 mask_ipv4, addr_ipv4, ipsec_id, label; struct e_in6_addr addr_ipv6, mask_ipv6; proto_tree *ext_tree_tft, *ext_tree_tft_pf, *ext_tree_tft_flags; - proto_item *te, *tee, *tef; + proto_item *tee; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Traffic flow template"); - ext_tree_tft = proto_item_add_subtree(te, ett_gtp_tft); + ext_tree_tft = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_tft, NULL, "Traffic flow template"); tft_flags = tvb_get_guint8(tvb, offset + 3); tft_code = (tft_flags >> 5) & 0x07; @@ -5043,8 +5017,7 @@ decode_gtp_tft(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * proto_tree_add_text(ext_tree_tft, tvb, offset + 1, 2, "TFT length: %u", length); - tef = proto_tree_add_text(ext_tree_tft, tvb, offset + 3, 1, "TFT flags"); - ext_tree_tft_flags = proto_item_add_subtree(tef, ett_gtp_tft_flags); + ext_tree_tft_flags = proto_tree_add_subtree(ext_tree_tft, tvb, offset + 3, 1, ett_gtp_tft_flags, NULL, "TFT flags"); proto_tree_add_uint(ext_tree_tft_flags, hf_gtp_tft_code, tvb, offset + 3, 1, tft_flags); proto_tree_add_uint(ext_tree_tft_flags, hf_gtp_tft_spare, tvb, offset + 3, 1, tft_flags); proto_tree_add_uint(ext_tree_tft_flags, hf_gtp_tft_number, tvb, offset + 3, 1, tft_flags); @@ -5168,13 +5141,11 @@ decode_gtp_target_id(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree { guint16 length; - proto_item *te; proto_tree *ext_tree; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Target Identification"); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_TARGET_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_TARGET_ID], NULL, "Target Identification"); offset = offset + 1; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; @@ -5216,13 +5187,12 @@ decode_gtp_utran_cont(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto { guint16 length; - proto_item *te; proto_tree *ext_tree; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "UTRAN transparent Container"); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_UTRAN_CONT]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_UTRAN_CONT], NULL, "UTRAN transparent Container"); + offset = offset + 1; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; @@ -5240,16 +5210,13 @@ static int decode_gtp_rab_setup(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree) { - guint32 teid, addr_ipv4; + guint32 teid; guint16 length; - struct e_in6_addr addr_ipv6; proto_tree *ext_tree_rab_setup; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Radio Access Bearer Setup Information"); - ext_tree_rab_setup = proto_item_add_subtree(te, ett_gtp_rab_setup); + ext_tree_rab_setup = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_rab_setup, NULL, "Radio Access Bearer Setup Information"); proto_tree_add_text(ext_tree_rab_setup, tvb, offset + 1, 2, "RAB setup length : %u", length); proto_tree_add_item(ext_tree_rab_setup, hf_gtp_nsapi, tvb, offset + 3, 1, ENC_BIG_ENDIAN); @@ -5262,12 +5229,10 @@ decode_gtp_rab_setup(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ switch (length) { case 12: - addr_ipv4 = tvb_get_ipv4(tvb, offset + 8); - proto_tree_add_ipv4(ext_tree_rab_setup, hf_gtp_rnc_ipv4, tvb, offset + 8, 4, addr_ipv4); + proto_tree_add_item(ext_tree_rab_setup, hf_gtp_rnc_ipv4, tvb, offset + 8, 4, ENC_BIG_ENDIAN); break; case 24: - tvb_get_ipv6(tvb, offset + 8, &addr_ipv6); - proto_tree_add_ipv6(ext_tree_rab_setup, hf_gtp_rnc_ipv6, tvb, offset + 8, 16, (guint8 *) & addr_ipv6); + proto_tree_add_item(ext_tree_rab_setup, hf_gtp_rnc_ipv6, tvb, offset + 8, 16, ENC_NA); break; default: break; @@ -5288,12 +5253,11 @@ decode_gtp_hdr_list(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t int i; guint8 length, hdr; proto_tree *ext_tree_hdr_list; - proto_item *te; length = tvb_get_guint8(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 2 + length, "%s", val_to_str_ext_const(GTP_EXT_HDR_LIST, >p_val_ext, "Unknown")); - ext_tree_hdr_list = proto_item_add_subtree(te, ett_gtp_hdr_list); + ext_tree_hdr_list = proto_tree_add_subtree(tree, tvb, offset, 2 + length, ett_gtp_hdr_list, NULL, + val_to_str_ext_const(GTP_EXT_HDR_LIST, >p_val_ext, "Unknown")); proto_tree_add_text(ext_tree_hdr_list, tvb, offset + 1, 1, "Number of Extension Header Types in list (i.e., length) : %u", length); @@ -5358,8 +5322,8 @@ decode_gtp_chrg_addr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_CHRG_ADDR, >p_val_ext, "Unknown")); - ext_tree_chrg_addr = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CHRG_ADDR]); + ext_tree_chrg_addr = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CHRG_ADDR], &te, + "%s : ", val_to_str_ext_const(GTP_EXT_CHRG_ADDR, >p_val_ext, "Unknown")); proto_tree_add_text(ext_tree_chrg_addr, tvb, offset + 1, 2, "%s length : %u", val_to_str_ext_const(GTP_EXT_CHRG_ADDR, >p_val_ext, "Unknown"), length); @@ -5394,12 +5358,11 @@ decode_gtp_ran_tr_cont(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tr guint16 length; proto_tree *ext_tree; - proto_item *te; tvbuff_t *next_tvb; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_RAN_TR_CONT, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RAN_TR_CONT]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RAN_TR_CONT], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_RAN_TR_CONT, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5421,22 +5384,21 @@ decode_gtp_ran_tr_cont(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tr * UMTS: 29.060 v6.11.0, chapter 7.7.45 PDP Context Prioritization */ static int -decode_gtp_pdp_cont_prio(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * tree) +decode_gtp_pdp_cont_prio(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tree) { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_PDP_CONT_PRIO, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_PDP_CONT_PRIO]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_PDP_CONT_PRIO], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_PDP_CONT_PRIO, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -5451,17 +5413,16 @@ decode_gtp_add_rab_setup_inf(tvbuff_t * tvb, int offset, packet_info * pinfo _U_ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_ADD_RAB_SETUP_INF, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_ADD_RAB_SETUP_INF]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_ADD_RAB_SETUP_INF], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_ADD_RAB_SETUP_INF, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -5477,17 +5438,16 @@ decode_gtp_ssgn_no(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tr guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_SSGN_NO, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_SSGN_NO]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_SSGN_NO], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_SSGN_NO, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -5502,11 +5462,10 @@ decode_gtp_common_flgs(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_COMMON_FLGS, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_COMMON_FLGS]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_COMMON_FLGS], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_COMMON_FLGS, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5541,11 +5500,10 @@ decode_gtp_apn_res(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * guint16 length; proto_tree *ext_tree_apn_res; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s : ", val_to_str_ext_const(GTP_EXT_APN_RES, >p_val_ext, "Unknown")); - ext_tree_apn_res = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_APN_RES]); + ext_tree_apn_res = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_APN_RES], NULL, + "%s : ", val_to_str_ext_const(GTP_EXT_APN_RES, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree_apn_res, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5576,8 +5534,8 @@ decode_gtp_rat_type(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_RAT_TYPE, >p_val_ext, "Unknown")); - ext_tree_rat_type = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RAT_TYPE]); + ext_tree_rat_type = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RAT_TYPE], &te, + val_to_str_ext_const(GTP_EXT_RAT_TYPE, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree_rat_type, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5696,12 +5654,11 @@ decode_gtp_usr_loc_inf(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tr guint16 length; proto_tree *ext_tree, *rai_tree; - proto_item *te, *fi; guint8 geo_loc_type; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_USR_LOC_INF, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_USR_LOC_INF]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_USR_LOC_INF], NULL, + val_to_str_ext_const(GTP_EXT_USR_LOC_INF, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5737,8 +5694,7 @@ decode_gtp_usr_loc_inf(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tr * registered. RAI is defined in sub-clause 4.2 of 3GPP TS 23.003 * [2]. */ - fi = proto_tree_add_text(ext_tree, tvb, offset + 1, 7, "Routeing Area Identity (RAI)"); - rai_tree = proto_item_add_subtree(fi, ett_gtp_uli_rai); + rai_tree = proto_tree_add_subtree(ext_tree, tvb, offset + 1, 7, ett_gtp_uli_rai, NULL, "Routeing Area Identity (RAI)"); dissect_e212_mcc_mnc(tvb, pinfo, rai_tree, offset, TRUE); offset+=3; @@ -5783,8 +5739,8 @@ decode_gtp_ms_time_zone(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, pro char sign; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s: ", val_to_str_ext_const(GTP_EXT_MS_TIME_ZONE, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MS_TIME_ZONE]); + ext_tree = proto_tree_add_subtree_format(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MS_TIME_ZONE], &te, + "%s: ", val_to_str_ext_const(GTP_EXT_MS_TIME_ZONE, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5830,8 +5786,8 @@ decode_gtp_imeisv(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tre const char *digit_str; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_IMEISV, >p_val_ext, "Unknown")); - ext_imeisv = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_IMEISV]); + ext_imeisv = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_IMEISV], &te, + val_to_str_ext_const(GTP_EXT_IMEISV, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_imeisv, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5862,17 +5818,16 @@ decode_gtp_camel_chg_inf_con(tvbuff_t * tvb, int offset, packet_info * pinfo _U_ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_CAMEL_CHG_INF_CON, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CAMEL_CHG_INF_CON]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CAMEL_CHG_INF_CON], NULL, + val_to_str_ext_const(GTP_EXT_CAMEL_CHG_INF_CON, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -5888,17 +5843,16 @@ decode_gtp_mbms_ue_ctx(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_UE_CTX, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_UE_CTX]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_UE_CTX], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_UE_CTX, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -5918,12 +5872,12 @@ decode_gtp_tmgi(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tr guint16 length; proto_tree *ext_tree, *tmgi_tree; - proto_item *te, *ti; + proto_item *ti; tvbuff_t *next_tvb; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_TMGI, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_TMGI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_TMGI], NULL, + val_to_str_ext_const(GTP_EXT_TMGI, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5948,11 +5902,10 @@ decode_gtp_rim_ra(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tre guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_RIM_RA, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RIM_RA]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RIM_RA], NULL, + val_to_str_ext_const(GTP_EXT_RIM_RA, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -5977,17 +5930,16 @@ decode_gtp_mbms_prot_conf_opt(tvbuff_t * tvb, int offset, packet_info * pinfo _U guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_PROT_CONF_OPT, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_PROT_CONF_OPT]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_PROT_CONF_OPT], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_PROT_CONF_OPT, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6017,11 +5969,10 @@ decode_gtp_mbms_ses_dur(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, pro guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_SES_DUR, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_SES_DUR]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_SES_DUR], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_SES_DUR, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6092,11 +6043,10 @@ decode_gtp_mbms_sa(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree * tvbuff_t *next_tvb; guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_SA, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_SA]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_SA], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_SA, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6118,17 +6068,16 @@ decode_gtp_src_rnc_pdp_ctx_inf(tvbuff_t * tvb, int offset, packet_info * pinfo _ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_SRC_RNC_PDP_CTX_INF, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_SRC_RNC_PDP_CTX_INF]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_SRC_RNC_PDP_CTX_INF], NULL, + val_to_str_ext_const(GTP_EXT_SRC_RNC_PDP_CTX_INF, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6144,17 +6093,16 @@ decode_gtp_add_trs_inf(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_ADD_TRS_INF, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_ADD_TRS_INF]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_ADD_TRS_INF], NULL, + val_to_str_ext_const(GTP_EXT_ADD_TRS_INF, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6170,17 +6118,16 @@ decode_gtp_hop_count(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_HOP_COUNT, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_HOP_COUNT]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_HOP_COUNT], NULL, + val_to_str_ext_const(GTP_EXT_HOP_COUNT, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6196,11 +6143,10 @@ decode_gtp_sel_plmn_id(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tr guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_SEL_PLMN_ID, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_SES_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_SES_ID], NULL, + val_to_str_ext_const(GTP_EXT_SEL_PLMN_ID, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6221,17 +6167,15 @@ decode_gtp_mbms_ses_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_SES_ID, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_SES_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_SES_ID], NULL, val_to_str_ext_const(GTP_EXT_MBMS_SES_ID, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6254,11 +6198,10 @@ decode_gtp_mbms_2g_3g_ind(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, p guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_2G_3G_IND, >p_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_2G_3G_IND]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_2G_3G_IND], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_2G_3G_IND, >p_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6280,17 +6223,15 @@ decode_gtp_enh_nsapi(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_ENH_NSAPI, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_ENH_NSAPI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_ENH_NSAPI], NULL, val_to_str_ext_const(GTP_EXT_ENH_NSAPI, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6306,17 +6247,16 @@ decode_gtp_add_mbms_trs_inf(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_ADD_MBMS_TRS_INF, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_ADD_MBMS_TRS_INF]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_ADD_MBMS_TRS_INF], NULL, + val_to_str_ext_const(GTP_EXT_ADD_MBMS_TRS_INF, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6332,17 +6272,16 @@ decode_gtp_mbms_ses_id_rep_no(tvbuff_t * tvb, int offset, packet_info * pinfo _U guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_SES_ID_REP_NO, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_SES_ID_REP_NO]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_SES_ID_REP_NO], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_SES_ID_REP_NO, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6373,12 +6312,11 @@ decode_gtp_mbms_time_to_data_tr(tvbuff_t * tvb, int offset, packet_info * pinfo guint16 length; proto_tree *ext_tree; - proto_item *te; guint8 time_2_dta_tr; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_TIME_TO_DATA_TR, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_TIME_TO_DATA_TR]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_TIME_TO_DATA_TR], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_TIME_TO_DATA_TR, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6418,17 +6356,16 @@ decode_gtp_ps_ho_req_ctx(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, pr guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_PS_HO_REQ_CTX, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_PS_HO_REQ_CTX]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_PS_HO_REQ_CTX], NULL, + val_to_str_ext_const(GTP_EXT_PS_HO_REQ_CTX, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6444,17 +6381,16 @@ decode_gtp_bss_cont(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_BSS_CONT, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_BSS_CONT]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_BSS_CONT], NULL, + val_to_str_ext_const(GTP_EXT_BSS_CONT, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); /* * The content of this container is defined in 3GPP TS 48.018 */ @@ -6473,17 +6409,16 @@ decode_gtp_cell_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tr guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_CELL_ID, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CELL_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CELL_ID], NULL, + val_to_str_ext_const(GTP_EXT_CELL_ID, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); /* * for PS handover from A/Gb mode, the identification of a target cell (Cell ID 1) and the identification of the * source cell (Cell ID 2) as defined in 3GPP TS 48.018 [20]. @@ -6506,17 +6441,16 @@ decode_gtp_pdu_no(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tre guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_PDU_NO, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_PDU_NO]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_PDU_NO], NULL, + val_to_str_ext_const(GTP_EXT_PDU_NO, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6532,11 +6466,10 @@ decode_gtp_bssgp_cause(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_BSSGP_CAUSE, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_BSSGP_CAUSE]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_BSSGP_CAUSE], NULL, + val_to_str_ext_const(GTP_EXT_BSSGP_CAUSE, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6559,11 +6492,10 @@ decode_gtp_mbms_bearer_cap(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_REQ_MBMS_BEARER_CAP, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_REQ_MBMS_BEARER_CAP]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_REQ_MBMS_BEARER_CAP], NULL, + val_to_str_ext_const(GTP_EXT_REQ_MBMS_BEARER_CAP, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6595,11 +6527,10 @@ decode_gtp_rim_ra_disc(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_RIM_ROUTING_ADDR_DISC, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RIM_ROUTING_ADDR_DISC]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RIM_ROUTING_ADDR_DISC], NULL, + val_to_str_ext_const(GTP_EXT_RIM_ROUTING_ADDR_DISC, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6622,17 +6553,16 @@ decode_gtp_lst_set_up_pfc(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, p guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_LIST_OF_SETUP_PFCS, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_LIST_OF_SETUP_PFCS]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_LIST_OF_SETUP_PFCS], NULL, + val_to_str_ext_const(GTP_EXT_LIST_OF_SETUP_PFCS, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6646,14 +6576,13 @@ decode_gtp_ps_handover_xid(tvbuff_t * tvb, int offset, packet_info * pinfo, prot guint16 length; proto_tree *ext_tree; - proto_item *te; tvbuff_t *next_tvb; guint8 sapi; guint8 xid_par_len; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_PS_HANDOVER_XIP_PAR, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_PS_HANDOVER_XIP_PAR]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_PS_HANDOVER_XIP_PAR], NULL, + val_to_str_ext_const(GTP_EXT_PS_HANDOVER_XIP_PAR, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -6686,17 +6615,16 @@ decode_gtp_ms_inf_chg_rep_act(tvbuff_t * tvb, int offset, packet_info * pinfo _U guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MS_INF_CHG_REP_ACT, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MS_INF_CHG_REP_ACT]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MS_INF_CHG_REP_ACT], NULL, + val_to_str_ext_const(GTP_EXT_MS_INF_CHG_REP_ACT, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6710,23 +6638,23 @@ decode_gtp_direct_tnl_flg(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, p guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_DIRECT_TUNNEL_FLGS, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_DIRECT_TUNNEL_FLGS]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_DIRECT_TUNNEL_FLGS], NULL, + val_to_str_ext_const(GTP_EXT_DIRECT_TUNNEL_FLGS, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; + /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); proto_tree_add_item(ext_tree, hf_gtp_ext_ei, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(ext_tree, hf_gtp_ext_gcsi, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(ext_tree, hf_gtp_ext_dti, tvb, offset, 1, ENC_BIG_ENDIAN); -#if 0 /* Fix Dead Store Warning */ offset++; -#endif + + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); + return 3 + length; } @@ -6739,17 +6667,16 @@ decode_gtp_corrl_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_CORRELATION_ID, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CORRELATION_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CORRELATION_ID], NULL, + val_to_str_ext_const(GTP_EXT_CORRELATION_ID, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; /* TODO add decoding of data */ - proto_tree_add_text(ext_tree, tvb, offset, length, "Data not decoded yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; @@ -6770,11 +6697,11 @@ decode_gtp_bearer_cntrl_mod(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_BEARER_CONTROL_MODE, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_BEARER_CONTROL_MODE]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_BEARER_CONTROL_MODE], NULL, + val_to_str_ext_const(GTP_EXT_BEARER_CONTROL_MODE, >pv1_val_ext, "Unknown")); + proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -6795,11 +6722,10 @@ decode_gtp_mbms_flow_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, pro { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_FLOW_ID, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_FLOW_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_FLOW_ID], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_FLOW_ID, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -6822,18 +6748,17 @@ decode_gtp_mbms_ip_mcast_dist(tvbuff_t * tvb, int offset, packet_info * pinfo _U { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_IP_MCAST_DIST, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_IP_MCAST_DIST]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_IP_MCAST_DIST], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_IP_MCAST_DIST, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -6854,11 +6779,10 @@ decode_gtp_mbms_dist_ack(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, pr { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MBMS_DIST_ACK, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MBMS_DIST_ACK]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MBMS_DIST_ACK], NULL, + val_to_str_ext_const(GTP_EXT_MBMS_DIST_ACK, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -6879,18 +6803,17 @@ decode_gtp_reliable_irat_ho_inf(tvbuff_t * tvb, int offset, packet_info * pinfo { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_RELIABLE_IRAT_HO_INF, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RELIABLE_IRAT_HO_INF]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RELIABLE_IRAT_HO_INF], NULL, + val_to_str_ext_const(GTP_EXT_RELIABLE_IRAT_HO_INF, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -6903,11 +6826,10 @@ decode_gtp_rfsp_index(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto { guint16 length, rfsp; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_RFSP_INDEX, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RFSP_INDEX]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RFSP_INDEX], NULL, + val_to_str_ext_const(GTP_EXT_RFSP_INDEX, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -6931,12 +6853,11 @@ decode_gtp_fqdn(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, length + 3, "%s", val_to_str_ext_const(GTP_EXT_FQDN, >p_val_ext, "Unknown field")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_FQDN]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, length + 3, ett_gtp_ies[GTP_EXT_FQDN], NULL, + val_to_str_ext_const(GTP_EXT_FQDN, >p_val_ext, "Unknown field")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_text(ext_tree, tvb, offset + 1, 2, "FQDN length : %u", length); @@ -6954,16 +6875,15 @@ decode_gtp_evolved_allc_rtn_p1(tvbuff_t * tvb, int offset, packet_info * pinfo _ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_EVO_ALLO_RETE_P1, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_EVO_ALLO_RETE_P1]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_EVO_ALLO_RETE_P1], NULL, + val_to_str_ext_const(GTP_EXT_EVO_ALLO_RETE_P1, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; proto_tree_add_item(ext_tree, hf_gtp_earp_pvi, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(ext_tree, hf_gtp_earp_pl, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -6983,11 +6903,10 @@ decode_gtp_evolved_allc_rtn_p2(tvbuff_t * tvb, int offset, packet_info * pinfo _ guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_EVO_ALLO_RETE_P2, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_EVO_ALLO_RETE_P2]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_EVO_ALLO_RETE_P2], NULL, + val_to_str_ext_const(GTP_EXT_EVO_ALLO_RETE_P2, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -7014,18 +6933,17 @@ decode_gtp_extended_common_flgs(tvbuff_t * tvb, int offset, packet_info * pinfo { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_EXTENDED_COMMON_FLGS, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_EXTENDED_COMMON_FLGS]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_EXTENDED_COMMON_FLGS], NULL, + val_to_str_ext_const(GTP_EXT_EXTENDED_COMMON_FLGS, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7038,18 +6956,17 @@ decode_gtp_uci(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_UCI, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_UCI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_UCI], NULL, + val_to_str_ext_const(GTP_EXT_UCI, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7063,18 +6980,17 @@ decode_gtp_csg_inf_rep_act(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_CSG_INF_REP_ACT, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CSG_INF_REP_ACT]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CSG_INF_REP_ACT], NULL, + val_to_str_ext_const(GTP_EXT_CSG_INF_REP_ACT, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7087,18 +7003,17 @@ decode_gtp_csg_id(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tre { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_CSG_ID, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CSG_ID]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CSG_ID], NULL, + val_to_str_ext_const(GTP_EXT_CSG_ID, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7110,18 +7025,17 @@ decode_gtp_cmi(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tree * { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_CMI, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_CMI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_CMI], NULL, + val_to_str_ext_const(GTP_EXT_CMI, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); offset = offset + 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7136,8 +7050,8 @@ decode_gtp_apn_ambr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_AMBR, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_RELIABLE_IRAT_HO_INF]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_RELIABLE_IRAT_HO_INF], NULL, + val_to_str_ext_const(GTP_EXT_AMBR, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -7155,7 +7069,6 @@ decode_gtp_apn_ambr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t te = proto_tree_add_item(ext_tree, hf_gtp_ext_apn_ambr_dl, tvb, offset, 4, ENC_BIG_ENDIAN); proto_item_append_text(te, " kbps"); - return 3 + length; } /* @@ -7166,11 +7079,10 @@ decode_gtp_ue_network_cap(tvbuff_t * tvb, int offset, packet_info * pinfo, proto { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_UE_NETWORK_CAP, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_UE_NETWORK_CAP]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_UE_NETWORK_CAP], NULL, + val_to_str_ext_const(GTP_EXT_UE_NETWORK_CAP, >pv1_val_ext, "Unknown")); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -7192,8 +7104,8 @@ decode_gtp_ue_ambr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tr proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_APN_AMBR_WITH_NSAPI, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_APN_AMBR_WITH_NSAPI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_APN_AMBR_WITH_NSAPI], NULL, + val_to_str_ext_const(GTP_EXT_APN_AMBR_WITH_NSAPI, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -7224,7 +7136,7 @@ decode_gtp_ue_ambr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tr te = proto_tree_add_item(ext_tree, hf_gtp_ext_auth_ue_ambr_dl, tvb, offset, 4, ENC_BIG_ENDIAN); proto_item_append_text(te, " kbps"); - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7240,8 +7152,8 @@ decode_gtp_apn_ambr_with_nsapi(tvbuff_t * tvb, int offset, packet_info * pinfo _ proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_UE_AMBR, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_UE_AMBR]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_UE_AMBR], NULL, + val_to_str_ext_const(GTP_EXT_UE_AMBR, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -7280,16 +7192,15 @@ decode_gtp_ggsn_back_off_time(tvbuff_t * tvb, int offset, packet_info * pinfo _U { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_GGSN_BACK_OFF_TIME, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_GGSN_BACK_OFF_TIME]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_GGSN_BACK_OFF_TIME], NULL, + val_to_str_ext_const(GTP_EXT_GGSN_BACK_OFF_TIME, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; /* 4 Timer unit Timer value */ proto_tree_add_item(ext_tree, hf_gtp_ext_ggsn_back_off_time_units, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -7307,18 +7218,17 @@ decode_gtp_sig_pri_ind(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, prot { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_SIG_PRI_IND, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_SIG_PRI_IND]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_SIG_PRI_IND], NULL, + val_to_str_ext_const(GTP_EXT_SIG_PRI_IND, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7331,18 +7241,17 @@ decode_gtp_sig_pri_ind_w_nsapi(tvbuff_t * tvb, int offset, packet_info * pinfo _ { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_SIG_PRI_IND_W_NSAPI, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_SIG_PRI_IND_W_NSAPI]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_SIG_PRI_IND_W_NSAPI], NULL, + val_to_str_ext_const(GTP_EXT_SIG_PRI_IND_W_NSAPI, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7360,16 +7269,15 @@ decode_gtp_higher_br_16mb_flg(tvbuff_t * tvb, int offset, packet_info * pinfo _U { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_HIGHER_BR_16MB_FLG, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_HIGHER_BR_16MB_FLG]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_HIGHER_BR_16MB_FLG], NULL, + val_to_str_ext_const(GTP_EXT_HIGHER_BR_16MB_FLG, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; /* Higher bitrates than 16 Mbps flag */ proto_tree_add_item(ext_tree, hf_gtp_higher_br_16mb_flg, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -7385,13 +7293,12 @@ decode_gtp_max_mbr_apn_ambr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, { guint16 length; proto_tree *ext_tree; - proto_item *te; guint32 max_ul; guint32 max_dl; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_MAX_MBR_APN_AMBR, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_MAX_MBR_APN_AMBR]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_MAX_MBR_APN_AMBR], NULL, + val_to_str_ext_const(GTP_EXT_MAX_MBR_APN_AMBR, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -7400,19 +7307,19 @@ decode_gtp_max_mbr_apn_ambr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, /* Max MBR/APN-AMBR for uplink */ max_ul = tvb_get_ntohl(tvb, offset); - proto_tree_add_uint_format(ext_tree, hf_gtp_max_mbr_apn_ambr_ul, tvb, offset, 4, max_ul, "Max MBR/APN-AMBR for uplink : %u %s", + proto_tree_add_uint_format_value(ext_tree, hf_gtp_max_mbr_apn_ambr_ul, tvb, offset, 4, max_ul, "%u %s", (max_ul) > 1000 ? max_ul/1000 : max_ul, (max_ul) > 1000 ? "Mbps" : "kbps"); - offset += 4; + offset += 4; - /* Max MBR/APN-AMBR for downlink */ - max_dl = tvb_get_ntohl(tvb, offset); - proto_tree_add_uint_format(ext_tree, hf_gtp_max_mbr_apn_ambr_dl, tvb, offset, 4, max_dl, "Max MBR/APN-AMBR for downlink : %u %s", - (max_dl) > 1000 ? max_dl/1000 : max_dl, - (max_dl) > 1000 ? "Mbps" : "kbps"); + /* Max MBR/APN-AMBR for downlink */ + max_dl = tvb_get_ntohl(tvb, offset); + proto_tree_add_uint_format_value(ext_tree, hf_gtp_max_mbr_apn_ambr_dl, tvb, offset, 4, max_dl, "%u %s", + (max_dl) > 1000 ? max_dl/1000 : max_dl, + (max_dl) > 1000 ? "Mbps" : "kbps"); - return 3 + length; + return 3 + length; } /* * 7.7.107 Additional MM context for SRVCC @@ -7423,18 +7330,17 @@ decode_gtp_add_mm_ctx_srvcc(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_ADD_MM_CTX_SRVCC, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_ADD_MM_CTX_SRVCC]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_ADD_MM_CTX_SRVCC], NULL, + val_to_str_ext_const(GTP_EXT_ADD_MM_CTX_SRVCC, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7448,18 +7354,17 @@ decode_gtp_add_flgs_srvcc(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, p { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_ADD_FLGS_SRVCC, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_ADD_FLGS_SRVCC]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_ADD_FLGS_SRVCC], NULL, + val_to_str_ext_const(GTP_EXT_ADD_FLGS_SRVCC, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7471,18 +7376,17 @@ decode_gtp_stn_sr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_tre { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_STN_SR, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_STN_SR]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_STN_SR], NULL, + val_to_str_ext_const(GTP_EXT_STN_SR, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7496,18 +7400,17 @@ decode_gtp_c_msisdn(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_C_MSISDN, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_C_MSISDN]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_C_MSISDN], NULL, + val_to_str_ext_const(GTP_EXT_C_MSISDN, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7519,18 +7422,17 @@ decode_gtp_ext_ranap_cause(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, { guint16 length; proto_tree *ext_tree; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "%s", val_to_str_ext_const(GTP_EXT_EXT_RANAP_CAUSE, >pv1_val_ext, "Unknown")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ies[GTP_EXT_EXT_RANAP_CAUSE]); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_ies[GTP_EXT_EXT_RANAP_CAUSE], NULL, + val_to_str_ext_const(GTP_EXT_EXT_RANAP_CAUSE, >pv1_val_ext, "Unknown")); proto_tree_add_item(ext_tree, hf_gtp_ie_id, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; proto_tree_add_item(ext_tree, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; - proto_tree_add_text(ext_tree, tvb, offset, length, "The rest of the data is not dissected yet"); + proto_tree_add_expert(ext_tree, pinfo, &ei_gtp_undecoded, tvb, offset, length); return 3 + length; } @@ -7544,12 +7446,11 @@ decode_gtp_rel_pack(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t guint16 length, n, number; proto_tree *ext_tree_rel_pack; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Sequence numbers of released packets IE"); - ext_tree_rel_pack = proto_item_add_subtree(te, ett_gtp_rel_pack); + ext_tree_rel_pack = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_rel_pack, NULL, + "Sequence numbers of released packets IE"); n = 0; @@ -7573,12 +7474,11 @@ decode_gtp_can_pack(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t guint16 length, n, number; proto_tree *ext_tree_can_pack; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Sequence numbers of cancelled packets IE"); - ext_tree_can_pack = proto_item_add_subtree(te, ett_gtp_can_pack); + ext_tree_can_pack = proto_tree_add_subtree(tree, tvb, offset, 3 + length, ett_gtp_can_pack, NULL, + "Sequence numbers of cancelled packets IE"); n = 0; @@ -7586,7 +7486,7 @@ decode_gtp_can_pack(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_t number = tvb_get_ntohs(tvb, offset + 3 + n); proto_tree_add_text(ext_tree_can_pack, tvb, offset + 3 + n, 2, "%u", number); - n = n + 2; + n += 2; } return 3 + length; @@ -7610,11 +7510,11 @@ decode_gtp_data_req(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree guint16 length, cdr_length; guint8 no, format, app_id, rel_id, ver_id, i; proto_tree *ext_tree, *ver_tree, *cdr_dr_tree; - proto_item *te, *fmt_item, *ver_item; + proto_item *fmt_item; tvbuff_t *next_tvb; - te = proto_tree_add_text(tree, tvb, offset, 1, "%s", val_to_str_ext_const(GTP_EXT_DATA_REQ, >p_val_ext, "Unknown message")); - ext_tree = proto_item_add_subtree(te, ett_gtp_ext); + ext_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtp_ext, NULL, + val_to_str_ext_const(GTP_EXT_DATA_REQ, >p_val_ext, "Unknown message")); offset++; length = tvb_get_ntohs(tvb, offset); @@ -7656,8 +7556,8 @@ decode_gtp_data_req(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree ver_id = ver_id -1; /* XXX We don't handle ASCCI version */ - ver_item = proto_tree_add_text(ext_tree, tvb, offset, 2, "Data record format version: AppId %u Rel %u.%u.0", app_id,rel_id,ver_id); - ver_tree = proto_item_add_subtree(ver_item, ett_gtp_cdr_ver); + ver_tree = proto_tree_add_subtree_format(ext_tree, tvb, offset, 2, ett_gtp_cdr_ver, NULL, + "Data record format version: AppId %u Rel %u.%u.0", app_id,rel_id,ver_id); proto_tree_add_item(ver_tree, hf_gtp_cdr_app, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(ver_tree, hf_gtp_cdr_rel, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; @@ -7665,8 +7565,8 @@ decode_gtp_data_req(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree offset++; for(i = 0; i < no; ++i) { cdr_length = tvb_get_ntohs(tvb, offset); - te = proto_tree_add_text(ext_tree, tvb, offset, cdr_length+2, "Data record %d", i + 1); - cdr_dr_tree = proto_item_add_subtree(te, ett_gtp_cdr_dr); + cdr_dr_tree = proto_tree_add_subtree_format(ext_tree, tvb, offset, cdr_length+2, + ett_gtp_cdr_dr, NULL, "Data record %d", i + 1); proto_tree_add_text(cdr_dr_tree, tvb, offset, 2, "Length: %u", cdr_length); offset+=2; proto_tree_add_text(cdr_dr_tree, tvb, offset, cdr_length, "Content"); @@ -7709,12 +7609,11 @@ decode_gtp_data_resp(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ guint16 length, n, number; proto_tree *ext_tree_data_resp; - proto_item *te; length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Requests responded"); - ext_tree_data_resp = proto_item_add_subtree(te, ett_gtp_data_resp); + ext_tree_data_resp = proto_tree_add_subtree(tree, tvb, offset, 3 + length, + ett_gtp_data_resp, NULL, "Requests responded"); n = 0; @@ -7745,8 +7644,8 @@ decode_gtp_node_addr(tvbuff_t * tvb, int offset, packet_info * pinfo _U_, proto_ length = tvb_get_ntohs(tvb, offset + 1); - te = proto_tree_add_text(tree, tvb, offset, 3 + length, "Node address: "); - ext_tree_node_addr = proto_item_add_subtree(te, ett_gtp_node_addr); + ext_tree_node_addr = proto_tree_add_subtree(tree, tvb, offset, 3 + length, + ett_gtp_node_addr, &te, "Node address: "); proto_tree_add_text(ext_tree_node_addr, tvb, offset + 1, 2, "Node address length: %u", length); @@ -7784,13 +7683,13 @@ decode_gtp_priv_ext(tvbuff_t * tvb, int offset, packet_info * pinfo, proto_tree proto_item *te; tvbuff_t *next_tvb; - te = proto_tree_add_text(tree, tvb, offset, 1, "%s : ", val_to_str_ext_const(GTP_EXT_PRIV_EXT, >p_val_ext, "Unknown message")); - ext_tree_priv_ext = proto_item_add_subtree(te, ett_gtp_ext); + ext_tree_priv_ext = proto_tree_add_subtree_format(tree, tvb, offset, 1, ett_gtp_ext, &te, + "%s : ", val_to_str_ext_const(GTP_EXT_PRIV_EXT, >p_val_ext, "Unknown message")); offset++; length = tvb_get_ntohs(tvb, offset); proto_tree_add_item(ext_tree_priv_ext, hf_gtp_ext_length, tvb, offset, 2, ENC_BIG_ENDIAN); - offset = offset + 2; + offset += 2; if (length >= 2) { ext_id = tvb_get_ntohs(tvb, offset); proto_tree_add_uint(ext_tree_priv_ext, hf_gtp_ext_id, tvb, offset, 2, ext_id); @@ -9275,6 +9174,7 @@ proto_register_gtp(void) { &ei_gtp_ext_length_mal, { "gtp.ext_length.invalid", PI_MALFORMED, PI_ERROR, "Malformed length", EXPFILL }}, { &ei_gtp_ext_hdr_pdcpsn, { "gtp.ext_hdr.pdcp_sn.non_zero", PI_PROTOCOL, PI_NOTE, "3GPP TS 29.281 v9.0.0: When used between two eNBs at the X2 interface in E-UTRAN, bits 5-8 of octet 2 are spare. The meaning of the spare bits shall be set to zero.", EXPFILL }}, { &ei_gtp_ext_length_warn, { "gtp.ext_length.invalid", PI_PROTOCOL, PI_WARN, "Length warning", EXPFILL }}, + { &ei_gtp_undecoded, { "gtp.undecoded", PI_UNDECODED, PI_WARN, "Data not decoded yet", EXPFILL }}, }; /* Setup protocol subtree array */ diff --git a/epan/dissectors/packet-gtpv2.c b/epan/dissectors/packet-gtpv2.c index 1c03b4943f..40abcd8945 100644 --- a/epan/dissectors/packet-gtpv2.c +++ b/epan/dissectors/packet-gtpv2.c @@ -1175,7 +1175,7 @@ dissect_gtpv2_mm_con_eutran_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_t elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark2, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark2 %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark2: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark); de_ms_cm_2(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0); offset += elm_len; @@ -1184,7 +1184,7 @@ dissect_gtpv2_mm_con_eutran_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_t elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark3, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark3 %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark3: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark); de_ms_cm_3(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0); offset += elm_len; @@ -1193,7 +1193,7 @@ dissect_gtpv2_mm_con_eutran_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_t elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_supp_codec_list, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Supported Codec List %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Supported Codec List: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_tree = proto_item_add_subtree(fi, ett_gtpv2_supp_codec_list); de_sup_codec_list(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0); @@ -1223,7 +1223,7 @@ dissect_gtpv2_mm_con_utran_srvcc(tvbuff_t *tvb, packet_info *pinfo, proto_tree * elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark2, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark2 %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark2: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark); de_ms_cm_2(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0); offset += elm_len; @@ -1232,7 +1232,7 @@ dissect_gtpv2_mm_con_utran_srvcc(tvbuff_t *tvb, packet_info *pinfo, proto_tree * elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark3, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark3 %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark3: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark); de_ms_cm_3(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0); offset += elm_len; @@ -1241,7 +1241,7 @@ dissect_gtpv2_mm_con_utran_srvcc(tvbuff_t *tvb, packet_info *pinfo, proto_tree * elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_supp_codec_list, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Supported Codec List %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + fi = proto_tree_add_text(tree, tvb, offset, elm_len, "Supported Codec List: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_tree = proto_item_add_subtree(fi, ett_gtpv2_supp_codec_list); de_sup_codec_list(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0); @@ -1287,7 +1287,6 @@ dissect_gtpv2_tgt_rnc_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pr int offset = 0; guint16 rnc_id; proto_tree *subtree; - proto_item *rai_item; guint32 mcc; guint32 mnc; guint32 lac; @@ -1308,12 +1307,11 @@ dissect_gtpv2_tgt_rnc_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, pr lac = tvb_get_ntohs(tvb, curr_offset + 3); rnc_id = tvb_get_ntohs(tvb, curr_offset + 5); - rai_item = proto_tree_add_text(tree, - tvb, curr_offset, 6, + subtree = proto_tree_add_subtree_format(tree, + tvb, curr_offset, 6, ett_gtpv2_rai, NULL, "Routing area identification: %x-%x-%u-%u", mcc, mnc, lac, rnc_id); - subtree = proto_item_add_subtree(rai_item, ett_gtpv2_rai); dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, TRUE); curr_offset+=3; @@ -1350,7 +1348,6 @@ dissect_gtpv2_tgt_global_cell_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * int offset = 0; guint8 tgt_cell_id; proto_tree *subtree; - proto_item *rai_item; guint32 mcc; guint32 mnc; guint32 lac; @@ -1370,12 +1367,11 @@ dissect_gtpv2_tgt_global_cell_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree * lac = tvb_get_ntohs(tvb, curr_offset + 3); tgt_cell_id = tvb_get_guint8(tvb, curr_offset + 5); - rai_item = proto_tree_add_text(tree, - tvb, curr_offset, 6, + subtree = proto_tree_add_subtree_format(tree, + tvb, curr_offset, 6, ett_gtpv2_rai, NULL, "Routing area identification: %x-%x-%u-%u", mcc, mnc, lac, tgt_cell_id); - subtree = proto_item_add_subtree(rai_item, ett_gtpv2_rai); dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, TRUE); proto_tree_add_item(subtree, hf_gtpv2_lac, tvb, curr_offset + 3, 2, ENC_BIG_ENDIAN); @@ -1854,7 +1850,6 @@ static gchar* decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 instance _U_, guint flags) { int offset = 1; /* flags are already dissected */ - proto_item *fi; proto_tree *part_tree; gchar *mcc_mnc_str; gchar *str = NULL; @@ -1865,8 +1860,8 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item guint16 lac, ci; proto_item_append_text(item, "CGI "); - fi = proto_tree_add_text(tree, tvb, offset, 7, "Cell Global Identity (CGI)"); - part_tree = proto_item_add_subtree(fi, ett_gtpv2_uli_field); + part_tree = proto_tree_add_subtree(tree, tvb, offset, 7, + ett_gtpv2_uli_field, NULL, "Cell Global Identity (CGI)"); mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, TRUE); offset += 3; lac = tvb_get_ntohs(tvb, offset); @@ -1889,8 +1884,8 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item guint16 lac, sac; proto_item_append_text(item, "SAI "); - fi = proto_tree_add_text(tree, tvb, offset, 7, "Service Area Identity (SAI)"); - part_tree = proto_item_add_subtree(fi, ett_gtpv2_uli_field); + part_tree = proto_tree_add_subtree(tree, tvb, offset, 7, + ett_gtpv2_uli_field, NULL, "Service Area Identity (SAI)"); mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, TRUE); offset += 3; lac = tvb_get_ntohs(tvb, offset); @@ -1911,8 +1906,8 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item { guint16 lac, rac; proto_item_append_text(item, "RAI "); - fi = proto_tree_add_text(tree, tvb, offset, 7, "Routeing Area Identity (RAI)"); - part_tree = proto_item_add_subtree(fi, ett_gtpv2_uli_field); + part_tree = proto_tree_add_subtree(tree, tvb, offset, 7, + ett_gtpv2_uli_field, NULL, "Routeing Area Identity (RAI)"); mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, TRUE); offset += 3; lac = tvb_get_ntohs(tvb, offset); @@ -1934,8 +1929,8 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item { guint16 tac; proto_item_append_text(item, "TAI "); - fi = proto_tree_add_text(tree, tvb, offset, 5, "Tracking Area Identity (TAI)"); - part_tree = proto_item_add_subtree(fi, ett_gtpv2_uli_field); + part_tree = proto_tree_add_subtree(tree, tvb, offset, 5, + ett_gtpv2_uli_field, NULL, "Tracking Area Identity (TAI)"); mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, TRUE); offset += 3; tac = tvb_get_ntohs(tvb, offset); @@ -1956,8 +1951,8 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item guint32 ECGI; proto_item_append_text(item, "ECGI "); - fi = proto_tree_add_text(tree, tvb, offset, 7, "E-UTRAN Cell Global Identifier (ECGI)"); - part_tree = proto_item_add_subtree(fi, ett_gtpv2_uli_field); + part_tree = proto_tree_add_subtree(tree, tvb, offset, 7, + ett_gtpv2_uli_field, NULL, "E-UTRAN Cell Global Identifier (ECGI)"); mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, TRUE); offset += 3; /* The bits 8 through 5, of octet e+3 (Fig 8.21.5-1 in TS 29.274 V8.2.0) are spare @@ -1989,8 +1984,8 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item { guint16 lac; proto_item_append_text(item, "LAI "); - fi = proto_tree_add_text(tree, tvb, offset, 5, "LAI (Location Area Identifier)"); - part_tree = proto_item_add_subtree(fi, ett_gtpv2_uli_field); + part_tree = proto_tree_add_subtree(tree, tvb, offset, 5, + ett_gtpv2_uli_field, NULL, "LAI (Location Area Identifier)"); mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, TRUE); offset += 3; @@ -2013,13 +2008,11 @@ decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item static void dissect_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flags_item; proto_tree *flag_tree; int offset = 0; guint flags; - flags_item = proto_tree_add_text(tree, tvb, offset, 1, "Flags"); - flag_tree = proto_item_add_subtree(flags_item, ett_gtpv2_uli_flags); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtpv2_uli_flags, NULL, "Flags"); flags = tvb_get_guint8(tvb, offset) & 0x3f; proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, offset >> 3, 2, ENC_BIG_ENDIAN); @@ -2444,10 +2437,8 @@ dissect_gtpv2_pdn_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, prot static void dissect_gtpv2_tra_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_) { - proto_item *trigg, *msc_server, *mgw, *sgsn, *ggsn, *bm_sc, *sgw_mme, *ne_types; proto_tree *trigg_tree, *msc_server_tree, *mgw_tree, *sgsn_tree, *ggsn_tree; proto_tree *bm_sc_tree, *sgw_mme_tree, *ne_types_tree; - proto_item *interfaces, *imsc_server, *lmgw, *lsgsn, *lggsn, *lrnc, *lbm_sc, *lmme, *lsgw, *lpdn_gw, *lenb; proto_tree *interfaces_tree, *imsc_server_tree, *lmgw_tree, *lsgsn_tree, *lggsn_tree, *lrnc_tree; proto_tree *lbm_sc_tree, *lmme_tree, *lsgw_tree, *lpdn_gw_tree, *lenb_tree; @@ -2475,27 +2466,20 @@ dissect_gtpv2_tra_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, prot offset += 3; /* Triggering Events, put all into a new tree called trigging_tree */ - trigg = proto_tree_add_text(tree, tvb, offset, 8, "Trigging Events"); - trigg_tree = proto_item_add_subtree(trigg, ett_gtpv2_tra_info_trigg); + trigg_tree = proto_tree_add_subtree(tree, tvb, offset, 8, ett_gtpv2_tra_info_trigg, NULL, "Trigging Events"); /* Create all subtrees */ - msc_server = proto_tree_add_text(trigg_tree, tvb, offset, 2, "MSC Server"); - msc_server_tree = proto_item_add_subtree(msc_server, ett_gtpv2_tra_info_trigg_msc_server); + msc_server_tree = proto_tree_add_subtree(trigg_tree, tvb, offset, 2, ett_gtpv2_tra_info_trigg_msc_server, NULL, "MSC Server"); - mgw = proto_tree_add_text(trigg_tree, tvb, offset + 2, 1, "MGW"); - mgw_tree = proto_item_add_subtree(mgw, ett_gtpv2_tra_info_trigg_mgw); + mgw_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 2, 1, ett_gtpv2_tra_info_trigg_mgw, NULL, "MGW"); - sgsn = proto_tree_add_text(trigg_tree, tvb, offset + 3, 2, "SGSN"); - sgsn_tree = proto_item_add_subtree(sgsn, ett_gtpv2_tra_info_trigg_sgsn); + sgsn_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 3, 2, ett_gtpv2_tra_info_trigg_sgsn, NULL, "SGSN"); - ggsn = proto_tree_add_text(trigg_tree, tvb, offset + 5, 1, "GGSN"); - ggsn_tree = proto_item_add_subtree(ggsn, ett_gtpv2_tra_info_trigg_ggsn); + ggsn_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 5, 1, ett_gtpv2_tra_info_trigg_ggsn, NULL, "GGSN"); - bm_sc = proto_tree_add_text(trigg_tree, tvb, offset + 6, 1, "BM-SC"); - bm_sc_tree = proto_item_add_subtree(bm_sc, ett_gtpv2_tra_info_trigg_bm_sc); + bm_sc_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 6, 1, ett_gtpv2_tra_info_trigg_bm_sc, NULL, "BM-SC"); - sgw_mme = proto_tree_add_text(trigg_tree, tvb, offset + 7, 1, "SGW MME"); - sgw_mme_tree = proto_item_add_subtree(sgw_mme, ett_gtpv2_tra_info_trigg_sgw_mme); + sgw_mme_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 7, 1, ett_gtpv2_tra_info_trigg_sgw_mme, NULL, "SGW MME"); /* MSC Server - 2 octets */ proto_tree_add_item(msc_server_tree, hf_gtpv2_tra_info_msc_momt_calls, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -2547,8 +2531,7 @@ dissect_gtpv2_tra_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, prot offset += 1; /* Create NE Types subtree */ - ne_types = proto_tree_add_text(tree, tvb, offset, 2, "List of NE Types"); - ne_types_tree = proto_item_add_subtree(ne_types, ett_gtpv2_tra_info_ne_types); + ne_types_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_gtpv2_tra_info_ne_types, NULL, "List of NE Types"); /* List of NE Types */ @@ -2580,39 +2563,28 @@ dissect_gtpv2_tra_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, prot offset += tdl; /* Set up subtree interfaces and put all interfaces under it */ - interfaces = proto_tree_add_text(tree, tvb, offset, 12, "List of Interfaces"); - interfaces_tree = proto_item_add_subtree(interfaces, ett_gtpv2_tra_info_interfaces); + interfaces_tree = proto_tree_add_subtree(tree, tvb, offset, 12, ett_gtpv2_tra_info_interfaces, NULL, "List of Interfaces"); /* Create all subtrees */ - imsc_server = proto_tree_add_text(interfaces_tree, tvb, offset, 2, "MSC Server"); - imsc_server_tree = proto_item_add_subtree(imsc_server, ett_gtpv2_tra_info_interfaces_imsc_server); + imsc_server_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset, 2, ett_gtpv2_tra_info_interfaces_imsc_server, NULL, "MSC Server"); - lmgw = proto_tree_add_text(interfaces_tree, tvb, offset + 2, 1, "MGW"); - lmgw_tree = proto_item_add_subtree(lmgw, ett_gtpv2_tra_info_interfaces_lmgw); + lmgw_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 2, 1, ett_gtpv2_tra_info_interfaces_lmgw, NULL, "MGW"); - lsgsn = proto_tree_add_text(interfaces_tree, tvb, offset + 3, 2, "SGSN"); - lsgsn_tree = proto_item_add_subtree(lsgsn, ett_gtpv2_tra_info_interfaces_lsgsn); + lsgsn_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 3, 2, ett_gtpv2_tra_info_interfaces_lsgsn, NULL, "SGSN"); - lggsn = proto_tree_add_text(interfaces_tree, tvb, offset + 5, 1, "GGSN"); - lggsn_tree = proto_item_add_subtree(lggsn, ett_gtpv2_tra_info_interfaces_lggsn); + lggsn_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 5, 1, ett_gtpv2_tra_info_interfaces_lggsn, NULL, "GGSN"); - lrnc = proto_tree_add_text(interfaces_tree, tvb, offset + 6, 1, "RNC"); - lrnc_tree = proto_item_add_subtree(lrnc, ett_gtpv2_tra_info_interfaces_lrnc); + lrnc_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 6, 1, ett_gtpv2_tra_info_interfaces_lrnc, NULL, "RNC"); - lbm_sc = proto_tree_add_text(interfaces_tree, tvb, offset + 7, 1, "BM-SC"); - lbm_sc_tree = proto_item_add_subtree(lbm_sc, ett_gtpv2_tra_info_interfaces_lbm_sc); + lbm_sc_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 7, 1, ett_gtpv2_tra_info_interfaces_lbm_sc, NULL, "BM-SC"); - lmme = proto_tree_add_text(interfaces_tree, tvb, offset + 8, 1, "MME"); - lmme_tree = proto_item_add_subtree(lmme, ett_gtpv2_tra_info_interfaces_lmme); + lmme_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 8, 1, ett_gtpv2_tra_info_interfaces_lmme, NULL, "MME"); - lsgw = proto_tree_add_text(interfaces_tree, tvb, offset + 9, 1, "SGW"); - lsgw_tree = proto_item_add_subtree(lsgw, ett_gtpv2_tra_info_interfaces_lsgw); + lsgw_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 9, 1,ett_gtpv2_tra_info_interfaces_lsgw, NULL, "SGW"); - lpdn_gw = proto_tree_add_text(interfaces_tree, tvb, offset + 10, 1, "PDN GW"); - lpdn_gw_tree = proto_item_add_subtree(lpdn_gw, ett_gtpv2_tra_info_interfaces_lpdn_gw); + lpdn_gw_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 10, 1, ett_gtpv2_tra_info_interfaces_lpdn_gw, NULL, "PDN GW"); - lenb = proto_tree_add_text(interfaces_tree, tvb, offset + 11, 1, "eNB"); - lenb_tree = proto_item_add_subtree(lenb, ett_gtpv2_tra_info_interfaces_lpdn_lenb); + lenb_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 11, 1, ett_gtpv2_tra_info_interfaces_lpdn_lenb, NULL, "eNB"); /* MSC Server - 2 octests */ proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_a, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -2814,13 +2786,12 @@ static const value_string gtpv2_mm_context_unipa_vals[] = { static int dissect_gtpv2_authentication_triplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8 num_triplet) { - proto_item *auth_tri_item; proto_tree *auth_tri_tree; int i; for (i = 0; i < num_triplet; i++) { - auth_tri_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Triplet %u", i); - auth_tri_tree = proto_item_add_subtree(auth_tri_item, ett_gtpv2_mm_context_auth_tri); + auth_tri_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0, + ett_gtpv2_mm_context_auth_tri, NULL, "Authentication Triplet %u", i); /* * Figure 8.38-8: Authentication Quintuplet * 1 to 16 RAND @@ -2842,14 +2813,13 @@ dissect_gtpv2_authentication_triplets(tvbuff_t *tvb, proto_tree *tree, int offse static int dissect_gtpv2_authentication_quintuplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8 nr_qui) { - proto_item *auth_qui_item; proto_tree *auth_qui_tree; int i; guint8 xres_len, autn_len; for (i = 0; i < nr_qui; i++) { - auth_qui_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Quintuplet %u", i); - auth_qui_tree = proto_item_add_subtree(auth_qui_item, ett_gtpv2_mm_context_auth_qui); + auth_qui_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0, + ett_gtpv2_mm_context_auth_qui, NULL, "Authentication Quintuplet %u", i); /* * Figure 8.38-8: Authentication Quintuplet * 1 to 16 RAND @@ -2885,14 +2855,13 @@ dissect_gtpv2_authentication_quintuplets(tvbuff_t *tvb, proto_tree *tree, int of static int dissect_gtpv2_authentication_quadruplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8 nr_qui) { - proto_item *auth_qua_item; proto_tree *auth_qua_tree; guint8 tmp; int i; for (i = 0; i < nr_qui; i++) { - auth_qua_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Quadruplet"); - auth_qua_tree = proto_item_add_subtree(auth_qua_item, ett_gtpv2_mm_context_auth_qua); + auth_qua_tree = proto_tree_add_subtree(tree, tvb, offset, 0, + ett_gtpv2_mm_context_auth_qua, NULL, "Authentication Quadruplet"); proto_tree_add_text(auth_qua_tree, tvb, offset, 16, "RAND: %s", tvb_bytes_to_ep_str(tvb, offset, 16)); @@ -2926,7 +2895,6 @@ static const value_string gtpv2_mm_context_higher_br_16mb_flg_vals[] = { static int dissect_gtpv2_mm_context_common_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, guint8 samb_ri, guint8 uamb_ri) { - proto_item *net_cap_item, *msnt_cap_item; proto_tree *net_cap_tree, *msnt_cap_tree; guint8 ue_net_cap_len, ms_net_cap_len, mei_len; @@ -2972,8 +2940,8 @@ dissect_gtpv2_mm_context_common_data(tvbuff_t *tvb, packet_info *pinfo, proto_tr * If Length of UE Network Capability is zero, then the UE Network Capability parameter * shall not be present. */ - net_cap_item = proto_tree_add_text(tree, tvb, offset, ue_net_cap_len, "UE Network Capability"); - net_cap_tree = proto_item_add_subtree(net_cap_item, ett_gtpv2_mm_context_net_cap); + net_cap_tree = proto_tree_add_subtree(tree, tvb, offset, ue_net_cap_len, + ett_gtpv2_mm_context_net_cap, NULL, "UE Network Capability"); offset += de_emm_ue_net_cap(tvb, net_cap_tree, pinfo, offset, ue_net_cap_len, NULL, 0); } /* k+1 Length of MS Network Capability */ @@ -2985,8 +2953,8 @@ dissect_gtpv2_mm_context_common_data(tvbuff_t *tvb, packet_info *pinfo, proto_tr * If Length of MS Network Capability is zero, then the MS Network Capability parameter shall not be present. */ if (ms_net_cap_len) { - msnt_cap_item = proto_tree_add_text(tree, tvb, offset, ms_net_cap_len, "MS network capability"); - msnt_cap_tree = proto_item_add_subtree(msnt_cap_item, ett_gtpv2_ms_network_capability); + msnt_cap_tree = proto_tree_add_subtree(tree, tvb, offset, ms_net_cap_len, + ett_gtpv2_ms_network_capability, NULL, "MS network capability"); offset += de_gmm_ms_net_cap(tvb, msnt_cap_tree, pinfo, offset, ms_net_cap_len, NULL, 0); } /* m+1 Length of Mobile Equipment Identity (MEI) */ @@ -3007,11 +2975,9 @@ dissect_gtpv2_mm_context_common_data(tvbuff_t *tvb, packet_info *pinfo, proto_tr static int dissect_gtpv2_access_restriction_data(tvbuff_t *tvb, proto_tree *tree, int offset) { - proto_item *accrstdata_item; proto_tree *accrstdata_tree; - accrstdata_item = proto_tree_add_text(tree, tvb, offset, 1, "Access restriction data"); - accrstdata_tree = proto_item_add_subtree(accrstdata_item, ett_gtpv2_access_rest_data); + accrstdata_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtpv2_access_rest_data, NULL, "Access restriction data"); /* Spare HNNA ENA INA GANA GENA UNA */ proto_tree_add_bits_item(accrstdata_tree, hf_gtpv2_spare_bits, tvb, (offset << 3), 2, ENC_BIG_ENDIAN); proto_tree_add_item(accrstdata_tree, hf_gtpv2_hnna, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -3031,14 +2997,12 @@ dissect_gtpv2_access_restriction_data(tvbuff_t *tvb, proto_tree *tree, int offse static void dissect_gtpv2_mm_context_gsm_t(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flag; proto_tree *flag_tree; int offset; guint8 oct, drxi, num_triplet, uamb_ri, samb_ri; offset = 0; - flag = proto_tree_add_text(tree, tvb, offset, 3, "MM Context flags"); - flag_tree = proto_item_add_subtree(flag, ett_gtpv2_mm_context_flag); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags"); /* Octet 5 */ /* Security Mode | Spare | DRXI | CKSN */ @@ -3095,14 +3059,12 @@ dissect_gtpv2_mm_context_gsm_t(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr static void dissect_gtpv2_mm_context_utms_cq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flag; proto_tree *flag_tree; int offset; guint8 oct, drxi, nr_qui, uamb_ri, samb_ri, vdp_len, hbr_len; offset = 0; - flag = proto_tree_add_text(tree, tvb, offset, 3, "MM Context flags"); - flag_tree = proto_item_add_subtree(flag, ett_gtpv2_mm_context_flag); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags"); /* Octet 5 */ proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_sm, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -3200,14 +3162,12 @@ dissect_gtpv2_mm_context_utms_cq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr static void dissect_gtpv2_mm_context_gsm_cq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flag; proto_tree *flag_tree; int offset; guint8 oct, drxi, nr_qui, uamb_ri, samb_ri, vdp_len, hbr_len; offset = 0; - flag = proto_tree_add_text(tree, tvb, offset, 3, "MM Context flags"); - flag_tree = proto_item_add_subtree(flag, ett_gtpv2_mm_context_flag); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags"); /* Octet 5 */ proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_sm, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -3301,14 +3261,12 @@ dissect_gtpv2_mm_context_gsm_cq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static void dissect_gtpv2_mm_context_utms_q(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flag; proto_tree *flag_tree; int offset; guint8 oct, drxi, nr_qui, uamb_ri, samb_ri, vdp_len, hbr_len; offset = 0; - flag = proto_tree_add_text(tree, tvb, offset, 3, "MM Context flags"); - flag_tree = proto_item_add_subtree(flag, ett_gtpv2_mm_context_flag); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags"); /* Octet 5 */ /* Security Mode Spare DRXI KSI */ @@ -3409,15 +3367,14 @@ dissect_gtpv2_mm_context_utms_q(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static void dissect_gtpv2_mm_context_eps_qq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flag_item, *qua_item, *qui_item; + proto_item *qua_item, *qui_item; proto_tree *flag_tree, *qua_tree, *qui_tree; gint offset; guint8 tmp, nhi, drxi, nr_qua, nr_qui, uamb_ri, samb_ri, vdp_len; offset = 0; - flag_item = proto_tree_add_text(tree, tvb, offset, 3, "MM Context flags"); - flag_tree = proto_item_add_subtree(flag_item, ett_gtpv2_mm_context_flag); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags"); /* Octet 5 * Bits @@ -3479,7 +3436,7 @@ dissect_gtpv2_mm_context_eps_qq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre proto_tree_add_item(tree, hf_gtpv2_mm_context_kasme, tvb, offset, 32, ENC_NA); offset += 32; - qua_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Quadruplets %u", nr_qua); + qua_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Quadruplets: %u", nr_qua); if ( nr_qua ){ qua_tree = proto_item_add_subtree(qua_item, ett_gtpv2_qua); offset = dissect_gtpv2_authentication_quadruplets(tvb, qua_tree, offset, nr_qua); @@ -3487,7 +3444,7 @@ dissect_gtpv2_mm_context_eps_qq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre PROTO_ITEM_SET_GENERATED(qua_item); } - qui_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Quintuplets %u", nr_qui); + qui_item = proto_tree_add_text(tree, tvb, offset, 0, "Authentication Quintuplets: %u", nr_qui); if (nr_qui) { qui_tree = proto_item_add_subtree(qui_item, ett_gtpv2_qui); offset = dissect_gtpv2_authentication_quintuplets(tvb, qui_tree, offset, nr_qui); @@ -3547,14 +3504,12 @@ dissect_gtpv2_mm_context_eps_qq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre static void dissect_gtpv2_mm_context_utms_qq(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_) { - proto_item *flag; proto_tree *flag_tree; guint32 offset; guint8 tmp, drxi, nr_qua, nr_qui, uamb_ri, samb_ri, vdp_length; offset = 0; - flag = proto_tree_add_text(tree, tvb, offset, 3, "MM Context flags"); - flag_tree = proto_item_add_subtree(flag, ett_gtpv2_mm_context_flag); + flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags"); /* Octet 5 * Security Mode Spare DRXI KSIASME @@ -3842,7 +3797,6 @@ static void dissect_gtpv2_F_container(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, guint8 instance _U_) { tvbuff_t *new_tvb; - proto_item *bss_item; proto_tree *sub_tree; int offset = 0; guint8 container_type; @@ -3860,8 +3814,7 @@ dissect_gtpv2_F_container(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p switch (container_type) { case 2: /* BSS container */ - bss_item = proto_tree_add_text(tree, tvb, offset, length, "BSS container"); - sub_tree = proto_item_add_subtree(bss_item, ett_gtpv2_bss_con); + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_gtpv2_bss_con, NULL, "BSS container"); /* The flags PFI, RP, SAPI and PHX in octet 6 indicate the corresponding type of paratemer */ proto_tree_add_item(sub_tree, hf_gtpv2_bss_container_phx, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(sub_tree, hf_gtpv2_bss_con_sapi_flg, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -4898,7 +4851,7 @@ dissect_gtpv2_add_mm_cont_for_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark2, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - ms_cm_item = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark 2 %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + ms_cm_item = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark2: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_cm_tree = proto_item_add_subtree(ms_cm_item, ett_gtpv2_ms_mark); /* Mobile Station Classmark 2 */ de_ms_cm_2(tvb, ms_cm_tree, pinfo, offset, elm_len, NULL, 0); @@ -4908,7 +4861,7 @@ dissect_gtpv2_add_mm_cont_for_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark3, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - ms_cm_item = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark3 %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + ms_cm_item = proto_tree_add_text(tree, tvb, offset, elm_len, "Mobile Station Classmark3: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_cm_tree = proto_item_add_subtree(ms_cm_item, ett_gtpv2_ms_mark); /* Mobile Station Classmark 3 */ de_ms_cm_3(tvb, ms_cm_tree, pinfo, offset, elm_len, NULL, 0); @@ -4918,7 +4871,7 @@ dissect_gtpv2_add_mm_cont_for_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto elm_len = tvb_get_guint8(tvb, offset); proto_tree_add_item(tree, hf_gtpv2_len_supp_codec_list, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - ms_cm_item = proto_tree_add_text(tree, tvb, offset, elm_len, "Supported Codec List %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); + ms_cm_item = proto_tree_add_text(tree, tvb, offset, elm_len, "Supported Codec List: %s", tvb_bytes_to_ep_str(tvb, offset, elm_len)); ms_cm_tree = proto_item_add_subtree(ms_cm_item, ett_gtpv2_supp_codec_list); /* Supported Codec List */ de_sup_codec_list(tvb, ms_cm_tree, pinfo, offset, elm_len, NULL, 0); @@ -5227,9 +5180,8 @@ dissect_gtpv2_ie_common(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, type = tvb_get_guint8(tvb, offset); length = tvb_get_ntohs(tvb, offset + 1); - ti = proto_tree_add_text(tree, tvb, offset, 4 + length, "%s : ", + ie_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 + length, ett_gtpv2_ie, &ti, "%s : ", val_to_str_ext_const(type, >pv2_element_type_vals_ext, "Unknown")); - ie_tree = proto_item_add_subtree(ti, ett_gtpv2_ie); /* Octet 1 */ proto_tree_add_item(ie_tree, hf_gtpv2_ie, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -5270,7 +5222,7 @@ static void dissect_gtpv2(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) { proto_tree *gtpv2_tree, *flags_tree; - proto_item *ti, *tf; + proto_item *tf; guint8 message_type, t_flag, p_flag; int offset = 0; guint16 msg_length; @@ -5291,9 +5243,8 @@ dissect_gtpv2(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) proto_tree_add_item(tree, proto_gtpv2, tvb, offset, msg_length + 4, ENC_NA); if (tree) { - ti = proto_tree_add_text(tree, tvb, offset, msg_length + 4, "%s", + gtpv2_tree = proto_tree_add_subtree(tree, tvb, offset, msg_length + 4, ett_gtpv2, NULL, val_to_str_ext_const(message_type, >pv2_message_type_vals_ext, "Unknown")); - gtpv2_tree = proto_item_add_subtree(ti, ett_gtpv2); /* Control Plane GTP uses a variable length header. Control Plane GTP header * length shall be a multiple of 4 octets. diff --git a/epan/dissectors/packet-gvcp.c b/epan/dissectors/packet-gvcp.c index e98afd594a..dc35b7d78f 100644 --- a/epan/dissectors/packet-gvcp.c +++ b/epan/dissectors/packet-gvcp.c @@ -1298,12 +1298,10 @@ static void dissect_forceip_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, p const gint mask_offset = startoffset + 36; const gint gateway_offset = startoffset + 52; - proto_item *item = NULL; - if (gvcp_telegram_tree != NULL) { - item = proto_tree_add_text(gvcp_telegram_tree, tvb, startoffset, length, "FORCEIP_CMD Options"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, + ett_gvcp_payload_cmd, NULL, "FORCEIP_CMD Options"); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_forceip_mac_address, tvb, mac_offset, 6, ENC_NA); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_forceip_static_IP, tvb, ip_offset, 4, ENC_BIG_ENDIAN); @@ -1323,7 +1321,6 @@ static void dissect_packetresend_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *t guint64 block_id = 0; guint32 first_packet = 0; guint32 last_packet = 0; - proto_item *item = NULL; gint offset; offset = startoffset; @@ -1360,8 +1357,8 @@ static void dissect_packetresend_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *t if (gvcp_telegram_tree != NULL) { /* Command header/tree */ - item = proto_tree_add_text(gvcp_telegram_tree, tvb, startoffset, length, "PACKETRESEND_CMD Values"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, + ett_gvcp_payload_cmd, NULL, "PACKETRESEND_CMD Values"); /* Stream channel */ proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_resendcmd_stream_channel_index, tvb, offset, 2, ENC_BIG_ENDIAN); @@ -1425,8 +1422,8 @@ static void dissect_readreg_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, p { if (num_registers > 1) { - item = proto_tree_add_text(gvcp_telegram_tree, tvb, startoffset, length, "READREG_CMD Address List"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, + ett_gvcp_payload_cmd, &item, "READREG_CMD Address List"); } } @@ -1530,8 +1527,8 @@ static void dissect_writereg_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, { if (num_registers > 1) { - item = proto_tree_add_text(gvcp_telegram_tree, tvb, startoffset, length, "WRITEREG_CMD Address List"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, + ett_gvcp_payload_cmd, &item, "WRITEREG_CMD Address List"); } for (i = 0; i < num_registers; i++) @@ -1671,7 +1668,6 @@ static void dissect_event_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, pac { gint i; gint event_count = 0; - proto_item *item = NULL; /* Compute event count based on data length */ if (extendedblockids == 0) @@ -1687,8 +1683,8 @@ static void dissect_event_cmd(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, pac if (event_count > 1) { - item = proto_tree_add_text(gvcp_telegram_tree, tvb, offset, length, "EVENT_CMD Event List"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, offset, length, + ett_gvcp_payload_cmd, NULL, "EVENT_CMD Event List"); } @@ -1859,8 +1855,8 @@ static void dissect_discovery_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, if (gvcp_telegram_tree != NULL) { - item = proto_tree_add_text(gvcp_telegram_tree, tvb, offset, length, "DISCOVERY_ACK Payload"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, offset, length, + ett_gvcp_payload_cmd, NULL, "DISCOVERY_ACK Payload"); /* Version */ item = proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_spec_version, tvb, offset, 4, ENC_BIG_ENDIAN); @@ -1922,7 +1918,6 @@ static void dissect_discovery_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, static void dissect_readreg_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, packet_info *pinfo, gint startoffset, gint length, gvcp_transaction_t *gvcp_trans) { guint i; - proto_item *item = NULL; gboolean is_custom_register = FALSE; const gchar* address_string = NULL; guint num_registers; @@ -1961,8 +1956,8 @@ static void dissect_readreg_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, p /* Subtree initialization for Payload Data: READREG_ACK */ if (num_registers > 1) { - item = proto_tree_add_text(gvcp_telegram_tree, tvb, offset, length, "Register Value List"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_ack); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, offset, length, + ett_gvcp_payload_ack, NULL, "Register Value List"); } for (i = 0; i < num_registers; i++) @@ -2096,7 +2091,7 @@ static void dissect_writemem_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, if (gvcp_telegram_tree != NULL) { - proto_item *item = NULL; + proto_item *item; if (gvcp_trans && gvcp_trans->req_frame) { @@ -2104,8 +2099,8 @@ static void dissect_writemem_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, PROTO_ITEM_SET_GENERATED(item); } - item = proto_tree_add_text(gvcp_telegram_tree, tvb, startoffset, length, "Payload Data: WRITEMEM_ACK"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, + ett_gvcp_payload_cmd, NULL, "Payload Data: WRITEMEM_ACK"); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_writememcmd_data_index, tvb, (startoffset +2), 2, ENC_BIG_ENDIAN); } } @@ -2119,10 +2114,8 @@ static void dissect_pending_ack(proto_tree *gvcp_telegram_tree, tvbuff_t *tvb, p { if (gvcp_telegram_tree != NULL) { - proto_item *item = NULL; - - item = proto_tree_add_text(gvcp_telegram_tree, tvb, startoffset, length, "Payload Data: PENDING_ACK"); - gvcp_telegram_tree = proto_item_add_subtree(item, ett_gvcp_payload_cmd); + gvcp_telegram_tree = proto_tree_add_subtree(gvcp_telegram_tree, tvb, startoffset, length, + ett_gvcp_payload_cmd, NULL, "Payload Data: PENDING_ACK"); proto_tree_add_item(gvcp_telegram_tree, hf_gvcp_time_to_completion, tvb, (startoffset + 2), 2, ENC_BIG_ENDIAN); } } @@ -2190,8 +2183,8 @@ static int dissect_gvcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi /* Add the Command name string to the Info column */ col_append_fstr(pinfo->cinfo, COL_INFO, "> %s ", command_string); - item = proto_tree_add_text(gvcp_tree, tvb, offset, 8, "Command Header: %s", command_string); - gvcp_tree = proto_item_add_subtree(item, ett_gvcp_cmd); + gvcp_tree = proto_tree_add_subtree_format(gvcp_tree, tvb, offset, 8, + ett_gvcp_cmd, NULL, "Command Header: %s", command_string); /* Add the message key code: */ proto_tree_add_item(gvcp_tree, hf_gvcp_message_key_code, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -2232,8 +2225,8 @@ static int dissect_gvcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi col_append_fstr(pinfo->cinfo, COL_INFO, "< %s %s", ack_string, val_to_str(status, statusnames_short, "Unknown status (0x%04X)")); - item = proto_tree_add_text(gvcp_tree, tvb, offset+2, tvb_captured_length(tvb)-2, "Acknowledge Header: %s", ack_string); - gvcp_tree = proto_item_add_subtree(item, ett_gvcp_ack); + gvcp_tree = proto_tree_add_subtree_format(gvcp_tree, tvb, offset+2, tvb_captured_length(tvb)-2, + ett_gvcp_ack, NULL, "Acknowledge Header: %s", ack_string); /* Add the status: */ proto_tree_add_item(gvcp_tree, hf_gvcp_status, tvb, offset, 2, ENC_BIG_ENDIAN); |