f6f6ce100ff34acc5bd168db958ce5f91688bfc1
[metze/wireshark/wip.git] / epan / dissectors / packet-gtpv2.c
1 /* packet-gtpv2.c
2  *
3  * Routines for GTPv2 dissection
4  * Copyright 2009 - 2016, Anders Broman <anders.broman [at] ericsson.com>
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23  * Ref: 3GPP TS 29.274 version 11.1.0 Release 11 ETSI TS 129 274 V8.1.1 (2009-04)
24  */
25
26 #include "config.h"
27
28 #include <epan/packet.h>
29 #include <epan/conversation.h>
30 #include <epan/to_str.h>
31 #include <epan/asn1.h>
32 #include <epan/expert.h>
33 #include <epan/sminmpec.h>
34
35 #include "packet-gsm_a_common.h"
36 #include "packet-gsm_map.h"
37 #include "packet-e164.h"
38 #include "packet-e212.h"
39 #include "packet-s1ap.h"
40 #include "packet-ranap.h"
41 #include "packet-bssgp.h"
42 #include "packet-ntp.h"
43 #include "packet-gtpv2.h"
44 #include "packet-diameter.h"
45 #include "packet-ip.h"
46
47 void proto_register_gtpv2(void);
48 void proto_reg_handoff_gtpv2(void);
49
50 static dissector_handle_t nas_eps_handle;
51 static dissector_table_t gtpv2_priv_ext_dissector_table;
52
53
54 /*GTPv2 Message->GTP Header(SB)*/
55 static int proto_gtpv2 = -1;
56
57 static int hf_gtpv2_response_in = -1;
58 static int hf_gtpv2_response_to = -1;
59 static int hf_gtpv2_response_time = -1;
60 static int hf_gtpv2_spare_half_octet = -1;
61 static int hf_gtpv2_spare_bits = -1;
62 static int hf_gtpv2_flags = -1;
63 static int hf_gtpv2_version = -1;
64 static int hf_gtpv2_p = -1;
65 static int hf_gtpv2_t = -1;
66 static int hf_gtpv2_message_type = -1;
67 static int hf_gtpv2_msg_length = -1;
68 static int hf_gtpv2_teid = -1;
69 static int hf_gtpv2_seq = -1;
70 static int hf_gtpv2_spare = -1;
71
72
73 static int hf_gtpv2_ie = -1;
74 static int hf_gtpv2_ie_len = -1;
75 static int hf_gtpv2_cr = -1;
76 static int hf_gtpv2_instance = -1;
77 static int hf_gtpv2_cause = -1;
78 static int hf_gtpv2_cause_cs = -1;
79 static int hf_gtpv2_cause_bce = -1;
80 static int hf_gtpv2_cause_pce = -1;
81 static int hf_gtpv2_cause_off_ie_t = -1;
82 static int hf_gtpv2_rec = -1;
83 /*Start SRVCC Messages*/
84 static int hf_gtpv2_stn_sr = -1;
85 static int hf_gtpv2_len_trans_con = -1;
86 static int hf_gtpv2_eksi = -1;
87 static int hf_gtpv2_ck = -1;
88 static int hf_gtpv2_ik = -1;
89 static int hf_gtpv2_len_ms_classmark2 = -1;
90 static int hf_gtpv2_len_ms_classmark3 = -1;
91 static int hf_gtpv2_len_supp_codec_list = -1;
92 static int hf_gtpv2_ksi = -1;
93 /*static int hf_gtpv2_kc = -1; */
94 static int hf_gtpv2_cksn = -1;
95 static int hf_gtpv2_srvcc_cause = -1;
96 static int hf_gtpv2_rac = -1;
97 static int hf_gtpv2_rnc_id = -1;
98 static int hf_gtpv2_ext_rnc_id = -1;
99 static int hf_gtpv2_lac = -1;
100 static int hf_gtpv2_sac = -1;
101 static int hf_gtpv2_tgt_g_cell_id = -1;
102 static int hf_gtpv2_teid_c = -1;
103 static int hf_gtpv2_sv_sti = -1;
104 static int hf_gtpv2_sv_ics = -1;
105 static int hf_gtpv2_sv_emind = -1;
106 /*End SRVCC Messages*/
107 static int hf_gtpv2_apn = -1;
108 static int hf_gtpv2_ebi = -1;
109 static int hf_gtpv2_daf = -1;
110 static int hf_gtpv2_dtf = -1;
111 static int hf_gtpv2_hi = -1;
112 static int hf_gtpv2_dfi = -1;
113 static int hf_gtpv2_oi = -1;
114 static int hf_gtpv2_isrsi = -1;
115 static int hf_gtpv2_israi = -1;
116 static int hf_gtpv2_sgwci = -1;
117 static int hf_gtpv2_sqci = -1;
118 static int hf_gtpv2_uimsi = -1;
119 static int hf_gtpv2_cfsi = -1;
120 static int hf_gtpv2_crsi = -1;
121 static int hf_gtpv2_pt = -1;
122 static int hf_gtpv2_ps = -1;
123 static int hf_gtpv2_si = -1;
124 static int hf_gtpv2_msv = -1;
125 static int hf_gtpv2_retloc = -1;
126 static int hf_gtpv2_pbic = -1;
127 static int hf_gtpv2_srni = -1;
128 static int hf_gtpv2_s6af = -1;
129 static int hf_gtpv2_s4af = -1;
130 static int hf_gtpv2_mbmdt = -1;
131 static int hf_gtpv2_israu = -1;
132 static int hf_gtpv2_ccrsi = -1;
133 static int hf_gtpv2_cprai = -1;
134 static int hf_gtpv2_arrl = -1;
135 static int hf_gtpv2_ppof = -1;
136 static int hf_gtpv2_ppon_ppei = -1;
137 static int hf_gtpv2_ppsi = -1;
138 static int hf_gtpv2_csfbi = -1;
139 static int hf_gtpv2_clii = -1;
140 static int hf_gtpv2_cpsr = -1;
141 static int hf_gtpv2_nsi = -1;
142 static int hf_gtpv2_uasi = -1;
143 static int hf_gtpv2_dtci = -1;
144 static int hf_gtpv2_bdwi = -1;
145 static int hf_gtpv2_psci = -1;
146 static int hf_gtpv2_pcri = -1;
147 static int hf_gtpv2_aosi = -1;
148 static int hf_gtpv2_aopi = -1;
149 static int hf_gtpv2_roaai = -1;
150 static int hf_gtpv2_epcosi = -1;
151 static int hf_gtpv2_cpopci = -1;
152 static int hf_gtpv2_pmtsmi = -1;
153 static int hf_gtpv2_s11tf = -1;
154 static int hf_gtpv2_pnsi = -1;
155 static int hf_gtpv2_unaccsi = -1;
156 static int hf_gtpv2_wpmsi = -1;
157 static int hf_gtpv2_enbcrsi = -1;
158 static int hf_gtpv2_tspcmi = -1;
159
160
161 static int hf_gtpv2_pdn_type = -1;
162 static int hf_gtpv2_pdn_ipv4 = -1;
163 static int hf_gtpv2_pdn_ipv6_len = -1;
164 static int hf_gtpv2_pdn_ipv6 = -1;
165 static int hf_gtpv2_pdn_numbers_nsapi = -1;
166 static int hf_gtpv2_p_tmsi = -1;
167 static int hf_gtpv2_p_tmsi_sig = -1;
168 static int hf_gtpv2_mmbr_ul = -1;
169 static int hf_gtpv2_mmbr_dl = -1;
170
171 static int hf_gtpv2_rat_type = -1;
172 static int hf_gtpv2_uli_ecgi_flg = -1;
173 static int hf_gtpv2_uli_lai_flg = -1;
174 static int hf_gtpv2_uli_tai_flg = -1;
175 static int hf_gtpv2_uli_rai_flg = -1;
176 static int hf_gtpv2_uli_sai_flg = -1;
177 static int hf_gtpv2_uli_cgi_flg = -1;
178 static int hf_gtpv2_glt = -1;
179 static int hf_gtpv2_cng_rep_act = -1;
180
181 static int hf_gtpv2_selec_mode = -1;
182 static int hf_gtpv2_source_type = -1;
183 static int hf_gtpv2_f_teid_v4 = -1;
184 static int hf_gtpv2_f_teid_v6 = -1;
185 static int hf_gtpv2_f_teid_interface_type= -1;
186 static int hf_gtpv2_f_teid_gre_key= -1;
187 static int hf_gtpv2_f_teid_ipv4= -1;
188 static int hf_gtpv2_f_teid_ipv6= -1;
189 static int hf_gtpv2_tmsi = -1;
190 static int hf_gtpv2_hsgw_addr_f_len = -1;
191 static int hf_gtpv2_hsgw_addr_ipv4 = -1;
192 static int hf_gtpv2_hsgw_addr_ipv6 = -1;
193 static int hf_gtpv2_gre_key = -1;
194 static int hf_gtpv2_sgw_addr_ipv4 = -1;
195 static int hf_gtpv2_sgw_addr_ipv6 = -1;
196 static int hf_gtpv2_sgw_s1u_teid = -1;
197 static int hf_gtpv2_ipv4_addr = -1;
198
199
200 static int hf_gtpv2_ambr_up= -1;
201 static int hf_gtpv2_ambr_down= -1;
202 static int hf_gtpv2_ip_address_ipv4= -1;
203 static int hf_gtpv2_ip_address_ipv6= -1;
204 static int hf_gtpv2_mei= -1;
205
206 /* Trace Information */
207 /* static int hf_gtpv2_tra_info = -1; */
208 static int hf_gtpv2_tra_info_msc_momt_calls = -1;
209 static int hf_gtpv2_tra_info_msc_momt_sms = -1;
210 static int hf_gtpv2_tra_info_msc_lu_imsi_ad = -1;
211 static int hf_gtpv2_tra_info_msc_handovers = -1;
212 static int hf_gtpv2_tra_info_msc_ss = -1;
213 static int hf_gtpv2_tra_info_mgw_context = -1;
214 static int hf_gtpv2_tra_info_sgsn_pdp_context = -1;
215 static int hf_gtpv2_tra_info_sgsn_momt_sms = -1;
216 static int hf_gtpv2_tra_info_sgsn_rau_gprs_ad = -1;
217 static int hf_gtpv2_tra_info_sgsn_mbms = -1;
218 static int hf_gtpv2_tra_info_sgsn_reserved = -1;
219 static int hf_gtpv2_tra_info_ggsn_pdp = -1;
220 static int hf_gtpv2_tra_info_ggsn_mbms = -1;
221 static int hf_gtpv2_tra_info_bm_sc = -1;
222 static int hf_gtpv2_tra_info_mme_sgw_ss = -1;
223 static int hf_gtpv2_tra_info_mme_sgw_sr = -1;
224 static int hf_gtpv2_tra_info_mme_sgw_iataud = -1;
225 static int hf_gtpv2_tra_info_mme_sgw_ue_init_pdn_disc = -1;
226 static int hf_gtpv2_tra_info_mme_sgw_bearer_act_mod_del = -1;
227 static int hf_gtpv2_tra_info_mme_sgw_ho = -1;
228 static int hf_gtpv2_tra_info_sgw_pdn_con_creat = -1;
229 static int hf_gtpv2_tra_info_sgw_pdn_con_term = -1;
230 static int hf_gtpv2_tra_info_sgw_bearer_act_mod_del = -1;
231 static int hf_gtpv2_tra_info_pgw_pdn_con_creat = -1;
232 static int hf_gtpv2_tra_info_pgw_pdn_con_term = -1;
233 static int hf_gtpv2_tra_info_pgw_bearer_act_mod_del = -1;
234 static int hf_gtpv2_tra_info_lne_msc_s = -1;
235 static int hf_gtpv2_tra_info_lne_mgw = -1;
236 static int hf_gtpv2_tra_info_lne_sgsn = -1;
237 static int hf_gtpv2_tra_info_lne_ggsn = -1;
238 static int hf_gtpv2_tra_info_lne_rnc = -1;
239 static int hf_gtpv2_tra_info_lne_bm_sc = -1;
240 static int hf_gtpv2_tra_info_lne_mme = -1;
241 static int hf_gtpv2_tra_info_lne_sgw = -1;
242 static int hf_gtpv2_tra_info_lne_pdn_gw = -1;
243 static int hf_gtpv2_tra_info_lne_enb = -1;
244 static int hf_gtpv2_tra_info_tdl = -1;
245 static int hf_gtpv2_tra_info_lmsc_a = -1;
246 static int hf_gtpv2_tra_info_lmsc_lu = -1;
247 static int hf_gtpv2_tra_info_lmsc_mc = -1;
248 static int hf_gtpv2_tra_info_lmsc_map_g = -1;
249 static int hf_gtpv2_tra_info_lmsc_map_b = -1;
250 static int hf_gtpv2_tra_info_lmsc_map_e = -1;
251 static int hf_gtpv2_tra_info_lmsc_map_f = -1;
252 static int hf_gtpv2_tra_info_lmsc_cap = -1;
253 static int hf_gtpv2_tra_info_lmsc_map_d = -1;
254 static int hf_gtpv2_tra_info_lmsc_map_c = -1;
255 static int hf_gtpv2_tra_info_lmgw_mc = -1;
256 static int hf_gtpv2_tra_info_lmgw_nb_up = -1;
257 static int hf_gtpv2_tra_info_lmgw_lu_up = -1;
258 static int hf_gtpv2_tra_info_lsgsn_gb = -1;
259 static int hf_gtpv2_tra_info_lsgsn_lu = -1;
260 static int hf_gtpv2_tra_info_lsgsn_gn = -1;
261 static int hf_gtpv2_tra_info_lsgsn_map_gr = -1;
262 static int hf_gtpv2_tra_info_lsgsn_map_gd = -1;
263 static int hf_gtpv2_tra_info_lsgsn_map_gf = -1;
264 static int hf_gtpv2_tra_info_lsgsn_gs = -1;
265 static int hf_gtpv2_tra_info_lsgsn_ge = -1;
266 static int hf_gtpv2_tra_info_lggsn_gn = -1;
267 static int hf_gtpv2_tra_info_lggsn_gi = -1;
268 static int hf_gtpv2_tra_info_lggsn_gmb = -1;
269 static int hf_gtpv2_tra_info_lrnc_lu = -1;
270 static int hf_gtpv2_tra_info_lrnc_lur = -1;
271 static int hf_gtpv2_tra_info_lrnc_lub = -1;
272 static int hf_gtpv2_tra_info_lrnc_uu = -1;
273 static int hf_gtpv2_tra_info_lbm_sc_gmb = -1;
274 static int hf_gtpv2_tra_info_lmme_s1_mme = -1;
275 static int hf_gtpv2_tra_info_lmme_s3 = -1;
276 static int hf_gtpv2_tra_info_lmme_s6a = -1;
277 static int hf_gtpv2_tra_info_lmme_s10 = -1;
278 static int hf_gtpv2_tra_info_lmme_s11 = -1;
279 static int hf_gtpv2_tra_info_lsgw_s4 = -1;
280 static int hf_gtpv2_tra_info_lsgw_s5 = -1;
281 static int hf_gtpv2_tra_info_lsgw_s8b = -1;
282 static int hf_gtpv2_tra_info_lsgw_s11 = -1;
283 static int hf_gtpv2_tra_info_lpdn_gw_s2a = -1;
284 static int hf_gtpv2_tra_info_lpdn_gw_s2b = -1;
285 static int hf_gtpv2_tra_info_lpdn_gw_s2c = -1;
286 static int hf_gtpv2_tra_info_lpdn_gw_s5 = -1;
287 static int hf_gtpv2_tra_info_lpdn_gw_s6c = -1;
288 static int hf_gtpv2_tra_info_lpdn_gw_gx = -1;
289 static int hf_gtpv2_tra_info_lpdn_gw_s8b = -1;
290 static int hf_gtpv2_tra_info_lpdn_gw_sgi = -1;
291 static int hf_gtpv2_tra_info_lenb_s1_mme = -1;
292 static int hf_gtpv2_tra_info_lenb_x2 = -1;
293 static int hf_gtpv2_tra_info_lenb_uu = -1;
294
295 static int hf_gtpv2_ti = -1;
296
297 static int hf_gtpv2_bearer_qos_pci= -1;
298 static int hf_gtpv2_bearer_qos_pl= -1;
299 static int hf_gtpv2_bearer_qos_pvi= -1;
300 static int hf_gtpv2_bearer_qos_label_qci = -1;
301 static int hf_gtpv2_bearer_qos_mbr_up = -1;
302 static int hf_gtpv2_bearer_qos_mbr_down = -1;
303 static int hf_gtpv2_bearer_qos_gbr_up = -1;
304 static int hf_gtpv2_bearer_qos_gbr_down = -1;
305 static int hf_gtpv2_flow_qos_label_qci = -1;
306 static int hf_gtpv2_flow_qos_mbr_up = -1;
307 static int hf_gtpv2_flow_qos_mbr_down = -1;
308 static int hf_gtpv2_flow_qos_gbr_up = -1;
309 static int hf_gtpv2_flow_qos_gbr_down = -1;
310
311 static int hf_gtpv2_delay_value = -1;
312 static int hf_gtpv2_charging_id = -1;
313 static int hf_gtpv2_charging_characteristic = -1;
314 static int hf_gtpv2_bearer_flag_ppc = -1;
315 static int hf_gtpv2_bearer_flag_vb = -1;
316 static int hf_gtpv2_ue_time_zone_dst = -1;
317 static int hf_gtpv2_fq_csid_type = -1;
318 static int hf_gtpv2_fq_csid_nr = -1;
319 static int hf_gtpv2_fq_csid_ipv4 = -1;
320 static int hf_gtpv2_fq_csid_ipv6 = -1;
321 static int hf_gtpv2_fq_csid_id = -1;
322 static int hf_gtpv2_complete_req_msg_type = -1;
323 static int hf_gtpv2_mme_grp_id = -1;
324 static int hf_gtpv2_mme_code = -1;
325 static int hf_gtpv2_m_tmsi = -1;
326 static int hf_gtpv2_container_type = -1;
327 static int hf_gtpv2_cause_type = -1;
328 static int hf_gtpv2_CauseRadioNetwork = -1;
329 static int hf_gtpv2_CauseTransport = -1;
330 static int hf_gtpv2_CauseNas = -1;
331 static int hf_gtpv2_CauseProtocol = -1;
332 static int hf_gtpv2_CauseMisc = -1;
333 static int hf_gtpv2_target_type = -1;
334 static int hf_gtpv2_macro_enodeb_id = -1;
335 static int hf_gtpv2_enodebid = -1;
336 static int hf_gtpv2_cellid = -1;
337
338 static int hf_gtpv2_node_type= -1;
339 static int hf_gtpv2_fqdn = -1;
340 static int hf_gtpv2_enterprise_id = -1;
341 static int hf_gtpv2_apn_rest= -1;
342 static int hf_gtpv2_pti= -1;
343 static int hf_gtpv2_mm_context_sm = -1;
344 static int hf_gtpv2_mm_context_nhi = -1;
345 static int hf_gtpv2_mm_context_drxi = -1;
346 static int hf_gtpv2_mm_context_cksn = -1;
347 static int hf_gtpv2_mm_context_cksn_ksi = -1;
348 static int hf_gtpv2_mm_context_kasme = -1;
349 static int hf_gtpv2_mm_context_rand = -1;
350 static int hf_gtpv2_mm_context_xres_len = -1;
351 static int hf_gtpv2_mm_context_xres = -1;
352 static int hf_gtpv2_mm_context_autn_len = -1;
353 static int hf_gtpv2_mm_context_autn = -1;
354 static int hf_gtpv2_mm_context_drx = -1;
355 static int hf_gtpv2_mm_context_ue_net_cap_len = -1;
356 static int hf_gtpv2_mm_context_ms_net_cap_len = -1;
357 static int hf_gtpv2_mm_context_mei_len = -1;
358 static int hf_gtpv2_mm_context_vdp_len = -1;
359 static int hf_gtpv2_mm_contex_nhi_old = -1;
360 static int hf_gtpv2_mm_context_old_ksiasme = -1;
361 static int hf_gtpv2_mm_context_old_ncc = -1;
362 static int hf_gtpv2_mm_context_old_kasme = -1;
363 static int hf_gtpv2_mm_context_old_nh = -1;
364 static int hf_gtpv2_mm_context_higher_br_16mb_flg_len = -1;
365 static int hf_gtpv2_mm_context_higher_br_16mb_flg = -1;
366 static int hf_gtpv2_vdp_length = -1;
367 static int hf_gtpv2_mm_context_paging_len = -1;
368 static int hf_gtpv2_uci_csg_id = -1;
369 static int hf_gtpv2_uci_csg_id_spare = -1;
370 static int hf_gtpv2_uci_access_mode = -1;
371 static int hf_gtpv2_uci_lcsg = -1;
372 static int hf_gtpv2_uci_csg_membership = -1;
373
374 static int hf_gtpv2_una = -1;
375 static int hf_gtpv2_gena = -1;
376 static int hf_gtpv2_gana = -1;
377 static int hf_gtpv2_ina = -1;
378 static int hf_gtpv2_ena = -1;
379 static int hf_gtpv2_hnna = -1;
380 static int hf_gtpv2_hbna = -1;
381 static int hf_gtpv2_mm_context_ksi_a= -1;
382 static int hf_gtpv2_mm_context_ksi = -1;
383 static int hf_gtpv2_mm_context_nr_tri = -1;
384 static int hf_gtpv2_mm_context_used_cipher = -1;
385 static int hf_gtpv2_mm_context_nr_qui = -1;
386 static int hf_gtpv2_mm_context_nr_qua = -1;
387 static int hf_gtpv2_mm_context_uamb_ri = -1;
388 static int hf_gtpv2_mm_context_osci = -1;
389 static int hf_gtpv2_mm_context_samb_ri = -1;
390 static int hf_gtpv2_mm_context_unipa = -1;
391 static int hf_gtpv2_mm_context_unc = -1;
392 static int hf_gtpv2_mm_context_nas_dl_cnt = -1;
393 static int hf_gtpv2_mm_context_nas_ul_cnt = -1;
394
395 static int hf_gtpv2_uli_cgi_lac= -1;
396 static int hf_gtpv2_uli_cgi_ci= -1;
397 static int hf_gtpv2_sai_lac= -1;
398 static int hf_gtpv2_sai_sac= -1;
399 static int hf_gtpv2_rai_lac= -1;
400 static int hf_gtpv2_rai_rac= -1;
401 static int hf_gtpv2_tai_tac= -1;
402 static int hf_gtpv2_ecgi_eci= -1;
403 static int hf_gtpv2_uli_lai_lac = -1;
404 static int hf_gtpv2_ecgi_eci_spare= -1;
405 static int hf_gtpv2_nsapi = -1;
406 static int hf_gtpv2_bearer_control_mode= -1;
407
408 static int hf_gtpv2_bss_container_phx = -1;
409 static int hf_gtpv2_bss_con_sapi_flg = -1;
410 static int hf_gtpv2_bss_con_rp_flg = -1;
411 static int hf_gtpv2_bss_con_pfi_flg = -1;
412 static int hf_gtpv2_bss_con_pfi = -1;
413 static int hf_gtpv2_bss_con_rp = -1;
414 static int hf_gtpv2_bss_con_sapi = -1;
415 static int hf_gtpv2_bss_con_xid_len = -1;
416 static int hf_gtpv2_bss_con_xid = -1;
417 static int hf_gtpv2_home_enodeb_id = -1;
418 static int hf_gtpv2_tac = -1;
419
420 /* MBMS */
421 static int hf_gtpv2_mbms_service_area_nr = -1;
422 static int hf_gtpv2_mbms_service_area_id = -1;
423 static int hf_gtpv2_mbms_session_id = -1;
424 static int hf_gtpv2_mbms_flow_id = -1;
425 static int hf_gtpv2_cteid = -1;
426 static int hf_gtpv2_ip_addr_type = -1;
427 static int hf_gtpv2_ip_addr_len = -1;
428 static int hf_gtpv2_mbms_ip_mc_dist_addrv4 = -1;
429 static int hf_gtpv2_mbms_ip_mc_dist_addrv6 = -1;
430 static int hf_gtpv2_mbms_ip_mc_src_addrv4 = -1;
431 static int hf_gtpv2_mbms_ip_mc_src_addrv6 = -1;
432 static int hf_gtpv2_mbms_hc_indicator = -1;
433 static int hf_gtpv2_mbms_dist_indication = -1;
434 static int hf_gtpv2_subscriber_rfsp = -1;
435 static int hf_gtpv2_rfsp_inuse = -1;
436 static int hf_gtpv2_mbms_service_id = -1;
437 static int hf_gtpv2_add_flags_for_srvcc_ics = -1;
438 static int hf_gtpv2_vsrvcc_flag = -1;
439 static int hf_gtpv2_abs_time_mbms_data = -1;
440 static int hf_gtpv2_henb_info_report_fti = -1;
441 static int hf_gtpv2_ip4cp_subnet_prefix_len = -1;
442 static int hf_gtpv2_ip4cp_ipv4 = -1;
443 static int hf_gtpv2_change_report_flags_sncr = -1;
444 static int hf_gtpv2_change_report_flags_tzcr = -1;
445 static int hf_gtpv2_action_indication_val = -1;
446 static int hf_gtpv2_uli_timestamp = -1;
447 static int hf_gtpv2_mbms_session_duration_days = -1;
448 static int hf_gtpv2_mbms_session_duration_secs = -1;
449 static int hf_gtpv2_csg_id = -1;
450 static int hf_gtpv2_cmi = -1;
451 static int hf_gtpv2_service_indicator = -1;
452 static int hf_gtpv2_detach_type = -1;
453 static int hf_gtpv2_ldn = -1;
454 static int hf_gtpv2_node_features_prn = -1;
455 static int hf_gtpv2_node_features_mabr =-1;
456 static int hf_gtpv2_node_features_ntsr = -1;
457 static int hf_gtpv2_time_to_data_xfer = -1;
458 static int hf_gtpv2_arp_pvi = -1;
459 static int hf_gtpv2_arp_pl = -1;
460 static int hf_gtpv2_arp_pci = -1;
461 static int hf_gtpv2_timer_unit = -1;
462 static int hf_gtpv2_throttling_delay_unit = -1;
463 static int hf_gtpv2_throttling_delay_value = -1;
464 static int hf_gtpv2_timer_value = -1;
465 static int hf_gtpv2_lapi = -1;
466
467 static int hf_gtpv2_pres_rep_area_action = -1;
468 static int hf_gtpv2_pres_rep_area_id = -1;
469 static int hf_gtpv2_pres_rep_area_act_no_tai = -1;
470 static int hf_gtpv2_pres_rep_area_act_no_rai = -1;
471 static int hf_gtpv2_pres_rep_area_act_no_m_enodeb = -1;
472 static int hf_gtpv2_pres_rep_area_act_no_h_enodeb = -1;
473 static int hf_gtpv2_pres_rep_area_act_no_ecgi = -1;
474 static int hf_gtpv2_pres_rep_area_act_no_sai = -1;
475 static int hf_gtpv2_pres_rep_area_act_no_cgi = -1;
476 static int hf_gtpv2_ksi_ps = -1;
477 static int hf_gtpv2_ck_ps = -1;
478 static int hf_gtpv2_ik_ps = -1;
479 static int hf_gtpv2_kc_ps = -1;
480 static int hf_gtpv2_cksn_ps = -1;
481
482 static int hf_gtpv2_pres_rep_area_info_id = -1;
483 static int hf_gtpv2_pres_rep_area_info_opra = -1;
484 static int hf_gtpv2_pres_rep_area_info_ipra = -1;
485
486 /* Generated from convert_proto_tree_add_text.pl */
487 static int hf_gtpv2_downlink_subscribed_ue_ambr = -1;
488 static int hf_gtpv2_mm_context_sres = -1;
489 static int hf_gtpv2_iksrvcc = -1;
490 static int hf_gtpv2_nsapi08 = -1;
491 static int hf_gtpv2_voice_domain_and_ue_usage_setting = -1;
492 static int hf_gtpv2_ue_radio_capability_for_paging_information = -1;
493 static int hf_gtpv2_upd_source_port_number = -1;
494 static int hf_gtpv2_uplink_used_ue_ambr = -1;
495 static int hf_gtpv2_tmsi_bytes = -1;
496 static int hf_gtpv2_dl_gtp_u_sequence_number = -1;
497 static int hf_gtpv2_mm_context_nh = -1;
498 static int hf_gtpv2_teid_c_spare = -1;
499 static int hf_gtpv2_uplink_subscribed_ue_ambr = -1;
500 static int hf_gtpv2_transparent_container = -1;
501 static int hf_gtpv2_packet_flow_id = -1;
502 static int hf_gtpv2_utran_srvcc_ik_cs = -1;
503 static int hf_gtpv2_downlink_used_ue_ambr = -1;
504 static int hf_gtpv2_hop_counter = -1;
505 static int hf_gtpv2_ul_gtp_u_sequence_number = -1;
506 static int hf_gtpv2_authentication_quadruplets = -1;
507 static int hf_gtpv2_utran_srvcc_kc = -1;
508 static int hf_gtpv2_spare_bytes = -1;
509 static int hf_gtpv2_metric = -1;
510 static int hf_gtpv2_throttling_factor = -1;
511 static int hf_gtpv2_relative_capacity = -1;
512 static int hf_gtpv2_apn_length = -1;
513 static int hf_gtpv2_sequence_number = -1;
514 static int hf_gtpv2_receive_n_pdu_number = -1;
515 static int hf_gtpv2_trace_id = -1;
516 static int hf_gtpv2_drx_parameter = -1;
517 static int hf_gtpv2_charging_characteristic_remaining_octets = -1;
518 static int hf_gtpv2_mm_context_ncc = -1;
519 static int hf_gtpv2_proprietary_value = -1;
520 static int hf_gtpv2_mobile_station_classmark2 = -1;
521 static int hf_gtpv2_rrc_container = -1;
522 static int hf_gtpv2_send_n_pdu_number = -1;
523 static int hf_gtpv2_mobile_station_classmark3 = -1;
524 static int hf_gtpv2_eps_bearer_id_number = -1;
525 static int hf_gtpv2_geographic_location = -1;
526 static int hf_gtpv2_cn_id = -1;
527 static int hf_gtpv2_utran_srvcc_ck_cs = -1;
528 static int hf_gtpv2_authentication_quintuplets = -1;
529 static int hf_gtpv2_serving_gw_address_length = -1;
530 static int hf_gtpv2_supported_codec_list = -1;
531 static int hf_gtpv2_cksrvcc = -1;
532 static int hf_gtpv2_mm_context_kc = -1;
533 static int hf_gtpv2_dl_pdcp_sequence_number = -1;
534 static int hf_gtpv2_ul_pdcp_sequence_number = -1;
535 static int hf_gtpv2_fq_csid_node_id = -1;
536 static int hf_gtpv2_fq_csid_mcc_mnc = -1;
537 static int hf_gtpv2_ppi_value = -1;
538 static int hf_gtpv2_ppi_flag = -1;
539 static int hf_gtpv2_session = -1;
540 static int hf_gtpv2_twan_id_ts = -1;
541 static int hf_gtpv2_twan_flags = -1;
542 static int hf_gtpv2_twan_bssidi = -1;
543 static int hf_gtpv2_twan_civai = -1;
544 static int hf_gtpv2_twan_plmni = -1;
545 static int hf_gtpv2_twan_opnai = -1;
546 static int hf_gtpv2_twan_laii = -1;
547 static int hf_gtpv2_twan_ssid_len = -1;
548 static int hf_gtpv2_twan_ssid = -1;
549 static int hf_gtpv2_twan_bssid = -1;
550 static int hf_gtpv2_twan_civa_len = -1;
551 static int hf_gtpv2_twan_civa = -1;
552 static int hf_gtpv2_twan_plmnid = -1;
553 static int hf_gtpv2_twan_op_name_len = -1;
554 static int hf_gtpv2_twan_op_name = -1;
555 static int hf_gtpv2_twan_relay_id_type = -1;
556 static int hf_gtpv2_twan_relay_id_len = -1;
557 static int hf_gtpv2_twan_relay_id = -1;
558 static int hf_gtpv2_twan_relay_id_ipv4 = -1;
559 static int hf_gtpv2_twan_relay_id_ipv6 = -1;
560 static int hf_gtpv2_twan_circuit_id_len = -1;
561 static int hf_gtpv2_twan_circuit_id = -1;
562 static int hf_gtpv2_integer_number_val = -1;
563
564 static gint ett_gtpv2 = -1;
565 static gint ett_gtpv2_flags = -1;
566 static gint ett_gtpv2_ie = -1;
567 static gint ett_gtpv2_uli_flags = -1;
568 static gint ett_gtpv2_uli_field = -1;
569 static gint ett_gtpv2_bearer_ctx = -1;
570 static gint ett_gtpv2_PDN_conn = -1;
571 static gint ett_gtpv2_overload_control_information = -1;
572 static gint ett_gtpv2_mm_context_flag = -1;
573 static gint ett_gtpv2_pdn_numbers_nsapi = -1;
574 static gint ett_gtpv2_tra_info_trigg = -1;
575 static gint ett_gtpv2_tra_info_trigg_msc_server = -1;
576 static gint ett_gtpv2_tra_info_trigg_mgw = -1;
577 static gint ett_gtpv2_tra_info_trigg_sgsn = -1;
578 static gint ett_gtpv2_tra_info_trigg_ggsn = -1;
579 static gint ett_gtpv2_tra_info_trigg_bm_sc = -1;
580 static gint ett_gtpv2_tra_info_trigg_sgw_mme = -1;
581 static gint ett_gtpv2_tra_info_trigg_sgw = -1;
582 static gint ett_gtpv2_tra_info_trigg_pgw = -1;
583 static gint ett_gtpv2_tra_info_interfaces = -1;
584 static gint ett_gtpv2_tra_info_interfaces_imsc_server = -1;
585 static gint ett_gtpv2_tra_info_interfaces_lmgw = -1;
586 static gint ett_gtpv2_tra_info_interfaces_lsgsn = -1;
587 static gint ett_gtpv2_tra_info_interfaces_lggsn = -1;
588 static gint ett_gtpv2_tra_info_interfaces_lrnc = -1;
589 static gint ett_gtpv2_tra_info_interfaces_lbm_sc = -1;
590 static gint ett_gtpv2_tra_info_interfaces_lmme = -1;
591 static gint ett_gtpv2_tra_info_interfaces_lsgw = -1;
592 static gint ett_gtpv2_tra_info_interfaces_lpdn_gw = -1;
593 static gint ett_gtpv2_tra_info_interfaces_lpdn_lenb = -1;
594 static gint ett_gtpv2_tra_info_ne_types = -1;
595 static gint ett_gtpv2_rai = -1;
596 static gint ett_gtpv2_ms_mark = -1;
597 static gint ett_gtpv2_stn_sr = -1;
598 static gint ett_gtpv2_supp_codec_list = -1;
599 static gint ett_gtpv2_bss_con = -1;
600 static gint ett_gtpv2_utran_con = -1;
601 static gint ett_gtpv2_eutran_con = -1;
602 static gint ett_gtpv2_mm_context_auth_qua = -1;
603 static gint ett_gtpv2_mm_context_auth_qui = -1;
604 static gint ett_gtpv2_mm_context_auth_tri = -1;
605 static gint ett_gtpv2_mm_context_net_cap = -1;
606 static gint ett_gtpv2_ms_network_capability = -1;
607 static gint ett_gtpv2_vd_pref = -1;
608 static gint ett_gtpv2_access_rest_data = -1;
609 static gint ett_gtpv2_qua = -1;
610 static gint ett_gtpv2_qui = -1;
611 static gint ett_gtpv2_preaa_tais = -1;
612 static gint ett_gtpv2_preaa_menbs = -1;
613 static gint ett_gtpv2_preaa_henbs = -1;
614 static gint ett_gtpv2_preaa_ecgis = -1;
615 static gint ett_gtpv2_preaa_rais = -1;
616 static gint ett_gtpv2_preaa_sais = -1;
617 static gint ett_gtpv2_preaa_cgis = -1;
618 static gint ett_gtpv2_load_control_inf = -1;
619 static gint ett_gtpv2_eci = -1;
620 static gint ett_gtpv2_twan_flags = -1;
621
622 static expert_field ei_gtpv2_ie_data_not_dissected = EI_INIT;
623 static expert_field ei_gtpv2_ie_len_invalid = EI_INIT;
624 static expert_field ei_gtpv2_source_type_unknown = EI_INIT;
625 static expert_field ei_gtpv2_fq_csid_type_bad = EI_INIT;
626 static expert_field ei_gtpv2_mbms_session_duration_days = EI_INIT;
627 static expert_field ei_gtpv2_mbms_session_duration_secs = EI_INIT;
628 static expert_field ei_gtpv2_ie = EI_INIT;
629 static expert_field ei_gtpv2_int_size_not_handled = EI_INIT;
630
631
632 /* Definition of User Location Info (AVP 22) masks */
633 #define GTPv2_ULI_CGI_MASK          0x01
634 #define GTPv2_ULI_SAI_MASK          0x02
635 #define GTPv2_ULI_RAI_MASK          0x04
636 #define GTPv2_ULI_TAI_MASK          0x08
637 #define GTPv2_ULI_ECGI_MASK         0x10
638 #define GTPv2_ULI_LAI_MASK          0x20
639
640 #define GTPV2_PPI_VAL_MASK          0x3F
641
642 #define GTPV2_SRVCC_PS_TO_CS_REQUEST     25
643 #define GTPV2_SRVCC_PS_TO_CS_RESPONSE    26
644 #define GTPV2_CREATE_SESSION_REQUEST     32
645 #define GTPV2_CREATE_SESSION_RESPONSE    33
646 #define GTPV2_MODIFY_BEARER_REQUEST      34
647 #define GTPV2_MODIFY_BEARER_RESPONSE     35
648 #define GTPV2_DELETE_SESSION_REQUEST     36
649 #define GTPV2_DELETE_SESSION_RESPONSE    37
650 #define GTPV2_MODIFY_BEARER_COMMAND      64
651 #define GTPV2_MODIFY_BEARER_FAILURE_INDICATION    65
652 #define GTPV2_DELETE_BEARER_COMMAND      66
653 #define GTPV2_DELETE_BEARER_FAILURE_INDICATION    67
654 #define GTPV2_BEARER_RESOURCE_COMMAND    68
655 #define GTPV2_BEARER_RESOURCE_FAILURE_INDICATION  69
656 #define GTPV2_CREATE_BEARER_REQUEST      95
657 #define GTPV2_CREATE_BEARER_RESPONSE     96
658 #define GTPV2_UPDATE_BEARER_REQUEST      97
659 #define GTPV2_UPDATE_BEARER_RESPONSE     98
660 #define GTPV2_DELETE_BEARER_REQUEST      99
661 #define GTPV2_DELETE_BEARER_RESPONSE    100
662 #define GTPV2_CONTEXT_RESPONSE          131
663 #define GTPV2_FORWARD_RELOCATION_REQ    133
664 #define GTPV2_FORWARD_RELOCATION_RESP   134
665 #define GTPV2_FORWARD_CTX_NOTIFICATION  137
666 #define GTPV2_RAN_INFORMATION_RELAY     152
667
668 static void dissect_gtpv2_ie_common(tvbuff_t * tvb, packet_info * pinfo _U_, proto_tree * tree, gint offset, guint8 message_type, session_args_t * args);
669
670 /*Message Types for GTPv2 (Refer Pg19 29.274) (SB)*/
671 static const value_string gtpv2_message_type_vals[] = {
672     {  0, "Reserved"},
673     {  1, "Echo Request"},
674     {  2, "Echo Response"},
675     {  3, "Version Not Supported Indication"},
676     /* 4-24 Reserved for S101 interface TS 29.276 */
677     {  4, "Node Alive Request"},
678     {  5, "Node Alive Response"},
679     {  6, "Redirection Request"},
680     {  7, "Redirection Response"},
681     /* 25-31 Reserved for Sv interface TS 29.280 */
682 /*Start SRVCC Messages ETSI TS 129 280 V10.1.0 (2011-06) 5.2.1*/
683     { 25, "SRVCC PS to CS Request"},
684     { 26, "SRVCC PS to CS Response"},
685     { 27, "SRVCC PS to CS Complete Notification"},
686     { 28, "SRVCC PS to CS Complete Acknowledge"},
687     { 29, "SRVCC PS to CS Cancel Notification"},
688     { 30, "SRVCC PS to CS Cancel Acknowledge"},
689     { 31, "SRVCC CS to PS Request"},
690 /*End SRVCC Messages*/
691     /* SGSN/MME to PGW (S4/S11, S5/S8) */
692     { 32, "Create Session Request"},
693     { 33, "Create Session Response"},
694     { 34, "Modify Bearer Request"},
695     { 35, "Modify Bearer Response"},
696     { 36, "Delete Session Request"},
697     { 37, "Delete Session Response"},
698     /* SGSN/MME to PGW (S4/S11, S5/S8) */
699     { 38, "Change Notification Request"},
700     { 39, "Change Notification Response"},
701     /* MME to PGW (S11, S5/S8) */
702     { 40, "Remote UE Report Notification" },
703     { 41, "Remote UE Report Acknowledge" },
704     /* 42-63 For future use */
705     /* Messages without explicit response */
706     { 64, "Modify Bearer Command"},                          /* (MME/SGSN to PGW -S11/S4, S5/S8) */
707     { 65, "Modify Bearer Failure Indication"},               /*(PGW to MME/SGSN -S5/S8, S11/S4) */
708     { 66, "Delete Bearer Command"},                          /* (MME to PGW -S11, S5/S8) */
709     { 67, "Delete Bearer Failure Indication"},               /* (PGW to MME -S5/S8, S11) */
710     { 68, "Bearer Resource Command"},                        /* (MME/SGSN to PGW -S11/S4, S5/S8) */
711     { 69, "Bearer Resource Failure Indication"},             /* (PGW to MME/SGSN -S5/S8, S11/S4) */
712     { 70, "Downlink Data Notification Failure Indication"},  /*(SGSN/MME to SGW -S4/S11) */
713     { 71, "Trace Session Activation"},
714     { 72, "Trace Session Deactivation"},
715     { 73, "Stop Paging Indication"},
716     /* 74-94 For future use */
717     /* PGW to SGSN/MME/ TWAN/ePDG (S5/S8, S4/S11, S2a, S2b) */
718     { 95, "Create Bearer Request"},
719     { 96, "Create Bearer Response"},
720     { 97, "Update Bearer Request"},
721     { 98, "Update Bearer Response"},
722     { 99, "Delete Bearer Request"},
723     {100, "Delete Bearer Response"},
724     /* PGW to MME, MME to PGW, SGW to PGW, SGW to MME (S5/S8, S11) */
725     {101, "Delete PDN Connection Set Request"},
726     {102, "Delete PDN Connection Set Response"},
727     /* PGW to SGSN/MME(S5, S4/S11) */
728     {103, "PGW Downlink Triggering Notification" },
729     {104, "PGW Downlink Triggering Acknowledge" },
730     /* 105-127 For future use */
731     /* MME to MME, SGSN to MME, MME to SGSN, SGSN to SGSN (S3/10/S16) */
732     {128, "Identification Request"},
733     {129, "Identification Response"},
734     {130, "Context Request"},
735     {131, "Context Response"},
736     {132, "Context Acknowledge"},
737     {133, "Forward Relocation Request"},
738     {134, "Forward Relocation Response"},
739     {135, "Forward Relocation Complete Notification"},
740     {136, "Forward Relocation Complete Acknowledge"},
741     {137, "Forward Access Context Notification"},
742     {138, "Forward Access Context Acknowledge"},
743     {139, "Relocation Cancel Request"},
744     {140, "Relocation Cancel Response"},
745     {141, "Configuration Transfer Tunnel"},
746     /* 142-148 For future use */
747     /* SGSN to MME, MME to SGSN (S3)*/
748     {149, "Detach Notification"},
749     {150, "Detach Acknowledge"},
750     {151, "CS Paging Indication"},
751     {152, "RAN Information Relay"},
752     {153, "Alert MME Notification"},
753     {154, "Alert MME Acknowledge"},
754     {155, "UE Activity Notification"},
755     {156, "UE Activity Acknowledge" },
756     {157, "ISR Status Indication" },
757     {158, "UE Registration Query Request" },
758     {159, "UE Registration Query Response" },
759     /* MME to SGW (S11) */
760     {160, "Create Forwarding Tunnel Request"},
761     {161, "Create Forwarding Tunnel Response"},
762     {162, "Suspend Notification"},
763     {163, "Suspend Acknowledge"},
764     {164, "Resume Notification"},
765     {165, "Resume Acknowledge"},
766     {166, "Create Indirect Data Forwarding Tunnel Request"},
767     {167, "Create Indirect Data Forwarding Tunnel Response"},
768     {168, "Delete Indirect Data Forwarding Tunnel Request"},
769     {169, "Delete Indirect Data Forwarding Tunnel Response"},
770     {170, "Release Access Bearers Request"},
771     {171, "Release Access Bearers Response"},
772     /* 172-175 For future use */
773     /* SGW to SGSN/MME (S4/S11) */
774     {176, "Downlink Data Notification"},
775     {177, "Downlink Data Notification Acknowledgement"},
776     {178, "Reserved. Allocated in earlier version of the specification."},
777     {179, "PGW Restart Notification"},
778     {180, "PGW Restart Notification Acknowledge"},
779     /* 181-199 For future use */
780     /* SGW to PGW, PGW to SGW (S5/S8) */
781     {200, "Update PDN Connection Set Request"},
782     {201, "Update PDN Connection Set Response"},
783     /* 202 to 210 For future use */
784     /* MME to SGW (S11) */
785     {211, "Modify Access Bearers Request"},
786     {212, "Modify Access Bearers Response"},
787     /* 213 to 230 For future use */
788     /* MBMS GW to MME/SGSN (Sm/Sn) */
789     {231, "MBMS Session Start Request"},
790     {232, "MBMS Session Start Response"},
791     {233, "MBMS Session Update Request"},
792     {234, "MBMS Session Update Response"},
793     {235, "MBMS Session Stop Request"},
794     {236, "MBMS Session Stop Response"},
795     /* 237 to 239 For future use */
796     /* Reserved for Sv interface (see also types 25 to 31)      TS 29.280 */
797     {240, "SRVCC CS to PS Response"},               /* 5.2.9  3GPP TS 29.280 V11.5.0 (2013-09) */
798     {241, "SRVCC CS to PS Complete Notification"},  /* 5.2.10 3GPP TS 29.280 V11.5.0 (2013-09) */
799     {242, "SRVCC CS to PS Complete Acknowledge"},   /* 5.2.11 3GPP TS 29.280 V11.5.0 (2013-09) */
800     {243, "SRVCC CS to PS Cancel Notification"},    /* 5.2.12 3GPP TS 29.280 V11.5.0 (2013-09) */
801     {244, "SRVCC CS to PS Cancel Acknowledge"},     /* 5.2.13 3GPP TS 29.280 V11.5.0 (2013-09) */
802     /* 245 to 247       For future Sv interface use*/
803     /* 248 to 255 For future use */
804     {0, NULL}
805 };
806 static value_string_ext gtpv2_message_type_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_message_type_vals);
807
808 #define GTPV2_IE_RESERVED                 0
809 #define GTPV2_IE_IMSI                     1
810 #define GTPV2_IE_CAUSE                    2
811 #define GTPV2_REC_REST_CNT                3
812 /*Start SRVCC Messages*/
813 #define GTPV2_IE_STN_SR                  51
814 #define GTPV2_IE_SRC_TGT_TRANS_CON       52
815 #define GTPV2_IE_TGT_SRC_TRANS_CON       53
816 #define GTPV2_IE_MM_CON_EUTRAN_SRVCC     54
817 #define GTPV2_IE_MM_CON_UTRAN_SRVCC      55
818 #define GTPV2_IE_SRVCC_CAUSE             56
819 #define GTPV2_IE_TGT_RNC_ID              57
820 #define GTPV2_IE_TGT_GLOGAL_CELL_ID      58
821 #define GTPV2_IE_TEID_C                  59
822 #define GTPV2_IE_SV_FLAGS                60
823 #define GTPV2_IE_SAI                     61
824 #define GTPV2_IE_MM_CTX_FOR_CS_TO_PS_SRVCC 62
825 /* 61 - 70 for future sv interface use*/
826 /*End SRVCC Messages*/
827 #define GTPV2_APN                        71
828 #define GTPV2_AMBR                       72
829 #define GTPV2_EBI                        73
830 #define GTPV2_IP_ADDRESS                 74
831 #define GTPV2_MEI                        75
832 #define GTPV2_IE_MSISDN                  76
833 #define GTPV2_INDICATION                 77
834 #define GTPV2_PCO                        78
835 #define GTPV2_PAA                        79
836 #define GTPV2_BEARER_QOS                 80
837 #define GTPV2_IE_FLOW_QOS                81
838 #define GTPV2_IE_RAT_TYPE                82
839 #define GTPV2_IE_SERV_NET                83
840 #define GTPV2_IE_BEARER_TFT              84
841 #define GTPV2_IE_TAD                     85
842 #define GTPV2_IE_ULI                     86
843 #define GTPV2_IE_F_TEID                  87
844 #define GTPV2_IE_TMSI                    88
845 #define GTPV2_IE_GLOBAL_CNID             89
846 #define GTPV2_IE_S103PDF                 90
847 #define GTPV2_IE_S1UDF                   91
848 #define GTPV2_IE_DEL_VAL                 92
849 #define GTPV2_IE_BEARER_CTX              93
850 #define GTPV2_IE_CHAR_ID                 94
851 #define GTPV2_IE_CHAR_CHAR               95
852 #define GTPV2_IE_TRA_INFO                96
853 #define GTPV2_BEARER_FLAG                97
854 /* define GTPV2_IE_PAGING_CAUSE          98 (void) */
855 #define GTPV2_IE_PDN_TYPE                99
856 #define GTPV2_IE_PTI                    100
857 #define GTPV2_IE_DRX_PARAM              101
858 #define GTPV2_IE_UE_NET_CAPABILITY      102
859 #define GTPV2_IE_MM_CONTEXT_GSM_T       103
860 #define GTPV2_IE_MM_CONTEXT_UTMS_CQ     104
861 #define GTPV2_IE_MM_CONTEXT_GSM_CQ      105
862 #define GTPV2_IE_MM_CONTEXT_UTMS_Q      106
863 #define GTPV2_IE_MM_CONTEXT_EPS_QQ      107
864 #define GTPV2_IE_MM_CONTEXT_UTMS_QQ     108
865 #define GTPV2_IE_PDN_CONNECTION         109
866 #define GTPV2_IE_PDN_NUMBERS            110
867 #define GTPV2_IE_P_TMSI                 111
868 #define GTPV2_IE_P_TMSI_SIG             112
869 #define GTPV2_IE_HOP_COUNTER            113
870 #define GTPV2_IE_UE_TIME_ZONE           114
871 #define GTPV2_IE_TRACE_REFERENCE        115
872 #define GTPV2_IE_COMPLETE_REQUEST_MSG   116
873 #define GTPV2_IE_GUTI                   117
874 #define GTPV2_IE_F_CONTAINER            118
875 #define GTPV2_IE_F_CAUSE                119
876 #define GTPV2_IE_SEL_PLMN_ID            120
877 #define GTPV2_IE_TARGET_ID              121
878 /* GTPV2_IE_NSAPI                       122 */
879 #define GTPV2_IE_PKT_FLOW_ID            123
880 #define GTPV2_IE_RAB_CONTEXT            124
881 #define GTPV2_IE_S_RNC_PDCP_CTX_INFO    125
882 #define GTPV2_IE_UDP_S_PORT_NR          126
883 #define GTPV2_IE_APN_RESTRICTION        127
884 #define GTPV2_IE_SEL_MODE               128
885 #define GTPV2_IE_SOURCE_IDENT           129
886 #define GTPV2_IE_BEARER_CONTROL_MODE    130
887 #define GTPV2_IE_CNG_REP_ACT            131
888 #define GTPV2_IE_FQ_CSID                132
889 #define GTPV2_IE_CHANNEL_NEEDED         133
890 #define GTPV2_IE_EMLPP_PRI              134
891 #define GTPV2_IE_NODE_TYPE              135
892 #define GTPV2_IE_FQDN                   136
893 #define GTPV2_IE_TI                     137
894 #define GTPV2_IE_MBMS_SESSION_DURATION  138
895 #define GTPV2_IE_MBMS_SERVICE_AREA      139
896 #define GTPV2_IE_MBMS_SESSION_ID        140
897 #define GTPV2_IE_MBMS_FLOW_ID           141
898 #define GTPV2_IE_MBMS_IP_MC_DIST        142
899 #define GTPV2_IE_MBMS_DIST_ACK          143
900 #define GTPV2_IE_RFSP_INDEX             144
901 #define GTPV2_IE_UCI                    145
902 #define GTPV2_IE_CSG_INFO_REP_ACTION    146
903 #define GTPV2_IE_CSG_ID                 147
904 #define GTPV2_IE_CMI                    148
905 #define GTPV2_IE_SERVICE_INDICATOR      149
906 #define GTPV2_IE_DETACH_TYPE            150
907 #define GTPV2_IE_LDN                    151
908 #define GTPV2_IE_NODE_FEATURES          152
909 #define GTPV2_IE_MBMS_TIME_TO_DATA_XFER 153
910 #define GTPV2_IE_THROTTLING             154
911 #define GTPV2_IE_ARP                    155
912 #define GTPV2_IE_EPC_TIMER              156
913 #define GTPV2_IE_SIG_PRIO_IND           157
914 #define GTPV2_IE_TMGI                   158
915 #define GTPV2_IE_ADD_MM_CONT_FOR_SRVCC  159
916 #define GTPV2_IE_ADD_FLAGS_FOR_SRVCC    160
917 #define GTPV2_IE_MMBR                   161
918 #define GTPV2_IE_MDT_CONFIG             162
919 #define GTPV2_IE_APCO                   163
920 #define GTPV2_IE_ABS_MBMS_DATA_TF_TIME  164
921 #define GTPV2_IE_HENB_INFO_REPORT       165
922 #define GTPV2_IE_IP4CP                  166
923 #define GTPV2_IE_CHANGE_TO_REPORT_FLAGS 167
924 #define GTPV2_IE_ACTION_INDICATION      168
925 #define GTPV2_IE_TWAN_IDENTIFIER        169
926 #define GTPV2_IE_ULI_TIMESTAMP          170
927 #define GTPV2_IE_MBMS_FLAGS             171
928 #define GTPV2_IE_RAN_NAS_CAUSE          172
929 #define GTPV2_IE_CN_OP_SEL_ENT          173
930 #define GTPV2_IE_TRUST_WLAN_MODE_IND    174
931 #define GTPV2_IE_NODE_NUMBER            175
932 #define GTPV2_IE_NODE_IDENTIFIER        176
933 #define GTPV2_IE_PRES_REP_AREA_ACT      177
934 #define GTPV2_IE_PRES_REP_AREA_INF      178
935 #define GTPV2_IE_TWAN_ID_TS             179
936 #define GTPV2_IE_OVERLOAD_CONTROL_INF   180
937 #define GTPV2_IE_LOAD_CONTROL_INF       181
938 #define GTPV2_IE_METRIC                 182
939 #define GTPV2_IE_SEQ_NO                 183
940 #define GTPV2_IE_APN_AND_REL_CAP        184
941 /* 185: WLAN Offloadability Indication*/
942 #define GTPV2_IE_PAGING_AND_SERVICE_INF 186
943 #define GTPV2_IE_INTEGER_NUMBER         187
944 /*
945 188     Millisecond Time Stamp
946 189     Monitoring Event Information
947 190     ECGI List
948 191     Remote UE Context
949 192     Remote User ID
950 193     Remote UE IP information
951 194     CIoT Optimizations Support Indication
952 195     SCEF PDN Connection
953 196     Header Compression Configuration
954 197     Extended Protocol Configuration Options (ePCO)
955 198     Serving PLMN Rate Control
956 199     Counter
957 200 to 253      Spare. For future use.
958 254     Special IE type for IE Type Extension
959 255     Private Extension
960 256 to 65535    Spare. For future use.
961
962 */
963 /* 169 to 254 reserved for future use */
964 #define GTPV2_IE_PRIVATE_EXT            255
965
966 #define SPARE                               0X0
967 #define CREATE_NEW_TFT                      0X20
968 #define DELETE_TFT                          0X40
969 #define ADD_PACKET_FILTERS_TFT              0X60
970 #define REPLACE_PACKET_FILTERS_TFT          0X80
971 #define DELETE_PACKET_FILTERS_TFT           0XA0
972 #define NO_TFT_OPERATION                    0XC0
973 #define RESERVED                            0XE0
974
975
976 /* Table 8.1-1: Information Element types for GTPv2 */
977 static const value_string gtpv2_element_type_vals[] = {
978     {  0, "Reserved"},
979     {  1, "International Mobile Subscriber Identity (IMSI)"},                   /* Variable Length / 8.3 */
980     {  2, "Cause"},                                                             /* Variable Length / 8.4 */
981     {  3, "Recovery (Restart Counter)"},                                        /* Variable Length / 8.5 */
982                                                                                 /* 4-34 Reserved for S101 interface Extendable / See 3GPP TS 29.276 [14] */
983                                                                                 /* 35-50  / See 3GPP TS 29.276 */
984 /*Start SRVCC Messages ETSI TS 129 280 V10.1.0 (2011-06) 6.1*/
985     { 51, "STN-SR"},                                                            /* Variable Length / 6.2 */
986     { 52, "Source to Target Transparent Container"},                            /* Variable Length / 6.3 */
987     { 53, "Target to Source Transparent Container"},                            /* Variable Length / 6.4 */
988     { 54, "MM Context for E-UTRAN SRVCC"},                                      /* Variable Length / 6.5 */
989     { 55, "MM Context for UTRAN SRVCC"},                                        /* Variable Length / 6.6 */
990     { 56, "SRVCC Cause"},                                                       /* Fixed Length / 6.7 */
991     { 57, "Target RNC ID"},                                                     /* Variable Length / 6.8 */
992     { 58, "Target Global Cell ID"},                                             /* Variable Length / 6.9 */
993     { 59, "TEID-C"},                                                            /* Extendable / 6.10 */
994     { 60, "Sv Flags" },                                                         /* Extendable / 6.11 */
995     { 61, "Service Area Identifier" },                                          /* Extendable / 6.12 */
996     { 62, "MM Context for CS to PS SRVCC" },                                    /* Extendable / 6.13 */
997                                                                                 /* 63-70 For future Sv interface use */
998 /*End SRVCC Messages*/
999     { 71, "Access Point Name (APN)"},                                           /* Variable Length / 8.6 */
1000     { 72, "Aggregate Maximum Bit Rate (AMBR)"},                                 /* Fixed Length / 8.7 */
1001     { 73, "EPS Bearer ID (EBI)"},                                               /* Extendable / 8.8 */
1002     { 74, "IP Address"},                                                        /* Extendable / 8.9 */
1003     { 75, "Mobile Equipment Identity (MEI)"},                                   /* Variable Length / 8.10 */
1004     { 76, "MSISDN"},                                                            /* Variable Length / 8.11 */
1005     { 77, "Indication"},                                                        /* Extendable / 8.12 */
1006     { 78, "Protocol Configuration Options (PCO)"},                              /* Variable Length / 8.13 */
1007     { 79, "PDN Address Allocation (PAA)"},                                      /* Variable Length / 8.14 */
1008     { 80, "Bearer Level Quality of Service (Bearer QoS)"},                      /* Variable Length / 8.15 */
1009     { 81, "Flow Quality of Service (Flow QoS)"},                                /* Extendable / 8.16 */
1010     { 82, "RAT Type"},                                                          /* Extendable / 8.17 */
1011     { 83, "Serving Network"},                                                   /* Extendable / 8.18 */
1012     { 84, "EPS Bearer Level Traffic Flow Template (Bearer TFT)"},               /* Variable Length / 8.19 */
1013     { 85, "Traffic Aggregation Description (TAD)"},                             /* Variable Length / 8.20 */
1014     { 86, "User Location Info (ULI)"},                                          /* Variable Length / 8.21 */
1015     { 87, "Fully Qualified Tunnel Endpoint Identifier (F-TEID)"},               /* Extendable / 8.22 */
1016     { 88, "TMSI"},                                                              /* Variable Length / 8.23 */
1017     { 89, "Global CN-Id"},                                                      /* Variable Length / 8.24 */
1018     { 90, "S103 PDN Data Forwarding Info (S103PDF)"},                           /* Variable Length / 8.25 */
1019     { 91, "S1-U Data Forwarding Info (S1UDF)"},                                 /* Variable Length/ 8.26 */
1020     { 92, "Delay Value"},                                                       /* Extendable / 8.27 */
1021     { 93, "Bearer Context"},                                                    /* Extendable / 8.28 */
1022     { 94, "Charging ID"},                                                       /* Extendable / 8.29 */
1023     { 95, "Charging Characteristics"},                                          /* Extendable / 8.30 */
1024     { 96, "Trace Information"},                                                 /* Extendable / 8.31 */
1025     { 97, "Bearer Flags"},                                                      /* Extendable / 8.32 */
1026     { 98, "Paging Cause"},                                                      /* Variable Length / 8.33 */
1027     { 99, "PDN Type"},                                                          /* Extendable / 8.34 */
1028     {100, "Procedure Transaction ID"},                                          /* Extendable / 8.35 */
1029     {101, "DRX Parameter"},                                                     /* Variable Length/ 8.36 */
1030     {102, "UE Network Capability"},                                             /* Variable Length / 8.37 */
1031     {103, "MM Context (GSM Key and Triplets)"},                                 /* Variable Length / 8.38 */
1032     {104, "MM Context (UMTS Key, Used Cipher and Quintuplets)"},                /* Variable Length / 8.38 */
1033     {105, "MM Context (GSM Key, Used Cipher and Quintuplets)"},                 /* Variable Length / 8.38 */
1034     {106, "MM Context (UMTS Key and Quintuplets)"},                             /* Variable Length / 8.38 */
1035     {107, "MM Context (EPS Security Context, Quadruplets and Quintuplets)"},    /* Variable Length / 8.38 */
1036     {108, "MM Context (UMTS Key, Quadruplets and Quintuplets)"},                /* Variable Length / 8.38 */
1037     {109, "PDN Connection"},                                                    /* Extendable / 8.39 */
1038     {110, "PDU Numbers"},                                                       /* Extendable / 8.40 */
1039     {111, "P-TMSI"},                                                            /* Variable Length / 8.41 */
1040     {112, "P-TMSI Signature"},                                                  /* Variable Length / 8.42 */
1041     {113, "Hop Counter"},                                                       /* Extendable / 8.43 */
1042     {114, "UE Time Zone"},                                                      /* Variable Length / 8.44 */
1043     {115, "Trace Reference"},                                                   /* Fixed Length / 8.45 */
1044     {116, "Complete Request Message"},                                          /* Variable Length / 8.46 */
1045     {117, "GUTI"},                                                              /* Variable Length / 8.47 */
1046     {118, "F-Container"},                                                       /* Variable Length / 8.48 */
1047     {119, "F-Cause"},                                                           /* Variable Length / 8.49 */
1048     {120, "Selected PLMN ID"},                                                  /* Variable Length / 8.50 */
1049     {121, "Target Identification"},                                             /* Variable Length / 8.51 */
1050     {122, "NSAPI"},                                                             /* Extendable / 8.52 */
1051     {123, "Packet Flow ID"},                                                    /* Variable Length / 8.53 */
1052     {124, "RAB Context"},                                                       /* Fixed Length / 8.54 */
1053     {125, "Source RNC PDCP Context Info"},                                      /* Variable Length / 8.55 */
1054     {126, "UDP Source Port Number"},                                            /* Extendable / 8.56 */
1055     {127, "APN Restriction"},                                                   /* Extendable / 8.57 */
1056     {128, "Selection Mode"},                                                    /* Extendable / 8.58 */
1057     {129, "Source Identification"},                                             /* Variable Length / 8.50 */
1058     {130, "Bearer Control Mode"},                                               /* Extendable / 8.60 */
1059     {131, "Change Reporting Action"},                                           /* Variable Length / 8.61 */
1060     {132, "Fully Qualified PDN Connection Set Identifier (FQ-CSID)"},           /* Variable Length / 8.62 */
1061     {133, "Channel needed"},                                                    /* Extendable / 8.63 */
1062     {134, "eMLPP Priority"},                                                    /* Extendable / 8.64 */
1063     {135, "Node Type"},                                                         /* Extendable / 8.65 */
1064     {136, "Fully Qualified Domain Name (FQDN)"},                                /* Variable Length / 8.66 */
1065     {137, "Transaction Identifier (TI)"},                                       /* Variable Length / 8.68 */
1066     {138, "MBMS Session Duration"},                                             /* Duration Extendable / 8.69 */
1067     {139, "MBMS Service Area"},                                                 /* Extendable / 8.70 */
1068     {140, "MBMS Session Identifier"},                                           /* Extendable / 8.71 */
1069     {141, "MBMS Flow Identifier"},                                              /* Extendable / 8.72 */
1070     {142, "MBMS IP Multicast Distribution"},                                    /* Extendable / 8.73 */
1071     {143, "MBMS Distribution Acknowledge"},                                     /* Extendable / 8.74 */
1072     {144, "RFSP Index"},                                                        /* Fixed Length / 8.77 */
1073     {145, "User CSG Information (UCI)"},                                        /* Extendable / 8.75 */
1074     {146, "CSG Information Reporting Action"},                                  /* Extendable / 8.76 */
1075     {147, "CSG ID"},                                                            /* Extendable / 8.78 */
1076     {148, "CSG Membership Indication (CMI)"},                                   /* Extendable / 8.79 */
1077     {149, "Service indicator"},                                                 /* Fixed Length / 8.80 */
1078     {150, "Detach Type"},                                                       /* Fixed Length / 8.81 */
1079     {151, "Local Distiguished Name (LDN)"},                                     /* Variable Length / 8.82 */
1080     {152, "Node Features"},                                                     /* Extendable / 8.83 */
1081     {153, "MBMS Time to Data Transfer"},                                        /* Extendable / 8.84 */
1082     {154, "Throttling"},                                                        /* Extendable / 8.85 */
1083     {155, "Allocation/Retention Priority (ARP)"},                               /* Extendable / 8.86 */
1084     {156, "EPC Timer"},                                                         /* Extendable / 8.87 */
1085     {157, "Signalling Priority Indication"},                                    /* Extendable / 8.88 */
1086     {158, "Temporary Mobile Group Identity"},                                   /* Extendable / 8.89 */
1087     {159, "Additional MM context for SRVCC"},                                   /* Extendable / 8.90 */
1088     {160, "Additional flags for SRVCC"},                                        /* Extendable / 8.91 */
1089     {161, "Max MBR/APN-AMBR (MMBR)"},                                           /* Extendable / 8.92 */
1090     {162, "MDT Configuration"},                                                 /* Extendable / 8.93 */
1091     {163, "Additional Protocol Configuration Options (APCO)"},                  /* Extendable / 8.94 */
1092     {164, "Absolute Time of MBMS Data Transfer"},                               /* Extendable / 8.95 */
1093     {165, "H(e)NB Information Reporting"},                                      /* Extendable / 8.96*/
1094     {166, "IPv4 Configuration Parameters (IP4CP)"},                             /* Extendable / 8.97*/
1095     {167, "Change to Report Flags"},                                            /* Extendable / 8.98 */
1096     {168, "Action Indication"},                                                 /* Extendable / 8.99 */
1097     {169, "TWAN Identifier "},                                                  /* Extendable / 8.100 */
1098     {170, "ULI Timestamp"},                                                     /* Extendable / 8.101 */
1099     {171, "MBMS Flags"},                                                        /* Extendable / 8.102 */
1100     {172, "RAN/NAS Cause"},                                                     /* Extendable / 8.103 */
1101     {173, "CN Operator Selection Entity"},                                      /* Extendable / 8.104 */
1102     {174, "Trusted WLAN Mode Indication"},                                      /* Extendable / 8.105 */
1103     {175, "Node Number"},                                                       /* Extendable / 8.106 */
1104     {176, "Node Identifier"},                                                   /* Extendable / 8.107 */
1105     {177, "Presence Reporting Area Action"},                                    /* Extendable / 8.108 */
1106     {178, "Presence Reporting Area Information"},                               /* Extendable / 8.109 */
1107     {179, "TWAN Identifier Timestamp"},                                         /* Extendable / 8.110 */
1108     {180, "Overload Control Information"},                                      /* Extendable / 8.111 */
1109     {181, "Load Control Information"},                                          /* Extendable / 8.112 */
1110     {182, "Metric"},                                                            /* Fixed Length / 8.113 */
1111     {183, "Sequence Number"},                                                   /* Fixed Length / 8.114 */
1112     {184, "APN and Relative Capacity"},                                         /* Extendable / 8.115 */
1113     {185, "WLAN Offloadability Indication"},                                    /* Extendable / 8.116 */
1114     {186, "Paging and Service Information"},                                    /* Extendable / 8.117 */
1115     {187, "Integer Number" },                                                   /* Variable / 8.118 */
1116     {188, "Millisecond Time Stamp" },                                           /* Extendable / 8.119 */
1117     {189, "Monitoring Event Information"},                                      /* Extendable / 8.120 */
1118     {190, "ECGI List"},                                                         /* Extendable / 8.121 */
1119     {191, "Remote UE Context"},                                                 /* Extendable / 8.122 */
1120     {192, "Remote User ID"},                                                    /* Extendable / 8.123 */
1121     {193, "Remote UE IP information"},                                          /* Variable Length / 8.124 */
1122     {194, "CIoT Optimizations Support Indication"},                             /* Extendable / 8.125 */
1123     {195, "SCEF PDN Connection"},                                               /* Extendable / 8.126 */
1124     {196, "Header Compression Configuration"},                                  /* Extendable / 8.127 */
1125     {197, "Extended Protocol Configuration Options(ePCO)"},                     /* Variable Length / 8.128 */
1126     {198, "Serving PLMN Rate Control"},                                         /* Extendable / 8.129 */
1127     {199, "Counter" },                                                          /* Extendable / 8.130 */
1128                                                                                 /* 1200 to 254    Spare. For future use.    */
1129     {255, "Private Extension"},                                                 /* Variable Length / 8.67 */
1130     {0, NULL}
1131 };
1132 static value_string_ext gtpv2_element_type_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_element_type_vals);
1133
1134 typedef struct _gtpv2_hdr {
1135     guint8 flags;   /* GTP header flags */
1136     guint8 message; /* Message type */
1137     guint16 length; /* Length of header */
1138     gint64 teid;    /* Tunnel End-point ID */
1139 } gtpv2_hdr_t;
1140
1141 /* Data structure attached to a  conversation,
1142 to keep track of request/response-pairs
1143 */
1144 typedef struct gtpv2_conv_info_t {
1145     wmem_map_t             *unmatched;
1146     wmem_map_t             *matched;
1147 } gtpv2_conv_info_t;
1148
1149 /*structure used to track responses to requests using sequence number*/
1150 typedef struct gtpv2_msg_hash_entry {
1151     gboolean is_request;    /*TRUE/FALSE*/
1152     guint32 req_frame;      /*frame with request */
1153     nstime_t req_time;      /*req time */
1154     guint32 rep_frame;      /*frame with reply */
1155     gint seq_nr;            /*sequence number*/
1156     guint msgtype;          /*messagetype*/
1157 } gtpv2_msg_hash_t;
1158
1159 static guint
1160 gtpv2_sn_hash(gconstpointer k)
1161 {
1162     const gtpv2_msg_hash_t *key = (const gtpv2_msg_hash_t *)k;
1163
1164     return key->seq_nr;
1165 }
1166
1167 static gint
1168 gtpv2_sn_equal_matched(gconstpointer k1, gconstpointer k2)
1169 {
1170     const gtpv2_msg_hash_t *key1 = (const gtpv2_msg_hash_t *)k1;
1171     const gtpv2_msg_hash_t *key2 = (const gtpv2_msg_hash_t *)k2;
1172
1173     if (key1->req_frame && key2->req_frame && (key1->req_frame != key2->req_frame)) {
1174         return 0;
1175     }
1176
1177     if (key1->rep_frame && key2->rep_frame && (key1->rep_frame != key2->rep_frame)) {
1178         return 0;
1179     }
1180
1181     return key1->seq_nr == key2->seq_nr;
1182 }
1183
1184 static gint
1185 gtpv2_sn_equal_unmatched(gconstpointer k1, gconstpointer k2)
1186 {
1187     const gtpv2_msg_hash_t *key1 = (const gtpv2_msg_hash_t *)k1;
1188     const gtpv2_msg_hash_t *key2 = (const gtpv2_msg_hash_t *)k2;
1189
1190     return key1->seq_nr == key2->seq_nr;
1191 }
1192
1193 /* Code to dissect IE's */
1194
1195 static void
1196 dissect_gtpv2_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1197 {
1198     proto_tree_add_expert(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, 0, length);
1199 }
1200
1201 /*
1202  * 8.3 International Mobile Subscriber Identity (IMSI)
1203  *
1204  * IMSI is defined in 3GPP TS 23.003
1205  * Editor's note: IMSI coding will be defined in 3GPP TS 24.301
1206  * Editor's note: In the first release of GTPv2 spec (TS 29.274v8.0.0) n = 8.
1207  * That is, the overall length of the IE is 11 octets.
1208  */
1209
1210 static void
1211 dissect_gtpv2_imsi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1212 {
1213     int          offset = 0;
1214     const gchar *imsi_str;
1215
1216     /* Fetch the BCD encoded digits from tvb low half byte, formating the digits according to
1217      * a default digit set of 0-9 returning "?" for overdecadic digits a pointer to the wmem
1218      * allocated string will be returned.
1219      */
1220     imsi_str =  dissect_e212_imsi(tvb, pinfo, tree,  offset, length, FALSE);
1221     proto_item_append_text(item, "%s", imsi_str);
1222
1223 }
1224
1225 /*
1226  * 8.4 Cause
1227  */
1228
1229 /* Table 8.4-1: Cause values */
1230 static const value_string gtpv2_cause_vals[] = {
1231     {0, "Reserved"},
1232     /* Request / Initial message */
1233     {  1, "Reserved"},
1234     {  2, "Local Detach"},
1235     {  3, "Complete Detach"},
1236     {  4, "RAT changed from 3GPP to Non-3GPP"},
1237     {  5, "ISR deactivation"},
1238     {  6, "Error Indication received from RNC/eNodeB/S4-SGSN"},
1239     {  7, "IMSI Detach Only"},
1240     {  8, "Reactivation Requested"},
1241     {  9, "PDN reconnection to this APN disallowed"},
1242     { 10, "Access changed from Non-3GPP to 3GPP"},
1243     { 11, "PDN connection inactivity timer expires"},
1244     { 12, "PGW not responding"},
1245     { 13, "Network Failure"},
1246     { 14, "QoS parameter mismatch"},
1247     /* 15 Spare. This value range is reserved for Cause values in a request message */
1248     { 15, "Spare"},
1249     /* Acceptance in a Response / triggered message */
1250     { 16, "Request accepted"},
1251     { 17, "Request accepted partially"},
1252     { 18, "New PDN type due to network preference"},
1253     { 19, "New PDN type due to single address bearer only"},
1254     /* 20-63 Spare. This value range shall be used by Cause values in an acceptance response/triggered message */
1255     { 20, "Spare"},
1256     { 21, "Spare"},
1257     { 22, "Spare"},
1258     { 23, "Spare"},
1259     { 24, "Spare"},
1260     { 25, "Spare"},
1261     { 26, "Spare"},
1262     { 27, "Spare"},
1263     { 28, "Spare"},
1264     { 29, "Spare"},
1265     { 30, "Spare"},
1266     { 31, "Spare"},
1267     { 32, "Spare"},
1268     { 33, "Spare"},
1269     { 34, "Spare"},
1270     { 35, "Spare"},
1271     { 36, "Spare"},
1272     { 37, "Spare"},
1273     { 38, "Spare"},
1274     { 39, "Spare"},
1275     { 40, "Spare"},
1276     { 41, "Spare"},
1277     { 42, "Spare"},
1278     { 43, "Spare"},
1279     { 44, "Spare"},
1280     { 45, "Spare"},
1281     { 46, "Spare"},
1282     { 47, "Spare"},
1283     { 48, "Spare"},
1284     { 49, "Spare"},
1285     { 50, "Spare"},
1286     { 51, "Spare"},
1287     { 52, "Spare"},
1288     { 53, "Spare"},
1289     { 54, "Spare"},
1290     { 55, "Spare"},
1291     { 56, "Spare"},
1292     { 57, "Spare"},
1293     { 58, "Spare"},
1294     { 59, "Spare"},
1295     { 60, "Spare"},
1296     { 61, "Spare"},
1297     { 62, "Spare"},
1298     { 63, "Spare"},
1299     /* Rejection in a Response / triggered message */
1300     { 64, "Context Not Found"},
1301     { 65, "Invalid Message Format"},
1302     { 66, "Version not supported by next peer"},
1303     { 67, "Invalid length"},
1304     { 68, "Service not supported"},
1305     { 69, "Mandatory IE incorrect"},
1306     { 70, "Mandatory IE missing"},
1307     { 71, "Shall not be used"},
1308     { 72, "System failure"},
1309     { 73, "No resources available"},
1310     { 74, "Semantic error in the TFT operation"},
1311     { 75, "Syntactic error in the TFT operation"},
1312     { 76, "Semantic errors in packet filter(s)"},
1313     { 77, "Syntactic errors in packet filter(s)"},
1314     { 78, "Missing or unknown APN"},
1315     { 79, "Shall not be used"},
1316     { 80, "GRE key not found"},
1317     { 81, "Relocation failure"},
1318     { 82, "Denied in RAT"},
1319     { 83, "Preferred PDN type not supported"},
1320     { 84, "All dynamic addresses are occupied"},
1321     { 85, "UE context without TFT already activated"},
1322     { 86, "Protocol type not supported"},
1323     { 87, "UE not responding"},
1324     { 88, "UE refuses"},
1325     { 89, "Service denied"},
1326     { 90, "Unable to page UE"},
1327     { 91, "No memory available"},
1328     { 92, "User authentication failed"},
1329     { 93, "APN access denied - no subscription"},
1330     { 94, "Request rejected(reason not specified)"},
1331     { 95, "P-TMSI Signature mismatch"},
1332     { 96, "IMSI/IMEI not known"},
1333     { 97, "Semantic error in the TAD operation"},
1334     { 98, "Syntactic error in the TAD operation"},
1335     { 99, "Shall not be used"},
1336     {100, "Remote peer not responding"},
1337     {101, "Collision with network initiated request"},
1338     {102, "Unable to page UE due to Suspension"},
1339     {103, "Conditional IE missing"},
1340     {104, "APN Restriction type Incompatible with currently active PDN connection"},
1341     {105, "Invalid overall length of the triggered response message and a piggybacked initial message"},
1342     {106, "Data forwarding not supported"},
1343     {107, "Invalid reply from remote peer"},
1344     {108, "Fallback to GTPv1"},
1345     {109, "Invalid peer"},
1346     {110, "Temporarily rejected due to handover procedure in progress"},
1347     {111, "Modifications not limited to S1-U bearers"},
1348     {112, "Request rejected for a PMIPv6 reason "},
1349     {113, "APN Congestion"},
1350     {114, "Bearer handling not supported"},
1351     {115, "UE already re-attached"},
1352     {116, "Multiple PDN connections for a given APN not allowed"},
1353     /* 117-239 Spare. For future use in a triggered/response message  */
1354     /* 240-255 Spare. For future use in an initial/request message */
1355     {0, NULL}
1356 };
1357 value_string_ext gtpv2_cause_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_cause_vals);
1358
1359 /* Table 8.4-1: CS (Cause Source) */
1360 static const true_false_string gtpv2_cause_cs = {
1361     "Originated by remote node",
1362     "Originated by node sending the message",
1363 };
1364
1365 static void
1366 dissect_gtpv2_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args)
1367 {
1368     int    offset = 0;
1369     guint8 tmp;
1370
1371     /* Cause value octet 5 */
1372     tmp = tvb_get_guint8(tvb, offset);
1373     if (g_gtp_session) {
1374         args->last_cause = tmp;
1375     }
1376     proto_tree_add_item(tree, hf_gtpv2_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
1377
1378     /* Add Cause to ie_tree */
1379     proto_item_append_text(item, "%s (%u)", val_to_str_ext_const(tmp, &gtpv2_cause_vals_ext, "Unknown"), tmp);
1380     offset += 1;
1381
1382     /* Octet 6 Spare PCE BCE CS */
1383     proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, offset << 3, 5, ENC_BIG_ENDIAN);
1384     proto_tree_add_item(tree, hf_gtpv2_cause_pce, tvb, offset, 1, ENC_BIG_ENDIAN);
1385     proto_tree_add_item(tree, hf_gtpv2_cause_bce, tvb, offset, 1, ENC_BIG_ENDIAN);
1386     proto_tree_add_item(tree, hf_gtpv2_cause_cs, tvb, offset,  1, ENC_BIG_ENDIAN);
1387     offset += 1;
1388
1389     /* If n = 2, a = 0 and the Cause IE shall be 6 octets long.
1390      * Therefore, octets "a(n+1) to a(n+4)" will not be present.
1391      * If n = 6, a = 1 and the Cause IE will be 10 octets long.
1392      */
1393     if ( length == 2 ) {
1394         return;
1395     }
1396     /*
1397      * If the rejection is due to a mandatory IE or a verifiable conditional IE is faulty
1398      * or missing, the offending IE shall be included within an additional field "a(n+1)
1399      * to a(n+4)". Only Type and Instance fields of the offending IE that caused the
1400      * rejection have a meaning. The length in the Octet 8-9 and spare bits in the Octet 10
1401      * shall be set to "0". In this case, the value of "n" shall be "6".
1402      * Otherwise, the value of "n" is equal to "2".
1403      */
1404
1405     /* Type of the offending IE */
1406     proto_tree_add_item(tree, hf_gtpv2_cause_off_ie_t, tvb, offset, 1, ENC_BIG_ENDIAN);
1407     offset += 1;
1408
1409     /* Length */
1410     proto_tree_add_item(tree, hf_gtpv2_ie_len, tvb, offset, 2, ENC_BIG_ENDIAN);
1411     offset += 2;
1412     /* a(n+4) Spare Instance */
1413     proto_tree_add_bits_item(tree, hf_gtpv2_spare_half_octet, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
1414     proto_tree_add_item(tree, hf_gtpv2_instance, tvb, offset, 1, ENC_BIG_ENDIAN);
1415
1416 }
1417
1418 /*
1419  * 8.5 Recovery (Restart Counter)
1420  */
1421 static void
1422 dissect_gtpv2_recovery(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1423 {
1424     int    offset = 0;
1425     guint8 recovery;
1426
1427     recovery = tvb_get_guint8(tvb, offset);
1428     proto_tree_add_item(tree, hf_gtpv2_rec, tvb, offset, 1, ENC_BIG_ENDIAN);
1429     proto_item_append_text(item, "%u", recovery);
1430
1431 }
1432
1433
1434 /*Start SRVCC Messages*/
1435
1436 /* 6.2 STN-SR */
1437 static void
1438 dissect_gtpv2_stn_sr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1439 {
1440     proto_item *stn_sr_item;
1441     proto_tree *sub_tree;
1442     tvbuff_t   *new_tvb;
1443     int         offset = 0;
1444
1445     stn_sr_item = proto_tree_add_item(tree, hf_gtpv2_stn_sr, tvb, offset, length, ENC_NA);
1446     new_tvb = tvb_new_subset_length(tvb, offset, length);
1447     sub_tree = proto_item_add_subtree(stn_sr_item, ett_gtpv2_stn_sr);
1448
1449     /* Octet 5
1450      * contains the Nature of Address and Numbering Plan Indicator (NANPI) of the "AddressString" ASN.1 type (see 3GPP
1451      * TS 29.002 [11]). Octets 6 to (n+4) contain the actual STN-SR (digits of an address encoded as a TBCD-STRING as in
1452      * the "AddressString" ASN.1 type). For an odd number of STN-SR digits, bits 8 to 5 of the last octet are encoded with the
1453      * filler "1111".
1454      */
1455     dissect_gsm_map_msisdn(new_tvb, pinfo, sub_tree);
1456 }
1457
1458 /* 6.3 Source to Target Transparent Container */
1459
1460 static void
1461 dissect_gtpv2_src_tgt_trans_con(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1462 {
1463     tvbuff_t   *new_tvb;
1464     proto_tree *sub_tree;
1465     int offset = 0;
1466
1467     proto_tree_add_item(tree, hf_gtpv2_len_trans_con, tvb, offset, 1, ENC_BIG_ENDIAN);
1468     offset += 1;
1469     /*ra_type_flag = 0;*/
1470
1471     /* Transparent Container
1472      * When target network is GERAN, this container carries the Old BSS to New BSS
1473      * Information IE defined in 3GPP TS 48.008 [8]. When target network is UTRAN, this container carries the Source RNC
1474      * to Target RNC Transparent Container IE defined in 3GPP TS 25.413 [9]. The Transparent container field includes the
1475      * IE value part as it is specified in the respective specification.
1476      */
1477     proto_tree_add_item(tree, hf_gtpv2_transparent_container, tvb, offset, length-1, ENC_NA);
1478     /*
1479     * bssmap_old_bss_to_new_bss_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo);
1480     * dissect_ranap_SourceRNC_ToTargetRNC_TransparentContainer_PDU
1481     */
1482     if (message_type == GTPV2_SRVCC_PS_TO_CS_REQUEST) {
1483         sub_tree = proto_tree_add_subtree(tree, tvb, offset, length-1, ett_gtpv2_utran_con, NULL, "Source RNC to Target RNC Transparent Container");
1484         new_tvb = tvb_new_subset_remaining(tvb, offset);
1485         dissect_ranap_SourceRNC_ToTargetRNC_TransparentContainer_PDU(new_tvb, pinfo, sub_tree, NULL);
1486     }
1487
1488 }
1489
1490 /* 6.4 Target to Source Transparent Container */
1491 static void
1492 dissect_gtpv2_tgt_src_trans_con(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type, guint8 instance _U_, session_args_t * args _U_)
1493 {
1494     tvbuff_t   *new_tvb;
1495     proto_tree *sub_tree;
1496     int offset = 0;
1497
1498     proto_tree_add_item(tree, hf_gtpv2_len_trans_con, tvb, offset, 1, ENC_BIG_ENDIAN);
1499     offset += 1;
1500
1501     /* Transparent Container */
1502     proto_tree_add_item(tree, hf_gtpv2_transparent_container, tvb, offset, length-1, ENC_NA);
1503
1504     if (message_type == GTPV2_SRVCC_PS_TO_CS_RESPONSE) {
1505         sub_tree = proto_tree_add_subtree(tree, tvb, offset, length-1, ett_gtpv2_utran_con, NULL, "Target RNC to Source RNC Transparent Container");
1506         new_tvb = tvb_new_subset_remaining(tvb, offset);
1507         dissect_ranap_TargetRNC_ToSourceRNC_TransparentContainer_PDU(new_tvb, pinfo, sub_tree, NULL);
1508     }
1509
1510 }
1511
1512 /* 6.5 MM Context for E-UTRAN SRVCC */
1513 static void
1514 dissect_gtpv2_mm_con_eutran_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1515 {
1516     int         offset = 0;
1517     guint8      elm_len;
1518     proto_tree *ms_tree, *fi;
1519
1520     proto_tree_add_item(tree, hf_gtpv2_eksi, tvb, offset, 1, ENC_BIG_ENDIAN);
1521     offset += 1;
1522     proto_tree_add_item(tree, hf_gtpv2_cksrvcc, tvb, offset, 16, ENC_NA);
1523     offset += 16;
1524     proto_tree_add_item(tree, hf_gtpv2_iksrvcc, tvb, offset, 16, ENC_NA);
1525     offset += 16;
1526
1527   /* Length of Mobile Station Classmark2  */
1528     elm_len = tvb_get_guint8(tvb, offset);
1529     proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark2, tvb, offset, 1, ENC_BIG_ENDIAN);
1530     offset += 1;
1531     fi = proto_tree_add_item(tree, hf_gtpv2_mobile_station_classmark2, tvb, offset, elm_len, ENC_NA);
1532     ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark);
1533     de_ms_cm_2(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0);
1534     offset += elm_len;
1535
1536   /* Length of Mobile Station Classmark3  */
1537     elm_len = tvb_get_guint8(tvb, offset);
1538     proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark3, tvb, offset, 1, ENC_BIG_ENDIAN);
1539     offset += 1;
1540     fi = proto_tree_add_item(tree, hf_gtpv2_mobile_station_classmark3, tvb, offset, elm_len, ENC_NA);
1541     ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark);
1542     de_ms_cm_3(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0);
1543     offset += elm_len;
1544
1545    /*Length of Supported Codec List  */
1546     elm_len = tvb_get_guint8(tvb, offset);
1547     proto_tree_add_item(tree, hf_gtpv2_len_supp_codec_list, tvb, offset, 1, ENC_BIG_ENDIAN);
1548     offset += 1;
1549     fi = proto_tree_add_item(tree, hf_gtpv2_supported_codec_list, tvb, offset, elm_len, ENC_NA);
1550     ms_tree = proto_item_add_subtree(fi, ett_gtpv2_supp_codec_list);
1551     de_sup_codec_list(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0);
1552
1553 }
1554
1555 /* 6.6 MM Context for UTRAN SRVCC */
1556 static void
1557 dissect_gtpv2_mm_con_utran_srvcc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1558 {
1559     int         offset = 0;
1560     guint8      elm_len;
1561     proto_tree *ms_tree, *fi;
1562
1563     proto_tree_add_item(tree, hf_gtpv2_ksi, tvb, offset, 1, ENC_BIG_ENDIAN);
1564     offset += 1;
1565
1566     proto_tree_add_item(tree, hf_gtpv2_utran_srvcc_ck_cs, tvb, offset, 16, ENC_NA);
1567     offset += 16;
1568     proto_tree_add_item(tree, hf_gtpv2_utran_srvcc_ik_cs, tvb, offset, 16, ENC_NA);
1569     offset += 16;
1570     proto_tree_add_item(tree, hf_gtpv2_utran_srvcc_kc, tvb, offset, 8, ENC_NA);
1571     offset += 8;
1572     proto_tree_add_item(tree, hf_gtpv2_cksn, tvb, offset, 1, ENC_BIG_ENDIAN);
1573     offset += 1;
1574
1575     /*Length of Mobile Station Classmark2  */
1576     elm_len = tvb_get_guint8(tvb, offset);
1577     proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark2, tvb, offset, 1, ENC_BIG_ENDIAN);
1578     offset += 1;
1579     fi = proto_tree_add_item(tree, hf_gtpv2_mobile_station_classmark2, tvb, offset, elm_len, ENC_NA);
1580     ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark);
1581     de_ms_cm_2(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0);
1582     offset += elm_len;
1583
1584     /*Length of Mobile Station Classmark3  */
1585     elm_len = tvb_get_guint8(tvb, offset);
1586     proto_tree_add_item(tree, hf_gtpv2_len_ms_classmark3, tvb, offset, 1, ENC_BIG_ENDIAN);
1587     offset += 1;
1588     fi = proto_tree_add_item(tree, hf_gtpv2_mobile_station_classmark3, tvb, offset, elm_len, ENC_NA);
1589     ms_tree = proto_item_add_subtree(fi, ett_gtpv2_ms_mark);
1590     de_ms_cm_3(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0);
1591     offset += elm_len;
1592
1593     /*Length of Supported Codec List  */
1594     elm_len = tvb_get_guint8(tvb, offset);
1595     proto_tree_add_item(tree, hf_gtpv2_len_supp_codec_list, tvb, offset, 1, ENC_BIG_ENDIAN);
1596     offset += 1;
1597     fi = proto_tree_add_item(tree, hf_gtpv2_supported_codec_list, tvb, offset, elm_len, ENC_NA);
1598     ms_tree = proto_item_add_subtree(fi, ett_gtpv2_supp_codec_list);
1599     de_sup_codec_list(tvb, ms_tree, pinfo, offset, elm_len, NULL, 0);
1600
1601 }
1602
1603 /* 6.7 SRVCC Cause */
1604 static const value_string gtpv2_srvcc_cause_vals[] = {
1605     {0, "Reserved"},
1606     {1, "Unspecified"},
1607     {2, "Handover/Relocation cancelled by source system "},
1608     {3, "Handover /Relocation Failure with Target system"},
1609     {4, "Handover/Relocation Target not allowed"},
1610     {5, "Unknown Target ID"},
1611     {6, "Target Cell not available"},
1612     {7, "No Radio Resources Available in Target Cell"},
1613     {8, "Failure in Radio Interface Procedure"},
1614     {9, "Permanent session leg establishment error"},
1615     {10, "Temporary session leg establishment error"},
1616
1617     {0, NULL}
1618 };
1619 static value_string_ext gtpv2_srvcc_cause_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_srvcc_cause_vals);
1620
1621 static void
1622 dissect_gtpv2_srvcc_cause(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1623 {
1624     int    offset = 0;
1625     guint8 srvcc_cause;
1626
1627     srvcc_cause = tvb_get_guint8(tvb, offset);
1628     proto_tree_add_item(tree, hf_gtpv2_srvcc_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
1629     proto_item_append_text(item, "%s (%u)", val_to_str_ext_const(srvcc_cause, &gtpv2_srvcc_cause_vals_ext, "Unknown"), srvcc_cause);
1630
1631 }
1632
1633 /*
1634  * 3GPP TS 29.280 version 10.3.0
1635  * 6.8 Target RNC ID
1636  */
1637 static void
1638 dissect_gtpv2_tgt_rnc_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1639 {
1640     int         offset = 0;
1641     guint16     rnc_id;
1642     proto_tree *subtree;
1643     guint32     mcc;
1644     guint32     mnc;
1645     guint32     lac;
1646     guint32     curr_offset;
1647
1648     /*ra_type_flag = 1;*/ /*Flag to be set to differentiate GERAN and UTRAN*/
1649     curr_offset = offset;
1650
1651     mcc  = (tvb_get_guint8(tvb, curr_offset)   & 0x0f) << 8;
1652     mcc |= (tvb_get_guint8(tvb, curr_offset)   & 0xf0);
1653     mcc |= (tvb_get_guint8(tvb, curr_offset+1) & 0x0f);
1654     mnc  = (tvb_get_guint8(tvb, curr_offset+2) & 0x0f) << 8;
1655     mnc |= (tvb_get_guint8(tvb, curr_offset+2) & 0xf0);
1656     mnc |= (tvb_get_guint8(tvb, curr_offset+1) & 0xf0) >> 4;
1657     if ((mnc & 0x000f) == 0x000f)
1658         mnc = mnc >> 4;
1659
1660     lac = tvb_get_ntohs(tvb, curr_offset + 3);
1661     rnc_id = tvb_get_ntohs(tvb,  curr_offset + 5);
1662
1663     subtree = proto_tree_add_subtree_format(tree,
1664                                    tvb, curr_offset, 6, ett_gtpv2_rai, NULL,
1665                                    "Routing area identification: %x-%x-%u-%u",
1666                                    mcc, mnc, lac, rnc_id);
1667
1668     dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, E212_RAI, TRUE);
1669     curr_offset+=3;
1670
1671     proto_tree_add_item(subtree, hf_gtpv2_lac,    tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1672     curr_offset+=2;
1673     proto_tree_add_item(subtree, hf_gtpv2_rnc_id, tvb, curr_offset, 2, ENC_BIG_ENDIAN);
1674     /*curr_offset+=2;*/
1675
1676     /* no length check possible */
1677
1678
1679 }
1680
1681 /*
1682  * 3GPP TS 29.280
1683  * 6.9 Target Global Cell ID
1684  * The encoding of this IE is defined in 3GPP TS 29.002
1685  *  GlobalCellId ::= OCTET STRING (SIZE (5..7))
1686  *      -- Refers to Cell Global Identification defined in TS 3GPP TS 23.003 [17].
1687  *      -- The internal structure is defined as follows:
1688  *      -- octet 1 bits 4321    Mobile Country Code 1st digit
1689  *      --         bits 8765    Mobile Country Code 2nd digit
1690  *      -- octet 2 bits 4321    Mobile Country Code 3rd digit
1691  *      --         bits 8765    Mobile Network Code 3rd digit
1692  *      --                      or filler (1111) for 2 digit MNCs
1693  *      -- octet 3 bits 4321    Mobile Network Code 1st digit
1694  *      --         bits 8765    Mobile Network Code 2nd digit
1695  *      -- octets 4 and 5       Location Area Code according to TS 3GPP TS 24.008 [35]
1696  *      -- octets 6 and 7       Cell Identity (CI) according to TS 3GPP TS 24.008 [35]
1697  */
1698 static void
1699 dissect_gtpv2_tgt_global_cell_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1700 {
1701     int         offset = 0;
1702     guint8      tgt_cell_id;
1703     proto_tree *subtree;
1704     guint32     mcc;
1705     guint32     mnc;
1706     guint32     lac;
1707     guint32     curr_offset;
1708
1709     curr_offset = offset;
1710
1711     mcc  = (tvb_get_guint8(tvb, curr_offset)   & 0x0f) << 8;
1712     mcc |= (tvb_get_guint8(tvb, curr_offset)   & 0xf0);
1713     mcc |= (tvb_get_guint8(tvb, curr_offset+1) & 0x0f);
1714     mnc  = (tvb_get_guint8(tvb, curr_offset+2) & 0x0f) << 8;
1715     mnc |= (tvb_get_guint8(tvb, curr_offset+2) & 0xf0);
1716     mnc |= (tvb_get_guint8(tvb, curr_offset+1) & 0xf0) >> 4;
1717     if ((mnc & 0x000f) == 0x000f)
1718         mnc = mnc >> 4;
1719
1720     lac = tvb_get_ntohs(tvb, curr_offset + 3);
1721     tgt_cell_id = tvb_get_guint8(tvb,  curr_offset + 5);
1722
1723     subtree = proto_tree_add_subtree_format(tree,
1724                                    tvb, curr_offset, 6, ett_gtpv2_rai, NULL,
1725                                    "Routing area identification: %x-%x-%u-%u",
1726                                    mcc, mnc, lac, tgt_cell_id);
1727
1728     dissect_e212_mcc_mnc(tvb, pinfo, subtree, offset, E212_RAI, TRUE);
1729
1730     proto_tree_add_item(subtree, hf_gtpv2_lac,           tvb, curr_offset + 3, 2, ENC_BIG_ENDIAN);
1731     proto_tree_add_item(subtree, hf_gtpv2_tgt_g_cell_id, tvb, curr_offset + 5, 2, ENC_BIG_ENDIAN);
1732
1733     proto_item_append_text(item, "%x-%x-%u-%u", mcc, mnc, lac, tgt_cell_id);
1734     /* no length check possible */
1735
1736 }
1737
1738 /* 6.10 Tunnel Endpoint Identifier for Control Plane (TEID-C) */
1739 static void
1740 dissect_gtpv2_teid_c(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1741 {
1742     int offset = 0;
1743
1744     proto_tree_add_item(tree, hf_gtpv2_teid_c, tvb, offset, 4, ENC_BIG_ENDIAN);
1745     offset += 4;
1746     if (length > 4)
1747         proto_tree_add_item(tree, hf_gtpv2_teid_c_spare, tvb, offset, length-4, ENC_NA);
1748
1749     proto_item_append_text(item, "%u", tvb_get_ntohl(tvb, offset-4));
1750 }
1751
1752 /* 6.11 Sv Flags */
1753 static void
1754 dissect_gtpv2_sv_flags(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1755 {
1756     int offset = 0;
1757     proto_tree_add_item(tree, hf_gtpv2_sv_sti, tvb, offset, 1, ENC_BIG_ENDIAN);
1758     proto_tree_add_item(tree, hf_gtpv2_sv_ics, tvb, offset, 1, ENC_BIG_ENDIAN);
1759     proto_tree_add_item(tree, hf_gtpv2_sv_emind, tvb, offset, 1, ENC_BIG_ENDIAN);
1760     offset += 1;
1761     if (length > 1)
1762         proto_tree_add_item(tree, hf_gtpv2_teid_c_spare, tvb, offset, length-1, ENC_NA);
1763 }
1764
1765 /* 6.12 Service Area Identifier */
1766
1767 static void
1768 dissect_gtpv2_sai(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1769 {
1770     int offset = 0;
1771
1772     /* 5 MCC digit 2 MCC digit 1
1773      * 6 MNC digit 3 MCC digit 3
1774      * 7 MNC digit 2 MNC digit 1
1775      */
1776     dissect_e212_mcc_mnc(tvb, pinfo, tree, offset, E212_SAI, TRUE);
1777     offset += 3;
1778
1779     /* The Location Area Code (LAC) consists of 2 octets. Bit 8 of Octet 8 is the most significant bit and bit 1 of Octet 9 the
1780      * least significant bit. The coding of the location area code is the responsibility of each administration. Coding using full
1781      * hexadecimal representation shall be used.
1782      */
1783     proto_tree_add_item(tree, hf_gtpv2_lac, tvb, offset, 2, ENC_BIG_ENDIAN);
1784     offset += 2;
1785
1786     /* The Service Area Code (SAC) consists of 2 octets. Bit 8 of Octet 10 is the most significant bit and bit 1 of Octet 11 the
1787      * least significant bit. The SAC is defined by the operator. See 3GPP TS 23.003 [4] subclause 12.5 for more information
1788      */
1789     proto_tree_add_item(tree, hf_gtpv2_sac, tvb, offset, 2, ENC_BIG_ENDIAN);
1790 }
1791
1792 /* 6.13 MM Context for CS to PS SRVCC */
1793 static void
1794 dissect_gtpv2_mm_ctx_for_cs_to_ps_srvcc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1795 {
1796     int offset = 0;
1797
1798     /* Octet 5 KSI"PS */
1799     proto_tree_add_item(tree, hf_gtpv2_ksi_ps, tvb, offset, 1, ENC_BIG_ENDIAN);
1800     offset++;
1801
1802     /* octet 6 - 21 CK'PS */
1803     proto_tree_add_item(tree, hf_gtpv2_ck_ps, tvb, offset, 16, ENC_NA);
1804     offset+=16;
1805
1806     /* octet 22 - 37 IK'PS */
1807     proto_tree_add_item(tree, hf_gtpv2_ik_ps, tvb, offset, 16, ENC_NA);
1808     offset += 16;
1809
1810     /* octet 38 to 45 kc'PS */
1811     proto_tree_add_item(tree, hf_gtpv2_kc_ps, tvb, offset, 8, ENC_NA);
1812     offset += 8;
1813
1814     /* Octet 46 CKSN"PS */
1815     proto_tree_add_item(tree, hf_gtpv2_cksn_ps, tvb, offset, 1, ENC_BIG_ENDIAN);
1816     /*offset++;*/
1817
1818 }
1819 /*End SRVCC Messages*/
1820
1821
1822 /*
1823  * 8.6 Access Point Name (APN)
1824  * The encoding the APN field follows 3GPP TS 23.003 [2] subclause 9.1.
1825  * The content of the APN field shall be the full APN with both the APN Network Identifier
1826  * and APN Operator Identifier being present as specified in 3GPP TS 23.003 [2]
1827  * subclauses 9.1.1 and 9.1.2, 3GPP TS 23.060 [35] Annex A and 3GPP TS 23.401 [3] subclauses 4.3.8.1.
1828  */
1829 static void
1830 dissect_gtpv2_apn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1831 {
1832     int     offset = 0;
1833     guint8 *apn    = NULL;
1834     int     name_len, tmp;
1835
1836     if (length > 0) {
1837         name_len = tvb_get_guint8(tvb, offset);
1838
1839         if (name_len < 0x20) {
1840             apn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset + 1, length - 1, ENC_ASCII);
1841             for (;;) {
1842                 if (name_len >= length - 1)
1843                     break;
1844                 tmp = name_len;
1845                 name_len = name_len + apn[tmp] + 1;
1846                 apn[tmp] = '.';
1847             }
1848         } else{
1849             apn = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_ASCII);
1850         }
1851         proto_tree_add_string(tree, hf_gtpv2_apn, tvb, offset, length, apn);
1852     }
1853
1854     if (apn)
1855         proto_item_append_text(item, "%s", apn);
1856
1857 }
1858
1859 /*
1860  * 8.7 Aggregate Maximum Bit Rate (AMBR)
1861  */
1862
1863 static void
1864 dissect_gtpv2_ambr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1865 {
1866     int offset = 0;
1867
1868     proto_tree_add_item(tree, hf_gtpv2_ambr_up, tvb, offset, 4, ENC_BIG_ENDIAN);
1869     offset += 4;
1870     proto_tree_add_item(tree, hf_gtpv2_ambr_down, tvb, offset, 4, ENC_BIG_ENDIAN);
1871 }
1872
1873 /*
1874  * 8.8 EPS Bearer ID (EBI)
1875  */
1876 static void
1877 dissect_gtpv2_ebi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1878 {
1879
1880     int    offset = 0;
1881     guint8 ebi;
1882
1883     /* Spare (all bits set to 0) B8 - B5*/
1884     proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, offset, 4, ENC_BIG_ENDIAN);
1885     /* EPS Bearer ID (EBI) B4 - B1 */
1886     ebi = tvb_get_guint8(tvb, offset);
1887     proto_tree_add_item(tree, hf_gtpv2_ebi, tvb, offset, 1, ENC_BIG_ENDIAN);
1888     proto_item_append_text(item, "%u", ebi);
1889
1890 }
1891 /*
1892  * 8.9 IP Address
1893  */
1894 static void
1895 dissect_gtpv2_ip_address(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1896 {
1897     int               offset = 0;
1898
1899     if (length == 4)
1900     {
1901         proto_tree_add_item(tree, hf_gtpv2_ip_address_ipv4, tvb, offset, length, ENC_BIG_ENDIAN);
1902         proto_item_append_text(item, "IPv4 %s", tvb_ip_to_str(tvb, offset));
1903     }
1904     else if (length == 16)
1905     {
1906         proto_tree_add_item(tree, hf_gtpv2_ip_address_ipv6, tvb, offset, length, ENC_NA);
1907         proto_item_append_text(item, "IPv6 %s", tvb_ip6_to_str(tvb, offset));
1908     }
1909 }
1910 /*
1911  * 8.10 Mobile Equipment Identity (MEI)
1912  * The ME Identity field contains either the IMEI or the IMEISV
1913  * as defined in clause 6.2 of 3GPP TS 23.003 [2]. It is encoded
1914  * as specified in clause 7.7.53 of 3GPP TS 29.060 [4], beginning
1915  * with octet 4 of Figure 7.7.53.1. The IMEI(SV) digits are encoded
1916  * using BCD coding where IMEI is 15 BCD digits and IMEISV is 16 BCD
1917  * digits. For IMEI, bits 5 to 8 of the last octet shall be filled
1918  * with an end mark coded as '1111'.
1919  */
1920
1921 static void
1922 dissect_gtpv2_mei(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1923 {
1924     int          offset = 0;
1925     const gchar *mei_str;
1926
1927     /* Fetch the BCD encoded digits from tvb low half byte, formating the digits according to
1928      * a default digit set of 0-9 returning "?" for overdecadic digits a pointer to the EP
1929      * allocated string will be returned.
1930      */
1931     mei_str = tvb_bcd_dig_to_wmem_packet_str( tvb, 0, length, NULL, FALSE);
1932
1933     proto_tree_add_string(tree, hf_gtpv2_mei, tvb, offset, length, mei_str);
1934     proto_item_append_text(item, "%s", mei_str);
1935 }
1936
1937 /*
1938  * 8.11 MSISDN
1939  *
1940  * MSISDN is defined in 3GPP TS 23.003
1941  * Editor's note: MSISDN coding will be defined in TS 24.301.
1942  */
1943 static void
1944 dissect_gtpv2_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1945 {
1946     const char *digit_str;
1947
1948     /* Octets 5 to (n+4) represent the MSISDN value is in international number format
1949      * as described in ITU-T Rec E.164 [25] and 3GPP TS 29.002 [41].
1950      * MSISDN value contains only the actual MSISDN number (does not contain the "nature of
1951      * address indicator" octet, which indicates "international number"
1952      * as in 3GPP TS 29.002 [41]) and is encoded as TBCD digits, i.e.
1953      * digits from 0 through 9 are encoded "0000" to "1001".
1954      * When there is an odd number of digits, bits 8 to 5 of the last octet are encoded with
1955      * the filler "1111".
1956      */
1957     /* Fetch the BCD encoded digits from tvb low half byte, formating the digits according to
1958      * a default digit set of 0-9 returning "?" for overdecadic digits a pointer to the EP
1959      * allocated string will be returned.
1960      */
1961     digit_str = dissect_e164_msisdn(tvb, tree, 0, length, E164_ENC_BCD);
1962     proto_item_append_text(item, "%s", digit_str);
1963 }
1964
1965 /*
1966  * 8.12 Indication
1967  */
1968 static void
1969 dissect_gtpv2_ind(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
1970 {
1971     int offset = 0;
1972     /* Octet 5 DAF DTF HI DFI OI ISRSI ISRAI SGWCI */
1973     proto_tree_add_item(tree, hf_gtpv2_daf,         tvb, offset, 1, ENC_BIG_ENDIAN);
1974     proto_tree_add_item(tree, hf_gtpv2_dtf,         tvb, offset, 1, ENC_BIG_ENDIAN);
1975     proto_tree_add_item(tree, hf_gtpv2_hi,          tvb, offset, 1, ENC_BIG_ENDIAN);
1976     proto_tree_add_item(tree, hf_gtpv2_dfi,         tvb, offset, 1, ENC_BIG_ENDIAN);
1977     proto_tree_add_item(tree, hf_gtpv2_oi,          tvb, offset, 1, ENC_BIG_ENDIAN);
1978     proto_tree_add_item(tree, hf_gtpv2_isrsi,       tvb, offset, 1, ENC_BIG_ENDIAN);
1979     proto_tree_add_item(tree, hf_gtpv2_israi,       tvb, offset, 1, ENC_BIG_ENDIAN);
1980     proto_tree_add_item(tree, hf_gtpv2_sgwci,       tvb, offset, 1, ENC_BIG_ENDIAN);
1981
1982     if (length == 1) {
1983         proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_len_invalid, tvb, 0, length, "Older version?, should be 2 octets in 8.0.0");
1984         return;
1985     }
1986
1987     offset += 1;
1988
1989     /* Octet 6 SQCI UIMSI CFSI CRSI P PT SI MSV
1990      * 3GPP TS 29.274 version 9.4.0 Release 9
1991      */
1992     proto_tree_add_item(tree, hf_gtpv2_sqci,          tvb, offset, 1, ENC_BIG_ENDIAN);
1993     proto_tree_add_item(tree, hf_gtpv2_uimsi,         tvb, offset, 1, ENC_BIG_ENDIAN);
1994     proto_tree_add_item(tree, hf_gtpv2_cfsi,          tvb, offset, 1, ENC_BIG_ENDIAN);
1995     proto_tree_add_item(tree, hf_gtpv2_crsi,          tvb, offset, 1, ENC_BIG_ENDIAN);
1996
1997     proto_tree_add_item(tree, hf_gtpv2_ps,          tvb, offset, 1, ENC_BIG_ENDIAN);
1998     proto_tree_add_item(tree, hf_gtpv2_pt,          tvb, offset, 1, ENC_BIG_ENDIAN);
1999     proto_tree_add_item(tree, hf_gtpv2_si,          tvb, offset, 1, ENC_BIG_ENDIAN);
2000     proto_tree_add_item(tree, hf_gtpv2_msv,         tvb, offset, 1, ENC_BIG_ENDIAN);
2001     offset += 1;
2002
2003     if (length == 2) {
2004         return;
2005     }
2006     /* Only present in version 9 and higher */
2007     /* Octet 7 RetLoc PBIC SRNI S6AF S4AF MBMDT ISRAU CCRSI */
2008     proto_tree_add_item(tree, hf_gtpv2_retloc,          tvb, offset, 1, ENC_BIG_ENDIAN);
2009     proto_tree_add_item(tree, hf_gtpv2_pbic,            tvb, offset, 1, ENC_BIG_ENDIAN);
2010     proto_tree_add_item(tree, hf_gtpv2_srni,            tvb, offset, 1, ENC_BIG_ENDIAN);
2011     proto_tree_add_item(tree, hf_gtpv2_s6af,            tvb, offset, 1, ENC_BIG_ENDIAN);
2012     proto_tree_add_item(tree, hf_gtpv2_s4af,            tvb, offset, 1, ENC_BIG_ENDIAN);
2013     proto_tree_add_item(tree, hf_gtpv2_mbmdt,           tvb, offset, 1, ENC_BIG_ENDIAN);
2014     proto_tree_add_item(tree, hf_gtpv2_israu,           tvb, offset, 1, ENC_BIG_ENDIAN);
2015     proto_tree_add_item(tree, hf_gtpv2_ccrsi,           tvb, offset, 1, ENC_BIG_ENDIAN);
2016     offset += 1;
2017
2018     if (length == 3) {
2019         return;
2020     }
2021     /* Octet 8 CPRAI ARRL PPOF PPON/PPEI PPSI CSFBI CLII CPSR */
2022     proto_tree_add_item(tree, hf_gtpv2_cprai,           tvb, offset, 1, ENC_BIG_ENDIAN);
2023     proto_tree_add_item(tree, hf_gtpv2_arrl,            tvb, offset, 1, ENC_BIG_ENDIAN);
2024     proto_tree_add_item(tree, hf_gtpv2_ppof,            tvb, offset, 1, ENC_BIG_ENDIAN);
2025     proto_tree_add_item(tree, hf_gtpv2_ppon_ppei,       tvb, offset, 1, ENC_BIG_ENDIAN);
2026     proto_tree_add_item(tree, hf_gtpv2_ppsi,            tvb, offset, 1, ENC_BIG_ENDIAN);
2027     proto_tree_add_item(tree, hf_gtpv2_csfbi,           tvb, offset, 1, ENC_BIG_ENDIAN);
2028     proto_tree_add_item(tree, hf_gtpv2_clii,            tvb, offset, 1, ENC_BIG_ENDIAN);
2029     proto_tree_add_item(tree, hf_gtpv2_cpsr,            tvb, offset, 1, ENC_BIG_ENDIAN);
2030     offset += 1;
2031
2032     if (length == 4) {
2033         return;
2034     }
2035
2036     /* Octet 9 NSI UASI DTCI BDWI PSCI PCRI AOSI AOPI */
2037     proto_tree_add_item(tree, hf_gtpv2_nsi,             tvb, offset, 1, ENC_BIG_ENDIAN);
2038     proto_tree_add_item(tree, hf_gtpv2_uasi,            tvb, offset, 1, ENC_BIG_ENDIAN);
2039     proto_tree_add_item(tree, hf_gtpv2_dtci,            tvb, offset, 1, ENC_BIG_ENDIAN);
2040     proto_tree_add_item(tree, hf_gtpv2_bdwi,            tvb, offset, 1, ENC_BIG_ENDIAN);
2041     proto_tree_add_item(tree, hf_gtpv2_psci,            tvb, offset, 1, ENC_BIG_ENDIAN);
2042     proto_tree_add_item(tree, hf_gtpv2_pcri,            tvb, offset, 1, ENC_BIG_ENDIAN);
2043     proto_tree_add_item(tree, hf_gtpv2_aosi,            tvb, offset, 1, ENC_BIG_ENDIAN);
2044     proto_tree_add_item(tree, hf_gtpv2_aopi,            tvb, offset, 1, ENC_BIG_ENDIAN);
2045     offset += 1;
2046
2047     if (length == 5) {
2048         return;
2049     }
2050
2051     /* Octet 10 ROAAI EPCOSI CPOPCI PMTSMI S11TF PNSI UNACCSI WPMSI */
2052     proto_tree_add_item(tree, hf_gtpv2_roaai,           tvb, offset, 1, ENC_BIG_ENDIAN);
2053     proto_tree_add_item(tree, hf_gtpv2_epcosi,          tvb, offset, 1, ENC_BIG_ENDIAN);
2054     proto_tree_add_item(tree, hf_gtpv2_cpopci,          tvb, offset, 1, ENC_BIG_ENDIAN);
2055     proto_tree_add_item(tree, hf_gtpv2_pmtsmi,          tvb, offset, 1, ENC_BIG_ENDIAN);
2056     proto_tree_add_item(tree, hf_gtpv2_s11tf,           tvb, offset, 1, ENC_BIG_ENDIAN);
2057     proto_tree_add_item(tree, hf_gtpv2_pnsi,            tvb, offset, 1, ENC_BIG_ENDIAN);
2058     proto_tree_add_item(tree, hf_gtpv2_unaccsi,         tvb, offset, 1, ENC_BIG_ENDIAN);
2059     proto_tree_add_item(tree, hf_gtpv2_wpmsi,           tvb, offset, 1, ENC_BIG_ENDIAN);
2060     offset += 1;
2061
2062     if (length == 6){
2063         return;
2064     }
2065
2066     /*Octet 11 Spare Spare Spare Spare Spare Spare ENBCRSI TSPCMI */
2067     proto_tree_add_item(tree, hf_gtpv2_enbcrsi,         tvb, offset, 1, ENC_BIG_ENDIAN);
2068     proto_tree_add_item(tree, hf_gtpv2_tspcmi,          tvb, offset, 1, ENC_BIG_ENDIAN);
2069     offset += 1;
2070
2071     if (length == 7){
2072         return;
2073     }
2074
2075     proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet");
2076
2077
2078 }
2079
2080 /*
2081  * 8.13 Protocol Configuration Options (PCO)
2082  * Protocol Configuration Options (PCO) is transferred via GTP tunnels. The sending entity copies the value part of the
2083  * PCO into the Value field of the PCO IE. The detailed coding of the PCO field from octets 5 to (n+4) shall be specified
2084  * as per clause 10.5.6.3 of 3GPP TS 24.008 [5], starting with octet 3.
2085  * Dissected in packet-gsm_a_gm.c
2086  */
2087 static void
2088 dissect_gtpv2_pco(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2089 {
2090     switch (message_type) {
2091     case GTPV2_CREATE_SESSION_REQUEST:
2092     case GTPV2_DELETE_SESSION_REQUEST:
2093     case GTPV2_BEARER_RESOURCE_COMMAND:
2094     case GTPV2_CREATE_BEARER_RESPONSE:
2095     case GTPV2_UPDATE_BEARER_RESPONSE:
2096     case GTPV2_DELETE_BEARER_RESPONSE:
2097         /* PCO options as MS to network direction */
2098         pinfo->link_dir = P2P_DIR_UL;
2099         break;
2100     case GTPV2_CREATE_SESSION_RESPONSE:
2101     case GTPV2_MODIFY_BEARER_RESPONSE:
2102     case GTPV2_DELETE_SESSION_RESPONSE:
2103     case GTPV2_CREATE_BEARER_REQUEST:
2104     case GTPV2_UPDATE_BEARER_REQUEST:
2105     case GTPV2_DELETE_BEARER_REQUEST:
2106         /* PCO options as Network to MS direction: */
2107         pinfo->link_dir = P2P_DIR_DL;
2108         break;
2109     default:
2110         break;
2111     }
2112     de_sm_pco(tvb, tree, pinfo, 0, length, NULL, 0);
2113 }
2114
2115 /*
2116  * 8.14 PDN Address Allocation (PAA)
2117  */
2118
2119 static const value_string gtpv2_pdn_type_vals[] = {
2120     {1, "IPv4"},
2121     {2, "IPv6"},
2122     {3, "IPv4/IPv6"},
2123     {4, "Non-IP"},
2124     {0, NULL}
2125 };
2126
2127 static void
2128 dissect_gtpv2_paa(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2129 {
2130     int    offset = 0;
2131     guint8 pdn_type;
2132
2133     pdn_type = tvb_get_guint8(tvb, offset);
2134     proto_tree_add_item(tree, hf_gtpv2_pdn_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2135     offset += 1;
2136     switch (pdn_type)
2137     {
2138     case 1:
2139         /* IPv4 */
2140         proto_tree_add_item(tree, hf_gtpv2_pdn_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2141         break;
2142     case 2:
2143         /* IPv6*/
2144         /* If PDN type value indicates IPv6, octet 6 contains the IPv6 Prefix Length.
2145          * Octets 7 through 22 contain an IPv6 Prefix and Interface Identifier.
2146          * Bit 8 of octet 7 represents the most significant bit of the IPv6 Prefix
2147          * and Interface Identifier and bit 1 of octet 22 the least significant bit.
2148          */
2149         proto_tree_add_item(tree, hf_gtpv2_pdn_ipv6_len, tvb, offset, 1, ENC_BIG_ENDIAN);
2150         offset += 1;
2151         proto_tree_add_item(tree, hf_gtpv2_pdn_ipv6, tvb, offset, 16, ENC_NA);
2152         break;
2153     case 3:
2154         /* IPv4/IPv6 */
2155         /* If PDN type value indicates IPv4v6, octet 6 contains the IPv6 Prefix Length.
2156          * Octets 7 through 22 contain an IPv6 Prefix and Interface Identifier.
2157          * Bit 8 of octet 7 represents the most significant bit of the IPv6 Prefix
2158          * and Interface Identifier and bit 1 of octet 22 the least significant bit.
2159          * Octets 23 through 26 contain an IPv4 address. Bit 8 of octet 23 represents
2160          * the most significant bit of the IPv4 address and bit 1 of octet 26 the least
2161          * significant bit.
2162          */
2163         proto_tree_add_item(tree, hf_gtpv2_pdn_ipv6_len, tvb, offset, 1, ENC_BIG_ENDIAN);
2164         offset += 1;
2165         proto_tree_add_item(tree, hf_gtpv2_pdn_ipv6, tvb, offset, 16, ENC_NA);
2166         offset += 16;
2167         proto_tree_add_item(tree, hf_gtpv2_pdn_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2168         break;
2169     default:
2170         break;
2171     }
2172 }
2173 /*
2174  * 8.15 Bearer Quality of Service (Bearer QoS)
2175  */
2176
2177 static void
2178 dissect_gtpv2_bearer_qos(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2179 {
2180     int offset = 0;
2181     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pci,       tvb, offset, 1, ENC_BIG_ENDIAN);
2182     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pl,        tvb, offset, 1, ENC_BIG_ENDIAN);
2183     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_pvi,       tvb, offset, 1, ENC_BIG_ENDIAN);
2184     offset += 1;
2185     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_label_qci, tvb, offset, 1, ENC_BIG_ENDIAN);
2186     offset += 1;
2187     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_mbr_up,    tvb, offset, 5, ENC_BIG_ENDIAN);
2188     offset += 5;
2189     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_mbr_down,  tvb, offset, 5, ENC_BIG_ENDIAN);
2190     offset += 5;
2191     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_gbr_up,    tvb, offset, 5, ENC_BIG_ENDIAN);
2192     offset += 5;
2193     proto_tree_add_item(tree, hf_gtpv2_bearer_qos_gbr_down,  tvb, offset, 5, ENC_BIG_ENDIAN);
2194 }
2195
2196 /*
2197  * 8.16 Flow Quality of Service (Flow QoS)
2198  */
2199
2200 static void
2201 dissect_gtpv2_flow_qos(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2202 {
2203     int offset = 0;
2204     proto_tree_add_item(tree, hf_gtpv2_flow_qos_label_qci, tvb, offset, 1, ENC_BIG_ENDIAN);
2205     offset += 1;
2206     proto_tree_add_item(tree, hf_gtpv2_flow_qos_mbr_up,    tvb, offset, 5, ENC_BIG_ENDIAN);
2207     offset += 5;
2208     proto_tree_add_item(tree, hf_gtpv2_flow_qos_mbr_down,  tvb, offset, 5, ENC_BIG_ENDIAN);
2209     offset += 5;
2210     proto_tree_add_item(tree, hf_gtpv2_flow_qos_gbr_up,    tvb, offset, 5, ENC_BIG_ENDIAN);
2211     offset += 5;
2212     proto_tree_add_item(tree, hf_gtpv2_flow_qos_gbr_down,  tvb, offset, 5, ENC_BIG_ENDIAN);
2213 }
2214
2215 /*
2216  * 8.17 RAT Type
2217  */
2218 static const value_string gtpv2_rat_type_vals[] = {
2219     {0, "Reserved"},
2220     {1, "UTRAN"},
2221     {2, "GERAN"},
2222     {3, "WLAN"},
2223     {4, "GAN"},
2224     {5, "HSPA Evolution"},
2225     {6, "EUTRAN"},
2226     {7, "Virtual"},
2227     {8, "EUTRAN-NB-IoT"},
2228     {0, NULL}
2229 };
2230 static value_string_ext gtpv2_rat_type_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_rat_type_vals);
2231
2232
2233 static void
2234 dissect_gtpv2_rat_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2235 {
2236     guint8 rat_type;
2237
2238     rat_type = tvb_get_guint8(tvb, 0);
2239     proto_tree_add_item(tree, hf_gtpv2_rat_type, tvb, 0, 1, ENC_BIG_ENDIAN);
2240     proto_item_append_text(item, "%s (%u)", val_to_str_ext_const(rat_type, &gtpv2_rat_type_vals_ext, "Unknown"), rat_type);
2241
2242 }
2243
2244 /*
2245  * 8.18 Serving Network
2246  */
2247 static void
2248 dissect_gtpv2_serv_net(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2249 {
2250     gchar *mcc_mnc_str;
2251
2252     mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, 0, E212_NONE, TRUE);
2253     proto_item_append_text(item, "%s", mcc_mnc_str);
2254 }
2255
2256 /*
2257  * 8.19 EPS Bearer Level Traffic Flow Template (Bearer TFT)
2258  */
2259
2260 static void
2261 dissect_gtpv2_bearer_tft(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2262 {
2263     /* The detailed coding of Traffic Aggregate
2264      * Description is specified in 3GPP TS 24.008 [5] ,
2265      * clause 10.5.6.12, beginning with octet 3..
2266      * Use the decoding in packet-gsm_a_gm.c
2267      */
2268     de_sm_tflow_temp(tvb, tree, pinfo, 0, length, NULL, 0);
2269
2270 }
2271  /* 8.20 Traffic Aggregate Description (TAD)
2272  */
2273 static void
2274 dissect_gtpv2_tad(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2275 {
2276     /* The detailed coding of Traffic Aggregate
2277      * Description is specified in 3GPP TS 24.008 [5] ,
2278      * clause 10.5.6.12, beginning with octet 3..
2279      * Use the decoding in packet-gsm_a_gm.c
2280      */
2281     de_sm_tflow_temp(tvb, tree, pinfo, 0, length, NULL, 0);
2282 }
2283
2284 /*
2285  * 8.21 User Location Info (ULI)
2286  *
2287  * The flags ECGI, TAI, RAI, SAI and CGI in octed 5 indicate if the corresponding
2288  * fields are present in the IE or not. If one of these flags is set to "0",
2289  * the corresponding field is not present at all. The respective identities are defined in 3GPP
2290  * TS 23.003 [2].
2291  * Editor's Note: The definition of ECGI is missing in 3GPP TS 23.003 v8.1.0.
2292  * It can be found in 3GPP TS 36.413 v8.3.0, but it is expected that it will be moved
2293  * to 23.003 in a future version.
2294  */
2295 gchar*
2296 dissect_gtpv2_tai(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int *offset)
2297 {
2298     gchar      *str = NULL;
2299     gchar      *mcc_mnc_str;
2300     guint16 tac;
2301
2302     mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_TAI, TRUE);
2303     *offset += 3;
2304     tac = tvb_get_ntohs(tvb, *offset);
2305     proto_tree_add_item(tree, hf_gtpv2_tai_tac, tvb, *offset, 2, ENC_BIG_ENDIAN);
2306     *offset += 2;
2307     str = wmem_strdup_printf(wmem_packet_scope(), "%s, TAC 0x%x",
2308         mcc_mnc_str,
2309         tac);
2310
2311     return str;
2312 }
2313
2314 static gchar*
2315 dissect_gtpv2_ecgi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int *offset)
2316 {
2317     gchar      *str = NULL;
2318     gchar      *mcc_mnc_str;
2319     guint8      octet;
2320     guint32     octet4;
2321     guint8      spare;
2322     guint32     ECGI;
2323     const int* ECGI_flags[] = {
2324         &hf_gtpv2_enodebid,
2325         &hf_gtpv2_cellid,
2326         NULL
2327     };
2328
2329     mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_ECGI, TRUE);
2330     *offset += 3;
2331     /* The bits 8 through 5, of octet e+3 (Fig 8.21.5-1 in TS 29.274 V8.2.0) are spare
2332         * and hence they would not make any difference to the hex string following it,
2333         * thus we directly read 4 bytes from the tvb
2334         */
2335
2336     octet = tvb_get_guint8(tvb, *offset);
2337     spare = octet & 0xF0;
2338     octet4 = tvb_get_ntohl(tvb, *offset);
2339     ECGI = octet4 & 0x0FFFFFFF;
2340     proto_tree_add_uint(tree, hf_gtpv2_ecgi_eci_spare, tvb, *offset, 1, spare);
2341     /* The coding of the E-UTRAN cell identifier is the responsibility of each administration.
2342      * Coding using full hexadecimal representation shall be used.
2343      */
2344     proto_tree_add_bitmask(tree, tvb, *offset, hf_gtpv2_ecgi_eci, ett_gtpv2_eci, ECGI_flags, ENC_BIG_ENDIAN);
2345     *offset += 4;
2346     str = wmem_strdup_printf(wmem_packet_scope(), "%s, ECGI 0x%x",
2347         mcc_mnc_str,
2348         ECGI);
2349
2350
2351     return str;
2352 }
2353
2354 static gchar*
2355 dissect_gtpv2_rai(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int *offset)
2356 {
2357     gchar      *str = NULL;
2358     gchar      *mcc_mnc_str;
2359     guint16     lac, rac;
2360
2361     mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_RAI, TRUE);
2362     *offset += 3;
2363     lac = tvb_get_ntohs(tvb, *offset);
2364     proto_tree_add_item(tree, hf_gtpv2_rai_lac, tvb, *offset, 2, ENC_BIG_ENDIAN);
2365     *offset += 2;
2366     rac = tvb_get_ntohs(tvb, *offset);
2367     proto_tree_add_item(tree, hf_gtpv2_rai_rac, tvb, *offset, 2, ENC_BIG_ENDIAN);
2368     *offset += 2;
2369     str = wmem_strdup_printf(wmem_packet_scope(), "%s, LAC 0x%x, RAC 0x%x",
2370         mcc_mnc_str,
2371         lac,
2372         rac);
2373
2374     return str;
2375 }
2376
2377 static gchar*
2378 dissect_gtpv2_sai_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int *offset)
2379 {
2380     gchar      *str = NULL;
2381     gchar      *mcc_mnc_str;
2382     guint16     lac, sac;
2383
2384     mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_SAI, TRUE);
2385     *offset += 3;
2386     lac = tvb_get_ntohs(tvb, *offset);
2387     proto_tree_add_item(tree, hf_gtpv2_sai_lac, tvb, *offset, 2, ENC_BIG_ENDIAN);
2388     *offset += 2;
2389     sac = tvb_get_ntohs(tvb, *offset);
2390     proto_tree_add_item(tree, hf_gtpv2_sai_sac, tvb, *offset, 2, ENC_BIG_ENDIAN);
2391     *offset += 2;
2392     str = wmem_strdup_printf(wmem_packet_scope(), "%s, LAC 0x%x, SAC 0x%x",
2393         mcc_mnc_str,
2394         lac,
2395         sac);
2396
2397     return str;
2398 }
2399
2400 static gchar*
2401 dissect_gtpv2_cgi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int *offset)
2402 {
2403     gchar      *str = NULL;
2404     gchar      *mcc_mnc_str;
2405     guint16     lac, ci;
2406
2407     mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, *offset, E212_CGI, TRUE);
2408     *offset += 3;
2409     lac = tvb_get_ntohs(tvb, *offset);
2410     proto_tree_add_item(tree, hf_gtpv2_uli_cgi_lac, tvb, *offset, 2, ENC_BIG_ENDIAN);
2411     *offset += 2;
2412     ci = tvb_get_ntohs(tvb, *offset);
2413     proto_tree_add_item(tree, hf_gtpv2_uli_cgi_ci, tvb, *offset, 2, ENC_BIG_ENDIAN);
2414     *offset += 2;
2415     str = wmem_strdup_printf(wmem_packet_scope(), "%s, LAC 0x%x, CI 0x%x",
2416         mcc_mnc_str,
2417         lac,
2418         ci);
2419
2420     return str;
2421 }
2422
2423 static gchar*
2424 decode_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 instance _U_, guint flags)
2425 {
2426     int         offset = 1;     /* flags are already dissected */
2427     proto_tree *part_tree;
2428     gchar      *mcc_mnc_str;
2429     gchar      *str = NULL;
2430
2431     /* 8.21.1 CGI field  */
2432     if (flags & GTPv2_ULI_CGI_MASK)
2433     {
2434
2435         proto_item_append_text(item, "CGI ");
2436         part_tree = proto_tree_add_subtree(tree, tvb, offset, 7,
2437                 ett_gtpv2_uli_field, NULL, "Cell Global Identity (CGI)");
2438
2439         str = dissect_gtpv2_cgi(tvb, pinfo, part_tree, &offset);
2440
2441         if (offset == length)
2442             return str;
2443     }
2444
2445     /* 8.21.2 SAI field  */
2446     if (flags & GTPv2_ULI_SAI_MASK)
2447     {
2448         proto_item_append_text(item, "SAI ");
2449         part_tree = proto_tree_add_subtree(tree, tvb, offset, 7,
2450                 ett_gtpv2_uli_field, NULL, "Service Area Identity (SAI)");
2451
2452         str = dissect_gtpv2_sai_common(tvb, pinfo, part_tree, &offset);
2453
2454         if (offset == length)
2455             return str;
2456     }
2457     /* 8.21.3 RAI field  */
2458     if (flags & GTPv2_ULI_RAI_MASK)
2459     {
2460         proto_item_append_text(item, "RAI ");
2461         part_tree = proto_tree_add_subtree(tree, tvb, offset, 7,
2462                 ett_gtpv2_uli_field, NULL, "Routeing Area Identity (RAI)");
2463
2464         str = dissect_gtpv2_rai(tvb, pinfo, part_tree, &offset);
2465
2466         if (offset == length)
2467             return str;
2468     }
2469     /* 8.21.4 TAI field  */
2470     if (flags & GTPv2_ULI_TAI_MASK)
2471     {
2472         proto_item_append_text(item, "TAI ");
2473         part_tree = proto_tree_add_subtree(tree, tvb, offset, 5,
2474             ett_gtpv2_uli_field, NULL, "Tracking Area Identity (TAI)");
2475
2476         str = dissect_gtpv2_tai(tvb, pinfo, part_tree, &offset);
2477
2478         if (offset == length)
2479             return str;
2480     }
2481     /* 8.21.5 ECGI field */
2482     if (flags & GTPv2_ULI_ECGI_MASK)
2483     {
2484         proto_item_append_text(item, "ECGI ");
2485         part_tree = proto_tree_add_subtree(tree, tvb, offset, 7,
2486             ett_gtpv2_uli_field, NULL, "E-UTRAN Cell Global Identifier (ECGI)");
2487
2488         str = dissect_gtpv2_ecgi(tvb, pinfo, part_tree, &offset);
2489
2490         if (offset == length)
2491             return str;
2492
2493     }
2494     /* 8.21.6  LAI field */
2495     if (flags & GTPv2_ULI_LAI_MASK)
2496     {
2497         guint16 lac;
2498         proto_item_append_text(item, "LAI ");
2499         part_tree = proto_tree_add_subtree(tree, tvb, offset, 5,
2500             ett_gtpv2_uli_field, NULL, "LAI (Location Area Identifier)");
2501         mcc_mnc_str = dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, part_tree, offset, E212_LAI, TRUE);
2502         offset += 3;
2503
2504         /* The Location Area Code (LAC) consists of 2 octets. Bit 8 of Octet f+3 is the most significant bit
2505          * and bit 1 of Octet f+4 the least significant bit. The coding of the location area code is the
2506          * responsibility of each administration. Coding using full hexadecimal representation shall be used.
2507          */
2508         proto_tree_add_item(part_tree, hf_gtpv2_uli_lai_lac, tvb, offset, 2, ENC_BIG_ENDIAN);
2509         lac = tvb_get_ntohs(tvb, offset);
2510         str = wmem_strdup_printf(wmem_packet_scope(), "%s, LAC 0x%x",
2511             mcc_mnc_str,
2512             lac);
2513
2514     }
2515
2516     return str;
2517
2518 }
2519
2520 static void
2521 dissect_gtpv2_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2522 {
2523     proto_tree *flag_tree;
2524     int         offset = 0;
2525     guint       flags;
2526
2527     flag_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtpv2_uli_flags, NULL, "Flags");
2528     flags = tvb_get_guint8(tvb, offset) & 0x3f;
2529     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, offset >> 3, 2, ENC_BIG_ENDIAN);
2530
2531     /* LAI B6 */
2532     proto_tree_add_item(flag_tree, hf_gtpv2_uli_lai_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
2533     /* ECGI B5 */
2534     proto_tree_add_item(flag_tree, hf_gtpv2_uli_ecgi_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
2535     /* TAI B4  */
2536     proto_tree_add_item(flag_tree, hf_gtpv2_uli_tai_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
2537     /* RAI B3  */
2538     proto_tree_add_item(flag_tree, hf_gtpv2_uli_rai_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
2539     /* SAI B2  */
2540     proto_tree_add_item(flag_tree, hf_gtpv2_uli_sai_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
2541     /* CGI B1  */
2542     proto_tree_add_item(flag_tree, hf_gtpv2_uli_cgi_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
2543
2544     decode_gtpv2_uli(tvb, pinfo, tree, item, length, instance, flags);
2545
2546     return;
2547 }
2548
2549 /* Diameter 3GPP AVP Code: 22 3GPP-User-Location-Info */
2550 /*
2551  * TS 29.061 v9.2.0
2552  * 16.4.7.2 Coding 3GPP Vendor-Specific RADIUS attributes
2553  *
2554  * For P-GW, the Geographic Location Type values and coding are defined as follows:
2555  *
2556  * 0        CGI
2557  * 1        SAI
2558  * 2        RAI
2559  * 3-127    Spare for future use
2560  * 128      TAI
2561  * 129      ECGI
2562  * 130      TAI and ECGI
2563  * 131-255  Spare for future use
2564  */
2565
2566
2567 static const value_string geographic_location_type_vals[] = {
2568     {0,   "CGI"},
2569     {1,   "SAI"},
2570     {2,   "RAI"},
2571     {128, "TAI"},
2572     {129, "ECGI"},
2573     {130, "TAI and ECGI"},
2574     {0, NULL}
2575 };
2576
2577 static int
2578 dissect_diameter_3gpp_uli(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
2579 {
2580     diam_sub_dis_t *diam_sub_dis = (diam_sub_dis_t*)data;
2581     int   offset = 0;
2582     guint length;
2583     guint flags;
2584     guint flags_3gpp;
2585     length       = tvb_reported_length(tvb);
2586     flags_3gpp   = tvb_get_guint8(tvb, offset);
2587
2588     proto_tree_add_item(tree, hf_gtpv2_glt, tvb, offset, 1, ENC_BIG_ENDIAN);
2589
2590     switch (flags_3gpp)
2591     {
2592     case 0:
2593         /* CGI */
2594         flags = GTPv2_ULI_CGI_MASK;
2595         break;
2596     case 1:
2597         /* SAI */
2598         flags = GTPv2_ULI_SAI_MASK;
2599         break;
2600     case 2:
2601         /* RAI */
2602         flags = GTPv2_ULI_RAI_MASK;
2603         break;
2604     case 128:
2605         /* TAI */
2606         flags = GTPv2_ULI_TAI_MASK;
2607         break;
2608     case 129:
2609         /* ECGI */
2610         flags = GTPv2_ULI_ECGI_MASK;
2611         break;
2612     case 130:
2613         /* TAI and ECGI */
2614         flags = GTPv2_ULI_TAI_MASK + GTPv2_ULI_ECGI_MASK;
2615         break;
2616     default:
2617         proto_tree_add_item(tree, hf_gtpv2_geographic_location, tvb, 1, -1, ENC_NA);
2618         return length;
2619     }
2620
2621     diam_sub_dis->avp_str = decode_gtpv2_uli(tvb, pinfo, tree, NULL, length, 0, flags);
2622     return length;
2623 }
2624
2625 /*
2626  * 8.22 Fully Qualified TEID (F-TEID)
2627  */
2628 static const value_string gtpv2_f_teid_interface_type_vals[] = {
2629     { 0, "S1-U eNodeB GTP-U interface"},
2630     { 1, "S1-U SGW GTP-U interface"},
2631     { 2, "S12 RNC GTP-U interface"},
2632     { 3, "S12 SGW GTP-U interface"},
2633     { 4, "S5/S8 SGW GTP-U interface"},
2634     { 5, "S5/S8 PGW GTP-U interface"},
2635     { 6, "S5/S8 SGW GTP-C interface"},
2636     { 7, "S5/S8 PGW GTP-C interface"},
2637     { 8, "S5/S8 SGW PMIPv6 interface"}, /* (the 32 bit GRE key is encoded in 32 bit TEID field "
2638          "and since alternate CoA is not used the control plane and user plane addresses are the same for PMIPv6)"}, */
2639     { 9, "S5/S8 PGW PMIPv6 interface"}, /* (the 32 bit GRE key is encoded in 32 bit TEID field "
2640          "and the control plane and user plane addresses are the same for PMIPv6)"}, */
2641     {10, "S11 MME GTP-C interface"},
2642     {11, "S11/S4 SGW GTP-C interface"},
2643     {12, "S10 MME GTP-C interface"},
2644     {13, "S3 MME GTP-C interface"},
2645     {14, "S3 SGSN GTP-C interface"},
2646     {15, "S4 SGSN GTP-U interface"},
2647     {16, "S4 SGW GTP-U interface"},
2648     {17, "S4 SGSN GTP-C interface"},
2649     {18, "S16 SGSN GTP-C interface"},
2650     {19, "eNodeB GTP-U interface for DL data forwarding"},
2651     {20, "eNodeB GTP-U interface for UL data forwarding"},
2652     {21, "RNC GTP-U interface for data forwarding"},
2653     {22, "SGSN GTP-U interface for data forwarding"},
2654     {23, "SGW GTP-U interface for data forwarding"},
2655     {24, "Sm MBMS GW GTP-C interface"},
2656     {25, "Sn MBMS GW GTP-C interface"},
2657     {26, "Sm MME GTP-C interface"},
2658     {27, "Sn SGSN GTP-C interface"},
2659     {28, "SGW GTP-U interface for UL data forwarding"},
2660     {29, "Sn SGSN GTP-U interface"},
2661     {30, "S2b ePDG GTP-C interface"},
2662     {31, "S2b-U ePDG GTP-U interface"},
2663     {32, "S2b PGW GTP-C interface"},
2664     {33, "S2b-U PGW GTP-U interface"},
2665     {34, "S2a TWAN GTP-U interface"},
2666     {35, "S2a TWAN GTP-C interface"},
2667     {36, "S2a PGW GTP-C interface"},
2668     {37, "S2a PGW GTP-U interface"},
2669     {38, "S11 MME GTP-U interface"},
2670     {39, "S11 SGW GTP-U interface"},
2671     {0, NULL}
2672 };
2673 static value_string_ext gtpv2_f_teid_interface_type_vals_ext = VALUE_STRING_EXT_INIT(gtpv2_f_teid_interface_type_vals);
2674
2675 static const true_false_string gtpv2_f_teid_v4_vals = {
2676     "IPv4 address present",
2677     "IPv4 address not present",
2678 };
2679
2680 static const true_false_string gtpv2_f_teid_v6_vals = {
2681     "IPv6 address present",
2682     "IPv6 address not present",
2683 };
2684
2685 static void
2686 dissect_gtpv2_f_teid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t *args)
2687 {
2688     int    offset = 0;
2689     guint8 flags;
2690     address *ipv4 = NULL, *ipv6 = NULL;
2691     guint32 teid_cp, *teid, *session;
2692
2693     flags = tvb_get_guint8(tvb, offset);
2694     proto_tree_add_item(tree, hf_gtpv2_f_teid_v4, tvb, offset, 1, ENC_BIG_ENDIAN);
2695     proto_tree_add_item(tree, hf_gtpv2_f_teid_v6, tvb, offset, 1, ENC_BIG_ENDIAN);
2696     /* NOTE:  "Interface type" IE is defined with 5 bits only in the earlier releases of this specification,
2697      * thus pre-Rel-10 GTPv2-C nodes can ignore bit "6" which is marked as "Spare" in earlier releases,
2698      * allowing backward compatibility.
2699      */
2700     proto_tree_add_item(tree, hf_gtpv2_f_teid_interface_type, tvb, offset, 1, ENC_BIG_ENDIAN);
2701
2702     offset += 1;
2703     proto_tree_add_item_ret_uint(tree, hf_gtpv2_f_teid_gre_key, tvb, offset, 4, ENC_BIG_ENDIAN, &teid_cp);
2704     proto_item_append_text(item, "%s, TEID/GRE Key: 0x%s",
2705                            val_to_str_ext_const((flags & 0x3f), &gtpv2_f_teid_interface_type_vals_ext, "Unknown"),
2706                            tvb_bytes_to_str(wmem_packet_scope(), tvb, offset, 4));
2707
2708     offset += 4;
2709     if (flags & 0x80)
2710     {
2711         ipv4 = wmem_new0(wmem_packet_scope(), address);
2712         proto_tree_add_item(tree, hf_gtpv2_f_teid_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
2713         proto_item_append_text(item, ", IPv4 %s", tvb_ip_to_str(tvb, offset));
2714         set_address_tvb(ipv4, AT_IPv4, 4, tvb, offset);
2715         offset += 4;
2716     }
2717     if (flags & 0x40)
2718     {
2719         ipv6 = wmem_new0(wmem_packet_scope(), address);
2720         proto_tree_add_item(tree, hf_gtpv2_f_teid_ipv6, tvb, offset, 16, ENC_NA);
2721         proto_item_append_text(item, ", IPv6 %s", tvb_ip6_to_str(tvb, offset));
2722         set_address_tvb(ipv6, AT_IPv6, 16, tvb, offset);
2723     }
2724
2725     if (g_gtp_session) {
2726         session = (guint32 *)g_hash_table_lookup(session_table, &pinfo->num);
2727         if (!session) {
2728             /* We save the teid so that we could assignate its corresponding session ID later */
2729             args->last_teid = teid_cp;
2730             if (!teid_exists(teid_cp, args->teid_list)) {
2731                 teid = wmem_new(wmem_packet_scope(), guint32);
2732                 *teid = teid_cp;
2733                 wmem_list_prepend(args->teid_list, teid);
2734             }
2735             if (ipv4 != NULL && !ip_exists(*ipv4, args->ip_list)) {
2736                 copy_address(&args->last_ip, ipv4);
2737                 wmem_list_prepend(args->ip_list, ipv4);
2738             }
2739             if (ipv6 != NULL && !ip_exists(*ipv6, args->ip_list)) {
2740                 copy_address(&args->last_ip, ipv6);
2741                 wmem_list_prepend(args->ip_list, ipv6);
2742             }
2743         }
2744     }
2745 }
2746 /*
2747  * 8.23 TMSI
2748  */
2749 static void
2750 dissect_gtpv2_tmsi(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2751 {
2752     proto_tree_add_item(tree, hf_gtpv2_tmsi, tvb, 0, 4, ENC_BIG_ENDIAN);
2753     proto_tree_add_item(item, hf_gtpv2_tmsi_bytes, tvb, 0, length, ENC_NA);
2754 }
2755 /*
2756  * 8.24 Global CN-Id
2757  * (TS 23.003)
2758  * 12.3 CN Identifier
2759  *
2760  * A CN node is uniquely identified within a PLMN by its CN Identifier (CN-Id). The CN-Id together with the PLMN
2761  * identifier globally identifies the CN node. The CN-Id together with the PLMN-Id is used as the CN node identifier in
2762  * RANAP signalling over the Iu interface.
2763  * Global CN-Id = PLMN-Id || CN-Id
2764  * The CN-Id is defined by the operator, and set in the nodes via O&M.
2765  * For the syntax description and the use of this identifier in RANAP signalling, see 3GPP TS 25.413 [17].
2766  */
2767
2768 static void
2769 dissect_gtpv2_g_cn_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2770 {
2771     int offset = 0;
2772
2773     dissect_e212_mcc_mnc(tvb, pinfo, tree, 0, E212_NONE, TRUE);
2774     offset += 3;
2775
2776     /* >CN-ID M INTEGER (0..4095) */
2777     proto_tree_add_item(tree, hf_gtpv2_cn_id, tvb, offset, 2, ENC_NA);
2778 }
2779 /*
2780  * 8.25 S103 PDN Data Forwarding Info (S103PDF)
2781  */
2782 static void
2783 dissect_gtpv2_s103pdf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2784 {
2785     int         offset = 0;
2786     guint8      m, k, i;
2787
2788     /* The HSGW Address and GRE Key identify a GRE Tunnel towards a HSGW over S103 interface for a specific PDN
2789      * connection of the UE. The EPS Bearer IDs specify the EPS Bearers which require data forwarding that belonging to this
2790      * PDN connection. The number of EPS bearer Ids included is specified by the value of EPS Bearer ID Number.
2791      */
2792     /* Octet 5 HSGW Address for forwarding Length = m */
2793     m = tvb_get_guint8(tvb, offset);
2794     proto_tree_add_item(tree, hf_gtpv2_hsgw_addr_f_len, tvb, offset, 1, ENC_BIG_ENDIAN);
2795     offset += 1;
2796
2797     /* 6 to (m+5) HSGW Address for forwarding [4..16] */
2798     switch (m) {
2799     case 4:
2800         /* IPv4 */
2801         proto_tree_add_item(tree, hf_gtpv2_hsgw_addr_ipv4, tvb, offset, 1, ENC_BIG_ENDIAN);
2802         offset += 4;
2803         break;
2804     case 16:
2805         /* IPv6 */
2806         proto_tree_add_item(tree, hf_gtpv2_hsgw_addr_ipv6, tvb, offset, 1, ENC_NA);
2807         offset += 16;
2808         break;
2809     default:
2810         /* Error */
2811         proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_len_invalid, tvb, 0, length,
2812                                      "Wrong length %u, should be 4 or 16", m);
2813         return;
2814     }
2815
2816     /* (m+6)- to (m+9) GRE Key */
2817     proto_tree_add_item(tree, hf_gtpv2_gre_key, tvb, offset, 4, ENC_BIG_ENDIAN);
2818     offset += 4;
2819
2820     /* (m+10) EPS Bearer ID Number = k */
2821     k = tvb_get_guint8(tvb, offset);
2822     proto_tree_add_item(tree, hf_gtpv2_eps_bearer_id_number, tvb, offset, 1, ENC_BIG_ENDIAN);
2823     offset += 1;
2824
2825     /* (m+11) to (m+10+k)
2826      * Spare EPS Bearer ID
2827      */
2828     for ( i = 0; i < k; i++ ) {
2829         proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
2830         proto_tree_add_item(tree, hf_gtpv2_ebi, tvb, offset, 1, ENC_BIG_ENDIAN);
2831         offset += 1;
2832     }
2833
2834 }
2835 /*
2836  * 8.26 S1-U Data Forwarding (S1UDF)
2837  */
2838 static void
2839 dissect_gtpv2_s1udf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2840 {
2841     int         offset = 0;
2842     guint8      m;
2843
2844     /* 5 Spare EPS Bearer ID */
2845     proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, offset << 3, 4, ENC_BIG_ENDIAN);
2846     proto_tree_add_item(tree, hf_gtpv2_ebi, tvb, offset, 1, ENC_BIG_ENDIAN);
2847     offset += 1;
2848     /* 6 Serving GW Address Length = m */
2849     m = tvb_get_guint8(tvb, offset);
2850     proto_tree_add_item(tree, hf_gtpv2_serving_gw_address_length, tvb, offset, 1, ENC_BIG_ENDIAN);
2851     offset += 1;
2852     /* 7 to (m+6) Serving GW Address [4..16] */
2853     switch (m) {
2854     case 4:
2855         /* IPv4 */
2856         proto_tree_add_item(tree, hf_gtpv2_sgw_addr_ipv4, tvb, offset, 1, ENC_BIG_ENDIAN);
2857         offset += 4;
2858         break;
2859     case 16:
2860         /* IPv6 */
2861         proto_tree_add_item(tree, hf_gtpv2_sgw_addr_ipv6, tvb, offset, 1, ENC_NA);
2862         offset += 16;
2863         break;
2864     default:
2865         /* Error */
2866         proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_len_invalid, tvb, 0, length,
2867                                      "Wrong length %u, should be 4 or 16", m);
2868         return;
2869     }
2870
2871     /* (m+7) to (m+10)
2872      * Serving GW S1-U TEID
2873      */
2874     proto_tree_add_item(tree, hf_gtpv2_sgw_s1u_teid, tvb, offset, 4, ENC_BIG_ENDIAN);
2875
2876 }
2877 /*
2878  * 8.27 Delay Value
2879  */
2880
2881 static void
2882 dissect_gtpv2_delay_value(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2883 {
2884     int offset = 0;
2885
2886     proto_tree_add_item(tree, hf_gtpv2_delay_value, tvb, offset, 1, ENC_BIG_ENDIAN);
2887 }
2888
2889 /*
2890  * 8.28 Bearer Context (grouped IE)
2891  */
2892
2893 static void
2894 dissect_gtpv2_bearer_ctx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, proto_item *item, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2895 {
2896     int         offset = 0;
2897     tvbuff_t   *new_tvb;
2898     proto_tree *grouped_tree;
2899
2900     proto_item_append_text(item, "[Grouped IE]");
2901     grouped_tree = proto_item_add_subtree(item, ett_gtpv2_bearer_ctx);
2902
2903     new_tvb = tvb_new_subset_length(tvb, offset, length);
2904     dissect_gtpv2_ie_common(new_tvb, pinfo, grouped_tree, 0, message_type, args);
2905 }
2906
2907 /* 8.29 Charging ID */
2908 static void
2909 dissect_gtpv2_charging_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2910 {
2911     int offset = 0;
2912
2913     proto_tree_add_item(tree, hf_gtpv2_charging_id, tvb, offset, length, ENC_BIG_ENDIAN);
2914 }
2915
2916
2917  /* 8.30 Charging Characteristics
2918   * The charging characteristics information element is defined in 3GPP TS 32.251 [8]
2919   * and is a way of informing both the SGW and PGW of the rules for producing charging
2920   * information based on operator configured triggers. For the encoding of this
2921   * information element see 3GPP TS 32.298 [9].
2922   */
2923 static void
2924 dissect_gtpv2_char_char(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2925 {
2926     int offset = 0;
2927
2928     proto_tree_add_item(tree, hf_gtpv2_charging_characteristic, tvb, offset, 2, ENC_BIG_ENDIAN);
2929     if (length > 2) {
2930         offset += 2;
2931         /* These octet(s) is/are present only if explicitly specified */
2932         proto_tree_add_item(tree, hf_gtpv2_charging_characteristic_remaining_octets, tvb, offset, length-2, ENC_NA);
2933     }
2934
2935 }
2936
2937 /*
2938  * 8.30 Bearer Flag
2939  */
2940 static void
2941 dissect_gtpv2_bearer_flag(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2942 {
2943
2944     int offset = 0;
2945
2946     /* Octet 5 Spare VB PPC */
2947     proto_tree_add_item(tree, hf_gtpv2_bearer_flag_ppc, tvb, offset, length, ENC_BIG_ENDIAN);
2948     proto_tree_add_item(tree, hf_gtpv2_bearer_flag_vb, tvb, offset, length, ENC_BIG_ENDIAN);
2949
2950 }
2951 /*
2952  * 8.34 PDN Type
2953  */
2954 static void
2955 dissect_gtpv2_pdn_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
2956 {
2957
2958     int offset = 0;
2959     guint8 pdn;
2960
2961     if (length != 1) {
2962         proto_tree_add_expert_format(tree, pinfo, &ei_gtpv2_ie_len_invalid, tvb, 0, length,
2963                                      "Wrong length indicated. Expected 1, got %u", length);
2964         return;
2965     }
2966
2967     proto_tree_add_bits_item(tree, hf_gtpv2_spare_bits, tvb, offset << 3, 5, ENC_BIG_ENDIAN);
2968     pdn = tvb_get_guint8(tvb, offset)& 0x7;
2969     proto_tree_add_item(tree, hf_gtpv2_pdn_type, tvb, offset, length, ENC_BIG_ENDIAN);
2970     proto_item_append_text(item, "%s", val_to_str_const(pdn, gtpv2_pdn_type_vals, "Unknown"));
2971
2972 }
2973
2974 /*
2975  * 8.31 Trace Information
2976  */
2977 static void
2978 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_, session_args_t * args _U_)
2979 {
2980     proto_tree  *trigg_tree, *msc_server_tree, *mgw_tree, *sgsn_tree, *ggsn_tree;
2981     proto_tree  *bm_sc_tree, *sgw_mme_tree, *sgw_tree, *pgw_tree, *ne_types_tree;
2982     proto_tree  *interfaces_tree, *imsc_server_tree, *lmgw_tree, *lsgsn_tree, *lggsn_tree, *lrnc_tree;
2983     proto_tree  *lbm_sc_tree, *lmme_tree, *lsgw_tree, *lpdn_gw_tree, *lenb_tree;
2984
2985     int         offset = 0;
2986 #if 0
2987     guint8      *trace_id = NULL;
2988 #endif
2989     guint16     tid;
2990     guint32     bit_offset;
2991
2992     dissect_e212_mcc_mnc(tvb, pinfo, tree, 0, E212_NONE, TRUE);
2993     offset += 3;
2994
2995     /* Append Trace ID to main tree */
2996     tid = tvb_get_ntohs(tvb, offset);
2997     proto_item_append_text(item, "Trace ID: %d  ", tid);
2998
2999     /* Trace ID */
3000     /*--------------------------------------------------
3001      * trace_id = tvb_format_text(tvb, offset, 2);
3002      * proto_tree_add_string(tree, hf_gtpv2_tra_info, tvb, offset, length, trace_id);
3003      *--------------------------------------------------*/
3004     proto_tree_add_item(tree, hf_gtpv2_trace_id, tvb, offset, 3, ENC_BIG_ENDIAN);
3005     offset += 3;
3006
3007     /* Triggering Events, put all into a new tree called triggering_tree */
3008     trigg_tree = proto_tree_add_subtree(tree, tvb, offset, 9, ett_gtpv2_tra_info_trigg, NULL, "Triggering Events");
3009
3010     /* Create all subtrees */
3011     msc_server_tree = proto_tree_add_subtree(trigg_tree, tvb, offset, 2, ett_gtpv2_tra_info_trigg_msc_server, NULL, "MSC Server");
3012
3013     mgw_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 2, 1, ett_gtpv2_tra_info_trigg_mgw, NULL, "MGW");
3014
3015     sgsn_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 3, 2, ett_gtpv2_tra_info_trigg_sgsn, NULL, "SGSN");
3016
3017     ggsn_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 5, 1, ett_gtpv2_tra_info_trigg_ggsn, NULL, "GGSN");
3018
3019     bm_sc_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 6, 1, ett_gtpv2_tra_info_trigg_bm_sc, NULL, "BM-SC");
3020
3021     sgw_mme_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 7, 1, ett_gtpv2_tra_info_trigg_sgw_mme, NULL, "SGW MME");
3022
3023     sgw_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 8, 1, ett_gtpv2_tra_info_trigg_sgw, NULL, "SGW");
3024
3025     pgw_tree = proto_tree_add_subtree(trigg_tree, tvb, offset + 8, 1, ett_gtpv2_tra_info_trigg_pgw, NULL, "PGW");
3026
3027     /* MSC Server - 2 octets */
3028     proto_tree_add_item(msc_server_tree, hf_gtpv2_tra_info_msc_momt_calls,  tvb, offset, 1, ENC_BIG_ENDIAN);
3029     proto_tree_add_item(msc_server_tree, hf_gtpv2_tra_info_msc_momt_sms,    tvb, offset, 1, ENC_BIG_ENDIAN);
3030     proto_tree_add_item(msc_server_tree, hf_gtpv2_tra_info_msc_lu_imsi_ad,  tvb, offset, 1, ENC_BIG_ENDIAN);
3031     proto_tree_add_item(msc_server_tree, hf_gtpv2_tra_info_msc_handovers,   tvb, offset, 1, ENC_BIG_ENDIAN);
3032     proto_tree_add_item(msc_server_tree, hf_gtpv2_tra_info_msc_ss,          tvb, offset, 1, ENC_BIG_ENDIAN);
3033     bit_offset = offset << 3;
3034     proto_tree_add_bits_item(msc_server_tree, hf_gtpv2_spare_bits,          tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3035     offset += 1;
3036     bit_offset = offset << 3;
3037     proto_tree_add_bits_item(msc_server_tree, hf_gtpv2_spare_bits,          tvb, bit_offset, 8, ENC_BIG_ENDIAN);
3038     offset += 1;
3039
3040     /* MGW - 1 octet */
3041     proto_tree_add_item(mgw_tree, hf_gtpv2_tra_info_mgw_context,            tvb, offset, 1, ENC_BIG_ENDIAN);
3042     bit_offset = offset << 3;
3043     proto_tree_add_bits_item(mgw_tree, hf_gtpv2_spare_bits,                 tvb, bit_offset, 7, ENC_BIG_ENDIAN);
3044     offset += 1;
3045     /* SGSN - 2 octets */
3046     proto_tree_add_item(sgsn_tree, hf_gtpv2_tra_info_sgsn_pdp_context,      tvb, offset, 1, ENC_BIG_ENDIAN);
3047     proto_tree_add_item(sgsn_tree, hf_gtpv2_tra_info_sgsn_momt_sms,         tvb, offset, 1, ENC_BIG_ENDIAN);
3048     proto_tree_add_item(sgsn_tree, hf_gtpv2_tra_info_sgsn_rau_gprs_ad,      tvb, offset, 1, ENC_BIG_ENDIAN);
3049     proto_tree_add_item(sgsn_tree, hf_gtpv2_tra_info_sgsn_mbms,             tvb, offset, 1, ENC_BIG_ENDIAN);
3050     bit_offset = offset << 3;
3051     proto_tree_add_bits_item(sgsn_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3052     offset += 1;
3053     proto_tree_add_item(sgsn_tree, hf_gtpv2_tra_info_sgsn_reserved,         tvb, offset, 1, ENC_BIG_ENDIAN);
3054     offset += 1;
3055     /* GGSN - 1 octet */
3056     proto_tree_add_item(ggsn_tree, hf_gtpv2_tra_info_ggsn_pdp,              tvb, offset, 1, ENC_BIG_ENDIAN);
3057     proto_tree_add_item(ggsn_tree, hf_gtpv2_tra_info_ggsn_mbms,             tvb, offset, 1, ENC_BIG_ENDIAN);
3058     bit_offset = offset << 3;
3059     proto_tree_add_bits_item(ggsn_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3060     offset += 1;
3061     /* BM-SC - 1 octet */
3062     proto_tree_add_item(bm_sc_tree, hf_gtpv2_tra_info_bm_sc,                tvb, offset, 1, ENC_BIG_ENDIAN);
3063     bit_offset = offset << 3;
3064     proto_tree_add_bits_item(bm_sc_tree, hf_gtpv2_spare_bits,               tvb, bit_offset, 7, ENC_BIG_ENDIAN);
3065     offset += 1;
3066     /* MME/SGW - 1 octet */
3067     proto_tree_add_item(sgw_mme_tree, hf_gtpv2_tra_info_mme_sgw_ss,                 tvb, offset, 1, ENC_BIG_ENDIAN);
3068     proto_tree_add_item(sgw_mme_tree, hf_gtpv2_tra_info_mme_sgw_sr,                 tvb, offset, 1, ENC_BIG_ENDIAN);
3069     proto_tree_add_item(sgw_mme_tree, hf_gtpv2_tra_info_mme_sgw_iataud,             tvb, offset, 1, ENC_BIG_ENDIAN);
3070     proto_tree_add_item(sgw_mme_tree, hf_gtpv2_tra_info_mme_sgw_ue_init_pdn_disc,   tvb, offset, 1, ENC_BIG_ENDIAN);
3071     proto_tree_add_item(sgw_mme_tree, hf_gtpv2_tra_info_mme_sgw_bearer_act_mod_del, tvb, offset, 1, ENC_BIG_ENDIAN);
3072     proto_tree_add_item(sgw_mme_tree, hf_gtpv2_tra_info_mme_sgw_ho,                 tvb, offset, 1, ENC_BIG_ENDIAN);
3073     bit_offset = offset << 3;
3074     proto_tree_add_bits_item(sgw_mme_tree, hf_gtpv2_spare_bits,                     tvb, bit_offset, 2, ENC_BIG_ENDIAN);
3075     offset += 1;
3076     /* PGW/SGW - 1 octet */
3077     proto_tree_add_item(sgw_tree, hf_gtpv2_tra_info_sgw_pdn_con_creat,      tvb, offset, 1, ENC_BIG_ENDIAN);
3078     proto_tree_add_item(sgw_tree, hf_gtpv2_tra_info_sgw_pdn_con_term,       tvb, offset, 1, ENC_BIG_ENDIAN);
3079     proto_tree_add_item(sgw_tree, hf_gtpv2_tra_info_sgw_bearer_act_mod_del, tvb, offset, 1, ENC_BIG_ENDIAN);
3080     bit_offset = (offset << 3) + 4;
3081     proto_tree_add_bits_item(sgw_tree, hf_gtpv2_spare_bits,                 tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3082     proto_tree_add_item(pgw_tree, hf_gtpv2_tra_info_pgw_pdn_con_creat,      tvb, offset, 1, ENC_BIG_ENDIAN);
3083     proto_tree_add_item(pgw_tree, hf_gtpv2_tra_info_pgw_pdn_con_term,       tvb, offset, 1, ENC_BIG_ENDIAN);
3084     proto_tree_add_item(pgw_tree, hf_gtpv2_tra_info_pgw_bearer_act_mod_del, tvb, offset, 1, ENC_BIG_ENDIAN);
3085     bit_offset = offset << 3;
3086     proto_tree_add_bits_item(pgw_tree, hf_gtpv2_spare_bits,                 tvb, bit_offset, 1, ENC_BIG_ENDIAN);
3087     offset += 1;
3088
3089     /* Create NE Types subtree */
3090     ne_types_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_gtpv2_tra_info_ne_types, NULL, "List of NE Types");
3091
3092
3093     /* List of NE Types */
3094     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_msc_s,     tvb, offset, 1, ENC_BIG_ENDIAN);
3095     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_mgw,       tvb, offset, 1, ENC_BIG_ENDIAN);
3096     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_sgsn,      tvb, offset, 1, ENC_BIG_ENDIAN);
3097     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_ggsn,      tvb, offset, 1, ENC_BIG_ENDIAN);
3098     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_rnc,       tvb, offset, 1, ENC_BIG_ENDIAN);
3099     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_bm_sc,     tvb, offset, 1, ENC_BIG_ENDIAN);
3100     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_mme,       tvb, offset, 1, ENC_BIG_ENDIAN);
3101     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_sgw,       tvb, offset, 1, ENC_BIG_ENDIAN);
3102     offset += 1;
3103     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_pdn_gw,    tvb, offset, 1, ENC_BIG_ENDIAN);
3104     proto_tree_add_item(ne_types_tree, hf_gtpv2_tra_info_lne_enb,       tvb, offset, 1, ENC_BIG_ENDIAN);
3105     bit_offset = offset << 3;
3106     proto_tree_add_bits_item(ne_types_tree, hf_gtpv2_spare_bits,        tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3107     offset += 1;
3108
3109     /* Trace Depth Length */
3110     proto_tree_add_item(tree, hf_gtpv2_tra_info_tdl,                    tvb, offset, 1, ENC_BIG_ENDIAN);
3111     offset += 1;
3112
3113     /* Set up subtree interfaces and put all interfaces under it */
3114     interfaces_tree = proto_tree_add_subtree(tree, tvb, offset, 12, ett_gtpv2_tra_info_interfaces, NULL, "List of Interfaces");
3115
3116     /* Create all subtrees */
3117     imsc_server_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset, 2, ett_gtpv2_tra_info_interfaces_imsc_server, NULL, "MSC Server");
3118
3119     lmgw_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 2, 1, ett_gtpv2_tra_info_interfaces_lmgw, NULL, "MGW");
3120
3121     lsgsn_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 3, 2, ett_gtpv2_tra_info_interfaces_lsgsn, NULL, "SGSN");
3122
3123     lggsn_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 5, 1, ett_gtpv2_tra_info_interfaces_lggsn, NULL, "GGSN");
3124
3125     lrnc_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 6, 1, ett_gtpv2_tra_info_interfaces_lrnc, NULL, "RNC");
3126
3127     lbm_sc_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 7, 1, ett_gtpv2_tra_info_interfaces_lbm_sc, NULL, "BM-SC");
3128
3129     lmme_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 8, 1, ett_gtpv2_tra_info_interfaces_lmme, NULL, "MME");
3130
3131     lsgw_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 9, 1,ett_gtpv2_tra_info_interfaces_lsgw, NULL, "SGW");
3132
3133     lpdn_gw_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 10, 1, ett_gtpv2_tra_info_interfaces_lpdn_gw, NULL, "PDN GW");
3134
3135     lenb_tree = proto_tree_add_subtree(interfaces_tree, tvb, offset + 11, 1, ett_gtpv2_tra_info_interfaces_lpdn_lenb, NULL, "eNB");
3136
3137     /* MSC Server - 2 octets */
3138     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_a,         tvb, offset, 1, ENC_BIG_ENDIAN);
3139     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_lu,        tvb, offset, 1, ENC_BIG_ENDIAN);
3140     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_mc,        tvb, offset, 1, ENC_BIG_ENDIAN);
3141     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_map_g,     tvb, offset, 1, ENC_BIG_ENDIAN);
3142     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_map_b,     tvb, offset, 1, ENC_BIG_ENDIAN);
3143     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_map_e,     tvb, offset, 1, ENC_BIG_ENDIAN);
3144     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_map_f,     tvb, offset, 1, ENC_BIG_ENDIAN);
3145     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_cap,       tvb, offset, 1, ENC_BIG_ENDIAN);
3146     offset += 1;
3147     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_map_d,     tvb, offset, 1, ENC_BIG_ENDIAN);
3148     proto_tree_add_item(imsc_server_tree, hf_gtpv2_tra_info_lmsc_map_c,     tvb, offset, 1, ENC_BIG_ENDIAN);
3149     bit_offset = offset << 3;
3150     proto_tree_add_bits_item(imsc_server_tree, hf_gtpv2_spare_bits,         tvb, bit_offset, 6, ENC_BIG_ENDIAN);
3151     offset += 1;
3152     /* MGW - 1 octet */
3153     proto_tree_add_item(lmgw_tree, hf_gtpv2_tra_info_lmgw_mc,               tvb, offset, 1, ENC_BIG_ENDIAN);
3154     proto_tree_add_item(lmgw_tree, hf_gtpv2_tra_info_lmgw_nb_up,            tvb, offset, 1, ENC_BIG_ENDIAN);
3155     proto_tree_add_item(lmgw_tree, hf_gtpv2_tra_info_lmgw_lu_up,            tvb, offset, 1, ENC_BIG_ENDIAN);
3156     bit_offset = offset << 3;
3157     proto_tree_add_bits_item(lmgw_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3158     offset += 1;
3159     /* SGSN - 2 octets */
3160     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_gb,             tvb, offset, 1, ENC_BIG_ENDIAN);
3161     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_lu,             tvb, offset, 1, ENC_BIG_ENDIAN);
3162     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_gn,             tvb, offset, 1, ENC_BIG_ENDIAN);
3163     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_map_gr,         tvb, offset, 1, ENC_BIG_ENDIAN);
3164     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_map_gd,         tvb, offset, 1, ENC_BIG_ENDIAN);
3165     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_map_gf,         tvb, offset, 1, ENC_BIG_ENDIAN);
3166     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_gs,             tvb, offset, 1, ENC_BIG_ENDIAN);
3167     proto_tree_add_item(lsgsn_tree, hf_gtpv2_tra_info_lsgsn_ge,             tvb, offset, 1, ENC_BIG_ENDIAN);
3168     offset += 1;
3169     bit_offset = offset << 3;
3170     proto_tree_add_bits_item(lsgsn_tree, hf_gtpv2_spare_bits,               tvb, bit_offset, 8, ENC_BIG_ENDIAN);
3171     offset += 1;
3172
3173     /* GGSN - 1 octet */
3174     proto_tree_add_item(lggsn_tree, hf_gtpv2_tra_info_lggsn_gn,             tvb, offset, 1, ENC_BIG_ENDIAN);
3175     proto_tree_add_item(lggsn_tree, hf_gtpv2_tra_info_lggsn_gi,             tvb, offset, 1, ENC_BIG_ENDIAN);
3176     proto_tree_add_item(lggsn_tree, hf_gtpv2_tra_info_lggsn_gmb,            tvb, offset, 1, ENC_BIG_ENDIAN);
3177     bit_offset = offset << 3;
3178     proto_tree_add_bits_item(lggsn_tree, hf_gtpv2_spare_bits,               tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3179     offset += 1;
3180     /* RNC - 1 octet */
3181     proto_tree_add_item(lrnc_tree, hf_gtpv2_tra_info_lrnc_lu,               tvb, offset, 1, ENC_BIG_ENDIAN);
3182     proto_tree_add_item(lrnc_tree, hf_gtpv2_tra_info_lrnc_lur,              tvb, offset, 1, ENC_BIG_ENDIAN);
3183     proto_tree_add_item(lrnc_tree, hf_gtpv2_tra_info_lrnc_lub,              tvb, offset, 1, ENC_BIG_ENDIAN);
3184     proto_tree_add_item(lrnc_tree, hf_gtpv2_tra_info_lrnc_uu,               tvb, offset, 1, ENC_BIG_ENDIAN);
3185     bit_offset = offset << 3;
3186     proto_tree_add_bits_item(lrnc_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3187     offset += 1;
3188     /* BM_SC - 1 octet */
3189     proto_tree_add_item(lbm_sc_tree, hf_gtpv2_tra_info_lbm_sc_gmb,          tvb, offset, 1, ENC_BIG_ENDIAN);
3190     bit_offset = offset << 3;
3191     proto_tree_add_bits_item(lbm_sc_tree, hf_gtpv2_spare_bits,              tvb, bit_offset, 7, ENC_BIG_ENDIAN);
3192     offset += 1;
3193     /* MME - 1 octet */
3194     proto_tree_add_item(lmme_tree, hf_gtpv2_tra_info_lmme_s1_mme,           tvb, offset, 1, ENC_BIG_ENDIAN);
3195     proto_tree_add_item(lmme_tree, hf_gtpv2_tra_info_lmme_s3,               tvb, offset, 1, ENC_BIG_ENDIAN);
3196     proto_tree_add_item(lmme_tree, hf_gtpv2_tra_info_lmme_s6a,              tvb, offset, 1, ENC_BIG_ENDIAN);
3197     proto_tree_add_item(lmme_tree, hf_gtpv2_tra_info_lmme_s10,              tvb, offset, 1, ENC_BIG_ENDIAN);
3198     proto_tree_add_item(lmme_tree, hf_gtpv2_tra_info_lmme_s11,              tvb, offset, 1, ENC_BIG_ENDIAN);
3199     bit_offset = offset << 3;
3200     proto_tree_add_bits_item(lmme_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 3, ENC_BIG_ENDIAN);
3201     offset += 1;
3202     /* SGW - 1 octet */
3203     proto_tree_add_item(lsgw_tree, hf_gtpv2_tra_info_lsgw_s4,               tvb, offset, 1, ENC_BIG_ENDIAN);
3204     proto_tree_add_item(lsgw_tree, hf_gtpv2_tra_info_lsgw_s5,               tvb, offset, 1, ENC_BIG_ENDIAN);
3205     proto_tree_add_item(lsgw_tree, hf_gtpv2_tra_info_lsgw_s8b,              tvb, offset, 1, ENC_BIG_ENDIAN);
3206     proto_tree_add_item(lsgw_tree, hf_gtpv2_tra_info_lsgw_s11,              tvb, offset, 1, ENC_BIG_ENDIAN);
3207     bit_offset = offset << 3;
3208     proto_tree_add_bits_item(lsgw_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 4, ENC_BIG_ENDIAN);
3209     offset += 1;
3210     /* PDN GW - 1 octet */
3211     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_s2a,        tvb, offset, 1, ENC_BIG_ENDIAN);
3212     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_s2b,        tvb, offset, 1, ENC_BIG_ENDIAN);
3213     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_s2c,        tvb, offset, 1, ENC_BIG_ENDIAN);
3214     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_s5,         tvb, offset, 1, ENC_BIG_ENDIAN);
3215     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_s6c,        tvb, offset, 1, ENC_BIG_ENDIAN);
3216     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_gx,         tvb, offset, 1, ENC_BIG_ENDIAN);
3217     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_s8b,        tvb, offset, 1, ENC_BIG_ENDIAN);
3218     proto_tree_add_item(lpdn_gw_tree, hf_gtpv2_tra_info_lpdn_gw_sgi,        tvb, offset, 1, ENC_BIG_ENDIAN);
3219     offset += 1;
3220     /* eNB - 1 octet */
3221     proto_tree_add_item(lenb_tree, hf_gtpv2_tra_info_lenb_s1_mme,           tvb, offset, 1, ENC_BIG_ENDIAN);
3222     proto_tree_add_item(lenb_tree, hf_gtpv2_tra_info_lenb_x2,               tvb, offset, 1, ENC_BIG_ENDIAN);
3223     proto_tree_add_item(lenb_tree, hf_gtpv2_tra_info_lenb_uu,               tvb, offset, 1, ENC_BIG_ENDIAN);
3224     bit_offset = offset << 3;
3225     proto_tree_add_bits_item(lenb_tree, hf_gtpv2_spare_bits,                tvb, bit_offset, 5, ENC_BIG_ENDIAN);
3226
3227     /*--------------------------------------------------
3228      * offset += 1;
3229      *--------------------------------------------------*/
3230
3231     /* IP Address of Trace Collection Entity */
3232     while ( (offset + 4) <= length ) {
3233         offset += 1;
3234         proto_tree_add_item(tree, hf_gtpv2_ipv4_addr, tvb, offset, 4, ENC_BIG_ENDIAN);
3235         offset += 3;
3236     }
3237 }
3238
3239 /*
3240  * 8.33 Paging Cause
3241  * 8.33 Void (TS 129 274 V9.4.0 (2010-10))
3242  */
3243
3244 /* 8.35 Procedure Transaction ID (PTI) */
3245 static void
3246 dissect_gtpv2_pti(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length _U_, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
3247 {
3248     proto_tree_add_item(tree, hf_gtpv2_pti, tvb, 0, 1, ENC_BIG_ENDIAN);
3249 }
3250 /*
3251  * 8.36 DRX Parameter
3252  */
3253 static void
3254 dissect_gtpv2_drx_param(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
3255 {
3256     int offset = 0;
3257
3258     /* 36.413 : 9.2.1.17   Paging Cause, void */
3259     proto_tree_add_item(tree, hf_gtpv2_drx_parameter, tvb, offset, length, ENC_NA);
3260 }
3261
3262 /*
3263  * 8.37 UE Network Capability
3264  * UE Network Capability is coded as depicted in Figure 8.37-1. Actual coding of the UE Network Capability field is
3265  * defined in 3GPP TS 24.301
3266  */
3267 static void
3268 dissect_gtpv2_ue_net_capability(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_, guint8 instance _U_, session_args_t * args _U_)
3269 {
3270     de_emm_ue_net_cap(tvb, tree, pinfo, 0, length, NULL, 0);
3271
3272 }
3273 /*
3274  * 8.38 MM Context
3275  */
3276 static const value_string gtpv2_mm_context_security_mode[] = {
3277     {0, "GSM Key and Triplets"},
3278     {1, "UMTS Key, Used Cipher and Quintuplets"},
3279     {2, "GSM Key, Used Cipher and Quintuplets"},
3280     {3, "UMTS Key and Quintuplets"},
3281     {4, "EPS Security Context, Quadruplets and Quintuplets" },
3282     {5, "UMTS Key, Quadruplets and Quintuplets"},
3283     {0, NULL                                                                                                    }
3284 };
3285
3286 static const true_false_string gtpv2_nhi_vals = {
3287     "NH (Next Hop) and NCC (Next Hop Chaining Count) are both present",
3288     "NH (Next Hop) and NCC (Next Hop Chaining Count) not present",
3289 };
3290
3291 /* Table 8.38-2: Used NAS Cipher Values */
3292
3293 static const value_string gtpv2_mm_context_unc_vals[] = {
3294     {0, "No ciphering"},
3295     {1, "128-EEA1"},
3296     {2, "128-EEA2"},
3297     {3, "EEA3"},
3298     {4, "EEA4"  },
3299     {5, "EEA5"},
3300     {6, "EEA6"},
3301     {7, "EEA7"},
3302     {0, NULL}
3303 };
3304
3305 /* Table 8.38-3: Used Cipher Values */
3306 static const value_string gtpv2_mm_context_used_cipher_vals[] = {
3307     {0, "No ciphering"},
3308     {1, "GEA/1"},
3309     {2, "GEA/2"},
3310     {3, "GEA/3"},
3311     {4, "GEA/4" },
3312     {5, "GEA/5"},
3313     {6, "GEA/6"},
3314     {7, "GEA/7"},
3315     {0, NULL}
3316 };
3317
3318 /* Table 8.38-4: Used NAS integrity protection algorithm Values */
3319 static const value_string gtpv2_mm_context_unipa_vals[] = {
3320     {0, "No ciphering"},
3321     {1, "128-EEA1"},
3322     {2, "128-EEA2"},
3323     {3, "EEA3"},
3324     {4, "EEA4"  },
3325     {5, "EEA5"},
3326     {6, "EEA6"},
3327     {7, "EEA7"},
3328     {0, NULL}
3329 };
3330
3331 /* Helper functions */
3332
3333 /* Figure 8.38-7: Authentication Triplet */
3334 static int
3335 dissect_gtpv2_authentication_triplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8  num_triplet)
3336 {
3337     proto_tree *auth_tri_tree;
3338     int         i;
3339
3340     for (i = 0; i < num_triplet; i++) {
3341         auth_tri_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0,
3342                 ett_gtpv2_mm_context_auth_tri, NULL, "Authentication Triplet %u", i);
3343         /*
3344         * Figure 8.38-8: Authentication Quintuplet
3345         * 1 to 16 RAND
3346         * 17 to 20 SRES
3347         * 21 to 28 Kc
3348         */
3349         proto_tree_add_item(auth_tri_tree, hf_gtpv2_mm_context_rand, tvb, offset, 16, ENC_NA);
3350         offset += 16;
3351         proto_tree_add_item(auth_tri_tree, hf_gtpv2_mm_context_sres, tvb, offset, 4, ENC_NA);
3352         offset += 4;
3353         proto_tree_add_item(auth_tri_tree, hf_gtpv2_mm_context_kc, tvb, offset, 8, ENC_NA);
3354         offset += 8;
3355
3356     }
3357
3358     return offset;
3359 }
3360
3361 static int
3362 dissect_gtpv2_authentication_quintuplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8  nr_qui)
3363 {
3364     proto_tree *auth_qui_tree;
3365     int         i;
3366     guint8      xres_len, autn_len;
3367
3368     for (i = 0; i < nr_qui; i++) {
3369         auth_qui_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0,
3370             ett_gtpv2_mm_context_auth_qui, NULL, "Authentication Quintuplet %u", i);
3371         /*
3372         * Figure 8.38-8: Authentication Quintuplet
3373         * 1 to 16 RAND
3374         * 17 XRES Length
3375         * 18 to m XRES
3376         * (m+1) to (m+16) CK
3377         * (m+17) to (m+32) IK
3378         * m+33 AUTN Length
3379         * (m+34) to n AUTN
3380         */
3381         proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_rand, tvb, offset, 16, ENC_NA);
3382         offset += 16;
3383         xres_len = tvb_get_guint8(tvb, offset);
3384         proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_xres_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3385         offset += 1;
3386         proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_xres, tvb, offset, xres_len, ENC_NA);
3387         offset += xres_len;
3388         proto_tree_add_item(auth_qui_tree, hf_gtpv2_ck, tvb, offset, 16, ENC_NA);
3389         offset += 16;
3390         proto_tree_add_item(auth_qui_tree, hf_gtpv2_ik, tvb, offset, 16, ENC_NA);
3391         offset += 16;
3392         autn_len = tvb_get_guint8(tvb, offset);
3393         proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_autn_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3394         offset += 1;
3395         proto_tree_add_item(auth_qui_tree, hf_gtpv2_mm_context_autn, tvb, offset, autn_len, ENC_NA);
3396         offset += autn_len;
3397     }
3398
3399     return offset;
3400
3401 }
3402
3403 static int
3404 dissect_gtpv2_authentication_quadruplets(tvbuff_t *tvb, proto_tree *tree, int offset, guint8  nr_qui)
3405 {
3406     proto_tree *auth_qua_tree;
3407     guint8      tmp;
3408     int         i;
3409
3410     for (i = 0; i < nr_qui; i++) {
3411         auth_qua_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
3412             ett_gtpv2_mm_context_auth_qua, NULL, "Authentication Quadruplet");
3413
3414         proto_tree_add_item(auth_qua_tree, hf_gtpv2_mm_context_rand, tvb, offset, 16, ENC_NA);
3415         offset += 16;
3416
3417         tmp = tvb_get_guint8(tvb, offset++);
3418
3419         proto_tree_add_item(auth_qua_tree, hf_gtpv2_mm_context_xres, tvb, offset, tmp, ENC_NA);
3420         offset += tmp;
3421
3422         tmp = tvb_get_guint8(tvb, offset++);
3423
3424         proto_tree_add_item(auth_qua_tree, hf_gtpv2_mm_context_autn, tvb, offset, tmp, ENC_NA);
3425         offset += tmp;
3426
3427         proto_tree_add_item(tree, hf_gtpv2_mm_context_kasme, tvb, offset, 32, ENC_NA);
3428
3429         offset += 32;
3430     }
3431     return offset;
3432 }
3433
3434 static const value_string gtpv2_mm_context_higher_br_16mb_flg_vals[] = {
3435     {0, "Not allowed"},
3436     {1, "Allowed"},
3437     {0, NULL}
3438 };
3439
3440 static int
3441 dissect_gtpv2_mm_context_common_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, guint8 samb_ri, guint8 uamb_ri)
3442 {
3443     proto_tree *net_cap_tree, *msnt_cap_tree;
3444     guint8      ue_net_cap_len, ms_net_cap_len, mei_len;
3445
3446     /*
3447      * If SAMBRI (Subscribed UE AMBR Indicator), bit 1 of octet 6, is set to "1",
3448      * then the Uplink/downlink Subscribed UE AMBR parameter field is present,
3449      */
3450     if (samb_ri) {
3451         /* j to (j+3) Uplink Subscribed UE AMBR */
3452         proto_tree_add_item(tree, hf_gtpv2_uplink_subscribed_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
3453
3454         offset += 4;
3455         /* (j+4) to (j+7) Downlink Subscribed UE AMBR */
3456         proto_tree_add_item(tree, hf_gtpv2_downlink_subscribed_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
3457
3458         offset += 4;
3459     }
3460     /*
3461      * If UAMBRI (Used UE AMBR Indicator), bit 2 of octet 6, is set to "1",
3462      * then the Uplink/downlink Used UE AMBR parameter field is present
3463      */
3464     if (uamb_ri) {
3465         /* i to (i+3) Uplink Used UE AMBR  */
3466         proto_tree_add_item(tree, hf_gtpv2_uplink_used_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
3467
3468         offset += 4;
3469         /* (i+4) to (i+7) Downlink Used UE AMBR */
3470         proto_tree_add_item(tree, hf_gtpv2_downlink_used_ue_ambr, tvb, offset, 4, ENC_BIG_ENDIAN);
3471
3472         offset += 4;
3473     }
3474     /* q Length of UE Network Capability */
3475     ue_net_cap_len = tvb_get_guint8(tvb, offset);
3476     proto_tree_add_item(tree, hf_gtpv2_mm_context_ue_net_cap_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3477     offset += 1;
3478     /* (q+1) to k UE Network Capability */
3479     if (ue_net_cap_len) {
3480         /* The UE Network Capability coding is specified in clause 9.9.3.34 of 3GPP TS 24.301 [23].
3481          * If Length of UE Network Capability is zero, then the UE Network Capability parameter
3482          * shall not be present.
3483          */
3484         net_cap_tree = proto_tree_add_subtree(tree, tvb, offset, ue_net_cap_len,
3485             ett_gtpv2_mm_context_net_cap, NULL, "UE Network Capability");
3486         offset += de_emm_ue_net_cap(tvb, net_cap_tree, pinfo, offset, ue_net_cap_len, NULL, 0);
3487     }
3488     /* k+1 Length of MS Network Capability */
3489     ms_net_cap_len = tvb_get_guint8(tvb, offset);
3490     proto_tree_add_item(tree, hf_gtpv2_mm_context_ms_net_cap_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3491     offset += 1;
3492     /* (k+2) to m MS Network Capability
3493      * The MS Network Capability coding is specified in clause 10.5.5.12 of 3GPP TS 24.008 [5].
3494      * If Length of MS Network Capability is zero, then the MS Network Capability parameter shall not be present.
3495      */
3496     if (ms_net_cap_len) {
3497         msnt_cap_tree = proto_tree_add_subtree(tree, tvb, offset, ms_net_cap_len,
3498             ett_gtpv2_ms_network_capability, NULL, "MS network capability");
3499         offset += de_gmm_ms_net_cap(tvb, msnt_cap_tree, pinfo, offset, ms_net_cap_len, NULL, 0);
3500     }
3501     /* m+1 Length of Mobile Equipment Identity (MEI) */
3502     mei_len = tvb_get_guint8(tvb, offset);
3503     proto_tree_add_item(tree, hf_gtpv2_mm_context_mei_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3504     offset += 1;
3505     /* (m+2) to r Mobile Equipment Identity (MEI) */
3506     if (mei_len) {
3507         const gchar *mei_str;
3508
3509         mei_str = tvb_bcd_dig_to_wmem_packet_str( tvb, offset, mei_len, NULL, FALSE);
3510         proto_tree_add_string(tree, hf_gtpv2_mei, tvb, offset, mei_len, mei_str);
3511         offset += mei_len;
3512     }
3513     return offset;
3514 }
3515
3516 static int
3517 dissect_gtpv2_access_restriction_data(tvbuff_t *tvb, proto_tree *tree, int offset)
3518 {
3519     proto_tree *accrstdata_tree;
3520
3521     accrstdata_tree = proto_tree_add_subtree(tree, tvb, offset, 1, ett_gtpv2_access_rest_data, NULL, "Access restriction data");
3522     /* Spare HNNA ENA INA GANA GENA UNA */
3523     proto_tree_add_bits_item(accrstdata_tree, hf_gtpv2_spare_bits, tvb, (offset << 3), 1, ENC_BIG_ENDIAN);
3524     proto_tree_add_item(accrstdata_tree, hf_gtpv2_hbna, tvb, offset, 1, ENC_BIG_ENDIAN);
3525     proto_tree_add_item(accrstdata_tree, hf_gtpv2_hnna, tvb, offset, 1, ENC_BIG_ENDIAN);
3526     proto_tree_add_item(accrstdata_tree, hf_gtpv2_ena,  tvb, offset, 1, ENC_BIG_ENDIAN);
3527     proto_tree_add_item(accrstdata_tree, hf_gtpv2_ina,  tvb, offset, 1, ENC_BIG_ENDIAN);
3528     proto_tree_add_item(accrstdata_tree, hf_gtpv2_gana, tvb, offset, 1, ENC_BIG_ENDIAN);
3529     proto_tree_add_item(accrstdata_tree, hf_gtpv2_gena, tvb, offset, 1, ENC_BIG_ENDIAN);
3530     proto_tree_add_item(accrstdata_tree, hf_gtpv2_una,  tvb, offset, 1, ENC_BIG_ENDIAN);
3531     offset += 1;
3532
3533     return offset;
3534 }
3535
3536 /* Type = 103 (decimal)
3537  * Figure 8.38-1: GSM Key and Triplets
3538  */
3539 static void
3540 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_, session_args_t * args _U_)
3541 {
3542     proto_tree *flag_tree;
3543     int         offset;
3544     guint8      oct, drxi, num_triplet, uamb_ri, samb_ri;
3545
3546     offset = 0;
3547     flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags");
3548
3549     /* Octet 5 */
3550     /* Security Mode | Spare | DRXI | CKSN */
3551     drxi = (tvb_get_guint8(tvb, offset) & 0x08) >> 3;
3552     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_sm,   tvb, offset,      1, ENC_BIG_ENDIAN);
3553     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, offset << 3, 1, ENC_BIG_ENDIAN);
3554     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_drxi, tvb, offset,      1, ENC_BIG_ENDIAN);
3555     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_cksn, tvb, offset,      1, ENC_BIG_ENDIAN);
3556     offset += 1;
3557     /* Octet 6 */
3558     /* Number of Triplet | Spare  | UAMB RI | SAMB RI */
3559     oct = tvb_get_guint8(tvb, offset);
3560     num_triplet = oct >> 5;
3561     uamb_ri = (oct & 0x02) >> 1;
3562     samb_ri = oct & 0x01;
3563
3564     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_nr_tri,       tvb, offset,            1, ENC_BIG_ENDIAN);
3565     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits,         tvb, (offset << 3) + 3, 3, ENC_BIG_ENDIAN);
3566     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_uamb_ri,      tvb, offset,            1, ENC_BIG_ENDIAN);
3567     proto_tree_add_bits_item(flag_tree, hf_gtpv2_mm_context_samb_ri, tvb, (offset << 3) + 7, 1, ENC_BIG_ENDIAN);
3568     offset += 1;
3569
3570     /* Octet 7 Spare Used Cipher */
3571     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits,         tvb, ((offset << 3)),   5, ENC_BIG_ENDIAN);
3572     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_used_cipher,  tvb, offset,            1, ENC_BIG_ENDIAN);
3573     offset += 1;
3574
3575     /* 8 to 15 Kc */
3576     proto_tree_add_item(tree, hf_gtpv2_mm_context_kc, tvb, offset, 8, ENC_NA);
3577     offset += 8;
3578
3579     /* 16 to h Authentication Triplet [0..4] */
3580     if (num_triplet) {
3581         dissect_gtpv2_authentication_triplets(tvb, tree, offset, num_triplet);
3582     }
3583
3584     /*
3585      * (h+1) to (h+2) DRX parameter
3586      */
3587     if (drxi) {
3588         proto_tree_add_item(tree, hf_gtpv2_mm_context_drx, tvb, offset, 2, ENC_BIG_ENDIAN);
3589         offset += 2;
3590     }
3591
3592     /* Dissect octet j to r */
3593     offset = dissect_gtpv2_mm_context_common_data(tvb, pinfo, tree, offset, samb_ri, uamb_ri);
3594
3595     proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet");
3596 }
3597
3598 /* Type = 104 (decimal)
3599  * Figure 8.38-2: UMTS Key, Used Cipher and Quintuplets
3600  */
3601 static void
3602 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_, session_args_t * args _U_)
3603 {
3604     proto_tree *flag_tree;
3605     int         offset;
3606     guint8      oct, drxi, nr_qui, uamb_ri, samb_ri, vdp_len, hbr_len;
3607
3608     offset = 0;
3609     flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags");
3610
3611     /* Octet 5 */
3612     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_sm, tvb, offset, 1, ENC_BIG_ENDIAN);
3613     drxi = (tvb_get_guint8(tvb, offset) & 0x08) >> 3;
3614     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, ((offset << 3) + 3), 1, ENC_BIG_ENDIAN);
3615     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_drxi, tvb, offset, 1, ENC_BIG_ENDIAN);
3616     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_cksn_ksi, tvb, offset, 1, ENC_BIG_ENDIAN);
3617     offset += 1;
3618     /* Octet 6 */
3619     oct = tvb_get_guint8(tvb, offset);
3620     nr_qui = oct >> 5;
3621     uamb_ri = (oct & 0x02) >> 1;
3622     samb_ri = oct & 0x01;
3623     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_nr_qui, tvb, offset, 1, ENC_BIG_ENDIAN);
3624     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, (offset << 3) + 3, 3, ENC_BIG_ENDIAN);
3625     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_uamb_ri, tvb, offset, 1, ENC_BIG_ENDIAN);
3626     proto_tree_add_bits_item(flag_tree, hf_gtpv2_mm_context_samb_ri, tvb, (offset << 3) + 7, 1, ENC_BIG_ENDIAN);
3627     offset += 1;
3628     /* Octet 7 Spare Used Cipher */
3629     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, ((offset << 3)), 5, ENC_BIG_ENDIAN);
3630     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_used_cipher, tvb, offset, 1, ENC_BIG_ENDIAN);
3631     offset += 1;
3632
3633     /* Octet 8 to 23  CK */
3634     proto_tree_add_item(tree, hf_gtpv2_ck, tvb, offset, 16, ENC_NA);
3635     offset += 16;
3636     /* Octet 24 to 39 IK */
3637     proto_tree_add_item(tree, hf_gtpv2_ik, tvb, offset, 16, ENC_NA);
3638     offset += 16;
3639
3640     /*
3641      * 40 to h Authentication Quintuplet [0..4]
3642      */
3643     if (nr_qui) {
3644         offset = dissect_gtpv2_authentication_quintuplets(tvb, tree, offset, nr_qui);
3645     }
3646
3647     /*
3648      * (h+1) to (h+2) DRX parameter
3649      */
3650     if (drxi) {
3651         proto_tree_add_item(tree, hf_gtpv2_mm_context_drx, tvb, offset, 2, ENC_BIG_ENDIAN);
3652         offset += 2;
3653     }
3654
3655
3656     /* Dissect octet j to r */
3657     offset = dissect_gtpv2_mm_context_common_data(tvb, pinfo, tree, offset, samb_ri, uamb_ri);
3658
3659     /* r+1 Spare HNNA ENA INA GANA GENA UNA
3660      * The Access restriction data is composed of UNA(UTRAN Not Allowed), GENA(GERAN Not Allowed),
3661      * GANA(GAN Not Allowed), INA(I-HSPA-Evolution Not Allowed), ENA(E-UTRAN Not Allowed) and
3662      * HNNA(HO-To-Non-3GPPAccess Not Allowed).
3663      */
3664     if (offset < (gint)length) {
3665         offset = dissect_gtpv2_access_restriction_data(tvb, tree, offset);
3666     } else {
3667         return;
3668     }
3669     if (offset == (gint)length) {
3670         return;
3671     }
3672
3673     /* r+2 Length of Voice Domain Preference and UE's Usage Setting */
3674     vdp_len = tvb_get_guint8(tvb, offset);
3675     proto_tree_add_item(tree, hf_gtpv2_mm_context_vdp_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3676     offset += 1;
3677     /* (r+3) to s Voice Domain Preference and UE's Usage Setting */
3678     if (vdp_len) {
3679         proto_tree_add_item(tree, hf_gtpv2_voice_domain_and_ue_usage_setting, tvb, offset, vdp_len, ENC_NA);
3680         offset += vdp_len;
3681     }
3682
3683     /* s+1 Length of Higher bitrates than 16 Mbps flag */
3684     if (offset == (gint)length) {
3685         hbr_len = tvb_get_guint8(tvb, offset);
3686         proto_tree_add_item(tree, hf_gtpv2_mm_context_higher_br_16mb_flg_len, tvb, offset, 1, ENC_BIG_ENDIAN);
3687         offset += 1;
3688         /* s+2 Higher bitrates than 16 Mbps flag */
3689         if (hbr_len) {
3690             proto_tree_add_item(tree, hf_gtpv2_mm_context_higher_br_16mb_flg, tvb, offset, 1, ENC_BIG_ENDIAN);
3691             offset += hbr_len;
3692         }
3693     } else {
3694         return;
3695     }
3696
3697     proto_tree_add_expert_format(flag_tree, pinfo, &ei_gtpv2_ie_data_not_dissected, tvb, offset, -1, "The rest of the IE not dissected yet");
3698
3699 }
3700
3701 /* Type = 105 (decimal)
3702  * Figure 8.38-3: GSM Key, Used Cipher and Quintuplets
3703  */
3704 static void
3705 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_, session_args_t * args _U_)
3706 {
3707     proto_tree *flag_tree;
3708     int         offset;
3709     guint8      oct, drxi, nr_qui, uamb_ri, samb_ri, vdp_len, hbr_len;
3710
3711     offset = 0;
3712     flag_tree = proto_tree_add_subtree(tree, tvb, offset, 3, ett_gtpv2_mm_context_flag, NULL, "MM Context flags");
3713
3714     /* Octet 5 */
3715     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_sm, tvb, offset, 1, ENC_BIG_ENDIAN);
3716     drxi = (tvb_get_guint8(tvb, offset) & 0x08) >> 3;
3717     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, ((offset << 3) + 3), 1, ENC_BIG_ENDIAN);
3718     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_drxi, tvb, offset, 1, ENC_BIG_ENDIAN);
3719     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_cksn_ksi, tvb, offset, 1, ENC_BIG_ENDIAN);
3720     offset += 1;
3721     /* Octet 6 */
3722     oct = tvb_get_guint8(tvb, offset);
3723     nr_qui = oct >> 5;
3724     uamb_ri = (oct & 0x02) >> 1;
3725     samb_ri = oct & 0x01;
3726     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_nr_qui, tvb, offset, 1, ENC_BIG_ENDIAN);
3727     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, (offset << 3) + 3, 3, ENC_BIG_ENDIAN);
3728     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_uamb_ri, tvb, offset, 1, ENC_BIG_ENDIAN);
3729     proto_tree_add_bits_item(flag_tree, hf_gtpv2_mm_context_samb_ri, tvb, (offset << 3) + 7, 1, ENC_BIG_ENDIAN);
3730     offset += 1;
3731     /* Octet 7 Spare Used Cipher */
3732     proto_tree_add_bits_item(flag_tree, hf_gtpv2_spare_bits, tvb, ((offset << 3)), 5, ENC_BIG_ENDIAN);
3733     proto_tree_add_item(flag_tree, hf_gtpv2_mm_context_used_cipher, tvb, offset, 1, ENC_BIG_ENDIAN);
3734     offset += 1;
3735     /* 8 to 15 Kc */
3736     proto_tree_add_item(tree, hf_gtpv2_mm_context_kc, tvb, offset, 8, ENC_NA);
3737     offset += 8;
3738
3739     /*
3740      * 40 to h Authentication Quintuplet [0..4]
3741      */
3742     if (nr_qui) {
3743         offset = dissect_gtpv2_authentication_quintuplets(tvb, tree, offset, nr_qui);
3744     }
3745
3746     /*
3747      * (h+1) to (h+2) DRX parameter
3748      */
3749     if (drxi) {
3750         proto_tree_add_item(tree, hf_gtpv2_mm_context_drx, tvb, offset, 2, ENC_BIG_ENDIAN);
3751         offset += 2;
3752     }
3753
3754
3755     /* Dissect octet j to r */
3756     offset = dissect_gtpv2_mm_context_common_data(tvb, pinfo, tree, offset, samb_ri, uamb_ri);
3757
3758     /* r+1 Spare HNNA ENA INA GANA GENA UNA
3759      * The Access restriction data is composed of UNA(UTRAN Not Allowed), GENA(GERAN Not Allowed),
3760      * GANA(GAN Not Allowed), INA(I-HSPA-Evolution Not Allowed), ENA(E-UTRAN Not Allowed) and
3761      * HNNA(HO-To-Non-3GPPAccess Not Allowed).
3762      */
3763     if (offset < (gint)length) {
3764         offset = dissect_gtpv2_access_restriction_data(tvb, tree, offset);