Bug Summary

File:builds/wireshark/wireshark/epan/dissectors/packet-gsm_a_bssmap.c
Warning:line 3278, column 9
Value stored to 'curr_offset' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-gsm_a_bssmap.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-22/lib/clang/22 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D CARES_NO_DEPRECATED -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-22/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-nonliteral -std=gnu17 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -fdwarf2-cfi-asm -o /builds/wireshark/wireshark/sbout/2026-08-16-100800-3660-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-gsm_a_bssmap.c
1/* packet-gsm_a_bssmap.c
2 * Routines for GSM A Interface BSSMAP dissection
3 *
4 * Copyright 2003, Michael Lum <mlum [AT] telostech.com>
5 * In association with Telos Technology Inc.
6 *
7 * Updated to 3GPP TS 48.008 version 9.8.0 Release 9
8 * Copyright 2008, Anders Broman <anders.broman [at] ericsson.com
9 * Copyright 2012, Pascal Quantin <pascal.quantin [at] gmail.com
10 * Title 3GPP Other
11 *
12 * Reference [2]
13 * Mobile-services Switching Centre - Base Station System
14 * (MSC - BSS) interface;
15 * Layer 3 specification
16 * (GSM 08.08 version 7.7.0 Release 1998) TS 100 590 v7.7.0
17 * 3GPP TS 48.008 version 8.4.0 Release 8
18 * 3GPP TS 48.008 version 9.8.0 Release 9
19 *
20 * Wireshark - Network traffic analyzer
21 * By Gerald Combs <[email protected]>
22 * Copyright 1998 Gerald Combs
23 *
24 * SPDX-License-Identifier: GPL-2.0-or-later
25 */
26
27#include "config.h"
28
29#include <epan/packet.h>
30#include <epan/tap.h>
31#include <epan/expert.h>
32#include <epan/asn1.h>
33#include <epan/tfs.h>
34
35#include <wsutil/str_util.h>
36#include <wsutil/array.h>
37
38#include "packet-bssgp.h"
39#include "packet-gsm_a_common.h"
40#include "packet-e212.h"
41#include "packet-ranap.h"
42#include "packet-rrc.h"
43#include "packet-rtcp.h"
44#include "packet-rtp.h"
45#include "packet-gsm_map.h"
46#include "packet-bicc_mst.h"
47#include "packet-s1ap.h"
48
49void proto_register_gsm_a_bssmap(void);
50void proto_reg_handoff_gsm_a_bssmap(void);
51
52/* PROTOTYPES/FORWARDS */
53
54/* TS 48.008 3.2.2.1 Message Type */
55const value_string gsm_a_bssmap_msg_strings[] = {
56 { 0x01, "Assignment Request" },
57 { 0x02, "Assignment Complete" },
58 { 0x03, "Assignment Failure" },
59 { 0x04, "VGCS/VBS Setup" },
60 { 0x05, "VGCS/VBS Setup Ack" },
61 { 0x06, "VGCS/VBS Setup Refuse" },
62 { 0x07, "VGCS/VBS Assignment Request" },
63 { 0x08, "Channel Modify request" },
64
65 { 0x09, "Unallocated" },
66 { 0x0a, "Unallocated" },
67 { 0x0b, "Unallocated" },
68 { 0x0c, "Unallocated" },
69 { 0x0d, "Unallocated" },
70 { 0x0e, "Unallocated" },
71 { 0x0f, "Unallocated" },
72
73 { 0x10, "Handover Request" },
74 { 0x11, "Handover Required" },
75 { 0x12, "Handover Request Acknowledge" },
76 { 0x13, "Handover Command" },
77 { 0x14, "Handover Complete" },
78 { 0x15, "Handover Succeeded" },
79 { 0x16, "Handover Failure" },
80 { 0x17, "Handover Performed" },
81 { 0x18, "Handover Candidate Enquire" },
82 { 0x19, "Handover Candidate Response" },
83 { 0x1a, "Handover Required Reject" },
84 { 0x1b, "Handover Detect" },
85 { 0x1c, "VGCS/VBS Assignment Result" },
86 { 0x1d, "VGCS/VBS Assignment Failure" },
87 { 0x1e, "VGCS/VBS Queuing Indication" },
88 { 0x1f, "Uplink Request" },
89 { 0x20, "Clear Command" },
90 { 0x21, "Clear Complete" },
91 { 0x22, "Clear Request" },
92 { 0x23, "Reserved" },
93 { 0x24, "Reserved" },
94 { 0x25, "SAPI 'n' Reject" },
95 { 0x26, "Confusion" },
96 { 0x27, "Uplink Request Acknowledge" },
97 { 0x28, "Suspend" },
98 { 0x29, "Resume" },
99 /* This value (2a) was allocated in an earlier phase of the protocol and shall not be used in the future. */
100 { 0x2a, "Connection Oriented Information(Obsolete)" },
101 { 0x2b, "Perform Location Request" },
102 { 0x2c, "LSA Information" },
103 { 0x2d, "Perform Location Response" },
104 { 0x2e, "Perform Location Abort" },
105 { 0x2f, "Common Id" },
106 { 0x30, "Reset" },
107 { 0x31, "Reset Acknowledge" },
108 { 0x32, "Overload" },
109 { 0x33, "Reserved" },
110 { 0x34, "Reset Circuit" },
111 { 0x35, "Reset Circuit Acknowledge" },
112 { 0x36, "MSC Invoke Trace" },
113 { 0x37, "BSS Invoke Trace" },
114
115 { 0x38, "Unallocated" },
116 { 0x39, "Unallocated" },
117
118 { 0x3a, "Connectionless Information" },
119 { 0x3b, "VGCS/VBS Assignment Status" },
120 { 0x3c, "VGCS/VBS Area Cell Info" },
121 { 0x3d, "Reset IP Resource" },
122 { 0x3e, "Reset IP Resource Acknowledge" },
123
124 { 0x3f, "Unallocated" },
125
126 { 0x40, "Block" },
127 { 0x41, "Blocking Acknowledge" },
128 { 0x42, "Unblock" },
129 { 0x43, "Unblocking Acknowledge" },
130 { 0x44, "Circuit Group Block" },
131 { 0x45, "Circuit Group Blocking Acknowledge" },
132 { 0x46, "Circuit Group Unblock" },
133 { 0x47, "Circuit Group Unblocking Acknowledge" },
134 { 0x48, "Unequipped Circuit" },
135 { 0x49, "Uplink Request Confirmation" },
136 { 0x4a, "Uplink Release Indication" },
137 { 0x4b, "Uplink Reject Command" },
138 { 0x4c, "Uplink Release Command" },
139 { 0x4d, "Uplink Seized Command" },
140 { 0x4e, "Change Circuit" },
141 { 0x4f, "Change Circuit Acknowledge" },
142 { 0x50, "Resource Request" },
143 { 0x51, "Resource Indication" },
144 { 0x52, "Paging" },
145 { 0x53, "Cipher Mode Command" },
146 { 0x54, "Classmark Update" },
147 { 0x55, "Cipher Mode Complete" },
148 { 0x56, "Queuing Indication" },
149 { 0x57, "Complete Layer 3 Information" },
150 { 0x58, "Classmark Request" },
151 { 0x59, "Cipher Mode Reject" },
152 { 0x5a, "Load Indication" },
153
154 { 0x5b, "Unallocated" },
155 { 0x5c, "Unallocated" },
156 { 0x5d, "Unallocated" },
157 { 0x5e, "Unallocated" },
158 { 0x5f, "Unallocated" },
159
160 { 0x60, "VGCS Additional Information" },
161 { 0x61, "VGCS SMS" },
162 { 0x62, "Notification Data" },
163 { 0x63, "Uplink Application Data" },
164
165 { 0x64, "Unallocated" },
166 { 0x65, "Unallocated" },
167 { 0x66, "Unallocated" },
168 { 0x67, "Unallocated" },
169 { 0x68, "Unallocated" },
170 { 0x69, "Unallocated" },
171 { 0x6a, "Unallocated" },
172 { 0x6b, "Unallocated" },
173 { 0x6c, "Unallocated" },
174 { 0x6d, "Unallocated" },
175 { 0x6e, "Unallocated" },
176 { 0x6f, "Unallocated" },
177
178 { 0x70, "Internal Handover Required" },
179 { 0x71, "Internal Handover Required Reject" },
180 { 0x72, "Internal Handover Command" },
181 { 0x73, "Internal Handover Enquiry" },
182 { 0x74, "LCLS-Connect-Control" },
183 { 0x75, "LCLS-Connect-Control-Ack" },
184 { 0x76, "LCLS-Notification" },
185 { 0x77, "Unallocated" },
186 { 0x78, "Reroute Command" },
187 { 0x79, "Reroute Complete" },
188 { 0, NULL((void*)0) }
189};
190
191static value_string_ext gsm_a_bssmap_msg_strings_ext = VALUE_STRING_EXT_INIT(gsm_a_bssmap_msg_strings){ _try_val_to_str_ext_init, 0, (sizeof (gsm_a_bssmap_msg_strings
) / sizeof ((gsm_a_bssmap_msg_strings)[0]))-1, gsm_a_bssmap_msg_strings
, "gsm_a_bssmap_msg_strings", ((void*)0) }
;
192
193static const value_string gsm_bssmap_elem_strings[] = {
194 { BE_UDEF_0, "Undefined" },
195 { BE_CIC, "Circuit Identity Code" },
196 { BE_RSVD_1, "Reserved" },
197 { BE_RES_AVAIL, "Resource Available" },
198 { BE_CAUSE, "Cause" },
199 { BE_CELL_ID, "Cell Identifier" },
200 { BE_PRIO, "Priority" },
201 { BE_L3_HEADER_INFO, "Layer 3 Header Information" },
202 { BE_IMSI, "IMSI" },
203 { BE_TMSI, "TMSI" },
204 { BE_ENC_INFO, "Encryption Information" },
205 { BE_CHAN_TYPE, "Channel Type" },
206 { BE_PERIODICITY, "Periodicity" },
207 { BE_EXT_RES_IND, "Extended Resource Indicator" },
208 { BE_NUM_MS, "Number Of MSs" },
209 { BE_RSVD_2, "Reserved" },
210 { BE_RSVD_3, "Reserved" },
211 { BE_RSVD_4, "Reserved" },
212 { BE_CM_INFO_2, "Classmark Information Type 2" },
213 { BE_CM_INFO_3, "Classmark Information Type 3" },
214 { BE_INT_BAND, "Interference Band To Be Used" },
215 { BE_RR_CAUSE, "RR Cause" },
216 { BE_RSVD_5, "Reserved" },
217 { BE_L3_INFO, "Layer 3 Information" },
218 { BE_DLCI, "DLCI" },
219 { BE_DOWN_DTX_FLAG, "Downlink DTX Flag" },
220 { BE_CELL_ID_LIST, "Cell Identifier List" },
221 { BE_RESP_REQ, "Response Request" },
222 { BE_RES_IND_METHOD, "Resource Indication Method" },
223 { BE_CM_INFO_1, "Classmark Information Type 1" },
224 { BE_CIC_LIST, "Circuit Identity Code List" },
225 { BE_DIAG, "Diagnostic" },
226 { BE_L3_MSG, "Layer 3 Message Contents" },
227 { BE_CHOSEN_CHAN, "Chosen Channel" },
228 { BE_TOT_RES_ACC, "Total Resource Accessible" },
229 { BE_CIPH_RESP_MODE, "Cipher Response Mode" },
230 { BE_CHAN_NEEDED, "Channel Needed" },
231 { BE_TRACE_TYPE, "Trace Type" },
232 { BE_TRIGGERID, "TriggerID" },
233 { BE_TRACE_REF, "Trace Reference" },
234 { BE_TRANSID, "TransactionID" },
235 { BE_MID, "Mobile Identity" },
236 { BE_OMCID, "OMCID" },
237 { BE_FOR_IND, "Forward Indicator" },
238 { BE_CHOSEN_ENC_ALG, "Chosen Encryption Algorithm" },
239 { BE_CCT_POOL, "Circuit Pool" },
240 { BE_CCT_POOL_LIST, "Circuit Pool List" },
241 { BE_TIME_IND, "Time Indication" },
242 { BE_RES_SIT, "Resource Situation" },
243 { BE_CURR_CHAN_1, "Current Channel Type 1" },
244 { BE_QUE_IND, "Queuing Indicator" },
245 { BE_ASS_REQ, "Assignment Requirement" },
246 { BE_UDEF_52, "Undefined" },
247 { BE_TALKER_FLAG, "Talker Flag" },
248 { BE_CONN_REL_REQ, "Connection Release Requested" },
249 { BE_GROUP_CALL_REF, "Group Call Reference" },
250 { BE_EMLPP_PRIO, "eMLPP Priority" },
251 { BE_CONF_EVO_IND, "Configuration Evolution Indication" },
252 { BE_OLD2NEW_INFO, "Old BSS to New BSS Information" },
253 { BE_LSA_ID, "LSA Identifier" },
254 { BE_LSA_ID_LIST, "LSA Identifier List" },
255 { BE_LSA_INFO, "LSA Information" },
256 { BE_LCS_QOS, "LCS QoS" },
257 { BE_LSA_ACC_CTRL, "LSA access control suppression" },
258 { BE_SPEECH_VER, "Speech Version" },
259 { BE_UDEF_65, "Undefined" },
260 { BE_UDEF_66, "Undefined" },
261 { BE_LCS_PRIO, "LCS Priority" },
262 { BE_LOC_TYPE, "Location Type" },
263 { BE_LOC_EST, "Location Estimate" },
264 { BE_POS_DATA, "Positioning Data" },
265 { BE_LCS_CAUSE, "LCS Cause" },
266 { BE_LCS_CLIENT, "LCS Client Type" },
267 { BE_APDU, "APDU" },
268 { BE_NE_ID, "Network Element Identity" },
269 { BE_GPS_ASSIST_DATA, "GPS Assistance Data" },
270 { BE_DECIPH_KEYS, "Deciphering Keys" },
271 { BE_RET_ERR_REQ, "Return Error Request" },
272 { BE_RET_ERR_CAUSE, "Return Error Cause" },
273 { BE_SEG, "Segmentation" },
274 { BE_SERV_HO, "Service Handover" },
275 { BE_SRC_RNC_TO_TAR_RNC_UMTS, "Source RNC to target RNC transparent information (UMTS)" },
276 { BE_SRC_RNC_TO_TAR_RNC_CDMA, "Source RNC to target RNC transparent information (cdma2000)" },
277 { BE_GERAN_CLS_M, "GERAN Classmark" },
278 { BE_GERAN_BSC_CONT, "GERAN BSC Container" },
279 { BE_VEL_EST, "Velocity Estimate" },
280 { BE_UDEF_86, "Undefined" },
281 { BE_UDEF_87, "Undefined" },
282 { BE_UDEF_88, "Undefined" },
283 { BE_UDEF_89, "Undefined" },
284 { BE_UDEF_90, "Undefined" },
285 { BE_UDEF_91, "Undefined" },
286 { BE_UDEF_92, "Undefined" },
287 { BE_UDEF_93, "Undefined" },
288 { BE_UDEF_94, "Undefined" },
289 { BE_UDEF_95, "Undefined" },
290 { BE_UDEF_96, "Undefined" },
291 { BE_NEW_BSS_TO_OLD_BSS_INF, "New BSS to Old BSS Information" },
292 { BE_UDEF_98, "Undefined" },
293 { BE_INTER_SYS_INF, "Inter-System Information" },
294 { BE_SNA_ACC_INF, "SNA Access Information" },
295 { BE_VSTK_RAND_INF, "VSTK_RAND Information" },
296 { BE_VSTK_INF, "VSTK Information" },
297 { BE_PAGING_INF, "Paging Information" },
298 { BE_IMEI, "IMEI" },
299 { BE_VGCS_FEAT_FLG, "VGCS Feature Flags" },
300 { BE_TALKER_PRI, "Talker Priority" },
301 { BE_EMRG_SET_IND, "Emergency Set Indication" },
302 { BE_TALKER_ID, "Talker Identity" },
303 { BE_CELL_ID_LIST_SEG, "Cell Identifier List Segment" },
304 { BE_SMS_TO_VGCS, "SMS to VGCS" },
305 { BE_VGCS_TALKER_MOD, "VGCS Talker Mode" },
306 { BE_VGS_VBS_CELL_STAT, "VGCS/VBS Cell Status" },
307 { BE_CELL_ID_LST_SEG_F_EST_CELLS, "Cell Identifier List Segment for established cells" },
308 { BE_CELL_ID_LST_SEG_F_CELL_TB_EST, "Cell Identifier List Segment for cells to be established" },
309 { BE_CELL_ID_LST_SEG_F_REL_CELL, "Cell Identifier List Segment for released cells - no user present" },
310 { BE_CELL_ID_LST_SEG_F_NOT_EST_CELL, "Cell Identifier List Segment for not established cells - no establishment possible" },
311 { BE_GANSS_ASS_DTA, "GANSS Assistance Data" },
312 { BE_GANSS_POS_DTA, "GANSS Positioning Data" },
313 { BE_GANSS_LOC_TYP, "GANSS Location Type" },
314 { BE_APP_DATA, "Application Data" },
315 { BE_DATA_ID, "Data Identity" },
316 { BE_APP_DATA_INF, "Application Data Information" },
317 { BE_MSISDN, "MSISDN" },
318 { BE_AOIP_TRANS_LAY_ADD, "AoIP Transport Layer Address" },
319 { BE_SPEECH_CODEC_LST, "Speech Codec List" },
320 { BE_SPEECH_CODEC, "Speech Codec" },
321 { BE_CALL_ID, "Call Identifier" },
322 { BE_CALL_ID_LST, "Call Identifier List" },
323 { BE_A_ITF_SEL_FOR_RESET, "A-Interface Selector for RESET" },
324 { BE_UDEF_130, "Undefined" },
325 { BE_KC128, "Kc128" },
326 { BE_CSG_ID, "CSG Identifier" },
327 { BE_REDIR_ATT_FLG, "Redirect Attempt Flag" }, /* 3.2.2.111 */
328 { BE_REROUTE_REJ_CAUSE, "Reroute Reject Cause" }, /* 3.2.2.112 */
329 { BE_SEND_SEQN, "Send Sequence Number" }, /* 3.2.2.113 */
330 { BE_REROUTE_OUTCOME, "Reroute complete outcome" }, /* 3.2.2.114 */
331 { BE_GLOBAL_CALL_REF, "Global Call Reference" }, /* 3.2.2.115 */
332 { BE_LCLS_CONF, "LCLS-Configuration" }, /* 3.2.2.116 */
333 { BE_LCLS_CON_STATUS_CONTROL, "LCLS-Connection-Status-Control" }, /* 3.2.2.117 */
334 { BE_LCLS_CORR_NOT_NEEDED, "LCLS-Correlation-Not-Needed" }, /* 3.2.2.118 */
335 { BE_LCLS_BSS_STATUS, "LCLS-BSS-Status" }, /* 3.2.2.119 */
336 { BE_LCLS_BREAK_REQ, "LCLS-Break-Request" }, /* 3.2.2.120 */
337 { BE_CSFB_IND, "CSFB Indication" }, /* 3.2.2.121 */
338 { BE_CS_TO_PS_SRVCC, "CS to PS SRVCC" }, /* 3.2.2.122 */
339 { BE_SRC_ENB_2_TGT_ENB_TRANSP_INF, "Source eNB to target eNB transparent information (E-UTRAN)" }, /* 3.2.2.123 */
340 { BE_CS_TO_PS_SRVCC_IND, "CS to PS SRVCC Indication" }, /* 3.2.2.124 */
341 { BE_CN_TO_MS_TRANSP, "CN to MS transparent information" }, /* 3.2.2.125 */
342 { BE_SELECTED_PLMN_ID, "Selected PLMN ID" }, /* 3.2.2.126 */
343 { BE_LAST_USED_E_UTRAN_PLMN_ID, "Last used E-UTRAN PLMN ID" }, /* 3.2.2.127 */
344 { BE_UDEF_150, "Undefined" },
345 { BE_UDEF_151, "Undefined" },
346 { BE_UDEF_152, "Undefined" },
347 { BE_UDEF_153, "Undefined" },
348 { BE_UDEF_154, "Undefined" },
349 { BE_UDEF_155, "Undefined" },
350 { BE_UDEF_156, "Undefined" },
351 { BE_UDEF_157, "Undefined" },
352 { BE_UDEF_158, "Undefined" },
353 { BE_UDEF_159, "Undefined" },
354 { BE_UDEF_160, "Undefined" },
355 { BE_UDEF_161, "Undefined" },
356 { BE_UDEF_162, "Undefined" },
357 { BE_UDEF_163, "Undefined" },
358 { BE_UDEF_164, "Undefined" },
359 { BE_UDEF_165, "Undefined" },
360 { BE_UDEF_166, "Undefined" },
361 { BE_UDEF_167, "Undefined" },
362 { BE_UDEF_168, "Undefined" },
363 { BE_UDEF_169, "Undefined" },
364 { BE_UDEF_170, "Undefined" },
365 { BE_UDEF_171, "Undefined" },
366 { BE_UDEF_172, "Undefined" },
367 { BE_UDEF_173, "Undefined" },
368 { BE_UDEF_174, "Undefined" },
369 { BE_UDEF_175, "Undefined" },
370 { BE_UDEF_176, "Undefined" },
371 { BE_UDEF_177, "Undefined" },
372 { BE_UDEF_178, "Undefined" },
373 { BE_UDEF_179, "Undefined" },
374 { BE_UDEF_180, "Undefined" },
375 { BE_UDEF_181, "Undefined" },
376 { BE_UDEF_182, "Undefined" },
377 { BE_UDEF_183, "Undefined" },
378 { BE_UDEF_184, "Undefined" },
379 { BE_UDEF_185, "Undefined" },
380 { BE_UDEF_186, "Undefined" },
381 { BE_UDEF_187, "Undefined" },
382 { BE_UDEF_188, "Undefined" },
383 { BE_UDEF_189, "Undefined" },
384 { BE_UDEF_190, "Undefined" },
385 { BE_UDEF_191, "Undefined" },
386 { BE_UDEF_192, "Undefined" },
387 { BE_UDEF_193, "Undefined" },
388 { BE_UDEF_194, "Undefined" },
389 { BE_UDEF_195, "Undefined" },
390 { BE_UDEF_196, "Undefined" },
391 { BE_UDEF_197, "Undefined" },
392 { BE_UDEF_198, "Undefined" },
393 { BE_UDEF_199, "Undefined" },
394 { BE_UDEF_200, "Undefined" },
395 { BE_UDEF_201, "Undefined" },
396 { BE_UDEF_202, "Undefined" },
397 { BE_UDEF_203, "Undefined" },
398 { BE_UDEF_204, "Undefined" },
399 { BE_UDEF_205, "Undefined" },
400 { BE_UDEF_206, "Undefined" },
401 { BE_UDEF_207, "Undefined" },
402 { BE_UDEF_208, "Undefined" },
403 { BE_UDEF_209, "Undefined" },
404 { BE_UDEF_210, "Undefined" },
405 { BE_UDEF_211, "Undefined" },
406 { BE_UDEF_212, "Undefined" },
407 { BE_UDEF_213, "Undefined" },
408 { BE_UDEF_214, "Undefined" },
409 { BE_UDEF_215, "Undefined" },
410 { BE_UDEF_216, "Undefined" },
411 { BE_UDEF_217, "Undefined" },
412 { BE_UDEF_218, "Undefined" },
413 { BE_UDEF_219, "Undefined" },
414 { BE_UDEF_220, "Undefined" },
415 { BE_UDEF_221, "Undefined" },
416 { BE_UDEF_222, "Undefined" },
417 { BE_UDEF_223, "Undefined" },
418 { BE_UDEF_224, "Undefined" },
419 { BE_UDEF_225, "Undefined" },
420 { BE_UDEF_226, "Undefined" },
421 { BE_UDEF_227, "Undefined" },
422 { BE_UDEF_228, "Undefined" },
423 { BE_UDEF_229, "Undefined" },
424 { BE_UDEF_230, "Undefined" },
425 { BE_UDEF_231, "Undefined" },
426 { BE_UDEF_232, "Undefined" },
427 { BE_UDEF_233, "Undefined" },
428 { BE_UDEF_234, "Undefined" },
429 { BE_UDEF_235, "Undefined" },
430 { BE_UDEF_236, "Undefined" },
431 { BE_UDEF_237, "Undefined" },
432 { BE_UDEF_238, "Undefined" },
433 { BE_UDEF_239, "Undefined" },
434 { BE_OSMOCOM_OSMUX_SUPPORT, "Osmocom extension: Osmux Support" },
435 { BE_OSMOCOM_OSMUX_CID, "Osmocom extension: Osmux CID" },
436 { 0, NULL((void*)0) }
437};
438value_string_ext gsm_bssmap_elem_strings_ext = VALUE_STRING_EXT_INIT(gsm_bssmap_elem_strings){ _try_val_to_str_ext_init, 0, (sizeof (gsm_bssmap_elem_strings
) / sizeof ((gsm_bssmap_elem_strings)[0]))-1, gsm_bssmap_elem_strings
, "gsm_bssmap_elem_strings", ((void*)0) }
;
439
440/* 3.2.3 Signalling Field Element Coding */
441static const value_string bssmap_field_element_ids[] = {
442
443 { 0x1, "BSSMAP Field Element: Extra information" }, /* 3.2.3.1 */
444 { 0x2, "BSSMAP Field Element: Current Channel Type 2" }, /* 3.2.2.2 */
445 { 0x3, "BSSMAP Field Element: Target cell radio information" }, /* 3.2.3.3 */
446 { 0x4, "BSSMAP Field Element: GPRS Suspend information" }, /* 3.2.3.4 */
447 { 0x5, "BSSMAP Field Element: MultiRate configuration information" }, /* 3.2.3.5 */
448 { 0x6, "BSSMAP Field Element: Dual Transfer Mode information" }, /* 3.2.3.6 */
449 { 0x7, "BSSMAP Field Element: Inter RAT Handover Info" }, /* 3.2.3.7 */
450 /*{ 0x7, "UE Capability information" },*/ /* 3.2.3.7 */
451 { 0x8, "BSSMAP Field Element: cdma2000 Capability Information" }, /* 3.2.3.8 */
452 { 0x9, "BSSMAP Field Element: Downlink Cell Load Information" }, /* 3.2.3.9 */
453 { 0xa, "BSSMAP Field Element: Uplink Cell Load Information" }, /* 3.2.3.10 */
454 { 0xb, "BSSMAP Field Element: Cell Load Information Group" }, /* 3.2.3.11 */
455 { 0xc, "BSSMAP Field Element: Cell Load Information" }, /* 3.2.3.12 */
456 { 0x0d, "BSSMAP Field Element: PS Indication" }, /* 3.2.3.13 */
457 { 0x0e, "BSSMAP Field Element: DTM Handover Command Indication" }, /* 3.2.3.14 */
458 { 0x0f, "BSSMAP Field Element: IRAT Measurement Configuration" }, /* 3.2.3.16 */
459 { 0x10, "BSSMAP Field Element: Source Cell ID" }, /* 3.2.3.17 */
460 { 0x11, "BSSMAP Field Element: IRAT Measurement Configuration (extended E-ARFCNs)" }, /* 3.2.3.18 */
461 { 0x6f, "BSSMAP Field Element: VGCS talker mode" }, /* although technically not a Field Element,
462 this IE can appear in Old BSS to New BSS information */
463 { 0x95, "BSSMAP Field Element: Last used E-UTRAN PLMN ID" }, /* 3.2.2.127 */
464 { 0xfe, "BSSMAP Field Element: D-RNTI" }, /* 3.2.3.15 */
465 { 0, NULL((void*)0) }
466};
467
468static const value_string bssap_cc_values[] = {
469 { 0x0, "not further specified" },
470 { 0x2, "FACCH or SDCCH" },
471 { 0x3, "SACCH" },
472 { 0, NULL((void*)0) } };
473
474static const value_string bssap_sapi_values[] = {
475 { 0x00, "RR/MM/CC" },
476 { 0x03, "SMS" },
477 { 0, NULL((void*)0) } };
478
479static const value_string gsm_a_be_cell_id_disc_vals[] = {
480 { 0, "The whole Cell Global Identification, CGI, is used to identify the cells."},
481 { 1, "Location Area Code, LAC, and Cell Identify, CI, is used to identify the cells."},
482 { 2, "Cell Identity, CI, is used to identify the cells."},
483 { 3, "No cell is associated with the transaction."},
484 { 4, "Location Area Identification, LAI, is used to identify all cells within a Location Area."},
485 { 5, "Location Area Code, LAC, is used to identify all cells within a location area."},
486 { 6, "All cells on the BSS are identified."},
487 { 7, "Reserved"},
488 { 8, "Intersystem Handover to UTRAN or cdma2000. PLMN-ID, LAC, and RNC-ID, are encoded to identify the target RNC."},
489 { 9, "Intersystem Handover to UTRAN or cdma2000. The RNC-ID is coded to identify the target RNC."},
490 { 10, "Intersystem Handover to UTRAN or cdma2000. LAC and RNC-ID are encoded to identify the target RNC."},
491 { 11, "Serving Area Identity, SAI, is used to identify the Serving Area of UE within UTRAN or cdma2000"},
492 { 12, "LAC, RNC-ID (or Extended RNC-ID) and Cell Identity, CI, is used to identify a UTRAN cell for cell load information"},
493 { 13, "Reserved"},
494 { 14, "Reserved"},
495 { 15, "Reserved"},
496 { 0, NULL((void*)0) }
497};
498static value_string_ext gsm_a_be_cell_id_disc_vals_ext = VALUE_STRING_EXT_INIT(gsm_a_be_cell_id_disc_vals){ _try_val_to_str_ext_init, 0, (sizeof (gsm_a_be_cell_id_disc_vals
) / sizeof ((gsm_a_be_cell_id_disc_vals)[0]))-1, gsm_a_be_cell_id_disc_vals
, "gsm_a_be_cell_id_disc_vals", ((void*)0) }
;
499
500#if 0
501static const value_string gsm_a_rr_channel_needed_vals[] = {
502 { 0x00, "Any channel"},
503 { 0x01, "SDCCH"},
504 { 0x02, "TCH/F (Full rate)"},
505 { 0x03, "TCH/H or TCH/F (Dual rate)"},
506 { 0, NULL((void*)0) }
507};
508#endif
509
510static const value_string bssmap_positioning_methods[] = {
511 { 0, "Timing Advance" },
512 { 1, "Reserved (Note)" },
513 { 2, "Reserved (Note)" },
514 { 3, "Mobile Assisted E-OTD" },
515 { 4, "Mobile Based E-OTD" },
516 { 5, "Mobile Assisted GPS" },
517 { 6, "Mobile Based GPS" },
518 { 7, "Conventional GPS" },
519 { 8, "U-TDOA" },
520 { 9, "Reserved for UTRAN use only" },
521 { 10, "Reserved for UTRAN use only" },
522 { 11, "Reserved for UTRAN use only" },
523 { 12, "Cell ID" },
524 { 0, NULL((void*)0)}
525};
526
527/* Positioning Method definitions */
528static const value_string bssmap_positioning_method_vals[] = {
529 { 0, "reserved" },
530 { 1, "Mobile Assisted E-OTD" },
531 { 2, "Mobile Based E-OTD" },
532 { 3, "Assisted GPS" },
533 { 4, "Assisted GANSS" },
534 { 5, "Assisted GPS and Assisted GANSS" },
535 { 0, NULL((void*)0)}
536};
537
538static const value_string bssmap_positioning_methods_usage[] = {
539 { 0, "Attempted unsuccessfully due to failure or interruption" },
540 { 1, "Attempted successfully - results not used to generate location" },
541 { 2, "Attempted successfully - results used to verify but not generate location" },
542 { 3, "Attempted successfully - results used to generate location" },
543 { 4, "Attempted successfully - case where MS supports multiple mobile based positioning methods and the actual method or methods used by the MS cannot be determined" },
544 { 0, NULL((void*)0)}
545};
546
547/* Location Information definitions */
548static const value_string bssmap_location_information_vals[] = {
549 { 0, "current geographic location" },
550 { 1, "location assistance information for the target MS" },
551 { 2, "deciphering keys for broadcast assistance data for the target MS" },
552 { 0, NULL((void*)0)}
553};
554
555static const true_false_string bssmap_chan_type_extension_value = {
556 "Additional Octet",
557 "Last Octet"
558};
559
560static const true_false_string bssmap_cause_extension_value = {
561 "Two Octets",
562 "One Octet"
563};
564
565/* Current Channel Type */
566static const value_string chan_mode_vals[] = {
567 { 0, "signalling only" },
568 { 1, "speech (full rate or half rate)" },
569 { 6, "data, 14.5 kbit/s radio interface rate" },
570 { 3, "data, 12.0 kbit/s radio interface rate" },
571 { 4, "data, 6.0 kbit/s radio interface rate" },
572 { 5, "data, 3.6 kbit/s radio interface rate" },
573 { 0x0f, "reserved" },
574 { 0, NULL((void*)0)}
575};
576
577static const value_string fe_cur_chan_type2_chan_field_vals[] = {
578 { 1, "SDCCH" },
579 { 8, "1 Full rate TCH" },
580 { 9, "1 Half rate TCH" },
581 { 10, "2 Full Rate TCHs" },
582 { 11, "3 Full Rate TCHs" },
583 { 12, "4 Full Rate TCHs" },
584 { 13, "5 Full Rate TCHs" },
585 { 14, "6 Full Rate TCHs" },
586 { 15, "7 Full Rate TCHs" },
587 { 4, "8 Full Rate TCHs" },
588 { 0, "reserved" },
589 { 0, NULL((void*)0)}
590};
591
592/* Initialize the protocol and registered fields */
593static int proto_a_bssmap;
594
595static int hf_gsm_a_bssmap_msg_type;
596int hf_gsm_a_bssmap_elem_id;
597static int hf_gsm_a_bssmap_field_elem_id;
598static int hf_gsm_a_bssmap_field_elem_id_len;
599static int hf_gsm_a_bssmap_cell_ci;
600static int hf_gsm_a_bssmap_cell_lac;
601static int hf_gsm_a_bssmap_sac;
602static int hf_gsm_a_bssmap_dlci_cc;
603static int hf_gsm_a_bssmap_dlci_spare;
604static int hf_gsm_a_bssmap_dlci_sapi;
605static int hf_gsm_a_bssmap_cause;
606static int hf_gsm_a_bssmap_be_cell_id_disc;
607static int hf_gsm_a_bssmap_pci;
608static int hf_gsm_a_bssmap_qa;
609static int hf_gsm_a_bssmap_pvi;
610static int hf_gsm_a_bssmap_interference_bands;
611static int hf_gsm_a_bssmap_lsa_only;
612static int hf_gsm_a_bssmap_act;
613static int hf_gsm_a_bssmap_pref;
614static int hf_gsm_a_bssmap_lsa_inf_prio;
615static int hf_gsm_a_bssmap_seq_len;
616static int hf_gsm_a_bssmap_seq_no;
617static int hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc;
618static int hf_gsm_a_bssap_res_ind_method;
619static int hf_gsm_a_bssap_cic_list_range;
620static int hf_gsm_a_bssap_cic_list_status;
621static int hf_gsm_a_bssap_diag_error_pointer;
622static int hf_gsm_a_bssap_diag_msg_rcv;
623static int hf_gsm_a_bssmap_ch_mode;
624static int hf_gsm_a_bssmap_cur_ch_mode;
625static int hf_gsm_a_bssmap_channel;
626static int hf_gsm_a_bssmap_trace_trigger_id;
627static int hf_gsm_a_bssmap_trace_priority_indication;
628static int hf_gsm_a_bssmap_trace_bss_record_type;
629static int hf_gsm_a_bssmap_trace_msc_record_type;
630static int hf_gsm_a_bssmap_trace_invoking_event;
631static int hf_gsm_a_bssmap_trace_reference;
632static int hf_gsm_a_bssmap_trace_omc_id;
633static int hf_gsm_a_bssmap_be_rnc_id;
634static int hf_gsm_a_bssmap_apdu_protocol_id;
635static int hf_gsm_a_bssmap_segmentation_spare_bits;
636static int hf_gsm_a_bssmap_segment_number;
637static int hf_gsm_a_bssmap_msg_id;
638static int hf_gsm_a_bssmap_segmentation_info;
639static int hf_gsm_a_bssmap_periodicity;
640static int hf_gsm_a_bssmap_sm;
641static int hf_gsm_a_bssmap_tarr;
642static int hf_gsm_a_bssmap_tot_no_of_fullr_ch;
643static int hf_gsm_a_bssmap_tot_no_of_hr_ch;
644static int hf_gsm_a_bssmap_smi;
645static int hf_gsm_a_bssmap_lsa_id;
646static int hf_gsm_a_bssmap_ep;
647static int hf_gsm_a_bssmap_lcs_pri;
648static int hf_gsm_a_bssmap_num_ms;
649static int hf_gsm_a_bssmap_talker_pri;
650static int hf_gsm_a_bssmap_rr_mode;
651static int hf_gsm_a_bssmap_group_cipher_key_nb;
652static int hf_gsm_a_bssmap_vgcs_vbs_cell_status;
653static int hf_gsm_a_bssmap_paging_cause;
654static int hf_gsm_a_bssmap_paging_inf_flg;
655static int hf_gsm_a_bssmap_serv_ho_inf;
656static int hf_gsm_a_bssmap_max_nb_traffic_chan;
657static int hf_gsm_a_bssmap_acceptable_chan_coding_bit5;
658static int hf_gsm_a_bssmap_acceptable_chan_coding_bit4;
659static int hf_gsm_a_bssmap_acceptable_chan_coding_bit3;
660static int hf_gsm_a_bssmap_acceptable_chan_coding_bit2;
661static int hf_gsm_a_bssmap_acceptable_chan_coding_bit1;
662static int hf_gsm_a_bssmap_allowed_data_rate_bit8;
663static int hf_gsm_a_bssmap_allowed_data_rate_bit7;
664static int hf_gsm_a_bssmap_allowed_data_rate_bit6;
665static int hf_gsm_a_bssmap_allowed_data_rate_bit5;
666static int hf_gsm_a_bssmap_allowed_data_rate_bit4;
667static int hf_gsm_a_bssmap_vstk_rand;
668static int hf_gsm_a_bssmap_vstk;
669static int hf_gsm_a_bssmap_spare_bits;
670static int hf_gsm_a_bssmap_tpind;
671static int hf_gsm_a_bssmap_asind_b2;
672static int hf_gsm_a_bssmap_asind_b3;
673static int hf_gsm_a_bssmap_bss_res;
674static int hf_gsm_a_bssmap_tcp;
675static int hf_gsm_a_bssmap_filler_bits;
676static int hf_gsm_a_bssmap_method;
677static int hf_gsm_a_bssmap_ganss_id;
678static int hf_gsm_a_bssmap_usage;
679static int hf_gsm_a_bssmap_data_id;
680static int hf_gsm_a_bssmap_bt_ind;
681static int hf_gsm_a_bssmap_aoip_trans_ipv4;
682static int hf_gsm_a_bssmap_aoip_trans_ipv6;
683static int hf_gsm_a_bssmap_aoip_trans_port;
684static int hf_gsm_a_bssmap_fi;
685static int hf_gsm_a_bssmap_tf;
686static int hf_gsm_a_bssmap_pi;
687static int hf_gsm_a_bssmap_pt;
688static int hf_gsm_a_bssap_speech_codec;
689static int hf_gsm_a_bssap_extended_codec;
690static int hf_gsm_a_bssap_extended_codec_r2;
691static int hf_gsm_a_bssap_extended_codec_r3;
692static int hf_gsm_a_bssmap_fi2;
693static int hf_gsm_a_bssmap_tf2;
694static int hf_gsm_a_bssmap_pi2;
695static int hf_gsm_a_bssmap_pt2;
696static int hf_gsm_a_bssmap_call_id;
697static int hf_gsm_a_bssmap_spare;
698static int hf_gsm_a_bssmap_positioning_data_discriminator;
699static int hf_gsm_a_bssmap_positioning_method;
700static int hf_gsm_a_bssmap_positioning_method_usage;
701static int hf_gsm_a_bssmap_location_type_location_information;
702static int hf_gsm_a_bssmap_location_type_positioning_method;
703static int hf_gsm_a_bssmap_chan_type_extension;
704static int hf_gsm_a_bssmap_cause_extension;
705static int hf_gsm_a_bssmap_ass_req;
706static int hf_gsm_a_bssmap_emlpp_prio;
707static int hf_gsm_a_bssmap_rip;
708static int hf_gsm_a_bssmap_rtd;
709static int hf_gsm_a_bssmap_kc128;
710static int hf_gsm_a_bssmap_csg_id;
711static int hf_gsm_a_bssmap_cell_access_mode;
712static int hf_fe_extra_info_prec;
713static int hf_fe_extra_info_lcs;
714static int hf_fe_extra_info_ue_prob;
715static int hf_fe_extra_info_spare;
716static int hf_fe_cur_chan_type2_chan_mode;
717static int hf_fe_cur_chan_type2_chan_mode_spare;
718static int hf_fe_cur_chan_type2_chan_field;
719static int hf_fe_cur_chan_type2_chan_field_spare;
720static int hf_fe_target_radio_cell_info_rxlev_ncell;
721static int hf_fe_target_radio_cell_info_rxlev_ncell_spare;
722static int hf_fe_dtm_info_dtm_ind;
723static int hf_fe_dtm_info_sto_ind;
724static int hf_fe_dtm_info_egprs_ind;
725static int hf_fe_dtm_info_spare_bits;
726static int hf_fe_cell_load_info_cell_capacity_class;
727static int hf_fe_cell_load_info_load_value;
728static int hf_fe_cell_load_info_rt_load_value;
729static int hf_fe_cell_load_info_nrt_load_information_value;
730static int hf_fe_ps_indication;
731static int hf_fe_dtm_ho_command_ind_spare;
732static int hf_gsm_a_bssmap_speech_data_ind;
733static int hf_gsm_a_bssmap_channel_rate_and_type;
734static int hf_gsm_a_bssmap_perm_speech_v_ind;
735static int hf_gsm_a_bssmap_reroute_rej_cause;
736static int hf_gsm_a_bssmap_send_seqn;
737static int hf_gsm_a_bssmap_reroute_outcome;
738static int hf_gsm_a_bssmap_lcls_conf;
739static int hf_gsm_a_bssmap_lcls_con_status_control;
740static int hf_gsm_a_bssmap_lcls_bss_status;
741static int hf_gsm_a_bssmap_osmocom_osmux_cid;
742
743/* Generated from convert_proto_tree_add_text.pl */
744static int hf_gsm_a_bssmap_message_elements;
745static int hf_gsm_a_bssmap_full_rate_channels_available;
746static int hf_gsm_a_bssmap_tch_6_4_8kb;
747static int hf_gsm_a_bssmap_speech_version_id;
748static int hf_gsm_a_bssmap_cell_id_unknown_format;
749static int hf_gsm_a_bssmap_tch_12kb;
750static int hf_gsm_a_bssmap_all_call_identifiers_resources_released;
751static int hf_gsm_a_bssmap_pcm_multiplexer;
752static int hf_gsm_a_bssmap_talker_identity_field;
753static int hf_gsm_a_bssmap_qri;
754static int hf_gsm_a_bssmap_cause_value;
755static int hf_gsm_a_bssmap_algorithm_identifier;
756static int hf_gsm_a_bssmap_tch_14_5_14_4kb;
757static int hf_gsm_a_bssmap_national_cause;
758static int hf_gsm_a_bssmap_cause_class;
759static int hf_gsm_a_bssmap_rate;
760static int hf_gsm_a_bssmap_tch_14_5kb;
761static int hf_gsm_a_bssmap_tch_12_9kb;
762static int hf_gsm_a_bssmap_s0_s7;
763static int hf_gsm_a_bssmap_tio;
764static int hf_gsm_a_bssmap_priority_level;
765static int hf_gsm_a_bssmap_cause16;
766static int hf_gsm_a_bssmap_enc_info_key;
767static int hf_gsm_a_bssmap_unknown_format;
768static int hf_gsm_a_bssmap_timeslot;
769static int hf_gsm_a_bssmap_transparent_service;
770static int hf_gsm_a_bssmap_tch_6kb;
771static int hf_gsm_a_bssmap_circuit_pool_number;
772static int hf_gsm_a_bssmap_ti_flag;
773static int hf_gsm_a_bssmap_half_rate_channels_available;
774static int hf_gsm_a_bssmap_imeisv_included;
775static int hf_gsm_a_bssmap_bss_activate_downlink;
776static int hf_gsm_a_bssmap_apdu;
777static int hf_gsm_a_bssmap_s0_s15;
778static int hf_gsm_a_bssmap_layer_3_information_value;
779static int hf_gsm_a_bssmap_gsm_a5_1;
780static int hf_gsm_a_bssmap_gsm_a5_2;
781static int hf_gsm_a_bssmap_gsm_a5_3;
782static int hf_gsm_a_bssmap_gsm_a5_4;
783static int hf_gsm_a_bssmap_gsm_a5_5;
784static int hf_gsm_a_bssmap_gsm_a5_6;
785static int hf_gsm_a_bssmap_gsm_a5_7;
786static int hf_gsm_a_bssmap_no_encryption;
787static int hf_gsm_a_bssmap_data_channel_rate_and_type;
788static int hf_gsm_a_bssmap_cell_discriminator;
789static int hf_gsm_a_bssmap_layer3_message_contents;
790static int hf_gsm_a_bssmap_forward_indicator;
791
792static expert_field ei_gsm_a_bssmap_extraneous_data;
793static expert_field ei_gsm_a_bssmap_not_decoded_yet;
794static expert_field ei_gsm_a_bssap_unknown_codec;
795static expert_field ei_gsm_a_bssmap_bogus_length;
796static expert_field ei_gsm_a_bssmap_missing_mandatory_element;
797
798/* Initialize the subtree pointers */
799static int ett_bssmap_msg;
800static int ett_cell_list;
801static int ett_dlci;
802static int ett_codec_lst;
803static int ett_bss_to_bss_info;
804
805static dissector_handle_t gsm_bsslap_handle;
806static dissector_handle_t dtap_handle;
807static dissector_handle_t bssgp_handle;
808static dissector_handle_t rrc_handle;
809static dissector_handle_t bicc_mst_handle;
810static dissector_handle_t bssmap_handle;
811
812static proto_tree *g_tree;
813static uint8_t cell_discriminator = 0x0f; /* tracks whether handover is to UMTS */
814
815static uint16_t
816be_field_element_dissect(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)));
817
818#if 0
819This enum has been moved to packet-gsm_a_common to
820make it possible to use element dissecton from this dissector
821in other dissectors.
822It is left here as a comment for easier reference.
823
824Note this enum must be of the same size as the element decoding list
825
826typedef enum
827{
828 BE_UDEF_0, /* Undefined */
829 BE_CIC, /* Circuit Identity Code */
830 BE_RSVD_1, /* Reserved */
831 BE_RES_AVAIL, /* Resource Available */
832 BE_CAUSE, /* Cause */
833 BE_CELL_ID, /* Cell Identifier */
834 BE_PRIO, /* Priority */
835 BE_L3_HEADER_INFO, /* Layer 3 Header Information */
836 BE_IMSI, /* IMSI */
837 BE_TMSI, /* TMSI */
838 BE_ENC_INFO, /* Encryption Information */
839 BE_CHAN_TYPE, /* Channel Type */
840 BE_PERIODICITY, /* Periodicity */
841 BE_EXT_RES_IND, /* Extended Resource Indicator */
842 BE_NUM_MS, /* Number Of MSs */
843 BE_RSVD_2, /* Reserved */
844 BE_RSVD_3, /* Reserved */
845 BE_RSVD_4, /* Reserved */
846 BE_CM_INFO_2, /* Classmark Information Type 2 */
847 BE_CM_INFO_3, /* Classmark Information Type 3 */
848 BE_INT_BAND, /* Interference Band To Be Used */
849 BE_RR_CAUSE, /* RR Cause */
850 BE_RSVD_5, /* Reserved */
851 BE_L3_INFO, /* Layer 3 Information */
852 BE_DLCI, /* DLCI */
853 BE_DOWN_DTX_FLAG, /* Downlink DTX Flag */
854 BE_CELL_ID_LIST, /* Cell Identifier List */
855 BE_RESP_REQ, /* Response Request */
856 BE_RES_IND_METHOD, /* Resource Indication Method */
857 BE_CM_INFO_1, /* Classmark Information Type 1 */
858 BE_CIC_LIST, /* Circuit Identity Code List */
859 BE_DIAG, /* Diagnostic */
860 BE_L3_MSG, /* Layer 3 Message Contents */
861 BE_CHOSEN_CHAN, /* Chosen Channel */
862 BE_TOT_RES_ACC, /* Total Resource Accessible */
863 BE_CIPH_RESP_MODE, /* Cipher Response Mode */
864 BE_CHAN_NEEDED, /* Channel Needed */
865 BE_TRACE_TYPE, /* Trace Type */
866 BE_TRIGGERID, /* TriggerID */
867 BE_TRACE_REF, /* Trace Reference */
868 BE_TRANSID, /* TransactionID */
869 BE_MID, /* Mobile Identity */
870 BE_OMCID, /* OMCID */
871 BE_FOR_IND, /* Forward Indicator */
872 BE_CHOSEN_ENC_ALG, /* Chosen Encryption Algorithm */
873 BE_CCT_POOL, /* Circuit Pool */
874 BE_CCT_POOL_LIST, /* Circuit Pool List */
875 BE_TIME_IND, /* Time Indication */
876 BE_RES_SIT, /* Resource Situation */
877 BE_CURR_CHAN_1, /* Current Channel Type 1 */
878 BE_QUE_IND, /* Queueing Indicator */
879 BE_ASS_REQ, /* Assignment Requirement */
880 BE_UDEF_52, /* Undefined */
881 BE_TALKER_FLAG, /* Talker Flag */
882 BE_CONN_REL_REQ, /* Connection Release Requested */
883 BE_GROUP_CALL_REF, /* Group Call Reference */
884 BE_EMLPP_PRIO, /* eMLPP Priority */
885 BE_CONF_EVO_IND, /* Configuration Evolution Indication */
886 BE_OLD2NEW_INFO, /* Old BSS to New BSS Information */
887 BE_LSA_ID, /* LSA Identifier */
888 BE_LSA_ID_LIST, /* LSA Identifier List */
889 BE_LSA_INFO, /* LSA Information */
890 BE_LCS_QOS, /* LCS QoS */
891 BE_LSA_ACC_CTRL, /* LSA access control suppression */
892 BE_SPEECH_VER, /* Speech Version */
893 BE_UDEF_65, /* Undefined */
894 BE_UDEF_66, /* Undefined */
895 BE_LCS_PRIO, /* LCS Priority */
896 BE_LOC_TYPE, /* Location Type */
897 BE_LOC_EST, /* Location Estimate */
898 BE_POS_DATA, /* Positioning Data */
899 BE_LCS_CAUSE, /* 3.2.2.66 LCS Cause */
900 BE_LCS_CLIENT, /* 10.14 LCS Client Type */
901 BE_APDU, /* APDU */
902 BE_NE_ID, /* Network Element Identity */
903 BE_GPS_ASSIST_DATA, /* GPS Assistance Data */
904 BE_DECIPH_KEYS, /* Deciphering Keys */
905 BE_RET_ERR_REQ, /* Return Error Request */
906 BE_RET_ERR_CAUSE, /* Return Error Cause */
907 BE_SEG, /* Segmentation */
908 BE_SERV_HO, /* Service Handover */
909 BE_SRC_RNC_TO_TAR_RNC_UMTS, /* Source RNC to target RNC transparent information (UMTS) */
910 BE_SRC_RNC_TO_TAR_RNC_CDMA, /* Source RNC to target RNC transparent information (cdma2000) */
911 BE_GERAN_CLS_M, /* GERAN Classmark */
912 BE_GERAN_BSC_CONT, /* GERAN BSC Container */
913 BE_VEL_EST, /* Velocity Estimate */
914 BE_UDEF_86, /* Undefined */
915 BE_UDEF_87, /* Undefined */
916 BE_UDEF_88, /* Undefined */
917 BE_UDEF_89, /* Undefined */
918 BE_UDEF_90, /* Undefined */
919 BE_UDEF_91, /* Undefined */
920 BE_UDEF_92, /* Undefined */
921 BE_UDEF_93, /* Undefined */
922 BE_UDEF_94, /* Undefined */
923 BE_UDEF_95, /* Undefined */
924 BE_UDEF_96, /* Undefined */
925 BE_NEW_BSS_TO_OLD_BSS_INF, /* New BSS to Old BSS Information */
926 BE_UDEF_98, /* Undefined */
927 BE_INTER_SYS_INF, /* Inter-System Information */
928 BE_SNA_ACC_INF, /* SNA Access Information */
929 BE_VSTK_RAND_INF, /* VSTK_RAND Information */
930 BE_VSTK_INF, /* VSTK Information */
931 BE_PAGING_INF, /* Paging Information */
932 BE_IMEI, /* IMEI */
933 BE_VGCS_FEAT_FLG, /* VGCS Feature Flags */
934 BE_TALKER_PRI, /* Talker Priority */
935 BE_EMRG_SET_IND, /* Emergency Set Indication */
936 BE_TALKER_ID, /* Talker Identity */
937 BE_CELL_ID_LIST_SEG, /* Cell Identifier List Segment */
938 BE_SMS_TO_VGCS, /* SMS to VGCS */
939 BE_VGCS_TALKER_MOD, /* VGCS Talker Mode */
940 BE_VGS_VBS_CELL_STAT, /* VGCS/VBS Cell Status */
941 BE_CELL_ID_LST_SEG_F_EST_CELLS, /* Cell Identifier List Segment for established cells */
942 BE_CELL_ID_LST_SEG_F_CELL_TB_EST, /* Cell Identifier List Segment for cells to be established */
943 BE_CELL_ID_LST_SEG_F_REL_CELL, /* Cell Identifier List Segment for released cells - no user present */
944 BE_CELL_ID_LST_SEG_F_NOT_EST_CELL, /* Cell Identifier List Segment for not established cells - no establishment possible */
945 BE_GANSS_ASS_DTA, /* GANSS Assistance Data */
946 BE_GANSS_POS_DTA, /* GANSS Positioning Data */
947 BE_GANSS_LOC_TYP, /* GANSS Location Type */
948 BE_APP_DATA, /* Application Data */
949 BE_DATA_ID, /* Data Identity */
950 BE_APP_DATA_INF, /* Application Data Information */
951 BE_MSISDN, /* MSISDN */
952 BE_AOIP_TRANS_LAY_ADD, /* AoIP Transport Layer Address */
953 BE_SPEECH_CODEC_LST, /* Speech Codec List */
954 BE_SPEECH_CODEC, /* Speech Codec */
955 BE_CALL_ID, /* Call Identifier */
956 BE_CALL_ID_LST, /* Call Identifier List */
957 BE_A_ITF_SEL_FOR_RESET, /* A-Interface Selector for RESET */
958 BE_UDEF_130, /* Undefined */
959 BE_KC128, /* Kc128 */
960 BE_CSG_ID, /* CSG Identifier */
961 BE_REDIR_ATT_FLG, /* Redirect Attempt Flag 3.2.2.111 */
962 BE_REROUTE_REJ_CAUSE, /* Reroute Reject Cause 3.2.2.112 */
963 BE_SEND_SEQN, /* Send Sequence Number 3.2.2.113 */
964 BE_REROUTE_OUTCOME, /* Reroute complete outcome 3.2.2.114 */
965 BE_GLOBAL_CALL_REF, /* Global Call Reference 3.2.2.115 */
966 BE_LCLS_CONF, /* LCLS-Configuration 3.2.2.116 */
967 BE_LCLS_CON_STATUS_CONTROL, /* LCLS-Connection-Status-Control 3.2.2.117 */
968 BE_LCLS_CORR_NOT_NEEDED, /* LCLS-Correlation-Not-Needed 3.2.2.118 */
969 BE_LCLS_BSS_STATUS, /* LCLS-BSS-Status 3.2.2.119 */
970 BE_LCLS_BREAK_REQ, /* LCLS-Break-Request 3.2.2.120 */
971 BE_CSFB_IND, /* CSFB Indication 3.2.2.121 */
972 BE_CS_TO_PS_SRVCC, /* CS to PS SRVCC 3.2.2.122 */
973 BE_SRC_ENB_2_TGT_ENB_TRANSP_INF, /* Source eNB to target eNB transparent information (E-UTRAN)" 3.2.2.123 */
974 BE_CS_TO_PS_SRVCC_IND, /* CS to PS SRVCC Indication 3.2.2.124 */
975 BE_CN_TO_MS_TRANSP, /* CN to MS transparent information 3.2.2.125 */
976 BE_SELECTED_PLMN_ID, /* Selected PLMN ID 3.2.2.126 */
977 BE_LAST_USED_EUTRAN_PLMN_ID, /* Last used E - UTRAN PLMN ID 3.2.2.127 */
978 BE_UDEF_150, /* Undefined Old Location Area Identification 3.2.2.128 */
979 BE_UDEF_151, /* Undefined Attach Indicator 3.2.2.129 */
980 BE_UDEF_152, /* Undefined Selected Operator 3.2.2.130 */
981 BE_UDEF_153, /* Undefined PS Registered Operator 3.2.2.131 */
982 BE_UDEF_154, /* Undefined CS Registered Operator 3.2.2.132*/
983 BE_UDEF_155, /* Undefined */
984 BE_UDEF_156, /* Undefined */
985 BE_UDEF_157, /* Undefined */
986 BE_UDEF_158, /* Undefined */
987 BE_UDEF_159, /* Undefined */
988 BE_UDEF_160, /* Undefined */
989 BE_UDEF_161, /* Undefined */
990 BE_UDEF_162, /* Undefined */
991 BE_UDEF_163, /* Undefined */
992 BE_UDEF_164, /* Undefined */
993 BE_UDEF_165, /* Undefined */
994 BE_UDEF_166, /* Undefined */
995 BE_UDEF_167, /* Undefined */
996 BE_UDEF_168, /* Undefined */
997 BE_UDEF_169, /* Undefined */
998 BE_UDEF_170, /* Undefined */
999 BE_UDEF_171, /* Undefined */
1000 BE_UDEF_172, /* Undefined */
1001 BE_UDEF_173, /* Undefined */
1002 BE_UDEF_174, /* Undefined */
1003 BE_UDEF_175, /* Undefined */
1004 BE_UDEF_176, /* Undefined */
1005 BE_UDEF_177, /* Undefined */
1006 BE_UDEF_178, /* Undefined */
1007 BE_UDEF_179, /* Undefined */
1008 BE_UDEF_180, /* Undefined */
1009 BE_UDEF_181, /* Undefined */
1010 BE_UDEF_182, /* Undefined */
1011 BE_UDEF_183, /* Undefined */
1012 BE_UDEF_184, /* Undefined */
1013 BE_UDEF_185, /* Undefined */
1014 BE_UDEF_186, /* Undefined */
1015 BE_UDEF_187, /* Undefined */
1016 BE_UDEF_188, /* Undefined */
1017 BE_UDEF_189, /* Undefined */
1018 BE_UDEF_190, /* Undefined */
1019 BE_UDEF_191, /* Undefined */
1020 BE_UDEF_192, /* Undefined */
1021 BE_UDEF_193, /* Undefined */
1022 BE_UDEF_194, /* Undefined */
1023 BE_UDEF_195, /* Undefined */
1024 BE_UDEF_196, /* Undefined */
1025 BE_UDEF_197, /* Undefined */
1026 BE_UDEF_198, /* Undefined */
1027 BE_UDEF_199, /* Undefined */
1028 BE_UDEF_200, /* Undefined */
1029 BE_UDEF_201, /* Undefined */
1030 BE_UDEF_202, /* Undefined */
1031 BE_UDEF_203, /* Undefined */
1032 BE_UDEF_204, /* Undefined */
1033 BE_UDEF_205, /* Undefined */
1034 BE_UDEF_206, /* Undefined */
1035 BE_UDEF_207, /* Undefined */
1036 BE_UDEF_208, /* Undefined */
1037 BE_UDEF_209, /* Undefined */
1038 BE_UDEF_210, /* Undefined */
1039 BE_UDEF_211, /* Undefined */
1040 BE_UDEF_212, /* Undefined */
1041 BE_UDEF_213, /* Undefined */
1042 BE_UDEF_214, /* Undefined */
1043 BE_UDEF_215, /* Undefined */
1044 BE_UDEF_216, /* Undefined */
1045 BE_UDEF_217, /* Undefined */
1046 BE_UDEF_218, /* Undefined */
1047 BE_UDEF_219, /* Undefined */
1048 BE_UDEF_220, /* Undefined */
1049 BE_UDEF_221, /* Undefined */
1050 BE_UDEF_222, /* Undefined */
1051 BE_UDEF_223, /* Undefined */
1052 BE_UDEF_224, /* Undefined */
1053 BE_UDEF_225, /* Undefined */
1054 BE_UDEF_226, /* Undefined */
1055 BE_UDEF_227, /* Undefined */
1056 BE_UDEF_228, /* Undefined */
1057 BE_UDEF_229, /* Undefined */
1058 BE_UDEF_230, /* Undefined */
1059 BE_UDEF_231, /* Undefined */
1060 BE_UDEF_232, /* Undefined */
1061 BE_UDEF_233, /* Undefined */
1062 BE_UDEF_234, /* Undefined */
1063 BE_UDEF_235, /* Undefined */
1064 BE_UDEF_236, /* Undefined */
1065 BE_UDEF_237, /* Undefined */
1066 BE_UDEF_238, /* Undefined */
1067 BE_UDEF_239, /* Undefined */
1068 BE_OSMOCOM_OSMUX_SUPPORT = 0xf0, /* Osmocom extension: Osmux Support */
1069 BE_OSMOCOM_OSMUX_CID = 0xf1, /* Osmocom extension: Osmux CID */
1070 BE_NONE /* NONE */
1071}
1072bssmap_elem_idx_t;
1073#endif
1074
1075#define NUM_GSM_BSSMAP_ELEM(sizeof (gsm_bssmap_elem_strings) / sizeof (gsm_bssmap_elem_strings
)[0])
array_length(gsm_bssmap_elem_strings)(sizeof (gsm_bssmap_elem_strings) / sizeof (gsm_bssmap_elem_strings
)[0])
1076int ett_gsm_bssmap_elem[NUM_GSM_BSSMAP_ELEM(sizeof (gsm_bssmap_elem_strings) / sizeof (gsm_bssmap_elem_strings
)[0])
];
1077
1078/*
1079 * [2] 3.2.2.2 Circuit Identity Code
1080 */
1081static uint16_t
1082be_cic(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string, int string_len)
1083{
1084 uint32_t curr_offset;
1085 uint32_t value;
1086
1087 curr_offset = offset;
1088
1089 value = tvb_get_ntohs(tvb, curr_offset);
1090
1091 proto_tree_add_item(tree, hf_gsm_a_bssmap_pcm_multiplexer, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1092 proto_tree_add_item(tree, hf_gsm_a_bssmap_timeslot, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1093 curr_offset += 2;
1094
1095 if (add_string)
1096 snprintf(add_string, string_len, " - (%u) (0x%04x)", value, value);
1097
1098 /* no length check possible */
1099
1100 return curr_offset-offset;
1101}
1102/*
1103 * 3.2.2.3 Connection Release Requested
1104 * No Data
1105 */
1106
1107/*
1108 * 3.2.2.4 Resource Available
1109 */
1110static uint16_t
1111be_res_avail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1112{
1113 uint32_t curr_offset;
1114 uint16_t value;
1115 int i;
1116 proto_item* ti;
1117
1118 curr_offset = offset;
1119
1120 for (i=0; i < 5; i++) {
1121 value = tvb_get_ntohl(tvb, curr_offset);
1122 ti = proto_tree_add_uint_format(tree, hf_gsm_a_bssmap_full_rate_channels_available, tvb, curr_offset, 2, value, "Number of full rate channels available in band %u %u",i+1,value);
1123 proto_item_set_len(ti, len);
1124 curr_offset+=2;
1125 ti = proto_tree_add_uint_format(tree, hf_gsm_a_bssmap_half_rate_channels_available, tvb, curr_offset, 2, value, "Number of half rate channels available in band %u %u",i+1, value);
1126 proto_item_set_len(ti, len);
1127 curr_offset+=2;
1128 }
1129
1130
1131 return len;
1132}
1133/*
1134 * [2] 3.2.2.5 Cause
1135 */
1136static const value_string cause_class_vals[] = {
1137 { 0, "Normal Event"},
1138 { 1, "Normal Event"},
1139 { 2, "Resource Unavailable"},
1140 { 3, "Service or option not available"},
1141 { 4, "Service or option not implemented"},
1142 { 5, "Invalid message (e.g., parameter out of range)"},
1143 { 6, "Protocol error"},
1144 { 7, "Interworking"},
1145 { 0, NULL((void*)0) }
1146};
1147
1148static const range_string gsm_a_bssap_cause_rvals[] = {
1149 { 0x00, 0x00, "Radio interface message failure" },
1150 { 0x01, 0x01, "Radio interface failure" },
1151 { 0x02, 0x02, "Uplink quality" },
1152 { 0x03, 0x03, "Uplink strength" },
1153 { 0x04, 0x04, "Downlink quality" },
1154 { 0x05, 0x05, "Downlink strength" },
1155 { 0x06, 0x06, "Distance" },
1156 { 0x07, 0x07, "O and M intervention" },
1157 { 0x08, 0x08, "Response to MSC invocation" },
1158 { 0x09, 0x09, "Call control" },
1159 { 0x0a, 0x0a, "Radio interface failure, reversion to old channel" },
1160 { 0x0b, 0x0b, "Handover successful" },
1161 { 0x0c, 0x0c, "Better Cell" },
1162 { 0x0d, 0x0d, "Directed Retry" },
1163 { 0x0e, 0x0e, "Joined group call channel" },
1164 { 0x0f, 0x0f, "Traffic" },
1165 { 0x10, 0x10, "Reduce load in serving cell" },
1166 { 0x11, 0x11, "Traffic load in target cell higher than in source cell" },
1167 { 0x12, 0x12, "Relocation triggered" },
1168 { 0x14, 0x14, "Requested option not authorised" },
1169 { 0x15, 0x15, "Alternative channel configuration requested" },
1170 { 0x16, 0x16, "Response to an INTERNAL HANDOVER ENQUIRY message" },
1171 { 0x17, 0x17, "INTERNAL HANDOVER ENQUIRY reject" },
1172 { 0x18, 0x18, "Redundancy Level not adequate" },
1173 { 0x19, 0x1f, "Reserved for national use" },
1174 { 0x20, 0x20, "Equipment failure" },
1175 { 0x21, 0x21, "No radio resource available" },
1176 { 0x22, 0x22, "Requested terrestrial resource unavailable" },
1177 { 0x23, 0x23, "CCCH overload" },
1178 { 0x24, 0x24, "Processor overload" },
1179 { 0x25, 0x25, "BSS not equipped" },
1180 { 0x26, 0x26, "MS not equipped" },
1181 { 0x27, 0x27, "Invalid cell" },
1182 { 0x28, 0x28, "Traffic Load" },
1183 { 0x29, 0x29, "Preemption" },
1184 { 0x2a, 0x2a, "DTM Handover - SGSN Failure" },
1185 { 0x2b, 0x2b, "DTM Handover - PS Allocation failure" },
1186 { 0x2c, 0x2f, "Reserved for national use" },
1187 { 0x30, 0x30, "Requested transcoding/rate adaption unavailable" },
1188 { 0x31, 0x31, "Circuit pool mismatch" },
1189 { 0x32, 0x32, "Switch circuit pool" },
1190 { 0x33, 0x33, "Requested speech version unavailable" },
1191 { 0x34, 0x34, "LSA not allowed" },
1192 { 0x35, 0x35, "Requested Codec Type or Codec Configuration unavailable" },
1193 { 0x36, 0x36, "Requested A-Interface Type unavailable" },
1194 { 0x37, 0x37, "Invalid CSG cell" },
1195 { 0x38, 0x3e, "Reserved for international use" },
1196 { 0x3f, 0x3f, "Requested Redundancy Level not available" },
1197 { 0x40, 0x40, "Ciphering algorithm not supported" },
1198 { 0x41, 0x41, "GERAN Iu-mode failure" },
1199 { 0x42, 0x42, "Incoming Relocation Not Supported Due To PUESBINE Feature" },
1200 { 0x43, 0x43, "Access Restricted Due to Shared Networks" },
1201 { 0x44, 0x44, "Requested Codec Type or Codec Configuration not supported" },
1202 { 0x45, 0x45, "Requested A-Interface Type not supported" },
1203 { 0x46, 0x46, "Requested Redundancy Level not supported" },
1204 { 0x47, 0x47, "Reserved for international use" },
1205 { 0x48, 0x4f, "Reserved for national use" },
1206 { 0x50, 0x50, "Terrestrial circuit already allocated" },
1207 { 0x51, 0x51, "Invalid message contents" },
1208 { 0x52, 0x52, "Information element or field missing" },
1209 { 0x53, 0x53, "Incorrect value" },
1210 { 0x54, 0x54, "Unknown Message type" },
1211 { 0x55, 0x55, "Unknown Information Element" },
1212 { 0x56, 0x56, "DTM Handover - Invalid PS Indication" },
1213 { 0x57, 0x57, "Call Identifier already allocated" },
1214 { 0x58, 0x5f, "Reserved for national use" },
1215 { 0x60, 0x60, "Protocol Error between BSS and MSC" },
1216 { 0x61, 0x61, "VGCS/VBS call non existent" },
1217 { 0x62, 0x62, "DTM Handover - Timer Expiry" },
1218 { 0x63, 0x67, "Reserved for international use" },
1219 { 0x68, 0x6f, "Reserved for national use" },
1220 { 0x70, 0x77, "Reserved for international use" },
1221 { 0x78, 0x7f, "Reserved for national use" },
1222
1223 { 0, 0, NULL((void*)0) },
1224};
1225
1226/* non-static for packet-gsm_gsup.c */
1227uint16_t
1228bssmap_dissect_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
1229{
1230 uint8_t oct;
1231 uint32_t curr_offset;
1232
1233 curr_offset = offset;
1234
1235 oct = tvb_get_uint8(tvb, curr_offset);
1236
1237 proto_tree_add_item(tree, hf_gsm_a_bssmap_cause_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1238
1239 if (oct & 0x80)
1240 {
1241 /* 2 octet cause */
1242
1243 if ((oct & 0x0f) == 0x00)
1244 {
1245 /* national cause */
1246
1247 proto_tree_add_item(tree, hf_gsm_a_bssmap_cause_class, tvb, curr_offset, 1, ENC_NA0x00000000);
1248 proto_tree_add_item(tree, hf_gsm_a_bssmap_national_cause, tvb, curr_offset, 1, ENC_NA0x00000000);
1249 curr_offset++;
1250
1251 proto_tree_add_item(tree, hf_gsm_a_bssmap_cause_value, tvb, curr_offset, 1, ENC_NA0x00000000);
1252 curr_offset++;
1253
1254 if (add_string)
1255 snprintf(add_string, string_len, " - (National Cause)");
1256 }
1257 else
1258 {
1259 proto_tree_add_item(tree, hf_gsm_a_bssmap_cause16, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1260 curr_offset+=2;
1261 }
1262 }
1263 else
1264 {
1265 proto_tree_add_item(tree, hf_gsm_a_bssmap_cause,
1266 tvb, curr_offset, 1, ENC_NA0x00000000);
1267
1268 curr_offset++;
1269
1270 if (add_string)
1271 snprintf(add_string, string_len, " - (%u) %s", oct & 0x7f,
1272 rval_to_str_const(oct & 0x7f, gsm_a_bssap_cause_rvals, "Unknown"));
1273 }
1274
1275 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
1276
1277 return curr_offset-offset;
1278}
1279/*
1280 * 3.2.2.6 IMSI
1281 * IMSI coded as the value part of the Mobile Identity IE defined in 3GPP TS 24.008 (NOTE 1)
1282 * NOTE 1: The Type of identity field in the Mobile Identity IE shall be ignored by the receiver.
1283 * Dissected in packet-gsm_a_common.c (de_mid)
1284 */
1285
1286/*
1287 * [2] 3.2.2.7 TMSI
1288 */
1289static uint16_t
1290be_tmsi(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
1291{
1292 uint32_t curr_offset;
1293 uint32_t value;
1294
1295 curr_offset = offset;
1296
1297 value = tvb_get_ntohl(tvb, curr_offset);
1298
1299 proto_tree_add_uint(tree, hf_gsm_a_tmsi,
1300 tvb, curr_offset, 4,
1301 value);
1302
1303 if (add_string)
1304 snprintf(add_string, string_len, " - (0x%04x)", value);
1305
1306 curr_offset += 4;
1307
1308 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
1309
1310 return curr_offset-offset;
1311}
1312
1313/*
1314 * [2] 3.2.2.8 Number Of MSs
1315 */
1316static uint16_t
1317be_num_ms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1318{
1319 uint32_t curr_offset;
1320
1321 curr_offset = offset;
1322
1323 proto_tree_add_item(tree, hf_gsm_a_bssmap_num_ms, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1324 curr_offset++;
1325
1326 /* no length check possible */
1327
1328 return curr_offset-offset;
1329}
1330/*
1331 * [2] 3.2.2.9 Layer 3 Header Information
1332 */
1333static uint16_t
1334be_l3_header_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1335{
1336 uint32_t curr_offset = offset;
1337
1338 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
1339
1340 proto_tree_add_item(tree, hf_gsm_a_L3_protocol_discriminator, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1341
1342 curr_offset++;
1343
1344 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1345
1346 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
1347 proto_tree_add_item(tree, hf_gsm_a_bssmap_ti_flag, tvb, curr_offset, 1, ENC_NA0x00000000);
1348 proto_tree_add_item(tree, hf_gsm_a_bssmap_tio, tvb, curr_offset, 1, ENC_NA0x00000000);
1349 curr_offset++;
1350
1351 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
1352
1353 return curr_offset-offset;
1354}
1355
1356/*
1357 * [2] 3.2.2.10 Encryption Information
1358 */
1359static const true_false_string tfs_permitted_not_permitted = { "Permitted", "Not permitted" };
1360
1361static uint16_t
1362be_enc_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1363{
1364 uint32_t curr_offset = offset;
1365
1366 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_7, tvb, curr_offset, 1, ENC_NA0x00000000);
1367 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_6, tvb, curr_offset, 1, ENC_NA0x00000000);
1368 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_5, tvb, curr_offset, 1, ENC_NA0x00000000);
1369 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_4, tvb, curr_offset, 1, ENC_NA0x00000000);
1370 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_3, tvb, curr_offset, 1, ENC_NA0x00000000);
1371 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_2, tvb, curr_offset, 1, ENC_NA0x00000000);
1372 proto_tree_add_item(tree, hf_gsm_a_bssmap_gsm_a5_1, tvb, curr_offset, 1, ENC_NA0x00000000);
1373 proto_tree_add_item(tree, hf_gsm_a_bssmap_no_encryption, tvb, curr_offset, 1, ENC_NA0x00000000);
1374 curr_offset++;
1375
1376 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1377
1378 proto_tree_add_item(tree, hf_gsm_a_bssmap_enc_info_key, tvb, curr_offset, len - (curr_offset - offset), ENC_NA0x00000000);
1379
1380 curr_offset += len - (curr_offset - offset);
1381
1382 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
1383
1384 return curr_offset-offset;
1385}
1386
1387/*
1388 * [2] 3.2.2.11 Channel Type
1389 */
1390
1391static const value_string gsm_a_bssap_speech_data_ind_vals[] = {
1392 { 0x0, "Reserved"},
1393 { 0x1, "Speech"},
1394 { 0x2, "Data"},
1395 { 0x3, "Signalling"},
1396 { 0x4, "Speech + CTM Text Telephony"},
1397 { 0x5, "Reserved"},
1398 { 0x6, "Reserved"},
1399 { 0x7, "Reserved"},
1400 { 0x8, "Reserved"},
1401 { 0x9, "Reserved"},
1402 { 0xa, "Reserved"},
1403 { 0xb, "Reserved"},
1404 { 0xc, "Reserved"},
1405 { 0xd, "Reserved"},
1406 { 0xe, "Reserved"},
1407 { 0xf, "Reserved"},
1408 { 0, NULL((void*)0) }
1409};
1410
1411/* Channel Rate and Type */
1412static const value_string gsm_a_bssap_channel_rate_and_type_vals[] = {
1413 { 0x08, "Full rate TCH channel Bm. Prefer full rate TCH"},
1414 { 0x09, "Half rate TCH channel Lm. Prefer half rate TCH"},
1415 { 0x0a, "Full or Half rate channel, Full rate preferred changes allowed after first allocation"},
1416 { 0x0b, "Full or Half rate channel, Half rate preferred changes allowed after first allocation"},
1417 { 0x0f, "Full or Half rate channel, changes allowed after first allocation"},
1418 { 0x1a, "Full or Half rate channel, Full rate preferred changes between full and half rate not allowed after first allocation"},
1419 { 0x1b, "Full or Half rate channel, Half rate preferred changes between full and half rate not allowed after first allocation"},
1420 { 0x1f, "Full or Half rate channel, changes between full and half rate not allowed after first allocation"},
1421 { 0, NULL((void*)0) }
1422};
1423
1424static const range_string gsm_a_bssap_channel_rate_and_type_rvals[] = {
1425 { 0x00, 0x00, "SDCCH or Full rate TCH channel Bm or Half rate TCH channel Lm" },
1426 { 0x01, 0x01, "SDCCH" },
1427 { 0x02, 0x02, "SDCCH or Full rate TCH channel Bm" },
1428 { 0x03, 0x03, "Half rate TCH channel Lm" },
1429 { 0x04, 0x07, "Reserved" },
1430 { 0x08, 0x08, "Full rate TCH channel Bm" },
1431 { 0x09, 0x09, "Half rate TCH channel Lm" },
1432 { 0x0a, 0x0a, "Full or Half rate TCH channel, Full rate preferred, changes allowed also after first channel allocation as a result of the request" },
1433 { 0x0b, 0x0b, "Full or Half rate TCH channel, Half rate preferred, changes allowed also after first channel allocation as a result of the request" },
1434 { 0x0c, 0x19, "Reserved" },
1435 { 0x1a, 0x1a, "Full or Half rate TCH channel, Full rate preferred, changes allowed also after first channel allocation as a result of the request" },
1436 { 0x1b, 0x1b, "Full or Half rate TCH channel, Half rate preferred, changes allowed also after first channel allocation as a result of the request" },
1437 { 0x1c, 0x1f, "Reserved" },
1438 { 0x20, 0x27, "Full rate TCH channels in a multislot configuration, changes by the BSS of the number of TCHs and if applicable the used radio interface rate per channel allowed after first channel allocation as a result of the request" },
1439 { 0x28, 0x2f, "Reserved" },
1440 { 0x30, 0x37, "Full rate TCH channels in a multislot configuration, changes by the BSS of the number of TCHs or the used radio interface rate per channel not allowed after first channel allocation as a result of the request" },
1441 { 0x38, 0xff, "Reserved" },
1442 { 0, 0, NULL((void*)0) },
1443};
1444
1445static const true_false_string tfs_non_transparent_transparent = {"Non-Transparent", "Transparent"};
1446
1447uint16_t
1448be_chan_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
1449{
1450 uint8_t oct;
1451 uint8_t sdi;
1452 uint8_t num_chan;
1453 uint32_t curr_offset = offset;
1454 const char *str;
1455
1456 oct = tvb_get_uint8(tvb, curr_offset);
1457 sdi = oct & 0x0f;
1458
1459 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
1460 proto_tree_add_item(tree, hf_gsm_a_bssmap_speech_data_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1461
1462 if (add_string)
1463 snprintf(add_string, string_len, " - (%s)", val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
1464 gsm_a_bssap_speech_data_ind_vals,
1465 "Unknown"));
1466
1467 curr_offset++;
1468
1469 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1470
1471 oct = tvb_get_uint8(tvb, curr_offset);
1472
1473 if ((sdi == 0x01)||(sdi == 0x04))
1474 {
1475 /* speech */
1476 proto_tree_add_item(tree, hf_gsm_a_bssmap_channel_rate_and_type, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1477 curr_offset++;
1478 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1479
1480 do
1481 {
1482 proto_tree_add_item(tree, hf_gsm_a_bssmap_chan_type_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1483 proto_tree_add_item(tree, hf_gsm_a_bssmap_perm_speech_v_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1484 curr_offset++;
1485 }
1486 while ((len - (curr_offset - offset)) > 0);
1487 }
1488 else if (sdi == 0x02)
1489 {
1490 /* data */
1491
1492 num_chan = 0;
1493
1494 if ((oct >= 0x20) && (oct <= 0x27))
1495 {
1496 num_chan = (oct - 0x20) + 1;
1497 }
1498 else if ((oct >= 0x30) && (oct <= 0x37))
1499 {
1500 num_chan = (oct - 0x30) + 1;
1501 }
1502
1503 if (num_chan > 0)
1504 {
1505 proto_tree_add_uint_format_value(tree, hf_gsm_a_bssmap_data_channel_rate_and_type,
1506 tvb, curr_offset, 1, oct, "Max channels %u, %s",
1507 num_chan, rval_to_str_const(oct, gsm_a_bssap_channel_rate_and_type_rvals, "Reserved"));
1508 }
1509 else
1510 {
1511 proto_tree_add_item(tree, hf_gsm_a_bssmap_data_channel_rate_and_type,
1512 tvb, curr_offset, 1, ENC_NA0x00000000);
1513 }
1514
1515 curr_offset++;
1516
1517 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1518
1519 oct = tvb_get_uint8(tvb, curr_offset);
1520
1521 proto_tree_add_item(tree, hf_gsm_a_bssmap_chan_type_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1522 proto_tree_add_item(tree, hf_gsm_a_bssmap_transparent_service, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1523
1524 if (num_chan == 0)
1525 {
1526 if (oct & 0x40)
1527 {
1528 /* non-transparent */
1529
1530 switch (oct & 0x3f)
1531 {
1532 case 0x00: str = "12 kbit/s if the channel is a full rate TCH, or 6 kbit/s if the channel is a half rate TCH"; break;
1533 case 0x18: str = "14.5 kbit/s"; break;
1534 case 0x10: str = "12 kbits/s"; break;
1535 case 0x11: str = "6 kbits/s"; break;
1536 case 0x31: str = "29 kbit/s"; break;
1537 case 0x34: str = "43,5 kbit/s"; break;
1538 default:
1539 str = "Reserved";
1540 break;
1541 }
1542 }
1543 else
1544 {
1545 switch (oct & 0x3f)
1546 {
1547 case 0x18: str = "14.4 kbit/s"; break;
1548 case 0x10: str = "9.6kbit/s"; break;
1549 case 0x11: str = "4.8kbit/s"; break;
1550 case 0x12: str = "2.4kbit/s"; break;
1551 case 0x13: str = "1.2Kbit/s"; break;
1552 case 0x14: str = "600 bit/s"; break;
1553 case 0x15: str = "1200/75 bit/s (1200 network-to-MS / 75 MS-to-network)"; break;
1554 case 0x39: str = "28,8 kbit/s"; break;
1555 case 0x3a: str = "32,0 kbit/s"; break;
1556 default:
1557 str = "Reserved";
1558 break;
1559 }
1560 }
1561 }
1562 else
1563 {
1564 if (oct & 0x40)
1565 {
1566 /* non-transparent */
1567
1568 switch (oct & 0x3f)
1569 {
1570 case 0x16: str = "58 kbit/s (4x14.5 kbit/s)"; break;
1571 case 0x14: str = "48.0 / 43.5 kbit/s (4x12 kbit/s or 3x14.5 kbit/s)"; break;
1572 case 0x13: str = "36.0 / 29.0 kbit/s (3x12 kbit/s or 2x14.5 kbit/s)"; break;
1573 case 0x12: str = "24.0 / 24.0 (4x6 kbit/s or 2x12 kbit/s)"; break;
1574 case 0x11: str = "18.0 / 14.5 kbit/s (3x6 kbit/s or 1x14.5 kbit/s)"; break;
1575 case 0x10: str = "12.0 / 12.0 kbit/s (2x6 kbit/s or 1x12 kbit/s)"; break;
1576 default:
1577 str = "Reserved";
1578 break;
1579 }
1580 }
1581 else
1582 {
1583 switch (oct & 0x3f)
1584 {
1585 case 0x1f: str = "64 kbit/s, bit transparent"; break;
1586 case 0x1e: str = "56 kbit/s, bit transparent"; break;
1587 case 0x1d: str = "56 kbit/s"; break;
1588 case 0x1c: str = "48 kbit/s"; break;
1589 case 0x1b: str = "38.4 kbit/s"; break;
1590 case 0x1a: str = "28.8 kbit/s"; break;
1591 case 0x19: str = "19.2 kbit/s"; break;
1592 case 0x18: str = "14.4 kbit/s"; break;
1593 case 0x10: str = "9.6 kbit/s"; break;
1594 default:
1595 str = "Reserved";
1596 break;
1597 }
1598 }
1599 }
1600
1601 proto_tree_add_uint_format_value(tree, hf_gsm_a_bssmap_rate,
1602 tvb, curr_offset, 1, oct & 0x3f, "%s", str);
1603
1604 curr_offset++;
1605
1606 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1607
1608 proto_tree_add_item(tree, hf_gsm_a_bssmap_chan_type_extension, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1609
1610 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+1, 3, ENC_BIG_ENDIAN0x00000000);
1611
1612 if (num_chan == 0)
1613 {
1614 proto_tree_add_item(tree, hf_gsm_a_bssmap_tch_14_5kb, tvb, curr_offset, 1, ENC_NA0x00000000);
1615 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+6, 1, ENC_BIG_ENDIAN0x00000000);
1616 proto_tree_add_item(tree, hf_gsm_a_bssmap_tch_12kb, tvb, curr_offset, 1, ENC_NA0x00000000);
1617 proto_tree_add_item(tree, hf_gsm_a_bssmap_tch_6kb, tvb, curr_offset, 1, ENC_NA0x00000000);
1618 }
1619 else
1620 {
1621 proto_tree_add_item(tree, hf_gsm_a_bssmap_tch_14_5_14_4kb, tvb, curr_offset, 1, ENC_NA0x00000000);
1622 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+6, 1, ENC_BIG_ENDIAN0x00000000);
1623 proto_tree_add_item(tree, hf_gsm_a_bssmap_tch_12_9kb, tvb, curr_offset, 1, ENC_NA0x00000000);
1624 proto_tree_add_item(tree, hf_gsm_a_bssmap_tch_6_4_8kb, tvb, curr_offset, 1, ENC_NA0x00000000);
1625 }
1626
1627 curr_offset++;
1628 }
1629 else if (sdi == 0x03)
1630 {
1631 /* signalling */
1632 proto_tree_add_item(tree, hf_gsm_a_bssmap_data_channel_rate_and_type,
1633 tvb, curr_offset, 1, ENC_NA0x00000000);
1634
1635 curr_offset++;
1636
1637 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1638
1639 proto_tree_add_item(tree, hf_gsm_a_bssmap_spare, tvb, curr_offset, len - (curr_offset - offset), ENC_NA0x00000000);
1640
1641 curr_offset += len - (curr_offset - offset);
1642 }
1643 else
1644 {
1645 /* unknown format */
1646
1647 proto_tree_add_item(tree, hf_gsm_a_bssmap_unknown_format, tvb, curr_offset, len - (curr_offset - offset), ENC_NA0x00000000);
1648
1649 curr_offset += len - (curr_offset - offset);
1650 }
1651
1652 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
1653
1654 return curr_offset-offset;
1655}
1656/*
1657 * 3.2.2.12 Periodicity
1658 */
1659static uint16_t
1660be_periodicity(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1661{
1662 uint32_t curr_offset;
1663
1664 curr_offset = offset;
1665 proto_tree_add_item(tree, hf_gsm_a_bssmap_periodicity, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1666 curr_offset++;
1667
1668 return curr_offset-offset;
1669}
1670/*
1671 * 3.2.2.13 Extended Resource Indicator
1672 */
1673#if 0
1674static const true_false_string bssmap_tarr_vals = {
1675 "The total number of accessible channels is requested",
1676 "No extra Resource Information is requested"
1677};
1678#endif
1679static uint16_t
1680be_ext_res_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1681{
1682 uint32_t curr_offset;
1683
1684 curr_offset = offset;
1685
1686 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 6, ENC_BIG_ENDIAN0x00000000);
1687 /* the Subsequent Mode field */
1688 proto_tree_add_item(tree, hf_gsm_a_bssmap_sm, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1689 /* Total Accessible Resource Requested field */
1690 proto_tree_add_item(tree, hf_gsm_a_bssmap_tarr, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1691 curr_offset++;
1692
1693
1694 return curr_offset-offset;
1695}
1696/*
1697 * 3.2.2.14 Total Resource Accessible
1698 */
1699static uint16_t
1700be_tot_res_acc(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1701{
1702 uint32_t curr_offset;
1703
1704 curr_offset = offset;
1705
1706 /* Total number of accessible full rate channels */
1707 proto_tree_add_item(tree, hf_gsm_a_bssmap_tot_no_of_fullr_ch, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1708 curr_offset+=2;
1709 /* Total number of accessible half rate channels */
1710 proto_tree_add_item(tree, hf_gsm_a_bssmap_tot_no_of_hr_ch, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1711 /*curr_offset+=2;*/
1712
1713
1714 return len;
1715}
1716/*
1717 * 3.2.2.15 LSA Identifier
1718 * The octets 3-5 are coded as specified in 3GPP TS 23.003, 'Identification of Localised Service Area'. Bit 8 of octet 3 is the MSB.
1719 */
1720static uint16_t
1721be_lsa_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1722{
1723 uint32_t curr_offset;
1724
1725 curr_offset = offset;
1726
1727 /* TS 23.003:
1728 * The LSA ID consists of 24 bits, numbered from 0 to 23, with bit 0 being the LSB.
1729 * Bit 0 indicates whether the LSA is a PLMN significant number or a universal LSA.
1730 * If the bit is set to 0 the LSA is a PLMN significant number; if it is set to
1731 * 1 it is a universal LSA.
1732 */
1733 proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_id, tvb, curr_offset, 3, ENC_BIG_ENDIAN0x00000000);
1734 /*curr_offset+=3;*/
1735
1736
1737 return len;
1738}
1739
1740
1741/*
1742 * 3.2.2.16 LSA Identifier List
1743 */
1744static uint16_t
1745be_lsa_id_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1746{
1747 uint32_t curr_offset;
1748
1749 curr_offset = offset;
1750
1751 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, ENC_BIG_ENDIAN0x00000000);
1752 proto_tree_add_item(tree, hf_gsm_a_bssmap_ep, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1753 curr_offset++;
1754
1755 /* LSA identification 1 - n */
1756
1757 while (curr_offset-offset < len) {
1758 proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_id, tvb, curr_offset, 3, ENC_BIG_ENDIAN0x00000000);
1759 curr_offset+=3;
1760 }
1761
1762 return len;
1763}
1764/*
1765 * [2] 3.2.2.17 Cell Identifier
1766 * Formats everything after the discriminator, shared function
1767 */
1768uint16_t
1769be_cell_id_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len, uint8_t disc, e212_number_type_t number_type)
1770{
1771 uint32_t value;
1772 uint32_t curr_offset;
1773
1774 if (add_string)
1775 add_string[0] = '\0';
1776 curr_offset = offset;
1777
1778 switch (disc)
1779 {
1780 case 0x00:
1781 /* FALLTHRU */
1782
1783 case 0x04:
1784 /* FALLTHRU */
1785
1786 case 0x08: /* For intersystem handover from GSM to UMTS or cdma2000: */
1787 /* FALLTHRU */
1788 case 0xb:
1789 /* Serving Area Identity, SAI, is used to identify the Serving Area of UE
1790 * within UTRAN or cdma2000.
1791 * Coding of Cell Identification for Cell identification discriminator = 1011
1792 * The coding of SAI is defined in 3GPP TS 25.413, without the protocol extension
1793 * container.
1794 * TS 25.413:
1795 * SAI ::= SEQUENCE {
1796 * pLMNidentity PLMNidentity,
1797 * lAC LAC,
1798 * sAC SAC,
1799 * iE-Extensions ProtocolExtensionContainer { {SAI-ExtIEs} } OPTIONAL
1800 * }
1801 */
1802 /* FALLTHRU */
1803 case 0x0c: /* For identification of a UTRAN cell for cell load information: */
1804 if (disc != 0x0b)
1805 curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, number_type, true1);
1806 else
1807 curr_offset = dissect_e212_mcc_mnc(tvb, pinfo, tree, curr_offset, number_type, false0);
1808 /* FALLTHRU */
1809
1810 case 0x01:
1811 case 0x05:
1812 case 0x0a: /*For intersystem handover from GSM to UMTS or cdma2000: */
1813 /* LAC */
1814 value = tvb_get_ntohs(tvb, curr_offset);
1815 proto_tree_add_item(tree, hf_gsm_a_bssmap_cell_lac, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1816 curr_offset += 2;
1817
1818 if (add_string)
1819 snprintf(add_string, string_len, " - LAC (0x%04x)", value);
1820 if (disc == 0x0b) {
1821 /* If SAI, SAC follows */
1822 value = tvb_get_ntohs(tvb, curr_offset);
1823 proto_tree_add_item(tree, hf_gsm_a_bssmap_sac, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1824 if (add_string) {
1825 char *str = ws_strdup_printf("%s/SAC (%u)", add_string, value)wmem_strdup_printf(((void*)0), "%s/SAC (%u)", add_string, value
)
;
1826 (void) g_strlcpy(add_string, str, string_len);
1827 g_free(str)(__builtin_object_size ((str), 0) != ((size_t) - 1)) ? g_free_sized
(str, __builtin_object_size ((str), 0)) : (g_free) (str)
;
1828 }
1829 curr_offset += 2;
1830 break;
1831 }
1832 /* FALLTHRU */
1833
1834 case 0x09: /* For intersystem handover from GSM to UMTS or cdma2000: */
1835
1836 if ((disc == 0x08) ||(disc == 0x09) || (disc == 0x0a)|| (disc == 0x0c)) {
1837 /* RNC-ID
1838 * The octets 9-10 are coded as the RNC-ID (0..4095) or the
1839 * Extended RNC-ID (4096..65535) specified in 3GPP TS 25.413 [31]:
1840 * XXX is this a PER encoded number?
1841 */
1842 value = tvb_get_ntohs(tvb, curr_offset);
1843 proto_tree_add_item(tree, hf_gsm_a_bssmap_be_rnc_id, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
1844 curr_offset += 2;
1845
1846 if (add_string)
1847 {
1848 if (add_string[0] == '\0')
1849 {
1850 snprintf(add_string, string_len, " - RNC-ID (%u)", value);
1851 }
1852 else
1853 {
1854 char *str = ws_strdup_printf("%s/RNC-ID (%u)", add_string, value)wmem_strdup_printf(((void*)0), "%s/RNC-ID (%u)", add_string, value
)
;
1855 g_strlcpy(add_string, str, string_len);
1856 g_free(str)(__builtin_object_size ((str), 0) != ((size_t) - 1)) ? g_free_sized
(str, __builtin_object_size ((str), 0)) : (g_free) (str)
;
1857 }
1858 }
1859 break;
1860 }
1861
1862 if ((disc == 0x04) || (disc == 0x05) || (disc == 0x08)) break;
1863
1864 /* FALLTHRU */
1865
1866 case 0x02:
1867 /* CI */
1868
1869 value = tvb_get_ntohs(tvb, curr_offset);
1870 proto_tree_add_uint(tree, hf_gsm_a_bssmap_cell_ci, tvb,
1871 curr_offset, 2, value);
1872
1873 curr_offset += 2;
1874
1875 if (add_string)
1876 {
1877 if (add_string[0] == '\0')
1878 {
1879 snprintf(add_string, string_len, " - CI (%u)", value);
1880 }
1881 else
1882 {
1883 char *str = ws_strdup_printf("%s/CI (%u)", add_string, value)wmem_strdup_printf(((void*)0), "%s/CI (%u)", add_string, value
)
;
1884 g_strlcpy(add_string, str, string_len);
1885 g_free(str)(__builtin_object_size ((str), 0) != ((size_t) - 1)) ? g_free_sized
(str, __builtin_object_size ((str), 0)) : (g_free) (str)
;
1886 }
1887 }
1888 break;
1889 default:
1890 proto_tree_add_item(tree, hf_gsm_a_bssmap_cell_id_unknown_format, tvb, curr_offset, len, ENC_NA0x00000000);
1891
1892 curr_offset += (len);
1893 break;
1894 }
1895
1896 return curr_offset-offset;
1897}
1898
1899uint16_t
1900be_cell_id_aux(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len, uint8_t disc)
1901{
1902 return be_cell_id_type(tvb, tree, pinfo, offset, len, add_string, string_len, disc, E212_NONE);
1903}
1904
1905static uint16_t
1906be_cell_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string, int string_len)
1907{
1908 uint8_t oct;
1909 uint8_t disc;
1910 uint32_t curr_offset;
1911
1912 curr_offset = offset;
1913
1914 oct = tvb_get_uint8(tvb, curr_offset);
1915
1916 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
1917 proto_tree_add_item(tree, hf_gsm_a_bssmap_be_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1918 disc = oct&0x0f;
1919 cell_discriminator = disc; /* may be required later */
1920 curr_offset++;
1921
1922 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
1923
1924 curr_offset +=
1925 be_cell_id_aux(tvb, tree, pinfo, curr_offset, len - (curr_offset - offset), add_string, string_len, disc);
1926
1927 /* no length check possible */
1928
1929 return curr_offset-offset;
1930}
1931
1932/*
1933 * [2] 3.2.2.18 Priority
1934 */
1935static const true_false_string bssmap_pci_value = {
1936 "This allocation request may preempt an existing connection",
1937 "This allocation request shall not preempt an existing connection"
1938};
1939
1940static const true_false_string bssmap_pvi_value = {
1941 "This connection might be preempted by another allocation request",
1942 "This connection shall not be preempted by another allocation request"
1943};
1944
1945static const range_string bssmap_prio_rvals[] = {
1946 { 0x00, 0x00, "Spare" },
1947 { 0x01, 0x0E, "1 is highest" },
1948 { 0x0F, 0x0f, "priority not used" },
1949 { 0, 0, NULL((void*)0) },
1950};
1951
1952uint16_t
1953be_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string, int string_len)
1954{
1955 uint8_t oct;
1956 uint32_t curr_offset;
1957
1958 curr_offset = offset;
1959
1960 oct = tvb_get_uint8(tvb, curr_offset);
1961
1962 proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1963 proto_tree_add_item(tree, hf_gsm_a_bssmap_pci, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1964 proto_tree_add_item(tree, hf_gsm_a_bssmap_priority_level, tvb, curr_offset, 1, ENC_NA0x00000000);
1965
1966 if (add_string)
1967 snprintf(add_string, string_len, " - (%u)", (oct & 0x3c) >> 2);
1968
1969 proto_tree_add_item(tree, hf_gsm_a_bssmap_qa, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1970 proto_tree_add_item(tree, hf_gsm_a_bssmap_pvi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
1971
1972 curr_offset++;
1973
1974 /* no length check possible */
1975
1976 return curr_offset-offset;
1977}
1978/*
1979 * 3.2.2.19 Classmark Information Type 2
1980 * The classmark octets 3, 4 and 5 are coded in the same way as the
1981 * equivalent octets in the Mobile station classmark 2 element of
1982 * 3GPP TS 24.008
1983 * dissected in packet-gsm_a_common.c
1984 */
1985/*
1986 * 3.2.2.20 Classmark Information Type 3
1987 * The classmark octets 3 to 34 are coded in the same way as the
1988 * equivalent octets in the Mobile station classmark 3 element of
1989 * 3GPP TS 24.008.
1990 * dissected in packet-gsm_a_common.c
1991 */
1992/*
1993 * 3.2.2.21 Interference Band To Be Used
1994 */
1995static uint16_t
1996be_int_band(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
1997{
1998 uint32_t curr_offset;
1999
2000 curr_offset = offset;
2001
2002 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 3, ENC_BIG_ENDIAN0x00000000);
2003 proto_tree_add_item(tree, hf_gsm_a_bssmap_interference_bands, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2004 curr_offset++;
2005
2006
2007 return curr_offset-offset;
2008}
2009/*
2010 * 3.2.2.22 RR Cause
2011 * Octet 2 is coded as the equivalent field from 3GPP TS 24.008
2012 * Dissected in packet-gsm_a_rr.c
2013 */
2014/*
2015 * 3.2.2.23 LSA Information
2016 */
2017
2018static const true_false_string bssmap_lsa_only_value = {
2019 "Access to the LSAs that are defined",
2020 "Allowing emergency call"
2021};
2022
2023static uint16_t
2024be_lsa_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2025{
2026 uint32_t curr_offset;
2027
2028 curr_offset = offset;
2029
2030 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, ENC_BIG_ENDIAN0x00000000);
2031 proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_only, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2032 curr_offset++;
2033
2034 while (curr_offset-offset < len) {
2035 /* LSA identification and attributes */
2036 /* 8 7 6 5 4 3 2 1
2037 * spare act pref priority
2038 */
2039 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 2, ENC_BIG_ENDIAN0x00000000);
2040 proto_tree_add_item(tree, hf_gsm_a_bssmap_act, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2041 proto_tree_add_item(tree, hf_gsm_a_bssmap_pref, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2042 proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_inf_prio, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2043 curr_offset++;
2044 proto_tree_add_item(tree, hf_gsm_a_bssmap_lsa_id, tvb, curr_offset, 3, ENC_BIG_ENDIAN0x00000000);
2045 curr_offset+=3;
2046 }
2047
2048 return len;
2049}
2050/*
2051 * [2] 3.2.2.24 Layer 3 Information
2052 */
2053static uint16_t
2054be_l3_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2055{
2056 uint32_t curr_offset;
2057 tvbuff_t *l3_tvb;
2058 proto_item* ti;
2059
2060 curr_offset = offset;
2061
2062 proto_tree_add_bytes_format(tree, hf_gsm_a_bssmap_layer_3_information_value, tvb, curr_offset, len, NULL((void*)0),
2063 "Layer 3 Information value");
2064
2065 /*
2066 * dissect the embedded DTAP message
2067 */
2068 l3_tvb = tvb_new_subset_length(tvb, curr_offset, len);
2069
2070 /* This information element carries a radio interface message.
2071 In the case of an Intersystem handover to UMTS,
2072 this information element contains a HANDOVER TO UTRAN COMMAND message
2073 as defined in 3GPP TS 25.331.
2074 In the case of an Inter BSC handover,
2075 it contains an RR HANDOVER COMMAND message as defined in 3GPP TS 44.018.
2076 In the case of an Intersystem handover to cdma2000,
2077 this information element contains the HANDOVER TO CDMA2000 COMMAND message,
2078 as defined in 3GPP TS 44.018. */
2079
2080 /* note that we can't (from this PDU alone) determine whether a handover is to UMTS or cdma2000
2081 Maybe if cdma2000 support is added later, a preference option would select dissection of cdma2000 or UMTS.
2082 If SCCP trace is enabled (and the cell discriminator has correctly appeared in an earlier PDU)
2083 then we will have remembered the discriminator */
2084 if ( cell_discriminator == 0xFF)
2085 {
2086 ti = proto_tree_add_uint_format(tree, hf_gsm_a_bssmap_cell_discriminator, l3_tvb, curr_offset, 1, cell_discriminator,
2087 "Cell Discriminator not initialised, try enabling the SCCP protocol option [Trace Associations], \n or maybe the file does not contain the PDUs needed for SCCP trace");
2088 proto_item_set_len(ti, len);
2089 }
2090 else if ((cell_discriminator & 0x0f) < 8) {
2091 ti = proto_tree_add_uint(tree, hf_gsm_a_bssmap_cell_discriminator, l3_tvb, curr_offset, 1, cell_discriminator);
2092 /* cell_discriminator is a preference, so value should be known, but keeping presence of field consistent for filtering */
2093 proto_item_set_hidden(ti);
2094
2095 /* GSM */
2096 call_dissector(dtap_handle, l3_tvb, pinfo, g_tree);
2097 }
2098 else if ((cell_discriminator & 0x0f) < 13) {
2099 ti = proto_tree_add_uint(tree, hf_gsm_a_bssmap_cell_discriminator, l3_tvb, curr_offset, 1, cell_discriminator);
2100 /* cell_discriminator is a preference, so value should be known, but keeping presence of field consistent for filtering */
2101 proto_item_set_hidden(ti);
2102
2103 /* UMTS or CDMA 2000 */
2104 dissect_rrc_HandoverToUTRANCommand_PDU(l3_tvb, pinfo, g_tree, NULL((void*)0));
2105 }
2106 else{
2107 ti = proto_tree_add_uint_format(tree, hf_gsm_a_bssmap_cell_discriminator, l3_tvb, curr_offset, 1, cell_discriminator,
2108 "Unrecognised Cell Discriminator %x",cell_discriminator);
2109 proto_item_set_len(ti, len);
2110 }
2111 curr_offset += len;
2112
2113 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
2114
2115 return curr_offset-offset;
2116}
2117
2118/*
2119 * [2] 3.2.2.25 DLCI
2120 */
2121static uint16_t
2122be_dlci(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2123{
2124 uint8_t oct;
2125 uint32_t curr_offset;
2126 proto_tree *subtree;
2127
2128 curr_offset = offset;
2129
2130 subtree =
2131 proto_tree_add_subtree(tree, tvb, curr_offset, 1,
2132 ett_dlci, NULL((void*)0), "Data Link Connection Identifier");
2133
2134 oct = tvb_get_uint8(tvb, curr_offset);
2135
2136 proto_tree_add_uint(subtree, hf_gsm_a_bssmap_dlci_cc, tvb, curr_offset, 1, oct);
2137 proto_tree_add_uint(subtree, hf_gsm_a_bssmap_dlci_spare, tvb, curr_offset, 1, oct);
2138 proto_tree_add_uint(subtree, hf_gsm_a_bssmap_dlci_sapi, tvb, curr_offset, 1, oct);
2139
2140 curr_offset++;
2141
2142 /* no length check possible */
2143
2144 return curr_offset-offset;
2145}
2146
2147/*
2148 * [2] 3.2.2.26 Downlink DTX Flag
2149 */
2150static uint16_t
2151be_down_dtx_flag(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2152{
2153 uint32_t curr_offset = offset;
2154
2155 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, ENC_BIG_ENDIAN0x00000000);
2156 proto_tree_add_item(tree, hf_gsm_a_bssmap_bss_activate_downlink, tvb, curr_offset, 1, ENC_NA0x00000000);
2157 curr_offset++;
2158
2159 /* no length check possible */
2160
2161 return curr_offset-offset;
2162}
2163
2164/*
2165 * [2] 3.2.2.27 Cell Identifier List
2166 */
2167uint16_t
2168be_cell_id_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
2169{
2170 uint8_t oct;
2171 uint16_t consumed;
2172 uint8_t disc;
2173 uint8_t num_cells;
2174 uint32_t curr_offset;
2175 proto_item *item = NULL((void*)0);
2176 proto_tree *subtree = NULL((void*)0);
2177
2178 curr_offset = offset;
2179
2180 oct = tvb_get_uint8(tvb, curr_offset);
2181
2182 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2183
2184 disc = oct & 0x0f;
2185 cell_discriminator = disc; /* may be required later */
2186 proto_tree_add_item(tree, hf_gsm_a_bssmap_be_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2187 curr_offset++;
2188
2189 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
2190
2191 num_cells = 0;
2192 do
2193 {
2194 subtree =
2195 proto_tree_add_subtree_format(tree,
2196 tvb, curr_offset, -1,
2197 ett_cell_list, &item, "Cell %u",
2198 num_cells + 1);
2199
2200 if (add_string)
2201 add_string[0] = '\0';
2202
2203 consumed =
2204 be_cell_id_aux(tvb, subtree, pinfo, curr_offset, len - (curr_offset - offset), add_string, string_len, disc);
2205
2206 if (add_string && add_string[0] != '\0')
2207 proto_item_append_text(item, "%s", add_string);
2208
2209 proto_item_set_len(item, consumed);
2210
2211 curr_offset += consumed;
2212
2213 num_cells++;
2214 }
2215 while ((len - (curr_offset - offset)) > 0 && consumed > 0);
2216
2217 if (add_string) {
2218 snprintf(add_string, string_len, " - %u cell%s",
2219 num_cells, plurality(num_cells, "", "s")((num_cells) == 1 ? ("") : ("s")));
2220 }
2221
2222 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
2223
2224 return curr_offset-offset;
2225}
2226/*
2227 * 3.2.2.27a Cell Identifier List Segment
2228 */
2229
2230static const value_string gsm_a_bssap_cell_id_list_seg_cell_id_disc_vals[] = {
2231 { 0x0, "The whole Cell Global Identification, CGI, is used to identify the cells"},
2232 { 0x1, "Location Area Code, LAC, and Cell Identify, CI, is used to identify the cells within a given MCC and MNC"},
2233 { 0x2, "Cell Identity, CI, is used to identify the cells within a given MCC and MNC and LAC"},
2234 { 0x3, "No cell is associated with the transaction"},
2235 { 0x4, "Location Area Identification, LAI, is used to identify all cells within a Location Area"},
2236 { 0x5, "Location Area Code, LAC, is used to identify all cells within a location area"},
2237 { 0x6, "All cells on the BSS are identified"},
2238 { 0x7, "MCC and MNC, is used to identify all cells within the given MCC and MNC"},
2239 { 0, NULL((void*)0) }
2240};
2241
2242static uint16_t
2243be_cell_id_list_seg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2244{
2245 uint32_t curr_offset;
2246
2247 curr_offset = offset;
2248
2249 /* Sequence Length */
2250 proto_tree_add_item(tree, hf_gsm_a_bssmap_seq_len, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2251 /* Sequence Number */
2252 proto_tree_add_item(tree, hf_gsm_a_bssmap_seq_no, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2253 curr_offset++;
2254
2255 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2256 /* Cell identification discriminator */
2257 proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2258 curr_offset++;
2259 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-2);
2260
2261
2262 return len;
2263}
2264
2265/*
2266 * 3.2.2.27b Cell Identifier List Segment for established cells
2267 */
2268static uint16_t
2269be_cell_id_lst_seg_f_est_cells(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2270{
2271 uint32_t curr_offset;
2272
2273 curr_offset = offset;
2274
2275 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2276 /* Cell identification discriminator */
2277 proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2278 curr_offset++;
2279
2280 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1);
2281
2282
2283 return len;
2284}
2285/*
2286 * 3.2.2.27c Cell Identifier List Segment for cells to be established
2287 */
2288static uint16_t
2289be_cell_id_lst_seg_f_cell_tb_est(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2290{
2291 uint32_t curr_offset;
2292
2293 curr_offset = offset;
2294
2295 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2296 /* Cell identification discriminator */
2297 proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2298 curr_offset++;
2299
2300 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1);
2301
2302
2303 return len;
2304}
2305/*
2306 * 3.2.2.27d (void)
2307 */
2308/*
2309 * 3.2.2.27e Cell Identifier List Segment for released cells - no user present
2310 */
2311static uint16_t
2312be_cell_id_lst_seg_f_rel_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2313{
2314 uint32_t curr_offset;
2315
2316 curr_offset = offset;
2317
2318 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2319 /* Cell identification discriminator */
2320 proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2321 curr_offset++;
2322
2323 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1);
2324
2325
2326 return len;
2327}
2328/*
2329 * 3.2.2.27f Cell Identifier List Segment for not established cells - no establishment possible
2330 */
2331static uint16_t
2332be_cell_id_lst_seg_f_not_est_cell(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2333{
2334 uint32_t curr_offset;
2335
2336 curr_offset = offset;
2337
2338 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2339 /* Cell identification discriminator */
2340 proto_tree_add_item(tree, hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2341 curr_offset++;
2342
2343 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len-1);
2344
2345
2346 return len;
2347}
2348/*
2349 * 3.2.2.28 Response Request
2350 * No data
2351 */
2352/*
2353 * 3.2.2.29 Resource Indication Method
2354 */
2355static const value_string gsm_a_bssap_resource_indication_vals[] = {
2356 { 0x0, "Spontaneous resource information expected"},
2357 { 0x1, "One single resource information expected"},
2358 { 0x2, "Periodic resource information expected"},
2359 { 0x3, "No cell is associated with the transaction"},
2360 { 0x4, "No resource information expected"},
2361 { 0, NULL((void*)0) }
2362};
2363static uint16_t
2364be_res_ind_method(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2365{
2366 uint32_t curr_offset;
2367
2368 curr_offset = offset;
2369
2370 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2371 proto_tree_add_item(tree, hf_gsm_a_bssap_res_ind_method, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2372 curr_offset++;
2373
2374 return len;
2375}
2376
2377/*
2378 * 3.2.2.30 Classmark Information Type 1
2379 * coded in the same way as the equivalent octet in the classmark 1 element of 3GPP TS 24.008
2380 * dissected in packet-gsm_a_common.c
2381 */
2382/*
2383 * 3.2.2.31 Circuit Identity Code List
2384 */
2385static uint16_t
2386be_cic_list(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2387{
2388 uint32_t curr_offset;
2389
2390 curr_offset = offset;
2391
2392 proto_tree_add_item(tree, hf_gsm_a_bssap_cic_list_range, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2393 proto_tree_add_item(tree, hf_gsm_a_bssap_cic_list_status, tvb, (curr_offset+1), (len-1), ENC_NA0x00000000);
2394
2395 return len;
2396}
2397/*
2398 * 3.2.2.32 Diagnostics
2399 */
2400static uint16_t
2401be_diag(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len , char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2402{
2403 uint32_t curr_offset;
2404
2405 curr_offset = offset;
2406
2407 proto_tree_add_item(tree, hf_gsm_a_bssap_diag_error_pointer, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
2408 curr_offset += 2;
2409 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
2410 proto_tree_add_item(tree, hf_gsm_a_bssap_diag_msg_rcv, tvb, curr_offset, (len-2), ENC_NA0x00000000);
2411
2412 return len;
2413}
2414/*
2415 * [2] 3.2.2.33 Chosen Channel
2416 */
2417static const value_string gsm_a_bssmap_ch_mode_vals[] = {
2418 { 0, "no channel mode indication" },
2419 { 9, "speech (full rate or half rate)" },
2420 { 14, "data, 14.5 kbit/s radio interface rate" },
2421 { 11, "data, 12.0 kbit/s radio interface rate" },
2422 { 12, "data, 6.0 kbit/s radio interface rate" },
2423 { 13, "data, 3.6 kbit/s radio interface rate" },
2424 { 8, "signalling only" },
2425 { 1, "data, 29.0 kbit/s radio interface rate" },
2426 { 2, "data, 32.0 kbit/s radio interface rate" },
2427 { 3, "data, 43.5 kbit/s radio interface rate" },
2428 { 4, "data, 43.5 kbit/s downlink and 14.5 kbit/s uplink" },
2429 { 5, "data, 29.0 kbit/s downlink and 14.5 kbit/s uplink" },
2430 { 6, "data, 43.5 kbit/s downlink and 29.0 kbit/s uplink" },
2431 { 7, "data, 14.5 kbit/s downlink and 43.5 kbit/s uplink" },
2432 { 10, "data, 14.5 kbit/s downlink and 29.0 kbit/s uplink" },
2433 { 15, "data, 29.0 kbit/s downlink and 43.5 kbit/s uplink" },
2434 { 0, NULL((void*)0) }
2435};
2436static const value_string gsm_a_bssmap_channel_vals[] = {
2437 { 0, "None(Current Channel Type 1 - Reserved)" },
2438 { 1, "SDCCH" },
2439 { 2, "Reserved" },
2440 { 3, "Reserved" },
2441 { 5, "Reserved" },
2442 { 6, "Reserved" },
2443 { 7, "Reserved" },
2444 { 8, "1 Full rate TCH" },
2445 { 9, "1 Half rate TCH" },
2446 { 10, "2 Full Rate TCHs" },
2447 { 11, "3 Full Rate TCHs" },
2448 { 12, "4 Full Rate TCHs" },
2449 { 13, "5 Full Rate TCHs" },
2450 { 14, "6 Full Rate TCHs" },
2451 { 15, "7 Full Rate TCHs" },
2452 { 4, "8 Full Rate TCHs" },
2453 { 0, NULL((void*)0) }
2454};
2455static const value_string gsm_a_bssmap_trace_bss_record_type_vals[] = {
2456 { 0, "Basic" },
2457 { 1, "Handover" },
2458 { 2, "Radio" },
2459 { 3, "No BSS Trace" },
2460 { 0, NULL((void*)0) }
2461};
2462static const value_string gsm_a_bssmap_trace_msc_record_type_vals[] = {
2463 { 0, "Basic" },
2464 { 1, "Detailed (optional)" },
2465 { 2, "Spare" },
2466 { 3, "No MSC Trace" },
2467 { 0, NULL((void*)0) }
2468};
2469static const value_string gsm_a_bssmap_trace_invoking_event_vals[] = {
2470 { 0, "MOC, MTC, SMS MO, SMS MT, PDS MO, PDS MT, SS, Location Updates, IMSI attach, IMSI detach" },
2471 { 1, "MOC, MTC, SMS_MO, SMS_MT, PDS MO, PDS MT, SS only" },
2472 { 2, "Location updates, IMSI attach IMSI detach only" },
2473 { 3, "Operator definable" },
2474 { 0, NULL((void*)0) }
2475};
2476static uint16_t
2477be_chosen_chan(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2478{
2479 uint32_t curr_offset;
2480
2481 curr_offset = offset;
2482
2483 /* Channel mode */
2484 proto_tree_add_item(tree, hf_gsm_a_bssmap_ch_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2485
2486 proto_tree_add_item(tree, hf_gsm_a_bssmap_channel, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2487
2488 curr_offset++;
2489
2490 /* no length check possible */
2491
2492 return curr_offset-offset;
2493}
2494
2495/*
2496 * [2] 3.2.2.34 Cipher Response Mode
2497 */
2498static uint16_t
2499be_ciph_resp_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2500{
2501 uint32_t curr_offset = offset;
2502
2503 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 7, ENC_BIG_ENDIAN0x00000000);
2504 proto_tree_add_item(tree, hf_gsm_a_bssmap_imeisv_included, tvb, curr_offset, 1, ENC_NA0x00000000);
2505
2506 curr_offset++;
2507
2508 /* no length check possible */
2509
2510 return curr_offset-offset;
2511}
2512
2513
2514/*
2515 * [2] 3.2.2.35 Layer 3 Message Contents
2516 */
2517static uint16_t
2518be_l3_msg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2519{
2520 tvbuff_t *l3_tvb;
2521 uint16_t word;
2522
2523 proto_tree_add_bytes_format(tree, hf_gsm_a_bssmap_layer3_message_contents, tvb, offset, len, NULL((void*)0),
2524 "Layer 3 Message Contents");
2525
2526 /*
2527 * dissect the embedded DTAP message
2528 */
2529 l3_tvb = tvb_new_subset_length(tvb, offset, len);
2530
2531 /* Some vendors do:
2532 * Octets 3-12 contain the unchanged radio interface layer 3 message contents, as received from the radio interface.
2533 * When received in the CIPHER MODE COMPLETE message, this IE contains the mobile identity IE with identity type set to IMEISV.
2534 * The mobile identity IE is a variable length element and includes a length indicator, which is set to 9 if the type is IMEISV.
2535 *
2536 */
2537 word = tvb_get_ntohs(tvb, offset);
2538 if(word==0x1709){
2539 /* start the dissection from byte 3 */
2540 de_mid(l3_tvb, tree, pinfo, 2, 9, NULL((void*)0), 0);
2541 return len;
2542 }
2543 /* Octet j (j = 3, 4, ..., n) is the unchanged octet j of a radio interface layer 3 message
2544 * as defined in 3GPP TS 24.008, n is equal to the length of that radio interface layer 3 message. */
2545 call_dissector(dtap_handle, l3_tvb, pinfo, g_tree);
2546
2547 return len;
2548}
2549
2550/*
2551 * [2] 3.2.2.36 Channel Needed
2552 */
2553static uint16_t
2554be_cha_needed(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2555{
2556 uint32_t curr_offset;
2557
2558 curr_offset = offset;
2559
2560 /* no length check possible */
2561 proto_tree_add_bits_item(tree, hf_gsm_a_rr_chnl_needed_ch1, tvb, (curr_offset<<3)+6, 2, ENC_BIG_ENDIAN0x00000000);
2562
2563 curr_offset++;
2564
2565 return curr_offset-offset;
2566}
2567/*
2568 * 3.2.2.37 Trace Type
2569 * coded as the MSC/BSS Trace Type specified in 3GPP TS 52.008
2570 */
2571static uint16_t
2572be_trace_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2573{
2574 uint32_t curr_offset;
2575 int bit_offset;
2576
2577 bit_offset = (offset<<3);
2578 curr_offset = offset;
2579
2580 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_trace_priority_indication, tvb, bit_offset, 1, ENC_BIG_ENDIAN0x00000000);
2581 bit_offset ++;
2582 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, bit_offset, 1, ENC_BIG_ENDIAN0x00000000);
2583 bit_offset ++;
2584 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_trace_bss_record_type, tvb, bit_offset, 2, ENC_BIG_ENDIAN0x00000000);
2585 bit_offset += 2;
2586 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_trace_msc_record_type, tvb, bit_offset, 2, ENC_BIG_ENDIAN0x00000000);
2587 bit_offset += 2;
2588 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_trace_invoking_event, tvb, bit_offset, 2, ENC_BIG_ENDIAN0x00000000);
2589 /*bit_offset += 2;*/
2590 curr_offset++;
2591
2592 /* no length check possible */
2593
2594 return curr_offset-offset;
2595}
2596
2597/*
2598 * [2] 3.2.2.38 TriggerID
2599 */
2600static uint16_t
2601be_trace_trigger_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2602{
2603 uint32_t curr_offset;
2604
2605 curr_offset = offset;
2606
2607 proto_tree_add_item(tree, hf_gsm_a_bssmap_trace_trigger_id, tvb, curr_offset, len, ENC_ASCII0x00000000);
2608 curr_offset += len;
2609
2610 /* no length check possible */
2611
2612 return curr_offset-offset;
2613}
2614
2615 /* 3.2.2.39 Trace Reference */
2616static uint16_t
2617be_trace_reference(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2618{
2619 uint32_t curr_offset;
2620
2621 curr_offset = offset;
2622
2623
2624 proto_tree_add_item(tree, hf_gsm_a_bssmap_trace_reference, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
2625 curr_offset +=2;
2626
2627 /* no length check possible */
2628
2629 return curr_offset-offset;
2630}
2631 /* 3.2.2.40 TransactionID */
2632static uint16_t
2633be_trace_transaction_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2634{
2635 uint32_t curr_offset;
2636
2637 curr_offset = offset;
2638
2639
2640 if (len == 1)
2641 {
2642 proto_tree_add_item(tree, hf_gsm_a_bssmap_trace_reference, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2643 curr_offset ++;
2644 }
2645 else
2646 {
2647 proto_tree_add_item(tree, hf_gsm_a_bssmap_trace_reference, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
2648 curr_offset +=2;
2649 }
2650
2651 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
2652
2653 return curr_offset-offset;
2654}
2655/*
2656 * 3.2.2.41 Mobile Identity (IMSI, IMEISV or IMEI as coded in 3GPP TS 24.008)
2657 * Dissected in packet-gsm_a_common.c
2658 */
2659/*
2660 * 3.2.2.42 OMCID
2661 * For the OMC identity, see 3GPP TS 52.021
2662 */
2663static uint16_t
2664be_trace_omc_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2665{
2666 uint32_t curr_offset;
2667
2668 curr_offset = offset;
2669
2670 proto_tree_add_item(tree, hf_gsm_a_bssmap_trace_omc_id, tvb, curr_offset, len, ENC_ASCII0x00000000);
2671 curr_offset += len;
2672
2673 /* no length check possible */
2674
2675 return curr_offset-offset;
2676}
2677/*
2678 * [2] 3.2.2.43 Forward Indicator
2679 */
2680static const range_string forward_indicator_rvals[] = {
2681 { 0x00, 0x00, "Reserved" },
2682 { 0x01, 0x01, "forward to subsequent BSS, no trace at MSC" },
2683 { 0x02, 0x02, "forward to subsequent BSS, and trace at MSC" },
2684 { 0x03, 0x0F, "Reserved" },
2685 { 0, 0, NULL((void*)0) },
2686};
2687
2688static uint16_t
2689be_for_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2690{
2691 uint32_t curr_offset = offset;
2692
2693 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2694 proto_tree_add_item(tree, hf_gsm_a_bssmap_forward_indicator, tvb, curr_offset, 1, ENC_NA0x00000000);
2695 curr_offset++;
2696
2697 /* no length check possible */
2698
2699 return curr_offset-offset;
2700}
2701
2702/*
2703 * [2] 3.2.2.44 Chosen Encryption Algorithm
2704 */
2705static const value_string gsm_a_bssmap_algorithm_id_vals[] = {
2706 { 1, "No encryption used" },
2707 { 2, "GSM A5/1" },
2708 { 3, "GSM A5/2" },
2709 { 4, "GSM A5/3" },
2710 { 5, "GSM A5/4" },
2711 { 6, "GSM A5/5" },
2712 { 7, "GSM A5/6" },
2713 { 8, "GSM A5/7" },
2714 { 0, NULL((void*)0) }
2715};
2716
2717static uint16_t
2718be_chosen_enc_alg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string, int string_len)
2719{
2720 uint8_t oct;
2721 uint32_t curr_offset;
2722
2723 curr_offset = offset;
2724
2725 oct = tvb_get_uint8(tvb, curr_offset);
2726
2727 proto_tree_add_item(tree, hf_gsm_a_bssmap_algorithm_identifier, tvb, curr_offset, 1, ENC_NA0x00000000);
2728
2729 curr_offset++;
2730
2731 if (add_string)
2732 snprintf(add_string, string_len, " - %s", val_to_str_const(oct, gsm_a_bssmap_algorithm_id_vals, "Unknown"));
2733
2734 /* no length check possible */
2735
2736 return curr_offset-offset;
2737}
2738
2739/*
2740 * [2] 3.2.2.45 Circuit Pool
2741 */
2742static uint16_t
2743be_cct_pool(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string, int string_len)
2744{
2745 uint8_t oct;
2746 uint32_t curr_offset;
2747 proto_item* ti;
2748
2749 curr_offset = offset;
2750
2751 oct = tvb_get_uint8(tvb, curr_offset);
2752
2753 ti = proto_tree_add_item(tree, hf_gsm_a_bssmap_circuit_pool_number, tvb, curr_offset, 1, ENC_NA0x00000000);
2754 if (oct <= 50)
2755 {
2756 /* No extra string */
2757 }
2758 else if ((oct >= 0x80) && (oct <= 0x8f))
2759 {
2760 proto_item_append_text(ti, ", for national/local use");
2761 }
2762 else
2763 {
2764 proto_item_append_text(ti, ", reserved for future international use");
2765 }
2766
2767 curr_offset++;
2768
2769 if (add_string)
2770 snprintf(add_string, string_len, " - (%u)", oct);
2771
2772 /* no length check possible */
2773
2774 return curr_offset-offset;
2775}
2776/*
2777 * 3.2.2.46 Circuit Pool List
2778 * 3.2.2.47 Time Indication
2779 * 3.2.2.48 Resource Situation
2780 */
2781/*
2782 * [2] 3.2.2.49 Current Channel Type 1
2783 */
2784static uint16_t
2785be_curr_chan_1(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2786{
2787 uint32_t curr_offset;
2788
2789 curr_offset = offset;
2790
2791 /* Channel mode */
2792 proto_tree_add_item(tree, hf_gsm_a_bssmap_cur_ch_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2793 /* Channel */
2794 proto_tree_add_item(tree, hf_gsm_a_bssmap_channel, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2795
2796 curr_offset++;
2797
2798 /* no length check possible */
2799
2800 return curr_offset-offset;
2801}
2802
2803/*
2804 * [2] 3.2.2.50 Queuing Indicator
2805 */
2806static uint16_t
2807be_que_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2808{
2809 uint32_t curr_offset = offset;
2810
2811 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 6, ENC_BIG_ENDIAN0x00000000);
2812 proto_tree_add_item(tree, hf_gsm_a_bssmap_qri, tvb, curr_offset, 1, ENC_NA0x00000000);
2813
2814 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3)+7, 1, ENC_BIG_ENDIAN0x00000000);
2815
2816 curr_offset++;
2817
2818 /* no length check possible */
2819
2820 return curr_offset-offset;
2821}
2822
2823/*
2824 * [2] 3.2.2.51 Speech Version
2825 */
2826static const range_string speech_version_id_rvals[] = {
2827 { 0x01, 0x01, "GSM speech full rate version 1" },
2828 { 0x02, 0x04, "Reserved" },
2829 { 0x05, 0x05, "GSM speech half rate version 1" },
2830 { 0x06, 0x10, "Reserved" },
2831 { 0x11, 0x11, "GSM speech full rate version 2 (EFR)" },
2832 { 0x12, 0x14, "Reserved" },
2833 { 0x15, 0x15, "GSM speech half rate version 2" },
2834 { 0x16, 0x20, "Reserved" },
2835 { 0x21, 0x21, "GSM speech full rate version 3 (AMR)" },
2836 { 0x22, 0x24, "Reserved" },
2837 { 0x25, 0x25, "GSM speech half rate version 3 (AMR)" },
2838 { 0x26, 0x40, "Reserved" },
2839 { 0x41, 0x41, "GSM speech full rate version 4 (AMR-WB)" },
2840 { 0x42, 0x42, "GSM speech full rate version 5 (AMR-WB)" },
2841 { 0x43, 0x44, "Reserved" },
2842 { 0x45, 0x45, "GSM speech half rate version 6 (AMR)" },
2843 { 0x46, 0x46, "GSM speech half rate version 4 (AMR-WB)" },
2844 { 0x47, 0x7f, "Reserved" },
2845
2846 { 0, 0, NULL((void*)0) },
2847};
2848
2849static const range_string speech_version_id_short_rvals[] = {
2850 { 0x01, 0x01, "FR1" },
2851 { 0x05, 0x05, "HR1" },
2852 { 0x11, 0x11, "FR2 (EFR)" },
2853 { 0x15, 0x15, "HR2" },
2854 { 0x21, 0x21, "FR3 (AMR)" },
2855 { 0x25, 0x25, "HR3 (AMR)" },
2856 { 0x41, 0x41, "OFR AMR-WB" },
2857 { 0x42, 0x42, "FR AMR-WB" },
2858 { 0x45, 0x45, "OHR AMR" },
2859 { 0x46, 0x46, "OHR AMR-WB" },
2860
2861 { 0, 0, NULL((void*)0) },
2862};
2863
2864static uint16_t
2865be_speech_ver(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string, int string_len)
2866{
2867 uint8_t oct;
2868 uint32_t curr_offset;
2869
2870 curr_offset = offset;
2871
2872 oct = tvb_get_uint8(tvb, curr_offset);
2873
2874 proto_tree_add_item(tree, hf_gsm_a_b8spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2875
2876 /* The bits 7-1 of octet 2 are coded in the same way as the permitted speech version identifier
2877 * in the Channel type information element.
2878 */
2879 proto_tree_add_item(tree, hf_gsm_a_bssmap_speech_version_id, tvb, curr_offset, 1, ENC_NA0x00000000);
2880 curr_offset++;
2881
2882 if (add_string)
2883 snprintf(add_string, string_len, " - (%s)", rval_to_str_const(oct & 0x7f, speech_version_id_short_rvals, "Reserved"));
2884
2885 /* no length check possible */
2886
2887 return curr_offset-offset;
2888}
2889/*
2890 * 3.2.2.52 Assignment Requirement
2891 */
2892static const value_string gsm_a_bssmap_assignment_requirement_vals[] = {
2893 { 0x00, "Delay allowed" },
2894 { 0x01, "Immediate and the resources shall not be de-allocated until the end of the call (channel establishment on demand forbidden by the MSC)" },
2895 { 0x02, "Immediate and the resources may further be de-allocated by the BSS (channel establishment on demand permitted by the MSC)." },
2896 { 0, NULL((void*)0) }
2897};
2898static uint16_t
2899be_ass_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2900{
2901 proto_tree_add_item(tree, hf_gsm_a_bssmap_ass_req, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2902
2903 return 1;
2904}
2905/*
2906 * 3.2.2.53 (void)
2907 */
2908/*
2909 * 3.2.2.54 Talker Flag
2910 * No data
2911 */
2912/*
2913 * 3.2.2.55 Group Call Reference
2914 * The octets 3-7 are coded in the same way as the octets 2-6 in the
2915 * Descriptive group or broadcast call reference information element as defined in 3GPP TS 24.008.
2916 * dissected in packet-gsm_a_common.c (de_d_gb_call_ref)
2917 */
2918/*
2919 * 3.2.2.56 eMLPP Priority
2920 * The call priority field (bit 3 to 1 of octet 2) is coded in the same way as the call priority field
2921 * (bit 3 to 1 of octet 5) in the Descriptive group or broadcast call reference information element as
2922 * defined in 3GPP TS 24.008.
2923 */
2924static const value_string gsm_a_bssmap_call_priority_vals[] = {
2925 { 0x00, "No priority applied" },
2926 { 0x01, "Call priority level 4" },
2927 { 0x02, "Call priority level 3" },
2928 { 0x03, "Call priority level 2" },
2929 { 0x04, "Call priority level 1" },
2930 { 0x05, "Call priority level 0" },
2931 { 0x06, "Call priority level B" },
2932 { 0x07, "Call priority level A" },
2933 { 0, NULL((void*)0) }
2934};
2935
2936uint16_t
2937be_emlpp_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2938{
2939 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, offset << 3, 5, ENC_BIG_ENDIAN0x00000000);
2940 proto_tree_add_item(tree, hf_gsm_a_bssmap_emlpp_prio, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
2941
2942 return 1;
2943}
2944
2945/*
2946 * 3.2.2.57 Configuration Evolution Indication
2947 */
2948static const value_string gsm_a_bssmap_smi_vals[] = {
2949 { 0, "No Modification is allowed" },
2950 { 1, "Modification is allowed and maximum number of TCH/F is 1" },
2951 { 2, "Modification is allowed and maximum number of TCH/F is 2" },
2952 { 3, "Modification is allowed and maximum number of TCH/F is 3" },
2953 { 4, "Modification is allowed and maximum number of TCH/F is 4" },
2954 { 5, "Reserved" },
2955 { 6, "Reserved" },
2956 { 7, "Reserved" },
2957 { 0, NULL((void*)0) }
2958};
2959
2960static uint16_t
2961be_conf_evo_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
2962{
2963 uint32_t curr_offset;
2964
2965 curr_offset = offset;
2966
2967 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 4, ENC_BIG_ENDIAN0x00000000);
2968 /* Subsequent Modification Indication */
2969 proto_tree_add_item(tree, hf_gsm_a_bssmap_smi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
2970 curr_offset++;
2971
2972 return curr_offset-offset;
2973}
2974/*
2975 * 3.2.2.58 Old BSS to New BSS information
2976 */
2977/* This function is only called from other protocols (e.g. RANAP),
2978 internally, the Field Element dissector is called directly */
2979void
2980bssmap_old_bss_to_new_bss_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo)
2981{
2982 uint16_t len;
2983 if (!tree) {
2984 return;
2985 }
2986
2987 g_tree = tree;
2988
2989 len = tvb_reported_length(tvb);
2990 be_field_element_dissect(tvb, tree, pinfo, 0, len, NULL((void*)0), 0);
2991
2992 g_tree = NULL((void*)0);
2993}
2994/*
2995 * 3.2.2.59 (void)
2996 * 3.2.2.60 LCS QoS
2997 * (The QoS octets 3 to n are coded in the same way as the equivalent octets
2998 * in the LCS QoS element of 3GPP TS 49.031.)
2999 */
3000
3001/*
3002 * 3.2.2.61 LSA Access Control Suppression
3003 */
3004/*
3005 * 3.2.2.62 LCS Priority
3006 * The Priority octets 3 to n are coded in the same way as the equivalent octets
3007 * in the LCS Priority element of 3GPP TS 49.031.
3008 */
3009/* Location Information definitions */
3010static const value_string lcs_priority_vals[] = {
3011 { 0, "highest" },
3012 { 1, "normal" },
3013 { 0, NULL((void*)0)}
3014};
3015
3016static uint16_t
3017be_lcs_prio(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3018{
3019 uint32_t curr_offset;
3020
3021 curr_offset = offset;
3022
3023 /* This octet is coded as the LCS-Priority octet in 3GPP TS 29.002 */
3024 proto_tree_add_item(tree, hf_gsm_a_bssmap_lcs_pri, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3025 curr_offset++;
3026
3027 return curr_offset-offset;
3028}
3029
3030/*
3031 * 3.2.2.63 Location Type (Location Type element of 3GPP TS 49.031 BSSAP-LE.)
3032 */
3033static uint16_t
3034be_loc_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3035{
3036 uint32_t curr_offset;
3037 uint8_t location_information;
3038
3039 curr_offset = offset;
3040
3041 /* Extract the location information and add to protocol tree */
3042 proto_tree_add_item_ret_uint8(tree, hf_gsm_a_bssmap_location_type_location_information, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000, &location_information);
3043 curr_offset++;
3044
3045 if (location_information == 1 || location_information == 2)
3046 {
3047 /* protocol method */
3048 proto_tree_add_item(tree, hf_gsm_a_bssmap_location_type_positioning_method, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3049 curr_offset++;
3050 }
3051
3052 return curr_offset-offset;
3053}
3054
3055/*
3056 * 3.2.2.64 Location Estimate
3057 * The Location Estimate field is composed of 1 or more octets with an internal structure
3058 * according to 3GPP TS 23.032.
3059 */
3060static uint16_t
3061be_loc_est(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3062{
3063 tvbuff_t *data_tvb;
3064 uint32_t curr_offset;
3065
3066 curr_offset = offset;
3067
3068 data_tvb = tvb_new_subset_length(tvb, curr_offset, len);
3069 dissect_geographical_description(data_tvb, pinfo, tree);
3070
3071 return len;
3072}
3073/*
3074 * 3.2.2.65 Positioning Data
3075 * Positioning Data element of 3GPP TS 49.031 BSSAP-LE.
3076 */
3077static uint16_t
3078be_pos_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3079{
3080 uint32_t curr_offset;
3081 uint64_t pos_data_disc;
3082 int bit_offset;
3083
3084 curr_offset = offset;
3085
3086 /* Spare bits */
3087 bit_offset = (offset<<3);
3088 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare, tvb, bit_offset, 4, ENC_BIG_ENDIAN0x00000000);
3089 bit_offset += 4;
3090
3091 /* Extract the positioning data discriminator and add to protocol tree */
3092 proto_tree_add_bits_ret_val(tree, hf_gsm_a_bssmap_positioning_data_discriminator, tvb, bit_offset, 4, &pos_data_disc, ENC_BIG_ENDIAN0x00000000);
3093 bit_offset += 4;
3094 curr_offset++;
3095
3096 if (pos_data_disc == 0)
3097 {
3098 /* Extract the positioning methods and add to protocol tree */
3099 for (unsigned i = 0; i < len-1; i++)
3100 {
3101 /* Extract the positioning method and add to protocol tree */
3102 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_positioning_method, tvb, bit_offset, 5, ENC_BIG_ENDIAN0x00000000);
3103 bit_offset += 5;
3104 /* Extract the usage and add to protocol tree */
3105 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_positioning_method_usage, tvb, bit_offset, 3, ENC_BIG_ENDIAN0x00000000);
3106 bit_offset += 3;
3107 curr_offset++;
3108 }
3109 }
3110
3111 return curr_offset-offset;
3112}
3113/*
3114 * 3.2.2.66 LCS Cause
3115 * LCS Cause element of 3GPP TS 49.031 BSSAP-LE.
3116 * Dissected in packet-gsm_bssap_le.c
3117 */
3118
3119/*
3120 * 3.2.2.67 LCS Client Type
3121 * LCS Client Type element of 3GPP TS 49.031 BSSAP-LE.
3122 * Dissected in packet-gsm_bssap_le.c
3123 */
3124
3125/*
3126 * 3.2.2.68 3GPP TS 48.008 version 6.9.0 Release 6
3127 */
3128
3129/* BSSLAP the embedded message is as defined in 3GPP TS 48.071
3130 * LLP the embedded message contains a Facility Information Element as defined in 3GPP TS 44.071
3131 * excluding the Facility IEI and length of Facility IEI octets defined in 3GPP TS 44.071.
3132 * SMLCPP the embedded message is as defined in 3GPP TS 48.031
3133 */
3134static const value_string gsm_a_apdu_protocol_id_strings[] = {
3135 { 0, "reserved" },
3136 { 1, "BSSLAP" },
3137 { 2, "LLP" },
3138 { 3, "SMLCPP" },
3139 { 0, NULL((void*)0) }
3140};
3141
3142static uint16_t
3143be_apdu(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3144{
3145 uint32_t curr_offset;
3146 uint8_t apdu_protocol_id;
3147 tvbuff_t *APDU_tvb;
3148
3149 curr_offset = offset;
3150
3151 proto_tree_add_bytes_format(tree, hf_gsm_a_bssmap_apdu, tvb, curr_offset, len, NULL((void*)0), "APDU");
3152
3153 /*
3154 * dissect the embedded APDU message
3155 * if someone writes a TS 09.31 dissector
3156 *
3157 * The APDU octets 4 to n are coded in the same way as the
3158 * equivalent octet in the APDU element of 3GPP TS 49.031 BSSAP-LE.
3159 */
3160
3161 proto_tree_add_item_ret_uint8(tree, hf_gsm_a_bssmap_apdu_protocol_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000, &apdu_protocol_id);
3162 curr_offset++;
3163 len--;
3164
3165 switch (apdu_protocol_id) {
3166 case 1:
3167 /* BSSLAP
3168 * the embedded message is as defined in 3GPP TS 08.71(3GPP TS 48.071 version 7.2.0 Release 7)
3169 */
3170 APDU_tvb = tvb_new_subset_length(tvb, curr_offset, len);
3171 if (gsm_bsslap_handle)
3172 call_dissector(gsm_bsslap_handle, APDU_tvb, pinfo, g_tree);
3173 break;
3174 case 2:
3175 /* LLP
3176 * The embedded message contains a Facility Information Element as defined in 3GPP TS 04.71
3177 * excluding the Facility IEI and length of Facility IEI octets defined in 3GPP TS 04.71.(3GPP TS 44.071).
3178 */
3179 break;
3180 case 3:
3181 /* SMLCPP
3182 * The embedded message is as defined in 3GPP TS 08.31(TS 48.031).
3183 */
3184 break;
3185 default:
3186 break;
3187 }
3188
3189 curr_offset += len;
3190
3191 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
3192
3193 return curr_offset-offset;
3194}
3195/*
3196 * 3.2.2.69 Network Element Identity
3197 * Network Element Identity element of 3GPP TS 49.031 BSSAP-LE.
3198 */
3199/*
3200 * 3.2.2.70 GPS Assistance Data
3201 * Requested GPS Data element of 3GPP TS 49.031 BSSAP-LE.
3202 */
3203static uint16_t
3204be_gps_assist_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3205{
3206 uint32_t curr_offset;
3207
3208 curr_offset = offset;
3209
3210 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3211
3212
3213 return len;
3214}
3215/*
3216 * 3.2.2.71 Deciphering Keys
3217 * Deciphering Key element of 3GPP TS 49.031 BSSAP-LE.
3218 * Dissected in packet-gsm_bssmap_le.c
3219 */
3220
3221 /* 3.2.2.72 Return Error Request
3222 * Return Error Request element of 3GPP TS 49.031 BSSAP-LE.
3223 */
3224static uint16_t
3225be_ret_err_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3226{
3227 uint32_t curr_offset;
3228
3229 curr_offset = offset;
3230
3231 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3232
3233 return len;
3234}
3235/*
3236 * 3.2.2.73 Return Error Cause
3237 * Return Error Cause element of 3GPP TS 49.031 BSSAP-LE.
3238 */
3239static uint16_t
3240be_ret_err_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3241{
3242 uint32_t curr_offset;
3243
3244 curr_offset = offset;
3245
3246 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3247
3248 return len;
3249}
3250/*
3251 * 3.2.2.74 Segmentation
3252 * Segmentation element of 3GPP TS 49.031 BSSAP-LE.
3253 */
3254
3255static const true_false_string tfs_gsm_a_bssmap_segmented = { "non-final segment of a segmented message", "final segment of a segmented message" };
3256
3257static uint16_t
3258be_seg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3259{
3260 uint32_t curr_offset;
3261
3262 curr_offset = offset;
3263 /* There are two options for the coding of the Segmentation and Message Information portion;
3264 * 1 octet containing segmentation information only and 3 octets containing segmentation and message information.
3265 */
3266 /* Octet 3 Spare S Segment Number */
3267 static int* const oct3_flags[] = {
3268 &hf_gsm_a_bssmap_segmentation_spare_bits,
3269 &hf_gsm_a_bssmap_segmentation_info,
3270 &hf_gsm_a_bssmap_segment_number,
3271 NULL((void*)0)
3272 };
3273 proto_tree_add_bitmask_list(tree, tvb, curr_offset, 1, oct3_flags, ENC_NA0x00000000);
3274 curr_offset++;
3275 if (len >= 3) {
3276 /* Octet 4-5 Message ID */
3277 proto_tree_add_item(tree, hf_gsm_a_bssmap_msg_id, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
3278 curr_offset += 2;
Value stored to 'curr_offset' is never read
3279 }
3280
3281 return len;
3282}
3283/*
3284 * 3.2.2.75 Service Handover
3285 */
3286static const value_string gsm_a_bssmap_serv_ho_inf_vals[] = {
3287 { 0, "Handover to UTRAN or cdma2000 should be performed - Handover to UTRAN or cdma2000 is preferred" },
3288 { 1, "Handover to UTRAN or cdma2000 should not be performed - Handover to GSM is preferred" },
3289 { 2, "Handover to UTRAN or cdma2000 shall not be performed - " },
3290 { 3, "no information available for service based handover" },
3291 { 4, "no information available for service based handover" },
3292 { 5, "no information available for service based handover" },
3293 { 6, "no information available for service based handover" },
3294 { 7, "no information available for service based handover" },
3295 { 0, NULL((void*)0) }
3296};
3297static uint16_t
3298be_serv_ho(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3299{
3300 uint32_t curr_offset;
3301
3302 curr_offset = offset;
3303
3304 /* Service Handover information */
3305 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 5, ENC_BIG_ENDIAN0x00000000);
3306 proto_tree_add_item(tree, hf_gsm_a_bssmap_serv_ho_inf, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3307 curr_offset++;
3308 return len;
3309}
3310
3311/*
3312 * 3.2.2.76 Source RNC to target RNC transparent information (UMTS)
3313 */
3314
3315static uint16_t
3316be_src_rnc_to_tar_rnc_umts(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3317{
3318 tvbuff_t *container_tvb;
3319 uint32_t curr_offset;
3320
3321 curr_offset = offset;
3322
3323 /* The Source RNC to Target RNC transparent Information value is encoded as
3324 * the Source RNC to Target RNC Transparent Container IE as defined in relevant
3325 * RANAP specification 3GPP TS 25.413, excluding RANAP tag
3326 */
3327 container_tvb = tvb_new_subset_length(tvb, curr_offset, len);
3328 dissect_ranap_SourceRNC_ToTargetRNC_TransparentContainer_PDU(container_tvb, pinfo, tree, NULL((void*)0));
3329
3330 return len;
3331}
3332/*
3333 * 3.2.2.77 Source RNC to target RNC transparent information (cdma2000)
3334 */
3335static uint16_t
3336be_src_rnc_to_tar_rnc_cdma(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3337{
3338 uint32_t curr_offset;
3339
3340 curr_offset = offset;
3341
3342 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3343 /* The Source RNC to Target RNC transparent Information value (structure and encoding)
3344 * for cdma2000 is defined in relevant specifications.
3345 */
3346
3347 return len;
3348}
3349/*
3350 * 3.2.2.78 GERAN Classmark
3351 */
3352static const value_string gsm_a_max_nb_traffic_chan_vals[] = {
3353 { 0x00, "1 TCH" },
3354 { 0x01, "2 TCHs" },
3355 { 0x02, "3 TCHs" },
3356 { 0x03, "4 TCHs" },
3357 { 0x04, "5 TCHs" },
3358 { 0x05, "6 TCHs" },
3359 { 0, NULL((void*)0) }
3360};
3361static const true_false_string gsm_a_bssmap_accept_not_accept_vals = {
3362 "Acceptable",
3363 "Not acceptable"
3364};
3365static uint16_t
3366be_geran_cls_m(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3367{
3368 uint32_t curr_offset;
3369
3370 curr_offset = offset;
3371
3372 if (len > 2) {
3373 de_sup_codec_list(tvb, tree, pinfo, curr_offset, (len-2), NULL((void*)0), 0);
3374 }
3375 curr_offset += len-2;
3376 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 5, ENC_BIG_ENDIAN0x00000000);
3377 proto_tree_add_item(tree, hf_gsm_a_bssmap_max_nb_traffic_chan, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3378 curr_offset++;
3379 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 3, ENC_BIG_ENDIAN0x00000000);
3380 proto_tree_add_item(tree, hf_gsm_a_bssmap_acceptable_chan_coding_bit5, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3381 proto_tree_add_item(tree, hf_gsm_a_bssmap_acceptable_chan_coding_bit4, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3382 proto_tree_add_item(tree, hf_gsm_a_bssmap_acceptable_chan_coding_bit3, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3383 proto_tree_add_item(tree, hf_gsm_a_bssmap_acceptable_chan_coding_bit2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3384 proto_tree_add_item(tree, hf_gsm_a_bssmap_acceptable_chan_coding_bit1, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3385
3386 return len;
3387}
3388/*
3389 * 3.2.2.79 GERAN BSC Container
3390 */
3391static uint16_t
3392be_geran_bsc_cont(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3393{
3394 uint32_t curr_offset;
3395
3396 curr_offset = offset;
3397
3398 proto_tree_add_item(tree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3399 curr_offset++;
3400 NO_MORE_DATA_CHECK(len)if ((len) <= (curr_offset - offset)) return(len);;
3401 proto_tree_add_item(tree, hf_gsm_a_bssmap_allowed_data_rate_bit8, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3402 proto_tree_add_item(tree, hf_gsm_a_bssmap_allowed_data_rate_bit7, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3403 proto_tree_add_item(tree, hf_gsm_a_bssmap_allowed_data_rate_bit6, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3404 proto_tree_add_item(tree, hf_gsm_a_bssmap_allowed_data_rate_bit5, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3405 proto_tree_add_item(tree, hf_gsm_a_bssmap_allowed_data_rate_bit4, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3406 proto_tree_add_item(tree, hf_gsm_a_bssmap_max_nb_traffic_chan, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3407
3408 return len;
3409}
3410/*
3411 * 3.2.2.80 New BSS to Old BSS Information
3412 */
3413/* This function is only called from other protocols (e.g. RANAP),
3414 internally, the Field Element dissector is called directly */
3415void
3416bssmap_new_bss_to_old_bss_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo)
3417{
3418 uint16_t len;
3419 if (!tree) {
3420 return;
3421 }
3422
3423 g_tree = tree;
3424
3425 len = tvb_reported_length(tvb);
3426 be_field_element_dissect(tvb, tree, pinfo, 0, len, NULL((void*)0), 0);
3427
3428 g_tree = NULL((void*)0);
3429}
3430
3431
3432/*
3433 * 3.2.2.81 Inter-System Information
3434 */
3435static uint16_t
3436be_inter_sys_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3437{
3438 tvbuff_t *new_tvb;
3439
3440 new_tvb = tvb_new_subset_length(tvb, offset, len);
3441
3442 if (new_tvb) {
3443 dissect_ranap_InterSystemInformation_TransparentContainer_PDU(new_tvb, pinfo, tree, NULL((void*)0));
3444 }
3445
3446 return len;
3447}
3448/*
3449 * 3.2.2.82 SNA Access Information
3450 */
3451static uint16_t
3452be_sna_acc_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3453{
3454 uint32_t curr_offset;
3455
3456 curr_offset = offset;
3457
3458 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3459
3460 return len;
3461}
3462
3463/*
3464 * 3.2.2.83 VSTK_RAND Information
3465 */
3466static uint16_t
3467be_vstk_rand_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3468{
3469 uint32_t curr_offset;
3470 uint64_t vstk_rand;
3471
3472 curr_offset = offset;
3473
3474 vstk_rand = tvb_get_ntoh40(tvb, curr_offset);
3475 vstk_rand >>= 4;
3476 proto_tree_add_uint64(tree, hf_gsm_a_bssmap_vstk_rand, tvb, curr_offset, 5, vstk_rand);
3477 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (((curr_offset+4)<<3)+4), 4, ENC_BIG_ENDIAN0x00000000);
3478
3479 return len;
3480}
3481/*
3482 * 3.2.2.84 VSTK information
3483 */
3484static uint16_t
3485be_vstk_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3486{
3487 proto_tree_add_item(tree, hf_gsm_a_bssmap_vstk, tvb, offset, 16, ENC_NA0x00000000);
3488
3489 return len;
3490}
3491/*
3492 * 3.2.2.85 Paging Information
3493 */
3494/*
3495* If the VGCS/VBS flag is set to zero, the mobile station to be paged is not a member of any VGCS/VBS-group.
3496* If the VGCS/VBS flag is set to one, the mobile station to be paged is a member of a VGCS/VBS-group.
3497*/
3498static const true_false_string bssmap_paging_inf_flg_value = {
3499 "A member of a VGCS/VBS-group",
3500 "Not a member of any VGCS/VBS-group"
3501};
3502
3503static const value_string gsm_a_bssmap_paging_cause_vals[] = {
3504 { 0, "Paging is for mobile terminating call" },
3505 { 1, "Paging is for a short message" },
3506 { 2, "Paging is for a USSD" },
3507 { 3, "Spare" },
3508 { 0, NULL((void*)0) }
3509};
3510
3511static uint16_t
3512be_paging_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3513{
3514 uint32_t curr_offset;
3515
3516 curr_offset = offset;
3517
3518 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 5, ENC_BIG_ENDIAN0x00000000);
3519 proto_tree_add_item(tree, hf_gsm_a_bssmap_paging_cause, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3520 proto_tree_add_item(tree, hf_gsm_a_bssmap_paging_inf_flg, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3521 curr_offset++;
3522
3523 return curr_offset-offset;
3524}
3525/*
3526 * 3.2.2.86 IMEI
3527 * Use same dissector as IMSI 3.2.2.6
3528 */
3529
3530/*
3531 * 3.2.2.87 Velocity Estimate
3532 */
3533static uint16_t
3534be_vel_est(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len)
3535{
3536 dissect_description_of_velocity(tvb, tree, pinfo, offset, len, add_string, string_len);
3537
3538 return len;
3539}
3540/*
3541 * 3.2.2.88 VGCS Feature Flags
3542 */
3543
3544/* Bit 1 is the talker priority indicator (TP Ind). */
3545static const true_false_string gsm_bssmap_tpind_vals = {
3546 "Talker Priority not supported" ,
3547 "Talker Priority supported"
3548};
3549/* Bits 2 and 3 are the A-interface resource sharing indicator (AS Ind). */
3550static const true_false_string gsm_bssmap_asind_b2_vals = {
3551 "A-interface circuit sharing" ,
3552 "No A-interface circuit sharing"
3553};
3554
3555static const true_false_string gsm_bssmap_asind_b3_vals = {
3556 "A-interface link sharing" ,
3557 "No A-interface link sharing"
3558};
3559
3560/* Bit 4 is the group or broadcast call re-establishment by the BSS indicator (Bss Res). */
3561static const true_false_string gsm_bssmap_bss_res_vals = {
3562 "Re-establishment of the group or broadcast call by the BSS" ,
3563 "No re-establishment of the group or broadcast call by the BSS"
3564};
3565
3566/* Bit 5 is the Talker Channel Parameter (TCP). */
3567static const true_false_string gsm_bssmap_bss_tcp_vals = {
3568 "Talker channel parameter is applicable to this call, talker shall be established and maintained on a dedicated channel" ,
3569 "Talker channel parameter is not applicable to this call"
3570};
3571
3572static uint16_t
3573be_vgcs_feat_flg(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3574{
3575 uint32_t curr_offset;
3576
3577 curr_offset = offset;
3578
3579 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 3, ENC_BIG_ENDIAN0x00000000);
3580 proto_tree_add_item(tree, hf_gsm_a_bssmap_tcp, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3581 proto_tree_add_item(tree, hf_gsm_a_bssmap_bss_res, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3582 proto_tree_add_item(tree, hf_gsm_a_bssmap_asind_b3, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3583 proto_tree_add_item(tree, hf_gsm_a_bssmap_asind_b2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3584 proto_tree_add_item(tree, hf_gsm_a_bssmap_tpind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3585
3586 curr_offset++;
3587
3588 return curr_offset-offset;
3589}
3590/*
3591 * 3.2.2.89 Talker Priority
3592 */
3593static const value_string gsm_a_bssmap_talker_pri_vals[] = {
3594 { 0, "Normal Priority" },
3595 { 1, "Privileged Priority" },
3596 { 2, "Emergency Priority" },
3597 { 3, "Reserved for future use" },
3598 { 0, NULL((void*)0) }
3599};
3600
3601static uint16_t
3602be_talker_pri(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3603{
3604 uint32_t curr_offset;
3605
3606 curr_offset = offset;
3607
3608 proto_tree_add_item(tree, hf_gsm_a_bssmap_talker_pri, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3609 curr_offset++;
3610
3611 EXTRANEOUS_DATA_CHECK(len, curr_offset - offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((len) > (curr_offset - offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (len) - (curr_offset - offset)); curr_offset += ((len) - (curr_offset
- offset)); }
;
3612
3613 return curr_offset-offset;
3614}
3615
3616/*
3617 * 3.2.2.90 Emergency Set Indication
3618 * No data
3619 */
3620/*
3621 * 3.2.2.91 Talker Identity
3622 */
3623static uint16_t
3624be_talker_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3625{
3626 uint32_t curr_offset;
3627
3628 curr_offset = offset;
3629
3630 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, curr_offset<<3, 5, ENC_BIG_ENDIAN0x00000000);
3631 proto_tree_add_item(tree, hf_gsm_a_bssmap_filler_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3632 curr_offset++;
3633 proto_tree_add_item(tree, hf_gsm_a_bssmap_talker_identity_field, tvb, curr_offset, len-1, ENC_NA0x00000000);
3634
3635 return len;
3636}
3637/*
3638 * 3.2.2.92 SMS to VGCS
3639 */
3640static uint16_t
3641be_sms_to_vgcs(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3642{
3643 /* The SMS content field is coded as follows - this field contains
3644 * the RP-DATA message as defined in 3GPP TS 24.011.
3645 */
3646 rp_data_n_ms(tvb, tree, pinfo, offset, len);
3647
3648
3649 return len;
3650}
3651/*
3652 * 3.2.2.93 VGCS talker mode
3653 */
3654static const value_string gsm_a_bssmap_rr_mode_vals[] = {
3655 { 0, "dedicated mode (i.e. dedicated channel)"},
3656 { 1, "group transmit mode (i.e. voice group channel)"},
3657 { 0, NULL((void*)0) }
3658};
3659static const value_string gsm_a_bssmap_group_cipher_key_nb_vals[] = {
3660 { 0x0, "no ciphering"},
3661 { 0x1, "cipher key number 1"},
3662 { 0x2, "cipher key number 2"},
3663 { 0x3, "cipher key number 3"},
3664 { 0x4, "cipher key number 4"},
3665 { 0x5, "cipher key number 5"},
3666 { 0x6, "cipher key number 6"},
3667 { 0x7, "cipher key number 7"},
3668 { 0x8, "cipher key number 8"},
3669 { 0x9, "cipher key number 9"},
3670 { 0xa, "cipher key number A"},
3671 { 0xb, "cipher key number B"},
3672 { 0xc, "cipher key number C"},
3673 { 0xd, "cipher key number D"},
3674 { 0xe, "cipher key number E"},
3675 { 0xf, "cipher key number F"},
3676 { 0, NULL((void*)0) }
3677};
3678static uint16_t
3679be_vgcs_talker_mode(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3680{
3681 uint32_t curr_offset;
3682
3683 curr_offset = offset;
3684
3685 proto_tree_add_item(tree, hf_gsm_a_bssmap_rr_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3686 proto_tree_add_item(tree, hf_gsm_a_bssmap_group_cipher_key_nb, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3687 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, ((curr_offset<<3)+6), 2, ENC_BIG_ENDIAN0x00000000);
3688
3689 return len;
3690}
3691/*
3692 * 3.2.2.94 VGCS/VBS Cell Status
3693 */
3694static const value_string gsm_a_bssmap_vgcs_vbs_cell_status_vals[] = {
3695 { 0, "Cell is established for the voice group or broadcast call"},
3696 { 1, "Cell is not established for the voice group or broadcast call. Establishment by the BSS is to be attempted"},
3697 { 2, "Cell is released for the voice group or broadcast call because no user is present"},
3698 { 3, "Cell is not established for the voice group or broadcast call. No establishment by the BSS is to be attempted"},
3699 { 4, "Reserved"},
3700 { 5, "Reserved"},
3701 { 6, "Reserved"},
3702 { 7, "Reserved"},
3703 { 0, NULL((void*)0) }
3704};
3705static uint16_t
3706be_vgcs_vbs_cell_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3707{
3708 uint32_t curr_offset;
3709
3710 curr_offset = offset;
3711
3712 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3), 5, ENC_BIG_ENDIAN0x00000000);
3713 proto_tree_add_item(tree, hf_gsm_a_bssmap_vgcs_vbs_cell_status, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3714
3715 return len;
3716}
3717/*
3718 * 3.2.2.95 GANSS Assistance Data
3719 * The GANSS Assistance Data octets 3 to n are coded as the Requested GANSS Data element of 3GPP TS 49.031 (BSSAP-LE)
3720 * XXX move to packet-gsm_bssmap_le.c
3721 */
3722uint16_t
3723be_ganss_ass_dta(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3724{
3725 uint32_t curr_offset;
3726
3727 curr_offset = offset;
3728
3729 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3730
3731 return len;
3732}
3733/*
3734 * 3.2.2.96 GANSS Positioning Data
3735 * XXX move to packet-gsm_bssmap_le.c
3736 */
3737
3738static const value_string gsm_a_bssmap_method_vals[] = {
3739 { 0x00, "MS-Based" },
3740 { 0x01, "MS-Assisted" },
3741 { 0x02, "Conventional" },
3742 { 0x03, "Reserved" },
3743 { 0, NULL((void*)0) }
3744};
3745
3746static const value_string gsm_a_bssmap_ganss_id_vals[] = {
3747 { 0x00, "Galileo" },
3748 { 0x01, "Satellite Based Augmentation Systems (SBAS)" },
3749 { 0x02, "Modernized GPS" },
3750 { 0x03, "Quasi Zenith Satellite System (QZSS)" },
3751 { 0x04, "GLONASS" },
3752 { 0, NULL((void*)0) }
3753};
3754
3755static const value_string gsm_a_bssmap_usage_vals[] = {
3756 { 0x00, "Attempted unsuccessfully due to failure or interruption" },
3757 { 0x01, "Attempted successfully: results not used to generate location" },
3758 { 0x02, "Attempted successfully: results used to verify but not generate location" },
3759 { 0x03, "Attempted successfully: results used to generate location" },
3760 { 0x04, "Attempted successfully: case where MS supports multiple mobile based positioning methods and the actual method or methods used by the MS cannot be determined" },
3761 { 0, NULL((void*)0) }
3762};
3763
3764uint16_t
3765be_ganss_pos_dta(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3766{
3767 uint32_t curr_offset;
3768
3769 curr_offset = offset;
3770
3771 proto_tree_add_item(tree, hf_gsm_a_bssmap_method, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3772 proto_tree_add_item(tree, hf_gsm_a_bssmap_ganss_id, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3773 proto_tree_add_item(tree, hf_gsm_a_bssmap_usage, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3774 curr_offset++;
3775
3776 return curr_offset-offset;
3777}
3778/*
3779 * 3.2.2.97 GANSS Location Type
3780 */
3781uint16_t
3782be_ganss_loc_type(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3783{
3784 uint32_t curr_offset;
3785
3786 curr_offset = offset;
3787
3788 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3789
3790 return len;
3791}
3792/*
3793 * 3.2.2.98 Application Data
3794 */
3795static uint16_t
3796be_app_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3797{
3798 uint32_t curr_offset;
3799
3800 curr_offset = offset;
3801
3802 proto_tree_add_expert(tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet, tvb, curr_offset, len);
3803
3804 return len;
3805}
3806/*
3807 * 3.2.2.99 Data Identity
3808 */
3809static uint16_t
3810be_app_data_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3811{
3812 proto_tree_add_item(tree, hf_gsm_a_bssmap_data_id, tvb, offset, 1, ENC_BIG_ENDIAN0x00000000);
3813
3814 return len;
3815}
3816/*
3817 * 3.2.2.100 Application Data Information
3818 */
3819static const true_false_string gsm_a_bssmap_bt_ind_val = {
3820 "BSS has already transmitted the application data to cells",
3821 "BSS has not transmitted the application data to cells"
3822};
3823static uint16_t
3824be_app_data_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3825{
3826 uint32_t curr_offset;
3827
3828 curr_offset = offset;
3829
3830 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3), 7, ENC_BIG_ENDIAN0x00000000);
3831 proto_tree_add_item(tree, hf_gsm_a_bssmap_bt_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
3832
3833 return len;
3834}
3835/*
3836 * 3.2.2.101 MSISDN
3837 * Octets 3-12 contain the digits of an MSISDN, coded as in 3GPP TS 24.008, Calling party BCD number, octets 4 - 13.
3838 */
3839 static uint16_t
3840 be_msisdn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3841 {
3842 tvbuff_t *new_tvb;
3843
3844 new_tvb = tvb_new_subset_length(tvb, offset, len);
3845 if (new_tvb) {
3846 dissect_gsm_map_msisdn(new_tvb, pinfo , tree);
3847 }
3848
3849 return len;
3850}
3851 /*
3852 * 3.2.2.102 AoIP Transport Layer Address
3853 */
3854static uint16_t
3855be_aoip_trans_lay_add(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3856{
3857 uint32_t curr_offset;
3858 uint8_t addr_type;
3859 uint32_t rtp_ipv4_address;
3860 uint16_t rtp_port;
3861 address rtp_dst_addr;
3862 ws_in6_addr rtp_addr_ipv6;
3863
3864 curr_offset = offset;
3865
3866 /* This Information Element provides either an IPv4 or and IPv6 Address and UDP port value
3867 * for the Transport Layer information of the connection end point.
3868 * The Length differentiates between IPv4 and IPv6.
3869 */
3870 switch (len) {
3871 case 6:
3872 /* IPv4 */
3873 addr_type = 1;
3874 proto_tree_add_item(tree, hf_gsm_a_bssmap_aoip_trans_ipv4, tvb, curr_offset, 4, ENC_BIG_ENDIAN0x00000000);
3875 rtp_ipv4_address = tvb_get_ipv4(tvb, curr_offset);
3876 curr_offset+=4;
3877 break;
3878 case 18:
3879 /* IPv6 */
3880 addr_type = 2;
3881 proto_tree_add_item(tree, hf_gsm_a_bssmap_aoip_trans_ipv6, tvb, curr_offset, 16, ENC_NA0x00000000);
3882 tvb_get_ipv6(tvb, curr_offset, &rtp_addr_ipv6);
3883 curr_offset+=16;
3884 break;
3885 default:
3886 /* Bogus */
3887 proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_bogus_length, tvb, curr_offset, len, "Bogus length %u",len);
3888 return len;
3889 }
3890 proto_tree_add_item(tree, hf_gsm_a_bssmap_aoip_trans_port, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
3891 rtp_port = tvb_get_ntohs(tvb,curr_offset);
3892 curr_offset+=2;
3893
3894 switch (addr_type) {
3895 case 1:
3896 /* IPv4 */
3897 rtp_dst_addr.type = AT_IPv4;
3898 rtp_dst_addr.len = 4;
3899 rtp_dst_addr.data = (uint8_t *)&rtp_ipv4_address;
3900 break;
3901 case 2:
3902 /* IPv6 */
3903 rtp_dst_addr.type = AT_IPv6;
3904 rtp_dst_addr.len = 16;
3905 rtp_dst_addr.data = (uint8_t *)&rtp_addr_ipv6;
3906 break;
3907 }
3908
3909 if ((!pinfo->fd->visited) && rtp_port != 0) {
3910 rtp_add_address(pinfo, PT_UDP, &rtp_dst_addr, rtp_port, 0, "BSS MAP", pinfo->num, false0, 0);
3911 rtcp_add_address(pinfo, &rtp_dst_addr, rtp_port+1, 0, "BSS MAP", pinfo->num);
3912 }
3913 return curr_offset-offset;
3914}
3915/*
3916 * 3.2.2.103 Speech Codec List
3917 */
3918/*
3919FR_AMR is coded '011'
3920S11, S13 and S15 are reserved and coded with zeroes.
3921HR_AMR is coded '100'
3922S6 - S7 and S11 - S15 are reserved and coded with zeroes.
3923OHR_AMR is coded '011'
3924S11, S13 and S15 are reserved and coded with zeroes.
3925
3926FR_AMR-WB is coded '001'
3927S0 is set to '1' S1 - S7 are reserved and coded with zeroes.
3928OFR_AMR-WB is coded '100'
3929S0, S2, S4 indicates the supported Codec Configurations. S1, S3, S5, S6, S7 are reserved and coded with zeroes.
3930OHR_AMR-WB is coded '101'
3931S0 is set to '1' S1 - S7 are reserved and coded with zeroes.
3932
3933
39348 7 6 5 4 3 2 1
3935FI PI PT TF Codec Type (FR_AMR-WB or OFR_AMR-WB or OHR_AMR-WB)
3936S7 S6 S5 S4 S3 S2 S1 S0
3937
3938
3939*/
3940static const true_false_string bssmap_fi_vals = {
3941 "AoIP with compressed speech via RTP/UDP/IP is supported by the BSS/Preferred by the MSC",
3942 "AoIP with Compressed speech via RTP/UDP/IP is not supported by the BSS/Not Preferred by the MSC"
3943};
3944static const true_false_string bssmap_tf_vals = {
3945 "TFO supported by the BSS or TFO support is preferred by the MSC for this Codec Type",
3946 "TFO is not supported by the BSS or TFO support is not preferred by the MSC for this Codec Type"
3947};
3948static const true_false_string bssmap_pi_vals = {
3949 "Transport of PCM over A-Interface via RTP/UDP/IP is supported by the BSS or preferred by the MSC for this Codec Type",
3950 "PCM over A interface with IP as transport is not supported by the BSS or not preferred by the MSC for this Codec Type"
3951};
3952static const true_false_string bssmap_pt_vals = {
3953 "Transport of PCM over A-Interface via TDM is supported by the BSS or preferred by the MSC",
3954 "PCM over A-Interface with TDM as transport is not supported by the BSS or not preferred by the MSC for this Codec Type"
3955};
3956/* 26.103 Table 6.3-1: Coding of the selected Codec_Type (long form) */
3957static const value_string bssap_speech_codec_values[] = {
3958 { 0x00, "GSM FR" },
3959 { 0x01, "GSM HR" },
3960 { 0x02, "GSM EFR" },
3961 { 0x03, "FR_AMR" },
3962 { 0x04, "HR_AMR" },
3963 { 0x05, "UMTS AMR" },
3964 { 0x06, "UMTS AMR 2" },
3965 { 0x07, "TDMA EFR" },
3966 { 0x08, "PDC EFR" },
3967 { 0x09, "FR_AMR-WB" },
3968 { 0x0a, "UMTS AMR-WB" },
3969 { 0x0b, "OHR_AMR" },
3970 { 0x0c, "OFR_AMR-WB" },
3971 { 0x0d, "OHR_AMR-WB" },
3972 { 0x0e, "Reserved" },
3973 { 0x0f, "Codec Extension" },
3974 { 0xfd, "CSData" },
3975 { 0xfe, "MuMe2" },
3976 { 0xff, "MuMe" },
3977 { 0, NULL((void*)0) }
3978};
3979static value_string_ext bssap_speech_codec_values_ext = VALUE_STRING_EXT_INIT(bssap_speech_codec_values){ _try_val_to_str_ext_init, 0, (sizeof (bssap_speech_codec_values
) / sizeof ((bssap_speech_codec_values)[0]))-1, bssap_speech_codec_values
, "bssap_speech_codec_values", ((void*)0) }
;
3980
3981static const value_string bssap_extended_codec_values[] = {
3982 { 0xfd, "CSData" },
3983 { 0, NULL((void*)0) }
3984};
3985
3986static uint16_t
3987be_speech_codec_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
3988{
3989 uint32_t curr_offset, consumed = 0;
3990 uint8_t codec;
3991 uint8_t number = 0;
3992 proto_item *item = NULL((void*)0);
3993 proto_tree *subtree = NULL((void*)0);
3994
3995 curr_offset = offset;
3996
3997 while (curr_offset-offset < len) {
3998 number++;
3999 consumed = 0;
4000 subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1,
4001 ett_codec_lst, &item, "Speech Codec Element %u",number);
4002 codec = tvb_get_uint8(tvb,curr_offset)&0x0f;
4003 switch (codec) {
4004 case 0:
4005 /* GSM_FR is coded "0000" */
4006 /* fall through */
4007 case 1:
4008 /* GSM_HR is coded "0001" */
4009 /* fall through */
4010 case 2:
4011 /* GSM_EFR is coded "0010" */
4012 /* fall through */
4013 /* FI indicates Full IP */
4014 proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4015 /* PI indicates PCMoIP */
4016 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4017 /* PT indicates PCMoTDM */
4018 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4019 /* TF indicates TFO support */
4020 proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4021 /* Codec Type */
4022 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4023 proto_item_append_text(item, " - %s",
4024 val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
4025 bssap_speech_codec_values,
4026 "Unknown"));
4027 curr_offset++;
4028 consumed++;
4029 break;
4030 case 3:
4031 /* fall through */
4032 case 4:
4033 /* fall through */
4034 case 0xb:
4035 /* FR_AMR is coded '011'
4036 * HR_AMR is coded '100'
4037 * OHR_AMR is coded '1011'
4038 */
4039 /* FI indicates Full IP */
4040 proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4041 /* PI indicates PCMoIP */
4042 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4043 /* PT indicates PCMoTDM */
4044 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4045 /* TF indicates TFO support */
4046 proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4047 /* Codec Type */
4048 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4049 proto_item_append_text(item, " - %s",
4050 val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
4051 bssap_speech_codec_values,
4052 "Unknown"));
4053 curr_offset++;
4054 consumed++;
4055 proto_tree_add_item(subtree, hf_gsm_a_bssmap_s0_s15, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
4056 curr_offset+=2;
4057 consumed+=2;
4058 break;
4059 case 0x9:
4060 /* fall through */
4061 case 0xc:
4062 /* fall through */
4063 case 0xd:
4064 /* FR_AMR-WB is coded '1001'
4065 * OFR_AMR-WB is coded '1100'
4066 * OHR_AMR-WB is coded '1101'
4067 */
4068 /* FI indicates Full IP */
4069 proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4070 /* PI indicates PCMoIP */
4071 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4072 /* PT indicates PCMoTDM */
4073 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4074 /* TF indicates TFO support */
4075 proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4076 /* Codec Type */
4077 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4078 proto_item_append_text(item, " - %s",
4079 val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
4080 bssap_speech_codec_values,
4081 "Unknown"));
4082 curr_offset++;
4083 consumed++;
4084 proto_tree_add_item(subtree, hf_gsm_a_bssmap_s0_s7, tvb, curr_offset, 1, ENC_NA0x00000000);
4085 curr_offset++;
4086 consumed++;
4087 break;
4088 case 0xf:
4089 /* Currently (3GPP TS 48.008 version 9.4.0 Release 9) CSData Codec Type is the only extended one */
4090 /* PI indicates PCMoIP */
4091 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4092 /* PT indicates PCMoTDM */
4093 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4094 /* Codec Type */
4095 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4096 curr_offset++;
4097 consumed++;
4098 /* Codec Extension */
4099 proto_tree_add_item(subtree, hf_gsm_a_bssap_extended_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4100 proto_item_append_text(item, " - %s",
4101 val_to_str_const(tvb_get_uint8(tvb, curr_offset),
4102 bssap_extended_codec_values,
4103 "Unknown"));
4104 curr_offset++;
4105 consumed++;
4106 proto_tree_add_item(subtree, hf_gsm_a_bssap_extended_codec_r2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4107 proto_tree_add_item(subtree, hf_gsm_a_bssap_extended_codec_r3, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4108 curr_offset++;
4109 consumed++;
4110 break;
4111 default:
4112 proto_tree_add_expert(subtree, pinfo, &ei_gsm_a_bssap_unknown_codec, tvb, curr_offset, 2);
4113 curr_offset+=2;
4114 consumed+=2;
4115 break;
4116 }
4117 }
4118 proto_item_set_len(item, consumed);
4119 return len;
4120}
4121/*
4122 * 3.2.2.104 Speech Codec
4123 */
4124static const true_false_string bssmap_fi2_vals = {
4125 "AoIP with compressed speech via RTP/UDP/IP is selected for this Codec Type",
4126 "Compressed speech via RTP/UDP/IP is not selected for this Codec Type"
4127};
4128static const true_false_string bssmap_tf2_vals = {
4129 "TFO Support is selected for this Codec Type",
4130 "TFO Support is not selected for this Codec Type"
4131};
4132static const true_false_string bssmap_pi2_vals = {
4133 "PCM over A-Interface via RTP/UPD/IP is selected for this Codec Type",
4134 "PCM over A interface with RTP/UDP/IP is not selected for this Codec Type"
4135};
4136static const true_false_string bssmap_pt2_vals = {
4137 "PCM over A-Interface with TDM as transport is selected for this Codec Type",
4138 "PCM over A-Interface with TDM as transport is not selected for this Codec Type"
4139};
4140static uint16_t
4141be_speech_codec(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4142{
4143 uint32_t curr_offset, consumed = 0;
4144 uint8_t codec;
4145 uint8_t number = 0;
4146 proto_item *item = NULL((void*)0);
4147 proto_tree *subtree = NULL((void*)0);
4148
4149 curr_offset = offset;
4150
4151 while (curr_offset-offset < len) {
4152 number++;
4153 consumed = 0;
4154 subtree = proto_tree_add_subtree_format(tree, tvb, curr_offset, 1, ett_codec_lst, &item,
4155 "Speech Codec Element %u",number);
4156 codec = tvb_get_uint8(tvb,curr_offset)&0x0f;
4157 switch (codec) {
4158 case 0:
4159 /* GSM_FR is coded "0000" */
4160 /* fall through */
4161 case 1:
4162 /* GSM_HR is coded "0001" */
4163 /* fall through */
4164 case 2:
4165 /* GSM_EFR is coded "0010" */
4166 /* fall through */
4167 /* FI indicates Full IP */
4168 proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4169 /* PI indicates PCMoIP */
4170 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4171 /* PT indicates PCMoTDM */
4172 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4173 /* TF indicates TFO support */
4174 proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4175 /* Codec Type */
4176 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4177 proto_item_append_text(item, " - %s",
4178 val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
4179 bssap_speech_codec_values,
4180 "Unknown"));
4181 curr_offset++;
4182 consumed++;
4183 break;
4184 case 3:
4185 /* fall through */
4186 case 4:
4187 /* fall through */
4188 case 0xb:
4189 /* FR_AMR is coded '011'
4190 * HR_AMR is coded '100'
4191 * OHR_AMR is coded '1011'
4192 */
4193 /* FI indicates Full IP */
4194 proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4195 /* PI indicates PCMoIP */
4196 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4197 /* PT indicates PCMoTDM */
4198 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4199 /* TF indicates TFO support */
4200 proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4201 /* Codec Type */
4202 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4203 proto_item_append_text(item, " - %s",
4204 val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
4205 bssap_speech_codec_values,
4206 "Unknown"));
4207 curr_offset++;
4208 consumed++;
4209 proto_tree_add_item(subtree, hf_gsm_a_bssmap_s0_s15, tvb, curr_offset, 2, ENC_BIG_ENDIAN0x00000000);
4210 curr_offset+=2;
4211 consumed+=2;
4212 break;
4213 case 0x9:
4214 /* fall through */
4215 case 0xc:
4216 /* fall through */
4217 case 0xd:
4218 /* FR_AMR-WB is coded '1001'
4219 * OFR_AMR-WB is coded '1100'
4220 * OHR_AMR-WB is coded '1101'
4221 */
4222 /* FI indicates Full IP */
4223 proto_tree_add_item(subtree, hf_gsm_a_bssmap_fi2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4224 /* PI indicates PCMoIP */
4225 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4226 /* PT indicates PCMoTDM */
4227 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4228 /* TF indicates TFO support */
4229 proto_tree_add_item(subtree, hf_gsm_a_bssmap_tf2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4230 /* Codec Type */
4231 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4232 proto_item_append_text(item, " - %s",
4233 val_to_str_const(tvb_get_uint8(tvb, curr_offset) & 0x0f,
4234 bssap_speech_codec_values,
4235 "Unknown"));
4236 curr_offset++;
4237 consumed++;
4238 proto_tree_add_item(subtree, hf_gsm_a_bssmap_s0_s7, tvb, curr_offset, 1, ENC_NA0x00000000);
4239 curr_offset++;
4240 consumed++;
4241 break;
4242 case 0xf:
4243 /* Currently (3GPP TS 48.008 version 9.4.0 Release 9) CSData Codec Type is the only extended one */
4244 /* PI indicates PCMoIP */
4245 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pi, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4246 /* PT indicates PCMoTDM */
4247 proto_tree_add_item(subtree, hf_gsm_a_bssmap_pt, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4248 /* Codec Type */
4249 proto_tree_add_item(subtree, hf_gsm_a_bssap_speech_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4250 curr_offset++;
4251 consumed++;
4252 /* Codec Extension */
4253 proto_tree_add_item(subtree, hf_gsm_a_bssap_extended_codec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4254 curr_offset++;
4255 consumed++;
4256 proto_tree_add_item(subtree, hf_gsm_a_bssap_extended_codec_r2, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4257 proto_tree_add_item(subtree, hf_gsm_a_bssap_extended_codec_r3, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4258 curr_offset++;
4259 consumed++;
4260 break;
4261 default:
4262 proto_tree_add_expert(subtree, pinfo, &ei_gsm_a_bssap_unknown_codec, tvb, curr_offset, 2);
4263 curr_offset+=2;
4264 consumed+=2;
4265 break;
4266 }
4267 }
4268 proto_item_set_len(item, consumed);
4269 return len;
4270}
4271/*
4272 * 3.2.2.105 Call Identifier
4273 */
4274static uint16_t
4275be_call_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4276{
4277 uint32_t curr_offset;
4278
4279 curr_offset = offset;
4280
4281 /* Call Identifier (least significant bits) octet 2
4282 * Call Identifier octet 3
4283 * Call Identifier octet 4
4284 * Call Identifier (most significant bits) octet 5
4285 */
4286 proto_tree_add_item(tree, hf_gsm_a_bssmap_call_id, tvb, curr_offset, 4, ENC_LITTLE_ENDIAN0x80000000);
4287 curr_offset+=4;
4288
4289 return curr_offset-offset;
4290}
4291/*
4292 * 3.2.2.106 Call Identifier List
4293 */
4294static uint16_t
4295be_call_id_lst(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4296{
4297 uint32_t curr_offset;
4298 curr_offset = offset;
4299
4300 if (len==0) {
4301 proto_tree_add_item(tree, hf_gsm_a_bssmap_all_call_identifiers_resources_released, tvb, curr_offset, len, ENC_NA0x00000000);
4302 }
4303 while (curr_offset-offset < len) {
4304 proto_tree_add_item(tree, hf_gsm_a_bssmap_call_id, tvb, curr_offset, 4, ENC_LITTLE_ENDIAN0x80000000);
4305 curr_offset+=4;
4306 }
4307
4308 return len;
4309}
4310/*
4311 * 3.2.2.107 A-Interface Selector for RESET
4312 */
4313static const true_false_string gsm_a_bssmap_rip_value = {
4314 "all calls associated to IP links shall be cleared",
4315 "calls associated to IP links shall not be cleared"
4316};
4317static const true_false_string gsm_a_bssmap_rtd_value = {
4318 "all calls associated to TDM links shall be cleared",
4319 "calls associated to TDM links shall not be cleared"
4320};
4321static uint16_t
4322be_a_itf_sel_for_reset(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4323{
4324 uint32_t curr_offset;
4325 curr_offset = offset;
4326
4327 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, (curr_offset<<3), 6, ENC_BIG_ENDIAN0x00000000);
4328 proto_tree_add_item(tree, hf_gsm_a_bssmap_rip, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4329 proto_tree_add_item(tree, hf_gsm_a_bssmap_rtd, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4330 curr_offset++;
4331
4332 return curr_offset-offset;
4333}
4334/*
4335 * 3.2.2.109 Kc128
4336 */
4337static uint16_t
4338be_kc128(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4339{
4340 uint32_t curr_offset;
4341 curr_offset = offset;
4342
4343 proto_tree_add_item(tree, hf_gsm_a_bssmap_kc128, tvb, curr_offset, 16, ENC_NA0x00000000);
4344 curr_offset+=16;
4345
4346 return curr_offset-offset;
4347}
4348/*
4349 * 3.2.2.110 CSG Identifier
4350 */
4351static const crumb_spec_t gsm_a_bssmap_csg_id_crumbs[] = {
4352 { 0, 24},
4353 { 29, 3},
4354 { 0, 0}
4355};
4356static const true_false_string gsm_a_bssmap_cell_access_mode_value = {
4357 "Hybrid cell",
4358 "CSG cell"
4359};
4360static uint16_t
4361be_csg_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4362{
4363 uint32_t bit_offset;
4364 bit_offset = offset<<3;
4365
4366 proto_tree_add_split_bits_item_ret_val(tree, hf_gsm_a_bssmap_csg_id, tvb, bit_offset, gsm_a_bssmap_csg_id_crumbs, NULL((void*)0));
4367 bit_offset += 32;
4368 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_spare_bits, tvb, bit_offset, 7, ENC_BIG_ENDIAN0x00000000);
4369 bit_offset += 7;
4370 proto_tree_add_bits_item(tree, hf_gsm_a_bssmap_cell_access_mode, tvb, bit_offset, 1, ENC_BIG_ENDIAN0x00000000);
4371
4372 return len;
4373}
4374
4375/*
4376 * 3.2.2.111 Redirect Attempt Flag
4377 * No data
4378 */
4379
4380/*
4381 * 3.2.2.112 Reroute Reject Cause
4382 */
4383/*
4384 * Reroute Reject cause value (octet 2)
4385 */
4386
4387
4388static const value_string gsm_a_bssap_reroute_rej_cause_vals[] = {
4389 { 0x0, "Reserved" },
4390 { 0x1, "Reserved" },
4391 { 0x2, "Reserved" },
4392 { 0x3, "Reserved" },
4393 { 0x4, "Reserved" },
4394 { 0x5, "Reserved" },
4395 { 0x6, "Reserved" },
4396 { 0x7, "Reserved" },
4397 { 0x8, "Reserved" },
4398 { 0x9, "Reserved" },
4399 { 0xa, "Reserved" },
4400 { 0xb, "PLMN not allowed" },
4401 { 0xc, "Location area not allowed" },
4402 { 0xd, "Roaming not allowed in this location area" },
4403 { 0xe, "GPRS services not allowed in this PLMN" },
4404 { 0xf, "No suitable cell in location area" },
4405 { 0x10, "CS/PS domain registration coordination required" },
4406 { 0, NULL((void*)0) }
4407};
4408
4409static uint16_t
4410be_reroute_rej_cause(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4411{
4412 uint32_t curr_offset;
4413 curr_offset = offset;
4414
4415 proto_tree_add_item(tree, hf_gsm_a_bssmap_reroute_rej_cause, tvb, curr_offset, 1, ENC_NA0x00000000);
4416 curr_offset+=1;
4417
4418 return curr_offset-offset;
4419
4420}
4421
4422/*
4423 * 3.2.2.113 Send Sequence Number
4424 */
4425static uint16_t
4426be_send_seqn(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4427{
4428 uint32_t curr_offset;
4429 curr_offset = offset;
4430
4431 proto_tree_add_item(tree, hf_gsm_a_bssmap_send_seqn, tvb, curr_offset, 1, ENC_NA0x00000000);
4432 curr_offset+=1;
4433
4434 return curr_offset-offset;
4435
4436}
4437
4438/*
4439 * 3.2.2.114 Reroute complete outcome
4440 */
4441static const value_string gsm_a_bssap_reroute_outcome_vals[] = {
4442 { 0x0, "Reserved" },
4443 { 0x1, "MS is accepted" },
4444 { 0x2, "MS is not accepted" },
4445 { 0x3, "MS is already registered" },
4446 { 0, NULL((void*)0) }
4447};
4448
4449static uint16_t
4450be_reroute_outcome(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4451{
4452 uint32_t curr_offset;
4453 curr_offset = offset;
4454
4455 proto_tree_add_item(tree, hf_gsm_a_bssmap_reroute_outcome, tvb, curr_offset, 1, ENC_NA0x00000000);
4456 curr_offset+=1;
4457
4458 return curr_offset-offset;
4459
4460}
4461
4462/*
4463 * 3.2.2.115 Global Call Reference as per 3GPP TS 29.205 Section B.2.1.9
4464 */
4465static uint16_t
4466be_global_call_ref(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4467{
4468 dissect_bicc_mst_lcls_gcr(tvb, tree, offset, len);
4469
4470 return len;
4471}
4472
4473/*
4474 * 3.2.2.116 LCLS-Configuration
4475 */
4476static const value_string gsm_a_bssap_lcls_conf_vals[] = {
4477 { 0x0, "Connect both-way" },
4478 { 0x1, "Connect both-way and bi-cast UL to the core network" },
4479 { 0x2, "Connect both-way and send access DL from the core network" },
4480 { 0x3, "Connect both-way and send access DL from the core network, block local DL user data" },
4481 { 0x4, "Connect both-way and bi-cast UL to the core network with send access DL from the core network" },
4482 { 0x5, "Connect both-way and bi-cast UL to the core network with send access DL from the core network, block local DL user data" },
4483 { 0, NULL((void*)0) }
4484};
4485
4486static uint16_t
4487be_lcls_conf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4488{
4489 uint32_t curr_offset;
4490 curr_offset = offset;
4491
4492 proto_tree_add_item(tree, hf_gsm_a_bssmap_lcls_conf, tvb, curr_offset, 1, ENC_NA0x00000000);
4493 curr_offset+=1;
4494
4495 return curr_offset-offset;
4496
4497}
4498
4499/*
4500 * 3.2.2.117 LCLS-Connection-Status-Control
4501 */
4502static const value_string gsm_a_bssap_lcls_con_status_control_vals[] = {
4503 { 0x0, "Connect" },
4504 { 0x1, "Do not connect" },
4505 { 0x2, "Release LCLS" },
4506 { 0x3, "Bi-cast UL at Handover" },
4507 { 0x4, "Bi-cast UL and receive DL data at Handover" },
4508 { 0, NULL((void*)0) }
4509};
4510
4511static uint16_t
4512be_lcls_con_status_control(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4513{
4514 uint32_t curr_offset;
4515 curr_offset = offset;
4516
4517 proto_tree_add_item(tree, hf_gsm_a_bssmap_lcls_con_status_control, tvb, curr_offset, 1, ENC_NA0x00000000);
4518 curr_offset+=1;
4519
4520 return curr_offset-offset;
4521
4522}
4523
4524/*
4525 * 3.2.2.118 LCLS-Correlation-Not-Needed
4526 * No data
4527 */
4528
4529/*
4530 * 3.2.2.119 LCLS-BSS-Status
4531 */
4532static const value_string gsm_a_bssmap_lcls_bss_status_vals[] = {
4533 { 0x0, "Call not yet locally switched" },
4534 { 0x1, "Call not possible to be locally switched" },
4535 { 0x2, "Call is no longer locally switched" },
4536 { 0x3, "Requested LCLS configuration is not supported" },
4537 { 0x4, "Call is locally switched with requested LCLS configuration" },
4538 { 0, NULL((void*)0) }
4539};
4540
4541static uint16_t
4542be_lcls_bss_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4543{
4544 uint32_t curr_offset;
4545 curr_offset = offset;
4546
4547 proto_tree_add_item(tree, hf_gsm_a_bssmap_lcls_bss_status, tvb, curr_offset, 1, ENC_NA0x00000000);
4548 curr_offset+=1;
4549
4550 return curr_offset-offset;
4551
4552}
4553
4554/*
4555 * 3.2.2.120 LCLS-Break-Request
4556 * No data
4557 */
4558
4559/*
4560 * 3.2.2.121 CSFB Indication
4561 * No data
4562 */
4563
4564/*
4565 * 3.2.2.123 Source eNB to target eNB transparent information (E-UTRAN)
4566 */
4567
4568/*
4569 * 3.2.2.124 CS to PS SRVCC Indication
4570 */
4571
4572/*
4573 * 3.2.2.125 CN to MS transparent information
4574 */
4575
4576/*
4577 * 3.2.2.126 Selected PLMN ID
4578 */
4579static uint16_t
4580be_selected_plmn_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4581{
4582
4583 dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_NONE, true1);
4584 return 3;
4585
4586}
4587
4588/*
4589 * 3.2.2.127 Last used E-UTRAN PLMN ID
4590 */
4591static uint16_t
4592be_last_used_eutran_plmn_id(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char* add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4593{
4594
4595 dissect_e212_mcc_mnc(tvb, pinfo, tree, offset, E212_NONE, true1);
4596
4597 return 3;
4598
4599}
4600
4601/* Osmocom extension: Osmux CID */
4602static uint16_t
4603be_osmocom_osmux_cid(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4604{
4605 proto_tree_add_item(tree, hf_gsm_a_bssmap_osmocom_osmux_cid, tvb, offset, 1, ENC_NA0x00000000);
4606 return 1;
4607}
4608
4609
4610uint16_t (* const bssmap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string, int string_len) = {
4611 NULL((void*)0), /* Undefined */
4612 be_cic, /* Circuit Identity Code */
4613 NULL((void*)0), /* Reserved */
4614 be_res_avail, /* Resource Available */
4615 bssmap_dissect_cause,/* Cause */
4616 be_cell_id, /* Cell Identifier */
4617 be_prio, /* Priority */
4618 be_l3_header_info, /* Layer 3 Header Information */
4619 de_mid, /* IMSI */
4620 be_tmsi, /* TMSI */
4621 be_enc_info, /* Encryption Information */
4622 be_chan_type, /* Channel Type */
4623 be_periodicity, /* Periodicity */
4624 be_ext_res_ind, /* Extended Resource Indicator */
4625 be_num_ms, /* Number Of MSs */
4626 NULL((void*)0), /* Reserved */
4627 NULL((void*)0), /* Reserved */
4628 NULL((void*)0), /* Reserved */
4629 de_ms_cm_2, /* Classmark Information Type 2 */
4630 de_ms_cm_3, /* Classmark Information Type 3 */
4631 be_int_band, /* Interference Band To Be Used */
4632 de_rr_cause, /* RR Cause */
4633 NULL((void*)0), /* Reserved */
4634 be_l3_info, /* Layer 3 Information */
4635 be_dlci, /* DLCI */
4636 be_down_dtx_flag, /* Downlink DTX Flag */
4637 be_cell_id_list, /* Cell Identifier List */
4638 NULL((void*)0) /* no associated data */, /* Response Request */
4639 be_res_ind_method, /* Resource Indication Method */
4640 de_ms_cm_1, /* Classmark Information Type 1 */
4641 be_cic_list, /* Circuit Identity Code List */
4642 be_diag, /* Diagnostics */
4643 be_l3_msg, /* Layer 3 Message Contents */
4644 be_chosen_chan, /* Chosen Channel */
4645 be_tot_res_acc, /* Total Resource Accessible */
4646 be_ciph_resp_mode, /* Cipher Response Mode */
4647 be_cha_needed, /* Channel Needed */
4648 be_trace_type, /* Trace Type */
4649 be_trace_trigger_id,/* TriggerID */
4650 be_trace_reference, /* Trace Reference */
4651 be_trace_transaction_id, /* TransactionID */
4652 de_mid, /* Mobile Identity */
4653 be_trace_omc_id, /* OMCID */
4654 be_for_ind, /* Forward Indicator */
4655 be_chosen_enc_alg, /* Chosen Encryption Algorithm */
4656 be_cct_pool, /* Circuit Pool */
4657 NULL((void*)0), /* Circuit Pool List */
4658 NULL((void*)0), /* Time Indication */
4659 NULL((void*)0), /* Resource Situation */
4660 be_curr_chan_1, /* Current Channel Type 1 */
4661 be_que_ind, /* Queueing Indicator */
4662 be_ass_req, /* Assignment Requirement */
4663 NULL((void*)0), /* Undefined */
4664 NULL((void*)0) /* no associated data */, /* Talker Flag */
4665 NULL((void*)0) /* no associated data */, /* Connection Release Requested */
4666 de_d_gb_call_ref, /* Group Call Reference */
4667 be_emlpp_prio, /* eMLPP Priority */
4668 be_conf_evo_ind, /* Configuration Evolution Indication */
4669 be_field_element_dissect, /* Old BSS to New BSS Information */
4670 be_lsa_id, /* LSA Identifier */
4671 be_lsa_id_list, /* LSA Identifier List */
4672 be_lsa_info, /* LSA Information */
4673 NULL((void*)0), /* LCS QoS Dissected in packet-gsm_bssmap_le.c*/
4674 NULL((void*)0), /* LSA access control suppression */
4675 be_speech_ver, /* Speech Version */
4676 NULL((void*)0), /* Undefined */
4677 NULL((void*)0), /* Undefined */
4678 be_lcs_prio, /* LCS Priority */
4679 be_loc_type, /* Location Type */
4680 be_loc_est, /* Location Estimate */
4681 be_pos_data, /* Positioning Data */
4682 NULL((void*)0), /* 3.2.2.66 LCS Cause Dissected in packet-gsm_bssmap_le.c */
4683 NULL((void*)0), /* LCS Client Type Dissected in packet-gsm_bssmap_le.c */
4684 be_apdu, /* APDU */
4685 NULL((void*)0), /* Network Element Identity */
4686 be_gps_assist_data, /* GPS Assistance Data */
4687 NULL((void*)0), /* Deciphering Keys (dissected in packet-gsm_bssmap_le)*/
4688 be_ret_err_req, /* Return Error Request */
4689 be_ret_err_cause, /* Return Error Cause */
4690 be_seg, /* Segmentation */
4691 be_serv_ho, /* Service Handover */
4692 be_src_rnc_to_tar_rnc_umts, /* Source RNC to target RNC transparent information (UMTS) */
4693 be_src_rnc_to_tar_rnc_cdma, /* Source RNC to target RNC transparent information (cdma2000) */
4694 be_geran_cls_m, /* GERAN Classmark */
4695 be_geran_bsc_cont, /* GERAN BSC Container */
4696 be_vel_est, /* Velocity Estimate */
4697 NULL((void*)0), /* Undefined */
4698 NULL((void*)0), /* Undefined */
4699 NULL((void*)0), /* Undefined */
4700 NULL((void*)0), /* Undefined */
4701 NULL((void*)0), /* Undefined */
4702 NULL((void*)0), /* Undefined */
4703 NULL((void*)0), /* Undefined */
4704 NULL((void*)0), /* Undefined */
4705 NULL((void*)0), /* Undefined */
4706 NULL((void*)0), /* Undefined */
4707 NULL((void*)0), /* Undefined */
4708 be_field_element_dissect, /* New BSS to Old BSS Information */
4709 NULL((void*)0), /* Undefined */
4710 be_inter_sys_inf, /* Inter-System Information */
4711 be_sna_acc_inf, /* SNA Access Information */
4712 be_vstk_rand_info, /* VSTK_RAND Information */
4713 be_vstk_info, /* VSTK Information */
4714 be_paging_inf, /* Paging Information */
4715 de_mid, /* 3.2.2.86 IMEI (use same dissector as IMSI)*/
4716 be_vgcs_feat_flg, /* VGCS Feature Flags */
4717 be_talker_pri, /* Talker Priority */
4718 NULL((void*)0), /* no data Emergency Set Indication */
4719 be_talker_id, /* Talker Identity */
4720 be_cell_id_list_seg, /* Cell Identifier List Segment */
4721 be_sms_to_vgcs, /* SMS to VGCS */
4722 be_vgcs_talker_mode,/* VGCS Talker Mode */
4723 be_vgcs_vbs_cell_status, /* VGCS/VBS Cell Status */
4724 be_cell_id_lst_seg_f_est_cells, /* Cell Identifier List Segment for established cells */
4725 be_cell_id_lst_seg_f_cell_tb_est, /* Cell Identifier List Segment for cells to be established */
4726 be_cell_id_lst_seg_f_rel_cell, /* Cell Identifier List Segment for released cells - no user present */
4727 be_cell_id_lst_seg_f_not_est_cell, /* Cell Identifier List Segment for not established cells - no establishment possible */
4728 be_ganss_ass_dta, /* GANSS Assistance Data */
4729 be_ganss_pos_dta, /* GANSS Positioning Data */
4730 be_ganss_loc_type, /* GANSS Location Type */
4731 be_app_data, /* Application Data */
4732 be_app_data_id, /* Data Identity */
4733 be_app_data_inf, /* Application Data Information */
4734 be_msisdn, /* MSISDN */
4735 be_aoip_trans_lay_add, /* AoIP Transport Layer Address */
4736 be_speech_codec_lst,/* Speech Codec List */
4737 be_speech_codec, /* Speech Codec */
4738 be_call_id, /* Call Identifier */
4739 be_call_id_lst, /* Call Identifier List */
4740 be_a_itf_sel_for_reset, /* A-Interface Selector for RESET */
4741 NULL((void*)0), /* Undefined */
4742 be_kc128, /* Kc128 */
4743 be_csg_id, /* CSG Identifier */
4744 NULL((void*)0), /* Redirect Attempt Flag 3.2.2.111 No data */
4745 be_reroute_rej_cause, /* Reroute Reject Cause 3.2.2.112 */
4746 be_send_seqn, /* Send Sequence Number 3.2.2.113 */
4747 be_reroute_outcome, /* Reroute complete outcome 3.2.2.114 */
4748 be_global_call_ref, /* Global Call Reference 3.2.2.115 */
4749 be_lcls_conf, /* LCLS-Configuration 3.2.2.116 */
4750 be_lcls_con_status_control, /* LCLS-Connection-Status-Control 3.2.2.117 */
4751 NULL((void*)0), /* LCLS-Correlation-Not-Needed 3.2.2.118 No data */
4752 be_lcls_bss_status, /* LCLS-BSS-Status 3.2.2.119 */
4753 NULL((void*)0), /* LCLS-Break-Request 3.2.2.120 No data */
4754 NULL((void*)0), /* CSFB Indication 3.2.2.121 No data */
4755 NULL((void*)0), /* CS to PS SRVCC 3.2.2.122 */
4756 NULL((void*)0), /* Source eNB to target eNB transparent information (E-UTRAN)" 3.2.2.123 */
4757 NULL((void*)0), /* CS to PS SRVCC Indication 3.2.2.124 */
4758 NULL((void*)0), /* CN to MS transparent information 3.2.2.125 */
4759 be_selected_plmn_id, /* Selected PLMN ID 3.2.2.126 */
4760 be_last_used_eutran_plmn_id, /* Last used E-UTRAN PLMN ID 3.2.2.127 */
4761 NULL((void*)0), /* 0x96 */
4762 NULL((void*)0), /* 0x97 */
4763 NULL((void*)0), /* 0x98 */
4764 NULL((void*)0), /* 0x99 */
4765 NULL((void*)0), /* 0x9a */
4766 NULL((void*)0), /* 0x9b */
4767 NULL((void*)0), /* 0x9c */
4768 NULL((void*)0), /* 0x9d */
4769 NULL((void*)0), /* 0x9e */
4770 NULL((void*)0), /* 0x9f */
4771 NULL((void*)0), /* 0xa0 */
4772 NULL((void*)0), /* 0xa1 */
4773 NULL((void*)0), /* 0xa2 */
4774 NULL((void*)0), /* 0xa3 */
4775 NULL((void*)0), /* 0xa4 */
4776 NULL((void*)0), /* 0xa5 */
4777 NULL((void*)0), /* 0xa6 */
4778 NULL((void*)0), /* 0xa7 */
4779 NULL((void*)0), /* 0xa8 */
4780 NULL((void*)0), /* 0xa9 */
4781 NULL((void*)0), /* 0xaa */
4782 NULL((void*)0), /* 0xab */
4783 NULL((void*)0), /* 0xac */
4784 NULL((void*)0), /* 0xad */
4785 NULL((void*)0), /* 0xae */
4786 NULL((void*)0), /* 0xaf */
4787 NULL((void*)0), /* 0xb0 */
4788 NULL((void*)0), /* 0xb1 */
4789 NULL((void*)0), /* 0xb2 */
4790 NULL((void*)0), /* 0xb3 */
4791 NULL((void*)0), /* 0xb4 */
4792 NULL((void*)0), /* 0xb5 */
4793 NULL((void*)0), /* 0xb6 */
4794 NULL((void*)0), /* 0xb7 */
4795 NULL((void*)0), /* 0xb8 */
4796 NULL((void*)0), /* 0xb9 */
4797 NULL((void*)0), /* 0xba */
4798 NULL((void*)0), /* 0xbb */
4799 NULL((void*)0), /* 0xbc */
4800 NULL((void*)0), /* 0xbd */
4801 NULL((void*)0), /* 0xbe */
4802 NULL((void*)0), /* 0xbf */
4803 NULL((void*)0), /* 0xc0 */
4804 NULL((void*)0), /* 0xc1 */
4805 NULL((void*)0), /* 0xc2 */
4806 NULL((void*)0), /* 0xc3 */
4807 NULL((void*)0), /* 0xc4 */
4808 NULL((void*)0), /* 0xc5 */
4809 NULL((void*)0), /* 0xc6 */
4810 NULL((void*)0), /* 0xc7 */
4811 NULL((void*)0), /* 0xc8 */
4812 NULL((void*)0), /* 0xc9 */
4813 NULL((void*)0), /* 0xca */
4814 NULL((void*)0), /* 0xcb */
4815 NULL((void*)0), /* 0xcc */
4816 NULL((void*)0), /* 0xcd */
4817 NULL((void*)0), /* 0xce */
4818 NULL((void*)0), /* 0xcf */
4819 NULL((void*)0), /* 0xd0 */
4820 NULL((void*)0), /* 0xd1 */
4821 NULL((void*)0), /* 0xd2 */
4822 NULL((void*)0), /* 0xd3 */
4823 NULL((void*)0), /* 0xd4 */
4824 NULL((void*)0), /* 0xd5 */
4825 NULL((void*)0), /* 0xd6 */
4826 NULL((void*)0), /* 0xd7 */
4827 NULL((void*)0), /* 0xd8 */
4828 NULL((void*)0), /* 0xd9 */
4829 NULL((void*)0), /* 0xda */
4830 NULL((void*)0), /* 0xdb */
4831 NULL((void*)0), /* 0xdc */
4832 NULL((void*)0), /* 0xdd */
4833 NULL((void*)0), /* 0xde */
4834 NULL((void*)0), /* 0xdf */
4835 NULL((void*)0), /* 0xe0 */
4836 NULL((void*)0), /* 0xe1 */
4837 NULL((void*)0), /* 0xe2 */
4838 NULL((void*)0), /* 0xe3 */
4839 NULL((void*)0), /* 0xe4 */
4840 NULL((void*)0), /* 0xe5 */
4841 NULL((void*)0), /* 0xe6 */
4842 NULL((void*)0), /* 0xe7 */
4843 NULL((void*)0), /* 0xe8 */
4844 NULL((void*)0), /* 0xe9 */
4845 NULL((void*)0), /* 0xea */
4846 NULL((void*)0), /* 0xeb */
4847 NULL((void*)0), /* 0xec */
4848 NULL((void*)0), /* 0xed */
4849 NULL((void*)0), /* 0xee */
4850 NULL((void*)0), /* 0xef */
4851 NULL((void*)0), /* Osmocom extension: Osmux Support */
4852 be_osmocom_osmux_cid, /* Osmocom extension: Osmux CID */
4853 NULL((void*)0) /* NONE */
4854
4855};
4856/* 3.2.3 Signalling Field Element Coding */
4857/* 3.2.3.1 Extra information */
4858static const value_string fe_extra_info_prec_vals[] = {
4859 { 0, "The old BSS recommends that this allocation request should not cause a pre-emption an existing connection" },
4860 { 1, "The old BSS recommends that this allocation request is allowed to preempt an existing connection based on the information supplied in the Priority information element, if available" },
4861 { 0, NULL((void*)0)}
4862};
4863
4864static const value_string fe_extra_info_lcs_vals[] = {
4865 { 0, "No ongoing LCS procedure" },
4866 { 1, "An ongoing LCS procedure was interrupted by handover. The new BSS may notify the SMLC when the handover is completed" },
4867 { 0, NULL((void*)0)}
4868};
4869
4870static const value_string fe_extra_info_ue_prob_vals[] = {
4871 { 0, "This MS supports handover to UMTS" },
4872 { 1, "This MS does not support handover to UMTS" },
4873 { 0, NULL((void*)0)}
4874};
4875
4876static uint16_t
4877be_fe_extra_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4878{
4879 uint32_t curr_offset;
4880
4881 curr_offset = offset;
4882 proto_tree_add_item(tree, hf_fe_extra_info_prec, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4883 proto_tree_add_item(tree, hf_fe_extra_info_lcs, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4884 proto_tree_add_item(tree, hf_fe_extra_info_ue_prob, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4885 proto_tree_add_item(tree, hf_fe_extra_info_spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4886 curr_offset++;
4887
4888 return curr_offset-offset;
4889}
4890
4891/* 3.2.3.2 Current Channel type 2 */
4892static uint16_t
4893be_fe_cur_chan_type2(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4894{
4895 uint32_t curr_offset;
4896
4897 curr_offset = offset;
4898 proto_tree_add_item(tree, hf_fe_cur_chan_type2_chan_mode, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4899 proto_tree_add_item(tree, hf_fe_cur_chan_type2_chan_mode_spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4900 curr_offset++;
4901 proto_tree_add_item(tree, hf_fe_cur_chan_type2_chan_field, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4902 proto_tree_add_item(tree, hf_fe_cur_chan_type2_chan_field_spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4903 curr_offset++;
4904
4905 return curr_offset-offset;
4906}
4907
4908/* 3.2.3.3 Target cell radio information */
4909static uint16_t
4910be_fe_target_radio_cell_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4911{
4912 uint32_t curr_offset;
4913
4914 curr_offset = offset;
4915 proto_tree_add_item(tree, hf_fe_target_radio_cell_info_rxlev_ncell, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4916 proto_tree_add_item(tree, hf_fe_target_radio_cell_info_rxlev_ncell_spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4917 curr_offset++;
4918
4919 return curr_offset-offset;
4920}
4921
4922/* 3.2.3.4 GPRS Suspend Information */
4923static uint16_t
4924be_fe_gprs_suspend_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4925{
4926 uint32_t curr_offset = offset;
4927
4928 /* This Field Element contains the contents of the Gb interface SUSPEND ACK PDU,
4929 Call the BSSGP dissector here, assuming that the encoding is per 48.018 */
4930
4931
4932 bssgp_suspend_ack(tvb, tree, pinfo, offset, len);
4933 curr_offset += len;
4934
4935 return curr_offset-offset;
4936}
4937
4938/* 3.2.3.5 MultiRate configuration Information */
4939
4940/* 3.2.3.6 Dual Transfer Mode information */
4941static const value_string gsm_a_bssmap_dtm_info_dtm_ind_vals[] = {
4942 { 0, "The MS has resources allocated exclusively for the CS domain in the old cell" },
4943 { 1, "The MS has resources allocated for both the CS and PS domains in the old cell" },
4944 { 0, NULL((void*)0) }
4945};
4946
4947static const value_string gsm_a_bssmap_dtm_info_sto_ind_vals[] = {
4948 { 0, "The MS is in multislot operation in the old cell" },
4949 { 1, "The MS is in single timeslot operation in the old cell" },
4950 { 0, NULL((void*)0) }
4951};
4952
4953static const value_string gsm_a_bssmap_dtm_info_egprs_ind_vals[] = {
4954 { 0, "The MS has no TBF using E-GPRS in the old cell" },
4955 { 1, "The MS has a TBF using E-GPRS in the old cell" },
4956 { 0, NULL((void*)0) }
4957};
4958
4959static uint16_t
4960be_fe_dual_transfer_mode_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4961{
4962 uint32_t curr_offset;
4963
4964 curr_offset = offset;
4965 proto_tree_add_item(tree, hf_fe_dtm_info_dtm_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4966 proto_tree_add_item(tree, hf_fe_dtm_info_sto_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4967 proto_tree_add_item(tree, hf_fe_dtm_info_egprs_ind, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4968 proto_tree_add_item(tree, hf_fe_dtm_info_spare_bits, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
4969 curr_offset++;
4970
4971 return curr_offset-offset;
4972}
4973
4974/* 3.2.3.7 Inter RAT Handover Info */
4975static uint16_t
4976be_fe_inter_rat_handover_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
4977{
4978 tvbuff_t *container_tvb;
4979
4980 /* Octets 3-n are encoded as Inter RAT Handover Info as defined in 3GPP TS 25.331 */
4981 container_tvb = tvb_new_subset_length(tvb, offset, len);
4982 dissect_rrc_InterRATHandoverInfo_PDU(container_tvb, pinfo, tree, NULL((void*)0));
4983
4984 return len;
4985}
4986
4987/* 3.2.3.8 cdma2000 Capability Information */
4988
4989/* 3.2.3.9 Downlink Cell Load Information */
4990
4991/* 3.2.3.10 Uplink Cell Load Information */
4992
4993
4994static const value_string gsm_a_bssmap_cell_load_nrt_vals[] = {
4995 { 0, "NRT Load is low" },
4996 { 1, "NRT load is medium" },
4997 { 2, "NRT load is high. (Probability to admit a new user is low.)" },
4998 { 3, "NRT overload. (Probability to admit a new user is low, packets are discarded and the source is recommended to reduce the data flow.)" },
4999 { 0, NULL((void*)0) }
5000};
5001
5002/* 3.2.3.11 Cell Load Information Group */
5003static uint16_t
5004be_fe_cell_load_info_group(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
5005{
5006 uint32_t curr_offset;
5007
5008 curr_offset = offset;
5009 curr_offset += be_cell_id(tvb, tree, pinfo, curr_offset, len, NULL((void*)0), 0);
5010 curr_offset += be_field_element_dissect(tvb, tree, pinfo, curr_offset, len + offset - curr_offset, NULL((void*)0), 0);
5011
5012 return curr_offset-offset;
5013}
5014
5015/* 3.2.3.12 Cell Load Information */
5016static uint16_t
5017be_fe_cell_load_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
5018{
5019 uint32_t curr_offset;
5020
5021 curr_offset = offset;
5022 proto_tree_add_item(tree, hf_fe_cell_load_info_cell_capacity_class, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
5023 curr_offset++;
5024 proto_tree_add_item(tree, hf_fe_cell_load_info_load_value, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
5025 curr_offset++;
5026 proto_tree_add_item(tree, hf_fe_cell_load_info_rt_load_value, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
5027 curr_offset++;
5028 proto_tree_add_item(tree, hf_fe_cell_load_info_nrt_load_information_value, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
5029 curr_offset++;
5030
5031 return curr_offset-offset;
5032}
5033
5034/* 3.2.3.13 PS Indication */
5035static uint16_t
5036be_fe_ps_indication(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
5037{
5038 uint32_t curr_offset;
5039
5040 curr_offset = offset;
5041 proto_tree_add_item(tree, hf_fe_ps_indication, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
5042 curr_offset++;
5043
5044 return curr_offset-offset;
5045}
5046
5047/* 3.2.3.14 DTM Handover Command Indication */
5048static uint16_t
5049be_fe_dtm_ho_command_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U___attribute__((unused)), uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
5050{
5051 uint32_t curr_offset;
5052
5053 curr_offset = offset;
5054 proto_tree_add_item(tree, hf_fe_dtm_ho_command_ind_spare, tvb, curr_offset, 1, ENC_BIG_ENDIAN0x00000000);
5055 curr_offset++;
5056
5057 return curr_offset-offset;
5058}
5059
5060/* 3.2.3.17 Source Cell ID */
5061static uint16_t
5062be_fe_source_cell_id(tvbuff_t* tvb, proto_tree* tree, packet_info* pinfo _U___attribute__((unused)), uint32_t offset, unsigned len, char* add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
5063{
5064 tvbuff_t* new_tvb;
5065 uint32_t curr_offset;
5066
5067 curr_offset = offset;
5068
5069 /* Tracking Area Identity: Octets 3 to 7 contain the value part of the Tracking Area Identity IE defined in 3GPP TS 24.301, not including 3GPP TS 24.301 IEI. */
5070 curr_offset += de_emm_trac_area_id(tvb, tree, pinfo, curr_offset, 5, NULL((void*)0), 0);
5071 /* E-UTRAN CGI: Octets 8 - m contain the value part of the E-UTRAN CGI IE defined 3GPP TS 36.413 for the source cell. */
5072 new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
5073 curr_offset += dissect_s1ap_EUTRAN_CGI_PDU(new_tvb , pinfo, tree, NULL((void*)0));
5074 /* Global eNB ID: Octets (m+1) - n contain the value part of the Global eNB ID IE defined 3GPP TS 36.413 for the source eNB. */
5075 new_tvb = tvb_new_subset_remaining(tvb, curr_offset);
5076 dissect_s1ap_Global_ENB_ID_PDU(new_tvb, pinfo, tree, NULL((void*)0));
5077
5078 return len;
5079}
5080
5081
5082static uint16_t (* const bssmap_bss_to_bss_element_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len, char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused))) = {
5083 be_fe_extra_info, /* { 0x01, "Extra information" }, */
5084 be_fe_cur_chan_type2, /* { 0x02, "Current Channel Type 2" }, */
5085 be_fe_target_radio_cell_info, /* { 0x03, "Target cell radio information" }, */
5086 be_fe_gprs_suspend_info, /* { 0x04, "GPRS Suspend information" }, */
5087 de_rr_multirate_conf, /* { 0x05, "MultiRate configuration information" }, */
5088 be_fe_dual_transfer_mode_info, /* { 0x06, "Dual Transfer Mode Information" }, */
5089 be_fe_inter_rat_handover_info, /* { 0x07, "Inter RAT Handover Info" }, */
5090 NULL((void*)0), /* { 0x08, "cdma2000 Capability Information" }, */
5091 be_fe_cell_load_info, /* { 0x09, "Downlink Cell Load Information" }, */
5092 be_fe_cell_load_info, /* { 0x0a, "Uplink Cell Load Information" }, */
5093 be_fe_cell_load_info_group, /* { 0x0b, "Cell Load Information Group" }, 3.2.3.11 */
5094 be_fe_cell_load_info, /* { 0x0c, "Cell Load Information" }, */
5095 be_fe_ps_indication, /* { 0x0d, "PS Indication" }, 3.2.3.13 */
5096 be_fe_dtm_ho_command_ind, /* { 0x0e, "DTM Handover Command Indication" }, 3.2.3.14 */
5097 NULL((void*)0), /* { 0x0f, "IRAT Measurement Configuration" }, 3.2.3.16 */
5098 be_fe_source_cell_id, /* { 0x10, "Source Cell ID" }, 3.2.3.17 */
5099 NULL((void*)0), /* { 0x11, "IRAT Measurement Configuration (extended E-ARFCNs)" }, 3.2.3.18 */
5100 be_vgcs_talker_mode, /* { 0x6f, "VGCS talker mode" }, */ /* not really a field element
5101 but does appear in old bss to new bss info 3.2.2.93 */
5102 be_last_used_eutran_plmn_id, /* { 0x95, "Last used E-UTRAN PLMN ID" }, 3.2.2.127 */
5103 NULL((void*)0), /* { 0xfe, "D-RNTI" }, 3.2.3.15 */
5104 NULL((void*)0), /* NONE */
5105};
5106
5107#define NUM_BSS_ELEMENT_FCNS(int)(sizeof (bssmap_bss_to_bss_element_fcn) / sizeof (bssmap_bss_to_bss_element_fcn
)[0])
(int)array_length(bssmap_bss_to_bss_element_fcn)(sizeof (bssmap_bss_to_bss_element_fcn) / sizeof (bssmap_bss_to_bss_element_fcn
)[0])
5108
5109static uint16_t
5110be_field_element_dissect(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len _U___attribute__((unused)), char *add_string _U___attribute__((unused)), int string_len _U___attribute__((unused)))
5111{
5112 uint32_t curr_offset, ie_len, fe_start_offset, ie_id_off, len_len;
5113 int idx;
5114 const char *str;
5115 proto_tree * bss_to_bss_tree = NULL((void*)0);
5116 bool_Bool has_len = true1;
5117
5118 curr_offset = offset;
5119
5120
5121 while (curr_offset - offset + 2 < len) {
5122 uint8_t oct;
5123 /*
5124 * add name
5125 */
5126 ie_id_off = curr_offset;
5127 oct = tvb_get_uint8(tvb, curr_offset++);
5128
5129 str = try_val_to_str_idx((uint32_t) oct, bssmap_field_element_ids, &idx);
5130 /* It looks like a few IEs come without length Check for those here */
5131 switch (oct) {
5132 case 0x95:
5133 /* 3.2.2.127 Last used E-UTRAN PLMN ID */
5134 len_len = 0;
5135 ie_len = 3; /* Data part */
5136 has_len = false0;
5137 break;
5138 default:
5139 len_len = 1;
5140 ie_len = tvb_get_uint8(tvb, curr_offset++);
5141 break;
5142 }
5143
5144 if (!str)
5145 str = "Unknown";
5146
5147 /* Add subtree */
5148 bss_to_bss_tree = proto_tree_add_subtree_format(tree, tvb, ie_id_off, ie_len + 1 + len_len, ett_bss_to_bss_info, NULL((void*)0), "%s", str);
5149 /*
5150 * add Field Element name and length
5151 */
5152 proto_tree_add_item(bss_to_bss_tree, hf_gsm_a_bssmap_field_elem_id, tvb, ie_id_off, 1, ENC_BIG_ENDIAN0x00000000);
5153 if (has_len) {
5154 proto_tree_add_item(bss_to_bss_tree, hf_gsm_a_bssmap_field_elem_id_len, tvb, curr_offset - 1, 1, ENC_BIG_ENDIAN0x00000000);
5155 }
5156
5157 fe_start_offset = curr_offset;
5158
5159 /*
5160 * decode field element
5161 */
5162 if (idx < 0 || idx >= NUM_BSS_ELEMENT_FCNS(int)(sizeof (bssmap_bss_to_bss_element_fcn) / sizeof (bssmap_bss_to_bss_element_fcn
)[0])
||
5163 (bssmap_bss_to_bss_element_fcn[idx] == NULL((void*)0)))
5164 {
5165 proto_tree_add_expert_format(bss_to_bss_tree, pinfo, &ei_gsm_a_bssmap_not_decoded_yet,
5166 tvb, curr_offset, ie_len, "Field Element not decoded");
5167 curr_offset += ie_len;
5168 }
5169 else
5170 {
5171 /* dissect the field element */
5172 curr_offset += (*bssmap_bss_to_bss_element_fcn[idx])(tvb, bss_to_bss_tree, pinfo, curr_offset, ie_len, NULL((void*)0), 0);
5173
5174 EXTRANEOUS_DATA_CHECK(ie_len, curr_offset - fe_start_offset, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((ie_len) > (curr_offset - fe_start_offset)) { proto_tree_add_expert
(tree, pinfo, &ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset
, (ie_len) - (curr_offset - fe_start_offset)); curr_offset +=
((ie_len) - (curr_offset - fe_start_offset)); }
;
5175
5176 }
5177 }
5178 return len;
5179}
5180/* MESSAGE FUNCTIONS */
5181
5182/*
5183 * [2] 3.2.1.1 ASSIGNMENT REQUEST
5184 * 48.008 8.4.0
5185 */
5186static void
5187bssmap_ass_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5188{
5189 uint32_t curr_offset;
5190 uint32_t consumed;
5191 unsigned curr_len;
5192
5193 curr_offset = offset;
5194 curr_len = len;
5195
5196 /* Channel Type 3.2.2.11 MSC-BSS M 5-13 */
5197 ELEM_MAND_TLV(BE_CHAN_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_CHAN_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CHAN_TYPE, 0, BE_CHAN_TYPE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CHAN_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CHAN_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5198 /* Layer 3 Header Information 3.2.2.9 MSC-BSS O (note 3) 4 */
5199 ELEM_OPT_TLV(BE_L3_HEADER_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_HEADER_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_HEADER_INFO, 0, BE_L3_HEADER_INFO
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5200 /* Priority 3.2.2.18 MSC-BSS O 3 */
5201 ELEM_OPT_TLV(BE_PRIO, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_PRIO, 0, BE_PRIO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5202 /* Circuit Identity Code 3.2.2.2 MSC-BSS O (note 1, 12 3 */
5203 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
5204 /* Downlink DTX Flag 3.2.2.26 MSC-BSS O (note 2) 2 */
5205 ELEM_OPT_TV(BE_DOWN_DTX_FLAG, GSM_A_PDU_TYPE_BSSMAP, BE_DOWN_DTX_FLAG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DOWN_DTX_FLAG, 0, BE_DOWN_DTX_FLAG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5206 /* Interference Band To Be Used 3.2.2.21 MSC-BSS O 2 */
5207 ELEM_OPT_TV(BE_INT_BAND, GSM_A_PDU_TYPE_BSSMAP, BE_INT_BAND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_INT_BAND, 0, BE_INT_BAND, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5208 /* Classmark Information 2 3.2.2.19 MSC-BSS O (note 4) 4-5 */
5209 ELEM_OPT_TLV(BE_CM_INFO_2, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_2, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_2, 0, BE_CM_INFO_2, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5210 /* Group Call Reference 3.2.2.55 MSC-BSS O (note 5) 7 */
5211 ELEM_OPT_TLV(BE_GROUP_CALL_REF, GSM_A_PDU_TYPE_BSSMAP, BE_GROUP_CALL_REF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GROUP_CALL_REF, 0, BE_GROUP_CALL_REF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5212 /* Talker Flag 3.2.2.54 MSC-BSS O (note 6) 1 */
5213 ELEM_OPT_T(BE_TALKER_FLAG, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_FLAG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_TALKER_FLAG, 0, BE_TALKER_FLAG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5214 /* Configuration Evolution Indication 3.2.2.57 MSC-BSS O (note 7) 2 */
5215 ELEM_OPT_TV(BE_CONF_EVO_IND, GSM_A_PDU_TYPE_BSSMAP, BE_CONF_EVO_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CONF_EVO_IND, 0, BE_CONF_EVO_IND
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5216 /* LSA Access Control Suppression 3.2.2.61 MSC-BSS O (note 8) 2 */
5217 ELEM_OPT_TV(BE_LSA_ACC_CTRL, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ACC_CTRL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LSA_ACC_CTRL, 0, BE_LSA_ACC_CTRL
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5218 /* Service Handover 3.2.2.75 MSC-BSS O (note 9) 3 */
5219 ELEM_OPT_TLV(BE_SERV_HO, GSM_A_PDU_TYPE_BSSMAP, BE_SERV_HO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SERV_HO, 0, BE_SERV_HO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5220 /* Encryption Information 3.2.2.10 MSC-BSS O (note 10) 3-n */
5221 ELEM_OPT_TLV(BE_ENC_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_ENC_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_ENC_INFO, 0, BE_ENC_INFO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5222 /* Talker Priority 3.2.2.89 MSC-BSS O (note 11) 2 */
5223 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5224 /* AoIP Transport Layer Address (MGW) 3.2.2.102 MSC-BSS O (note 12) 10-22 */
5225 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5226 /* Codec List (MSC Preferred) 3.2.2.103 MSC-BSS O (note 13) 3-n */
5227 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(MSC Preferred)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(MSC Preferred)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5228 /* Call Identifier 3.2.2.105 MSC-BSS O (note 12) 5 */
5229 ELEM_OPT_TV(BE_CALL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID, 0, BE_CALL_ID, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5230 /* Kc128 3.2.2.109 MSC-BSS C (note 15) 17 */
5231 ELEM_OPT_TV(BE_KC128, GSM_A_PDU_TYPE_BSSMAP, BE_KC128, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_KC128, 0, BE_KC128, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5232 /* Global Call Reference 3.2.2.115 MSC-BSS O (note 16) 3-n*/
5233 ELEM_OPT_TLV(BE_GLOBAL_CALL_REF, GSM_A_PDU_TYPE_BSSMAP, BE_GLOBAL_CALL_REF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GLOBAL_CALL_REF, 0, BE_GLOBAL_CALL_REF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5234 /* LCLS-Configuration 3.2.2.116 MSC-BSS O (note 16) 2*/
5235 ELEM_OPT_TV(BE_LCLS_CONF, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CONF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CONF, 0, BE_LCLS_CONF, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5236 /* LCLS-Connection-Status-Control 3.2.2.117 MSC-BSS O (note 17) 2*/
5237 ELEM_OPT_TV(BE_LCLS_CON_STATUS_CONTROL, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CON_STATUS_CONTROL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CON_STATUS_CONTROL, 0, BE_LCLS_CON_STATUS_CONTROL
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5238 /* LCLS-Correlation-Not-Needed 3.2.2.118 MSC-BSS O (note 18) 1*/
5239 ELEM_OPT_T(BE_LCLS_CORR_NOT_NEEDED, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CORR_NOT_NEEDED, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CORR_NOT_NEEDED, 0, BE_LCLS_CORR_NOT_NEEDED
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5240 /* CS to PS SRVCC 3.2.2.122 MSC-BSS O (note 19) 1*/
5241 /* Osmocom extension: Osmux CID */
5242 ELEM_OPT_TV(BE_OSMOCOM_OSMUX_CID, GSM_A_PDU_TYPE_BSSMAP, BE_OSMOCOM_OSMUX_CID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_OSMOCOM_OSMUX_CID, 0, BE_OSMOCOM_OSMUX_CID
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5243
5244 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5245}
5246
5247/*
5248 * [2] 3.2.1.2 ASSIGNMENT COMPLETE
5249 */
5250static void
5251bssmap_ass_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5252{
5253 uint32_t curr_offset;
5254 uint32_t consumed;
5255 unsigned curr_len;
5256
5257 curr_offset = offset;
5258 curr_len = len;
5259
5260 /* RR Cause 3.2.2.22 BSS-MSC O 2 */
5261 ELEM_OPT_TV(BE_RR_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_RR_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RR_CAUSE, 0, BE_RR_CAUSE, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5262 /* Circuit Identity Code 3.2.2.2 BSS-MSC O (note 4) 3 */
5263 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
5264 /* Cell Identifier 3.2.2.17 BSS-MSC O (note 1) 3-10 */
5265 ELEM_OPT_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5266 /* Chosen Channel 3.2.2.33 BSS-MSC O (note 3) 2 */
5267 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5268 /* Chosen Encryption Algorithm 3.2.2.44 BSS-MSC O (note 5) 2 */
5269 ELEM_OPT_TV(BE_CHOSEN_ENC_ALG, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_ENC_ALG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_ENC_ALG, 0, BE_CHOSEN_ENC_ALG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5270 /* Circuit Pool 3.2.2.45 BSS-MSC O (note 2) 2 */
5271 ELEM_OPT_TV(BE_CCT_POOL, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL, 0, BE_CCT_POOL, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5272 /* Speech Version (Chosen) 3.2.2.51 BSS-MSC O (note 6) 2 */
5273 ELEM_OPT_TV(BE_SPEECH_VER, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_VER, " (Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_VER, 0, BE_SPEECH_VER,
curr_offset, " (Chosen)")) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5274 /* LSA Identifier 3.2.2.15 BSS-MSC O (note 7) 5 */
5275 ELEM_OPT_TLV(BE_LSA_ID, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LSA_ID, 0, BE_LSA_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5276 /* Talker Priority 3.2.2.89 BSS-MSC O (note 8) 2 */
5277 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5278 /* AoIP Transport Layer Address (BSS) 3.2.2.102 BSS-MSC O (note 9) 10-22 */
5279 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5280 /* Speech Codec (Chosen) 3.2.2.104 BSS-MSC O (note 10) 3-5 */
5281 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5282 /* Codec List (BSS supported) 3.2.2.103 MSC-BSS O (note 11) 3-n */
5283 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5284 /* LCLS-BSS-Status 3.2.2.119 BSS-MSC O (note 12) 2 */
5285 ELEM_OPT_TV(BE_LCLS_BSS_STATUS, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BSS_STATUS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BSS_STATUS, 0, BE_LCLS_BSS_STATUS
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5286 /* Osmocom extension: Osmux CID */
5287 ELEM_OPT_TV(BE_OSMOCOM_OSMUX_CID, GSM_A_PDU_TYPE_BSSMAP, BE_OSMOCOM_OSMUX_CID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_OSMOCOM_OSMUX_CID, 0, BE_OSMOCOM_OSMUX_CID
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5288
5289 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5290}
5291
5292/*
5293 * [2] 3.2.1.3 ASSIGNMENT FAILURE
5294 */
5295static void
5296bssmap_ass_failure(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5297{
5298 uint32_t curr_offset;
5299 uint32_t consumed;
5300 unsigned curr_len;
5301
5302 curr_offset = offset;
5303 curr_len = len;
5304
5305 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
5306 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5307 /* RR Cause 3.2.2.22 BSS-MSC O 2 */
5308 ELEM_OPT_TV(BE_RR_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_RR_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RR_CAUSE, 0, BE_RR_CAUSE, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5309 /* Circuit Pool 3.2.2.45 BSS-MSC O (note 1) 2 */
5310 ELEM_OPT_TV(BE_CCT_POOL, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL, 0, BE_CCT_POOL, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5311 /* Circuit Pool List 3.2.2.46 BSS-MSC O (note 2) V */
5312 ELEM_OPT_TLV(BE_CCT_POOL_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL_LIST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL_LIST, 0, BE_CCT_POOL_LIST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5313 /* Talker Priority 3.2.2.89 BSS-MSC O (note 3) 2 */
5314 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5315 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 4) 3-n */
5316 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5317
5318 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5319}
5320
5321/*
5322 * [2] 3.2.1.4 BLOCK
5323 */
5324static void
5325bssmap_block(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5326{
5327 uint32_t curr_offset;
5328 uint32_t consumed;
5329 unsigned curr_len;
5330
5331 curr_offset = offset;
5332 curr_len = len;
5333
5334 /* Circuit Identity Code 3.2.2.2 both M 3*/
5335 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5336 /* Cause 3.2.2.5 both M 3-4 */
5337 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5338 /* Connection Release Requested 3.2.2.3 MSC-BSS O 1 */
5339 ELEM_OPT_T(BE_CONN_REL_REQ, GSM_A_PDU_TYPE_BSSMAP, BE_CONN_REL_REQ, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_CONN_REL_REQ, 0, BE_CONN_REL_REQ
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5340
5341 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5342}
5343
5344/*
5345 * [2] 3.2.1.5 BLOCKING ACKNOWLEDGE
5346 */
5347
5348static void
5349bssmap_block_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5350{
5351 uint32_t curr_offset;
5352 uint32_t consumed;
5353 unsigned curr_len;
5354
5355 curr_offset = offset;
5356 curr_len = len;
5357
5358 /* Circuit Identity Code 3.2.2.2 both M 3 */
5359 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5360
5361 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5362}
5363
5364/*
5365 * [2] 3.2.1.6 UNBLOCK
5366 */
5367static void
5368bssmap_unblock(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5369{
5370 uint32_t curr_offset;
5371 uint32_t consumed;
5372 unsigned curr_len;
5373
5374 curr_offset = offset;
5375 curr_len = len;
5376
5377 /* Circuit Identity Code 3.2.2.2 both M 3 */
5378 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5379
5380 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5381}
5382
5383/*
5384 * [2] 3.2.1.7 UNBLOCKING ACKNOWLEDGE
5385 */
5386static void
5387bssmap_unblock_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5388{
5389 uint32_t curr_offset;
5390 uint32_t consumed;
5391 unsigned curr_len;
5392
5393 curr_offset = offset;
5394 curr_len = len;
5395
5396 /* Circuit Identity Code 3.2.2.2 both M 3 */
5397 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5398
5399 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5400}
5401
5402/*
5403 * [2] 3.2.1.8 HANDOVER REQUEST
5404 */
5405static void
5406bssmap_ho_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5407{
5408 uint32_t curr_offset;
5409 uint32_t consumed;
5410 unsigned curr_len;
5411
5412 curr_offset = offset;
5413 curr_len = len;
5414
5415 /* Channel Type 3.2.2.11 MSC-BSS M 5-13 */
5416 ELEM_MAND_TLV(BE_CHAN_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_CHAN_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CHAN_TYPE, 0, BE_CHAN_TYPE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CHAN_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CHAN_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5417 /* Encryption Information 3.2.2.10 MSC-BSS M (note 1) 3-n */
5418 ELEM_MAND_TLV(BE_ENC_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_ENC_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_ENC_INFO, 0, BE_ENC_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_ENC_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_ENC_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5419
5420 /* Classmark Information 1 3.2.2.30 MSC-BSS M# 2
5421 * or
5422 * Classmark Information 2 3.2.2.19 MSC-BSS M (note 6) 4-5
5423 */
5424 ELEM_OPT_TV(BE_CM_INFO_1, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_1, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_1, 0, BE_CM_INFO_1, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5425
5426 ELEM_OPT_TLV(BE_CM_INFO_2, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_2, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_2, 0, BE_CM_INFO_2, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5427 /* Cell Identifier (Serving) 3.2.2.17 MSC-BSS M (note 20) 5-10 */
5428 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, " (Serving)", ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, " (Serving)")) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (" (Serving)" == ((void*)0)) ? "" : " (Serving)" ); } }
;
5429 /* Priority 3.2.2.18 MSC-BSS O 3 */
5430 ELEM_OPT_TLV(BE_PRIO, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_PRIO, 0, BE_PRIO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5431 /* Circuit Identity Code 3.2.2.2 MSC-BSS O (note 7, 28 3 */
5432 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
5433 /* Downlink DTX Flag 3.2.2.26 MSC-BSS O (note 3) 2 */
5434 ELEM_OPT_TV(BE_DOWN_DTX_FLAG, GSM_A_PDU_TYPE_BSSMAP, BE_DOWN_DTX_FLAG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DOWN_DTX_FLAG, 0, BE_DOWN_DTX_FLAG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5435 /* Cell Identifier (Target) 3.2.2.17 MSC-BSS M (note 17) 3-10 */
5436 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, " (Target)", ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, " (Target)")) > 0)) { curr_offset += consumed;
curr_len -= consumed; } else { proto_tree_add_expert_format(
tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element, tvb
, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (" (Target)" == ((void*)0)) ? "" : " (Target)" ); } }
;
5437 /* Interference Band To Be Used 3.2.2.21 MSC-BSS O 2 */
5438 ELEM_OPT_TV(BE_INT_BAND, GSM_A_PDU_TYPE_BSSMAP, BE_INT_BAND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_INT_BAND, 0, BE_INT_BAND, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5439 /* Cause 3.2.2.5 MSC-BSS O (note 9) 3-4 */
5440 ELEM_OPT_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5441 /* Classmark Information 3 3.2.2.20 MSC-BSS O (note 4) 3-34 */
5442 ELEM_OPT_TLV(BE_CM_INFO_3, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_3, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_3, 0, BE_CM_INFO_3, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5443 /* Current Channel type 1 3.2.2.49 MSC-BSS O (note 8) 2 */
5444 ELEM_OPT_TV(BE_CURR_CHAN_1, GSM_A_PDU_TYPE_BSSMAP, BE_CURR_CHAN_1, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CURR_CHAN_1, 0, BE_CURR_CHAN_1
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5445 /* Speech Version (Used) 3.2.2.51 MSC-BSS O (note 10) 2 */
5446 ELEM_OPT_TV(BE_SPEECH_VER, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_VER, " (Used)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_VER, 0, BE_SPEECH_VER,
curr_offset, " (Used)")) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5447 /* Group Call Reference 3.2.2.55 MSC-BSS O (note 5) 7 */
5448 ELEM_OPT_TLV(BE_GROUP_CALL_REF, GSM_A_PDU_TYPE_BSSMAP, BE_GROUP_CALL_REF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GROUP_CALL_REF, 0, BE_GROUP_CALL_REF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5449 /* Talker Flag 3.2.2.54 MSC-BSS O (note 11) 1 */
5450 ELEM_OPT_T(BE_TALKER_FLAG, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_FLAG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_TALKER_FLAG, 0, BE_TALKER_FLAG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5451 /* Configuration Evolution Indication 3.2.2.57 MSC-BSS O (note 12) 2 */
5452 ELEM_OPT_TV(BE_CONF_EVO_IND, GSM_A_PDU_TYPE_BSSMAP, BE_CONF_EVO_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CONF_EVO_IND, 0, BE_CONF_EVO_IND
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5453 /* Chosen Encryption Algorithm (Serving) 3.2.2.44 MSC-BSS O (note 2) 2 */
5454 ELEM_OPT_TV(BE_CHOSEN_ENC_ALG, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_ENC_ALG, " (Serving)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_ENC_ALG, 0, BE_CHOSEN_ENC_ALG
, curr_offset, " (Serving)")) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5455 /* Old BSS to New BSS Information 3.2.2.58 MSC-BSS O (note 13) 2-n */
5456 ELEM_OPT_TLV(BE_OLD2NEW_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_OLD2NEW_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_OLD2NEW_INFO, 0, BE_OLD2NEW_INFO
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5457 /* LSA Information 3.2.2.23 MSC-BSS O (note 14) 3+4n */
5458 ELEM_OPT_TLV(BE_LSA_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LSA_INFO, 0, BE_LSA_INFO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5459 /* LSA Access Control Suppression 3.2.2.61 MSC-BSS O (note 15) 2 */
5460 ELEM_OPT_TV(BE_LSA_ACC_CTRL, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ACC_CTRL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LSA_ACC_CTRL, 0, BE_LSA_ACC_CTRL
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5461 /* Service Handover 3.2.2.75 MSC-BSS O (note 21) 3 */
5462 ELEM_OPT_TLV(BE_SERV_HO, GSM_A_PDU_TYPE_BSSMAP, BE_SERV_HO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SERV_HO, 0, BE_SERV_HO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5463 /* IMSI 3.2.2.6 MSC-BSC O (note 16) 3-10 */
5464 ELEM_OPT_TLV(BE_IMSI, GSM_A_PDU_TYPE_BSSMAP, BE_IMSI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMSI, 0, BE_IMSI, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5465 /* Source RNC to target RNC transparent information (UMTS) 3.2.2.76 MSC-BSS O (note 18) n-m */
5466 ELEM_OPT_TLV(BE_SRC_RNC_TO_TAR_RNC_UMTS, GSM_A_PDU_TYPE_BSSMAP, BE_SRC_RNC_TO_TAR_RNC_UMTS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SRC_RNC_TO_TAR_RNC_UMTS, 0, BE_SRC_RNC_TO_TAR_RNC_UMTS
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5467 /* Source RNC to target RNC transparent information (cdma2000) 3.2.2.77 MSC-BSS O (note 19) n-m */
5468 ELEM_OPT_TLV(BE_SRC_RNC_TO_TAR_RNC_CDMA, GSM_A_PDU_TYPE_BSSMAP, BE_SRC_RNC_TO_TAR_RNC_CDMA, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SRC_RNC_TO_TAR_RNC_CDMA, 0, BE_SRC_RNC_TO_TAR_RNC_CDMA
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5469 /* SNA Access Information 3.2.2.82 MSC-BSC O (note 22) 2+n */
5470 ELEM_OPT_TLV(BE_SNA_ACC_INF, GSM_A_PDU_TYPE_BSSMAP, BE_SNA_ACC_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SNA_ACC_INF, 0, BE_SNA_ACC_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5471 /* Talker Priority 3.2.2.89 MSC-BSC O (note 23) 2 */
5472 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5473 /* AoIP Transport Layer Address (MGW) 3.2.2.102 MSC-BSS O (note 24) 10-22 */
5474 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5475 /* Codec List (MSC Preferred) 3.2.2.103 MSC-BSS O (note 25) 3-n */
5476 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(MSC Preferred)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(MSC Preferred)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5477 /* Call Identifier 3.2.2.105 MSC-BSS O (note 24) 5 */
5478 ELEM_OPT_TV(BE_CALL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID, 0, BE_CALL_ID, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5479 /* Kc128 3.2.2.109 MSC-BSS C (note 27) 17 */
5480 ELEM_OPT_TV(BE_KC128, GSM_A_PDU_TYPE_BSSMAP, BE_KC128, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_KC128, 0, BE_KC128, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5481 /* Global Call Reference 3.2.2.115 MSC - BSS O(note 28) 3 - n*/
5482 ELEM_OPT_TLV(BE_GLOBAL_CALL_REF, GSM_A_PDU_TYPE_BSSMAP, BE_GLOBAL_CALL_REF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GLOBAL_CALL_REF, 0, BE_GLOBAL_CALL_REF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5483 /* LCLS-Configuration 3.2.2.116 MSC - BSS O(note 28) 2*/
5484 ELEM_OPT_TV(BE_LCLS_CONF, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CONF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CONF, 0, BE_LCLS_CONF, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5485 /* LCLS-Connection-Status-Control 3.2.2.117 MSC - BSS O(note 28) 2*/
5486 ELEM_OPT_TV(BE_LCLS_CON_STATUS_CONTROL, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CON_STATUS_CONTROL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CON_STATUS_CONTROL, 0, BE_LCLS_CON_STATUS_CONTROL
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5487 /* CS to PS SRVCC 3.2.2.122 MSC - BSS O(note 29) 1*/
5488
5489
5490 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5491}
5492
5493/*
5494 * [2] 3.2.1.9 HANDOVER REQUIRED
5495 */
5496static void
5497bssmap_ho_reqd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5498{
5499 uint32_t curr_offset;
5500 uint32_t consumed;
5501 unsigned curr_len;
5502
5503 curr_offset = offset;
5504 curr_len = len;
5505
5506 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
5507 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5508 /* Response Request 3.2.2.28 BSS-MSC O (note 8) 1 */
5509 ELEM_OPT_T(BE_RESP_REQ, GSM_A_PDU_TYPE_BSSMAP, BE_RESP_REQ, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_RESP_REQ, 0, BE_RESP_REQ, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5510 /* Cell Identifier List (Preferred) 3.2.2.27 BSS-MSC M (note 4) 2n+3 to 7n+3 */
5511 ELEM_MAND_TLV(BE_CELL_ID_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LIST, " (Preferred)", ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LIST, 0, BE_CELL_ID_LIST
, curr_offset, curr_len, " (Preferred)")) > 0)) { curr_offset
+= consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID_LIST
), (" (Preferred)" == ((void*)0)) ? "" : " (Preferred)" ); } }
;
5512 /* Circuit Pool List 3.2.2.46 BSS-MSC O (note 1) V */
5513 ELEM_OPT_TLV(BE_CCT_POOL_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL_LIST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL_LIST, 0, BE_CCT_POOL_LIST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5514 /* Current Channel Type 1 3.2.2.49 BSS-MSC O (note 2) 2 */
5515 ELEM_OPT_TV(BE_CURR_CHAN_1, GSM_A_PDU_TYPE_BSSMAP, BE_CURR_CHAN_1, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CURR_CHAN_1, 0, BE_CURR_CHAN_1
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5516 /* Speech Version (Used) 3.2.2.51 BSS-MSC O (note 3) 2 */
5517 ELEM_OPT_TV(BE_SPEECH_VER, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_VER, " (Used)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_VER, 0, BE_SPEECH_VER,
curr_offset, " (Used)")) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5518 /* Queueing Indicator 3.2.2.50 BSS-MSC O 2 */
5519 ELEM_OPT_TV(BE_QUE_IND, GSM_A_PDU_TYPE_BSSMAP, BE_QUE_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_QUE_IND, 0, BE_QUE_IND, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5520 /* Old BSS to New BSS Information 3.2.2.58 BSS-MSC O 2-n */
5521 ELEM_OPT_TLV(BE_OLD2NEW_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_OLD2NEW_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_OLD2NEW_INFO, 0, BE_OLD2NEW_INFO
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5522 /* Source RNC to target RNC transparent information (UMTS) 3.2.2.76 BSS-MSC O (note 5) 3-m */
5523 ELEM_OPT_TLV(BE_SRC_RNC_TO_TAR_RNC_UMTS, GSM_A_PDU_TYPE_BSSMAP, BE_SRC_RNC_TO_TAR_RNC_UMTS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SRC_RNC_TO_TAR_RNC_UMTS, 0, BE_SRC_RNC_TO_TAR_RNC_UMTS
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5524 /* Source RNC to target RNC transparent information (cdma2000) 3.2.2.77 BSS-MSC O (note 6) n-m */
5525 ELEM_OPT_TLV(BE_SRC_RNC_TO_TAR_RNC_CDMA, GSM_A_PDU_TYPE_BSSMAP, BE_SRC_RNC_TO_TAR_RNC_CDMA, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SRC_RNC_TO_TAR_RNC_CDMA, 0, BE_SRC_RNC_TO_TAR_RNC_CDMA
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5526 /* GERAN Classmark 3.2.2.78 BSS-MSC O (note 7) V */
5527 ELEM_OPT_TLV(BE_GERAN_CLS_M, GSM_A_PDU_TYPE_BSSMAP, BE_GERAN_CLS_M, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GERAN_CLS_M, 0, BE_GERAN_CLS_M
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5528 /* Talker Priority 3.2.2.89 BSS-MSC O (note 9) 2 */
5529 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5530 /* Speech Codec (Used) 3.2.2.104 BSS-MSC O (note 10) 3-5 */
5531 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Used)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Used)")) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5532 /* CSG Identifier 3.2.2.110 BSS-MSC O (note 11) 7 */
5533 ELEM_OPT_TLV(BE_CSG_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CSG_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CSG_ID, 0, BE_CSG_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5534 /* Source eNB to target eNB transparent information (E-UTRAN) 3.2.2.123 BSS-MSC O (note 12) 3-m */
5535 /* CS to PS SRVCC Indication 3.2.2.124 BSS-MSC O (note 13) 1 */
5536
5537 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5538}
5539
5540/*
5541 * [2] 3.2.1.10 HANDOVER REQUEST ACKNOWLEDGE
5542 */
5543static void
5544bssmap_ho_req_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5545{
5546 uint32_t curr_offset;
5547 uint32_t consumed;
5548 unsigned curr_len;
5549
5550 curr_offset = offset;
5551 curr_len = len;
5552
5553 /* Layer 3 Information 3.2.2.24 BSS-MSC M (note 1) 11-n */
5554 ELEM_MAND_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_L3_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_L3_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5555 /* Chosen Channel 3.2.2.33 BSS-MSC O (note 4) 2 */
5556 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5557 /* Chosen Encryption Algorithm 3.2.2.44 BSS-MSC O (note 5) 2 */
5558 ELEM_OPT_TV(BE_CHOSEN_ENC_ALG, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_ENC_ALG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_ENC_ALG, 0, BE_CHOSEN_ENC_ALG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5559 /* Circuit Pool 3.2.2.45 BSS-MSC O (note 2) 2 */
5560 ELEM_OPT_TV(BE_CCT_POOL, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL, 0, BE_CCT_POOL, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5561 /* Speech Version (Chosen) 3.2.2.51 BSS-MSC O (note 6) 2 */
5562 ELEM_OPT_TV(BE_SPEECH_VER, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_VER, " (Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_VER, 0, BE_SPEECH_VER,
curr_offset, " (Chosen)")) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5563 /* Circuit Identity Code 3.2.2.2 BSS-MSC O (note 3) 3 */
5564 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
5565 /* LSA Identifier 3.2.2.15 BSS-MSC O (note 7) 5 */
5566 ELEM_OPT_TLV(BE_LSA_ID, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LSA_ID, 0, BE_LSA_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5567 /* New BSS to Old BSS Information 3.2.2.80 BSS-MSC O (note 8) 2-n */
5568 ELEM_OPT_TLV(BE_NEW_BSS_TO_OLD_BSS_INF, GSM_A_PDU_TYPE_BSSMAP, BE_NEW_BSS_TO_OLD_BSS_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_NEW_BSS_TO_OLD_BSS_INF, 0, BE_NEW_BSS_TO_OLD_BSS_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5569 /* Inter-System Information 3.2.2.81 BSS-MSC O (note 9) 2-n */
5570 ELEM_OPT_TLV(BE_INTER_SYS_INF, GSM_A_PDU_TYPE_BSSMAP, BE_INTER_SYS_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_INTER_SYS_INF, 0, BE_INTER_SYS_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5571 /* Talker Priority 3.2.2.89 BSS-MSC O (note 10) 2 */
5572 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5573 /* AoIP Transport Layer Address (BSS) 3.2.2.102 BSS-MSC O (note 11) 10-22 */
5574 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5575 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 12) 3-n */
5576 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5577 /* Speech Codec (Chosen) 3.2.2.104 BSS-MSC O (note 12) 3-5 */
5578 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5579 /* LCLS-BSS-Status 3.2.2.119 BSS-MSC O (note 13) 2 */
5580 ELEM_OPT_TV(BE_LCLS_BSS_STATUS, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BSS_STATUS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BSS_STATUS, 0, BE_LCLS_BSS_STATUS
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5581
5582 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5583}
5584
5585/*
5586 * [2] 3.2.1.11 HANDOVER COMMAND
5587 */
5588static void
5589bssmap_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5590{
5591 uint32_t curr_offset;
5592 uint32_t consumed;
5593 unsigned curr_len;
5594
5595 curr_offset = offset;
5596 curr_len = len;
5597
5598 /* Layer 3 Information 3.2.2.24 MSC-BSS M (note 1) 11-n */
5599 ELEM_MAND_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_L3_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_L3_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5600 /* Cell Identifier 3.2.2.17 MSC-BSS O 3-10 */
5601 ELEM_OPT_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5602 /* New BSS to Old BSS Information 3.2.2.80 MSC-BSS O (note 2) 2-n */
5603 ELEM_OPT_TLV(BE_NEW_BSS_TO_OLD_BSS_INF, GSM_A_PDU_TYPE_BSSMAP, BE_NEW_BSS_TO_OLD_BSS_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_NEW_BSS_TO_OLD_BSS_INF, 0, BE_NEW_BSS_TO_OLD_BSS_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5604 /* Talker Priority 3.2.2.89 MSC-BSS O (note 3) 2 */
5605 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5606 /* CN to MS transparent information 3.2.2.125 MSC-BSS O (note 4) 19-n */
5607
5608 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5609}
5610
5611/*
5612 * [2] 3.2.1.12 HANDOVER COMPLETE
5613 */
5614static void
5615bssmap_ho_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5616{
5617 uint32_t curr_offset;
5618 uint32_t consumed;
5619 unsigned curr_len;
5620
5621 curr_offset = offset;
5622 curr_len = len;
5623
5624 /* RR Cause 3.2.2.22 BSS-MSC O 2 */
5625 ELEM_OPT_TV(BE_RR_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_RR_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RR_CAUSE, 0, BE_RR_CAUSE, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5626 /* Talker Priority 3.2.2.89 BSS-MSC O (note 1) 2 */
5627 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5628 /* Speech Codec (Chosen) 3.2.2.104 BSS-MSC O (note 2) 3-5 */
5629 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5630 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 3) 3-n */
5631 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5632 /* Chosen Encryption Algorithm 3.2.2.44 BSS-MSC O (note 4) 2 */
5633 ELEM_OPT_TV(BE_CHOSEN_ENC_ALG, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_ENC_ALG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_ENC_ALG, 0, BE_CHOSEN_ENC_ALG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5634 /* Chosen Channel 3.2.2.33 BSS-MSC O (note 5) 2 */
5635 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5636 /* LCLS-BSS-Status 3.2.2.119 BSS-MSC O (note 6) 2 */
5637 ELEM_OPT_TV(BE_LCLS_BSS_STATUS, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BSS_STATUS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BSS_STATUS, 0, BE_LCLS_BSS_STATUS
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5638
5639 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5640}
5641
5642/*
5643 * 3.2.1.13 HANDOVER SUCCEEDED
5644 */
5645static void
5646bssmap_ho_succ(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5647{
5648 uint32_t curr_offset;
5649 uint32_t consumed;
5650 unsigned curr_len;
5651
5652 curr_offset = offset;
5653 curr_len = len;
5654
5655 /* Talker Priority 3.2.2.89 MSC-BSS O (note 1) 2 */
5656 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5657
5658 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5659}
5660
5661/*
5662 * [2] 3.2.1.14 HANDOVER CANDIDATE ENQUIRE
5663 */
5664static void
5665bssmap_ho_cand_enq(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5666{
5667 uint32_t curr_offset;
5668 uint32_t consumed;
5669 unsigned curr_len;
5670
5671 curr_offset = offset;
5672 curr_len = len;
5673
5674 /* Number Of Mss 3.2.2.8 MSC-BSS M 2 */
5675 ELEM_MAND_TV(BE_NUM_MS, GSM_A_PDU_TYPE_BSSMAP, BE_NUM_MS, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_NUM_MS, 0, BE_NUM_MS, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_NUM_MS, get_gsm_a_msg_string(pinfo->pool, 0, BE_NUM_MS
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5676
5677 /* Cell Identifier List 3.2.2.27 MSC-BSS M 2n+3 to 7n+3 */
5678 ELEM_MAND_TLV(BE_CELL_ID_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LIST, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LIST, 0, BE_CELL_ID_LIST
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID_LIST
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5679
5680 /* Cell Identifier 3.2.2.17 MSC-BSS M 3-10 */
5681 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5682
5683 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5684}
5685
5686/*
5687 * [2] 3.2.1.15 HANDOVER CANDIDATE RESPONSE
5688 */
5689static void
5690bssmap_ho_cand_resp(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5691{
5692 uint32_t curr_offset;
5693 uint32_t consumed;
5694 unsigned curr_len;
5695
5696 curr_offset = offset;
5697 curr_len = len;
5698
5699 /* Number Of Mss 3.2.2.8 BSS-MSC M 2 */
5700 ELEM_MAND_TV(BE_NUM_MS, GSM_A_PDU_TYPE_BSSMAP, BE_NUM_MS, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_NUM_MS, 0, BE_NUM_MS, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_NUM_MS, get_gsm_a_msg_string(pinfo->pool, 0, BE_NUM_MS
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5701
5702 /* Cell Identifier 3.2.2.17 BSS-MSC M 3-10 */
5703 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5704
5705 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5706}
5707
5708/*
5709 * [2] 3.2.1.16 HANDOVER FAILURE
5710 */
5711static void
5712bssmap_ho_failure(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5713{
5714 uint32_t curr_offset;
5715 uint32_t consumed;
5716 unsigned curr_len;
5717
5718 curr_offset = offset;
5719 curr_len = len;
5720
5721 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
5722 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5723 /* RR Cause 3.2.2.22 BSS-MSC O 2 */
5724 ELEM_OPT_TV(BE_RR_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_RR_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RR_CAUSE, 0, BE_RR_CAUSE, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5725 /* Circuit Pool 3.2.2.45 BSS-MSC O (note 1) 2 */
5726 ELEM_OPT_TV(BE_CCT_POOL, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL, 0, BE_CCT_POOL, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5727 /* Circuit Pool List 3.2.2.46 BSS-MSC O (note 2) V */
5728 ELEM_OPT_TLV(BE_CCT_POOL_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL_LIST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL_LIST, 0, BE_CCT_POOL_LIST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5729 /* GERAN Classmark 3.2.2.78 BSS-MSC O (note 3) V */
5730 ELEM_OPT_TLV(BE_GERAN_CLS_M, GSM_A_PDU_TYPE_BSSMAP, BE_GERAN_CLS_M, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GERAN_CLS_M, 0, BE_GERAN_CLS_M
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5731 /* New BSS to Old BSS Information 3.2.2.80 BSS-MSC O (note 4) 2-n */
5732 ELEM_OPT_TLV(BE_NEW_BSS_TO_OLD_BSS_INF, GSM_A_PDU_TYPE_BSSMAP, BE_NEW_BSS_TO_OLD_BSS_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_NEW_BSS_TO_OLD_BSS_INF, 0, BE_NEW_BSS_TO_OLD_BSS_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5733 /* Inter-System Information 3.2.2.81 BSS-MSC O (note 5) 2-n */
5734 ELEM_OPT_TLV(BE_INTER_SYS_INF, GSM_A_PDU_TYPE_BSSMAP, BE_INTER_SYS_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_INTER_SYS_INF, 0, BE_INTER_SYS_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5735 /* Talker Priority 3.2.2.89 BSS-MSC O (note 6) 2 */
5736 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5737 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 7) 3-n */
5738 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5739
5740 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5741}
5742
5743/*
5744 * 3.2.1.17 RESOURCE REQUEST
5745 */
5746static void
5747bssmap_res_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5748{
5749 uint32_t curr_offset;
5750 uint32_t consumed;
5751 unsigned curr_len;
5752
5753 curr_offset = offset;
5754 curr_len = len;
5755
5756 /* Periodicity 3.2.2.12 MSC-BSS M 2 */
5757 ELEM_MAND_TV(BE_PERIODICITY, GSM_A_PDU_TYPE_BSSMAP, BE_PERIODICITY, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_PERIODICITY, 0, BE_PERIODICITY
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_PERIODICITY, get_gsm_a_msg_string(pinfo->pool, 0, BE_PERIODICITY
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5758 /* Resource Indication Method 3.2.2.29 MSC-BSS M 2 */
5759 ELEM_MAND_TV(BE_RES_IND_METHOD, GSM_A_PDU_TYPE_BSSMAP, BE_RES_IND_METHOD, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RES_IND_METHOD, 0, BE_RES_IND_METHOD
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_RES_IND_METHOD, get_gsm_a_msg_string(pinfo->pool, 0, BE_RES_IND_METHOD
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5760 /* Cell Identifier 3.2.2.17 MSC-BSS M 3-10 */
5761 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5762 /* Extended Resource Indicator 3.2.2.13 MSC-BSS O 2 */
5763 ELEM_MAND_TV(BE_EXT_RES_IND, GSM_A_PDU_TYPE_BSSMAP, BE_EXT_RES_IND, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_EXT_RES_IND, 0, BE_EXT_RES_IND
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_EXT_RES_IND, get_gsm_a_msg_string(pinfo->pool, 0, BE_EXT_RES_IND
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5764
5765 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5766}
5767
5768/*
5769 * 3.2.1.18 RESOURCE INDICATION
5770 */
5771static void
5772bssmap_res_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5773{
5774 uint32_t curr_offset;
5775 uint32_t consumed;
5776 unsigned curr_len;
5777
5778 curr_offset = offset;
5779 curr_len = len;
5780
5781 /* Resource Indication Method 3.2.2.29 BSS-MSC M 2 */
5782 ELEM_MAND_TV(BE_RES_IND_METHOD, GSM_A_PDU_TYPE_BSSMAP, BE_RES_IND_METHOD, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RES_IND_METHOD, 0, BE_RES_IND_METHOD
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_RES_IND_METHOD, get_gsm_a_msg_string(pinfo->pool, 0, BE_RES_IND_METHOD
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5783 /* Resource Available 3.2.2.4 BSS-MSC O (note 1) 21 */
5784 ELEM_MAND_TV(BE_RES_AVAIL, GSM_A_PDU_TYPE_BSSMAP, BE_RES_AVAIL, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_RES_AVAIL, 0, BE_RES_AVAIL, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_RES_AVAIL, get_gsm_a_msg_string(pinfo->pool, 0, BE_RES_AVAIL
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5785 /* Cell Identifier 3.2.2.17 BSS-MSC M 3-10 */
5786 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5787 /* Total Resource Accessible 3.2.2.14 BSS-MSC O (note 2) 5 */
5788 ELEM_MAND_TV(BE_TOT_RES_ACC, GSM_A_PDU_TYPE_BSSMAP, BE_TOT_RES_ACC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TOT_RES_ACC, 0, BE_TOT_RES_ACC
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TOT_RES_ACC, get_gsm_a_msg_string(pinfo->pool, 0, BE_TOT_RES_ACC
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5789
5790 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5791}
5792/*
5793 * [2] 3.2.1.19 PAGING
5794 */
5795static void
5796bssmap_paging(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5797{
5798 uint32_t curr_offset;
5799 uint32_t consumed;
5800 unsigned curr_len;
5801
5802 curr_offset = offset;
5803 curr_len = len;
5804
5805 /* IMSI 3.2.2.6 MSC-BSS M 3-10 */
5806 ELEM_MAND_TLV(BE_IMSI, GSM_A_PDU_TYPE_BSSMAP, BE_IMSI, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMSI, 0, BE_IMSI, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_IMSI, get_gsm_a_msg_string(pinfo->pool, 0, BE_IMSI), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5807 /* TMSI 3.2.2.7 MSC-BSS O (note 1) 6 */
5808 ELEM_OPT_TLV(BE_TMSI, GSM_A_PDU_TYPE_BSSMAP, BE_TMSI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TMSI, 0, BE_TMSI, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5809 /* Cell Identifier List 3.2.2.27 MSC-BSS M 3 to 3+7n */
5810 ELEM_MAND_TLV(BE_CELL_ID_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LIST, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LIST, 0, BE_CELL_ID_LIST
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID_LIST
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5811 /* Channel Needed 3.2.2.36 MSC-BSS O (note 2) 2 */
5812 ELEM_OPT_TV(BE_CHAN_NEEDED, GSM_A_PDU_TYPE_BSSMAP, BE_CHAN_NEEDED, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHAN_NEEDED, 0, BE_CHAN_NEEDED
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5813 /* eMLPP Priority 3.2.2.56 MSC-BSS O (note 3) 2 */
5814 ELEM_OPT_TV(BE_EMLPP_PRIO, GSM_A_PDU_TYPE_BSSMAP, BE_EMLPP_PRIO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_EMLPP_PRIO, 0, BE_EMLPP_PRIO,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5815 /* Paging Information 3.2.2.85 MSC-BSS O 2 */
5816 ELEM_OPT_TV(BE_PAGING_INF, GSM_A_PDU_TYPE_BSSMAP, BE_PAGING_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_PAGING_INF, 0, BE_PAGING_INF,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5817
5818 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5819}
5820
5821/*
5822 * [2] 3.2.1.20 CLEAR REQUEST
5823 */
5824static void
5825bssmap_clear_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5826{
5827 uint32_t curr_offset;
5828 uint32_t consumed;
5829 unsigned curr_len;
5830
5831 curr_offset = offset;
5832 curr_len = len;
5833
5834 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
5835 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5836
5837 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5838}
5839
5840/*
5841 * [2] 3.2.1.21 CLEAR COMMAND
5842 */
5843static void
5844bssmap_clear_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5845{
5846 uint32_t curr_offset;
5847 uint32_t consumed;
5848 unsigned curr_len;
5849
5850 curr_offset = offset;
5851 curr_len = len;
5852
5853 /* Layer 3 Header Information 3.2.2.9 MSC-BSS O (note) 4 */
5854 ELEM_OPT_TLV(BE_L3_HEADER_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_HEADER_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_HEADER_INFO, 0, BE_L3_HEADER_INFO
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5855 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
5856 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5857 /* CSFB Indication 3.2.2.121 MSC-BSS O 1 */
5858 ELEM_OPT_T(BE_CSFB_IND, GSM_A_PDU_TYPE_BSSMAP, BE_CSFB_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_CSFB_IND, 0, BE_CSFB_IND, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5859
5860 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5861}
5862/*
5863 * 3.2.1.22 CLEAR COMPLETE
5864 * No data
5865 */
5866
5867/*
5868 * [2] 3.2.1.23 RESET
5869 */
5870void
5871bssmap_reset(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5872{
5873 uint32_t curr_offset;
5874 uint32_t consumed;
5875 unsigned curr_len;
5876
5877 curr_offset = offset;
5878 curr_len = len;
5879
5880 /* Cause 3.2.2.5 Both M 3-4 */
5881 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5882 /* A-Interface Selector for RESET 3.2.2.107 Both O 2 */
5883 ELEM_OPT_TV(BE_A_ITF_SEL_FOR_RESET, GSM_A_PDU_TYPE_BSSMAP, BE_A_ITF_SEL_FOR_RESET, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_A_ITF_SEL_FOR_RESET, 0, BE_A_ITF_SEL_FOR_RESET
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5884 /*Osmocom extension: Osmux Support */
5885 ELEM_OPT_T(BE_OSMOCOM_OSMUX_SUPPORT, GSM_A_PDU_TYPE_BSSMAP, BE_OSMOCOM_OSMUX_SUPPORT, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_OSMOCOM_OSMUX_SUPPORT, 0, BE_OSMOCOM_OSMUX_SUPPORT
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5886
5887 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5888}
5889
5890/*
5891 * 3.2.1.24 RESET ACKNOWLEDGE
5892 */
5893static void
5894bssmap_reset_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5895{
5896 uint32_t curr_offset;
5897 uint32_t consumed;
5898 unsigned curr_len;
5899
5900 curr_offset = offset;
5901 curr_len = len;
5902
5903 /* A-Interface Selector for RESET 3.2.2.107 Both O 2 */
5904 ELEM_OPT_TV(BE_A_ITF_SEL_FOR_RESET, GSM_A_PDU_TYPE_BSSMAP, BE_A_ITF_SEL_FOR_RESET, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_A_ITF_SEL_FOR_RESET, 0, BE_A_ITF_SEL_FOR_RESET
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5905 /*Osmocom extension: Osmux Support */
5906 ELEM_OPT_T(BE_OSMOCOM_OSMUX_SUPPORT, GSM_A_PDU_TYPE_BSSMAP, BE_OSMOCOM_OSMUX_SUPPORT, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_OSMOCOM_OSMUX_SUPPORT, 0, BE_OSMOCOM_OSMUX_SUPPORT
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5907
5908 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5909}
5910
5911/*
5912 * [2] 3.2.1.25 HANDOVER PERFORMED
5913 */
5914static void
5915bssmap_ho_performed(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5916{
5917 uint32_t curr_offset;
5918 uint32_t consumed;
5919 unsigned curr_len;
5920
5921 curr_offset = offset;
5922 curr_len = len;
5923
5924 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
5925 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5926 /* Cell Identifier 3.2.2.17 BSS-MSC M (note 5) 3-10 */
5927 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5928 /* Chosen Channel 3.2.2.33 BSS-MSC O (note 1) 2 */
5929 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5930 /* Chosen Encryption Algorithm 3.2.2.44 BSS-MSC O (note 2) 2 */
5931 ELEM_OPT_TV(BE_CHOSEN_ENC_ALG, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_ENC_ALG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_ENC_ALG, 0, BE_CHOSEN_ENC_ALG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5932 /* Speech Version (Chosen) 3.2.2.51 BSS-MSC O (note 3) 2 */
5933 ELEM_OPT_TV(BE_SPEECH_VER, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_VER, " (Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_VER, 0, BE_SPEECH_VER,
curr_offset, " (Chosen)")) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5934 /* LSA Identifier 3.2.2.15 BSS-MSC O (note 4) 5 */
5935 ELEM_OPT_TLV(BE_LSA_ID, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LSA_ID, 0, BE_LSA_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5936 /* Talker Priority 3.2.2.89 BSS-MSC O (note 6) 2 */
5937 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
5938 /* Codec List (BSS Supported) (serving cell) 3.2.2.103 BSS-MSC O (note 7) 3-n */
5939 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
5940 /* Speech Codec (Chosen) 3.2.2.104 BSS-MSC O (note 8) 3-5 */
5941 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
5942 /* LCLS-BSS-Status 3.2.2.119 BSS-MSC O (note 9) 2 */
5943 ELEM_OPT_TV(BE_LCLS_BSS_STATUS, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BSS_STATUS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BSS_STATUS, 0, BE_LCLS_BSS_STATUS
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
5944
5945 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5946}
5947
5948/*
5949 * [2] 3.2.1.26 OVERLOAD
5950 */
5951static void
5952bssmap_overload(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5953{
5954 uint32_t curr_offset;
5955 uint32_t consumed;
5956 unsigned curr_len;
5957
5958 curr_offset = offset;
5959 curr_len = len;
5960
5961 /* Cause 3.2.2.5 Both M 3-4 */
5962 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5963 /* Cell Identifier 3.2.2.17 BSS-MSC O 3-10 */
5964 ELEM_OPT_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5965
5966 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5967}
5968/*
5969 * 3.2.1.27 MSC INVOKE TRACE
5970 */
5971static void
5972bssmap_msc_invoke_trace(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
5973{
5974 uint32_t curr_offset;
5975 uint32_t consumed;
5976 unsigned curr_len;
5977
5978 curr_offset = offset;
5979 curr_len = len;
5980
5981 /* Trace Type 3.2.2.37 MSC-BSS M 2 */
5982 ELEM_MAND_TV(BE_TRACE_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_TRACE_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TRACE_TYPE, 0, BE_TRACE_TYPE,
curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TRACE_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_TRACE_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5983 /* Triggerid 3.2.2.38 MSC-BSS O 3-22 */
5984 ELEM_OPT_TLV(BE_TRIGGERID, GSM_A_PDU_TYPE_BSSMAP, BE_TRIGGERID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TRIGGERID, 0, BE_TRIGGERID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5985 /* Trace Reference 3.2.2.39 MSC-BSS M 3 */
5986 ELEM_MAND_TV(BE_TRACE_REF, GSM_A_PDU_TYPE_BSSMAP, BE_TRACE_REF, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TRACE_REF, 0, BE_TRACE_REF, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TRACE_REF, get_gsm_a_msg_string(pinfo->pool, 0, BE_TRACE_REF
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
5987 /* Transactionid 3.2.2.40 MSC-BSS O 4 */
5988 ELEM_OPT_TLV(BE_TRANSID, GSM_A_PDU_TYPE_BSSMAP, BE_TRANSID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TRANSID, 0, BE_TRANSID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5989 /* Mobile Identity 3.2.2.41 MSC-BSS O 3-10 */
5990 ELEM_OPT_TLV(BE_MID, GSM_A_PDU_TYPE_BSSMAP, BE_MID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_MID, 0, BE_MID, curr_offset, curr_len
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
5991 /* OMCId 3.2.2.42 MSC-BSS O 3-22 */
5992 ELEM_OPT_TLV(BE_OMCID, GSM_A_PDU_TYPE_BSSMAP, BE_OMCID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_OMCID, 0, BE_OMCID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
5993
5994 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
5995}
5996
5997/*
5998 * 3.2.1.28 BSS INVOKE TRACE
5999 */
6000static void
6001bssmap_bss_invoke_trace(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6002{
6003 uint32_t curr_offset;
6004 uint32_t consumed;
6005 unsigned curr_len;
6006
6007 curr_offset = offset;
6008 curr_len = len;
6009
6010 /* Trace Type 3.2.2.37 Both M 2 */
6011 ELEM_MAND_TV(BE_TRACE_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_TRACE_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TRACE_TYPE, 0, BE_TRACE_TYPE,
curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TRACE_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_TRACE_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6012 /* Forward Indicator 3.2.2.43 Both O 2 */
6013 ELEM_OPT_TV(BE_FOR_IND, GSM_A_PDU_TYPE_BSSMAP, BE_FOR_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_FOR_IND, 0, BE_FOR_IND, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6014 /* Triggerid 3.2.2.38 Both O 3-22 */
6015 ELEM_OPT_TLV(BE_TRIGGERID, GSM_A_PDU_TYPE_BSSMAP, BE_TRIGGERID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TRIGGERID, 0, BE_TRIGGERID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6016 /* Trace Reference 3.2.2.39 Both M 3 */
6017 ELEM_MAND_TV(BE_TRACE_REF, GSM_A_PDU_TYPE_BSSMAP, BE_TRACE_REF, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TRACE_REF, 0, BE_TRACE_REF, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TRACE_REF, get_gsm_a_msg_string(pinfo->pool, 0, BE_TRACE_REF
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6018 /* TransactionId 3.2.2.40 Both O 4 */
6019 ELEM_OPT_TLV(BE_TRANSID, GSM_A_PDU_TYPE_BSSMAP, BE_TRANSID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TRANSID, 0, BE_TRANSID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6020 /* OMCId 3.2.2.42 Both O 3-22 */
6021 ELEM_OPT_TLV(BE_OMCID, GSM_A_PDU_TYPE_BSSMAP, BE_OMCID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_OMCID, 0, BE_OMCID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6022
6023 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6024}
6025
6026/*
6027 * [2] 3.2.1.29 CLASSMARK UPDATE
6028 */
6029static void
6030bssmap_cm_upd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6031{
6032 uint32_t curr_offset;
6033 uint32_t consumed;
6034 unsigned curr_len;
6035
6036 curr_offset = offset;
6037 curr_len = len;
6038
6039 /* Classmark Information Type 2 3.2.2.19 Both M 4-5 */
6040 ELEM_MAND_TLV(BE_CM_INFO_2, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_2, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_2, 0, BE_CM_INFO_2, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CM_INFO_2, get_gsm_a_msg_string(pinfo->pool, 0, BE_CM_INFO_2
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6041 /* Classmark Information Type 3 3.2.2.20 Both O (note 1) 3-34 */
6042 ELEM_OPT_TLV(BE_CM_INFO_3, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_3, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_3, 0, BE_CM_INFO_3, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6043 /* Talker Priority 3.2.2.89 Both O (note 2) 2 */
6044 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6045
6046 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6047}
6048
6049/*
6050 * [2] 3.2.1.30 CIPHER MODE COMMAND
6051 */
6052static void
6053bssmap_ciph_mode_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6054{
6055 uint32_t curr_offset;
6056 uint32_t consumed;
6057 unsigned curr_len;
6058
6059 curr_offset = offset;
6060 curr_len = len;
6061
6062 /* Layer 3 Header Information 3.2.2.9 MSC-BSS O (note) 4 */
6063 ELEM_OPT_TLV(BE_L3_HEADER_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_HEADER_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_HEADER_INFO, 0, BE_L3_HEADER_INFO
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6064 /* Encryption Information 3.2.2.10 MSC-BSS M 3-n */
6065 ELEM_MAND_TLV(BE_ENC_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_ENC_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_ENC_INFO, 0, BE_ENC_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_ENC_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_ENC_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6066 /* Cipher Response Mode 3.2.2.34 MSC-BSS O 2 */
6067 ELEM_OPT_TV(BE_CIPH_RESP_MODE, GSM_A_PDU_TYPE_BSSMAP, BE_CIPH_RESP_MODE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIPH_RESP_MODE, 0, BE_CIPH_RESP_MODE
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6068 /* Kc128 3.2.2.109 MSC-BSS C (note 2) 17 */
6069 ELEM_OPT_TV(BE_KC128, GSM_A_PDU_TYPE_BSSMAP, BE_KC128, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_KC128, 0, BE_KC128, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6070
6071 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6072}
6073
6074/*
6075 * [2] 3.2.1.31 CIPHER MODE COMPLETE
6076 */
6077static void
6078bssmap_ciph_mode_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6079{
6080 uint32_t curr_offset;
6081 uint32_t consumed;
6082 unsigned curr_len;
6083
6084 curr_offset = offset;
6085 curr_len = len;
6086
6087 /* Layer 3 Message Contents 3.2.2.35 BSS-MSC O 2-n */
6088 ELEM_OPT_TLV(BE_L3_MSG, GSM_A_PDU_TYPE_BSSMAP, BE_L3_MSG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_MSG, 0, BE_L3_MSG, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6089 /* Chosen Encryption Algorithm 3.2.2.44 BSS-MSC O (note) 2 */
6090 ELEM_OPT_TV(BE_CHOSEN_ENC_ALG, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_ENC_ALG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_ENC_ALG, 0, BE_CHOSEN_ENC_ALG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6091
6092 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6093}
6094
6095/*
6096 * [2] 3.2.1.32 COMPLETE LAYER 3 INFORMATION
6097 * Updated to 3GPP TS 48.008 version 11.5.0 Release 11
6098 */
6099static void
6100bssmap_cl3_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6101{
6102 uint32_t consumed;
6103 uint32_t curr_offset;
6104 unsigned curr_len;
6105
6106 curr_offset = offset;
6107 curr_len = len;
6108
6109 /* Cell Identifier 3.2.2.17 BSS-MSC M 3-10 */
6110 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6111 /* Layer 3 Information 3.2.2.24 BSS-MSC M 3-n */
6112 ELEM_MAND_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_L3_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_L3_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6113 /* Chosen Channel 3.2.2.33 BSS-MSC O (note 1) 2 */
6114 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6115 /* LSA Identifier List 3.2.2.16 BSS-MSC O (note 2) 3+3n */
6116 ELEM_OPT_TLV(BE_LSA_ID_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_ID_LIST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LSA_ID_LIST, 0, BE_LSA_ID_LIST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6117 /* APDU 3.2.2.68 BSS-MSC O (note 3) 3-n */
6118 ELEM_OPT_TLV_E(BE_APDU, GSM_A_PDU_TYPE_BSSMAP, BE_APDU, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv_e
(tvb, tree, pinfo, (uint8_t) BE_APDU, 0, BE_APDU, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6119 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 4) 3-n */
6120 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
6121 /* Redirect Attempt Flag 3.2.2.111 BSS-MSC O (note 5) 1 */
6122 ELEM_OPT_T(BE_REDIR_ATT_FLG, GSM_A_PDU_TYPE_BSSMAP, BE_REDIR_ATT_FLG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_REDIR_ATT_FLG, 0, BE_REDIR_ATT_FLG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6123 /* Send Sequence Number 3.2.2.113 BSS-MSC O (note 6) 2 */
6124 ELEM_OPT_TV(BE_SEND_SEQN, GSM_A_PDU_TYPE_BSSMAP, BE_SEND_SEQN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SEND_SEQN, 0, BE_SEND_SEQN, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6125 /* IMSI 3.2.2.6 BSS-MSC O (note 7) 3-10 */
6126 ELEM_OPT_TLV(BE_IMSI, GSM_A_PDU_TYPE_BSSMAP, BE_IMSI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMSI, 0, BE_IMSI, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6127 /* Selected PLMN ID 3.2.2.126 BSS-MSC O (note 8) 4 */
6128 ELEM_OPT_TV(BE_SELECTED_PLMN_ID, GSM_A_PDU_TYPE_BSSMAP, BE_SELECTED_PLMN_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SELECTED_PLMN_ID, 0, BE_SELECTED_PLMN_ID
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6129 /* Selected Operator 3.2.2.130 BSS-MSC O (note 9, 10) 4 */
6130 /* PS Registered Operator 3.2.2.131 BSS-MSC O (note 9, 11) 4 */
6131
6132 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6133}
6134/*
6135 * 3.2.1.33 QUEUEING INDICATION
6136 * No data
6137 */
6138
6139/*
6140 * [2] 3.2.1.34 SAPI "n" REJECT
6141 */
6142static void
6143bssmap_sapi_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6144{
6145 uint32_t consumed;
6146 uint32_t curr_offset;
6147 unsigned curr_len;
6148
6149 curr_offset = offset;
6150 curr_len = len;
6151
6152 /* DLCI 3.2.2.25 BSS-MSC M 2 */
6153 ELEM_MAND_TV(BE_DLCI, GSM_A_PDU_TYPE_BSSMAP, BE_DLCI, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DLCI, 0, BE_DLCI, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_DLCI, get_gsm_a_msg_string(pinfo->pool, 0, BE_DLCI), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6154 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
6155 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6156
6157 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6158}
6159/* 3.2.1.35 (void)
6160 * 3.2.1.36 (void)
6161 */
6162/*
6163 * [2] 3.2.1.37 HANDOVER REQUIRED REJECT
6164 */
6165static void
6166bssmap_ho_reqd_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6167{
6168 uint32_t curr_offset;
6169 uint32_t consumed;
6170 unsigned curr_len;
6171
6172 curr_offset = offset;
6173 curr_len = len;
6174
6175 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
6176 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6177 /* New BSS to Old BSS Information 3.2.2.78 MSC-BSS O (note 1) 2-n */
6178 ELEM_OPT_TLV(BE_NEW_BSS_TO_OLD_BSS_INF, GSM_A_PDU_TYPE_BSSMAP, BE_NEW_BSS_TO_OLD_BSS_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_NEW_BSS_TO_OLD_BSS_INF, 0, BE_NEW_BSS_TO_OLD_BSS_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6179 /* Talker Priority 3.2.2.89 MSC-BSS O (note 2) 2 */
6180 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6181
6182 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6183}
6184
6185/*
6186 * [2] 3.2.1.38 RESET CIRCUIT
6187 */
6188static void
6189bssmap_reset_cct(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6190{
6191 uint32_t curr_offset;
6192 uint32_t consumed;
6193 unsigned curr_len;
6194
6195 curr_offset = offset;
6196 curr_len = len;
6197
6198 /* Circuit Identity Code 3.2.2.2 Both M 3 */
6199 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6200 /* Cause 3.2.2.5 Both M 3-4 */
6201 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6202
6203 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6204}
6205
6206/*
6207 * [2] 3.2.1.39 RESET CIRCUIT ACKNOWLEDGE
6208 */
6209static void
6210bssmap_reset_cct_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6211{
6212 uint32_t curr_offset;
6213 uint32_t consumed;
6214 unsigned curr_len;
6215
6216 curr_offset = offset;
6217 curr_len = len;
6218
6219 /* Circuit Identity 3.2.2.2 Both M 3 */
6220 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6221
6222 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6223}
6224
6225/*
6226 * 3.2.1.40 HANDOVER DETECT
6227 */
6228static void
6229bssmap_ho_det(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6230{
6231 uint32_t curr_offset;
6232 uint32_t consumed;
6233 unsigned curr_len;
6234
6235 curr_offset = offset;
6236 curr_len = len;
6237
6238 /* Talker Priority 3.2.2.89 BSS-MSC O (note 1) 2 */
6239 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6240
6241 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6242}
6243/*
6244 * [2] 3.2.1.41 CIRCUIT GROUP BLOCK
6245 */
6246static void
6247bssmap_cct_group_block(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6248{
6249 uint32_t curr_offset;
6250 uint32_t consumed;
6251 unsigned curr_len;
6252
6253 curr_offset = offset;
6254 curr_len = len;
6255
6256 /* Cause 3.2.2.5 Both M 3-4 */
6257 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6258 /* Circuit Identity Code 3.2.2.2 Both M 3 */
6259 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6260 /* Circuit Identity Code List 3.2.2.31 Both M 4-35 */
6261 ELEM_MAND_TLV(BE_CIC_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CIC_LIST, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CIC_LIST, 0, BE_CIC_LIST, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC_LIST
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6262
6263 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6264}
6265
6266/*
6267 * [2] 3.2.1.42 CIRCUIT GROUP BLOCKING ACKNOWLEDGE
6268 */
6269static void
6270bssmap_cct_group_block_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6271{
6272 uint32_t curr_offset;
6273 uint32_t consumed;
6274 unsigned curr_len;
6275
6276 curr_offset = offset;
6277 curr_len = len;
6278
6279 /* Circuit Identity Code 3.2.2.2 Both M 3 */
6280 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6281 /* Circuit Identity Code List 3.2.2.31 Both M 4-35 */
6282 ELEM_MAND_TLV(BE_CIC_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CIC_LIST, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CIC_LIST, 0, BE_CIC_LIST, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC_LIST
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6283
6284 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6285}
6286
6287/*
6288 * [2] 3.2.1.43 CIRCUIT GROUP UNBLOCK
6289 */
6290static void
6291bssmap_cct_group_unblock(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6292{
6293 uint32_t curr_offset;
6294 uint32_t consumed;
6295 unsigned curr_len;
6296
6297 curr_offset = offset;
6298 curr_len = len;
6299
6300 /* Circuit Identity Code 3.2.2.2 Both M 3 */
6301 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6302 /* Circuit Identity Code List 3.2.2.31 Both M 4-35 */
6303 ELEM_MAND_TLV(BE_CIC_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CIC_LIST, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CIC_LIST, 0, BE_CIC_LIST, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC_LIST
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6304
6305 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6306}
6307
6308/*
6309 * [2] 3.2.1.44 CIRCUIT GROUP UNBLOCKING ACKNOWLEDGE
6310 */
6311static void
6312bssmap_cct_group_unblock_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6313{
6314 uint32_t curr_offset;
6315 uint32_t consumed;
6316 unsigned curr_len;
6317
6318 curr_offset = offset;
6319 curr_len = len;
6320
6321 /* Circuit Identity Code 3.2.2.2 Both M 3 */
6322 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6323 /* Circuit Identity Code List 3.2.2.31 Both M 4-35 */
6324 ELEM_MAND_TLV(BE_CIC_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CIC_LIST, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CIC_LIST, 0, BE_CIC_LIST, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC_LIST
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6325
6326 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6327}
6328
6329/*
6330 * [2] 3.2.1.45 CONFUSION
6331 */
6332static void
6333bssmap_confusion(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6334{
6335 uint32_t curr_offset;
6336 uint32_t consumed;
6337 unsigned curr_len;
6338
6339 curr_offset = offset;
6340 curr_len = len;
6341
6342 /* Cause 3.2.2.5 Both M 3-4 */
6343 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6344 /* Diagnostics 3.2.2.32 Both M 4-n */
6345 ELEM_MAND_TLV(BE_DIAG, GSM_A_PDU_TYPE_BSSMAP, BE_DIAG, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_DIAG, 0, BE_DIAG, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_DIAG, get_gsm_a_msg_string(pinfo->pool, 0, BE_DIAG), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6346
6347 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6348}
6349/*
6350 * 3.2.1.46 CLASSMARK REQUEST
6351 */
6352static void
6353bssmap_cls_m_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6354{
6355 uint32_t curr_offset;
6356 uint32_t consumed;
6357 unsigned curr_len;
6358
6359 curr_offset = offset;
6360 curr_len = len;
6361
6362 /* Talker Priority 3.2.2.89 MSC-BSS O (note 1) 2 */
6363 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6364
6365 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6366}
6367/*
6368 * [2] 3.2.1.47 UNEQUIPPED CIRCUIT
6369 */
6370static void
6371bssmap_unequipped_cct(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6372{
6373 uint32_t curr_offset;
6374 uint32_t consumed;
6375 unsigned curr_len;
6376
6377 curr_offset = offset;
6378 curr_len = len;
6379
6380 /* Circuit Identity Code 3.2.2.2 Both M 3 */
6381 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6382 /* Circuit Identity Code List 3.2.2.31 Both O 4-35 */
6383 ELEM_OPT_TLV(BE_CIC_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CIC_LIST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CIC_LIST, 0, BE_CIC_LIST, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6384
6385 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6386}
6387
6388/*
6389 * [2] 3.2.1.48 CIPHER MODE REJECT
6390 */
6391static void
6392bssmap_ciph_mode_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6393{
6394 uint32_t curr_offset;
6395 uint32_t consumed;
6396 unsigned curr_len;
6397
6398 curr_offset = offset;
6399 curr_len = len;
6400
6401 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
6402 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6403
6404 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6405}
6406
6407/*
6408 * [2] 3.2.1.49 LOAD INDICATION
6409 */
6410static void
6411bssmap_load_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6412{
6413 uint32_t curr_offset;
6414 uint32_t consumed;
6415 unsigned curr_len;
6416
6417 curr_offset = offset;
6418 curr_len = len;
6419
6420 /* Time Indication 3.2.2.47 Both M 2 */
6421 ELEM_MAND_TV(BE_TIME_IND, GSM_A_PDU_TYPE_BSSMAP, BE_TIME_IND, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TIME_IND, 0, BE_TIME_IND, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TIME_IND, get_gsm_a_msg_string(pinfo->pool, 0, BE_TIME_IND
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6422 /* Cell Identifier 3.2.2.17 Both M 3-10 */
6423 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6424 /* Cell Identifier List (Target) 3.2.2.27 Both M 3 to 3+7n */
6425 ELEM_MAND_TLV(BE_CELL_ID_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LIST, " (Target)", ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LIST, 0, BE_CELL_ID_LIST
, curr_offset, curr_len, " (Target)")) > 0)) { curr_offset
+= consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID_LIST, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID_LIST
), (" (Target)" == ((void*)0)) ? "" : " (Target)" ); } }
;
6426 /* Resource Situation 3.2.2.48 Both O (note 1) 4-N */
6427 ELEM_OPT_TLV(BE_RES_SIT, GSM_A_PDU_TYPE_BSSMAP, BE_RES_SIT, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_RES_SIT, 0, BE_RES_SIT, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6428 /* Cause 3.2.2.5 Both O (note 2) 4-5 */
6429 ELEM_OPT_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6430
6431 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6432}
6433/*
6434 * 3.2.1.50 VGCS/VBS SETUP
6435 */
6436 static void
6437 bssmap_vgcs_vbs_setup(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6438{
6439 uint32_t curr_offset;
6440 uint32_t consumed;
6441 unsigned curr_len;
6442
6443 curr_offset = offset;
6444 curr_len = len;
6445
6446 /* Group Call Reference 3.2.2.55 MSC-BSS M 7 */
6447 ELEM_MAND_TLV(BE_GROUP_CALL_REF, GSM_A_PDU_TYPE_BSSMAP, BE_GROUP_CALL_REF, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GROUP_CALL_REF, 0, BE_GROUP_CALL_REF
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_GROUP_CALL_REF, get_gsm_a_msg_string(pinfo->pool, 0, BE_GROUP_CALL_REF
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6448 /* Priority 3.2.2.18 MSC-BSS O 3 */
6449 ELEM_OPT_TLV(BE_PRIO, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_PRIO, 0, BE_PRIO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6450 /* VGCS Feature Flags 3.2.2.88 MSC-BSS O 3 */
6451 ELEM_OPT_TLV(BE_VGCS_FEAT_FLG, GSM_A_PDU_TYPE_BSSMAP, BE_VGCS_FEAT_FLG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_VGCS_FEAT_FLG, 0, BE_VGCS_FEAT_FLG
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6452
6453 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6454}
6455
6456/*
6457 * 3.2.1.51 VGCS/VBS SETUP ACK
6458 */
6459 static void
6460bssmap_vgcs_vbs_setup_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6461{
6462 uint32_t curr_offset;
6463 uint32_t consumed;
6464 unsigned curr_len;
6465
6466 curr_offset = offset;
6467 curr_len = len;
6468
6469 /* VGCS Feature Flags 3.2.2.88 BSS-MSC O(note 1) 3 */
6470 ELEM_OPT_TLV(BE_VGCS_FEAT_FLG, GSM_A_PDU_TYPE_BSSMAP, BE_VGCS_FEAT_FLG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_VGCS_FEAT_FLG, 0, BE_VGCS_FEAT_FLG
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6471
6472 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6473}
6474
6475 /*
6476 * 3.2.1.52 VGCS/VBS SETUP REFUSE
6477 */
6478 static void
6479bssmap_vgcs_vbs_setup_refuse(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6480{
6481 uint32_t curr_offset;
6482 uint32_t consumed;
6483 unsigned curr_len;
6484
6485 curr_offset = offset;
6486 curr_len = len;
6487
6488 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
6489 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6490
6491 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6492}
6493
6494/*
6495 * 3.2.1.53 VGCS/VBS ASSIGNMENT REQUEST
6496 */
6497static void
6498bssmap_vgcs_vbs_ass_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6499{
6500 uint32_t curr_offset;
6501 uint32_t consumed;
6502 unsigned curr_len;
6503
6504 curr_offset = offset;
6505 curr_len = len;
6506
6507 /* Channel Type 3.2.2.11 MSC-BSS M (note 2) 5-13 */
6508 ELEM_MAND_TLV(BE_CHAN_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_CHAN_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CHAN_TYPE, 0, BE_CHAN_TYPE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CHAN_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CHAN_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6509 /* Assignment Requirement 3.2.2.52 MSC-BSS M 2 */
6510 ELEM_MAND_TV(BE_ASS_REQ, GSM_A_PDU_TYPE_BSSMAP, BE_ASS_REQ, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_ASS_REQ, 0, BE_ASS_REQ, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_ASS_REQ, get_gsm_a_msg_string(pinfo->pool, 0, BE_ASS_REQ
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6511 /* Cell Identifier 3.2.2.17 MSC-BSS M 3-10 */
6512 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6513 /* Group Call Reference 3.2.2.55 MSC-BSS M 7 */
6514 ELEM_MAND_TLV(BE_GROUP_CALL_REF, GSM_A_PDU_TYPE_BSSMAP, BE_GROUP_CALL_REF, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GROUP_CALL_REF, 0, BE_GROUP_CALL_REF
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_GROUP_CALL_REF, get_gsm_a_msg_string(pinfo->pool, 0, BE_GROUP_CALL_REF
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6515 /* Priority 3.2.2.18 MSC-BSS O 3 */
6516 ELEM_OPT_TLV(BE_PRIO, GSM_A_PDU_TYPE_BSSMAP, BE_PRIO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_PRIO, 0, BE_PRIO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6517 /* Circuit Identity Code 3.2.2.2 MSC-BSS O (note 4, 5) 3 */
6518 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
6519 /* Downlink DTX Flag 3.2.2.26 MSC-BSS O (note 2, 4) 2 */
6520 ELEM_OPT_TV(BE_DOWN_DTX_FLAG, GSM_A_PDU_TYPE_BSSMAP, BE_DOWN_DTX_FLAG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DOWN_DTX_FLAG, 0, BE_DOWN_DTX_FLAG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6521 /* Encryption Information 3.2.2.10 MSC-BSS O 3-n */
6522 ELEM_OPT_TLV(BE_ENC_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_ENC_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_ENC_INFO, 0, BE_ENC_INFO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6523 /* VSTK_RAND 3.2.2.83 MSC-BSS O (note 1) 7 */
6524 ELEM_OPT_TLV(BE_VSTK_RAND_INF, GSM_A_PDU_TYPE_BSSMAP, BE_VSTK_RAND_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_VSTK_RAND_INF, 0, BE_VSTK_RAND_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6525 /* VSTK 3.2.2.84 MSC-BSS O (note 1) 18 */
6526 ELEM_OPT_TLV(BE_VSTK_INF, GSM_A_PDU_TYPE_BSSMAP, BE_VSTK_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_VSTK_INF, 0, BE_VSTK_INF, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6527 /* Cell Identifier List Segment 3.2.2.27a MSC-BSS O (note 3) 4-? */
6528 ELEM_OPT_TLV(BE_CELL_ID_LIST_SEG, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LIST_SEG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LIST_SEG, 0, BE_CELL_ID_LIST_SEG
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6529 /* AoIP Transport Layer Address(MGW) 3.2.2.102 MSC - BSS O(note 6, 7) 8 - 20 */
6530 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6531 /* Call Identifier 3.2.2.105 MSC - BSS O(note 6, 7) 5 */
6532 ELEM_OPT_TV(BE_CALL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID, 0, BE_CALL_ID, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6533 /* Codec List(MSC Preferred) 3.2.2.103 MSC - BSS O(note 6, 7) 3 - n */
6534 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(MSC Preferred)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(MSC Preferred)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
6535
6536
6537 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6538}
6539/*
6540 * 3.2.1.54 VGCS/VBS ASSIGNMENT RESULT
6541 */
6542static void
6543bssmap_vgcs_vbs_ass_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6544{
6545 uint32_t curr_offset;
6546 uint32_t consumed;
6547 unsigned curr_len;
6548
6549 curr_offset = offset;
6550 curr_len = len;
6551
6552 /* Channel Type 3.2.2.11 BSS-MSC M (note 3, 4) 5 */
6553 ELEM_MAND_TLV(BE_CHAN_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_CHAN_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CHAN_TYPE, 0, BE_CHAN_TYPE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CHAN_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CHAN_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6554 /* Cell Identifier 3.2.2.17 BSS-MSC M 3-10 */
6555 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6556 /* Chosen Channel 3.2.2.33 BSS-MSC O (note 2) 2 */
6557 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6558 /* Circuit Identity Code 3.2.2.2 BSS-MSC O (note 5) 3 */
6559 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
6560 /* Circuit Pool 3.2.2.45 BSS-MSC O (note 1) 2 */
6561 ELEM_OPT_TV(BE_CCT_POOL, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL, 0, BE_CCT_POOL, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6562 /* AoIP Transport Layer Address (BSS) 3.2.2.102 BSS-MSC O (note 6, 7) 8-20 */
6563 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6564 /* Speech Codec (Chosen) 3.2.2.104 BSS-MSC O (note 6, 7) 3-5 */
6565 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6566 /* Call Identifier 3.2.2.105 BSS-MSC O (note 6, 7) 5 */
6567 ELEM_OPT_TV(BE_CALL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID, 0, BE_CALL_ID, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6568
6569 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6570}
6571/*
6572 * 3.2.1.55 VGCS/VBS ASSIGNMENT FAILURE
6573 */
6574static void
6575bssmap_vgcs_vbs_ass_fail(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6576{
6577 uint32_t curr_offset;
6578 uint32_t consumed;
6579 unsigned curr_len;
6580
6581 curr_offset = offset;
6582 curr_len = len;
6583
6584 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
6585 ELEM_OPT_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6586 /* Circuit Pool 3.2.2.45 BSS-MSC O (note 1) 2 */
6587 ELEM_OPT_TV(BE_CCT_POOL, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL, 0, BE_CCT_POOL, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6588 /* Circuit Pool List 3.2.2.46 BSS-MSC O (note 2) V */
6589 ELEM_OPT_TLV(BE_CCT_POOL_LIST, GSM_A_PDU_TYPE_BSSMAP, BE_CCT_POOL_LIST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CCT_POOL_LIST, 0, BE_CCT_POOL_LIST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6590 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC O (note 3) 3-n */
6591 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
6592
6593 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6594}
6595/*
6596 * 3.2.1.56 VGCS/VBS QUEUING INDICATION
6597 * No data
6598 */
6599/*
6600 * 3.2.1.57 UPLINK REQUEST
6601 */
6602static void
6603bssmap_uplink_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6604{
6605 uint32_t curr_offset;
6606 uint32_t consumed;
6607 unsigned curr_len;
6608
6609 curr_offset = offset;
6610 curr_len = len;
6611
6612 /* Talker Priority 3.2.2.89 BSS-MSC O (note 1) 2 */
6613 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6614 /* Cell Identifier 3.2.2.17 BSS-MSC O (note 1) 3-10 */
6615 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6616 /* Layer 3 Information 3.2.2.24 BSS-MSC O (note 1,3) 3-n */
6617 ELEM_OPT_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6618 /* Mobile Identity 3.2.2.41 BSS-MSC O (note 1,2) 3-n */
6619 ELEM_OPT_TLV(BE_MID, GSM_A_PDU_TYPE_COMMON, DE_MID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_MID, 4, DE_MID, curr_offset, curr_len
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6620
6621 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6622}
6623/*
6624 * 3.2.1.58 UPLINK REQUEST ACKNOWLEDGE
6625 */
6626static void
6627bssmap_uplink_req_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6628{
6629 uint32_t curr_offset;
6630 uint32_t consumed;
6631 unsigned curr_len;
6632
6633 curr_offset = offset;
6634 curr_len = len;
6635
6636 /* Talker Priority 3.2.2.89 MSC-BSS O (note 1) 2 */
6637 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6638 /* Emergency set indication 3.2.2.90 MSC-BSS O (note 1) 1 */
6639 ELEM_OPT_T(BE_EMRG_SET_IND, GSM_A_PDU_TYPE_BSSMAP, BE_EMRG_SET_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_EMRG_SET_IND, 0, BE_EMRG_SET_IND
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6640 /* Talker Identity 3.2.2.91 MSC-BSS O 3-20 */
6641 ELEM_MAND_TLV(BE_TALKER_ID, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_ID, 0, BE_TALKER_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TALKER_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_TALKER_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6642
6643 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6644}
6645/*
6646 * 3.2.1.59 UPLINK REQUEST CONFIRMATION
6647 */
6648static void
6649bssmap_uplink_req_conf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6650{
6651 uint32_t curr_offset;
6652 uint32_t consumed;
6653 unsigned curr_len;
6654
6655 curr_offset = offset;
6656 curr_len = len;
6657
6658 /* Cell Identifier 3.2.2.17 BSS-MSC M 3-10 */
6659 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6660 /* Talker Identity 3.2.2.91 BSS-MSC O 3-20 */
6661 ELEM_OPT_TLV(BE_TALKER_ID, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_ID, 0, BE_TALKER_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6662 /* Layer 3 Information 3.2.2.24 BSS-MSC M 3-n */
6663 ELEM_MAND_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_L3_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_L3_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6664
6665 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6666}
6667/*
6668 * 3.2.1.59a UPLINK APPLICATION DATA
6669 */
6670static void
6671bssmap_uplink_app_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6672{
6673 uint32_t curr_offset;
6674 uint32_t consumed;
6675 unsigned curr_len;
6676
6677 curr_offset = offset;
6678 curr_len = len;
6679
6680 /* Cell Identifier 3.2.2.17 BSS-MSC M 3-10 */
6681 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6682 /* Layer 3 Information 3.2.2.24 BSS-MSC M 3-n */
6683 ELEM_MAND_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_L3_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_L3_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6684 /* Application Data information 3.2.2.100 BSS-MSC M 3 */
6685 ELEM_MAND_TLV(BE_APP_DATA_INF, GSM_A_PDU_TYPE_BSSMAP, BE_APP_DATA_INF, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_APP_DATA_INF, 0, BE_APP_DATA_INF
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_APP_DATA_INF, get_gsm_a_msg_string(pinfo->pool, 0, BE_APP_DATA_INF
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6686
6687 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6688}
6689/*
6690 * 3.2.1.60 UPLINK RELEASE INDICATION
6691 */
6692static void
6693bssmap_uplink_rel_ind(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6694{
6695 uint32_t curr_offset;
6696 uint32_t consumed;
6697 unsigned curr_len;
6698
6699 curr_offset = offset;
6700 curr_len = len;
6701
6702 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
6703 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6704 /* Talker Priority 3.2.2.89 BSS-MSC O (note 1) 2 */
6705 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6706
6707
6708 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6709}
6710/*
6711 * 3.2.1.61 UPLINK REJECT COMMAND
6712 */
6713static void
6714bssmap_uplink_rej_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6715{
6716 uint32_t curr_offset;
6717 uint32_t consumed;
6718 unsigned curr_len;
6719
6720 curr_offset = offset;
6721 curr_len = len;
6722
6723 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
6724 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6725 /* Current Talker Priority 3.2.2.89 MSC-BSS O (note 1) 2 */
6726 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, "Current"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, "Current")) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6727 /* Rejected Talker Priority 3.2.2.89 MSC-BSS O (note 1) 2 */
6728 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, "Rejected"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, "Rejected")) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6729 /* Talker Identity 3.2.2.91 MSC-BSS O 3-20 */
6730 ELEM_OPT_TLV(BE_TALKER_ID, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_ID, 0, BE_TALKER_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6731
6732 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6733}
6734/*
6735 * 3.2.1.62 UPLINK RELEASE COMMAND
6736 */
6737static void
6738bssmap_uplink_rel_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6739{
6740 uint32_t curr_offset;
6741 uint32_t consumed;
6742 unsigned curr_len;
6743
6744 curr_offset = offset;
6745 curr_len = len;
6746
6747 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
6748 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6749
6750 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6751}
6752
6753/*
6754 * 3.2.1.63 UPLINK SEIZED COMMAND
6755 */
6756static void
6757bssmap_uplink_seized_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6758{
6759 uint32_t curr_offset;
6760 uint32_t consumed;
6761 unsigned curr_len;
6762
6763 curr_offset = offset;
6764 curr_len = len;
6765
6766 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
6767 ELEM_OPT_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6768 /* Talker Priority 3.2.2.89 MSC-BSS O (note 1) 2 */
6769 ELEM_OPT_TV(BE_TALKER_PRI, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_PRI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_PRI, 0, BE_TALKER_PRI,
curr_offset, ((void*)0))) > 0) { curr_offset += consumed;
curr_len -= consumed; } }
;
6770 /* Emergency set indication 3.2.2.90 MSC-BSS O (note 1) 1 */
6771 ELEM_OPT_T(BE_EMRG_SET_IND, GSM_A_PDU_TYPE_BSSMAP, BE_EMRG_SET_IND, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_EMRG_SET_IND, 0, BE_EMRG_SET_IND
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6772 /* Talker Identity 3.2.2.91 MSC-BSS O 3-20 */
6773 ELEM_MAND_TLV(BE_TALKER_ID, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_ID, 0, BE_TALKER_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TALKER_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_TALKER_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6774
6775 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6776}
6777/*
6778 * 3.2.1.64 SUSPEND
6779 */
6780static void
6781bssmap_sus(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6782{
6783 uint32_t curr_offset;
6784 uint32_t consumed;
6785 unsigned curr_len;
6786
6787 curr_offset = offset;
6788 curr_len = len;
6789
6790 /* DLCI 3.2.2.25 BSS-MSC M 2 */
6791 ELEM_MAND_TV(BE_DLCI, GSM_A_PDU_TYPE_BSSMAP, BE_DLCI, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DLCI, 0, BE_DLCI, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_DLCI, get_gsm_a_msg_string(pinfo->pool, 0, BE_DLCI), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6792
6793 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6794}
6795/*
6796 * 3.2.1.65 RESUME
6797 */
6798static void
6799bssmap_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6800{
6801 uint32_t curr_offset;
6802 uint32_t consumed;
6803 unsigned curr_len;
6804
6805 curr_offset = offset;
6806 curr_len = len;
6807
6808 /* DLCI 3.2.2.25 BSS-MSC M 2 */
6809 ELEM_MAND_TV(BE_DLCI, GSM_A_PDU_TYPE_BSSMAP, BE_DLCI, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DLCI, 0, BE_DLCI, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_DLCI, get_gsm_a_msg_string(pinfo->pool, 0, BE_DLCI), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6810
6811 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6812}
6813/*
6814 * [2] 3.2.1.66 CHANGE CIRCUIT
6815 */
6816static void
6817bssmap_change_cct(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6818{
6819 uint32_t curr_offset;
6820 uint32_t consumed;
6821 unsigned curr_len;
6822
6823 curr_offset = offset;
6824 curr_len = len;
6825
6826 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
6827 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6828
6829 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6830}
6831
6832/*
6833 * [2] 3.2.1.67 CHANGE CIRCUIT ACKNOWLEDGE
6834 */
6835static void
6836bssmap_change_cct_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6837{
6838 uint32_t curr_offset;
6839 uint32_t consumed;
6840 unsigned curr_len;
6841
6842 curr_offset = offset;
6843 curr_len = len;
6844
6845 /* Circuit identity 3.2.2.2 BSS-MSC M 3 */
6846 ELEM_MAND_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0)) { curr_offset += consumed; curr_len -= consumed
; } else { proto_tree_add_expert_format(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element
, tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CIC, get_gsm_a_msg_string(pinfo->pool, 0, BE_CIC), ((
(void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6847
6848 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6849}
6850
6851/*
6852 * [2] 3.2.1.68 Common ID
6853 */
6854static void
6855bssmap_common_id(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6856{
6857 uint32_t curr_offset;
6858 uint32_t consumed;
6859 unsigned curr_len;
6860
6861 curr_offset = offset;
6862 curr_len = len;
6863
6864 /* IMSI 3.2.2.6 MSC-BSS M 3-10 */
6865 ELEM_MAND_TLV(BE_IMSI, GSM_A_PDU_TYPE_BSSMAP, BE_IMSI, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMSI, 0, BE_IMSI, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_IMSI, get_gsm_a_msg_string(pinfo->pool, 0, BE_IMSI), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6866 /* SNA Access Information 3.2.2.82 MSC-BSC O (note) 2+n */
6867 ELEM_OPT_TLV(BE_SNA_ACC_INF, GSM_A_PDU_TYPE_BSSMAP, BE_SNA_ACC_INF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SNA_ACC_INF, 0, BE_SNA_ACC_INF
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6868 /* Selected PLMN ID 3.2.2.126 MSC-BSC O (note 3) */
6869 ELEM_OPT_TV(BE_SELECTED_PLMN_ID, GSM_A_PDU_TYPE_BSSMAP, BE_SELECTED_PLMN_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SELECTED_PLMN_ID, 0, BE_SELECTED_PLMN_ID
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6870 /* Last used E-UTRAN PLMN ID 3.2.2.127 MSC-BSC O (note 4) 4 */
6871 ELEM_OPT_TV(BE_LAST_USED_E_UTRAN_PLMN_ID, GSM_A_PDU_TYPE_BSSMAP, BE_LAST_USED_E_UTRAN_PLMN_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LAST_USED_E_UTRAN_PLMN_ID, 0,
BE_LAST_USED_E_UTRAN_PLMN_ID, curr_offset, ((void*)0))) >
0) { curr_offset += consumed; curr_len -= consumed; } }
;
6872
6873 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6874}
6875
6876/*
6877 * [2] 3.2.1.69 LSA INFORMATION
6878 */
6879static void
6880bssmap_lsa_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6881{
6882 uint32_t curr_offset;
6883 uint32_t consumed;
6884 unsigned curr_len;
6885
6886 curr_offset = offset;
6887 curr_len = len;
6888
6889 /* LSA Information 3.2.2.23 MSC-BSS M 3+4n */
6890 ELEM_MAND_TLV(BE_LSA_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_LSA_INFO, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LSA_INFO, 0, BE_LSA_INFO, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_LSA_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_LSA_INFO
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6891
6892 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6893}
6894
6895/*
6896 * [2] 3.2.1.70 (void)
6897 */
6898void
6899bssmap_conn_oriented(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6900{
6901 uint32_t curr_offset;
6902 uint32_t consumed;
6903 unsigned curr_len;
6904
6905 curr_offset = offset;
6906 curr_len = len;
6907
6908 ELEM_MAND_TLV_E(BE_APDU, GSM_A_PDU_TYPE_BSSMAP, BE_APDU, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv_e
(tvb, tree, pinfo, (uint8_t) BE_APDU, 0, BE_APDU, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_APDU, get_gsm_a_msg_string(pinfo->pool, 0, BE_APDU), (
((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6909
6910 ELEM_OPT_TLV(BE_SEG, GSM_A_PDU_TYPE_BSSMAP, BE_SEG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SEG, 0, BE_SEG, curr_offset, curr_len
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
6911 /* Multilateration Positioning Method Multilateration Positioning Method C (Note 2) TLV 2
6912 * Cell Identifier Cell Identifier C (Note 3) TLV 7
6913 * Multilateration Timing Advance Multilateration Timing Advance C (Note 3) TV 3
6914 * MS Sync Accuracy MS Sync Accuracy C (Note 4) TV 2
6915 * BTS Reception Accuracy Level BTS Reception Accuracy Level C (Note 3) TV 2
6916 * Short ID Short ID C (Note 5) TV 2
6917 * Random ID Random ID C (Note 4) TV 3
6918 */
6919 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6920}
6921
6922/*
6923 * 3.2.1.71 PERFORM LOCATION REQUEST
6924 */
6925static void
6926bssmap_perf_loc_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6927{
6928 uint32_t curr_offset;
6929 uint32_t consumed;
6930 unsigned curr_len;
6931
6932 curr_offset = offset;
6933 curr_len = len;
6934
6935 /* Location Type 3.2.2.63 M 3-n */
6936 ELEM_MAND_TLV(BE_LOC_TYPE, GSM_A_PDU_TYPE_BSSMAP, BE_LOC_TYPE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LOC_TYPE, 0, BE_LOC_TYPE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_LOC_TYPE, get_gsm_a_msg_string(pinfo->pool, 0, BE_LOC_TYPE
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
6937 /* Cell Identifier 3.2.2.17 O 5-10 */
6938 ELEM_OPT_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6939 /* Classmark Information Type 3 3.2.2.20 O 3-14 */
6940 ELEM_OPT_TLV(BE_CM_INFO_3, GSM_A_PDU_TYPE_BSSMAP, BE_CM_INFO_3, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CM_INFO_3, 0, BE_CM_INFO_3, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6941 /* LCS Client Type 3.2.2.67 C (note 3) 3-n */
6942 ELEM_OPT_TLV(BE_LCS_CLIENT, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CLIENT_TYPE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LCS_CLIENT, 8, DE_BMAPLE_LCS_CLIENT_TYPE
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6943 /* Chosen Channel 3.2.2.33 O 2 */
6944 ELEM_OPT_TV(BE_CHOSEN_CHAN, GSM_A_PDU_TYPE_BSSMAP, BE_CHOSEN_CHAN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CHOSEN_CHAN, 0, BE_CHOSEN_CHAN
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
6945 /* LCS Priority 3.2.2.62 O 3-n */
6946 ELEM_OPT_TLV(BE_LCS_PRIO, GSM_A_PDU_TYPE_BSSMAP, BE_LCS_PRIO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LCS_PRIO, 0, BE_LCS_PRIO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6947 /* LCS QoS 3.2.2.60 C (note 1) 3-n */
6948 ELEM_OPT_TLV(BE_LCS_QOS, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCSQOS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LCS_QOS, 8, DE_BMAPLE_LCSQOS,
curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6949 /* GPS Assistance Data 3.2.2.70 C (note 2) 3-n */
6950 ELEM_OPT_TLV(BE_GPS_ASSIST_DATA, GSM_A_PDU_TYPE_BSSMAP, BE_GPS_ASSIST_DATA, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GPS_ASSIST_DATA, 0, BE_GPS_ASSIST_DATA
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6951 /* APDU 3.2.2.68 O 3-n */
6952 ELEM_OPT_TLV_E(BE_APDU, GSM_A_PDU_TYPE_BSSMAP, BE_APDU, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv_e
(tvb, tree, pinfo, (uint8_t) BE_APDU, 0, BE_APDU, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6953 /* IMSI 3.2.2.6 O (note 4) 5-10 */
6954 ELEM_OPT_TLV(BE_IMSI, GSM_A_PDU_TYPE_BSSMAP, BE_IMSI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMSI, 0, BE_IMSI, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6955 /* IMEI 3.2.2.86 O (note 4) 10 (use same decode as IMSI) */
6956 ELEM_OPT_TLV(BE_IMEI, GSM_A_PDU_TYPE_BSSMAP, BE_IMEI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMEI, 0, BE_IMEI, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6957 /* GANSS Location Type 3.2.2.97 C 3 */
6958 ELEM_OPT_TLV(BE_GANSS_LOC_TYP, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_LOC_TYP, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GANSS_LOC_TYP, 0, BE_GANSS_LOC_TYP
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6959 /* GANSS Assistance Data 3.2.2.95 C (note 5) 3-n */
6960 ELEM_OPT_TLV(BE_GANSS_ASS_DTA, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_ASS_DTA, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GANSS_ASS_DTA, 0, BE_GANSS_ASS_DTA
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6961
6962 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6963}
6964/*
6965 * 3.2.1.72 PERFORM LOCATION RESPONSE
6966 */
6967static void
6968bssmap_perf_loc_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6969{
6970 uint32_t curr_offset;
6971 uint32_t consumed;
6972 unsigned curr_len;
6973
6974 curr_offset = offset;
6975 curr_len = len;
6976
6977 /* Location Estimate 3.2.2.64 C (note 1) 3-n */
6978 ELEM_OPT_TLV(BE_LOC_EST, GSM_A_PDU_TYPE_BSSMAP, BE_LOC_EST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LOC_EST, 0, BE_LOC_EST, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6979 /* Positioning Data 3.2.2.65 O 3-n */
6980 ELEM_OPT_TLV(BE_POS_DATA, GSM_A_PDU_TYPE_BSSMAP, BE_POS_DATA, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_POS_DATA, 0, BE_POS_DATA, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6981 /* Deciphering Keys 3.2.2.71 C (note 2) 3-n */
6982 ELEM_OPT_TLV(BE_DECIPH_KEYS, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_DECIPH_KEYS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_DECIPH_KEYS, 8, DE_BMAPLE_DECIPH_KEYS
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6983 /* LCS Cause 3.2.2.66 C (note 3) 3-n */
6984 ELEM_OPT_TLV(BE_LCS_CAUSE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LCS_CAUSE, 8, DE_BMAPLE_LCS_CAUSE
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6985 /* Velocity Estimate 3.2.2.87 O 3-n */
6986 ELEM_OPT_TLV(BE_VEL_EST, GSM_A_PDU_TYPE_BSSMAP, BE_VEL_EST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_VEL_EST, 0, BE_VEL_EST, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
6987 /* GANSS Positioning Data 3.2.2.96 O 3-n */
6988 ELEM_OPT_TLV(BE_GANSS_POS_DTA, GSM_A_PDU_TYPE_BSSMAP, BE_GANSS_POS_DTA, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_GANSS_POS_DTA, 0, BE_GANSS_POS_DTA
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
6989
6990 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
6991}
6992/*
6993 * 3.2.1.73 PERFORM LOCATION ABORT
6994 */
6995void
6996bssmap_perf_loc_abort(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
6997{
6998 uint32_t curr_offset;
6999 uint32_t consumed;
7000 unsigned curr_len;
7001
7002 curr_offset = offset;
7003 curr_len = len;
7004
7005 /* LCS Cause 3.2.2.66 M 3-n */
7006 ELEM_OPT_TLV(BE_LCS_CAUSE, GSM_PDU_TYPE_BSSMAP_LE, DE_BMAPLE_LCS_CAUSE, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_LCS_CAUSE, 8, DE_BMAPLE_LCS_CAUSE
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7007
7008 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7009}
7010
7011/*
7012 * 3.2.1.74 CONNECTIONLESS INFORMATION
7013 *
7014Network Element Identity (source) 3.2.2.69 Both M 3-n
7015Network Element Identity (target) 3.2.2.69 Both M 3-n
7016APDU 3.2.2.68 Both M 3-n
7017Segmentation 3.2,2,74 Both C (note 1) 5
7018Return Error Request 3.2.2.72 Both C (note 2) 3-n
7019Return Error Cause 3.2.2.73 Both C (note 3) 3-n
7020*/
7021
7022/*
7023 * 3.2.1.75 CHANNEL MODIFY REQUEST
7024 */
7025
7026static void
7027bssmap_chan_mod_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7028{
7029 uint32_t curr_offset;
7030 uint32_t consumed;
7031 unsigned curr_len;
7032
7033 curr_offset = offset;
7034 curr_len = len;
7035
7036 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
7037 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7038
7039 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7040}
7041/*
7042 * 3.2.1.76 EMERGENCY RESET INDICATION
7043 */
7044/*
7045Cell Identifier 3.2.2.17 BSS-MSC O 3-10
7046ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL);
7047Layer 3 Information 3.2.2.24 BSS-MSC O (note 2) 3-n
7048 ELEM_OPT_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL);
7049Mobile Identity 3.2.2.41 BSS-MSC O (note 1) 3-n
7050*/
7051/*
7052 * 3.2.1.77 EMERGENCY RESET COMMAND
7053 * No data
7054 */
7055/*
7056 * 3.2.1.78 VGCS ADDITIONAL INFORMATION
7057 */
7058static void
7059bssmap_vgcs_add_inf(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7060{
7061 uint32_t curr_offset;
7062 uint32_t consumed;
7063 unsigned curr_len;
7064
7065 curr_offset = offset;
7066 curr_len = len;
7067
7068 /* Talker Identity 3.2.2.91 MSC-BSS M 3-20 */
7069 ELEM_MAND_TLV(BE_TALKER_ID, GSM_A_PDU_TYPE_BSSMAP, BE_TALKER_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_TALKER_ID, 0, BE_TALKER_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_TALKER_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_TALKER_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7070
7071 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7072}
7073/*
7074 * 3.2.1.79 VGCS/VBS AREA CELL INFO
7075 */
7076static void
7077bssmap_vgcs_vbs_area_cell_info(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7078{
7079 uint32_t curr_offset;
7080 uint32_t consumed;
7081 unsigned curr_len;
7082
7083 curr_offset = offset;
7084 curr_len = len;
7085
7086 /* Cell Identifier List Segment 3.2.2.27a MSC-BSS M 4-? */
7087 ELEM_OPT_TLV(BE_CELL_ID_LIST_SEG, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LIST_SEG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LIST_SEG, 0, BE_CELL_ID_LIST_SEG
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7088 /* Assignment Requirement 3.2.2.52 MSC-BSS O 2 */
7089 ELEM_MAND_TV(BE_ASS_REQ, GSM_A_PDU_TYPE_BSSMAP, BE_ASS_REQ, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_ASS_REQ, 0, BE_ASS_REQ, curr_offset
, ((void*)0))) > 0)) { curr_offset += consumed; curr_len -=
consumed; } else { proto_tree_add_expert_format(tree, pinfo,
&ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_ASS_REQ, get_gsm_a_msg_string(pinfo->pool, 0, BE_ASS_REQ
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7090
7091 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7092}
7093/*
7094 * 3.2.1.80 VGCS/VBS ASSIGNMENT STATUS
7095 */
7096static void
7097bssmap_vgcs_vbs_assign_status(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7098{
7099 uint32_t curr_offset;
7100 uint32_t consumed;
7101 unsigned curr_len;
7102
7103 curr_offset = offset;
7104 curr_len = len;
7105
7106 /* Cell Identifier List Segment for established cells 3.2.2.27b BSS-MSC O (note 1) 3-? */
7107 ELEM_OPT_TLV(BE_CELL_ID_LST_SEG_F_EST_CELLS, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LST_SEG_F_EST_CELLS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LST_SEG_F_EST_CELLS, 0
, BE_CELL_ID_LST_SEG_F_EST_CELLS, curr_offset, curr_len, ((void
*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
7108 /* Cell Identifier List Segment for cells to be established 3.2.2.27c BSS-MSC O (note 1) 3-? */
7109 ELEM_OPT_TLV(BE_CELL_ID_LST_SEG_F_CELL_TB_EST, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LST_SEG_F_CELL_TB_EST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LST_SEG_F_CELL_TB_EST
, 0, BE_CELL_ID_LST_SEG_F_CELL_TB_EST, curr_offset, curr_len,
((void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
7110 /* Cell Identifier List Segment for released cells - no user present 3.2.2.27e BSS-MSC O (note 1) 3-? */
7111 ELEM_OPT_TLV(BE_CELL_ID_LST_SEG_F_REL_CELL, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LST_SEG_F_REL_CELL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LST_SEG_F_REL_CELL, 0
, BE_CELL_ID_LST_SEG_F_REL_CELL, curr_offset, curr_len, ((void
*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
7112 /* Cell Identifier List Segment for not established cells - no establishment possible 3.2.2.27f BSS-MSC O (note 1) 3-? */
7113 ELEM_OPT_TLV(BE_CELL_ID_LST_SEG_F_NOT_EST_CELL, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID_LST_SEG_F_NOT_EST_CELL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID_LST_SEG_F_NOT_EST_CELL
, 0, BE_CELL_ID_LST_SEG_F_NOT_EST_CELL, curr_offset, curr_len
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
7114 /* VGCS/VBS Cell Status 3.2.2.94 BSS-MSC O (note 2) 3 */
7115 ELEM_OPT_TLV(BE_VGS_VBS_CELL_STAT, GSM_A_PDU_TYPE_BSSMAP, BE_VGS_VBS_CELL_STAT, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_VGS_VBS_CELL_STAT, 0, BE_VGS_VBS_CELL_STAT
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7116
7117 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7118}
7119/*
7120 * 3.2.1.81 VGCS SMS
7121 */
7122static void
7123bssmap_vgcs_sms(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7124{
7125 uint32_t curr_offset;
7126 uint32_t consumed;
7127 unsigned curr_len;
7128
7129 curr_offset = offset;
7130 curr_len = len;
7131
7132 /* SMS to VGCS 3.2.2.92 MSC-BSS M 2-250 */
7133 ELEM_MAND_TLV(BE_SMS_TO_VGCS, GSM_A_PDU_TYPE_BSSMAP, BE_SMS_TO_VGCS, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SMS_TO_VGCS, 0, BE_SMS_TO_VGCS
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_SMS_TO_VGCS, get_gsm_a_msg_string(pinfo->pool, 0, BE_SMS_TO_VGCS
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7134
7135 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7136}
7137/*
7138 * 3.2.1.82 NOTIFICATION DATA
7139 */
7140static void
7141bssmap_notification_data(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7142{
7143 uint32_t curr_offset;
7144 uint32_t consumed;
7145 unsigned curr_len;
7146
7147 curr_offset = offset;
7148 curr_len = len;
7149
7150 /* Application Data 3.2.2.98 MSC-BSS M 11 */
7151 ELEM_MAND_TLV(BE_APP_DATA_INF, GSM_A_PDU_TYPE_BSSMAP, BE_APP_DATA_INF, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_APP_DATA_INF, 0, BE_APP_DATA_INF
, curr_offset, curr_len, ((void*)0))) > 0)) { curr_offset +=
consumed; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_APP_DATA_INF, get_gsm_a_msg_string(pinfo->pool, 0, BE_APP_DATA_INF
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7152 /* Data Identity 3.2.2.99 MSC-BSS M 3 */
7153 ELEM_MAND_TLV(BE_DATA_ID, GSM_A_PDU_TYPE_BSSMAP, BE_DATA_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_DATA_ID, 0, BE_DATA_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_DATA_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_DATA_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7154 /* MSISDN 3.2.2.101 MSC-BSS O 2-12 */
7155 ELEM_MAND_TLV(BE_MSISDN, GSM_A_PDU_TYPE_BSSMAP, BE_MSISDN, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_MSISDN, 0, BE_MSISDN, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_MSISDN, get_gsm_a_msg_string(pinfo->pool, 0, BE_MSISDN
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7156
7157 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7158}
7159/*
7160 * 3.2.1.83 INTERNAL HANDOVER REQUIRED
7161 */
7162static void
7163bssmap_int_ho_req(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7164{
7165 uint32_t curr_offset;
7166 uint32_t consumed;
7167 unsigned curr_len;
7168
7169 curr_offset = offset;
7170 curr_len = len;
7171
7172 /* Cause 3.2.2.5 BSS-MSC M 3-4 */
7173 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7174 /* Cell Identifier 3.2.2.17 BSS-MSC M 4-10 */
7175 ELEM_MAND_TLV(BE_CELL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CELL_ID, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CELL_ID, 0, BE_CELL_ID, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CELL_ID, get_gsm_a_msg_string(pinfo->pool, 0, BE_CELL_ID
), (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7176 /* AoIP Transport Layer Address (BSS) 3.2.2.nn BSS-MSC C (Note 1) 10-22 */
7177 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7178 /* Codec List (BSS Supported) 3.2.2.103 BSS-MSC M 3-n */
7179 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
7180
7181 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7182}
7183/*
7184 * 3.2.1.84 INTERNAL HANDOVER REQUIRED REJECT
7185 */
7186static void
7187bssmap_int_ho_req_rej(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7188{
7189 uint32_t curr_offset;
7190 uint32_t consumed;
7191 unsigned curr_len;
7192
7193 curr_offset = offset;
7194 curr_len = len;
7195
7196 /* Cause 3.2.2.5 MSC-BSS M 3-4 */
7197 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7198 /* Codec List (MSC Preferred) 3.2.2.nn MSC-BSS O 3-n */
7199 ELEM_OPT_TLV(BE_SPEECH_CODEC_LST, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC_LST, "(BSS Supported)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC_LST, 0, BE_SPEECH_CODEC_LST
, curr_offset, curr_len, "(BSS Supported)")) > 0) { curr_offset
+= consumed; curr_len -= consumed; } }
;
7200
7201 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7202}
7203
7204/*
7205 * 3.2.1.85 INTERNAL HANDOVER COMMAND
7206 */
7207static void
7208bssmap_int_ho_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7209{
7210 uint32_t curr_offset;
7211 uint32_t consumed;
7212 unsigned curr_len;
7213
7214 curr_offset = offset;
7215 curr_len = len;
7216
7217 /* Speech Codec (MSC Chosen) 3.2.2.nn MSC-BSS M (note 1) 3-n */
7218 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7219 /* Circuit Identity Code 3.2.2.2 MSC-BSS C (note 2) 3 */
7220 ELEM_OPT_TV(BE_CIC, GSM_A_PDU_TYPE_BSSMAP, BE_CIC, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CIC, 0, BE_CIC, curr_offset, (
(void*)0))) > 0) { curr_offset += consumed; curr_len -= consumed
; } }
;
7221 /* AoIP Transport Layer Address (MGW) 3.2.2.102 MSC-BSS C (note 2) 10-22 */
7222 ELEM_OPT_TLV(BE_AOIP_TRANS_LAY_ADD, GSM_A_PDU_TYPE_BSSMAP, BE_AOIP_TRANS_LAY_ADD, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_AOIP_TRANS_LAY_ADD, 0, BE_AOIP_TRANS_LAY_ADD
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7223 /* Call Identifier 3.2.2.105 MSC-BSS C (note 4) 5 */
7224 ELEM_OPT_TV(BE_CALL_ID, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID, 0, BE_CALL_ID, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
7225 /* Downlink DTX Flag 3.2.2.26 MSC-BSS O (note 5) 2 */
7226 ELEM_OPT_TV(BE_DOWN_DTX_FLAG, GSM_A_PDU_TYPE_BSSMAP, BE_DOWN_DTX_FLAG, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_DOWN_DTX_FLAG, 0, BE_DOWN_DTX_FLAG
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
7227 /* LCLS-Connection-Status-Control 3.2.2.117 MSC-BSS O (note 6) 2 */
7228 ELEM_OPT_TV(BE_LCLS_CON_STATUS_CONTROL, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CON_STATUS_CONTROL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CON_STATUS_CONTROL, 0, BE_LCLS_CON_STATUS_CONTROL
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
7229
7230 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7231}
7232/*
7233 * 3.2.1.86 INTERNAL HANDOVER ENQUIRY
7234 */
7235
7236static void
7237bssmap_int_ho_enq(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7238{
7239 uint32_t curr_offset;
7240 uint32_t consumed;
7241 unsigned curr_len;
7242
7243 curr_offset = offset;
7244 curr_len = len;
7245
7246 /* Speech Codec (MSC Chosen) 3.2.2.104 MSC-BSS M 3-n */
7247 ELEM_OPT_TLV(BE_SPEECH_CODEC, GSM_A_PDU_TYPE_BSSMAP, BE_SPEECH_CODEC, "(Chosen)"){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_SPEECH_CODEC, 0, BE_SPEECH_CODEC
, curr_offset, curr_len, "(Chosen)")) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7248
7249 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7250}
7251/*
7252 * 3.2.1.87 RESET IP RESOURCE
7253 */
7254static void
7255bssmap_reset_ip_res(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7256{
7257 uint32_t curr_offset;
7258 uint32_t consumed;
7259 unsigned curr_len;
7260
7261 curr_offset = offset;
7262 curr_len = len;
7263
7264 /* Cause 3.2.2.5 Both M 3-4 */
7265 ELEM_MAND_TLV(BE_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CAUSE, 0, BE_CAUSE, curr_offset
, curr_len, ((void*)0))) > 0)) { curr_offset += consumed; curr_len
-= consumed; } else { proto_tree_add_expert_format(tree, pinfo
, &ei_gsm_a_bssmap_missing_mandatory_element, tvb, curr_offset
, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0, BE_CAUSE)
, (((void*)0) == ((void*)0)) ? "" : ((void*)0) ); } }
;
7266 /* Call Identifier List 3.2.2.106 Both M 6-n */
7267 ELEM_OPT_TLV(BE_CALL_ID_LST, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID_LST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID_LST, 0, BE_CALL_ID_LST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7268
7269 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7270}
7271/*
7272 * 3.2.1.88 RESET IP RESOURCE ACKNOWLEDGE
7273 */
7274static void
7275bssmap_reset_ip_res_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7276{
7277 uint32_t curr_offset;
7278 uint32_t consumed;
7279 unsigned curr_len;
7280
7281 curr_offset = offset;
7282 curr_len = len;
7283
7284 /* Call Identifier List 3.2.2.106 Both M 6-n */
7285 ELEM_OPT_TLV(BE_CALL_ID_LST, GSM_A_PDU_TYPE_BSSMAP, BE_CALL_ID_LST, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_CALL_ID_LST, 0, BE_CALL_ID_LST
, curr_offset, curr_len, ((void*)0))) > 0) { curr_offset +=
consumed; curr_len -= consumed; } }
;
7286
7287 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7288}
7289
7290/*
7291 * 3.2.1.89 REROUTE COMMAND
7292 */
7293static void
7294bssmap_reroute_cmd(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7295{
7296 uint32_t curr_offset;
7297 uint32_t consumed;
7298 unsigned curr_len;
7299
7300 curr_offset = offset;
7301 curr_len = len;
7302
7303 /* Initial Layer 3 Information 3.2.2.24 MSC-BSS M (note 1) 3-n */
7304 ELEM_MAND_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, " (Initial)", ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, " (Initial)")) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_L3_INFO, get_gsm_a_msg_string(pinfo->pool, 0, BE_L3_INFO
), (" (Initial)" == ((void*)0)) ? "" : " (Initial)" ); } }
;
7305 /* Reroute Reject Cause 3.2.2.112 MSC-BSS M (note 2) 2 */
7306 ELEM_MAND_TV(BE_REROUTE_REJ_CAUSE, GSM_A_PDU_TYPE_BSSMAP, BE_REROUTE_REJ_CAUSE, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_REROUTE_REJ_CAUSE, 0, BE_REROUTE_REJ_CAUSE
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_REROUTE_REJ_CAUSE, get_gsm_a_msg_string(pinfo->pool, 0
, BE_REROUTE_REJ_CAUSE), (((void*)0) == ((void*)0)) ? "" : ((
void*)0) ); } }
;
7307 /* Layer 3 Information 3.2.2.24 MSC-BSS O (note3) 3-n */
7308 ELEM_OPT_TLV(BE_L3_INFO, GSM_A_PDU_TYPE_BSSMAP, BE_L3_INFO, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_L3_INFO, 0, BE_L3_INFO, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
7309 /* Send Sequence Number 3.2.2.113 MSC-BSS O (note 4) 2 */
7310 ELEM_OPT_TV(BE_SEND_SEQN, GSM_A_PDU_TYPE_BSSMAP, BE_SEND_SEQN, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_SEND_SEQN, 0, BE_SEND_SEQN, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
7311 /* IMSI 3.2.2.6 MSC-BSS O (note 5) 3-10 */
7312 ELEM_OPT_TLV(BE_IMSI, GSM_A_PDU_TYPE_BSSMAP, BE_IMSI, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tlv
(tvb, tree, pinfo, (uint8_t) BE_IMSI, 0, BE_IMSI, curr_offset
, curr_len, ((void*)0))) > 0) { curr_offset += consumed; curr_len
-= consumed; } }
;
7313 /* Old Location Area Identification 3.2.2.128 MSC-BSS O (note 6) 6 */
7314
7315 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7316}
7317
7318/*
7319 * 3.2.1.90 REROUTE COMPLETE
7320 */
7321
7322static void
7323bssmap_reroute_complete(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7324{
7325 uint32_t curr_offset;
7326 uint32_t consumed;
7327 unsigned curr_len;
7328
7329 curr_offset = offset;
7330 curr_len = len;
7331
7332 /* Reroute complete outcome 3.2.2.114 MSC-BSS M 2 */
7333 ELEM_MAND_TV(BE_REROUTE_OUTCOME, GSM_A_PDU_TYPE_BSSMAP, BE_REROUTE_OUTCOME, NULL, ei_gsm_a_bssmap_missing_mandatory_element){ if (((signed)curr_len > 0) && ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_REROUTE_OUTCOME, 0, BE_REROUTE_OUTCOME
, curr_offset, ((void*)0))) > 0)) { curr_offset += consumed
; curr_len -= consumed; } else { proto_tree_add_expert_format
(tree, pinfo, &ei_gsm_a_bssmap_missing_mandatory_element,
tvb, curr_offset, 0, "Missing Mandatory element (0x%02x) %s%s, rest of dissection is suspect"
, BE_REROUTE_OUTCOME, get_gsm_a_msg_string(pinfo->pool, 0,
BE_REROUTE_OUTCOME), (((void*)0) == ((void*)0)) ? "" : ((void
*)0) ); } }
;
7334
7335 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7336}
7337
7338/*
7339 * 3.2.1.91 LCLS-CONNECT-CONTROL
7340 */
7341static void
7342bssmap_lcls_conn_ctrl(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7343{
7344 uint32_t curr_offset;
7345 uint32_t consumed;
7346 unsigned curr_len;
7347
7348 curr_offset = offset;
7349 curr_len = len;
7350
7351
7352 /* LCLS-Configuration 3.2.2.116 MSC-BSS O (note1) 2 */
7353 ELEM_OPT_TV(BE_LCLS_CONF, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CONF, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CONF, 0, BE_LCLS_CONF, curr_offset
, ((void*)0))) > 0) { curr_offset += consumed; curr_len -=
consumed; } }
;
7354 /* LCLS-Connection-Status-Control 3.2.2.117 MSC-BSS O (note1) 2 */
7355 ELEM_OPT_TV(BE_LCLS_CON_STATUS_CONTROL, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_CON_STATUS_CONTROL, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_CON_STATUS_CONTROL, 0, BE_LCLS_CON_STATUS_CONTROL
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
7356
7357 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7358}
7359
7360/*
7361 * 3.2.1.92 LCLS-CONNECT-CONTROL-ACK
7362 */
7363static void
7364bssmap_lcls_conn_ctrl_ack(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7365{
7366 uint32_t curr_offset;
7367 uint32_t consumed;
7368 unsigned curr_len;
7369
7370 curr_offset = offset;
7371 curr_len = len;
7372
7373 /* LCLS-BSS-Status 3.2.2.119 BSS-MSC M 2 */
7374 ELEM_OPT_TV(BE_LCLS_BSS_STATUS, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BSS_STATUS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BSS_STATUS, 0, BE_LCLS_BSS_STATUS
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
7375
7376 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7377}
7378/*
7379 *
7380 * 3.2.1.93 LCLS-NOTIFICATION
7381 */
7382static void
7383bssmap_lcls_notif(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len)
7384{
7385 uint32_t curr_offset;
7386 uint32_t consumed;
7387 unsigned curr_len;
7388
7389 curr_offset = offset;
7390 curr_len = len;
7391
7392 /* LCLS-BSS-Status 3.2.2.119 BSS-MSC O (note 1) 2 */
7393 ELEM_OPT_TV(BE_LCLS_BSS_STATUS, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BSS_STATUS, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_tv
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BSS_STATUS, 0, BE_LCLS_BSS_STATUS
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
7394 /* LCLS-Break-Request 3.2.2.120 BSS-MSC O (note 1) 1 */
7395 ELEM_OPT_T(BE_LCLS_BREAK_REQ, GSM_A_PDU_TYPE_BSSMAP, BE_LCLS_BREAK_REQ, NULL){ if ((signed)curr_len <= 0) return; if ((consumed = elem_t
(tvb, tree, pinfo, (uint8_t) BE_LCLS_BREAK_REQ, 0, BE_LCLS_BREAK_REQ
, curr_offset, ((void*)0))) > 0) { curr_offset += consumed
; curr_len -= consumed; } }
;
7396
7397 EXTRANEOUS_DATA_CHECK(curr_len, 0, pinfo, &ei_gsm_a_bssmap_extraneous_data)if ((curr_len) > (0)) { proto_tree_add_expert(tree, pinfo,
&ei_gsm_a_bssmap_extraneous_data, tvb, curr_offset, (curr_len
) - (0)); curr_offset += ((curr_len) - (0)); }
;
7398}
7399
7400#if 0
7401/*
7402 * 3.2.1.94 MS REGISTRATION ENQUIRY
7403 */
7404 /* IMSI 3.2.2.6 BSS-MSC M 3-10 */
7405/*
7406 * 3.2.1.95 MS REGISTRATION ENQUIRY RESPONSE
7407 */
7408 /* IMSI 3.2.2.6 MSC-BSS M 3-10 */
7409 /* CS Registered Operator 3.2.2.132 MSC-BSS O (note 1) 4 */
7410
7411
7412#endif
7413#define NUM_GSM_BSSMAP_MSG(int)(sizeof (gsm_a_bssmap_msg_strings) / sizeof (gsm_a_bssmap_msg_strings
)[0])
(int)array_length(gsm_a_bssmap_msg_strings)(sizeof (gsm_a_bssmap_msg_strings) / sizeof (gsm_a_bssmap_msg_strings
)[0])
7414static int ett_gsm_bssmap_msg[NUM_GSM_BSSMAP_MSG(int)(sizeof (gsm_a_bssmap_msg_strings) / sizeof (gsm_a_bssmap_msg_strings
)[0])
];
7415
7416static void (* const bssmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, uint32_t offset, unsigned len) = {
7417 bssmap_ass_req, /* Assignment Request */
7418 bssmap_ass_complete, /* Assignment Complete */
7419 bssmap_ass_failure, /* Assignment Failure */
7420 bssmap_vgcs_vbs_setup, /* VGCS/VBS Setup */
7421 bssmap_vgcs_vbs_setup_ack, /* VGCS/VBS Setup Ack */
7422 bssmap_vgcs_vbs_setup_refuse, /* VGCS/VBS Setup Refuse */
7423 bssmap_vgcs_vbs_ass_req, /* VGCS/VBS Assignment Request */
7424 bssmap_chan_mod_req, /* 0x08 Channel Modify request */
7425 NULL((void*)0), /* Unallocated */
7426 NULL((void*)0), /* Unallocated */
7427 NULL((void*)0), /* Unallocated */
7428 NULL((void*)0), /* Unallocated */
7429 NULL((void*)0), /* Unallocated */
7430 NULL((void*)0), /* Unallocated */
7431 NULL((void*)0), /* Unallocated */
7432 bssmap_ho_req, /* 0x10 Handover Request */
7433 bssmap_ho_reqd, /* Handover Required */
7434 bssmap_ho_req_ack, /* Handover Request Acknowledge */
7435 bssmap_ho_cmd, /* Handover Command */
7436 bssmap_ho_complete, /* Handover Complete */
7437 bssmap_ho_succ, /* Handover Succeeded */
7438 bssmap_ho_failure, /* Handover Failure */
7439 bssmap_ho_performed, /* Handover Performed */
7440 bssmap_ho_cand_enq, /* Handover Candidate Enquire */
7441 bssmap_ho_cand_resp, /* Handover Candidate Response */
7442 bssmap_ho_reqd_rej, /* Handover Required Reject */
7443 bssmap_ho_det, /* 0x1b Handover Detect */
7444 bssmap_vgcs_vbs_ass_res, /* 0x1c VGCS/VBS Assignment Result */
7445 bssmap_vgcs_vbs_ass_fail, /* 0x1d VGCS/VBS Assignment Failure */
7446 NULL((void*)0), /* 0x1e No dsta VGCS/VBS Queuing Indication */
7447 bssmap_uplink_req, /* 0x1f Uplink Request */
7448
7449 bssmap_clear_cmd, /* 0x20 Clear Command */
7450 NULL((void*)0) /* no associated data */, /* Clear Complete */
7451 bssmap_clear_req, /* Clear Request */
7452 NULL((void*)0), /* Reserved */
7453 NULL((void*)0), /* Reserved */
7454 bssmap_sapi_rej, /* SAPI 'n' Reject */
7455 bssmap_confusion, /* Confusion */
7456 bssmap_uplink_req_ack, /* Uplink Request Acknowledge */
7457 bssmap_sus, /* Suspend */
7458 bssmap_res, /* Resume */
7459 bssmap_conn_oriented, /* Connection Oriented Information */
7460 bssmap_perf_loc_req, /* Perform Location Request */
7461 bssmap_lsa_info, /* LSA Information */
7462 bssmap_perf_loc_res, /* Perform Location Response */
7463 bssmap_perf_loc_abort, /* Perform Location Abort */
7464 bssmap_common_id, /* Common Id */
7465 bssmap_reset, /* Reset */
7466 bssmap_reset_ack, /* Reset Acknowledge */
7467 bssmap_overload, /* Overload */
7468 NULL((void*)0), /* Reserved */
7469 bssmap_reset_cct, /* Reset Circuit */
7470 bssmap_reset_cct_ack, /* Reset Circuit Acknowledge */
7471 bssmap_msc_invoke_trace, /* MSC Invoke Trace */
7472 bssmap_bss_invoke_trace, /* 0x37 BSS Invoke Trace */
7473
7474 NULL((void*)0), /* 0x38 unallocated */
7475 NULL((void*)0), /* 0x39 unallocated */
7476
7477 NULL((void*)0), /* 0x3a Connectionless Information */
7478 bssmap_vgcs_vbs_assign_status, /* 0x3b VGCS/VBS ASSIGNMENT STATUS */
7479 bssmap_vgcs_vbs_area_cell_info, /* 0x3c VGCS/VBS AREA CELL INFO */
7480 bssmap_reset_ip_res, /* 0x3d 3.2.1.87 RESET IP RESOURCE */
7481 bssmap_reset_ip_res_ack, /* 0x3e 3.2.1.88 RESET IP RESOURCE ACKNOWLEDGE */
7482 NULL((void*)0), /* 0x3f VGCS/VBS AREA CELL INFO */
7483 bssmap_block, /* Block */
7484 bssmap_block_ack, /* Blocking Acknowledge */
7485 bssmap_unblock, /* Unblock */
7486 bssmap_unblock_ack, /* Unblocking Acknowledge */
7487 bssmap_cct_group_block, /* Circuit Group Block */
7488 bssmap_cct_group_block_ack, /* Circuit Group Blocking Acknowledge */
7489 bssmap_cct_group_unblock, /* Circuit Group Unblock */
7490 bssmap_cct_group_unblock_ack, /* Circuit Group Unblocking Acknowledge */
7491 bssmap_unequipped_cct, /* Unequipped Circuit */
7492 bssmap_uplink_req_conf, /* Uplink Request Confirmation */
7493 bssmap_uplink_rel_ind, /* Uplink Release Indication */
7494 bssmap_uplink_rej_cmd, /* Uplink Reject Command */
7495 bssmap_uplink_rel_cmd, /* Uplink Release Command */
7496 bssmap_uplink_seized_cmd, /* Uplink Seized Command */
7497 bssmap_change_cct, /* Change Circuit */
7498 bssmap_change_cct_ack, /* Change Circuit Acknowledge */
7499 bssmap_res_req, /* Resource Request */
7500 bssmap_res_ind, /* Resource Indication */
7501 bssmap_paging, /* Paging */
7502 bssmap_ciph_mode_cmd, /* Cipher Mode Command */
7503 bssmap_cm_upd, /* Classmark Update */
7504 bssmap_ciph_mode_complete, /* Cipher Mode Complete */
7505 NULL((void*)0) /* no associated data */, /* Queuing Indication */
7506 bssmap_cl3_info, /* Complete Layer 3 Information */
7507 bssmap_cls_m_req /* no associated data */, /* Classmark Request */
7508 bssmap_ciph_mode_rej, /* Cipher Mode Reject */
7509 bssmap_load_ind, /* 0x5a Load Indication */
7510
7511 NULL((void*)0), /* 0x5b unallocated */
7512 NULL((void*)0), /* 0x5c unallocated */
7513 NULL((void*)0), /* 0x5d unallocated */
7514 NULL((void*)0), /* 0x5e unallocated */
7515 NULL((void*)0), /* 0x5f unallocated */
7516
7517 bssmap_vgcs_add_inf, /* 0x60 VGCS Additional Information */
7518 bssmap_vgcs_sms, /* 0x61 VGCS SMS */
7519 bssmap_notification_data, /* 0x62 Notification Data*/
7520 bssmap_uplink_app_data, /* 0x63 Uplink Application Data */
7521
7522 NULL((void*)0), /* 0x64 unallocated */
7523 NULL((void*)0), /* 0x65 unallocated */
7524 NULL((void*)0), /* 0x66 unallocated */
7525 NULL((void*)0), /* 0x67 unallocated */
7526 NULL((void*)0), /* 0x68 unallocated */
7527 NULL((void*)0), /* 0x69 unallocated */
7528 NULL((void*)0), /* 0x6a unallocated */
7529 NULL((void*)0), /* 0x6b unallocated */
7530 NULL((void*)0), /* 0x6c unallocated */
7531 NULL((void*)0), /* 0x6d unallocated */
7532 NULL((void*)0), /* 0x6e unallocated */
7533 NULL((void*)0), /* 0x6f unallocated */
7534
7535 bssmap_int_ho_req, /* 0x70 Internal Handover Required */
7536 bssmap_int_ho_req_rej, /* 0x71 Internal Handover Required Reject */
7537 bssmap_int_ho_cmd, /* 0x72 Internal Handover Command */
7538 bssmap_int_ho_enq, /* 0x73 Internal Handover Enquiry */
7539
7540 bssmap_lcls_conn_ctrl, /* 0x74 LCLS-Connect-Control */
7541 bssmap_lcls_conn_ctrl_ack, /* 0x75 LCLS-Connect-Control-Ack */
7542 bssmap_lcls_notif, /* 0x76 LCLS-Notification */
7543 NULL((void*)0), /* 0x77 Unallocated */
7544 bssmap_reroute_cmd, /* 0x78 Reroute Command */
7545 bssmap_reroute_complete, /* 0x79 Reroute Complete */
7546
7547 NULL((void*)0), /* NONE */
7548};
7549#define NUM_BSSMAP_MSG_FCNS(int)(sizeof (bssmap_msg_fcn) / sizeof (bssmap_msg_fcn)[0]) (int)array_length(bssmap_msg_fcn)(sizeof (bssmap_msg_fcn) / sizeof (bssmap_msg_fcn)[0])
7550
7551static int
7552dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
7553{
7554 static gsm_a_tap_rec_t tap_rec[4];
7555 static gsm_a_tap_rec_t *tap_p;
7556 static unsigned tap_current = 0;
7557 uint8_t oct;
7558 uint32_t offset, saved_offset;
7559 uint32_t len;
7560 int idx;
7561 proto_item *bssmap_item = NULL((void*)0);
7562 proto_tree *bssmap_tree = NULL((void*)0);
7563 const char *str;
7564 sccp_msg_info_t* sccp_msg_p = (sccp_msg_info_t*)data;
7565
7566 if (!(sccp_msg_p && sccp_msg_p->data.co.assoc)) {
7567 sccp_msg_p = NULL((void*)0);
7568 }
7569
7570 col_append_str(pinfo->cinfo, COL_INFO, "(BSSMAP) ");
7571
7572 /*
7573 * set tap record pointer
7574 */
7575 tap_current++;
7576 if (tap_current >= 4)
7577 {
7578 tap_current = 0;
7579 }
7580 tap_p = &tap_rec[tap_current];
7581
7582
7583 offset = 0;
7584 saved_offset = offset;
7585
7586 g_tree = tree;
7587
7588 len = tvb_reported_length(tvb);
7589
7590 /*
7591 * add BSSMAP message name
7592 */
7593 oct = tvb_get_uint8(tvb, offset++);
7594
7595 str = try_val_to_str_idx_ext((uint32_t) oct, &gsm_a_bssmap_msg_strings_ext, &idx);
7596
7597 if (sccp_msg_p && !sccp_msg_p->data.co.label) {
7598 sccp_msg_p->data.co.label = val_to_str_ext(wmem_file_scope(), (uint32_t)oct,
7599 &gsm_a_bssmap_msg_strings_ext,
7600 "BSSMAP (0x%02x)");
7601 }
7602
7603 /*
7604 * create the protocol tree
7605 */
7606 /* The first two conditions are actually the same, i.e. if str != NULL,
7607 * idx >= 0, but checking idx makes it obvious we won' t use a potentially
7608 * negative idx in the else case.
7609 */
7610 if (str == NULL((void*)0) || idx < 0 || idx >= NUM_GSM_BSSMAP_MSG(int)(sizeof (gsm_a_bssmap_msg_strings) / sizeof (gsm_a_bssmap_msg_strings
)[0])
)
7611 {
7612 bssmap_item =
7613 proto_tree_add_protocol_format(tree, proto_a_bssmap, tvb, 0, len,
7614 "GSM A-I/F BSSMAP - Unknown BSSMAP Message Type (0x%02x)",
7615 oct);
7616
7617 bssmap_tree = proto_item_add_subtree(bssmap_item, ett_bssmap_msg);
7618 }
7619 else
7620 {
7621 bssmap_item =
7622 proto_tree_add_protocol_format(tree, proto_a_bssmap, tvb, 0, -1,
7623 "GSM A-I/F BSSMAP - %s",
7624 str);
7625
7626 bssmap_tree = proto_item_add_subtree(bssmap_item, ett_gsm_bssmap_msg[idx]);
7627
7628 col_append_fstr(pinfo->cinfo, COL_INFO, "%s ", str);
7629
7630 /*
7631 * add BSSMAP message name
7632 */
7633 proto_tree_add_uint_format(bssmap_tree, hf_gsm_a_bssmap_msg_type,
7634 tvb, saved_offset, 1, oct, "Message Type %s",str);
7635 }
7636
7637 tap_p->pdu_type = GSM_A_PDU_TYPE_BSSMAP0;
7638 tap_p->message_type = oct;
7639
7640 tap_queue_packet(gsm_a_tap, pinfo, tap_p);
7641
7642 if (str == NULL((void*)0)) return len;
7643
7644 if ((len - offset) <= 0) return len;
7645
7646 /*
7647 * decode elements
7648 */
7649 if (idx < 0 || idx >= NUM_BSSMAP_MSG_FCNS(int)(sizeof (bssmap_msg_fcn) / sizeof (bssmap_msg_fcn)[0]) || bssmap_msg_fcn[idx] == NULL((void*)0)) {
7650 proto_tree_add_bytes_format(bssmap_tree, hf_gsm_a_bssmap_message_elements,
7651 tvb, offset, len - offset, NULL((void*)0), "Message Elements");
7652 }else{
7653 if (sccp_msg_p && ((sccp_msg_p->data.co.assoc->app_info & 0xCD00) == 0xCD00)) {
7654 cell_discriminator = sccp_msg_p->data.co.assoc->app_info & 0xFF;
7655 }else{
7656 cell_discriminator = 0xFF;
7657 }
7658 (*bssmap_msg_fcn[idx])(tvb, bssmap_tree, pinfo, offset, len - offset);
7659 if (sccp_msg_p) {
7660 sccp_msg_p->data.co.assoc->app_info = cell_discriminator | 0xCDF0;
7661 }
7662 }
7663 g_tree = NULL((void*)0);
7664 return len;
7665}
7666
7667/* Register the protocol with Wireshark */
7668void
7669proto_register_gsm_a_bssmap(void)
7670{
7671 unsigned i;
7672 unsigned last_offset;
7673
7674 /* Setup list of header fields */
7675
7676 static hf_register_info hf[] =
7677 {
7678 { &hf_gsm_a_bssmap_msg_type,
7679 { "BSSMAP Message Type", "gsm_a.bssmap.msgtype",
7680 FT_UINT8, BASE_HEX|BASE_EXT_STRING0x00000200, &gsm_a_bssmap_msg_strings_ext, 0x0,
7681 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7682 },
7683 { &hf_gsm_a_bssmap_elem_id,
7684 { "Element ID", "gsm_a.bssmap.elem_id",
7685 FT_UINT8, BASE_HEX, NULL((void*)0), 0,
7686 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7687 },
7688 { &hf_gsm_a_bssmap_field_elem_id,
7689 { "Field Element ID", "gsm_a.bssmap.field_elem_id",
7690 FT_UINT8, BASE_HEX, VALS(bssmap_field_element_ids)((0 ? (const struct _value_string*)0 : ((bssmap_field_element_ids
))))
, 0,
7691 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7692 },
7693 { &hf_gsm_a_bssmap_field_elem_id_len,
7694 { "Length", "gsm_a.bssmap.field_elem_id_len",
7695 FT_UINT8, BASE_DEC, NULL((void*)0), 0,
7696 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7697 },
7698 { &hf_gsm_a_bssmap_cell_ci,
7699 { "Cell CI", "gsm_a.bssmap.cell_ci",
7700 FT_UINT16, BASE_HEX_DEC, 0, 0x0,
7701 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7702 },
7703 { &hf_gsm_a_bssmap_cell_lac,
7704 { "Cell LAC", "gsm_a.bssmap.cell_lac",
7705 FT_UINT16, BASE_HEX_DEC, 0, 0x0,
7706 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7707 },
7708 { &hf_gsm_a_bssmap_sac,
7709 { "SAC", "gsm_a.bssmap.sac",
7710 FT_UINT16, BASE_HEX, 0, 0x0,
7711 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7712 },
7713 { &hf_gsm_a_bssmap_dlci_cc,
7714 { "Control Channel", "gsm_a.bssmap.dlci.cc",
7715 FT_UINT8, BASE_HEX, VALS(bssap_cc_values)((0 ? (const struct _value_string*)0 : ((bssap_cc_values)))), 0xc0,
7716 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7717 },
7718 { &hf_gsm_a_bssmap_dlci_spare,
7719 { "Spare", "gsm_a.bssmap.dlci.spare",
7720 FT_UINT8, BASE_HEX, NULL((void*)0), 0x38,
7721 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7722 },
7723 { &hf_gsm_a_bssmap_dlci_sapi,
7724 { "SAPI", "gsm_a.bssmap.dlci.sapi",
7725 FT_UINT8, BASE_HEX, VALS(bssap_sapi_values)((0 ? (const struct _value_string*)0 : ((bssap_sapi_values)))
)
, 0x07,
7726 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
7727 },
7728 { &hf_gsm_a_bssmap_cause,
7729 { "BSSMAP Cause", "gsm_a.bssmap.cause",
7730 FT_UINT8, BASE_HEX|BASE_RANGE_STRING0x00000100, RVALS(gsm_a_bssap_cause_rvals)((0 ? (const struct _range_string*)0 : ((gsm_a_bssap_cause_rvals
))))
, 0x7F,
7731 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7732 },
7733 { &hf_gsm_a_bssmap_be_cell_id_disc,
7734 { "Cell identification discriminator","gsm_a.bssmap.be.cell_id_disc",
7735 FT_UINT8,BASE_DEC|BASE_EXT_STRING0x00000200, &gsm_a_be_cell_id_disc_vals_ext, 0x0f,
7736 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7737 },
7738 { &hf_gsm_a_bssmap_pci,
7739 { "Preemption Capability indicator(PCI)","gsm_a.bssmap.pci",
7740 FT_BOOLEAN,8, TFS(&bssmap_pci_value)((0 ? (const struct true_false_string*)0 : ((&bssmap_pci_value
))))
, 0x40,
7741 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7742 },
7743 { &hf_gsm_a_bssmap_qa,
7744 { "Queuing Allowed Indicator(QA)","gsm_a.bssmap.qa",
7745 FT_BOOLEAN,8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x02,
7746 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7747 },
7748 { &hf_gsm_a_bssmap_pvi,
7749 { "Preemption Vulnerability Indicator(PVI)","gsm_a.bssmap.pvi",
7750 FT_BOOLEAN,8, TFS(&bssmap_pvi_value)((0 ? (const struct true_false_string*)0 : ((&bssmap_pvi_value
))))
, 0x01,
7751 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7752 },
7753 { &hf_gsm_a_bssmap_interference_bands,
7754 { "Acceptable interference bands","gsm_a.bssmap.interference_bands",
7755 FT_UINT8, BASE_HEX, NULL((void*)0), 0x1f,
7756 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7757 },
7758 { &hf_gsm_a_bssmap_lsa_only,
7759 { "LSA only","gsm_a.bssmap.lsa_only",
7760 FT_BOOLEAN,8, TFS(&bssmap_lsa_only_value)((0 ? (const struct true_false_string*)0 : ((&bssmap_lsa_only_value
))))
, 0x01,
7761 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7762 },
7763 { &hf_gsm_a_bssmap_act,
7764 { "Active mode support","gsm_a.bssmap.act",
7765 FT_BOOLEAN,8, NULL((void*)0), 0x20,
7766 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7767 },
7768 { &hf_gsm_a_bssmap_pref,
7769 { "Preferential access","gsm_a.bssmap.pref",
7770 FT_BOOLEAN,8, NULL((void*)0), 0x10,
7771 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7772 },
7773 { &hf_gsm_a_bssmap_lsa_inf_prio,
7774 { "Priority","gsm_a.bssmap.lsa_inf_prio",
7775 FT_UINT8,BASE_DEC, NULL((void*)0), 0x0f,
7776 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7777 },
7778 { &hf_gsm_a_bssmap_seq_len,
7779 { "Sequence Length","gsm_a.bssmap.seq_len",
7780 FT_UINT8,BASE_DEC, NULL((void*)0), 0xf0,
7781 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7782 },
7783 { &hf_gsm_a_bssmap_seq_no,
7784 { "Sequence Number","gsm_a.bssmap.seq_no",
7785 FT_UINT8,BASE_DEC, NULL((void*)0), 0xf,
7786 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7787 },
7788 { &hf_gsm_a_bssap_cell_id_list_seg_cell_id_disc,
7789 { "Cell identification discriminator","gsm_a.bssmap.cell_id_list_seg_cell_id_disc",
7790 FT_UINT8,BASE_DEC, VALS(gsm_a_bssap_cell_id_list_seg_cell_id_disc_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_cell_id_list_seg_cell_id_disc_vals
))))
, 0xf,
7791 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7792 },
7793 { &hf_gsm_a_bssap_res_ind_method,
7794 { "Resource indication method","gsm_a.bssmap.res_ind_method",
7795 FT_UINT8,BASE_DEC, VALS(gsm_a_bssap_resource_indication_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_resource_indication_vals
))))
, 0xf,
7796 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7797 },
7798 { &hf_gsm_a_bssap_cic_list_range,
7799 { "Range","gsm_a.bssmap.cic_list_range",
7800 FT_UINT8, BASE_DEC, NULL((void*)0), 0,
7801 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7802 },
7803 { &hf_gsm_a_bssap_cic_list_status,
7804 { "Status","gsm_a.bssmap.cic_list_status",
7805 FT_BYTES, BASE_NONE, NULL((void*)0), 0,
7806 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7807 },
7808 { &hf_gsm_a_bssap_diag_error_pointer,
7809 { "Error pointer","gsm_a.bssmap.diag_error_pointer",
7810 FT_UINT16, BASE_HEX, NULL((void*)0), 0,
7811 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7812 },
7813 { &hf_gsm_a_bssap_diag_msg_rcv,
7814 { "Message received","gsm_a.bssmap.diag_msg_rcv",
7815 FT_BYTES, BASE_NONE, NULL((void*)0), 0,
7816 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7817 },
7818 { &hf_gsm_a_bssmap_ch_mode,
7819 { "Channel mode","gsm_a.bssmap.cch_mode",
7820 FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_ch_mode_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_ch_mode_vals
))))
, 0xf0,
7821 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7822 },
7823 { &hf_gsm_a_bssmap_cur_ch_mode,
7824 { "Channel Mode", "gsm_a.bssmap.fe_cur_chan_type2.chan_mode",
7825 FT_UINT8, BASE_HEX, VALS(chan_mode_vals)((0 ? (const struct _value_string*)0 : ((chan_mode_vals)))), 0xf0,
7826 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7827 },
7828 { &hf_gsm_a_bssmap_channel,
7829 { "Channel","gsm_a.bssmap.channel",
7830 FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_channel_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_channel_vals
))))
, 0x0f,
7831 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7832 },
7833 { &hf_gsm_a_bssmap_trace_trigger_id,
7834 { "Priority Indication","gsm_a.bssmap.trace_trigger_id",
7835 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
7836 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7837 },
7838 { &hf_gsm_a_bssmap_trace_priority_indication,
7839 { "Priority Indication","gsm_a.bssmap.trace_priority_indication",
7840 FT_UINT8,BASE_DEC, NULL((void*)0), 0x00,
7841 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7842 },
7843 { &hf_gsm_a_bssmap_trace_bss_record_type,
7844 { "BSS Record Type","gsm_a.bssmap.bss_record__type",
7845 FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_trace_bss_record_type_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_trace_bss_record_type_vals
))))
, 0x00,
7846 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7847 },
7848 { &hf_gsm_a_bssmap_trace_msc_record_type,
7849 { "MSC Record Type","gsm_a.bssmap.msc_record_type",
7850 FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_trace_msc_record_type_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_trace_msc_record_type_vals
))))
, 0x00,
7851 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7852 },
7853 { &hf_gsm_a_bssmap_trace_invoking_event,
7854 { "Invoking Event","gsm_a.bssmap.trace_invoking_event",
7855 FT_UINT8,BASE_DEC, VALS(gsm_a_bssmap_trace_invoking_event_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_trace_invoking_event_vals
))))
, 0x0,
7856 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7857 },
7858 { &hf_gsm_a_bssmap_trace_reference,
7859 { "Trace Reference","gsm_a.bssmap.trace_id",
7860 FT_UINT16,BASE_DEC, NULL((void*)0), 0x0,
7861 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7862 },
7863 { &hf_gsm_a_bssmap_trace_omc_id,
7864 { "OMC ID","gsm_a.bssmap.trace_omc_id",
7865 FT_STRING, BASE_NONE, NULL((void*)0), 0x0,
7866 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7867 },
7868 { &hf_gsm_a_bssmap_be_rnc_id,
7869 { "RNC-ID","gsm_a.bssmap.be.rnc_id",
7870 FT_UINT16,BASE_DEC, NULL((void*)0), 0x0,
7871 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7872 },
7873 { &hf_gsm_a_bssmap_apdu_protocol_id,
7874 { "Protocol ID", "gsm_a.bssmap.apdu_protocol_id",
7875 FT_UINT8, BASE_DEC, VALS(gsm_a_apdu_protocol_id_strings)((0 ? (const struct _value_string*)0 : ((gsm_a_apdu_protocol_id_strings
))))
, 0x0,
7876 "APDU embedded protocol id", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7877 },
7878 { &hf_gsm_a_bssmap_segmentation_spare_bits ,
7879 { "Spare bits", "gsm_a.bssmap.segmentation_spare_bits",
7880 FT_UINT8, BASE_HEX, NULL((void*)0), 0xe0,
7881 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7882 },
7883 { &hf_gsm_a_bssmap_segmentation_info,
7884 { "Segmentation indicator", "gsm_a.bssmap.segmentation_indicator",
7885 FT_BOOLEAN, 8, TFS(&tfs_gsm_a_bssmap_segmented)((0 ? (const struct true_false_string*)0 : ((&tfs_gsm_a_bssmap_segmented
))))
, 0x10,
7886 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7887 },
7888 { &hf_gsm_a_bssmap_segment_number,
7889 { "Segment Number", "gsm_a.bssmap.segment_number",
7890 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0f,
7891 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7892 },
7893 { &hf_gsm_a_bssmap_msg_id,
7894 { "Message ID", "gsm_a.bssmap.msg_id",
7895 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
7896 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7897 },
7898 { &hf_gsm_a_bssmap_periodicity,
7899 { "Periodicity", "gsm_a.bssmap.periodicity",
7900 FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
7901 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7902 },
7903 { &hf_gsm_a_bssmap_sm,
7904 { "Subsequent Mode","gsm_a.bssmap.sm",
7905 FT_BOOLEAN,8, NULL((void*)0), 0x02,
7906 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7907 },
7908 { &hf_gsm_a_bssmap_tarr,
7909 { "Total Accessible Resource Requested","gsm_a.bssmap.tarr",
7910 FT_BOOLEAN,8, NULL((void*)0), 0x01,
7911 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7912 },
7913 { &hf_gsm_a_bssmap_tot_no_of_fullr_ch,
7914 { "Total number of accessible full rate channels", "gsm_a.bssmap.tot_no_of_fullr_ch",
7915 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
7916 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7917 },
7918 { &hf_gsm_a_bssmap_tot_no_of_hr_ch,
7919 { "Total number of accessible half rate channels", "gsm_a.bssmap.tot_no_of_hr_ch",
7920 FT_UINT16, BASE_DEC, NULL((void*)0), 0x0,
7921 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7922 },
7923 { &hf_gsm_a_bssmap_lsa_id,
7924 { "Identification of Localised Service Area", "gsm_a.bssmap.lsa_id",
7925 FT_UINT24, BASE_HEX, NULL((void*)0), 0x0,
7926 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7927 },
7928 { &hf_gsm_a_bssmap_ep,
7929 { "EP", "gsm_a.bssmap.ep",
7930 FT_UINT8, BASE_DEC, NULL((void*)0), 0x01,
7931 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7932 },
7933 { &hf_gsm_a_bssmap_smi,
7934 { "Subsequent Modification Indication(SMI)", "gsm_a.bssmap.smi",
7935 FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_smi_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_smi_vals
))))
, 0x0f,
7936 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7937 },
7938 { &hf_gsm_a_bssmap_lcs_pri,
7939 { "Periodicity", "gsm_a.bssmap.lcs_pri",
7940 FT_UINT8, BASE_DEC, VALS(lcs_priority_vals)((0 ? (const struct _value_string*)0 : ((lcs_priority_vals)))
)
, 0x0,
7941 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7942 },
7943 { &hf_gsm_a_bssmap_num_ms,
7944 { "Number of handover candidates", "gsm_a.bssmap.num_ms",
7945 FT_UINT8, BASE_DEC,NULL((void*)0), 0x0,
7946 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7947 },
7948 { &hf_gsm_a_bssmap_talker_pri,
7949 { "Priority", "gsm_a.bssmap.talker_pri",
7950 FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_talker_pri_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_talker_pri_vals
))))
, 0x03,
7951 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7952 },
7953 { &hf_gsm_a_bssmap_rr_mode,
7954 { "RR mode", "gsm_a.bssmap.rr_mode",
7955 FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_rr_mode_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_rr_mode_vals
))))
, 0xc0,
7956 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7957 },
7958 { &hf_gsm_a_bssmap_group_cipher_key_nb,
7959 { "Group cipher key number", "gsm_a.bssmap.group_cipher_key_nb",
7960 FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_group_cipher_key_nb_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_group_cipher_key_nb_vals
))))
, 0x3c,
7961 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7962 },
7963 { &hf_gsm_a_bssmap_vgcs_vbs_cell_status,
7964 { "Status", "gsm_a.bssmap.vgcs_vbs_cell_status",
7965 FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_vgcs_vbs_cell_status_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_vgcs_vbs_cell_status_vals
))))
, 0x07,
7966 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7967 },
7968 { &hf_gsm_a_bssmap_paging_cause,
7969 { "Paging Cause", "gsm_a.bssmap.paging_cause",
7970 FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_paging_cause_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_paging_cause_vals
))))
, 0x06,
7971 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7972 },
7973 { &hf_gsm_a_bssmap_paging_inf_flg,
7974 { "VGCS/VBS flag","gsm_a.bssmap.paging_inf_flg",
7975 FT_BOOLEAN,8, TFS(&bssmap_paging_inf_flg_value)((0 ? (const struct true_false_string*)0 : ((&bssmap_paging_inf_flg_value
))))
, 0x01,
7976 "If 1, a member of a VGCS/VBS-group", HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7977 },
7978 { &hf_gsm_a_bssmap_serv_ho_inf,
7979 { "Service Handover information", "gsm_a.bssmap.serv_ho_inf",
7980 FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_serv_ho_inf_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_serv_ho_inf_vals
))))
, 0x07,
7981 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7982 },
7983 { &hf_gsm_a_bssmap_max_nb_traffic_chan,
7984 { "Maximum Number of Traffic Channels", "gsm_a.bssmap.max_nb_traffic_chan",
7985 FT_UINT8, BASE_DEC, VALS(gsm_a_max_nb_traffic_chan_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_max_nb_traffic_chan_vals
))))
, 0x07,
7986 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7987 },
7988 { &hf_gsm_a_bssmap_acceptable_chan_coding_bit5,
7989 { "TCH/F43.2", "gsm_a.bssmap.acceptable_chan_coding_bit5",
7990 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_accept_not_accept_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_accept_not_accept_vals
))))
, 0x10,
7991 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7992 },
7993 { &hf_gsm_a_bssmap_acceptable_chan_coding_bit4,
7994 { "TCH/F43.2", "gsm_a.bssmap.acceptable_chan_coding_bit4",
7995 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_accept_not_accept_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_accept_not_accept_vals
))))
, 0x08,
7996 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
7997 },
7998 { &hf_gsm_a_bssmap_acceptable_chan_coding_bit3,
7999 { "TCH/F43.2", "gsm_a.bssmap.acceptable_chan_coding_bit3",
8000 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_accept_not_accept_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_accept_not_accept_vals
))))
, 0x04,
8001 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8002 },
8003 { &hf_gsm_a_bssmap_acceptable_chan_coding_bit2,
8004 { "TCH/F43.2", "gsm_a.bssmap.acceptable_chan_coding_bit2",
8005 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_accept_not_accept_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_accept_not_accept_vals
))))
, 0x02,
8006 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8007 },
8008 { &hf_gsm_a_bssmap_acceptable_chan_coding_bit1,
8009 { "TCH/F43.2", "gsm_a.bssmap.acceptable_chan_coding_bit1",
8010 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_accept_not_accept_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_accept_not_accept_vals
))))
, 0x01,
8011 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8012 },
8013 { &hf_gsm_a_bssmap_allowed_data_rate_bit8,
8014 { "43.5 kbit/s (TCH/F43.2)", "gsm_a.bssmap.allowed_data_rate_bit8",
8015 FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x80,
8016 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8017 },
8018 { &hf_gsm_a_bssmap_allowed_data_rate_bit7,
8019 { "32.0 kbit/s (TCH/F32.0)", "gsm_a.bssmap.allowed_data_rate_bit7",
8020 FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x40,
8021 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8022 },
8023 { &hf_gsm_a_bssmap_allowed_data_rate_bit6,
8024 { "29.0 kbit/s (TCH/F28.8)", "gsm_a.bssmap.allowed_data_rate_bit6",
8025 FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x20,
8026 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8027 },
8028 { &hf_gsm_a_bssmap_allowed_data_rate_bit5,
8029 { "14.5/14.4 kbit/s (TCH/F14.4)", "gsm_a.bssmap.allowed_data_rate_bit5",
8030 FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x10,
8031 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8032 },
8033 { &hf_gsm_a_bssmap_allowed_data_rate_bit4,
8034 { "12.0/9.6 kbit/s (TCH F/9.6)", "gsm_a.bssmap.allowed_data_rate_bit4",
8035 FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x08,
8036 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8037 },
8038 { &hf_gsm_a_bssmap_vstk_rand,
8039 { "VSTK_RAND", "gsm_a.bssmap.vstk_rand",
8040 FT_UINT64, BASE_HEX, NULL((void*)0), 0,
8041 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8042 },
8043 { &hf_gsm_a_bssmap_vstk,
8044 { "VSTK", "gsm_a.bssmap.vstk",
8045 FT_BYTES, BASE_NONE, NULL((void*)0), 0,
8046 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8047 },
8048
8049 { &hf_gsm_a_bssmap_spare_bits,
8050 { "Spare bit(s)", "gsm_a.bssmap.spare_bits",
8051 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
8052 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8053 },
8054 { &hf_gsm_a_bssmap_tpind,
8055 { "Talker priority indicator (TP Ind)","gsm_a.bssmap.tpind",
8056 FT_BOOLEAN,8, TFS(&gsm_bssmap_tpind_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_bssmap_tpind_vals
))))
, 0x01,
8057 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8058 },
8059 { &hf_gsm_a_bssmap_asind_b2,
8060 { "A-interface resource sharing indicator (AS Ind) bit 2","gsm_a.bssmap.asind_b2",
8061 FT_BOOLEAN,8, TFS(&gsm_bssmap_asind_b2_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_bssmap_asind_b2_vals
))))
, 0x02,
8062 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8063 },
8064 { &hf_gsm_a_bssmap_asind_b3,
8065 { "A-interface resource sharing indicator (AS Ind) bit 3","gsm_a.bssmap.asind_b3",
8066 FT_BOOLEAN,8, TFS(&gsm_bssmap_asind_b3_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_bssmap_asind_b3_vals
))))
, 0x04,
8067 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8068 },
8069 { &hf_gsm_a_bssmap_bss_res,
8070 { "Group or broadcast call re-establishment by the BSS indicator","gsm_a.bssmap.bss_res",
8071 FT_BOOLEAN,8, TFS(&gsm_bssmap_bss_res_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_bssmap_bss_res_vals
))))
, 0x08,
8072 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8073 },
8074 { &hf_gsm_a_bssmap_tcp,
8075 { "Talker Channel Parameter (TCP)","gsm_a.bssmap.tcp",
8076 FT_BOOLEAN,8, TFS(&gsm_bssmap_bss_tcp_vals)((0 ? (const struct true_false_string*)0 : ((&gsm_bssmap_bss_tcp_vals
))))
, 0x10,
8077 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8078 },
8079 { &hf_gsm_a_bssmap_filler_bits,
8080 { "Filler Bits","gsm_a.bssmap.filler_bits",
8081 FT_UINT8, BASE_DEC,NULL((void*)0), 0x07,
8082 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8083 },
8084 { &hf_gsm_a_bssmap_method,
8085 { "Method","gsm_a.bssmap.method",
8086 FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_method_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_method_vals
))))
, 0xc0,
8087 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8088 },
8089 { &hf_gsm_a_bssmap_ganss_id,
8090 { "GANSS Id","gsm_a.bssmap.ganss_id",
8091 FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_ganss_id_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_ganss_id_vals
))))
, 0x38,
8092 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8093 },
8094 { &hf_gsm_a_bssmap_usage,
8095 { "Usage","gsm_a.bssmap.usage",
8096 FT_UINT8, BASE_DEC,VALS(gsm_a_bssmap_usage_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_usage_vals
))))
, 0x07,
8097 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8098 },
8099 { &hf_gsm_a_bssmap_data_id,
8100 { "Data Identity","gsm_a.bssmap.data_id",
8101 FT_UINT8, BASE_DEC_HEX, NULL((void*)0), 0,
8102 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8103 },
8104 { &hf_gsm_a_bssmap_bt_ind,
8105 { "BT Ind","gsm_a.bssmap.bt_ind",
8106 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_bt_ind_val)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_bt_ind_val
))))
, 0x01,
8107 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8108 },
8109 { &hf_gsm_a_bssmap_aoip_trans_ipv4,
8110 { "Transport Layer Address (IPv4)","gsm_a.bssmap.aoip_trans_ipv4",
8111 FT_IPv4, BASE_NONE, NULL((void*)0), 0x0,
8112 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8113 },
8114 { &hf_gsm_a_bssmap_aoip_trans_ipv6,
8115 { "Transport Layer Address (IPv6)","gsm_a.bssmap.aoip_trans_ipv6",
8116 FT_IPv6, BASE_NONE,NULL((void*)0), 0x0,
8117 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8118 },
8119 { &hf_gsm_a_bssmap_aoip_trans_port,
8120 { "UDP Port","gsm_a.bssmap.aoip_trans_port",
8121 FT_UINT16, BASE_PT_UDP, NULL((void*)0), 0x0,
8122 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8123 },
8124 { &hf_gsm_a_bssmap_fi,
8125 { "FI(Full IP)","gsm_a.bssmap.fi",
8126 FT_BOOLEAN,8, TFS(&bssmap_fi_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_fi_vals
))))
, 0x80,
8127 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8128 },
8129 { &hf_gsm_a_bssmap_pi,
8130 { "PI","gsm_a.bssmap.pi",
8131 FT_BOOLEAN,8, TFS(&bssmap_pi_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_pi_vals
))))
, 0x40,
8132 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8133 },
8134 { &hf_gsm_a_bssmap_pt,
8135 { "PT","gsm_a.bssmap.pt",
8136 FT_BOOLEAN,8, TFS(&bssmap_pt_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_pt_vals
))))
, 0x20,
8137 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8138 },
8139 { &hf_gsm_a_bssmap_tf,
8140 { "TF","gsm_a.bssmap.tf",
8141 FT_BOOLEAN,8, TFS(&bssmap_tf_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_tf_vals
))))
, 0x10,
8142 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8143 },
8144 { &hf_gsm_a_bssap_speech_codec,
8145 { "Codec Type","gsm_a.bssmap.speech_codec",
8146 FT_UINT8, BASE_DEC|BASE_EXT_STRING0x00000200, &bssap_speech_codec_values_ext, 0x0f,
8147 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8148 },
8149 { &hf_gsm_a_bssap_extended_codec,
8150 { "Extended Codec Type","gsm_a.bssmap.extended_codec",
8151 FT_UINT8, BASE_DEC, VALS(bssap_extended_codec_values)((0 ? (const struct _value_string*)0 : ((bssap_extended_codec_values
))))
, 0x0,
8152 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8153 },
8154 { &hf_gsm_a_bssap_extended_codec_r2,
8155 { "Redundancy Level 2","gsm_a.bssmap.r2",
8156 FT_BOOLEAN,8, TFS(&tfs_supported_not_supported)((0 ? (const struct true_false_string*)0 : ((&tfs_supported_not_supported
))))
, 0x80,
8157 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8158 },
8159 { &hf_gsm_a_bssap_extended_codec_r3,
8160 { "Redundancy Level 3","gsm_a.bssmap.r3",
8161 FT_BOOLEAN,8, TFS(&tfs_supported_not_supported)((0 ? (const struct true_false_string*)0 : ((&tfs_supported_not_supported
))))
, 0x40,
8162 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8163 },
8164 { &hf_gsm_a_bssmap_fi2,
8165 { "FI(Full IP)","gsm_a.bssmap.fi2",
8166 FT_BOOLEAN,8, TFS(&bssmap_fi2_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_fi2_vals
))))
, 0x80,
8167 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8168 },
8169 { &hf_gsm_a_bssmap_pi2,
8170 { "PI","gsm_a.bssmap.pi2",
8171 FT_BOOLEAN,8, TFS(&bssmap_pi2_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_pi2_vals
))))
, 0x40,
8172 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8173 },
8174 { &hf_gsm_a_bssmap_pt2,
8175 { "PT","gsm_a.bssmap.pt2",
8176 FT_BOOLEAN,8, TFS(&bssmap_pt2_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_pt2_vals
))))
, 0x20,
8177 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8178 },
8179 { &hf_gsm_a_bssmap_tf2,
8180 { "TF","gsm_a.bssmap.tf2",
8181 FT_BOOLEAN,8, TFS(&bssmap_tf2_vals)((0 ? (const struct true_false_string*)0 : ((&bssmap_tf2_vals
))))
, 0x10,
8182 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8183 },
8184 { &hf_gsm_a_bssmap_call_id,
8185 { "Call Identifier","gsm_a.bssmap.callid",
8186 FT_UINT32, BASE_DEC,NULL((void*)0), 0x0,
8187 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8188 },
8189 { &hf_gsm_a_bssmap_spare,
8190 { "Spare", "gsm_a.bssmap.spare",
8191 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
8192 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0)}
8193 },
8194 { &hf_gsm_a_bssmap_positioning_data_discriminator,
8195 { "Positioning Data Discriminator", "gsm_a.bssmap.posData.discriminator",
8196 FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
8197 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8198 },
8199 { &hf_gsm_a_bssmap_positioning_method,
8200 { "Positioning method", "gsm_a.bssmap.posData.method",
8201 FT_UINT8, BASE_HEX, VALS(bssmap_positioning_methods)((0 ? (const struct _value_string*)0 : ((bssmap_positioning_methods
))))
, 0x0,
8202 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8203 },
8204 { &hf_gsm_a_bssmap_positioning_method_usage,
8205 { "Usage", "gsm_a.bssmap.posData.usage",
8206 FT_UINT8, BASE_HEX, VALS(bssmap_positioning_methods_usage)((0 ? (const struct _value_string*)0 : ((bssmap_positioning_methods_usage
))))
, 0x0,
8207 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8208 },
8209 { &hf_gsm_a_bssmap_location_type_location_information,
8210 { "Location Information", "gsm_a.bssmap.locationType.locationInformation",
8211 FT_UINT8, BASE_HEX, VALS(bssmap_location_information_vals)((0 ? (const struct _value_string*)0 : ((bssmap_location_information_vals
))))
, 0x0,
8212 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8213 },
8214 { &hf_gsm_a_bssmap_location_type_positioning_method,
8215 { "Positioning Method", "gsm_a.bssmap.locationType.positioningMethod",
8216 FT_UINT8, BASE_HEX, VALS(bssmap_positioning_method_vals)((0 ? (const struct _value_string*)0 : ((bssmap_positioning_method_vals
))))
, 0x0,
8217 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8218 },
8219 { &hf_gsm_a_bssmap_chan_type_extension,
8220 { "Extension", "gsm_a.bssmap.chanType.permittedIndicator.extension",
8221 FT_BOOLEAN, 8, TFS(&bssmap_chan_type_extension_value)((0 ? (const struct true_false_string*)0 : ((&bssmap_chan_type_extension_value
))))
, 0x80,
8222 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8223 },
8224 { &hf_gsm_a_bssmap_cause_extension,
8225 { "Extension", "gsm_a.bssmap.causeType.extension",
8226 FT_BOOLEAN, 8, TFS(&bssmap_cause_extension_value)((0 ? (const struct true_false_string*)0 : ((&bssmap_cause_extension_value
))))
, 0x80,
8227 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8228 },
8229 { &hf_gsm_a_bssmap_ass_req,
8230 { "Assignment Requirement", "gsm_a.bssmap.assignment_requirement",
8231 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_assignment_requirement_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_assignment_requirement_vals
))))
, 0x0,
8232 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8233 },
8234 { &hf_gsm_a_bssmap_emlpp_prio,
8235 { "eMLPP Priority", "gsm_a.bssmap.emlpp_priority",
8236 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_call_priority_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_call_priority_vals
))))
, 0x07,
8237 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8238 },
8239 { &hf_gsm_a_bssmap_rip,
8240 { "RIP", "gsm_a.bssmap.rip",
8241 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_rip_value)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_rip_value
))))
, 0x02,
8242 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8243 },
8244 { &hf_gsm_a_bssmap_rtd,
8245 { "RTD", "gsm_a.bssmap.rtd",
8246 FT_BOOLEAN, 8, TFS(&gsm_a_bssmap_rtd_value)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_rtd_value
))))
, 0x01,
8247 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8248 },
8249 { &hf_gsm_a_bssmap_kc128,
8250 { "Kc128", "gsm_a.bssmap.kc128",
8251 FT_BYTES, BASE_NONE, NULL((void*)0), 0,
8252 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8253 },
8254 { &hf_gsm_a_bssmap_csg_id,
8255 { "CSG Identity", "gsm_a.bssmap.csg_id",
8256 FT_UINT32, BASE_DEC, NULL((void*)0), 0,
8257 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8258 },
8259 { &hf_gsm_a_bssmap_cell_access_mode,
8260 { "Cell Access Mode", "gsm_a.bssmap.cell_access_mode",
8261 FT_BOOLEAN, BASE_NONE, TFS(&gsm_a_bssmap_cell_access_mode_value)((0 ? (const struct true_false_string*)0 : ((&gsm_a_bssmap_cell_access_mode_value
))))
, 0,
8262 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8263 },
8264
8265 { &hf_fe_extra_info_prec,
8266 { "Pre-emption Recommendation", "gsm_a.bssmap.fe_extra_info.prec",
8267 FT_UINT8, BASE_DEC, VALS(fe_extra_info_prec_vals)((0 ? (const struct _value_string*)0 : ((fe_extra_info_prec_vals
))))
, 0x01,
8268 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8269 },
8270 { &hf_fe_extra_info_lcs,
8271 { "LCS Information", "gsm_a.bssmap.fe_extra_info.lcs",
8272 FT_UINT8, BASE_DEC, VALS(fe_extra_info_lcs_vals)((0 ? (const struct _value_string*)0 : ((fe_extra_info_lcs_vals
))))
, 0x02,
8273 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8274 },
8275 { &hf_fe_extra_info_ue_prob,
8276 { "UE support of UMTS", "gsm_a.bssmap.fe_extra_info.ue_prob",
8277 FT_UINT8, BASE_DEC, VALS(fe_extra_info_ue_prob_vals)((0 ? (const struct _value_string*)0 : ((fe_extra_info_ue_prob_vals
))))
, 0x04,
8278 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8279 },
8280 { &hf_fe_extra_info_spare,
8281 { "Extra Information Spare bits", "gsm_a.bssmap.fe_extra_info.spare",
8282 FT_UINT8, BASE_HEX, NULL((void*)0), 0xf8,
8283 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8284 },
8285 { &hf_fe_cur_chan_type2_chan_mode,
8286 { "Channel Mode", "gsm_a.bssmap.fe_cur_chan_type2.chan_mode",
8287 FT_UINT8, BASE_HEX, VALS(chan_mode_vals)((0 ? (const struct _value_string*)0 : ((chan_mode_vals)))), 0x0f,
8288 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8289 },
8290 { &hf_fe_cur_chan_type2_chan_mode_spare,
8291 { "Channel Mode Spare bits", "gsm_a.bssmap.fe_cur_chan_type2_chan_mode.spare",
8292 FT_UINT8, BASE_HEX, NULL((void*)0), 0xf0,
8293 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8294 },
8295 { &hf_fe_cur_chan_type2_chan_field,
8296 { "Channel Field", "gsm_a.bssmap.fe_cur_chan_type2.chan_field",
8297 FT_UINT8, BASE_HEX, VALS(fe_cur_chan_type2_chan_field_vals)((0 ? (const struct _value_string*)0 : ((fe_cur_chan_type2_chan_field_vals
))))
,0x0f,
8298 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8299 },
8300 { &hf_fe_cur_chan_type2_chan_field_spare,
8301 { "Channel field Spare bits", "gsm_a.bssmap.fe_cur_chan_type2_chan_field.spare",
8302 FT_UINT8, BASE_HEX, NULL((void*)0), 0xf0,
8303 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8304 },
8305 { &hf_fe_target_radio_cell_info_rxlev_ncell,
8306 { "RXLEV-NCELL", "gsm_a.bssmap.fe_target_radio_cell_info.rxlev_ncell",
8307 FT_UINT8, BASE_HEX|BASE_EXT_STRING0x00000200, &gsm_a_rr_rxlev_vals_ext, 0x3f,
8308 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8309 },
8310 { &hf_fe_target_radio_cell_info_rxlev_ncell_spare,
8311 { "RXLEV-NCELL Spare bits", "gsm_a.bssmap.fe_target_radio_cell_info.rxlev_ncell_spare",
8312 FT_UINT8, BASE_HEX, NULL((void*)0), 0xc0,
8313 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8314 },
8315 { &hf_fe_dtm_info_dtm_ind,
8316 { "DTM indicator", "gsm_a.bssmap.fe_dtm_info.dtm_ind",
8317 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_dtm_info_dtm_ind_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_dtm_info_dtm_ind_vals
))))
, 0x01,
8318 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8319 },
8320 { &hf_fe_dtm_info_sto_ind,
8321 { "Time Slot Operation indicator", "gsm_a.bssmap.fe_dtm_info.sto_ind",
8322 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_dtm_info_sto_ind_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_dtm_info_sto_ind_vals
))))
, 0x02,
8323 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8324 },
8325 { &hf_fe_dtm_info_egprs_ind,
8326 { "EGPRS indicator", "gsm_a.bssmap.fe_dtm_info.egprs_ind",
8327 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_dtm_info_egprs_ind_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_dtm_info_egprs_ind_vals
))))
, 0x04,
8328 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8329 },
8330 { &hf_fe_dtm_info_spare_bits,
8331 { "DTM Info Spare bits", "gsm_a.bssmap.fe_dtm_info.spare_bits",
8332 FT_UINT8, BASE_HEX, NULL((void*)0), 0xf8,
8333 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8334 },
8335 { &hf_fe_cell_load_info_cell_capacity_class,
8336 { "Cell capacity class", "gsm_a.bssmap.fe_cell_load_info.cell_capacity_class",
8337 FT_UINT8, BASE_DEC, NULL((void*)0), 0,
8338 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8339 },
8340 { &hf_fe_cell_load_info_load_value,
8341 { "Load value", "gsm_a.bssmap.fe_cell_load_info.load_info",
8342 FT_UINT8, BASE_DEC, NULL((void*)0), 0,
8343 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8344 },
8345 { &hf_fe_cell_load_info_rt_load_value,
8346 { "Realtime load value", "gsm_a.bssmap.fe_cell_load_info.rt_load_value",
8347 FT_UINT8, BASE_DEC, NULL((void*)0), 0,
8348 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8349 },
8350 { &hf_fe_cell_load_info_nrt_load_information_value,
8351 { "Non-Realtime load information value", "gsm_a.bssmap.fe_cell_load_info.nrt_load_info_value",
8352 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_cell_load_nrt_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_cell_load_nrt_vals
))))
, 0,
8353 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8354 },
8355 { &hf_fe_ps_indication,
8356 { "PS Indication", "gsm_a.bssmap.fe_ps_indication.value",
8357 FT_UINT8, BASE_HEX, NULL((void*)0), 0,
8358 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8359 },
8360 { &hf_fe_dtm_ho_command_ind_spare,
8361 { "Spare octet", "gsm_a.bssmap.fe_dtm_ho_command_ind.spare",
8362 FT_UINT8, BASE_HEX, NULL((void*)0), 0,
8363 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8364 },
8365 { &hf_gsm_a_bssmap_speech_data_ind,
8366 { "Speech/Data Indicator", "gsm_a.bssmap.speech_data_ind",
8367 FT_UINT8, BASE_DEC, VALS(gsm_a_bssap_speech_data_ind_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_speech_data_ind_vals
))))
, 0x0f,
8368 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8369 },
8370 { &hf_gsm_a_bssmap_channel_rate_and_type,
8371 { "Channel Rate and Type", "gsm_a.bssmap.rate_and_type",
8372 FT_UINT8, BASE_DEC, VALS(gsm_a_bssap_channel_rate_and_type_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_channel_rate_and_type_vals
))))
, 0x0,
8373 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8374 },
8375 { &hf_gsm_a_bssmap_perm_speech_v_ind,
8376 { "Permitted speech version indication", "gsm_a.bssmap.perm_speech_v_ind",
8377 FT_UINT8, BASE_HEX|BASE_RANGE_STRING0x00000100, RVALS(speech_version_id_rvals)((0 ? (const struct _range_string*)0 : ((speech_version_id_rvals
))))
, 0x7f,
8378 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8379 },
8380 { &hf_gsm_a_bssmap_reroute_rej_cause,
8381 { "Reroute Reject cause", "gsm_a.bssmap.reroute_rej_cause",
8382 FT_UINT8, BASE_HEX, VALS(gsm_a_bssap_reroute_rej_cause_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_reroute_rej_cause_vals
))))
, 0x0,
8383 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8384 },
8385 { &hf_gsm_a_bssmap_send_seqn,
8386 { "Send Sequence Number", "gsm_a.bssmap.send_seqn",
8387 FT_UINT8, BASE_HEX, NULL((void*)0), 0xc0,
8388 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8389 },
8390 { &hf_gsm_a_bssmap_reroute_outcome,
8391 { "Outcome", "gsm_a.bssmap.reroute_outcome",
8392 FT_UINT8, BASE_HEX, VALS(gsm_a_bssap_reroute_outcome_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_reroute_outcome_vals
))))
, 0x0,
8393 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8394 },
8395 { &hf_gsm_a_bssmap_lcls_conf,
8396 { "LCLS-Configuration", "gsm_a.bssmap.lcls_conf",
8397 FT_UINT8, BASE_HEX, VALS(gsm_a_bssap_lcls_conf_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_lcls_conf_vals
))))
, 0x0f,
8398 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8399 },
8400 { &hf_gsm_a_bssmap_lcls_con_status_control,
8401 { "LCLS-Connection-Status-Control", "gsm_a.bssmap.lcls_con_status_control",
8402 FT_UINT8, BASE_HEX, VALS(gsm_a_bssap_lcls_con_status_control_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssap_lcls_con_status_control_vals
))))
, 0x0f,
8403 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8404 },
8405 { &hf_gsm_a_bssmap_lcls_bss_status,
8406 { "LCLS-BSS-Status", "gsm_a.bssmap.lcls_bss_status",
8407 FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_lcls_bss_status_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_lcls_bss_status_vals
))))
, 0x0f,
8408 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8409 },
8410 { &hf_gsm_a_bssmap_osmocom_osmux_cid,
8411 { "Osmux CID", "gsm_a.bssmap.osmocom_osmux_cid",
8412 FT_UINT8, BASE_DEC, NULL((void*)0), 0,
8413 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }
8414 },
8415
8416 /* Generated from convert_proto_tree_add_text.pl */
8417 { &hf_gsm_a_bssmap_pcm_multiplexer, { "PCM Multiplexer", "gsm_a_bssmap.pcm_multiplexer", FT_UINT16, BASE_DEC, NULL((void*)0), 0xffe0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8418 { &hf_gsm_a_bssmap_timeslot, { "Timeslot", "gsm_a_bssmap.timeslot", FT_UINT16, BASE_DEC, NULL((void*)0), 0x001f, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8419 { &hf_gsm_a_bssmap_full_rate_channels_available, { "Number of full rate channels available in band", "gsm_a_bssmap.full_rate_channels_available", FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8420 { &hf_gsm_a_bssmap_half_rate_channels_available, { "Number of half rate channels available in band", "gsm_a_bssmap.half_rate_channels_available", FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8421 { &hf_gsm_a_bssmap_cause_class, { "Cause Class", "gsm_a_bssmap.cause_class", FT_UINT8, BASE_DEC, VALS(cause_class_vals)((0 ? (const struct _value_string*)0 : ((cause_class_vals)))), 0x70, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8422 { &hf_gsm_a_bssmap_national_cause, { "National Cause", "gsm_a_bssmap.national_cause", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0f, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8423 { &hf_gsm_a_bssmap_cause_value, { "Cause Value", "gsm_a_bssmap.cause_value", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8424 { &hf_gsm_a_bssmap_cause16, { "Cause", "gsm_a_bssmap.cause", FT_UINT16, BASE_DEC, NULL((void*)0), 0x07ff, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8425 { &hf_gsm_a_bssmap_ti_flag, { "TI flag", "gsm_a_bssmap.ti_flag", FT_BOOLEAN, 8, TFS(&tfs_allocated_by_receiver_sender)((0 ? (const struct true_false_string*)0 : ((&tfs_allocated_by_receiver_sender
))))
, 0x08, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8426 { &hf_gsm_a_bssmap_tio, { "TIO", "gsm_a_bssmap.tio", FT_UINT8, BASE_DEC, NULL((void*)0), 0x07, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8427 { &hf_gsm_a_bssmap_enc_info_key, { "Key", "gsm_a_bssmap.enc_info_key", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8428 { &hf_gsm_a_bssmap_transparent_service, { "Service", "gsm_a_bssmap.transparent_service", FT_BOOLEAN, 8, TFS(&tfs_non_transparent_transparent)((0 ? (const struct true_false_string*)0 : ((&tfs_non_transparent_transparent
))))
, 0x40, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8429 { &hf_gsm_a_bssmap_rate, { "Rate", "gsm_a_bssmap.rate", FT_UINT8, BASE_DEC, NULL((void*)0), 0x3f, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8430 { &hf_gsm_a_bssmap_tch_14_5kb, { "14.5 kbit/s (TCH/F14.4)", "gsm_a_bssmap.tch_14_5kb", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x08, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8431 { &hf_gsm_a_bssmap_tch_12kb, { "12.0 kbit/s (TCH F/9.6)", "gsm_a_bssmap.tch_12kb", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8432 { &hf_gsm_a_bssmap_tch_6kb, { "6.0 kbit/s (TCH F/4.8)", "gsm_a_bssmap.tch_6kb", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8433 { &hf_gsm_a_bssmap_tch_14_5_14_4kb, { "14.5/14.4 kbit/s (TCH/F14.4)", "gsm_a_bssmap.tch_14_5_14_4kb", FT_BOOLEAN, 8, NULL((void*)0), 0x08, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8434 { &hf_gsm_a_bssmap_tch_12_9kb, { "12.0/9.6 kbit/s (TCH F/9.6)", "gsm_a_bssmap.tch_12_9kb", FT_BOOLEAN, 8, NULL((void*)0), 0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8435 { &hf_gsm_a_bssmap_tch_6_4_8kb, { "6.0/4.8 kbit/s (TCH F/4.8)", "gsm_a_bssmap.tch_6_4_8kb", FT_BOOLEAN, 8, NULL((void*)0), 0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8436 { &hf_gsm_a_bssmap_unknown_format, { "Unknown format", "gsm_a_bssmap.unknown_format", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8437 { &hf_gsm_a_bssmap_cell_id_unknown_format, { "Cell ID - Unknown format", "gsm_a_bssmap.cell_id.unknown_format", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8438 { &hf_gsm_a_bssmap_priority_level, { "Priority Level", "gsm_a_bssmap.priority_level", FT_UINT8, BASE_DEC|BASE_RANGE_STRING0x00000100, RVALS(bssmap_prio_rvals)((0 ? (const struct _range_string*)0 : ((bssmap_prio_rvals)))
)
, 0x3c, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8439 { &hf_gsm_a_bssmap_layer_3_information_value, { "Layer 3 Information value", "gsm_a_bssmap.layer_3_information_value", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8440 { &hf_gsm_a_bssmap_bss_activate_downlink, { "BSS can to activate DTX in the downlink direction", "gsm_a_bssmap.bss_activate_downlink", FT_BOOLEAN, 8, TFS(&tfs_yes_no)((0 ? (const struct true_false_string*)0 : ((&tfs_yes_no)
)))
, 0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8441 { &hf_gsm_a_bssmap_imeisv_included, { "IMEISV must be included by the mobile station", "gsm_a_bssmap.imeisv_included", FT_BOOLEAN, 8, TFS(&tfs_yes_no)((0 ? (const struct true_false_string*)0 : ((&tfs_yes_no)
)))
, 0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8442 { &hf_gsm_a_bssmap_algorithm_identifier, { "Algorithm Identifier", "gsm_a_bssmap.algorithm_identifier", FT_UINT8, BASE_DEC, VALS(gsm_a_bssmap_algorithm_id_vals)((0 ? (const struct _value_string*)0 : ((gsm_a_bssmap_algorithm_id_vals
))))
, 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8443 { &hf_gsm_a_bssmap_circuit_pool_number, { "Circuit pool number", "gsm_a_bssmap.circuit_pool_number", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8444 { &hf_gsm_a_bssmap_qri, { "qri recommended queuing", "gsm_a_bssmap.qri", FT_BOOLEAN, 8, TFS(&tfs_allowed_not_allowed)((0 ? (const struct true_false_string*)0 : ((&tfs_allowed_not_allowed
))))
, 0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8445 { &hf_gsm_a_bssmap_speech_version_id, { "Speech version identifier", "gsm_a_bssmap.speech_version_id", FT_UINT8, BASE_DEC|BASE_RANGE_STRING0x00000100, RVALS(speech_version_id_rvals)((0 ? (const struct _range_string*)0 : ((speech_version_id_rvals
))))
, 0x7f, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8446 { &hf_gsm_a_bssmap_apdu, { "APDU", "gsm_a_bssmap.apdu", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8447 { &hf_gsm_a_bssmap_talker_identity_field, { "Talker Identity field", "gsm_a_bssmap.talker_identity_field", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8448 { &hf_gsm_a_bssmap_s0_s15, { "S0 - S15", "gsm_a_bssmap.s0_s15", FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8449 { &hf_gsm_a_bssmap_s0_s7, { "S0 - S7", "gsm_a_bssmap.s0_s7", FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8450 { &hf_gsm_a_bssmap_all_call_identifiers_resources_released, { "all resources and references associated to all Call Identifiers in use between the BSC and the MSC need to be released", "gsm_a_bssmap.all_call_identifiers_resources_released", FT_NONE, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8451 { &hf_gsm_a_bssmap_message_elements, { "Message Elements", "gsm_a_bssmap.message_elements", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8452 { &hf_gsm_a_bssmap_layer3_message_contents, { "Layer 3 Message Contents", "gsm_a_bssmap.layer3_message_contents", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8453 { &hf_gsm_a_bssmap_gsm_a5_1, { "GSM A5/1", "gsm_a_bssmap.gsm_a5_1", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8454 { &hf_gsm_a_bssmap_gsm_a5_2, { "GSM A5/2", "gsm_a_bssmap.gsm_a5_2", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x04, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8455 { &hf_gsm_a_bssmap_gsm_a5_3, { "GSM A5/3", "gsm_a_bssmap.gsm_a5_3", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x08, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8456 { &hf_gsm_a_bssmap_gsm_a5_4, { "GSM A5/4", "gsm_a_bssmap.gsm_a5_4", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x10, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8457 { &hf_gsm_a_bssmap_gsm_a5_5, { "GSM A5/5", "gsm_a_bssmap.gsm_a5_5", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x20, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8458 { &hf_gsm_a_bssmap_gsm_a5_6, { "GSM A5/6", "gsm_a_bssmap.gsm_a5_6", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x40, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8459 { &hf_gsm_a_bssmap_gsm_a5_7, { "GSM A5/7", "gsm_a_bssmap.gsm_a5_7", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x80, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8460 { &hf_gsm_a_bssmap_no_encryption, { "No encryption", "gsm_a_bssmap.no_encryption", FT_BOOLEAN, 8, TFS(&tfs_permitted_not_permitted)((0 ? (const struct true_false_string*)0 : ((&tfs_permitted_not_permitted
))))
, 0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8461 { &hf_gsm_a_bssmap_data_channel_rate_and_type, { "Channel rate and type", "gsm_a_bssmap.channel_rate_and_type", FT_UINT8, BASE_DEC|BASE_RANGE_STRING0x00000100, RVALS(gsm_a_bssap_channel_rate_and_type_rvals)((0 ? (const struct _range_string*)0 : ((gsm_a_bssap_channel_rate_and_type_rvals
))))
, 0x7f, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8462 { &hf_gsm_a_bssmap_cell_discriminator, { "Cell Discriminator", "gsm_a_bssmap.cell_discriminator", FT_UINT8, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8463 { &hf_gsm_a_bssmap_forward_indicator, { "Forward indicator", "gsm_a_bssmap.forward_indicator", FT_UINT8, BASE_DEC|BASE_RANGE_STRING0x00000100, RVALS(forward_indicator_rvals)((0 ? (const struct _range_string*)0 : ((forward_indicator_rvals
))))
, 0x0f, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
8464 };
8465
8466 expert_module_t* expert_gsm_a_bssmap;
8467
8468 static ei_register_info ei[] = {
8469 { &ei_gsm_a_bssmap_extraneous_data, { "gsm_a_bssmap.extraneous_data", PI_PROTOCOL0x09000000, PI_NOTE0x00400000, "Extraneous Data, dissector bug or later version spec (report to wireshark.org)", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
8470 { &ei_gsm_a_bssmap_not_decoded_yet, { "gsm_a_bssmap.not_decoded_yet", PI_UNDECODED0x05000000, PI_WARN0x00600000, "Not decoded yet", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
8471 { &ei_gsm_a_bssap_unknown_codec, { "gsm_a_bssmap.unknown_codec", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Unknown codec - the rest of the dissection my be suspect", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
8472 { &ei_gsm_a_bssmap_bogus_length, { "gsm_a_bssmap.bogus_length", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Bogus length", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
8473 { &ei_gsm_a_bssmap_missing_mandatory_element, { "gsm_a_bssmap.missing_mandatory_element", PI_PROTOCOL0x09000000, PI_WARN0x00600000, "Missing Mandatory element, rest of dissection is suspect", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
8474 };
8475
8476 /* Setup protocol subtree array */
8477#define NUM_INDIVIDUAL_ELEMS5 5
8478 int *ett[NUM_INDIVIDUAL_ELEMS5 + NUM_GSM_BSSMAP_MSG(int)(sizeof (gsm_a_bssmap_msg_strings) / sizeof (gsm_a_bssmap_msg_strings
)[0])
+
8479 NUM_GSM_BSSMAP_ELEM(sizeof (gsm_bssmap_elem_strings) / sizeof (gsm_bssmap_elem_strings
)[0])
];
8480
8481 ett[0] = &ett_bssmap_msg;
8482 ett[1] = &ett_cell_list;
8483 ett[2] = &ett_dlci;
8484 ett[3] = &ett_codec_lst;
8485 ett[4] = &ett_bss_to_bss_info;
8486
8487 last_offset = NUM_INDIVIDUAL_ELEMS5;
8488
8489 for (i=0; i < NUM_GSM_BSSMAP_MSG(int)(sizeof (gsm_a_bssmap_msg_strings) / sizeof (gsm_a_bssmap_msg_strings
)[0])
; i++, last_offset++)
8490 {
8491 ett[last_offset] = &ett_gsm_bssmap_msg[i];
8492 }
8493
8494 for (i=0; i < NUM_GSM_BSSMAP_ELEM(sizeof (gsm_bssmap_elem_strings) / sizeof (gsm_bssmap_elem_strings
)[0])
; i++, last_offset++)
8495 {
8496 ett[last_offset] = &ett_gsm_bssmap_elem[i];
8497 }
8498
8499 /* Register the protocol name and description */
8500
8501 proto_a_bssmap =
8502 proto_register_protocol("GSM A-I/F BSSMAP", "GSM BSSMAP", "gsm_a.bssmap");
8503
8504 proto_register_field_array(proto_a_bssmap, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
8505
8506 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
8507
8508 expert_gsm_a_bssmap = expert_register_protocol(proto_a_bssmap);
8509 expert_register_field_array(expert_gsm_a_bssmap, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
8510
8511 bssmap_handle = register_dissector("gsm_a_bssmap", dissect_bssmap, proto_a_bssmap);
8512}
8513
8514
8515void
8516proto_reg_handoff_gsm_a_bssmap(void)
8517{
8518 dissector_add_uint("bssap.pdu_type", GSM_A_PDU_TYPE_BSSMAP0, bssmap_handle);
8519
8520 dtap_handle = find_dissector_add_dependency("gsm_a_dtap", proto_a_bssmap);
8521 gsm_bsslap_handle = find_dissector_add_dependency("gsm_bsslap", proto_a_bssmap);
8522 bssgp_handle = find_dissector_add_dependency("bssgp", proto_a_bssmap);
8523 rrc_handle = find_dissector_add_dependency("rrc", proto_a_bssmap);
8524 bicc_mst_handle = find_dissector_add_dependency("bicc_mst", proto_a_bssmap);
8525}
8526
8527/*
8528 * Editor modelines - https://www.wireshark.org/tools/modelines.html
8529 *
8530 * Local variables:
8531 * c-basic-offset: 4
8532 * tab-width: 8
8533 * indent-tabs-mode: nil
8534 * End:
8535 *
8536 * vi: set shiftwidth=4 tabstop=8 expandtab:
8537 * :indentSize=4:tabSize=8:noTabs=true:
8538 */